桌面自动草稿 / Desktop automatic drafts
本页描述 v6.2.8 的桌面自动草稿实现。Web Lite 不提供此持久化功能。
用户行为
- 取消顶部工具栏的手动存档按钮。在窗口标题栏正中以一行文字显示待保存、保存中、已保存或失败状态。
- 从最后一次实际修改开始计时,连续 5 秒无修改才保存;窗口尺寸测量、取色和界面语言的后台更新不重新计时。
- 保存原文、译文、结构化分段及对应关系、歌曲信息、卡片样式、导出格式与质量、当前步骤,以及尚未提交的歌曲信息表单。
- 本地封面单独保存为受限图片文件,不依赖会在退出后失效的 blob URL。网络封面仍使用经过清理的 URL,不提供离线下载保证。
- 正常关闭、切换歌曲及清空内容前立即补存。写入失败时保留未保存状态,正常关闭会被阻止;点击标题栏的失败文字可重试。
- 重新打开自动恢复上次工作草稿;历史中选择“继续编辑”恢复完整草稿,不重新解析并覆盖歌词。
- 旧的手动存档保持可读。继续编辑旧存档会创建自动草稿,不改写旧存档。
- 已保存草稿不受旧导入记录的 5/10 条上限淘汰。选择“不保留”暂停后续自动保存,不删除既有草稿。手动删除当前历史后停止该会话的写入,避免记录被复活;导入新歌曲或清空后开始新的草稿。
持久化约定
继续使用 app-data/import-history.json 的 schema v2,添加可选 editorDraft 和 activeDraftId。旧记录按原格式读取。完整草稿拥有独立会话令牌及递增写入序号,拒绝过期写入。远程 JSON 传输仍只包含原有远程歌曲与歌词字段,去重独立于本地草稿身份。
写入采用有界校验、串行队列、临时文件、文件同步和原子替换;维护上一个可读版本供损坏恢复。删除时同步收缩恢复副本,避免恢复已删除的记录。本地图片采用内容哈希命名,读取时验证哈希,IPC 不接受任意磁盘路径。
这不是逐键事务日志:强制结束进程、系统断电或磁盘损坏时,只能恢复已经成功写入的版本。连续输入会重新计时,因此未保存内容可能超过 5 秒,不能承诺这些输入一定恢复。测试中的“强制退出恢复”明确先等待“已自动保存”。
回归入口
text
npm run autosave:test
npm run core:test
npm run stability:test
npm run desktop:autosave-test
node scripts/test-desktop-import-history-interactions.mjs
npm run desktop:history-transfer-test桌面测试使用独立临时用户目录和实际 Electron 预加载/存储/关闭链路;歌曲服务响应是固定测试数据,不代表真实平台网络验收。自动草稿测试涵盖 5 秒重置、立即关闭、重启、本地封面、未提交表单、强制退出、写入失败重试及删除隔离。旧历史测试保留 IPC 安全、分页、上限、旧文件流与迁移兼容性覆盖。