From 0f26163ad7f55ce0404ab6615090c3079ca5e562 Mon Sep 17 00:00:00 2001 From: 24kycj <1637269896@qq.com> Date: Tue, 30 Jun 2026 09:18:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B0=83=E6=95=B4bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cursor/rules/soon-file-format.mdc | 35 ++++++++++++++++++++++++++ frontend-electron/js/design1/output.js | 18 ------------- frontend-web/config/version.js | 2 +- frontend-web/js/common/cloud-files.js | 13 +++------- frontend-web/js/design1/output.js | 19 -------------- 5 files changed, 39 insertions(+), 48 deletions(-) create mode 100644 .cursor/rules/soon-file-format.mdc diff --git a/.cursor/rules/soon-file-format.mdc b/.cursor/rules/soon-file-format.mdc new file mode 100644 index 0000000..0bfbfaa --- /dev/null +++ b/.cursor/rules/soon-file-format.mdc @@ -0,0 +1,35 @@ +--- +description: .soon 文件 JSON 契约(与 soonDesign-back / soonWorkerDisk 对齐) +globs: + - frontend-web/js/design1/** + - frontend-web/js/design2/** + - frontend-electron/js/design1/** + - frontend-electron/js/design2/** + - frontend-web/js/common/cloud-files.js +alwaysApply: false +--- + +# .soon 文件格式(不可擅自变更) + +## 权威参考 + +- 旧版程序:`soonDesign-back/lib/design1/output.js`、`design2/output.js`(gitignore,本机对照) +- 下游消费:`soonWorkerDisk/.../workAdd.vue`(依赖 `frontData`、`backData`、`frontDisplayPic` 等) + +## 保存契约 + +`output()` 生成的生产字段与画布字段**必须完整写入**,禁止在 save/upload/session/IDB 路径删除或改名: + +- 生产:`frontData`、`backData`、`frontColorPic`、`backColorPic`、`frontBlackPic`、`backBlackPic`、`frontDisplayPic`、`backDisplayPic`、`flag`、`soonType` +- 画布:`f`、`b`、`fo`、`bo`(及旧版可能有的 `fp`、`bp`) + +保存模式:`Object.assign({ f, b, fo, bo, ... }, op1)` → `JSON.stringify`,与 `soonDesign-back` 一致。 + +## 禁止 + +- 保存/上传/缓存前 `delete` 上述生产字段(历史上 `soonStripDesign1HeavyFields` 类逻辑) +- 仅保留 `f/b/fo/bo` 的「精简 .soon」写法 + +## 加载 + +`soonNormalizeSoonJson` 只允许补全缺失的 `f/b/fo/bo`(兼容极旧文件),**不得 strip** 生产字段,以便打开后另存仍满足下游。 diff --git a/frontend-electron/js/design1/output.js b/frontend-electron/js/design1/output.js index f0622c9..68b4561 100644 --- a/frontend-electron/js/design1/output.js +++ b/frontend-electron/js/design1/output.js @@ -115,24 +115,8 @@ function soonDesign1CaptureDiscPng(canvas, outW, outH) { } } -function soonStripDesign1HeavyFields(con_o) { - if (!con_o) return con_o; - delete con_o.frontColorPic; - delete con_o.backColorPic; - delete con_o.frontBlackPic; - delete con_o.backBlackPic; - delete con_o.frontData; - delete con_o.backData; - delete con_o.backDisplayPic; - if (typeof con_o.frontDisplayPic === 'string' && con_o.frontDisplayPic.length > 120000) { - delete con_o.frontDisplayPic; - } - return con_o; -} - function soonNormalizeSoonJson(j) { if (!j || typeof j !== 'object') return null; - soonStripDesign1HeavyFields(j); if (!j.f || !j.f.objects || !Array.isArray(j.f.objects)) { if (j.objects && Array.isArray(j.objects) && j.objects.length > 0) { j.f = { version: j.version || '4.6.0', objects: j.objects, hoverCursor: j.hoverCursor || 'move' }; @@ -1417,7 +1401,6 @@ function saveAs(op1, callback) { let con_o = Object.assign(o, op1); con_o.soonType = 1; if (typeof window.soonApplySavePreview === 'function') window.soonApplySavePreview(con_o, canvas1); - soonStripDesign1HeavyFields(con_o); var dialogApi = (typeof dialog !== 'undefined' && dialog) ? dialog : (window.platformBridge && window.platformBridge.showSaveDialog ? { showSaveDialog: function(opts) { return window.platformBridge.showSaveDialog(opts); } } : null); if (!dialogApi) return; dialogApi.showSaveDialog({ @@ -1485,7 +1468,6 @@ function save(op1, callback) { let con_o = Object.assign(o, op1); con_o.soonType = 1; if (typeof window.soonApplySavePreview === 'function') window.soonApplySavePreview(con_o, canvas1); - soonStripDesign1HeavyFields(con_o); if (openAs.name != "") { var content = JSON.stringify(con_o); if (isWebPortal() && openAs.name.indexOf('soondesign_session:') === 0) { diff --git a/frontend-web/config/version.js b/frontend-web/config/version.js index 88b1162..4066982 100644 --- a/frontend-web/config/version.js +++ b/frontend-web/config/version.js @@ -1,4 +1,4 @@ (function () { 'use strict'; - window.SOON_APP_VERSION = 'efeb3bc'; + window.SOON_APP_VERSION = 'ce76bb8'; })(); \ No newline at end of file diff --git a/frontend-web/js/common/cloud-files.js b/frontend-web/js/common/cloud-files.js index ed12ee8..ee0f94f 100644 --- a/frontend-web/js/common/cloud-files.js +++ b/frontend-web/js/common/cloud-files.js @@ -672,12 +672,9 @@ return j && j.soonType ? j.soonType : (j && j.backBlackPic ? 2 : 1); } - /** 兼容旧版 .soon:补全 f/b/fo/bo,加载时去掉 output 大图字段 */ + /** 兼容旧版 .soon:补全 f/b/fo/bo,保留生产字段(frontData 等) */ function soonNormalizeSoonJson(j) { if (!j || typeof j !== 'object') return null; - if (typeof window.soonStripDesign1HeavyFields === 'function') { - window.soonStripDesign1HeavyFields(j); - } if (!j.f || !j.f.objects || !Array.isArray(j.f.objects)) { if (j.objects && Array.isArray(j.objects) && j.objects.length > 0) { j.f = { @@ -731,12 +728,8 @@ if (!normalized) return null; var displayName = soonEnsureSoonExt(fileName || 'design.soon'); var key = soonMakeSessionKey(displayName); - var slim = Object.assign({}, normalized); - if (typeof window.soonStripDesign1HeavyFields === 'function') { - window.soonStripDesign1HeavyFields(slim); - } var payload = ''; - try { payload = JSON.stringify(slim); } catch (e) { return null; } + try { payload = JSON.stringify(normalized); } catch (e) { return null; } try { sessionStorage.setItem(key, payload); } catch (e) { @@ -746,7 +739,7 @@ return null; } } - return { key: key, slim: slim, displayName: displayName, normalized: normalized }; + return { key: key, slim: normalized, displayName: displayName, normalized: normalized }; } function soonPutSoonSession(j, fileName) { diff --git a/frontend-web/js/design1/output.js b/frontend-web/js/design1/output.js index d110a2a..9d8a42a 100644 --- a/frontend-web/js/design1/output.js +++ b/frontend-web/js/design1/output.js @@ -119,23 +119,6 @@ function soonDesign1CaptureDiscPng(canvas, outW, outH) { } } -/** 本地 .soon 不存 output 大图字段,避免文件过大导致缓存/加载失败 */ -function soonStripDesign1HeavyFields(con_o) { - if (!con_o) return con_o; - delete con_o.frontColorPic; - delete con_o.backColorPic; - delete con_o.frontBlackPic; - delete con_o.backBlackPic; - delete con_o.frontData; - delete con_o.backData; - delete con_o.backDisplayPic; - if (typeof con_o.frontDisplayPic === 'string' && con_o.frontDisplayPic.length > 120000) { - delete con_o.frontDisplayPic; - } - return con_o; -} -window.soonStripDesign1HeavyFields = soonStripDesign1HeavyFields; - function soonBuildDesign1SavePreviewPic(canvas) { var THUMB_MAX = 102400; var c1 = window.canvas1; @@ -1474,7 +1457,6 @@ function saveAs(op1, callback) { if (typeof window.soonApplySavePreview === 'function') window.soonApplySavePreview(con_o, canvas1); if (typeof window.soonRefreshDesignCanvases === 'function') window.soonRefreshDesignCanvases(); con_o.soonType = 1; - soonStripDesign1HeavyFields(con_o); var dialogApi = (typeof dialog !== 'undefined' && dialog) ? dialog : (window.platformBridge && window.platformBridge.showSaveDialog ? { showSaveDialog: function(opts) { return window.platformBridge.showSaveDialog(opts); } } : null); if (!dialogApi) return; dialogApi.showSaveDialog({ @@ -1544,7 +1526,6 @@ function save(op1, callback) { if (typeof window.soonApplySavePreview === 'function') window.soonApplySavePreview(con_o, canvas1); if (typeof window.soonRefreshDesignCanvases === 'function') window.soonRefreshDesignCanvases(); con_o.soonType = 1; - soonStripDesign1HeavyFields(con_o); var content = JSON.stringify(con_o); var needsDialog = typeof window.soonNeedsSaveDialog === 'function' ? window.soonNeedsSaveDialog(openAs.name)