perf(*): 创作工作台 - 优化首页按需加载与画布交互并修复历史迁移冲突

This commit is contained in:
ddCat
2026-09-05 13:24:10 +08:00
parent 165b4443ab
commit 58f01d1eb6
107 changed files with 3025 additions and 1089 deletions

View File

@@ -15,7 +15,11 @@ description: 影策后端核心持久化表与状态边界
容器内命令 `migrate-schema up` 应用缺失迁移,`migrate-schema status` 输出当前和期望版本,`migrate-schema verify` 只检查兼容性。`CANVAS_AUTO_MIGRATE=true` 仅用于开发和旧部署兼容;受管生产部署设置为 `false`,并由 Compose 的一次性 `migrate` 服务先完成迁移。后续迁移必须新增版本,不得修改已经发布迁移的实现或校验和。
当前结构版本为 6。版本 2 为 `schema_migrations.applied_at` 增加 `idx_schema_migrations_applied_at` 索引;版本 3 `asset_taxonomy_candidate_identity` 为资产候选增加规范化名称和来源,收敛资产分类,并为待确认候选建立项目内部分唯一索引;版本 4 `resource_upload_key` 为资源上传幂等补充 `resources.upload_key` 列和用户维度唯一索引;版本 5 `payment_topup` 创建积分充值、支付通知和对账所需结构;版本 6 `asset_library_folders` 增加用户素材自定义分类及 `assets.folder_id`。
当前结构版本为 8。版本 2 为 `schema_migrations.applied_at` 增加 `idx_schema_migrations_applied_at` 索引;版本 3 `asset_taxonomy_candidate_identity` 为资产候选增加规范化名称和来源,收敛资产分类,并为待确认候选建立项目内部分唯一索引;版本 4 `resource_upload_key` 为资源上传幂等补充 `resources.upload_key` 列和用户维度唯一索引;版本 5 `payment_topup` 创建积分充值、支付通知和对账所需结构;版本 6 `resource_playback_variant` 增加资源播放副本状态;版本 7 `asset_library_folders` 增加用户素材自定义分类及 `assets.folder_id`;版本 8 `logical_model_active_code` 将前台模型 code 的唯一约束限定为未归档记录。
历史发布曾使用版本 6 `asset_library_folders`,之后合并引入了上述 6/7 顺序冲突。迁移器仅在该历史记录的名称和校验和均精确匹配时选择历史顺序:保留版本 6 的素材目录记录及时间,在版本 7 应用 `resource_playback_variant`,再继续版本 8。新数据库及已采用“6 播放副本、7 素材目录”的数据库保持原顺序;状态检查与启动校验采用同一套识别规则。未知名称、被改动的校验和或冲突的版本 7 记录仍会拒绝迁移,不通过删除、改名或伪造已应用记录绕过检查。
升级前备份数据库,迁移命令必须沿用部署实际配置的数据库连接和数据目录。开发环境启用自动迁移时重新启动新代码即可;关闭自动迁移的部署先使用新构建的 `migrate-schema up`,然后 `migrate-schema verify`,成功后启动 Backend。迁移与记录写入在事务中执行;此修复不提供降级迁移,回退旧二进制可能无法识别历史顺序,应恢复匹配的备份和版本,不手工改迁移表。
版本 3 会将 `wardrobe`、`weapon`、`accessory` 迁移为 `prop`,将 `style` 迁移为 `material`,并把原先归入 `other` 的图片、视频、音频和 3D 模型迁移为 `material`。迁移只合并重复的待确认候选:保留最早记录,其余标记为 `ignored`;已经确认的资产不会被自动删除或归并。
@@ -110,7 +114,7 @@ description: 影策后端核心持久化表与状态边界
| `model_channels` | 保存系统渠道与用户渠道的连接配置 | 系统渠道密钥不进入公开目录;普通用户只能读取脱敏后的可用模型集合 |
| `channel_models` | 保存系统渠道中的产品模型标识、上游模型 ID、显示名称、模型 Logo、能力、协议和版本状态 | `icon` 只用于模型选择器展示;能力、协议、启用状态和价格仍由 service 强校验 |
| `channel_model_price_tiers` | 保存系统模型按规格匹配的上游 SKU 与价格 | 价格档与渠道模型同事务保存;未启用或未完成定价的规格不进入普通用户目录 |
| `logical_models` | 保存前台模型的公开名称、Logo、能力类型和归档状态 | 前台模型与系统渠道模型分别维护展示信息;供应线路通过 revision 和 route 关联 |
| `logical_models` | 保存前台模型的公开名称、Logo、能力类型和归档状态 | 前台模型与系统渠道模型分别维护展示信息;供应线路通过 revision 和 route 关联;`code` 仅在 `archived_at IS NULL` 的活动记录中唯一,归档后可用同 code 重建目录项 |
## 插件管理

View File

@@ -5,6 +5,46 @@ description: 当前项目已实现功能的手工验证清单与未确认边界
# 待测试
## 历史迁移 6 编号冲突
- 已修复历史 `asset_library_folders` 占用版本 6 导致启动失败的问题:保留既有记录,精确验证名称与校验和后,在版本 7 补齐播放副本字段;现行数据库迁移顺序不变。
- 已验证 SQLite 数据库测试:历史版本升级、目录数据与迁移时间保留、播放字段实际补齐、重复执行、未知名称/校验和及冲突记录拒绝;未直接修改用户数据库。
- 待验证:实际部署备份后的迁移与后端重启,以及 PostgreSQL 历史数据库升级。回退必须使用匹配备份与代码,不能直接修改 `schema_migrations`。
## 登录与个人库按需加载
- 登录不调用全量 snapshot;画布库每页 40 条摘要、服务端搜索排序;详情、导出和重命名按 ID 加载。素材选择按页读取,画布引用素材每批最多 100 个 ID。
- 已验证:前端构建、账号持久化专项 50 项测试、后端分页与批量读取隔离测试、handler 包测试。待新后端加载代码后验证登录首页网络、分页滚动、搜索、跨页选择、导出、重命名及失败重试;本轮浏览器连接中断,未取得改造后请求数。
- 后端 service 包更大范围测试有 4 项失败:`TestChannelFromRequestStoresAndClearsHeaders`、`TestRuntimeConcurrencyUsesEnvironmentFallback`(私网地址策略),`TestOnlyResumableNewAPIChannel2VideoDeadlinesStayRunning`、`TestResumableVideoDeadlineUsesResolvedSystemChannelProtocol`(视频恢复策略);未借本次分页优化调整这些逻辑。
- 待验证:新账号无缓存时的生成回填、历史创作转画布、项目图片与声音选择、跨设备编辑冲突和 PostgreSQL 查询。
- 边界:Vite 开发模块请求不能当作业务 API 数量;本地 IndexedDB 仍整体恢复,后端仍解析当前页完整画布。增量会话不基于未加载数据推断删除或自动归档素材。
## 提示词编辑器顶栏精简
- 标题改为“图片生成 / 视频生成”等无底色文本;“提示词模板”和“润色”右对齐,辅助操作默认透明,仅悬停、展开或键盘聚焦时强调。
- 参考数量移到缩略图行,纯图片引用显示“参考图”,混合引用显示“参考素材”;保留预览、插入引用和移除连接行为。
- [x] 前端生产构建通过;浏览器确认图片普通面板与放大面板的标题、参考数量位置,以及模板菜单展开。
- [ ] 确认明暗主题、窄窗口、视频及音频面板的显示;启用润色插件后检查入口与原有优化流程。当前验证环境未启用该插件,未触发生成或收费操作。
## 画布浮层平移同步
- [ ] 连续平移、缩放时,节点工具条与提示词卡片逐帧跟随,结束后不回跳;调整窗口宽度后仍正确定位。
- [ ] 顶部空间不足时工具条仍避让提示词卡片;明暗主题下移动无模糊残影,菜单、输入和键盘操作正常。
- 实现:卡片改用逐帧视口事件和 transform 定位,尺寸变化使用最新视口;工具条合并重复通知并缓存尺寸,交互期间关闭浮层滤镜。
- [x] 工具条及媒体性能专项测试 31 项通过,前端生产构建通过;浏览器连续平移与缩放采样中,卡片与节点间距约 10px、工具条与节点间距 30px,未出现定位回跳。大画布性能、不同设备上的残影观感仍待确认。
## 图片与视频节点工具条重组
- [ ] 图片:局部重绘、人像调整(表情/质感)、多角度、图片工具(构图与尺寸/拆分与标记),预览与下载为图标操作。
- [ ] 视频:截取片段、字幕、提取素材(画面/音频)、进入剪辑;替换素材收进更多,移除节点单独分组。
- [ ] 调整尺寸明确为插值放大而非 AI 超分;未实现的超分入口不再展示。裁剪、标注、放大、宫格和音频结果名称保留源素材名。
- [ ] 窄画布折叠工具与剪辑入口,顶部空间不足时工具条保持在可视范围;检查明暗主题、滚轮不穿透和点击后关闭。
- [x] 工具条专项测试覆盖分组、文案、空态、简洁模式、忙碌禁用和动作派发;前端类型检查与生产构建通过(存在分包体积及混合导入警告)。
- [x] 已在现有开发服务确认图片菜单分组、方向键进入菜单、Escape 关闭并返回触发按钮;390px 视口下工具条为单行且不越界。
- [x] 已确认视频四个一级入口及提取素材菜单;边缘节点工具条避让生成面板后可正常点击。
- [ ] 素材预览端到端验证受当前资源接口 500、本机 Agent 连接失败影响;不将界面验证视为媒体链路全部通过。
- [ ] 真实素材端到端复核:局部重绘与表情生成、质感设置、音频提取保留原声、项目时间线定位;本次不自动触发收费模型任务。
## 编辑器(M2 命令状态机)
- [x] 命令协议黄金文件:`editor-commands` 8 个黄金 op(addClip/moveClip/trimClip/splitClip/removeClip/setClipProperty/addSubtitle/removeSubtitle)全量快照比对通过;未知 op、非法 payload 一律抛错(fail-closed)且输入不可变。
@@ -83,6 +123,24 @@ description: 当前项目已实现功能的手工验证清单与未确认边界
- [ ] 用户浏览器 re-test(第 35 条):媒体面板中导入的素材与项目资产分组显示、筛选 Tab 切换、分组折叠与资产行展开;浅色/深色主题切换后媒体面板配色与编辑面板一致;时间线横跨整个编辑面板宽度,拖动分隔条调整高度正常。
- [x] 轨道可见/静音开关(Concat 行头对齐):轨道行头补齐 eye(显示/隐藏轨道)与 volume(静音/取消静音)按钮,与移除 X 三按钮同组(行头加宽 w-40→w-48);关闭态图标变 accent 色(无背景块),轨道名与片段区随隐藏降透明度;新增 `setTrackFlag` 黄金命令(flag 白名单 visible/muted,golden ops 11→12),隐藏轨道(visible=false)上的片段不再参与监视器预览合成(getClipAtTime 过滤);新增 3 条单测(目标轨设置且其余不受影响、muted 独立于 visible、未知轨道/flag/非布尔拒绝),输入不可变校验。
- [ ] 用户浏览器 re-test(轨道可见/静音):行头 hover 出现三按钮组;点 eye 隐藏轨道后监视器该轨画面消失、轨道行与轨道名变淡、再点恢复;点 volume 静音后图标变 accent(音频在 M4 播放/导出阶段生效);仅剩一条轨道时无移除 X;以上操作均可一步 undo。
## 任务预览、文本创作与首屏加载优化
- [x] 任务列表视频改为后端海报字段与前端懒加载图片占位,列表本身不再挂载视频源;后端安全 URL、视频海报专项测试通过。
- [x] 图片、视频、文字节点的编辑面板统一定位在节点下方;文本创作新增默认开启的流式输出与默认关闭的思考开关,并完成前后端协议、推理内容解析和专项测试。
- [x] 创作输入支持一键清空,生成结果刷新后保持展开,“生成同款”入口移至结果标题区,对话文字默认左对齐。
- [x] 匿名首屏移除画布、素材、插件、用户数据同步和品牌视频的提前加载;生产预览的请求数由 203 降至 71,前端生产构建与相关专项测试通过。
- [x] 首屏骨架屏替换为平台 Logo、分镜、文字稿和时间线组成的创作动画,并支持减少动态效果偏好。
- [ ] 使用真实登录态分别生成 Responses、Chat Completions 与 Claude 文本,验证流式开关、思考内容、刷新后的结果展开状态和历史消息左对齐。
- [ ] 在任务中心打开含海报、无海报两类视频任务,确认列表滚动时不下载视频正文,进入详情后才加载并播放视频。
- [ ] 在画布底部边缘分别选择图片、视频和文字节点,确认编辑面板仍固定在节点下方且控件可通过画布滚动或平移访问。
- [ ] 在弱网、浅色/深色主题及 `prefers-reduced-motion` 下刷新首页,确认 Logo 创作动画清晰、无闪屏且登录后工作区模块正常按需加载。
## 生成结果项目资产同步限流恢复
- [x] 生成成功后的自动资产同步会识别后端 HTTP 429,读取 `Retry-After` 并在可取消等待后重试;普通校验失败仍立即上抛,专项测试与前端生产构建通过。
- [ ] 在启用常规素材/画布写入频控的部署环境连续完成一批图片、视频或音频生成,确认结果先保留在画布,临时 429 不再立即显示为项目资产同步失败,等待频控窗口后资产自动出现在项目资产库。
## 平台外观管理
## 支付插件跨平台构建
@@ -816,6 +874,7 @@ description: 当前项目已实现功能的手工验证清单与未确认边界
- [x] 修复项目更新仓储遗漏 `cover_resource_id`,避免接口返回“主图已更新”但数据库字段仍为空;回归测试同时校验设置与移除主图后的数据库重读结果,后端全量测试通过。
- [x] 剧情章节列表去除装饰性侧边表达并显示状态、字数、画布数;制作概览新增六阶段标准流程、当前指标、制作缺口和可点击快速入口;底部镜头卡增加画面、加粗时长、镜头参数、产物版本与绿色成功状态。
- [x] 画布空白区域双击改为直接打开已有新增节点面板,并保留双击位置作为节点落点;原“适配内容”能力继续由缩放控制区提供。
- [x] 项目分镜视频页完成首屏请求治理:项目详情与七个子视图按路由加载,命令面板、更新日志、公告正文和画布创建运行时改为交互后加载,视频预览点击后才取流;真实登录项目生产构建实测首屏 75 个请求(59 个静态资源、13 个 API、3 个其他),首屏不请求 MP4,Console 无错误。
- [ ] 在项目设置分别从个人素材、项目素材和上传图片设置主图,刷新项目列表后确认图片一致;替换、移除主图后确认回退逻辑正确,尝试删除当前主图资源时确认显示项目引用来源。
- [ ] 使用 2500 章项目搜索章节序号和标题,确认定位弹窗桌面端为 5 列、默认每页 100 章,搜索区与分页区保持同一表面;连续切换上一章、下一章并刷新页面,确认当前位置、总章数、字数和路由一致。
- [ ] 在制作概览点击剧情、资产、分镜、预演、视频、交付和三个快速入口,确认跳转到正确章节及阶段,真实镜头产物数量与完成状态一致。
@@ -876,3 +935,11 @@ description: 当前项目已实现功能的手工验证清单与未确认边界
- [ ] 打开剪辑器进入已含画布产物(selected+ready 的 storyboard/action_board/分镜/导出成片)的项目:素材面板自动出现"画布素材"分组与对应素材;再次进入/刷新不产生重复素材。
- [ ] 素材面板"画布素材/本地上传/项目素材"三个页签与分组切换、来源徽章与详情来源文本正确。
- [ ] 项目素材库页与剪辑器素材面板对本轮新同步的画布素材均可见;下载/删除画布素材不影响对应画布产物资源。
## 画布默认框选与移动期性能优化
- [x] 默认工具改为“区域选择”;空白处左键拖动框选,抓手工具拖动平移。Space + 左键、中键和触控板双指手势保留为导航路径;专项测试、类型检查和生产构建通过。
- [x] 框选移动期只通过 Leafer 选区与 DOM 差量标记预览命中节点,不再逐帧提交 React `selectedNodeIds`;抬手使用最终指针坐标计算并只提交一次。
- [x] 可选节点空间索引按不可变节点数组引用缓存;折叠画框子节点和未展开批次子节点继续排除。50k 节点空间索引回归测试通过。
- [x] 登录态真实项目浏览器确认:默认区域选择为激活状态,左键框选不移动视口;抓手工具可平移;区域选择激活时滚动手势继续平移画布。
- [ ] 使用真实 MacBook 触控板复测双指横向/纵向滑动、捏合缩放及 Space + 左键临时抓手,并在 500、2000、5000 个可见节点画布记录连续框选帧率和输入延迟。