feat(product-suite): compact controls and remember settings

This commit is contained in:
chengma
2026-07-14 15:16:09 +08:00
parent 17bb7521fd
commit 21d2dd5253
10 changed files with 431 additions and 47 deletions
+10
View File
@@ -135,6 +135,14 @@ T-538 后统一数据根为 `data/`:打包版默认 `<exe目录>/data`,源
"max_items_per_run": 1,
"dry_run": false,
"max_parallel_accounts": 1
},
"product_suite": {
"last_settings": {
"platform": "Shopee",
"country": "中国台湾",
"language": "繁体中文",
"ratio": "1:1"
}
}
}
```
@@ -161,6 +169,8 @@ T-538 后统一数据根为 `data/`:打包版默认 `<exe目录>/data`,源
该段不是替代 ③ 确认弹窗的常驻授权;③「开始更新」仍必须弹窗确认,用户点是后才执行。`dry_run=true` 时不会真实提交;`dry_run=false` 时以③确认弹窗作为线上提交前的唯一显式确认边界。普通正式更新不读取 `test_item_id` 做阻断。旧配置中的真实提交、封面更新、成功关页等开关只作迁移兼容读取,保存后不再写回。
`product_suite.last_settings` 只保存⑥「商品套图」最近一次选择的平台、站点、语言和比例,作为软件重启后第一个未绑定商品任务的默认值。已有账号+商品 ID 项目仍以 SQLite `image_studio_projects.suite_settings_json` 为准;同一次运行中新任务优先继承当前任务;绑定已有项目后再由项目设置覆盖最近默认。旧配置缺少该段或值不在当前选项集合时,分别回退到 `Shopee / 中国台湾 / 繁体中文 / 1:1`。该段不保存账号、商品 ID、提示词、图片路径或密钥。
### 5.1b AI 模型清单 `data/config/ai_models.json`
模型定义清单("有哪些模型"),与 `config.json` 的 `ai` 段("选了哪个 + 全局参数")职责分开。该文件只用于内部兼容 `backend=direct`;普通用户默认 `backend=cmhub`,生文/生图使用 cmhub 别名,不读取此文件。
+2 -1
View File
@@ -32,6 +32,7 @@ cdp_ready_timeout(config=None) -> int
ai_config(config=None) -> dict # default_text_model/default_image_model/generate_mode/generate_cover/
# title_concurrency/image_concurrency/retry/jpg_quality/
# resolution/resolution_timeouts
product_suite_last_settings(config=None) -> dict # 最近的平台/站点/语言/比例;非法值回退默认
ai_backend(config=None) -> str # 默认 cmhub;direct 仅内部兼容/手工回滚
cmhub_config(config=None) -> dict # base_url/title_alias/image_alias/connect_timeout/download_with_curl
normalize_cmhub_base_url(base_url) -> str # 规整为 cmhub 网关根:scheme+host(+port)
@@ -39,7 +40,7 @@ cmhub_request_url(base_url, endpoint) -> str # 先规整 base_url,再拼 /ap
response_timeout(config=None) -> int # = resolution_timeouts[resolution](返回超时,随分辨率)
```
`default_config()` / `load_config()` 包含 `shopee_update` 执行配置段:历史/调试兼容测试商品 ID、更新内容模式 `update_mode`、每批最大更新条数、内部兼容 `dry_run`、同时更新蝦皮账号数 `max_parallel_accounts`。普通正式更新不再用测试商品 ID 或旧真实提交开关阻断当前筛选结果;封面是否参与本轮更新由③「更新内容」下拉决定;线上提交前的显式确认边界是③「开始更新」确认弹窗。`config.json` 不保存 AI Key;写入 `api_key` / `*_key` / `token` / `*_token` / `password` / `*_password` 等敏感字段时抛 `ConfigError`。普通产品默认 cmhub,AI Key 存 `data/config/cmhub.json`;`data/config/ai_models.json` 仅为 direct 内部兼容路径。T-538 后,配置中默认仍保存 `chrome_user_data_dir`、`images`、`cmshopee.db` 等相对值,运行时解析到 `data/` 下,保持免安装目录可移动。
`default_config()` / `load_config()` 包含 `shopee_update` 执行配置段:历史/调试兼容测试商品 ID、更新内容模式 `update_mode`、每批最大更新条数、内部兼容 `dry_run`、同时更新蝦皮账号数 `max_parallel_accounts`。普通正式更新不再用测试商品 ID 或旧真实提交开关阻断当前筛选结果;封面是否参与本轮更新由③「更新内容」下拉决定;线上提交前的显式确认边界是③「开始更新」确认弹窗。`product_suite.last_settings` 只保存⑥最近选择的平台/站点/语言/比例,供未绑定商品的新任务初始化;已有项目自己的 `suite_settings_json` 优先。`config.json` 不保存 AI Key;写入 `api_key` / `*_key` / `token` / `*_token` / `password` / `*_password` 等敏感字段时抛 `ConfigError`。普通产品默认 cmhub,AI Key 存 `data/config/cmhub.json`;`data/config/ai_models.json` 仅为 direct 内部兼容路径。T-538 后,配置中默认仍保存 `chrome_user_data_dir`、`images`、`cmshopee.db` 等相对值,运行时解析到 `data/` 下,保持免安装目录可移动。
敏感信息展示/日志辅助:
+5 -4
View File
@@ -184,10 +184,10 @@
```
┌ 套图任务1 │ 套图任务2 │ + ───────────────────────────────────┐
│ 账号[▼] 商品ID[____________] [拉取蝦皮主图] │
│ [历史生成][打开结果文件夹][添加图片] 账号[▼] 商品ID[____][拉取主图] │
├ 左侧配置(滚动)────────────┬ 右侧生成结果 ─────────────────────┤
│ 商品原图:主图/参考1..5/添加 │ 共N张·成功M张 [历史生成][打开文件夹] │
│ 平台/国家/语言/比例 │ [结果卡][结果卡][失败卡·重试] │
│ 商品原图:主图/参考1..5/添加 │ 共N张·成功M张 │
│ 平台 站点 语言 比例(同行) │ [结果卡][结果卡][失败卡·重试] │
│ 每张上传图分别作为主图生成 │ │
│ 商品卖点与要求 [AI帮写/取消] │ │
│ 白底图/场景图/卖点图/自定义类 │ 进度条 套图X/Y(秒)·失败N │
@@ -196,11 +196,12 @@
```
- 每个顶部任务标签持有独立账号、商品ID、设置、原图、当前 job 集合和 worker;任务可并行生成。切换任务不停止后台操作;关闭运行中任务先确认并协作式取消,线程引用保留到真正结束,避免 `QThread: Destroyed while thread is still running`。
- 二级套图任务标签使用独立紧凑样式,不继承主模块 Tab 的大尺寸点击区。上下文栏左侧集中「历史生成 / 打开结果文件夹 / 添加图片」,右侧集中账号、商品 ID 和拉取入口;常见 11~13 位商品 ID 不得裁切,长账号可通过 tooltip 查看完整名称。
- 项目仍以 `账号别名 + 商品ID` 唯一,复用 `image_studio_projects/assets/jobs`。`suite_settings_json` 保存平台、国家地区、语言、比例、逐图主图模式和分类数量;卖点文本继续使用 `draft_prompt`。
- 商品原图最多16张。前6个槽位固定显示主图与参考1~5;支持文件选择、外部拖入、剪贴板粘贴和列表内排序。历史失效远程图不占有效名额;第1张是主参考图。
- 「拉取蝦皮主图」复用只读 CDP,读取 URL 后由最多2个下载 worker 后台落盘;不改标题/封面、不拖拽、不点击更新。拉取、下载期间其余界面和其他任务仍可操作。
- 套图只有一个图片类型,不再展示详情图、终选盘或模板 CRUD。默认分类为白底图1、场景图2、卖点图2;自定义分类名称非空、无空格、最多10字且不可重名。逐图主图开启后,白底图只生成一次,其余分类按每张有效原图展开。
- 平台、国家地区、语言和比例都写进每个 job 的完整提示词;比例还透传到 cmhub 生图请求,不是装饰字段。生成仍走 `image_studio_generation.run_jobs()` 的 submit → poll → download 管线。
- 平台、国家地区、语言和比例以四个带独立标签的同行下拉展示,选项只显示真实值;四项都写进每个 job 的完整提示词,比例还透传到 cmhub 生图请求,不是装饰字段。已有项目保存自己的完整设置;未绑定商品的新任务在重启后采用 `config.json` 的最近四项选择。生成仍走 `image_studio_generation.run_jobs()` 的 submit → poll → download 管线。
- 生成按钮按当前总数显示并在运行时切换为停止。结果区显示本轮或历史 job;成功图可预览、复制路径、打开目录、重新生成、移入项目废纸篓并撤销,失败卡显示脱敏中文摘要与重试入口。
- AI帮写和生图按任务独立运行。AI帮写期间若用户改过卖点,返回后必须确认才覆盖;全部用户可见错误隐藏 URL/接口路径和敏感信息。
- ⑥只管理本地图片资产,不自动上传或修改蝦皮;③线上更新边界不受影响。旧 `ImageStudioTab` 留作代码兼容但不再作为主窗口入口。
+11 -1
View File
@@ -3,7 +3,7 @@ id: T-627
title: 压缩商品套图顶部空间并重排上下文操作栏
phase: 7
deps: [T-622]
status: TODO
status: DONE
created: 2026-07-14
---
@@ -92,3 +92,13 @@ created: 2026-07-14
- 不修改拉取蝦皮主图的 CDP 流程、选择器或 Chrome 前台切换策略。
- 不修改①~⑤模块 UI,不修改主窗口全局标签样式。
- 不新增平台、站点、语言或比例选项,不改变现有配置值的含义。
## 执行记录
- 2026-07-14 完成。
- ⑥二级任务标签改为 36px 独立紧凑样式,不再继承主模块 Tab 的大间距;顶部操作栏左侧集中「历史生成 / 打开结果文件夹 / 添加图片」,右侧集中账号、商品 ID 和拉取主图,账号下拉限制为 120~160px 并提供完整 tooltip,商品 ID 按 13 位数字字体度量控制在 120~140px。
- 生成设置改为四列同行等宽布局,保留「平台 / 站点 / 语言 / 比例」独立标签;下拉项只显示真实值,`itemData/currentData` 和生成提示词语义不变。
- `app/product_suite.py` 统一维护四类允许选项并归一化最近设置;`data/config.json` 新增 `product_suite.last_settings`。软件重启后的未绑定新任务读取最近四项选择,同会话新任务优先继承当前任务,绑定已有项目后再由 `suite_settings_json` 覆盖。配置更新后原位刷新共享 config,避免⑤后续保存丢失该段。
- 同步 `docs/04-architecture.md`、`docs/api.md` 与 `docs/routes.md`;新增纯逻辑、appconfig 和 GUI 测试,覆盖非法值回退、其他配置保留、四列顺序/等宽、工具栏位置、跨重启恢复及已有项目优先级。
- 1180×760 离屏截图检查通过,四个下拉框宽度均为 98px,顶部操作顺序为历史生成、打开结果文件夹、添加图片、账号、商品 ID、拉取主图,无重叠。
- 当前工作区全量测试只有任务开始前已存在的默认封面提示词改名导致 3 个旧 `papa1` 断言失败;在只包含 T-627 暂存内容的干净验证工作树中运行 `py -3.10 -m unittest discover -s tests`,473 项全部通过。`python -m ruff check app tests main.py`、`py -3.10 -m compileall app main.py`、`git diff --check` 全部通过。