From e4c9ae8fc67894a0a85c4d47cbbefc81a9d3951d Mon Sep 17 00:00:00 2001 From: YoungestSongMo <2130460579@qq.com> Date: Thu, 18 Jun 2026 19:22:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=89=E6=A0=8F=E6=AF=94=E4=BE=8B?= =?UTF-8?q?=E7=BC=A9=E6=94=BE=20+=20SeedanceContent=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=20+=20=E6=9C=AC=E5=9C=B0=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E5=9F=BA=E5=BB=BA=20(0.0.22)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 三栏布局 - ResizeObserver 等比例分配替代固定默认值恢复 - 修复拖拽+窗口调整竞态卡死(needsRecalcRef 延迟补算) - containerRef.current 动态读取 DOM 替代闭包 el Seedance2Content - 从占位文本重构为内容编排控件(文本+图片/视频/音频上传) - 根据 spec.image_files/video_files/audio_files 动态渲染上传区域 - 值 JSON 序列化 → 提交时转 ContentItem[](text/image_url/video_url/audio_url) 图片上传兼容视频文件 - buildAccept 根据 file_filter 区分 image/video 前缀 - createMediaBeforeUpload 动态放行 video/* MIME - 公共模块 media-upload-utils.ts 本地存储基建 - sql.js (WASM SQLite) + safeStorage 加密持久化 - 8个IPC文件操作通道 + resolveSafe 路径穿越防护 - /heixiu-data/ 沙箱 + JWT用户隔离 - 7表DDL + 游标分页 + LRU媒体淘汰 其他 - 修复 errorMessageRef 渲染期写入警告 - 媒体预览回退直接URL(无CORS限制)+ output_type类型补充 - CSP wasm-unsafe-eval + https: CDN媒体源 --- CHANGELOG.md | 46 +++ TODO.md | 11 +- electron/main.ts | 2 + electron/main/storage-ipc.ts | 161 ++++++++++ electron/preload.ts | 44 +++ index.html | 7 +- package-lock.json | 32 +- package.json | 4 +- public/sql-wasm-browser.wasm | Bin 0 -> 659730 bytes public/sql-wasm.wasm | Bin 0 -> 659730 bytes shared/constants/ipc-channels.ts | 16 + shared/types/logging.ts | 3 +- src/components/providers/AppProvider.tsx | 5 +- src/components/providers/SettingsProvider.tsx | 3 + src/infrastructure/storage/db-core.ts | 176 +++++++++++ src/infrastructure/storage/db-encrypt.ts | 123 ++++++++ src/infrastructure/storage/index.ts | 128 ++++++++ src/infrastructure/storage/ipc-file.ts | 76 +++++ src/infrastructure/storage/media-loader.ts | 267 +++++++++++++++++ src/infrastructure/storage/media-store.ts | 80 +++++ src/infrastructure/storage/order-store.ts | 104 +++++++ src/infrastructure/storage/param-store.ts | 80 +++++ src/infrastructure/storage/schema.ts | 82 +++++ src/infrastructure/storage/settings-store.ts | 52 ++++ src/infrastructure/storage/sync-manager.ts | 60 ++++ src/infrastructure/storage/task-store.ts | 97 ++++++ src/infrastructure/storage/types.ts | 94 ++++++ src/infrastructure/storage/user-scope.ts | 80 +++++ src/pages/home/HomeContent.tsx | 89 +++++- src/pages/home/controls/ImageInput.tsx | 35 +-- src/pages/home/controls/ImageListInput.tsx | 22 +- src/pages/home/controls/SeedanceContent.tsx | 279 +++++++++++++++--- src/pages/home/controls/VideoInput.tsx | 119 ++++++++ src/pages/home/controls/index.ts | 2 + src/pages/home/controls/media-upload-utils.ts | 62 ++++ src/pages/home/features/ModelInputForm.tsx | 35 ++- src/pages/home/features/OutputPreview.tsx | 65 +++- src/pages/home/hooks/useModelUI.ts | 10 +- src/pages/settings/SettingsPage.tsx | 2 + .../settings/sections/DataManageSetting.tsx | 112 +++++++ src/pages/settings/sections/data-sync.ts | 90 ++++++ src/vite-env.d.ts | 11 + 42 files changed, 2640 insertions(+), 126 deletions(-) create mode 100644 electron/main/storage-ipc.ts create mode 100644 public/sql-wasm-browser.wasm create mode 100644 public/sql-wasm.wasm create mode 100644 src/infrastructure/storage/db-core.ts create mode 100644 src/infrastructure/storage/db-encrypt.ts create mode 100644 src/infrastructure/storage/index.ts create mode 100644 src/infrastructure/storage/ipc-file.ts create mode 100644 src/infrastructure/storage/media-loader.ts create mode 100644 src/infrastructure/storage/media-store.ts create mode 100644 src/infrastructure/storage/order-store.ts create mode 100644 src/infrastructure/storage/param-store.ts create mode 100644 src/infrastructure/storage/schema.ts create mode 100644 src/infrastructure/storage/settings-store.ts create mode 100644 src/infrastructure/storage/sync-manager.ts create mode 100644 src/infrastructure/storage/task-store.ts create mode 100644 src/infrastructure/storage/types.ts create mode 100644 src/infrastructure/storage/user-scope.ts create mode 100644 src/pages/home/controls/VideoInput.tsx create mode 100644 src/pages/home/controls/media-upload-utils.ts create mode 100644 src/pages/settings/sections/DataManageSetting.tsx create mode 100644 src/pages/settings/sections/data-sync.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b83d7b..e0dc5c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,52 @@ # 更新日志 > 每次发版前修改此文件,`npm run build:win` 打包后会自动读取生成 update-info.json。 +--- +## 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` 卡片(缓存统计 + 加载历史数据 + 保存到磁盘 + 清理缓存) + +### 媒体输出预览优化 + +- `/