## Context
**当前状态**:
- 前端使用Ant Design 6.3.5作为UI框架
- 实现了6套自定义主题系统(default、dark、mui、shadcn、bootstrap、glass)
- 使用@ant-design/charts进行数据可视化
- 使用antd-style进行动态样式管理
- 完整的供应商管理和统计功能
**约束条件**:
- 必须保持所有业务功能不变
- 图表功能必须保留
- Settings页面路由必须保留(即使暂时为空)
- 使用bun作为唯一包管理器
- 遵循项目现有代码规范(中文注释、测试覆盖)
**利益相关者**:
- 前端开发团队:维护成本降低
- 产品用户:UI风格变化,功能保持不变
## Goals / Non-Goals
**Goals:**
- 完全迁移到TDesign React组件库,统一设计系统
- 移除复杂的多主题系统,简化代码架构
- 使用Recharts替代@ant-design/charts实现数据可视化
- 保持所有业务功能完整可用
- 确保测试覆盖率不降低
- 优化bundle体积(移除未使用的主题系统)
**Non-Goals:**
- 不实现新的业务功能
- 不保留Ant Design相关代码或依赖
- 不实现侧边栏折叠功能(接受简化)
- 不实现主题切换功能(使用TDesign默认主题)
- 不优化后端API或数据结构
## Decisions
### 1. 图表库选择:Recharts
**决策**:使用Recharts替代@ant-design/charts
**理由**:
- React原生JSX语法,与TDesign风格一致
- TypeScript支持优秀,类型定义完整
- 文档清晰,社区活跃(1.8M周下载量)
- Bundle体积适中(~370KB vs ECharts ~1MB)
- shadcn/ui生态默认选择,现代化设计
- 声明式组件,易于维护和测试
**替代方案**:
- **ECharts**:功能强大但体积大(1MB),需要wrapper,非React原生
- **Chart.js**:最流行但非React原生,需要react-chartjs-2 wrapper
- **Visx**:最灵活但学习曲线陡峭,适合高度定制场景
**实现**:
```tsx
// UsageChart.tsx
import { LineChart, Line, XAxis, YAxis, CartesianGrid, ResponsiveContainer, Tooltip } from 'recharts';
```
### 2. 主题系统:完全移除
**决策**:删除所有主题相关代码,使用TDesign默认主题
**理由**:
- 多主题系统增加维护成本和代码复杂度
- TDesign默认主题已满足企业级应用需求
- 简化迁移过程,降低风险
- 减少bundle体积(移除antd-style和主题配置)
**实现**:
- 删除`src/contexts/ThemeContext.tsx`
- 删除`src/themes/`整个目录
- App.tsx移除ThemeProvider,直接使用TDesign ConfigProvider
- Settings页面简化为空页面
### 3. 布局组件:简化侧边栏
**决策**:移除侧边栏折叠功能,使用固定宽度侧边栏
**理由**:
- TDesign Menu组件没有内置折叠功能
- 自定义实现增加复杂度和维护成本
- 固定宽度侧边栏满足当前业务需求
- 简化迁移过程,降低风险
**实现**:
```tsx
// AppLayout.tsx
AI Gateway
```
### 4. 图标系统:TDesign Icons
**决策**:使用tdesign-icons-react图标库
**理由**:
- 与TDesign组件库配套,风格一致
- 支持按需导入,优化bundle体积
- 提供完整的图标集合
**映射方案**:
```tsx
// Ant Design → TDesign
CloudServerOutlined → CloudServerIcon (或ServerIcon)
BarChartOutlined → ChartLineIcon (或ChartIcon)
SettingOutlined → SettingIcon
```
**注意**:具体图标名称需要在安装tdesign-icons-react后确认,根据实际可用图标选择最接近的。
### 5. 栅格系统:保持不变
**决策**:继续使用Row/Col栅格系统
**理由**:
- TDesign提供完整的Row/Col组件
- API与Ant Design完全兼容
- 无需修改现有栅格代码
- 保持响应式布局能力
**实现**:直接替换import路径即可
```tsx
// import { Row, Col } from 'antd';
import { Row, Col } from 'tdesign-react';
```
### 6. 表单组件:Dialog替代Modal
**决策**:使用TDesign Dialog组件替代Ant Design Modal
**理由**:
- Dialog是TDesign的标准弹窗组件
- API相似,迁移成本低
- 支持所有必要功能(确认、取消、加载状态)
**API映射**:
```tsx
// Ant Design Modal → TDesign Dialog
title → header
open → visible
onOk → onConfirm
onCancel → onClose (注意:语义略有不同)
okText → confirmBtn
cancelText → cancelBtn
destroyOnHidden → destroyOnClose
Form.Item → Form.FormItem
```
### 7. 迁移策略:渐进式文件替换
**决策**:按模块逐个替换,保持项目可运行
**理由**:
- 降低风险,便于调试
- 可以逐步验证每个模块的功能
- 出现问题容易定位和回滚
**顺序**:
1. 依赖安装与配置(基础)
2. App.tsx主题移除(入口)
3. AppLayout布局迁移(导航)
4. 表单组件迁移(ProviderForm、ModelForm)
5. 表格组件迁移(ProviderTable、ModelTable、StatsTable)
6. 统计组件迁移(StatCards、UsageChart)
7. Settings页面简化
8. 测试文件更新
## Risks / Trade-offs
### 风险1:图标名称不匹配
**风险**:TDesign可能没有与Ant Design完全对应的图标名称
**缓解**:
- 安装tdesign-icons-react后立即确认可用图标
- 选择语义最接近的图标
- 必要时使用通用图标(如CloudIcon、ChartIcon、SettingIcon)
- 在design.md中记录最终选择的图标映射
### 风险2:组件API差异导致功能缺失
**风险**:TDesign组件API与Ant Design不完全一致,可能影响功能
**缓解**:
- 逐个组件对比API文档
- 编写详细的迁移映射表
- 每个模块迁移后立即测试验证
- 保留原有业务逻辑,只替换UI组件
### 风险3:样式差异影响用户体验
**风险**:TDesign默认样式与Ant Design不同,用户可能不适应
**缓解**:
- 迁移后进行完整UI验收测试
- 必要时通过ConfigProvider调整主题配置
- 记录样式差异点,统一调整
### 风险4:测试覆盖率下降
**风险**:迁移过程中测试可能失败或被跳过
**缓解**:
- 迁移前确保所有测试通过
- 每个模块迁移后立即更新对应测试
- 删除主题相关测试,其他测试必须保留
- 迁移后运行完整测试套件,确保覆盖率不降低
### 风险5:DatePicker日期格式处理
**风险**:TDesign DatePicker的日期格式处理可能与Ant Design不同
**缓解**:
- 对比两个组件的日期格式API
- 测试日期范围选择功能
- 确保与后端API的日期格式兼容
## Migration Plan
### 阶段1:依赖准备(0.5小时)
1. 安装新依赖:
```bash
cd frontend
bun add tdesign-react tdesign-icons-react recharts
```
2. 移除旧依赖:
```bash
bun remove antd @ant-design/icons @ant-design/charts antd-style
```
3. 引入TDesign全局样式:
```tsx
// src/main.tsx
import 'tdesign-react/es/style/index.css';
```
### 阶段2:主题系统移除(0.5小时)
1. 删除`src/contexts/ThemeContext.tsx`
2. 删除`src/themes/`整个目录
3. 修改`src/App.tsx`:
- 移除ThemeProvider导入和使用
- 替换为TDesign ConfigProvider
4. 删除主题相关测试文件
### 阶段3:布局与导航迁移(1小时)
1. 修改`src/components/AppLayout/index.tsx`:
- 替换Layout组件(Sider→Aside)
- 替换Menu组件
- 替换图标(@ant-design/icons→tdesign-icons-react)
- 移除折叠功能相关代码
- 移除主题相关逻辑
2. 更新AppLayout测试
### 阶段4:表单组件迁移(1.5小时)
1. 修改`src/pages/Providers/ProviderForm.tsx`:
- Modal→Dialog
- Form.Item→Form.FormItem
- Input、Switch组件替换
2. 修改`src/pages/Providers/ModelForm.tsx`:
- 同上处理
3. 更新表单测试
### 阶段5:表格组件迁移(1小时)
1. 修改`src/pages/Providers/ProviderTable.tsx`:
- Table、Card、Button、Tag、Popconfirm、Space替换
2. 修改`src/pages/Providers/ModelTable.tsx`:
- 同上处理
3. 修改`src/pages/Stats/StatsTable.tsx`:
- Table、Card、Select、Input、DatePicker替换
4. 更新表格测试
### 阶段6:统计组件迁移(1小时)
1. 修改`src/pages/Stats/StatCards.tsx`:
- Row、Col、Card、Statistic替换
2. 修改`src/pages/Stats/UsageChart.tsx`:
- Card保持
- @ant-design/charts→recharts重写
3. 更新统计测试
### 阶段7:Settings页面简化(0.5小时)
1. 修改`src/pages/Settings/index.tsx`:
- 移除主题设置相关代码
- 简化为空页面提示
2. 更新Settings测试
### 阶段8:测试与修复(2小时)
1. 运行完整测试套件:`bun test`
2. 修复失败的测试
3. 运行E2E测试:`bun test:e2e`
4. 手动验收测试:
- 供应商管理完整流程
- 统计数据展示
- 图表交互
- 响应式布局
### 阶段9:样式微调(1小时)
1. 检查UI一致性
2. 调整间距、颜色等细节
3. 确认图标显示正确
4. 最终验收
### 回滚策略
如果迁移过程中出现严重问题:
1. 恢复package.json到迁移前状态
2. 恢复所有源代码文件
3. 重新安装依赖:`bun install`
4. 运行测试确认回滚成功
**注意**:建议在迁移前创建Git分支,便于回滚。
## Open Questions
1. **TDesign图标名称确认**
- 需要安装tdesign-icons-react后确认具体图标名称
- 如果没有CloudServer/ChartLine/Setting图标,选择哪个替代?
- 是否需要自定义SVG图标?
2. **DatePicker日期格式兼容性**
- TDesign DatePicker的日期格式是否与后端API兼容?
- RangePicker的API是否完全兼容?
- 是否需要额外的日期处理逻辑?
3. **ConfigProvider全局配置**
- 是否需要配置TDesign的全局属性?
- 是否需要自定义主题token?
- 国际化配置是否需要调整?
4. **性能影响评估**
- 新bundle体积是否可接受?
- Recharts渲染性能是否满足需求?
- 是否需要代码分割优化?
5. **用户验收标准**
- UI风格变化的接受度如何?
- 是否需要用户参与验收测试?
- 是否需要提供UI变更说明文档?