From f28d197c58031b6c81e2ad27c36fd568a772f4f1 Mon Sep 17 00:00:00 2001 From: chengma Date: Sat, 11 Jul 2026 16:11:14 +0800 Subject: [PATCH] docs(ai-studio): add project and thumbnail grid tasks --- docs/tasks/T-606.md | 102 +++++++++++++++++++++++++++++++++++++++++++ docs/tasks/T-607.md | 103 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 205 insertions(+) create mode 100644 docs/tasks/T-606.md create mode 100644 docs/tasks/T-607.md diff --git a/docs/tasks/T-606.md b/docs/tasks/T-606.md new file mode 100644 index 0000000..c0737c5 --- /dev/null +++ b/docs/tasks/T-606.md @@ -0,0 +1,102 @@ +--- +id: T-606 +title: AI工场项目入口、商品列表与安全删除优化 +phase: 7 +deps: [T-605] +status: TODO +created: 2026-07-11 +--- + +## 问题 / 背景 + +⑥AI工场顶部同时存在「打开商品项目」和「拉取蝦皮主图」。对运营用户而言,前者抽象、后者才是实际开始处理商品的动作;现有「商品项目」列表还暴露了重复的「项目」字段。 + +此外,数据层已具备 `soft_delete_project()`,但 GUI 没有删除入口。若直接补一个删除按钮而不说明边界,用户可能误以为会删除蝦皮线上商品或本地图片;若项目仍有 cmhub 已提交/生成中的远端任务,直接隐藏项目还会造成任务仍可能继续扣点、但用户无法在列表中继续查询的风险。 + +本任务目标:**收敛 AI工场项目入口为“选择店铺和商品ID后拉取主图”,把左侧改成易扫读的商品列表,并提供不影响蝦皮商品、本地图片和远端未完成任务的安全项目删除。** + +## 方案 + +### 1. 顶部操作条收敛项目入口 + +修改 `app/gui/tabs/image_studio.py`: + +- 去掉可见的「打开商品项目」按钮及其相关界面文案;不再把“创建/打开项目”作为独立用户步骤。 +- 顶部继续保留账号/店铺选择和商品ID输入。点击「拉取蝦皮主图」时沿用当前已验证行为:按当前输入的账号和商品ID创建或恢复 AI工场项目,再读取蝦皮主图。 +- 当前项目标题显示为「店铺名 · 商品ID」:优先展示账号管理中的店铺名,缺失时回退账号别名;账号别名可放 tooltip,不占主要视觉空间。 +- 将「拉取蝦皮主图」移动到当前项目标题右侧;「打开项目文件夹」「删除项目」作为右侧连续操作组。 +- 未选择项目时,中文空状态改为“选择店铺并输入商品ID后,点击「拉取蝦皮主图」开始”,不得再提示“打开商品项目”。 +- 删除旧入口后,运行期间禁用/恢复逻辑同步移除对 `open_project_button` 的依赖;项目列表切换、拉图、文件夹、生成、继续查询、导出等现有能力不回归。 + +### 2. 商品列表去除技术化重复字段 + +- 左侧区域标题由「商品项目」改为「商品列表」。 +- 列表去掉「项目」列,改为店铺名、商品ID、更新时间三列;每行仍以 `project.id` 作为内部选择数据,不把内部 ID 展示给用户。 +- 选择行后,继续同步顶部账号、商品ID、当前项目标题、提示词草稿、图片资产和终选数据。 +- 调整列宽和行高,确保 1280×820 及较窄窗口下标题不遮挡、商品ID完整可见。 + +### 3. 安全软删除当前选定项目 + +- 新增红色语义的「删除项目」按钮;无当前选定项目、后台 worker 运行时按钮禁用。 +- 点击后显示中文确认框,明确项目名称和边界: + + ```text + 确定从AI工场商品列表删除“店铺名 · 商品ID”吗? + 不会删除蝦皮商品,也不会删除本地图片。再次拉取同一商品会恢复原项目记录。 + ``` + +- 用户确认后复用 `app.image_studio.soft_delete_project()`;只写 `deleted_at/deleted_reason`,不物理删除图片目录、不删 assets/jobs/selections、不动蝦皮数据。 +- 删除前查询该项目是否存在 `pending`、`submitted`、`running` 的图片任务。存在时禁止删除并给中文提示:先等待任务完成、停止本轮或继续查询,不允许把仍可能在远端执行/扣点的任务静默隐藏。 +- 删除当前项目后显式清空 `current_project`、图片资产、源图和终选 UI;若列表还有其他项目,选择排序后的第一条;若没有则显示未选择商品空状态,并禁用打开文件夹/删除项目。不得依赖 `refresh_projects()` 对已软删除项目的隐式选择,避免残留过期项目引用。 +- 重新拉取同一账号和商品ID时,保留既有 `create_or_get_project()` 恢复语义:恢复同一项目及其历史资产/终选,而不是新建重复记录。 + +### 4. 用户可见文案与测试 + +- 所有新增/改动 UI 文案使用中文和「蝦皮」。 +- 删除失败、读取项目失败等底层错误继续走现有诊断脱敏,外围附带中文操作语境。 +- 更新 GUI 单元测试和 `app/image_studio.py` 纯逻辑测试,覆盖顶部入口、三列商品列表、删除确认、软删除、恢复以及未完成远端任务拦截。 + +## 验收要点 + +- ⑥AI工场不再显示「打开商品项目」按钮;选择店铺、输入商品ID并点击「拉取蝦皮主图」可创建/恢复并打开正确项目。 +- 「拉取蝦皮主图」位于当前「店铺名 · 商品ID」标题右侧;文件夹和删除项目按钮位于右侧操作组。 +- 左侧标题为「商品列表」,列表不再显示「项目」列,仍可正确切换不同店铺/商品的项目。 +- 点击「删除项目」后,确认框清楚说明不会删除蝦皮商品和本地图片,并说明同一商品再次拉取会恢复原项目。 +- 取消确认不改变列表和当前项目;确认删除后,项目从默认列表消失,当前 UI 不残留已删除项目的数据。 +- 存在 `pending/submitted/running` 远端任务时,删除被阻止,项目仍可继续查询;不静默丢失可能扣点的任务。 +- 删除项目不改 DB schema、不物理删除目录;重新拉取同一账号/商品ID恢复原项目历史。 +- 拉图、原图下载、生成、停止、继续查询、终选拖拽和导出不回归;不改 CDP 选择器、Chrome 启动/登录规则或 cmhub 请求协议。 + +## 测试要求 + +更新或新增: + +- `tests/test_gui.py` + - 覆盖不出现「打开商品项目」、顶部操作条顺序和「商品列表」/三列标题。 + - 覆盖拉取入口使用当前账号和商品ID。 + - 覆盖删除取消、确认后的当前项目清理/切换、无项目时按钮状态。 + - 覆盖存在未完成任务时不调用软删除并显示中文阻断提示。 +- `tests/test_image_studio.py` + - 覆盖软删除不删除项目关联历史,默认列表隐藏,`create_or_get_project()` 可恢复同一项目。 + +验证命令: + +```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 +``` + +## 边界(不改什么) + +- 不新增永久删除、回收站页面或本地图片清理功能。 +- 不改 `image_studio_projects` schema、图片目录布局及既有软删除恢复语义。 +- 不取消远端 cmhub 任务;本任务只在本地删除前阻止存在未完成任务的项目。 +- 不改 `app/editor.py`、CDP 读取蝦皮主图、商品详情页打开/关闭逻辑。 +- 不改 cmhub 提交、轮询、下载、计费或 BYOK 逻辑。 +- 不改①至⑤模块,不新增本地图片导入入口。 + +## 执行记录 + +- 待执行。 diff --git a/docs/tasks/T-607.md b/docs/tasks/T-607.md new file mode 100644 index 0000000..954503e --- /dev/null +++ b/docs/tasks/T-607.md @@ -0,0 +1,103 @@ +--- +id: T-607 +title: AI工场原主图与照片池缩略图网格优化 +phase: 7 +deps: [T-606] +status: TODO +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`,避免长时间使用导致内存无界增长。 +- 禁止使用嵌套卡片制造视觉层级;原图区/照片池是面板,单张图片才是卡片。 + +## 验收要点 + +- 拉取有效商品后,原图区按原图顺序展示最多 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 逻辑。 +- 不新增本地图片导入、图片编辑算法或自动上传蝦皮。 +- 不改①至⑤模块。 + +## 执行记录 + +- 待执行。