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

4.6 KiB
Raw Blame History

Context

当前状态:

  • 分类图标由 AI 生成,有两个生成入口:用户手动生成(前端触发)和后台 JOB 自动生成
  • 两套生成逻辑使用不同的提示词,导致生成的图标风格和质量不一致
  • 分类编辑页面缺少删除图标功能,用户无法清除不需要的图标
  • ClassificationIconGenerateService.csClassificationIconGenerateJob.cs 分别实现各自的生成逻辑

约束:

  • 需要保持向后兼容,已有的分类图标不应受影响
  • 图标生成使用外部 AI 服务,需要考虑调用成本和性能
  • 移动端界面需要简洁,新增删除功能不能过度占用空间

利益相关者:

  • 前端用户:需要简单易用的图标管理体验
  • 后台管理JOB 自动生成应为用户手动生成提供一致的基础

Goals / Non-Goals

Goals:

  • 统一分类图标生成的提示词逻辑,确保 JOB 和手动生成的一致性
  • 增强提示词以提高生成图标的视觉质量和相关性
  • 提供分类图标删除功能,允许用户清除不需要的图标
  • 重构图标生成服务,减少代码重复并提高可维护性

Non-Goals:

  • 不改变图标生成的底层 AI 服务(继续使用现有服务)
  • 不引入新的图标存储机制(继续使用数据库存储图标 URL
  • 不修改现有的分类数据模型结构
  • 不改变图标生成失败的错误处理逻辑(保持现有方式)

Decisions

1. 图标生成提示词统一化

  • 决策: 创建 IClassificationIconPromptProvider 接口,提取公共提示词模板
  • 理由: 通过接口抽象提示词生成逻辑,便于测试和维护;模板化提示词确保一致性
  • 替代方案: 将提示词硬编码在配置文件中 - 不够灵活,难以进行动态调整
  • 影响: ClassificationIconGenerateServiceClassificationIconGenerateJob 都将使用统一的提示词提供器

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

无待解决的开放问题。设计已明确技术方案和实现路径。