Files
TrueGrowth/docs/PPT_IMAGE_HISTORY_LESSONS.md

90 lines
2.9 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.
# PPT 生图历史交互经验总结
更新日期2026-04-26
## 背景
PPT 页面现在主要由整页图片构成Frame 负责承载、预览、重生成和切换历史图片。
这类交互的关键不是“能记录历史”,而是让用户明确知道:
- 哪张图是当前正在展示的 PPT 页面
- 每张历史图是什么时间生成的
- hover 时能快速判断大图效果
## 这次暴露的问题
### 1. 历史时间不应使用菜单展示时间
历史列表里的时间如果使用“写入历史记录的时间”或“切换历史图的时间”,会误导用户。
正确语义应该是:
- 图片什么时候由 AI 生成,就展示什么时候
- 用户之后切换历史图,不应该刷新这张图的生成时间
一句话:
**生图历史的时间属于图片产物,不属于当前选择动作。**
### 2. 当前图必须在历史列表里显式激活
只靠缩略图和顺序无法让用户判断当前 PPT 页正在用哪张图,尤其是一次生成多张相似图片时。
更稳的做法是:
-`elementId` 优先判断当前图
- `elementId` 不存在或已失效时,用 `imageUrl` 兜底
- 当前项使用激活样式和“当前”标记
一句话:
**历史列表需要表达“当前状态”,不能只表达“候选集合”。**
### 3. hover 大图应优先规避底部遮挡
历史菜单通常靠近页面下方,预览图如果向右下展开,很容易被视口底部截断。
当前更稳的默认定位是:
- 在历史 item 右侧展示
- 以 item 底部为基准向上展开
- 后续如果需要再做完整视口碰撞检测
一句话:
**没有碰撞检测前,右上展开比右下展开更稳。**
## 代码层面固化的规则
### 1. 历史记录写入时带上生成时间
从任务队列写入 PPT 生图历史时,应优先使用:
1. `task.completedAt`
2. `task.updatedAt`
3. `task.createdAt`
4. `Date.now()` 兜底
这样能让历史记录尽量接近图片真实生成完成时间。
### 2. 切换历史图时保留原历史时间
用户从历史菜单切回某张图时,需要把该历史项的 `createdAt` 继续传回 PPT 元数据更新流程,避免被 `Date.now()` 覆盖。
切换历史图只是改变当前展示图,不应该改变历史列表顺序。历史项如果已存在,应原位更新 `elementId` / `prompt` 等轻量信息,而不是重新插到第一位。
### 3. 批量生成时每张图都进入历史
一次生成多张图时:
- 最后一张作为当前展示图
- 所有结果都进入该 Frame 的 `slideImageHistory`
- 历史项保留各自所属任务的生成完成时间
- 新生成结果按生成顺序排在历史列表后面,不反向插入到最前
### 4. UI 激活态要跟数据判断一致
历史 item 的激活态判断应复用当前 PPT 图的真实关联关系:
- 优先比较 `slideImageElementId`
- 再比较 `slideImageUrl`
避免 UI 激活态和实际画布内容不一致。