# 更新日志 > 每次发版前修改此文件,`npm run build:win` 打包后会自动读取生成 update-info.json。 --- ## 0.0.24(2026-06-22) **去除构建时版本变量 + 窗口标题动态版控 + 退出登录保留缓存** ### 版控体系重构 - **去除构建时 `EDITION` 环境变量**:`--personal`/`--enterprise` 参数从 `build.mjs` 移除,`vite.config.ts` 不再注入 `process.env.EDITION`,`.env.*` 清理相应行 - **统一的安装包文件名**:`船长-HeiXiu-{os}-{版本号}-Setup.{ext}`(移除 `${env.EDITION}`) - **`package.json` 简化**:移除 3 条 `:enterprise` 构建脚本 - **`scripts/*.mjs` 统一**:`upload-oss`/`generate-update-info`/`publish-release` 不再接受 `edition` 参数 ### 窗口标题动态版控 - **新格式**:`船长-HeiXiu-{os}-{版本号}`(未登录)/ `船长-HeiXiu-{os}-{版本号}·{版控}`(登录后) - **运行时链路**:`AppProvider` 根据 `user.account_type` 派生 `edition` → `useEffect` → `window.appRuntime.setWindowEdition()` → IPC `set-window-title` → 主进程 `buildWindowTitle` → `mainWindow.setTitle` - **Edtion 类型守卫**:`src/vite-env.d.ts` + `electron/electron-env.d.ts` 双端类型声明 - **更新检查 API** 移除 `edition` 查询参数 ### 本地存储生命周期修正 - **退出登录不再自动清缓存**:`AppProvider.logout()` 移除 `clearUserStorage()` 调用。数据已按 `user_id` 隔离,同一用户重新登录缓存直接命中 - **`clearUserStorage` 竞态修复**:添加 `isOpen()` 前置守卫,防止数据库未初始化时执行 SQL;移除尾部 `closeDatabase()`,确保退出→重新登录周期内数据库持续可用 - **手动清理保留**:`DataManageSetting` 的「清理缓存」按钮仍可主动触发 --- ## 0.0.23(2026-06-22) **三栏等比缩放修复 + 代码重组** ### 三栏布局修复 - **约束逻辑修正**:双遍最小值约束改为 clamp + 超限兜底,修复窗口缩小至 1036px 以下时中列被挤出视口 - **双触发器**:`ResizeObserver` + `window.resize` 事件双重驱动,防止 React 批量更新吞掉重绘 - **三栏等比缩放**:旧算法只保 left:right 比例,中列被动吸收剩余;新算法通过 `prevWidthRef` 反推中列上次宽度,三栏按各自占比同步缩放——窗口从半屏拉到全屏保持 ≈1:1:1 ### 代码重组(第二轮) - **src/utils/**:11 文件精简为 7 文件 —— `env.ts`(platform+device)、`bus.ts`(event-bus+ipc+logger)、`display.ts`(display+logo+type)、`media-upload.ts` - **controls/**:14 文件精简为 6 文件 —— `simple-widgets.tsx`(6合1)、`upload-widgets.tsx`(ImageInput+VideoInput 去重)、`list-upload-widgets.tsx`(ImageListInput+AudioListInput) - **FormField 提升**:从 `auth/components/` 提升到 `src/components/ui/`,`FieldConfig` 类型同步移到 `ui/types.ts` - **data-sync 归位**:从 `settings/sections/` 移到 `infrastructure/storage/` - **electron/main/ 分组**:3 个 IPC handler(log-ipc/safe-storage-ipc/storage-ipc)收拢到 `ipc/` 子目录 - **shell/ → frame/**:`src/components/shell/` 重命名为 `frame/`,更直观表达"应用框架" - **storage/ 分层**:15 文件平铺 → `core/`(4)+ `stores/`(5)+ `services/`(4)+ 入口 ### 文档 - 37 个文件夹全部生成 README.md(不进 Git) - PROJECT.md 目录树同步更新 --- ## 0.0.22(2026-06-18) **三栏布局比例缩放 + SeedanceContent 视频参考上传 + 本地存储基建** ### 三栏布局:比例自适应缩放 - ResizeObserver 改为**等比例分配**策略(替代固定默认值恢复):窗口 Snap/最大化/手动缩放时左-中-右三栏按当前比例同步缩放 - 修复拖拽期间窗口缩放竞态:`handleMouseUp` 即时清除 `draggingRef` + `needsRecalcRef` 延迟补算,解决拖拽中最大化后放开鼠标布局卡死 - 使用 `containerRef.current` 动态读取 DOM(替代闭包捕获 mount 时 `el`),避免 Provider 重渲染后读到旧 DOM ### Seedance2Content 内容编排 - `SeedanceContent` 从占位文本重构为完整内容编排控件:文本描述 + 参考图片/视频/音频三条上传通道 - 根据 `param_schema[].spec.image_files / video_files / audio_files` 动态渲染对应上传区域,**不依赖 widget 名称的隐式约定** - 内部值类型 `{ text, imageUrls[], videoUrls[], audioUrls[] }` → 表单 JSON 字符串 → 提交时序列化为 API `ContentItem[]`(`text` / `image_url` / `video_url` / `audio_url` 判别联合) - `useModelUI` 新增 `widgetName` 字段 + `spec` 媒体文件计数传参(`imageFiles`/`videoFiles`/`audioFiles`/`uploadProvider`) - `ModelInputForm.doSubmit` 新增 `seedance2Content` 分支序列化逻辑 ### 图片上传兼容视频文件 - `ImageInput` / `ImageListInput`:`buildAccept` 根据 `file_filter` 自动区分 `image/` vs `video/` 前缀(原硬编码 `image/` 导致视频文件不可选) - `createMediaBeforeUpload` 根据 `filters` 动态放行 `video/*` MIME - 公共模块 `media-upload-utils.ts`:`VIDEO_EXTENSIONS` + `buildAccept()` + `createMediaBeforeUpload()` 三组件共享 ### 本地存储基建(sql.js + safeStorage) - **数据库**:sql.js(WASM SQLite)渲染进程内存数据库,DDL 7 张表(task_records / order_records / param_history / media_cache / sync_cursor / app_settings / _schema_version) - **加密**:safeStorage(OS DPAPI/Keychain)加密持久化,base64 编解码管线 - **IPC 文件操作**:8 个双向 IPC 通道(FILE_WRITE/READ/DELETE/MAKE_DIR/SHOW_ITEM_IN_FOLDER/GET_DATA_DIR/FILE_SIZE/FILE_EXISTS),`resolveSafe()` 路径穿越防护 - **数据目录**:`/heixiu-data/`(沙箱内),含 `heixiu.db`(加密镜像)+ `media-cache///` - **用户隔离**:JWT `user_id` 区分数据,`getTodayKey()` 日期分桶 - **同步策略**:本地优先 + 手动触发("加载历史数据"按钮),游标分页(`sync_cursor` 表),每批 100 条 - **设置集成**:`DataManageSetting` 卡片(缓存统计 + 加载历史数据 + 保存到磁盘 + 清理缓存) ### 媒体输出预览优化 - `/