From 21bfe5ef8f3f1427846a50e7cf61cda5fa474b56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E9=B9=8F?= <2916022834@qq.com> Date: Thu, 6 Nov 2025 11:27:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=9F=E4=BA=A7=E5=AF=BC?= =?UTF-8?q?=E5=87=BAlog,=20=E7=94=BB=E5=B8=83=E5=9B=BE=E5=B1=82=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E5=9B=BE=E5=B1=82=E9=A1=BA=E5=BA=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CanvasEditor/commands/LayerCommands.js | 4 +- .../commands/ObjectLayerCommands.js | 2 + .../commands/RasterizeLayerCommand.js | 3 +- .../CanvasEditor/commands/TextCommands.js | 3 + .../CanvasEditor/managers/LayerManager.js | 8 ++ src/main.ts | 1 + src/tool/consoleExport.js | 93 +++++++++++++++++++ 7 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 src/tool/consoleExport.js diff --git a/src/component/Canvas/CanvasEditor/commands/LayerCommands.js b/src/component/Canvas/CanvasEditor/commands/LayerCommands.js index 2b258631..3ea26e31 100644 --- a/src/component/Canvas/CanvasEditor/commands/LayerCommands.js +++ b/src/component/Canvas/CanvasEditor/commands/LayerCommands.js @@ -2059,7 +2059,7 @@ export class LayerObjectsToGroupCommand extends Command { } try { - await optimizeCanvasRendering(this.canvas, () => { + await optimizeCanvasRendering(this.canvas, async () => { if (existingGroup) { // 向现有组添加对象 this._addObjectsToExistingGroup(existingGroup, newObjectsToAdd); @@ -2070,8 +2070,8 @@ export class LayerObjectsToGroupCommand extends Command { this._createNewGroupWithAllObjects(newObjectsToAdd); this.groupObjectId = this.newGroupId; this.wasGroupCreated = true; + await this.layerManager?.layerSort?.rearrangeObjects(); } - // 更新交互性 this.layerManager?.updateLayersObjectsInteractivity?.(false).then(()=>{ // 更新缩略图 diff --git a/src/component/Canvas/CanvasEditor/commands/ObjectLayerCommands.js b/src/component/Canvas/CanvasEditor/commands/ObjectLayerCommands.js index d9b60f4a..1243295a 100644 --- a/src/component/Canvas/CanvasEditor/commands/ObjectLayerCommands.js +++ b/src/component/Canvas/CanvasEditor/commands/ObjectLayerCommands.js @@ -255,6 +255,8 @@ export class AddObjectToLayerCommand extends Command { ); // 标记为非首次执行 this.isFirstExecution = false; + // 重新排序图层对象 + await this.layerManager?.layerSort?.rearrangeObjects(); console.log( `✅ 对象已添加到图层 "${layer.name}",位置: (${this.fabricObject.left}, ${this.fabricObject.top})` ); diff --git a/src/component/Canvas/CanvasEditor/commands/RasterizeLayerCommand.js b/src/component/Canvas/CanvasEditor/commands/RasterizeLayerCommand.js index 6b180729..7088029a 100644 --- a/src/component/Canvas/CanvasEditor/commands/RasterizeLayerCommand.js +++ b/src/component/Canvas/CanvasEditor/commands/RasterizeLayerCommand.js @@ -359,7 +359,8 @@ export class RasterizeLayerCommand extends Command { // 设置为活动图层 this.activeLayerId.value = this.rasterizedLayerId; - + // 重新排序图层对象 + await this.layerManager?.layerSort?.rearrangeObjects(); await this.layerManager?.updateLayersObjectsInteractivity(false); console.log(`🎨 组合图层 ${this.rasterizedLayer.name} 创建完成`); diff --git a/src/component/Canvas/CanvasEditor/commands/TextCommands.js b/src/component/Canvas/CanvasEditor/commands/TextCommands.js index 4b02f510..c9c464ef 100644 --- a/src/component/Canvas/CanvasEditor/commands/TextCommands.js +++ b/src/component/Canvas/CanvasEditor/commands/TextCommands.js @@ -409,6 +409,9 @@ export class CreateTextCommand extends Command { // 现在可以安全地设置为活动图层 this.layerManager.setActiveLayer(this.layerId); + // 重新排序图层对象 + await this.layerManager?.layerSort?.rearrangeObjects(); + // 更新对象交互性 await this.layerManager?.updateLayersObjectsInteractivity?.(false); diff --git a/src/component/Canvas/CanvasEditor/managers/LayerManager.js b/src/component/Canvas/CanvasEditor/managers/LayerManager.js index 50320aa1..852872dd 100644 --- a/src/component/Canvas/CanvasEditor/managers/LayerManager.js +++ b/src/component/Canvas/CanvasEditor/managers/LayerManager.js @@ -946,6 +946,14 @@ export class LayerManager { return false; } + // 检查是否是唯一的普通图层 + const normalLayers = this.layers.value.filter((l) => !l.isBackground && !l.isFixed); + console.log("普通图层:", normalLayers) + if (normalLayers.length === 1) { + console.warn("不能删除唯一的普通图层"); + message.warning("不能删除唯一的普通图层"); + return false; + } // // 如果图层有子图层,提示确认 // if (layer && layer.children && layer.children.length > 0) { // console.warn("该图层包含子图层,删除将同时删除所有子图层"); diff --git a/src/main.ts b/src/main.ts index c59ee497..098dbb38 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,5 @@ import { createApp, defineComponent, h } from "vue"; +import "./tool/consoleExport.js"; import App from "./App.vue"; import router from "./router"; import store from "./store"; diff --git a/src/tool/consoleExport.js b/src/tool/consoleExport.js new file mode 100644 index 00000000..a36334b1 --- /dev/null +++ b/src/tool/consoleExport.js @@ -0,0 +1,93 @@ +if (import.meta.env.VITE_USER_NODE_ENVh === "production") { + const log = console.log; + const error = console.error; + const warn = console.warn; + const info = console.info; + const list = []; + + class Item { + constructor(type, arrs) { + this.type = type + this.time = FormatDate() + this.content = arrs + } + } + + console.log = function () { + log(...arguments) + list.push(new Item('log', [...arguments])) + } + console.error = function () { + error(...arguments) + list.push(new Item('error', [...arguments])) + } + console.warn = function () { + warn(...arguments) + list.push(new Item('warn', [...arguments])) + } + console.info = function () { + info(...arguments) + list.push(new Item('info', [...arguments])) + } + + // 导出列表-json + const exportListJson = function () { + const json = JSON.stringify(list, null, 2) + const blob = new Blob([json], { type: 'application/json' }) + const url = URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = url + a.download = `console_${FormatDate("yyyyMMddHHmmss")}.json` + a.click() + URL.revokeObjectURL(url) + } + + const keys = []; + document.addEventListener("keydown", (e) => { + if (e.key === "Control") return; + if (e.ctrlKey) { + keys.push(e.key) + const str = keys.join(''); + if (/m{5}/i.test(str)) { + exportListJson() + keys.splice(0, keys.length) + } + } else { + keys.splice(0, keys.length) + } + + }) +} + +/** 时间格式化-自定义格式 + * @param format 格式化字符串,默认值为 'yyyy-MM-dd HH:mm:ss' + * @returns 格式化后的时间字符串 + */ +function FormatDate(format = 'yyyy-MM-dd HH:mm:ss') { + const date = new Date(); + const yyyy = String(date.getFullYear()); + const yy = String(date.getFullYear()).slice(-2); + const MM = String(date.getMonth() + 1).padStart(2, '0'); + const M = String(date.getMonth() + 1); + const dd = String(date.getDate()).padStart(2, '0'); + const d = String(date.getDate()); + const HH = String(date.getHours()).padStart(2, '0'); + const H = String(date.getHours()); + const mm = String(date.getMinutes()).padStart(2, '0'); + const m = String(date.getMinutes()); + const ss = String(date.getSeconds()).padStart(2, '0'); + const s = String(date.getSeconds()); + const str = format.replaceAll('yyyy', yyyy) + .replaceAll('yy', yy) + .replaceAll('MM', MM) + .replaceAll('M', M) + .replaceAll('dd', dd) + .replaceAll('d', d) + .replaceAll('HH', HH) + .replaceAll('H', H) + .replaceAll('mm', mm) + .replaceAll('m', m) + .replaceAll('ss', ss) + .replaceAll('s', s); + return str; +} \ No newline at end of file