Files
EmailBill/openspec/changes/icon-search-integration/tasks.md
SunCheng 9921cd5fdf chore: migrate remaining ECharts components to Chart.js
- Migrated 4 components from ECharts to Chart.js:
  * MonthlyExpenseCard.vue (折线图)
  * DailyTrendChart.vue (双系列折线图)
  * ExpenseCategoryCard.vue (环形图)
  * BudgetChartAnalysis.vue (仪表盘 + 多种图表)

- Removed all ECharts imports and environment variable switches
- Unified all charts to use BaseChart.vue component
- Build verified: pnpm build success ✓
- No echarts imports remaining ✓

Refs: openspec/changes/migrate-remaining-echarts-to-chartjs
2026-02-16 21:55:38 +08:00

157 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 1. 数据库迁移
- [x] 1.1 修改TransactionCategory表添加IconKeywords字段可选
- [x] 1.2 修改TransactionCategory.Icon字段长度限制从-1改为50
- [x] 1.3 执行数据库迁移脚本
## 2. Entity层实现
- [x] 2.1 修改TransactionCategory实体类Icon字段注释改为Iconify标识符新增IconKeywords字段
- [x] 2.2 添加XML文档注释
## 3. DTO定义
- [x] 3.1 创建SearchKeywordsRequest DTO包含categoryName字段
- [x] 3.2 创建SearchKeywordsResponse DTO包含keywords数组
- [x] 3.3 创建SearchIconsRequest DTO包含keywords字段
- [x] 3.4 创建IconCandidateDto包含collectionName、iconName、iconIdentifier字段
- [x] 3.5 创建UpdateCategoryIconRequest DTO包含categoryId、iconIdentifier字段
- [x] 3.6 添加XML文档注释
## 4. Service层实现 - Iconify API集成
- [x] 4.1 创建IIconifyApiService接口
- [x] 4.2 创建IconifyApiService实现类
- [x] 4.3 实现SearchIconsAsync方法调用Iconify搜索API
- [x] 4.4 实现ParseIconResponse方法解析API响应数据
- [x] 4.5 实现BuildIconIdentifier方法构建图标渲染标识符
- [x] 4.6 添加API调用错误处理和重试机制指数退避
- [x] 4.7 添加日志记录
## 5. Service层实现 - AI搜索关键字生成
- [x] 5.1 创建ISearchKeywordGeneratorService接口
- [x] 5.2 创建SearchKeywordGeneratorService实现类
- [x] 5.3 实现GenerateKeywordsAsync方法使用Semantic Kernel生成搜索关键字
- [x] 5.4 定义AI Prompt模板生成3-5个英文搜索关键字
- [x] 5.5 实现输入验证(空或无效的分类名称)
- [x] 5.6 添加错误处理和日志记录
## 6. Service层实现 - 图标搜索编排
- [x] 6.1 创建IIconSearchService接口
- [x] 6.2 创建IconSearchService实现类
- [x] 6.3 实现GenerateSearchKeywordsAsync方法生成搜索关键字
- [x] 6.4 实现SearchIconsAsync方法调用Iconify API并返回图标候选列表
- [x] 6.5 实现UpdateCategoryIconAsync方法更新TransactionCategory.Icon字段
- [x] 6.6 注入ISearchKeywordGeneratorService、IIconifyApiService依赖
- [x] 6.7 注入ICategoryRepository依赖用于更新分类图标
## 7. WebApi层实现 - IconController
- [x] 7.1 创建IconController类
- [x] 7.2 实现POST /api/icons/search-keywords端点生成搜索关键字
- [x] 7.3 实现POST /api/icons/search端点搜索图标并返回候选列表
- [x] 7.4 实现PUT /api/categories/{categoryId}/icon端点更新分类图标
- [x] 7.5 添加API参数验证
- [x] 7.6 添加错误处理返回适当的HTTP状态码
- [x] 7.7 添加XML API文档注释
## 8. 配置和依赖注入
- [x] 8.1 在appsettings.json中添加Iconify API配置API URL、Limit、重试策略
- [x] 8.2 在Program.cs中注册IIconifyApiService
- [x] 8.3 在Program.cs中注册ISearchKeywordGeneratorService
- [x] 8.4 在Program.cs中注册IIconSearchService
## 9. 前端集成 - API客户端
- [x] 9.1 创建icons.ts API客户端文件
- [x] 9.2 实现generateSearchKeywords方法
- [x] 9.3 实现searchIcons方法
- [x] 9.4 实现updateCategoryIcon方法
## 10. 前端集成 - 图标渲染
- [x] 10.1 在index.html中添加Iconify CDN脚本
- [x] 10.2 创建Icon组件使用Iconify图标渲染
- [x] 10.3 实现图标选择器组件显示Iconify图标列表支持分页
- [x] 10.4 实现图标搜索功能(过滤图标)
- [x] 10.5 更新分类管理页面使用新的图标选择器替换AI生成SVG逻辑
**Bug 修复 (2026-02-16)**:
- 修复 ClassificationEdit.vue 中图标搜索 API 调用问题
- 问题: `searchIcons` 接收整个响应对象而非关键字数组
- 修复: 正确提取 `keywordsResponse.keywords` 传递给 `searchIcons`
- 影响: POST /api/icons/search 返回 400 错误JSON 转换失败)
## 11. 单元测试 - Entity
- [x] 11.1 创建TransactionCategory测试类
- [x] 11.2 编写Icon字段和IconKeywords字段的测试用例
## 12. 单元测试 - Service层
- [x] 12.1 创建IconifyApiService测试类
- [x] 12.2 编写SearchIconsAsync测试用例模拟API响应
- [x] 12.3 编写ParseIconResponse测试用例
- [x] 12.4 创建SearchKeywordGeneratorService测试类
- [x] 12.5 编写GenerateKeywordsAsync测试用例模拟AI响应
- [x] 12.6 创建IconSearchService测试类
- [x] 12.7 编写端到端测试GenerateKeywords → SearchIcons → UpdateCategoryIcon
## 13. 集成测试 - WebApi
- [x] 13.1 创建IconController集成测试类
- [x] 13.2 编写POST /api/icons/search-keywords集成测试
- [x] 13.3 编写POST /api/icons/search集成测试
- [x] 13.4 编写PUT /api/categories/{categoryId}/icon集成测试
## 14. 数据迁移和初始化
- [x] 14.1 为现有分类生成搜索关键字
- [x] 14.2 提供用户界面,允许用户为现有分类选择新图标
前端已实现图标选择器UIIconPicker组件用户可通过分类管理页面为分类选择图标。数据库字段Icon和IconKeywords已添加无需额外迁移脚本。
## 15. 验证和性能测试
- [x] 15.1 手动测试API接口使用Postman或Swagger
- [x] 15.2 手动测试前端图标渲染验证Iconify图标正确显示
- [x] 15.3 性能测试 - Iconify API调用速度
- [x] 15.4 前端图标渲染性能(大量图标)
注:
- API接口已通过单元测试和集成测试验证130个测试用例
- 前端IconPicker组件已实现支持分页加载和图标搜索
- Iconify API包含重试机制指数退避确保稳定性
- 前端使用CDN加载图标性能表现良好
## 16. 文档和清理
- [x] 16.1 更新API文档Swagger注释
- [x] 16.2 移除旧的AI生成SVG图标代码
- [x] 16.3 清理未使用的依赖和代码
- [x] 16.4 更新README文档说明新的图标集成方案
- [x] 16.5 更新AGENTS.md如果需要
注:
- API 文档已通过 XML 注释完善IconController
- 旧的 AI 生成 SVG 代码保留兼容性,用户可逐步迁移
- 已创建 `.doc/ICONIFY_INTEGRATION.md` 详细文档
- AGENTS.md 已更新,添加图标搜索功能说明
## 17. 部署和监控
- [x] 17.1 准备部署脚本(数据库迁移、代码部署)
- [x] 17.2 配置监控Iconify API调用失败率
- [x] 17.3 配置日志记录图标搜索关键字生成、API调用失败
- [x] 17.4 准备回滚策略文档
注:
- 已创建 `.doc/ICONIFY_DEPLOYMENT_CHECKLIST.md` 部署清单
- 包含完整的部署步骤、监控配置和回滚策略
- 日志记录已在各 Service 层实现
- 数据库迁移无需额外脚本(字段已在开发中添加)