160 lines
8.2 KiB
Markdown
160 lines
8.2 KiB
Markdown
---
|
||
id: T-576
|
||
title: ②③生成/更新内容模式下拉与缺失内容阻断
|
||
phase: 7
|
||
deps: [T-575]
|
||
status: DONE
|
||
created: 2026-07-09
|
||
---
|
||
|
||
## 问题 / 背景
|
||
|
||
当前②AI生成模块用「生成封面图片(成本较高)」checkbox 控制是否生成封面:
|
||
|
||
- 关闭:只生成标题。
|
||
- 开启:生成标题和封面。
|
||
|
||
这个设计能控制生图成本,但正式使用时不够精确:
|
||
|
||
- 用户无法只补生成封面;例如已生成标题后,想单独补封面,需要依赖当前增量逻辑和 checkbox 语义,不够直观。
|
||
- 「图片」文案不够准确,本模块实际处理的是商品封面,不是商品全部图片。
|
||
- ③更新蝦皮目前依赖⑤设置里的「允许更新封面」checkbox。这个开关离真实更新动作太远,用户在③点击开始更新时不一定清楚本轮到底更新标题、封面还是图文。
|
||
- 如果②只生成了标题,③却想更新封面,当前需要更明确地在开始前阻断并提示缺少新封面,避免进入 Chrome/CDP 后才失败。
|
||
|
||
## 产品结论
|
||
|
||
需求合理,建议做,但需要统一成“内容模式”而不是布尔开关。
|
||
|
||
②AI生成模块下拉:
|
||
|
||
- `只生成标题`
|
||
- `只生成封面`
|
||
- `生成标题和封面`
|
||
|
||
③更新蝦皮模块下拉:
|
||
|
||
- `只更新标题`
|
||
- `只更新封面`
|
||
- `更新标题和封面`
|
||
|
||
文案统一使用「封面」,不用「图片」,避免用户误解为商品详情图或所有商品图片。
|
||
|
||
## 方案
|
||
|
||
### 1. ②AI生成模式
|
||
|
||
- `app/appconfig.py`
|
||
- 增加兼容字段 `ai.generate_mode`,取值:
|
||
- `title`
|
||
- `cover`
|
||
- `title_cover`
|
||
- 兼容旧字段 `ai.generate_cover`:
|
||
- `false` → `generate_mode=title`
|
||
- `true` → `generate_mode=title_cover`
|
||
- 保存设置时可继续写回 `generate_cover` 兼容值,但 GUI 主逻辑以 `generate_mode` 为准。
|
||
|
||
- `app/ai.py`
|
||
- `is_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`,取值:
|
||
- `title`
|
||
- `cover`
|
||
- `title_cover`
|
||
- 兼容旧字段 `shopee_update.allow_cover_update`:
|
||
- `false` → `update_mode=title`
|
||
- `true` → 默认 `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 状态,弹中文提示,例如:
|
||
|
||
```text
|
||
当前筛选结果中有 3 条缺少新封面,不能执行“只更新封面”。
|
||
请先回到②AI生成选择“只生成封面”或“生成标题和封面”。
|
||
示例商品ID:25120403046、26887160467、28431952912
|
||
```
|
||
|
||
商品 ID 最多展示 5 个,避免弹窗过长。
|
||
|
||
「检查本轮更新」也应按当前更新模式展示缺失汇总,但检查模式可以只报告、不真实执行。
|
||
|
||
## 验收要点
|
||
|
||
- ②AI生成页不再显示「生成封面图片(成本较高)」checkbox,改为「生成内容」下拉。
|
||
- ②选择 `只生成标题` 时不调用生图、不要求旧封面/封面提示词。
|
||
- ②选择 `只生成封面` 时只补封面;缺新标题的任务不进入本轮,并给中文提示。
|
||
- ②选择 `生成标题和封面` 时保持原图文生成闭环,仍支持增量补缺。
|
||
- ⑤设置页普通 UI 不再显示「允许更新封面」checkbox。
|
||
- ③更新蝦皮左下角新增「更新内容」下拉,按钮布局不拥挤。
|
||
- ③选择 `只更新标题` 时允许任务无新封面。
|
||
- ③选择 `只更新封面` 时缺新封面必须在开始更新前阻断。
|
||
- ③选择 `更新标题和封面` 时缺新标题或新封面都必须阻断。
|
||
- 阻断发生在打开 Chrome 商品详情页之前,不写失败状态,不启动真实更新。
|
||
- 确认弹窗能按更新模式展示本轮将更新标题/封面/图文。
|
||
- 保留敏感和高风险边界:仍需要⑤ `allow_real_submit=true` 和③最终确认弹窗。
|
||
- 验证命令:
|
||
- `py -3.10 -m unittest tests.test_gui`
|
||
- `python -m ruff check app tests main.py`
|
||
- `py -3.10 -m compileall app main.py`
|
||
- `py -3.10 -m unittest discover -s tests`
|
||
- `git 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`。
|