8.2 KiB
8.2 KiB
id, title, phase, deps, status, created
| id | title | phase | deps | status | created | |
|---|---|---|---|---|---|---|
| T-576 | ②③生成/更新内容模式下拉与缺失内容阻断 | 7 |
|
DONE | 2026-07-09 |
问题 / 背景
当前②AI生成模块用「生成封面图片(成本较高)」checkbox 控制是否生成封面:
- 关闭:只生成标题。
- 开启:生成标题和封面。
这个设计能控制生图成本,但正式使用时不够精确:
- 用户无法只补生成封面;例如已生成标题后,想单独补封面,需要依赖当前增量逻辑和 checkbox 语义,不够直观。
- 「图片」文案不够准确,本模块实际处理的是商品封面,不是商品全部图片。
- ③更新蝦皮目前依赖⑤设置里的「允许更新封面」checkbox。这个开关离真实更新动作太远,用户在③点击开始更新时不一定清楚本轮到底更新标题、封面还是图文。
- 如果②只生成了标题,③却想更新封面,当前需要更明确地在开始前阻断并提示缺少新封面,避免进入 Chrome/CDP 后才失败。
产品结论
需求合理,建议做,但需要统一成“内容模式”而不是布尔开关。
②AI生成模块下拉:
只生成标题只生成封面生成标题和封面
③更新蝦皮模块下拉:
只更新标题只更新封面更新标题和封面
文案统一使用「封面」,不用「图片」,避免用户误解为商品详情图或所有商品图片。
方案
1. ②AI生成模式
-
app/appconfig.py- 增加兼容字段
ai.generate_mode,取值:titlecovertitle_cover
- 兼容旧字段
ai.generate_cover:false→generate_mode=titletrue→generate_mode=title_cover
- 保存设置时可继续写回
generate_cover兼容值,但 GUI 主逻辑以generate_mode为准。
- 增加兼容字段
-
app/ai.pyis_generatable_task()、generation_component_totals()、generate_batch()支持三种生成模式。title:只补缺失标题,不调用生图。cover:只补缺失封面;需要当前任务已有new_title,否则该任务不进入本轮,并在 GUI 给出可理解提示。title_cover:缺标题先生成标题,再生成封面;已有标题只补封面,已有封面只补标题或跳过。
-
app/gui/tabs/generate.py- 把「生成封面图片(成本较高)」checkbox 改成下拉框,例如 label「生成内容」。
- 下拉选项:
只生成标题只生成封面生成标题和封面
- 开始生成时按选项筛选任务和计算标题/封面进度。
- 只生成封面但当前筛选任务都缺少新标题时,中止并中文提示:
当前筛选结果没有可生成封面的任务,请先生成标题。 - 日志开头写明本轮生成内容,例如:
本轮生成内容:只生成封面。
2. ③更新蝦皮模式
-
app/appconfig.py- 增加兼容字段
shopee_update.update_mode,取值:titlecovertitle_cover
- 兼容旧字段
shopee_update.allow_cover_update:false→update_mode=titletrue→ 默认update_mode=title_cover,或保留用户当前选择。
allow_real_submit仍保留在⑤设置里,继续作为真实提交总开关。
- 增加兼容字段
-
app/gui/tabs/settings.py- 移除普通设置页里的「允许更新封面」用户控件。
- 保存设置时保留旧字段兼容,不破坏已有配置文件。
-
app/gui/tabs/apply.py- 在③更新蝦皮左下角增加「更新内容」下拉框。
- 下拉选项:
只更新标题只更新封面更新标题和封面
- 原「检查本轮更新」「开始更新」「停止」等按钮向右挪,避免控件拥挤。
- 选择包含封面的模式时,确认弹窗中明确提示:
本轮将更新线上封面。 - 选择「只更新标题」时,不要求
new_cover_path,也不触发封面更新。 - 选择「只更新封面」时,不要求标题改动,但必须有
new_cover_path。 - 选择「更新标题和封面」时,必须同时有
new_title和new_cover_path。
3. 开始更新前置校验
点击③「开始更新」后,在账号预检和 CDP 打开商品页之前,先按当前更新模式校验当前筛选结果:
只更新标题:缺new_title的任务阻断。只更新封面:缺new_cover_path的任务阻断。更新标题和封面:缺任一内容的任务阻断。
阻断时不启动 ApplyWorker、不打开 Chrome tab、不改 DB 状态,弹中文提示,例如:
当前筛选结果中有 3 条缺少新封面,不能执行“只更新封面”。
请先回到②AI生成选择“只生成封面”或“生成标题和封面”。
示例商品ID:25120403046、26887160467、28431952912
商品 ID 最多展示 5 个,避免弹窗过长。
「检查本轮更新」也应按当前更新模式展示缺失汇总,但检查模式可以只报告、不真实执行。
验收要点
- ②AI生成页不再显示「生成封面图片(成本较高)」checkbox,改为「生成内容」下拉。
- ②选择
只生成标题时不调用生图、不要求旧封面/封面提示词。 - ②选择
只生成封面时只补封面;缺新标题的任务不进入本轮,并给中文提示。 - ②选择
生成标题和封面时保持原图文生成闭环,仍支持增量补缺。 - ⑤设置页普通 UI 不再显示「允许更新封面」checkbox。
- ③更新蝦皮左下角新增「更新内容」下拉,按钮布局不拥挤。
- ③选择
只更新标题时允许任务无新封面。 - ③选择
只更新封面时缺新封面必须在开始更新前阻断。 - ③选择
更新标题和封面时缺新标题或新封面都必须阻断。 - 阻断发生在打开 Chrome 商品详情页之前,不写失败状态,不启动真实更新。
- 确认弹窗能按更新模式展示本轮将更新标题/封面/图文。
- 保留敏感和高风险边界:仍需要⑤
allow_real_submit=true和③最终确认弹窗。 - 验证命令:
py -3.10 -m unittest tests.test_guipython -m ruff check app tests main.pypy -3.10 -m compileall app main.pypy -3.10 -m unittest discover -s testsgit diff --check
边界(不改什么)
- 不改 AI/cmhub HTTP 协议、并发、重试、下载保存逻辑。
- 不改 DB schema,继续使用
new_title/new_cover_path判断内容是否就绪。 - 不改 Excel 导入/回写格式。
- 不改 CDP/Shopee 页面操作细节;只在进入真实更新前增加本地前置校验。
- 不增加逐条人工审核流程。
执行记录
- 2026-07-09 完成。
- 文档:同步
docs/04-architecture.md、docs/02-requirements.md、docs/api.md、docs/routes.md、docs/current-state.md,明确②「生成内容」下拉、③「更新内容」下拉、旧布尔字段兼容和开始更新前缺失内容阻断。 - 配置:
app/appconfig.py新增ai.generate_mode/shopee_update.update_mode归一与兼容 helper;旧ai.generate_cover、shopee_update.allow_cover_update继续写回兼容。 - ②AI生成:
app/gui/tabs/generate.py将封面 checkbox 改为「生成内容」下拉;app/ai.py、GenerateWorker支持只生成标题、只生成封面、生成标题和封面,进度和日志按模式统计。 - ③更新蝦皮:
app/gui/tabs/apply.py新增「更新内容」下拉;开始更新/检查前按模式校验缺少的新标题或新封面,阻断时不启动ApplyWorker、不打开 Chrome、不写失败状态;确认弹窗和运行日志展示更新内容。 - ⑤设置:
app/gui/tabs/settings.py从普通设置页移除「允许更新封面」用户入口,仅保留旧字段兼容写回;保存设置时尽量读取磁盘最新更新模式,避免覆盖③下拉选择。 - 更新执行:
app/editor.py、ApplyWorker按update_mode只传递本轮需要改的标题/封面,避免只更新标题时误换封面、只更新封面时误改标题。 - 测试:补充/更新
tests/test_appconfig.py、tests/test_ai.py、tests/test_gui.py,覆盖模式兼容、只生成封面、②/③下拉持久化、③缺失内容阻断和 worker 传参。 - 验证通过:
python -m compileall app main.py;python -m unittest discover -s tests(313 tests);git diff --check。