From 0feade1f5b30c25918bfff3d9152dd2064de957f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E9=B9=8F?= <2916022834@qq.com>
Date: Wed, 21 Jan 2026 15:05:12 +0800
Subject: [PATCH] 111
---
.../CanvasEditor/components/HeaderMenu.vue | 3 +++
src/component/Canvas/CanvasEditor/index.vue | 6 ++++-
.../CanvasEditor/managers/CanvasManager.js | 23 ++++++++++++++++---
src/component/Detail/canvas/index.vue | 1 +
4 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/src/component/Canvas/CanvasEditor/components/HeaderMenu.vue b/src/component/Canvas/CanvasEditor/components/HeaderMenu.vue
index 675c9db4..9d2e2de9 100644
--- a/src/component/Canvas/CanvasEditor/components/HeaderMenu.vue
+++ b/src/component/Canvas/CanvasEditor/components/HeaderMenu.vue
@@ -22,6 +22,7 @@ const props = defineProps({
default: true, // 是否显示图层面板
},
isBackgroundChangeable: Boolean,
+ isChangeCanvasSize: Boolean,
});
const emit = defineEmits([
@@ -284,6 +285,7 @@ onMounted(() => {
{{ $t("Canvas.width") }}
{
{{ $t("Canvas.height") }}
CanvasConfig, // 默认配置
},
+ isChangeCanvasSize: {
+ type: Boolean,
+ default: true, // 是否允许修改画布大小
+ },
showLayersPanel: {
type: Boolean,
default: true, // 是否显示图层面板
@@ -1190,7 +1194,7 @@ defineExpose({
:brushSize="brushSize"
:enabledRedGreenMode="enabledRedGreenMode"
:showLayersPanel="showLayersPanel"
- :isBackgroundChangeable="isBackgroundChangeable"
+ :isChangeCanvasSize="props.isChangeCanvasSize"
@update:canvasWidth="canvasWidth = $event"
@update:canvasHeight="canvasHeight = $event"
@update:canvasColor="canvasColor = $event"
diff --git a/src/component/Canvas/CanvasEditor/managers/CanvasManager.js b/src/component/Canvas/CanvasEditor/managers/CanvasManager.js
index 7dce7ee3..ae7d8ca9 100644
--- a/src/component/Canvas/CanvasEditor/managers/CanvasManager.js
+++ b/src/component/Canvas/CanvasEditor/managers/CanvasManager.js
@@ -1312,6 +1312,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
canvasColor: this.canvasColor.value,
activeLayerId: this.layerManager?.activeLayerId?.value,
};
+ this.FixJsonIdLoss(data);
console.log("获取画布JSON数据...", data);
return JSON.stringify(data);
} catch (error) {
@@ -1319,7 +1320,6 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
throw new Error("获取画布JSON失败");
}
}
-
loadJSON(json, calllBack) {
// 确保传入的json是字符串格式
@@ -1332,10 +1332,11 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
try {
const parsedJson = JSON.parse(json);
console.log("加载画布JSON数据:", parsedJson);
+ this.FixJsonIdLoss(parsedJson);
this.canvasWidth.value = parsedJson.canvasWidth || this.width;
this.canvasHeight.value = parsedJson.canvasHeight || this.height;
this.canvasColor.value = parsedJson.canvasColor || this.backgroundColor;
-
+
// eslint-disable-next-line no-async-promise-executor
return new Promise(async (resolve, reject) => {
const tempLayers = parsedJson?.layers || [];
@@ -1398,7 +1399,7 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
// 重置画布数据
await this.setCanvasSize(this.canvas.width, this.canvas.height);
await this.centerBackgroundLayer(this.canvas.width, this.canvas.height);
- // await this.resetCanvasSizeByFixedLayer();
+ await this.resetCanvasSizeByFixedLayer();
// 重新构建对象关系
// restoreObjectLayerAssociations(this.layers.value, this.canvas.getObjects());
// 验证图层关联关系 - 稳定后可以注释
@@ -1449,6 +1450,22 @@ backgroundObject.scaleY,'CanvasManager resetCanvasSizeByFixedLayer')
throw new Error("解析JSON失败,请检查输入格式: " + error.message);
}
}
+ /** 修复JSON数据中的ID丢失问题 */
+ FixJsonIdLoss(json){
+ const layers = json?.layers || [];
+ const objects = json?.canvas?.objects || [];
+ layers.forEach((layer) => {
+ if(!layer.fabricObjects?.length && !layer.fabricObject){
+ const obj = objects?.find((o) => o.layerId === layer.id);
+ if(!obj) return;
+ layer.fabricObjects = [{
+ id: obj.id,
+ type: obj.type,
+ }]
+ }
+ })
+ }
+
/**
* 创建其他图层:印花、颜色、元素...
diff --git a/src/component/Detail/canvas/index.vue b/src/component/Detail/canvas/index.vue
index e6cd4c03..ad98a5a6 100644
--- a/src/component/Detail/canvas/index.vue
+++ b/src/component/Detail/canvas/index.vue
@@ -18,6 +18,7 @@
:clothing-image-opts="{
imageMode:'contains',
}"
+ :isChangeCanvasSize="false"
:hideCanvas="hideCanvas || !isEditPattern"
ref="editCanvas">