feat: 添加三层级模型配置管理系统原型

新增三个层级的模型配置管理功能:
- 平台级模型配置(管理台):配置列表、新增/编辑、删除(默认模型不允许删除)、设为默认(仅页面状态)
- 项目级模型配置(工作台):配置列表、新增/编辑、删除(允许删除默认)、设为默认(仅页面状态)
- 个人模型配置(工作台):配置列表、新增/编辑、删除(允许删除默认)、设为默认(仅页面状态)
- 融合式模型选择器:在聊天输入框顶部集成,按层级分组展示模型列表(平台/项目/个人)

技术实现:
- 新增项目级和个人级配置数据文件
- 扩展 api.js 数据访问层,添加 consoleModels.project 和 consoleModels.user 对象
- 新增 4 个页面组件(ProjectModelConfigsPage、AddProjectModelConfigPage、UserModelConfigsPage、AddUserModelConfigPage)
- 修改 2 个现有页面(ModelConfigsPage、ChatPage、ConsoleLayout)
- 修改 Modal 组件支持 cancelText 为空时隐藏取消按钮
- 在 App.jsx 中添加 6 条新路由
- 新增模型选择器样式文件(融合式设计、分组展示、响应式)
- 更新 README.md 项目结构

样式特点:
- 融合式模型选择器与输入框风格一致
- 下拉列表按层级分组(平台/项目/个人)
- 默认标记使用渐变背景色
- 选中状态高亮(浅蓝色背景 + 左侧边框 + 右侧勾选)
- 响应式设计(移动端适配)

数据示例:
- 项目级:3 个示例配置(不同类型和状态)
- 个人级:2 个示例配置(不同类型和状态)
This commit is contained in:
2026-04-10 13:43:19 +08:00
parent eeef824b24
commit 3f815db0b2
21 changed files with 1836 additions and 18 deletions

View File

@@ -0,0 +1,104 @@
## ADDED Requirements
### Requirement: 融合式模型选择器触发器
系统 SHALL 在对话输入框的顶部集成模型选择器触发器,显示当前选中的模型名称和默认标记。
#### Scenario: 显示模型选择器触发器
- **WHEN** 用户访问聊天页面
- **THEN** 系统在聊天输入框顶部显示模型选择器触发器
- **THEN** 触发器显示模型图标、模型名称、默认标记(如果适用)和下拉箭头
- **THEN** 触发器与输入框融合为一个整体
#### Scenario: 显示默认标记
- **WHEN** 当前选中的模型是默认模型(`isDefault = true`
- **THEN** 触发器在模型名称后显示"默认"标签
- **THEN** 标签使用渐变背景色,视觉突出
#### Scenario: 隐藏默认标记
- **WHEN** 当前选中的模型不是默认模型
- **THEN** 触发器不显示"默认"标签
### Requirement: 展开模型选择器下拉列表
系统 SHALL 在用户点击触发器时展开模型选择器下拉列表,按层级分组展示模型(平台模型/项目模型/个人模型)。
#### Scenario: 展开下拉列表
- **WHEN** 用户点击模型选择器触发器
- **THEN** 系统展开下拉列表,显示在触发器下方
- **THEN** 下拉列表按层级分组:平台模型、项目模型、个人模型
- **THEN** 每个分组显示分组标题和该层级的模型列表
- **THEN** 展开时有平滑的动画效果
#### Scenario: 分组标题显示
- **WHEN** 下拉列表展开
- **THEN** 平台模型分组显示标题"📍 平台模型"
- **THEN** 项目模型分组显示标题"📍 项目模型"
- **THEN** 个人模型分组显示标题"📍 个人模型"
- **THEN** 分组标题使用小号字体和浅色文字
#### Scenario: 模型列表项显示
- **WHEN** 下拉列表展开
- **THEN** 每个模型显示模型图标、模型名称和默认标记(如果适用)
- **THEN** 选中模型使用浅蓝色背景和左侧边框高亮显示
- **THEN** 选中模型右侧显示勾选图标
#### Scenario: 鼠标悬停效果
- **WHEN** 用户鼠标悬停在某个模型上
- **THEN** 系统显示浅蓝色背景
### Requirement: 选择模型
系统 SHALL 允许用户从下拉列表中选择模型,更新当前选中状态并收起下拉列表。
#### Scenario: 选择非默认模型
- **WHEN** 用户点击下拉列表中的某个模型
- **THEN** 系统更新当前选中模型状态
- **THEN** 触发器显示新选中的模型名称
- **THEN** 触发器移除"默认"标签(如果新模型不是默认)
- **THEN** 下拉列表收起
#### Scenario: 选择默认模型
- **WHEN** 用户点击下拉列表中的某个默认模型
- **THEN** 系统更新当前选中模型状态
- **THEN** 触发器显示新选中的模型名称
- **THEN** 触发器显示"默认"标签
- **THEN** 下拉列表收起
#### Scenario: 模型列表中的默认标记
- **WHEN** 某个模型是默认模型(`isDefault = true`
- **THEN** 下拉列表中的该模型显示"默认"标签
- **THEN** 标签使用渐变背景色,视觉突出
### Requirement: 收起模型选择器下拉列表
系统 SHALL 在用户点击触发器或选择模型后收起下拉列表。
#### Scenario: 再次点击触发器收起
- **WHEN** 用户再次点击已展开的触发器
- **THEN** 系统收起下拉列表
#### Scenario: 选择模型后自动收起
- **WHEN** 用户从下拉列表中选择模型
- **THEN** 系统自动收起下拉列表
#### Scenario: 点击外部区域收起
- **WHEN** 用户点击下拉列表外部的区域
- **THEN** 系统收起下拉列表(如果当前是展开状态)
### Requirement: 模型选择器样式
系统 SHALL 使用融合式设计,模型选择器与输入框风格一致,圆角、边框、阴影统一。
#### Scenario: 融合式设计
- **WHEN** 模型选择器展开
- **THEN** 触发器和下拉列表形成一个整体
- **THEN** 触发器使用浅灰色背景,圆角顶部 16px
- **THEN** 下拉列表使用白色背景,圆角底部 12px
- **THEN** 边框颜色和阴影与输入框一致
#### Scenario: 响应式设计
- **WHEN** 用户使用移动设备访问
- **THEN** 模型选择器自适应屏幕宽度
- **THEN** 触发器使用较小的内边距和字体大小
- **THEN** 下拉列表最大高度调整为 280px

View File

@@ -0,0 +1,89 @@
## ADDED Requirements
### Requirement: 展示平台级模型配置列表
系统 SHALL 在管理台的模型配置页面展示所有平台级模型配置的列表,每个配置项显示配置名称、配置类型、状态和操作按钮。
#### Scenario: 查看配置列表
- **WHEN** 用户访问 `/admin/models` 页面
- **THEN** 系统显示所有平台级模型配置的表格
- **THEN** 每个配置项显示配置名称、配置类型、状态(生效中/未生效)和操作按钮
- **THEN** 表格头部显示"新增配置"按钮
#### Scenario: 生效中的配置高亮显示
- **WHEN** 配置的 `isActive` 字段为 `true`
- **THEN** 配置项在表格中高亮显示(使用背景色或边框)
#### Scenario: 配置类型显示
- **WHEN** 配置类型为 `basic`
- **THEN** 配置类型列显示"OpenAI 兼容接口"
- **WHEN** 配置类型为 `zhisuan`
- **THEN** 配置类型列显示"智算管理平台"
### Requirement: 新增平台级模型配置
系统 SHALL 允许平台管理员创建新的平台级模型配置配置包含基本信息、API 配置和参数配置(根据类型不同)。
#### Scenario: 打开新增配置页面
- **WHEN** 用户点击"新增配置"按钮
- **THEN** 系统导航到 `/admin/models/add` 页面
- **THEN** 页面显示配置名称、配置类型、API 配置和参数配置表单
#### Scenario: 选择配置类型
- **WHEN** 用户在新增配置页面选择配置类型
- **THEN** 系统根据选择的类型显示相应的配置字段
- **WHEN** 用户选择"OpenAI 兼容接口"
- **THEN** 系统显示 API 地址、API 密钥、模型名称、Temperature、Max Tokens、Top P 字段
- **WHEN** 用户选择"智算管理平台"
- **THEN** 系统显示 API 地址、App ID、App Secret 字段
#### Scenario: 保存新配置
- **WHEN** 用户填写完整配置信息并点击"保存"按钮
- **THEN** 系统验证表单数据
- **WHEN** 表单验证通过
- **THEN** 系统创建新配置并导航到配置列表页面
- **THEN** 如果这是第一个配置,系统自动将其设为默认模型(`isActive = true`
### Requirement: 编辑平台级模型配置
系统 SHALL 允许平台管理员编辑已存在的平台级模型配置,但配置类型字段为只读。
#### Scenario: 打开编辑配置页面
- **WHEN** 用户点击某个配置的"编辑"按钮
- **THEN** 系统导航到 `/admin/models/:id/edit` 页面
- **THEN** 页面预填充该配置的所有信息
- **THEN** 配置类型字段为只读状态,显示"配置类型不可修改"提示
#### Scenario: 保存编辑的配置
- **WHEN** 用户修改配置信息并点击"保存"按钮
- **THEN** 系统更新配置并导航到配置列表页面
### Requirement: 删除平台级模型配置
系统 SHALL 允许平台管理员删除非默认的平台级模型配置,默认模型不允许删除。
#### Scenario: 删除非默认配置
- **WHEN** 用户点击某个非默认配置的"删除"按钮
- **THEN** 系统显示删除确认弹窗
- **WHEN** 用户确认删除
- **THEN** 系统删除该配置并刷新配置列表
#### Scenario: 删除默认配置被禁用
- **WHEN** 配置为默认模型(`isActive = true`
- **THEN** 系统禁用"删除"按钮
- **THEN** 鼠标悬停时显示提示"平台默认模型不允许删除,请先切换默认模型"
### Requirement: 设为平台级默认模型
系统 SHALL 允许平台管理员将某个非默认配置设为平台级默认模型,更新页面状态但不修改实际数据。
#### Scenario: 设为默认配置
- **WHEN** 用户点击某个非默认配置的"设为默认"按钮
- **THEN** 系统显示确认弹窗"确定将'XXX'设为平台默认模型配置吗?切换后,原生效配置将变为备用状态。"
- **WHEN** 用户确认切换
- **THEN** 系统更新页面状态,将原默认配置设为非默认,将目标配置设为默认
- **THEN** 系统不修改实际数据文件(原型行为)
#### Scenario: 默认配置不显示设为默认按钮
- **WHEN** 配置已经是默认模型(`isActive = true`
- **THEN** 系统不显示"设为默认"按钮

View File

@@ -0,0 +1,81 @@
## ADDED Requirements
### Requirement: 展示项目级模型配置列表
系统 SHALL 在工作台的项目管理二级菜单中的模型配置页面展示所有项目级模型配置的列表,每个配置项显示配置名称、配置类型、状态和操作按钮。
#### Scenario: 查看配置列表
- **WHEN** 用户通过工作台项目管理菜单访问 `/console/project/models` 页面
- **THEN** 系统显示所有项目级模型配置的表格
- **THEN** 每个配置项显示配置名称、配置类型、状态(生效中/未生效)和操作按钮
- **THEN** 表格头部显示"新增配置"按钮
### Requirement: 新增项目级模型配置
系统 SHALL 允许项目管理员创建新的项目级模型配置配置包含基本信息、API 配置和参数配置(根据类型不同)。
#### Scenario: 打开新增配置页面
- **WHEN** 用户点击"新增配置"按钮
- **THEN** 系统导航到 `/console/project/models/add` 页面
- **THEN** 页面显示配置名称、配置类型、API 配置和参数配置表单
#### Scenario: 选择配置类型
- **WHEN** 用户在新增配置页面选择配置类型
- **THEN** 系统根据选择的类型显示相应的配置字段
- **WHEN** 用户选择"OpenAI 兼容接口"
- **THEN** 系统显示 API 地址、API 密钥、模型名称、Temperature、Max Tokens、Top P 字段
- **WHEN** 用户选择"智算管理平台"
- **THEN** 系统显示 API 地址、App ID、App Secret 字段
#### Scenario: 保存新配置
- **WHEN** 用户填写完整配置信息并点击"保存"按钮
- **THEN** 系统验证表单数据
- **WHEN** 表单验证通过
- **THEN** 系统创建新配置并导航到配置列表页面
- **THEN** 如果这是第一个配置,系统自动将其设为默认模型(`isActive = true`
### Requirement: 编辑项目级模型配置
系统 SHALL 允许项目管理员编辑已存在的项目级模型配置,但配置类型字段为只读。
#### Scenario: 打开编辑配置页面
- **WHEN** 用户点击某个配置的"编辑"按钮
- **THEN** 系统导航到 `/console/project/models/:id/edit` 页面
- **THEN** 页面预填充该配置的所有信息
- **THEN** 配置类型字段为只读状态,显示"配置类型不可修改"提示
#### Scenario: 保存编辑的配置
- **WHEN** 用户修改配置信息并点击"保存"按钮
- **THEN** 系统更新配置并导航到配置列表页面
### Requirement: 删除项目级模型配置
系统 SHALL 允许项目管理员删除任何项目级模型配置,包括默认模型。
#### Scenario: 删除默认配置
- **WHEN** 用户点击某个默认配置的"删除"按钮
- **THEN** 系统显示删除确认弹窗
- **WHEN** 用户确认删除
- **THEN** 系统删除该配置并刷新配置列表
- **THEN** 删除后该级别没有默认模型
#### Scenario: 删除非默认配置
- **WHEN** 用户点击某个非默认配置的"删除"按钮
- **THEN** 系统显示删除确认弹窗
- **WHEN** 用户确认删除
- **THEN** 系统删除该配置并刷新配置列表
### Requirement: 设为项目级默认模型
系统 SHALL 允许项目管理员将某个非默认配置设为项目级默认模型,更新页面状态但不修改实际数据。
#### Scenario: 设为默认配置
- **WHEN** 用户点击某个非默认配置的"设为默认"按钮
- **THEN** 系统显示确认弹窗
- **WHEN** 用户确认切换
- **THEN** 系统更新页面状态,将原默认配置设为非默认,将目标配置设为默认
- **THEN** 系统不修改实际数据文件(原型行为)
#### Scenario: 默认配置不显示设为默认按钮
- **WHEN** 配置已经是默认模型(`isActive = true`
- **THEN** 系统不显示"设为默认"按钮

View File

@@ -0,0 +1,81 @@
## ADDED Requirements
### Requirement: 展示个人模型配置列表
系统 SHALL 在工作台侧边栏的个人模型配置页面展示所有个人模型配置的列表,每个配置项显示配置名称、配置类型、状态和操作按钮。
#### Scenario: 查看配置列表
- **WHEN** 用户通过工作台侧边栏访问 `/console/user-models` 页面
- **THEN** 系统显示所有个人模型配置的表格
- **THEN** 每个配置项显示配置名称、配置类型、状态(生效中/未生效)和操作按钮
- **THEN** 表格头部显示"新增配置"按钮
### Requirement: 新增个人模型配置
系统 SHALL 允许用户创建新的个人模型配置配置包含基本信息、API 配置和参数配置(根据类型不同)。
#### Scenario: 打开新增配置页面
- **WHEN** 用户点击"新增配置"按钮
- **THEN** 系统导航到 `/console/user-models/add` 页面
- **THEN** 页面显示配置名称、配置类型、API 配置和参数配置表单
#### Scenario: 选择配置类型
- **WHEN** 用户在新增配置页面选择配置类型
- **THEN** 系统根据选择的类型显示相应的配置字段
- **WHEN** 用户选择"OpenAI 兼容接口"
- **THEN** 系统显示 API 地址、API 密钥、模型名称、Temperature、Max Tokens、Top P 字段
- **WHEN** 用户选择"智算管理平台"
- **THEN** 系统显示 API 地址、App ID、App Secret 字段
#### Scenario: 保存新配置
- **WHEN** 用户填写完整配置信息并点击"保存"按钮
- **THEN** 系统验证表单数据
- **WHEN** 表单验证通过
- **THEN** 系统创建新配置并导航到配置列表页面
- **THEN** 如果这是第一个配置,系统自动将其设为默认模型(`isActive = true`
### Requirement: 编辑个人模型配置
系统 SHALL 允许用户编辑已存在的个人模型配置,但配置类型字段为只读。
#### Scenario: 打开编辑配置页面
- **WHEN** 用户点击某个配置的"编辑"按钮
- **THEN** 系统导航到 `/console/user-models/:id/edit` 页面
- **THEN** 页面预填充该配置的所有信息
- **THEN** 配置类型字段为只读状态,显示"配置类型不可修改"提示
#### Scenario: 保存编辑的配置
- **WHEN** 用户修改配置信息并点击"保存"按钮
- **THEN** 系统更新配置并导航到配置列表页面
### Requirement: 删除个人模型配置
系统 SHALL 允许用户删除任何个人模型配置,包括默认模型。
#### Scenario: 删除默认配置
- **WHEN** 用户点击某个默认配置的"删除"按钮
- **THEN** 系统显示删除确认弹窗
- **WHEN** 用户确认删除
- **THEN** 系统删除该配置并刷新配置列表
- **THEN** 删除后该级别没有默认模型
#### Scenario: 删除非默认配置
- **WHEN** 用户点击某个非默认配置的"删除"按钮
- **THEN** 系统显示删除确认弹窗
- **WHEN** 用户确认删除
- **THEN** 系统删除该配置并刷新配置列表
### Requirement: 设为个人默认模型
系统 SHALL 允许用户将某个非默认配置设为个人默认模型,更新页面状态但不修改实际数据。
#### Scenario: 设为默认配置
- **WHEN** 用户点击某个非默认配置的"设为默认"按钮
- **THEN** 系统显示确认弹窗
- **WHEN** 用户确认切换
- **THEN** 系统更新页面状态,将原默认配置设为非默认,将目标配置设为默认
- **THEN** 系统不修改实际数据文件(原型行为)
#### Scenario: 默认配置不显示设为默认按钮
- **WHEN** 配置已经是默认模型(`isActive = true`
- **THEN** 系统不显示"设为默认"按钮