diff --git a/.env.dev b/.env.dev index d429345a..dd5ff006 100644 --- a/.env.dev +++ b/.env.dev @@ -3,6 +3,6 @@ NODE_ENV = 'development' # VUE_APP_BASE_URL = 'https://api.aida.com.hk' # VUE_APP_BASE_URL = 'http://18.167.251.121:10086' -VUE_APP_BASE_URL = 'https://develop.api.aida.com.hk' +# VUE_APP_BASE_URL = 'https://develop.api.aida.com.hk' # VUE_APP_BASE_URL = 'http://192.168.1.9:17088' -# VUE_APP_BASE_URL = 'http://192.168.1.7:5567' +VUE_APP_BASE_URL = 'http://192.168.1.7:5567' diff --git a/.env.test_build b/.env.test_build index 3d9aa1b1..bb799862 100644 --- a/.env.test_build +++ b/.env.test_build @@ -2,6 +2,6 @@ NODE_ENV = 'production' # VUE_APP_BASE_URL = 'https://aida.com.hk/test' # VUE_APP_BASE_URL = 'http://18.167.251.121:10088' # VUE_APP_BASE_URL = 'https://api.aida.com.hk' -VUE_APP_BASE_URL = 'https://test.api.aida.com.hk' -# VUE_APP_BASE_URL = 'https://api.aida.com.hk' +# VUE_APP_BASE_URL = 'https://test.api.aida.com.hk' +VUE_APP_BASE_URL = 'https://develop.api.aida.com.hk' diff --git a/src/assets/iconfont2/iconfont.css b/src/assets/iconfont2/iconfont.css index 0b044330..912e2297 100644 --- a/src/assets/iconfont2/iconfont.css +++ b/src/assets/iconfont2/iconfont.css @@ -1,6 +1,6 @@ @font-face { font-family: "iconfont"; /* Project id */ - src: url('iconfont.ttf?t=1701308010197') format('truetype'); + src: url('iconfont.ttf?t=1709865709415') format('truetype'); } .iconfont { @@ -43,3 +43,47 @@ content: "\e685"; } +.icon-bianji:before { + content: "\e600"; +} + +.icon-circle:before { + content: "\e64f"; +} + +.icon-sanjiaoxing:before { + content: "\e615"; +} + +.icon-tuceng:before { + content: "\e632"; +} + +.icon-move:before { + content: "\e616"; +} + +.icon-xiangpi_huaban1:before { + content: "\e67b"; +} + +.icon-tx-fill-tuoyuanxing:before { + content: "\e64c"; +} + +.icon-zhixian:before { + content: "\e602"; +} + +.icon-xian:before { + content: "\ec5f"; +} + +.icon-checkbox-full:before { + content: "\ea6f"; +} + +.icon-tuceng1:before { + content: "\e62d"; +} + diff --git a/src/assets/iconfont2/iconfont.json b/src/assets/iconfont2/iconfont.json index cc1f0b6c..849c918d 100644 --- a/src/assets/iconfont2/iconfont.json +++ b/src/assets/iconfont2/iconfont.json @@ -60,6 +60,83 @@ "font_class": "dianwei", "unicode": "e685", "unicode_decimal": 59013 + }, + { + "icon_id": "130743908", + "name": "编辑", + "font_class": "bianji", + "unicode": "e600", + "unicode_decimal": 58880 + }, + { + "icon_id": "130743909", + "name": "圆形", + "font_class": "circle", + "unicode": "e64f", + "unicode_decimal": 58959 + }, + { + "icon_id": "130743910", + "name": "三角形", + "font_class": "sanjiaoxing", + "unicode": "e615", + "unicode_decimal": 58901 + }, + { + "icon_id": "130743911", + "name": "图层", + "font_class": "tuceng", + "unicode": "e632", + "unicode_decimal": 58930 + }, + { + "icon_id": "130743912", + "name": "平移", + "font_class": "move", + "unicode": "e616", + "unicode_decimal": 58902 + }, + { + "icon_id": "130743913", + "name": "橡皮", + "font_class": "xiangpi_huaban1", + "unicode": "e67b", + "unicode_decimal": 59003 + }, + { + "icon_id": "130743914", + "name": "tx-fill-椭圆形", + "font_class": "tx-fill-tuoyuanxing", + "unicode": "e64c", + "unicode_decimal": 58956 + }, + { + "icon_id": "130743915", + "name": "直线", + "font_class": "zhixian", + "unicode": "e602", + "unicode_decimal": 58882 + }, + { + "icon_id": "130743916", + "name": "线", + "font_class": "xian", + "unicode": "ec5f", + "unicode_decimal": 60511 + }, + { + "icon_id": "130743917", + "name": "正方形", + "font_class": "checkbox-full", + "unicode": "ea6f", + "unicode_decimal": 60015 + }, + { + "icon_id": "130743918", + "name": "图层", + "font_class": "tuceng1", + "unicode": "e62d", + "unicode_decimal": 58925 } ] } diff --git a/src/assets/iconfont2/iconfont.ttf b/src/assets/iconfont2/iconfont.ttf index 2bce2665..9ecc492e 100644 Binary files a/src/assets/iconfont2/iconfont.ttf and b/src/assets/iconfont2/iconfont.ttf differ diff --git a/src/assets/style/style.css b/src/assets/style/style.css index 626b996f..045e0f82 100644 --- a/src/assets/style/style.css +++ b/src/assets/style/style.css @@ -1001,6 +1001,10 @@ i { color: #fff; flex-direction: column; } +.mark_loading.bgFFF { + background: #ffffff; + color: #000; +} .mark_loading .mark_loading_text { text-align: center; font-size: 1.2rem; @@ -1017,16 +1021,25 @@ i { } .mark_loading .mark_loading_title { font-size: 3rem; - text-decoration: underline; - cursor: pointer; + font-weight: 600; margin-bottom: 2rem; } +.mark_loading .mark_loading_intro { + color: rgba(0, 0, 0, 0.6); + font-size: 1.4rem; + margin-bottom: 2rem; + text-align: center; + width: 80%; +} +.mark_loading .mark_loading_title_box { + display: flex; +} .mark_loading .mark_loading_btn, .mark_loading .mark_loading_btn2 { + display: flex; margin-top: 10px; text-align: center; border: 2px solid; - display: inline-block; padding: 0 20px; border-radius: 10px; cursor: pointer; @@ -1035,9 +1048,10 @@ i { color: #fff; border: none; margin: 0 2rem; + align-items: center; } .mark_loading .mark_loading_btn2 { border: 2px solid #000; + color: #000; background: rgba(0, 0, 0, 0); - color: #fff; } diff --git a/src/assets/style/style.less b/src/assets/style/style.less index 82dc3192..6d6ba24a 100644 --- a/src/assets/style/style.less +++ b/src/assets/style/style.less @@ -1066,6 +1066,10 @@ i{ justify-content: center; color: #fff; flex-direction: column; + &.bgFFF{ + background: rgba(255,255,255, 1); + color: #000; + } .mark_loading_text{ text-align: center; font-size: 1.2rem; @@ -1085,18 +1089,29 @@ i{ } .mark_loading_title{ font-size: 3rem; - text-decoration: underline; - cursor: pointer; + // text-decoration: underline; + font-weight: 600; margin-bottom: 2rem; // color: #fff; } + .mark_loading_intro{ + color: rgba(0, 0, 0, 0.6); + font-size: 1.4rem; + margin-bottom: 2rem; + text-align: center; + width: 80%; + } + .mark_loading_title_box{ + display: flex; + } + .mark_loading_btn,.mark_loading_btn2{ // border: #000; // color: #fff; + display: flex; margin-top: 10px; text-align: center; border: 2px solid; - display: inline-block; padding: 0 20px; border-radius: 10px; cursor: pointer; @@ -1105,10 +1120,11 @@ i{ color: #fff; border: none; margin: 0 2rem; + align-items: center; } .mark_loading_btn2{ border: 2px solid #000; + color: #000; background: rgba(0,0,0,0); - color: #fff; } } diff --git a/src/component/HomePage/ExportModel.vue b/src/component/HomePage/ExportModel.vue index b12c3a1c..4d9d8108 100644 --- a/src/component/HomePage/ExportModel.vue +++ b/src/component/HomePage/ExportModel.vue @@ -29,19 +29,19 @@
Height:
-
+
Canvas Nav
-
+
-
+
Canvas Tool
+ +
+
+
+
+ + + + + +
+
+ + +
+
+
+ More +
+
+
+
+
+ + + + + + +
+
+ +
@@ -86,8 +132,6 @@
High-definition Download
-
123
-
321
all
-
HD Export
+
HD Export
Export
@@ -114,13 +158,13 @@ import {defineComponent, computed, h, ref, nextTick, inject, reactive, onMounted, } from "vue"; import { Https } from "@/tool/https"; -import { multiselectJS } from "@/tool/canvasDrawing"; import scaleImage from "@/component/HomePage/scaleImage.vue"; import ExportNewCoolection from "@/component/HomePage/ExportNewCoolection.vue"; import { useStore } from "vuex"; import JSZip, { forEach } from "jszip"; import { message, Modal } from "ant-design-vue"; const FileSaver = require("file-saver"); +import { multiselectJS,JSRectUpdata,JSchangeType,JScanvasMouseDown,JScanvasMouseMove,JScreateCheck } from "@/tool/canvasDrawing"; export default defineComponent({ components: { scaleImage, @@ -163,11 +207,14 @@ export default defineComponent({ let likeDesign = 4; //整体图分组 let disposeMoodboardShow = true; - - let canvasState = ref([])//存放canvas操作 - let stateIndex = ref(-1)//表示撤回数量 + + let canvasState = ref()//存放canvas操作 + let reverseCanvasState = ref([])//存放canvas操作 + let normalCanvasState = ref([])//存放canvas操作 let isLoadCanvas = false//撤回或者反撤回false为撤回 let init = () => { + normalCanvasState.value = [] + reverseCanvasState.value = [] showUpgradePlan.value = true; nextTick().then(async () => { allBoardData.value.likeDesignCollectionList = @@ -187,15 +234,27 @@ export default defineComponent({ isDrawingMode: false, // 开启绘图模式 // preserveObjectStacking: true, }); + JSchangeType(canvas,'init') canvasOnDrop()//开启鼠标到画布事件 setRemoveImage()//设置元素删除 canvas.on("object:modified", ()=>{ updateCanvasState() }); - canvas.on('selection:created', ()=>{ - updateCanvasState('created') - }); - // canvas.on("object:added", updateCanvasState); + //鼠标移动 + canvas.on("mouse:move", event =>setCanvasMove(event)); + canvas.on("mouse:out", event=>setCanvasOut(event)); + canvas.on("mouse:down", event=>setCanvasDown(event)); + canvas.on("mouse:up", event=>setCanvasUp(event)); + // canvas.on('path:created', (event)=>{updateCanvasState()}); + // canvas.on("selection:created", (event)=>{setZIndex(event)}); + // canvas.on('object:removed', function() { + // }); + // canvas.on("object:added", (obj)=>{ + // obj.target.cornerSize = 10 + // obj.target.transparentCorners = false + // }); + fabric.Object.prototype.cornerSize = 10 + fabric.Object.prototype.transparentCorners = false // setCanvasOperation()//设置监听添加修改画布元素,用来做撤回功能 let arr = [ "disposeMoodboard", @@ -303,24 +362,29 @@ export default defineComponent({ canvas.setHeight(canvasWH.value.height); } } + updateCanvasState('')//加载完成后记录一下 }); }; let setRemoveImage = ()=>{ let deleteObject = (eventData, transform)=> { - var target = [transform.target]; - if(transform.target._objects){ - target = transform.target._objects - } - // canvas.discardActiveObject() // 丢弃当前活动的对象和触发事件。 如果fabric作为鼠标事件的结果调用该函数,则将该事件作为参数传递给自定义事件的fire函数。 当作为一个方法使用时,参数没有任何应用。 - // const sel = new fabric.ActiveSelection(canvas.getObjects(), { - // canvas - // }) + // var target = [transform.target]; + let target = canvas.getActiveObjects() target.forEach((item)=>{ - var canvas = item.canvas; - canvas.remove(item); + // var canvas = item.canvas; + // canvas.remove(item); + canvas.fxRemove(item, { + onComplete(){ + canvas.discardActiveObject(); // 丢弃当前选中的对象 + canvas.renderAll(); // 重新渲染 Canvas + } + }) + canvas.FX_DURATION = 300 }) - canvas.requestRenderAll(); - canvas.discardActiveObject() // 丢弃当前活动的对象和触发事件。 如果fabric作为鼠标事件的结果调用该函数,则将该事件作为参数传递给自定义事件的fire函数。 当作为一个方法使用时,参数没有任何应用。 + // canvas.requestRenderAll(); + // canvas.discardActiveObject() // 丢弃当前活动的对象和触发事件。 如果fabric作为鼠标事件的结果调用该函数,则将该事件作为参数传递给自定义事件的fire函数。 当作为一个方法使用时,参数没有任何应用。 + // canvas.discardActiveObject(); // 丢弃当前选中的对象 + // canvas.renderAll(); // 重新渲染 Canvas + updateCanvasState('remove') } const deleteIcon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAACxAAAAsQHGLUmNAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAdBJREFUSImt1r1uU0EQBeDPFh1pgBQEEwFVAg9BROhCAh1FAg1gkMA8DA0oKOEB3IEIRQgF4SEQBIUC6ENSGgPFXaPx+udeSxxppPXOzJnZ8e7MrRmPWdzANZxPv+EbvmILL/G9hGcADayjgz8l0kUb56qSX8dhBeJcDrFSRv44ZRQdt3EPczieZB5NvB1ymta4zCP5J1yucOIFfM6CDJykob8s73GiAnkPJ7Eb/H9iJhpsZJlPQh6D7AWe9Z5iFr+CIpalhjWspnXZ/pXA01FURkv/HxpxK+g2UE+yGfZXM5+doHt4DEtB2R5dAXdD9nfG2LVxNa2XKGreiziXGefZ5rKZbCLmg/4jHIWNqSEZ1fC0IrnE0bM5qqdFGWoV92RBf/P/S3RRVqI3YaOZGd8eQpgHXMt8HgTd67qi5fZwMzOO5XuREmim9ShEji04q78tLwSDSR/aYuD599DgeVDsY3pMhqOQt4pnUXlGf7PbTQ5VcQofgv8BTudGK/rb9Z6it5RhEV+CX1cxYoeiZXDg7OC+4vpNJbmkuC3vMtsuHpVltKzo55OOzINxmeeYxhPVhn5H0ftnhhGNeu49NBSjdBkX9H+27Cvu+Sv8GEXwF9+O3b1zwZqdAAAAAElFTkSuQmCC" // 创建删除图片元素 @@ -348,22 +412,7 @@ export default defineComponent({ cornerSize: 24 }) } - //设置画布监听修改添加事件,用来做撤回功能 - let updateCanvasState = (str) =>{ - if (!isLoadCanvas) { - const canvasAsJson = JSON.stringify(canvas.toJSON()); - if(str == 'created'){ - if(canvasState.value.length == 0){ - canvasState.value.push(canvasAsJson); - } - }else{ - canvasState.value.push(canvasAsJson); - } - stateIndex.value = canvasState.value.length - 1; - } else { - isLoadCanvas = false; - } - } + let setImageWidth = (key)=>{ let imgWidth = canvasWH.value.width; //这是设置画布等宽 if ( @@ -405,12 +454,9 @@ export default defineComponent({ scaleX: imgWidth / img.width, scaleY:(img.width * proportion * scaleWH) / img.height, - cornerSize: 10, // 选中时,角的大小为20 - // lockRotation:true, - // lockScalingX:true, + // cornerSize: 10, // 选中时,角的大小为20 + // transparentCorners: false, // 选中时,角是被填充了。true 空心;false 实心 lockRotation: true, - transparentCorners: false, // 选中时,角是被填充了。true 空心;false 实心 - // cornerColor: "#a1de93", // 选中时,角的颜色是 青色 }); } @@ -552,24 +598,19 @@ export default defineComponent({ canvas.setWidth(canvasWH.value.width); }; - let closeNav = ref(0) - let setCloseNav = (num)=>{ - if(closeNav.value == num){ - closeNav.value = -1 - }else{ - closeNav.value = num - } + let closeNav = ref({ + nav:true, + tool:false, + move:false, + }) + let setCloseNav = (key)=>{ + closeNav.value[key] = !closeNav.value[key] } - // let multiselect = ()=>{ - // console.log(canvas); - // multiselectJS(canvas) - // } function multiselect() {//获取整体宽高 canvas.discardActiveObject() // 丢弃当前活动的对象和触发事件。 如果fabric作为鼠标事件的结果调用该函数,则将该事件作为参数传递给自定义事件的fire函数。 当作为一个方法使用时,参数没有任何应用。 const sel = new fabric.ActiveSelection(canvas.getObjects(), { canvas }) - // console.log(sel) canvas.setActiveObject(sel) canvas.requestRenderAll() const activeObject = canvas.getActiveObject(); // 获取当前选中的整体对象 @@ -579,7 +620,6 @@ export default defineComponent({ console.log('Total Width:', totalWidth); console.log('Total Height:', totalHeight); } - } let currentType = ref({ type:'', @@ -591,31 +631,31 @@ export default defineComponent({ } let canvasOnDrop = ()=>{ canvas.on('drop', (opt)=> { - // 省略部分代码...... - let offset = { - left: canvas.getSelectionElement().getBoundingClientRect().left, - top: canvas.getSelectionElement().getBoundingClientRect().top - } - let point = { - x: opt.e.x - offset.left, - y: opt.e.y - offset.top, - } - let pointerVpt = canvas.restorePointerVpt(point) - switch (currentType.value.type) { - case 'colorBoards': - let rect = setGroup(currentType.value.data) - setCanvasColor(pointerVpt.y, pointerVpt.x,rect) - break - case 'moodboardFiles': - createRect(pointerVpt.y, pointerVpt.x,currentType.value.type) - break - default : - createRect(pointerVpt.y, pointerVpt.x,currentType.value.type) - break - } - // 创建完元素,把当前操作的元素类型设置回 null + let offset = { + left: canvas.getSelectionElement().getBoundingClientRect().left, + top: canvas.getSelectionElement().getBoundingClientRect().top + } + let point = { + x: opt.e.x - offset.left, + y: opt.e.y - offset.top, + } + let pointerVpt = canvas.restorePointerVpt(point) + switch (currentType.value.type) { + case 'colorBoards': + let rect = setGroup(currentType.value.data) + setCanvasColor(pointerVpt.y, pointerVpt.x,rect) + break + case 'moodboardFiles': + createImage(pointerVpt.y, pointerVpt.x,currentType.value.type) + break + default : + createImage(pointerVpt.y, pointerVpt.x,currentType.value.type) + break + } + // 创建完元素,把当前操作的元素类型设置回 null currentType.value.type = null currentType.value.data = null + }) } let setGroup = (data)=>{ @@ -651,43 +691,274 @@ export default defineComponent({ top, width: rect.width, fill: "rgb(255,255,255)", - cornerSize: 10, // 选中时,角的大小为20 - transparentCorners: false, // 选中时,角是被填充了。true 空心;false 实心 stroke: "#212121", strokeWidth: 1, }); - // 将矩形对象添加到 canvas 中 - canvas.add(group); return group } // 创建矩形 - let createRect = (top, left,key)=> { + let createImage = async (top, left,key)=> { let itemCanvasImg = currentType.value.data.imgUrl if(key == 'likeDesignCollectionList'){ itemCanvasImg = currentType.value.data.designOutfitUrl; } - fabric.Image.fromURL(itemCanvasImg,(img) => { - setCanvasImage(img,key,left,top)//设置图片 - canvas.add(img); - },{ crossOrigin: "Anonymous" }); + await new Promise((resolve,reject)=>{ + fabric.Image.fromURL(itemCanvasImg,(img) => { + setCanvasImage(img,key,left,top)//设置图片 + canvas.add(img); + resolve() + },{ crossOrigin: "Anonymous" }); + }) + updateCanvasState() + } + //设置画布监听修改添加事件,用来做撤回功能 + let updateCanvasState = (str) =>{ + const canvasAsJson = JSON.stringify(canvas.toJSON()); + if(str == 'loadingCompleted'){ + // reverseCanvasState.value.push(canvasAsJson); + } + normalCanvasState.value.push(canvasAsJson); + if (isLoadCanvas) { + reverseCanvasState.value = [] + isLoadCanvas = false; + canvasState.value = canvasAsJson + } } //撤回 - let historyState = (index)=> { - if(index<=0){ - index = 0 - }else if (index >canvasState.value.length){ - index = canvasState.value.length-1 + let historyState = (str)=> { + if(str == 'reverse' && reverseCanvasState.value.length > 0){ + canvasState.value = reverseCanvasState.value[reverseCanvasState.value.length-1] + let obj = reverseCanvasState.value.pop() + normalCanvasState.value.push(obj); + }else if(str == '' && normalCanvasState.value.length > 1){ + let obj = normalCanvasState.value.pop() + reverseCanvasState.value.push(obj); + canvasState.value = normalCanvasState.value[normalCanvasState.value.length-1] + isLoadCanvas = true; + }else{ + return + } + canvas.loadFromJSON(canvasState.value, () => {}); + } + + //在画布进行画画 + let operation = ref('move') + let operationMode = ref('fill') + //铅笔颜色 大小 + let canvasPencilColor = ref('#000000') + let canvasPencilWidth = ref(20) + let setOperation = (str)=>{ + operation.value = str + canvas.discardActiveObject();//取消所有选中边框 + clearPatterning()//临时图形置为空并且添加撤回对象里面 + if(str == 'pencil'){ + setPencil() + }else if(str == 'move'){ + setMove() + canvas.forEachObject((obj) =>obj.selectable = true); + JSchangeType(canvas,'init') + }else if(str == 'eraser'){ + setEraser() + }else{ + canvas.forEachObject((obj) =>obj.selectable = false); + canvas.isDrawingMode = false + } + } + let setOperationMode = (str) =>{ + operationMode.value = str + } + let brushIndicator = new fabric.Circle({ + radius:canvasPencilWidth.value/2, + fill: '#fff', + stroke: '#000', + strokeWidth: 0, + originX: 'center', + originY: 'center', + visible :true, + erasable: false, + }); + let setPencil =()=>{ + let pencil = new fabric.PencilBrush(canvas); //笔 + canvas.preserveObjectStacking = true; + canvas.isDrawingMode = true//开启绘画模式 + canvas.freeDrawingBrush = pencil + canvas.freeDrawingBrush.color = canvasPencilColor.value; + brushIndicator.set('fill',canvasPencilColor.value) + canvas.freeDrawingBrush.isEraser = false + canvas.freeDrawingBrush.width = canvasPencilWidth.value; + } + + let setMove = () =>{ + canvas.isDrawingMode = false + canvas.forEachObject((obj) =>obj.selectable = true); + } + let setEraser = ()=>{ + canvas.isDrawingMode = true + let eraser = new fabric.EraserBrush(canvas) + canvas.freeDrawingBrush = eraser + brushIndicator.set({fill: '#FFF'}); + canvas.requestRenderAll(); + canvas.freeDrawingBrush.isEraser = true + canvas.freeDrawingBrush.width = canvasPencilWidth.value; + } + let setTimeOut = { + color:null, + width:null, + }//给切换颜色设置防抖 + let setPencilColor = ()=>{//切换颜色给铅笔设置颜色 + clearTimeout(setTimeOut.color) + setTimeOut.color = setTimeout(()=>{ + // brushIndicator.fill = canvasPencilColor.value; + if(canvas.freeDrawingBrush.isEraser){ + + }else{ + brushIndicator.set({fill: canvasPencilColor.value}); + } + canvas.freeDrawingBrush.color = canvasPencilColor.value; + + },300) + } + let setPencilWidth = ()=>{//切换颜色给铅笔设置颜色 + clearTimeout(setTimeOut.width) + canvasPencilWidth.value = Number(canvasPencilWidth.value) + setTimeOut.width = setTimeout(()=>{ + canvas.freeDrawingBrush.width = canvasPencilWidth.value; + // setPencil() + },300) + } + let downPoint = null;//鼠标按下位置 + let upPoint = null;//鼠标抬起位置 + let currentPatterning = null//临时图形 + let polyLineBtn = null + let createPatterningIs = false + let clearPatterning = () =>{ + if(createPatterningIs){ + canvas.remove(currentPatterning) + } + currentPatterning = null + canvas.remove(polyLineBtn) + updateCanvasState() + } + //设置再画布上移动 + let setCanvasMove = (event)=>{ + var pointer = canvas.getPointer(event.e); + if(canvas.isDrawingMode){ + canvas.setCursor('none'); + if(!canvas.contains(brushIndicator)){ + canvas.add(brushIndicator) + canvas.bringToFront(brushIndicator);//设置优先级最高 + } + // brushIndicator.fill = canvasPencilColor.value + brushIndicator.set({ left: pointer.x, top: pointer.y, visible: true,radius:canvasPencilWidth.value/2 }); + + }else{ + if(createPatterningIs){ + JScanvasMouseMove(operation.value,event,currentPatterning,downPoint) + } + } + canvas.requestRenderAll() + } + let setCanvasOut = (event)=>{ + canvas.remove(brushIndicator)//鼠标移出删除绘画范围的圆形 + } + //设置再画布上按下 + let setCanvasDown = (event)=>{ + + downPoint = event.absolutePointer + let arr = ['rect','line','circle','triangle','ellipse','fold'] + if(arr.indexOf(operation.value) > -1){ + JSchangeType(canvas,operation.value) + createPatterningIs = true + if(currentPatterning && operation.value == 'fold'){ + canvas.skipTargetFind = false + currentPatterning.points.push({ + x: downPoint.x, + y: downPoint.y + }) + // currentPatterning = JScanvasMouseDown(operation.value,event,canvasPencilWidth.value,currentPatterning) + }else{ + if(operation.value == 'fold'){ + polyLineBtn = JScreateCheck(event) + polyLineBtn.on('mousedown',()=>{ + canvas.skipTargetFind = true + let points = currentPatterning.points + currentPatterning.points.pop() + currentPatterning.points.pop() + // canvas.remove(currentPatterning) + // let polyline = new fabric.Polyline(points, { + // fill: 'transparent', + // stroke: canvasPencilColor.value, + // strokeWidth:canvasPencilWidth.value, + // selection:false, + // }) + // canvas.add(polyline) + currentPatterning.set({stroke: canvasPencilColor.value}) + createPatterningIs = false + clearPatterning()//临时图形置为空并且添加撤回对象里面 + }) + canvas.add(polyLineBtn) + } + currentPatterning = JScanvasMouseDown(operation.value,event,canvasPencilWidth.value,currentPatterning) + canvas.add(currentPatterning) + canvas.bringToFront(currentPatterning);//设置优先级最高 + } + }else{ + createPatterningIs = false + } + } + //设置再画布上抬起 + let setCanvasUp = (event)=>{ + upPoint = event.absolutePointer + if(canvas.isDrawingMode){ + canvas.remove(brushIndicator) + updateCanvasState() + }else{ + // event.target && (event.target.bringToFront())//设置优先级 + } + if(createPatterningIs){ + switch (operation.value) { + case 'line': + currentPatterning.set({stroke: canvasPencilColor.value}) + break + case 'fold': + // currentPatterning.set({stroke: canvasPencilColor.value}) + break + default : + if(operationMode.value == 'fill'){ + currentPatterning.set({fill: canvasPencilColor.value}) + }else if (operationMode.value == 'border'){ + currentPatterning.set({fill: 'transparent',stroke: canvasPencilColor.value,strokeWidth: canvasPencilWidth.value}) + } + if(JSON.stringify(downPoint) == JSON.stringify(upPoint)){ + canvas.remove(currentPatterning) + } + break + } + if(operation.value == 'fold'){ + canvas.forEachObject((obj) =>obj.selectable = false); + canvas.bringToFront(polyLineBtn);//设置优先级最高 + }else{ + createPatterningIs = false + clearPatterning()//临时图形置为空并且添加撤回对象里面 + } + } + } + let setHDExport = ()=>{ + let selectedObject = canvas.getActiveObject(); + if (selectedObject && selectedObject.type === 'image') { + // 如果是图片对象,则可以对其进行操作 + let selectedImage = selectedObject; + let img = new Image + img.src = selectedImage.getSrc() + img.onload = ()=>{ + console.log(img.width,img.height); + } + // 输出图片对象的 URL + console.log('Selected image URL:', selectedImage.getSrc()); + } else { + console.log('No image selected.'); } - isLoadCanvas = true; - canvas.loadFromJSON(canvasState.value[index], () => { - canvas.forEachObject(function(obj) { - obj.cornerSize = 10 - obj.transparentCorners=false - }); - canvas.renderAll(); - stateIndex.value = index; - }); } onMounted(() => {}); @@ -705,7 +976,15 @@ export default defineComponent({ multiselect, onDragstart, historyState, - stateIndex, + operation, + operationMode, + setOperation, + setOperationMode, + canvasPencilColor, + canvasPencilWidth, + setPencilColor, + setPencilWidth, + setHDExport, }; }, data(prop) { @@ -780,8 +1059,11 @@ export default defineComponent({ margin-top: 2rem; display: flex; justify-content: space-between; - padding-right: 2rem; cursor: pointer; + position: sticky; + top: 1rem; + background: #f9fafb; + z-index: 2; .icon{ transition: all .3s; } @@ -812,20 +1094,27 @@ export default defineComponent({ width: 10em; } } - .exportCanvasBox_img.closeNav{ - max-height: 1000rem; + .exportCanvasBox_left_item.closeNav{ + // max-height: 1000rem; + height: auto; } } .exportCanvasBox_left::-webkit-scrollbar, .exportCanvasBox_right::-webkit-scrollbar{display: none;} .exportCanvasBox_left { - - .exportCanvasBox_img { - transition: all .3s; + padding-right: 1rem; + .exportCanvasBox_title { + padding-right: 2rem; + } + .exportCanvasBox_left_item{ overflow: hidden; - // height: auto; - max-height: 0; + transition: all .3s; + // max-height: 0; + height: 0; transform: translate3d(0, 0, 0); + } + .exportCanvasBox_img { + // height: auto; .exportCanvasBox_allItem { display: flex; @@ -862,10 +1151,35 @@ export default defineComponent({ } } } + .exportCanvasBox_left_tool{ + .exportCanvasBox_left_tool_item{ + display: flex; + flex-wrap: wrap; + justify-content: space-between; + margin-bottom: 1rem; + &.leftAlign{ + justify-content: flex-start; + } + i{ + font-size: 2.5rem; + cursor: pointer; + width: 4rem; + height: 4rem; + display: flex; + align-items: center; + justify-content: center; + &.active{ + border: 1px solid; + border-radius: .4rem; + } + } + } + } } .exportCanvasBox_right{ display: flex; flex-direction: column; + padding-left: 1rem; position: relative; .exportCanvasBox_right_definition{ // display: flex; diff --git a/src/component/HomePage/Header.vue b/src/component/HomePage/Header.vue index 23e14fc3..e6372214 100644 --- a/src/component/HomePage/Header.vue +++ b/src/component/HomePage/Header.vue @@ -217,7 +217,7 @@ export default defineComponent({ let isTest = ref() let isMurmur = ref() let credits = computed(()=>{ - return store.state.UserHabit.credits.value + return Number(store.state.UserHabit.credits.value) }) let activeCredits = ref(false) return { @@ -281,6 +281,7 @@ export default defineComponent({ this.operateClick(); document.addEventListener("click", this.operateClick); } + this.getCredits() this.getLang('') }, methods: { @@ -297,16 +298,22 @@ export default defineComponent({ UpgradePlan.init() }, Assignment(){//任务 - let num = 123+this.credits - this.store.commit('setCredits',num) + // let num = 123+this.credits + // this.store.commit('setCredits',num) }, getCredits(){//刷新当前积分 - let num = 123+this.credits - this.activeCredits = true - setTimeout(()=>{ + if(!this.activeCredits){ + this.activeCredits = true + this.store.dispatch('getCredits').then((rv)=>{ + setTimeout(()=>{ + this.activeCredits = false + },300) + }) + }else{ this.activeCredits = false - },300) - this.store.commit('setCredits',num) + } + + }, //点击下拉图标出现操作 changeShowOperateContent() { diff --git a/src/component/HomePage/UpgradePlan.vue b/src/component/HomePage/UpgradePlan.vue index 3b2037c5..8f8aafa2 100644 --- a/src/component/HomePage/UpgradePlan.vue +++ b/src/component/HomePage/UpgradePlan.vue @@ -101,9 +101,16 @@
Payment
-
-
Paid completed
-
+
+
Paid completed
+
Please keep the window open until the payment is completed. If you are unable to open the payment window, please check your browser settings to see if pop-ups are being blocked.
+ +
+
Back
+
OK
+
+ +
\ No newline at end of file diff --git a/src/views/Upgrade.vue b/src/views/Upgrade.vue index 71e9f5ae..32293322 100644 --- a/src/views/Upgrade.vue +++ b/src/views/Upgrade.vue @@ -7,7 +7,7 @@
System maintenance
-
System maintenance will start at 10:00 and is expected to be completed at 12:00.
+
Due to system server upgrades, we will be conducting maintenance on Monday, March 4th, from 10:00 AM to 3:00 PM Hong Kong time. During this period, access to the AiDA system will be temporarily unavailable.
We apologize for any inconvenience this may cause and appreciate your understanding.
@@ -85,6 +85,7 @@ export default defineComponent({ transform: translateX(-50%); font-size: 1.8rem; color: #8e8e8e; + text-align: center; } } diff --git a/src/views/trialApproval.vue b/src/views/trialApproval.vue index 8bad919d..6fb89ae2 100644 --- a/src/views/trialApproval.vue +++ b/src/views/trialApproval.vue @@ -265,12 +265,6 @@ export default defineComponent({ this.gettrialList(); let userInfo:any = getCookie("userInfo") this.userInfo = JSON.parse(userInfo); - - if (this.userInfo.userId == 83 || this.userInfo.userId == 88 || this.userInfo.userId == 6) { - } else { - router.replace("/home"); - return - } this.getIsAutoApproval() }, methods: {