Files
cmshoppe/docs/tasks/T-607.md
T

132 lines
10 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.
---
id: T-607
title: AI工场图片网格与生成设置布局优化
phase: 7
deps: [T-606]
status: DONE
created: 2026-07-11
---
## 问题 / 背景
T-605 已为 AI工场补了缩略图图标和状态,但「蝦皮原主图」「照片池」仍以 `QTableWidget` 的字段表格呈现。运营用户在九张原图、候选图和生成任务之间需要读列文本,不能快速看图、选图、拖图。
现有“拉取蝦皮主图”只通过 CDP 读取并保存远程 URL;原图尚未下载时 GUI 只能显示占位图。若要做到“拉取后能看到缩小图”,不能为此把九张完整原图都同步保存到本地,也不能在主线程逐张拉取而卡住界面。
另外,当前照片池表会同时列出所有尚未下载的原图,造成原图区和照片池重复;这和“单击原图后下载并加入照片池”的用户理解不一致。
本任务目标:**把原主图和照片池改成稳定、可扫读的缩略图网格;拉图后异步展示真实缩略图;只有已下载可用的原图才进入照片池,同时保留现有选源图、预览、拖入终选、任务续查等行为。**
## 方案
### 1. 统一缩略图卡片网格
修改 `app/gui/tabs/image_studio.py`,必要时在同文件或专属 GUI 辅助模块中新增可复用的缩略图网格组件:
- 原图区和照片池使用同一套图片卡片视觉语言,不再展示“序号/状态/远程地址/本地文件”等表格列。
- 卡片尺寸固定并设置 `gridSize`/最小尺寸,缩略图加载中、失败和空状态都不改变布局。
- 原图区按 `source_order` 展示最多 9 张蝦皮原主图;以紧凑响应式网格排布,1280×820 常用窗口下九张图无需横向遮挡,可自然换为两至三行。
- 照片池使用可滚动网格:已下载原图、已下载生成主图/详情图展示实际缩略图;未完成生成任务展示固定任务卡片。
- 照片池卡片保留必要的视觉信息:原图/主图/详情图角标、比例、当前源图高亮、排队中/已提交/生成中/失败/已停止状态。详细远程地址和本地路径仅放 tooltip,不作为主界面字段。
### 2. 拉图后异步加载真实缩略图
- 保持当前 CDP 流程不变:先由既有 worker 读取蝦皮商品页中的主图 URL,写入项目原图快照。
- 在 URL 已取得后,以后台 worker/受限并发下载缩略图数据用于 GUI 展示;每次只处理有限数量,避免九个请求同时占满网络、阻塞生成或卡住主线程。
- 缩略图仅作为本次 GUI 会话缓存;不得因为预览九张图而把完整原图落入项目目录、不得修改“单击原图才下载原图并加入照片池”的落盘语义。
- 缩略图下载失败时保留固定失败占位和中文 tooltip/重试入口;单张缩略图失败不得让整次 CDP 拉图失败,也不得影响其他原图的点击下载能力。
- 不在日志中暴露完整图片 URL、Cookie 或其他敏感请求信息。
### 3. 收敛照片池业务展示语义
- 原图区单击:沿用既有原图下载和入池流程;下载完成后该原图才出现在照片池,并可被选为生成源图。
- 原图区双击:沿用下载完成后打开大图预览的行为;未下载时先走既有下载 worker。
- 照片池只展示可用本地资产(已下载原图、已生成图片)和与当前项目有关的未完成/失败任务卡片;不再把九张仅有远程 URL 的原图重复列入照片池。
- 照片池单击选源图、双击大图预览、右键移除、拖进主图/详情图终选槽的交互必须保留。右键移除仍只移除 AI工场资产记录,不物理删除本地图片文件。
- 生成完成、继续查询、原图下载完成、项目切换和软删除后的刷新,都必须刷新两类网格及当前源图状态,避免显示旧项目的缩略图。
### 4. 性能与可用性约束
- 图片解码、网络读取、缓存整理全部在后台完成;主线程只接收结果并更新界面。
- 不启动/切换 Chrome 来加载缩略图;不改变 `open_product(..., bring_to_front=False)`、CDP 选择器或登录判断。
- 预览缓存按当前 tab 生命周期或当前项目管理,项目切换/关闭时释放不再引用的 `QPixmap`,避免长时间使用导致内存无界增长。
- 禁止使用嵌套卡片制造视觉层级;原图区/照片池是面板,单张图片才是卡片。
### 5. 收紧生成设置布局
- 去掉源图预览框右侧的说明文字;未选择源图时由预览框空状态和 tooltip 表达,避免右栏出现重复说明。
- 源图预览框右侧第一行放「提示词模板」标签和模板下拉框;第二行把「新建」「重命名」「保存」「删除」四个按钮等宽并排。
- 释放出的垂直空间分配给完整提示词输入框;提示词说明保留在输入框下方。
- 「类型」「数量」「比例」改为提示词输入框下方的同一行紧凑控件组,保留现有下拉/数字输入语义和生成按钮动态文案。
## 验收要点
- 拉取有效商品后,原图区按原图顺序展示最多 9 张真实缩略图;缩略图加载不冻结 GUI。
- 原图区九张图在 1280×820 下不会横向互相遮挡或挤出区域;较窄窗口可稳定换行或滚动。
- 单张缩略图下载失败只显示该卡片的中文失败状态,不让整次拉图失败,也不显示裸露英文技术错误。
- 原图区单击后,原图下载并进入照片池;未下载的原图不会与原图区重复显示在照片池。
- 照片池以同一套缩略图卡片展示已下载原图、已生成图片和任务状态;源图、类型、比例、失败/生成中状态可一眼区分。
- 照片池的选源图、双击预览、右键移除、拖入终选、终选排序、生成、停止、继续查询和导出均不回归。
- 项目切换、删除后切换到其他项目、后台任务完成后,不显示旧项目缩略图或错误的源图高亮。
- 不改 CDP 拉图/Chrome/登录流程,不因缩略图预览批量保存九张完整原图,不暴露远程 URL 或敏感信息到用户日志。
- 生成设置区不再出现源图右侧说明文字;模板选择与四个模板操作按钮按两行排列,提示词输入框面积增大,类型/数量/比例在同一行。
## 测试要求
更新或新增:
- `tests/test_gui.py`
- 覆盖原图区和照片池使用缩略图网格、固定卡片尺寸、中文空状态/失败状态。
- 覆盖九张原图按 `source_order` 进入原图区,未下载原图不进入照片池。
- 覆盖下载完成后原图进入照片池、可选源图,并保留既有拖入终选和预览行为。
- 覆盖项目切换/删除后的缩略图和源图状态清理。
- `tests/test_image_studio_images.py` 或对应现有图片测试
- mock 远程图片响应,覆盖缩略图异步加载成功、单张失败隔离、缓存不落盘完整原图。
验证命令:
```bash
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
```
人工验收建议:
- 在登录账号下拉取一个有 9 张主图的商品,确认九张真实缩略图可见、Chrome 不抢前台、单击一张后才进入照片池。
- 生成主图和详情图各一张,确认照片池卡片能区分原图/主图/详情图和源图状态,并能拖入终选后导出。
## 边界(不改什么)
- 不改 `image_studio_projects`、assets、jobs、selections 的 DB schema。
- 不改变原图完整文件的落盘目录、导出目录和图片格式转换规则。
- 不改 `app/editor.py`、CDP 选择器、商品页打开/关闭、Chrome 启动或登录检测逻辑。
- 不改 cmhub 提交、轮询、下载、计费、重试或 BYOK 逻辑。
- 不新增本地图片导入、图片编辑算法或自动上传蝦皮。
- 不改①至⑤模块。
## 执行记录
- 2026-07-11:已完成。
- 代码:
- `app/gui/tabs/image_studio.py`:原图区和照片池由字段表格改为固定尺寸的 `QListWidget` 图片网格。原图区按 `source_order` 展示主图;照片池只展示已落盘可用的原图/生成图和未完成或失败任务卡片,不再重复显示只有远程 URL 的原图。
- `app/gui/tabs/image_studio.py`:接入既有 `image_studio_images.ThumbnailLoader`。远程缩略图使用受限后台线程池和内存缓存,结果通过 Qt signal 回到 GUI 线程;不保存完整原图、不在日志中输出远程 URL。单张失败只显示中文卡片状态,并可右键「重新加载缩略图」。
- `app/gui/tabs/image_studio.py`:项目切换、软删除和窗口关闭会取消不再需要的缩略图回调并释放 GUI 缓存;原图区点击下载、照片池选源图/预览/右键移除/拖入终选、任务续查均保留。
- `app/gui/tabs/image_studio.py`:生成设置去掉源图右侧说明文字;模板标签与下拉在源图右侧第一行,四个模板操作按钮同列第二行;提示词输入框扩展,类型/数量/比例调整为其下方同一行。
- 测试:
- `tests/test_gui.py`:更新 AI工场构建测试,覆盖网格替换、缩略图仅内存预览、原图落盘后才进入照片池、单张缩略图失败重试、9 张原图顺序、固定网格尺寸、模板按钮同排和三项生成参数同排。
- `tests/test_gui.py`:更新已提交 cmhub 任务卡片断言,确认照片池保留可继续查询的任务状态和扣点信息。
- `tests/test_image_studio_images.py`:既有缩略图下载、内存缓存、取消和不落盘原图测试继续通过。
- 验证:
- 主工作区定向验证通过:
- `py -3.10 -m unittest tests.test_gui.GuiTests.test_image_studio_tab_builds_project_pool_and_template_controls tests.test_gui.GuiTests.test_image_studio_thumbnail_grids_keep_order_and_hide_remote_pool_duplicates tests.test_gui.GuiTests.test_image_studio_tab_shows_resume_and_job_billing_status tests.test_gui.GuiTests.test_image_studio_final_selection_order_and_guards tests.test_image_studio_images`
- `python -m ruff check app tests main.py`
- `py -3.10 -m compileall app main.py`
- `git diff --check -- app/gui/tabs/image_studio.py tests/test_gui.py docs/tasks/T-607.md`
- 主工作区存在未提交默认提示词文件改动;为隔离无关改动,在临时干净 worktree `D:\chengma\cmshopee-t607-verify` 应用本任务 diff 后通过:
- `python -m ruff check app tests main.py`
- `py -3.10 -m compileall app main.py`
- `py -3.10 -m unittest discover -s tests`(381 tests)
- `git diff --check`