chore(sync): 上游同步 - 快照导入 upstream/main@e70fe1b9(v1.6.5)并重放本项目差异
This commit is contained in:
@@ -129,15 +129,15 @@ AutoDL 视频模型在“能力与参数 → 画面规格”直接多选当前
|
||||
|
||||
技能库保留原有头部和技能广场共享分类;在“我的技能 / 我创建的”视图增加左侧个人技能库分类及技能数量。用户可为已加入或自建技能创建、分配个人分类;管理员也可创建对所有用户可见、可选、可用于筛选的分类。个人分类仅影响当前用户的技能库和画布 Agent,不改动技能广场共享分类。删除分类只解除相关归类,技能仍保留。画布 Agent 的“我的技能 / 已启用”列表可按个人或平台技能库分类快速筛选,市场页仍按共享分类浏览。
|
||||
|
||||
## 画布保存保护与版本记录
|
||||
## 画布 operations 同步与本地恢复
|
||||
|
||||
旧页面或旧缓存不能覆盖云端新内容。每次内容保存核对服务端版本,发生冲突会停止该画布自动提交并保留本地草稿;平移、缩放和打开画布不触发整份内容保存。画布顶部显示保存状态,可保留草稿后加载云端最新版。
|
||||
画布内容按字段和对象生成 operations,节点、连线和顶层业务字段分别提交;平移、缩放等 viewport 只保存在本地。每次请求携带唯一 `mutationId` 和可选基线版本,服务端在同一事务中校验对象存在性、字段基线、资源归属并保存回执。可选顶层字段不存在时用 JSON `null` 表示,避免 `undefined` 被序列化为缺失属性。相同请求安全重放,响应丢失、断网、刷新或服务端暂时不可用时,浏览器保留已确认基线与未确认请求,后台使用原 ID 和原 payload 自动继续处理。结构化配额只聚合当前用户素材与画布数据,不扫描任务和 API 日志大字段,容量上限与事务语义不变。
|
||||
|
||||
「版本记录」在桌面右侧按日期展开历史树,小屏使用抽屉。点击版本进入独立只读预览,可以缩放查看或下载;返回当前画布后继续编辑。恢复历史会先保存本地草稿、备份当前云端内容,再创建一个新版本。历史只保存画布结构和媒体引用,不复制视频文件;普通快照最短间隔 5 分钟,每个画布保留最近 20 份,因此每次递增的版本号不一定都有快照。历史引用的媒体受到删除保护。本地绘图笔画不在云端历史中,草稿和历史导出不混入当前笔画。
|
||||
不同字段的并发修改可以合并;同一字段或同一对象的基线不一致会返回冲突,当前本地修改继续保留。删除后的迟到节点、连线或媒体更新不会重新创建对象,只有显式新增 operation 可以创建实体。界面只显示同步状态,不提供版本记录、加载云端版、覆盖云端或手动恢复入口。
|
||||
|
||||
此功能不提供多人实时协同或自动合并两个浏览器的完整画布;版本保护用于阻止静默覆盖。历史从升级后开始积累。
|
||||
此合同不提供多人实时协同;它保证局部变更、幂等重放和删除保护,避免旧缓存静默覆盖新内容。内部历史表仍用于资源完整性维护和审计,不作为用户编辑入口。
|
||||
|
||||

|
||||
相关实现见后端 [画布 operations 同步](/docs/backend/canvas-operations-sync)、`web/src/services/user-data-sync.ts`、`web/src/services/api/user-data.ts` 和 `web/src/pages/canvas/canvas-sync-status.tsx`。
|
||||
|
||||
## 画布智能引用
|
||||
|
||||
@@ -365,18 +365,18 @@ SEO 标题、描述、可选关键词会投影到浏览器 metadata、Open Graph
|
||||
- `web/src/lib/canvas/canvas-starter.ts`:空画布起点状态决策。
|
||||
- `web/src/stores/canvas/use-canvas-store.ts`:按画布保存自由起点选择。
|
||||
|
||||
## 画布手动保存与强制覆盖
|
||||
## 画布同步与离线恢复
|
||||
|
||||
画布左上角菜单提供「保存」与「强制覆盖保存」两个手动入口。「保存」与 ⌘/Ctrl+S 等价:先写入浏览器本地缓存,再触发云端同步;云端失败时保留本地结果并排队自动重试,适合平板等无键盘设备手动落盘。
|
||||
画布编辑会先写入浏览器本地持久化,再由统一同步队列提交 operations。浏览器在线时自动保存;断网、响应丢失或服务端暂时不可用时,未确认请求会保留在本地 journal,恢复连接后按原 `mutationId` 和原操作内容自动重放。同步状态会区分保存中、已完成、待处理和错误,用户无需选择本地版或云端版,也无需手动强制覆盖。
|
||||
|
||||
「强制覆盖保存」用于云端同步反复失败(如提示“画布媒体与素材库记录不一致”)时的显式恢复,操作前有确认弹窗。执行时以本地画布为准覆盖云端版本:先按服务端素材记录校验所有画布媒体节点与时间线片段声明的素材绑定,不一致时重绑到引用同一资源的素材(缺失则按节点新建),再按“素材先于画布”的顺序整体推送;素材远端版本冲突时采纳远端为基线继续用本地覆盖。后端“画布资源必须被其素材记录引用”的不变式保持不变,强制覆盖通过前端对齐绑定完成,不绕过校验。
|
||||
媒体素材先完成资源归属和就绪校验,再提交引用画布的 operations。服务端返回并发或资源冲突时,本地修改继续保留,系统等待下一次基线校验;删除后的迟到更新会被拒绝,不会凭空创建节点。相关同步细节见 [画布 operations 同步](/docs/backend/canvas-operations-sync)。
|
||||
|
||||
### 相关实现
|
||||
|
||||
- `web/src/services/canvas-asset-repair.ts`:媒体与素材的资源身份归一化、增量自动修复和强制重绑。
|
||||
- `web/src/services/user-data-sync.ts`:强制覆盖同步入口与素材冲突基线策略。
|
||||
- `web/src/pages/canvas/use-canvas-project-lifecycle.ts`:手动保存与强制保存流程。
|
||||
- `web/src/pages/canvas/canvas-project-top-bar.tsx`:菜单入口。
|
||||
- `web/src/stores/canvas/use-canvas-store.ts`:本地画布持久化与 journal。
|
||||
- `web/src/services/user-data-sync.ts`:operations diff、自动保存、回执重放和远端删除保护。
|
||||
- `web/src/services/canvas-asset-repair.ts`:提交前媒体引用与素材记录校验。
|
||||
- `web/src/pages/canvas/canvas-sync-status.tsx`:同步状态显示。
|
||||
|
||||
## 画布外观
|
||||
|
||||
@@ -475,6 +475,8 @@ SEO 标题、描述、可选关键词会投影到浏览器 metadata、Open Graph
|
||||
|
||||
工作区左侧「创作」下方新增灵感页 `/inspirations`,展示全部提示词,按来源、分类和创作类型筛选,支持搜索、收藏、视图切换和分页;自建灵感支持新建、编辑、删除和 JSON 导入导出,改动只存在本地。
|
||||
|
||||
生产 Nginx 对 `/inspirations` 与 `/inspirations/` 精确返回 SPA 入口,支持直接打开和刷新;`/inspirations/*.json` 继续提供静态目录数据,避免页面路径与同名目录冲突而跳转到容器端口。
|
||||
|
||||
外部提示词由 `web/scripts/import-inspirations.mjs` 同步:`awesome-seedance`、好好学 AI 提示词库、YouMind 的两个姊妹库。脚本同时为画廊池生成本地缩略图(560px、webp、约 35KB 一张)。上游封面平均 400KB~700KB,直接引用一屏 11 张要拉 5MB 以上,换成本地缩略图后约 400KB。
|
||||
|
||||
画廊池走 `public/inspirations/gallery-pool.json` 运行时拉取,不打进首屏 JS:几百条提示词正文压在包里是白背的,而这份数据只服务画廊一处。池子按来源等距抽取以横跨各分类,并且只收描述非空的条目,保证卡片三行版式不缺角;这些条目仍留在全量目录里供灵感页展示。
|
||||
|
||||
Reference in New Issue
Block a user