Skip to content

fix: 历史聚合不再折掉成功记录 + 放大预览控制面板重排 - #66

Merged
zlZayn merged 2 commits into
mainfrom
fix/history-dedupe-and-preview-dock
Oct 29, 2026
Merged

zlZayn merged 2 commits into
mainfrom
fix/history-dedupe-and-preview-dock

Conversation

@zlZayn

@zlZayn zlZayn commented Oct 29, 2026

Copy link
Copy Markdown
Collaborator

背景

两个用户实测反馈:

  1. 同一张提示词卡片、同一提示词、同一参考图连跑两次 —— 画布上确实出现两张图,但生成历史里只有一条。历史应该也有两条,这是两次不同的生图。
  2. 双击放大图片后的操作面板不好用 —— 主要是排版奇怪、混乱。

1. 历史聚合把成功记录也折掉了(core/history.py)

根因:聚合键 (mode, prompt, size, quality, refs, inputAssetIds)(时间不算参数)本来是为「同一卡片失败多次刷屏」设计的,实现却对所有状态一视同仁地「只留最新一条」。但成功不是重复,是产出:同参数再跑一次就是另一张图。

连带后果:被折掉那张的 output / outputAssetIds 不在列表里,连「导入画布」的白名单都进不去。

修法——聚合只压失败:

情况 结果
同参数 N 次成功 N 行全留
同参数多次失败、无成功 只留最新一条(原意图不变)
先成功后失败 失败行保留(最新一次没成),更早的成功仍各占一行
先失败后成功 失败被成功取代(原意图不变)
任一参数不一致 不合并(原意图不变)

本机 591 行账本实测:可见 411 → 429 行;提示词 The clothing should be of high quality… 的两张成功图现在都在。

2. 放大预览控制层重排(WorkflowModals.tsx 的 ZoomModal)

旧版把文件名、缩放、复制、四段 10px 灰字说明全塞进底部同一个居中列 —— 四行等权堆成灰方块,没有主次,也分不清哪行是状态、哪行是按钮;+/- 是带 1.5px padding 的裸字符,命中区极小;复制反馈挤在同一行,一出现就挤压同行按钮。

改成「身份在上、操作在下」:

  • 顶部一条:左侧文件名(超长省略、悬停给完整路径)+ 右侧圆形关闭按钮(原来只能靠 Esc / 点空白);
  • 底部单行控制坞三组、组间细分隔线:缩小 · 读数 · 放大 → 适应窗口 / 实际大小 → 复制图片 / 复制路径 / 新标签打开;加减号换成 12px SVG 图标;
  • 按钮样式收敛成 DOCK_BUTTON / DOCK_ICON_BUTTON 两个常量、统一 h-7 + inline-flex(旧版 6 个按钮三种写法,且图标按钮比文字按钮高一圈,一行里两种基线);
  • 长操作说明不再常驻,退到控制坞的 title;复制反馈改成控制坞上方的绝对定位浮标,不进布局(否则反馈一变宽窄就会让鼠标底下的按钮挪位置)。

实拍(1500×900,适应窗口 / 放大到 120%):

  • 顶部:文件名胶囊 + 右上关闭
  • 底部:− 120% + | 适应窗口 实际大小 | 复制图片 复制路径 新标签打开

验证

  • 后端 pytest:475 passed(新增 2 例:成功不去重、成功后的失败照实显示)
  • 前端 vitest:1061 passed(新增 4 例:顶部关闭按钮、单行三组结构、说明不常驻、反馈浮标 absolute)
  • tsc --noEmit 零错、eslint / ruff 零告警、npm run build 成功
  • E2E verify_canvas.py:105/105 PASS(服务已起,含「双击打开预览 / 点空白关闭 / 放大态点边缘关闭」)
  • python scripts/check_docs.py 全绿(链接 533 处 + 后端 475 / 前端 1061 计数与文档一致)
  • Playwright 实拍核对新控制坞两档观感

文档

  • docs/ARCHITECTURE.md:7.1 /api/history 契约口径、8.3 预览弹窗控制层分工、9.9 新增第 2 条(聚合把成功折掉的坑与判据)
  • core/README.md(history.py 节)、frontend/README.md(WorkflowModals 条目)、tests/README.md(用例表 + 计数)、AGENTS.md(仪表盘)

同一张提示词卡片、同一提示词、同一参考图连跑两次,画布上确实出现两张图,生成历史里却只有一条:被折掉那张连「导入画布」的白名单都进不去(历史与产出对不上)。

根因:聚合键 (mode/prompt/size/quality/refs/inputAssetIds,时间不算参数) 是为「同一卡片失败多次刷屏」设计的,实现却对所有状态一视同仁地只留最新一条 —— 但成功不是重复,是产出:同参数再跑一次就是另一张图。

改为聚合只压失败:
- status == ok 的行永远全留;
- 同组失败行最多留最新一条,且仅当它比该组最新成功更晚(否则已被成功取代);
- 任一参数不一致照旧不合并。

本机账本实测:可见 411 → 429 行,提示词 The clothing should be of high quality 的两张成功图都出现了。

文档:ARCHITECTURE 7.1 /api/history 契约 + 新增 9.9 第 2 条防错条、HistoryGallery 聚合说明、core/README 的 history.py 节、tests/README 用例表;测试数 473 → 475。
用户反馈:双击放大图片后的操作面板「UI 排版奇怪、也很混乱」。旧版把文件名、缩放、复制、四段 10px 灰字说明全部塞进底部同一个居中列,四行等权堆成一个灰方块:没有主次,也分不清哪行是状态、哪行是按钮;+/- 是 1.5px padding 的裸字符,命中区极小;复制反馈挤在同一行右侧,一出现就挤压同行按钮。

改成「身份在上、操作在下」:
- 顶部一条:左侧文件名(超长省略,悬停给完整路径)+ 右侧圆形关闭按钮(不必只靠 Esc / 点空白);
- 底部**单行控制坞**三组,组间细分隔线:缩放组(缩小 · 读数 · 放大,加减号换成 12px SVG 图标)→ 视图组(适应窗口 / 实际大小)→ 动作组(复制图片 / 复制路径 / 新标签打开);
- 按钮样式收敛成 DOCK_BUTTON / DOCK_ICON_BUTTON 两个常量,统一 h-7 + inline-flex —— 旧版 6 个按钮三种写法,且图标按钮比文字按钮高一圈,一行里两种基线;
- 长操作说明不再常驻,退到坞的 title;复制反馈改做坞上方的绝对定位浮标,不进布局(否则反馈一变宽窄就让鼠标底下的按钮挪位置)。

测试:WorkflowModals.test.tsx 新增 4 例(顶部关闭按钮、单行三组结构、说明不常驻、反馈浮标是 absolute)+ 更新用例表;surfaceAudit 的 TSX 豁免沿用同一批 bg-white/10、bg-black/40(中性压图,不跟随主体色)。
验证:vitest 1057 → 1061 全过、tsc 零错、eslint 零告警、npm run build 成功、E2E verify_canvas 105/105 PASS,并用 Playwright 实拍核对两个缩放档。文档同步 ARCHITECTURE 8.3、frontend/README 组件条目。
@zlZayn zlZayn added bug Something isn't working enhancement New feature or request labels Oct 29, 2026
@zlZayn zlZayn self-assigned this Oct 29, 2026
@zlZayn
zlZayn merged commit 2fe61c8 into main Oct 29, 2026
4 checks passed
@zlZayn
zlZayn deleted the fix/history-dedupe-and-preview-dock branch October 29, 2026 16:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant