Files
EmailBill/openspec/changes/archive/2026-02-14-improve-classification-edit/design.md
SunCheng a88556c784 fix
2026-02-15 10:10:28 +08:00

90 lines
4.6 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.
## Context
**当前状态**:
- 分类图标由 AI 生成,有两个生成入口:用户手动生成(前端触发)和后台 JOB 自动生成
- 两套生成逻辑使用不同的提示词,导致生成的图标风格和质量不一致
- 分类编辑页面缺少删除图标功能,用户无法清除不需要的图标
- `ClassificationIconGenerateService.cs``ClassificationIconGenerateJob.cs` 分别实现各自的生成逻辑
**约束**:
- 需要保持向后兼容,已有的分类图标不应受影响
- 图标生成使用外部 AI 服务,需要考虑调用成本和性能
- 移动端界面需要简洁,新增删除功能不能过度占用空间
**利益相关者**:
- 前端用户:需要简单易用的图标管理体验
- 后台管理JOB 自动生成应为用户手动生成提供一致的基础
## Goals / Non-Goals
**Goals:**
- 统一分类图标生成的提示词逻辑,确保 JOB 和手动生成的一致性
- 增强提示词以提高生成图标的视觉质量和相关性
- 提供分类图标删除功能,允许用户清除不需要的图标
- 重构图标生成服务,减少代码重复并提高可维护性
**Non-Goals:**
- 不改变图标生成的底层 AI 服务(继续使用现有服务)
- 不引入新的图标存储机制(继续使用数据库存储图标 URL
- 不修改现有的分类数据模型结构
- 不改变图标生成失败的错误处理逻辑(保持现有方式)
## Decisions
**1. 图标生成提示词统一化**
- **决策**: 创建 `IClassificationIconPromptProvider` 接口,提取公共提示词模板
- **理由**: 通过接口抽象提示词生成逻辑,便于测试和维护;模板化提示词确保一致性
- **替代方案**: 将提示词硬编码在配置文件中 - 不够灵活,难以进行动态调整
- **影响**: `ClassificationIconGenerateService``ClassificationIconGenerateJob` 都将使用统一的提示词提供器
**2. 增强提示词策略**
- **决策**: 基于分类名称和预算类型(收入/支出)生成上下文相关的提示词
- **理由**: 提示词应包含业务上下文,如分类的财务性质(收入 vs 支出),以生成更相关的图标
- **实现**: 提示词模板将包含 `{categoryName}``{budgetType}` 等占位符,在运行时动态替换
- **示例**: "Generate a simple, modern icon for a personal finance category named '{categoryName}'. This is a {budgetType} category. Use a minimalist style with flat design, suitable for a mobile app."
**3. 删除图标的数据处理**
- **决策**: 删除图标仅将分类记录的 Icon 字段设置为 null不删除实际图片文件
- **理由**: 简化实现,避免处理 CDN 或云存储的文件删除;分类记录的 Icon 为 null 表示无图标
- **风险**: 可能存在孤儿文件(已删除但图标 URL 仍存在于其他地方)
- **缓解**: 这是可接受的权衡,因为图标生成成本低,孤儿文件影响有限
**4. 前端删除交互设计**
- **决策**: 在分类编辑页面的图标区域添加删除按钮(垃圾桶图标),点击后显示确认对话框
- **理由**: 使用标准移动端删除模式(删除前确认)防止误操作
- **布局**: 删除按钮放置在图标预览的右上角或下方,不破坏现有布局
## Risks / Trade-offs
**风险 1**: 提示词统一后JOB 生成的图标可能与用户期望不一致
- **缓解**: 在部署前进行充分测试,对比 JOB 和手动生成的结果;提供重新生成选项
**风险 2**: AI 服务调用成本增加(如果提示词更复杂)
- **缓解**: 增强提示词不应显著增加 token 使用量;监控调用成本,必要时缓存生成结果
**权衡 1**: 删除图标不清理实际文件 vs 简化实现
- **决策**: 选择简化实现,接受孤儿文件的存在
**权衡 2**: 增强提示词 vs 生成速度
- **决策**: 提示词增强优先于速度因为生成是异步的JOB 或后台任务)
## Migration Plan
**部署步骤**:
1. 部署后端代码(新的提示词服务和删除 API
2. 部署前端代码(删除按钮和 API 调用)
3. 重启后台 JOB 服务,使用新的统一提示词
4. 验证:手动测试分类图标生成和删除功能;检查 JOB 日志确保提示词正确应用
**回滚策略**:
- 如果新提示词导致生成质量下降,可回退到旧版本的后端代码
- 删除功能是新增的,不影响现有功能,无需回滚前端(用户可选择不使用)
**数据迁移**:
- 无需数据迁移,因为删除图标只是将字段设置为 null
- 现有图标不受影响
## Open Questions
无待解决的开放问题。设计已明确技术方案和实现路径。