diff --git a/dist.7z b/dist.7z deleted file mode 100644 index 866b68e7..00000000 Binary files a/dist.7z and /dev/null differ diff --git a/public/image/toolsGuide/detailCN.png b/public/image/toolsGuide/detailCN.png new file mode 100644 index 00000000..22b87e78 Binary files /dev/null and b/public/image/toolsGuide/detailCN.png differ diff --git a/public/image/toolsGuide/detailEN.png b/public/image/toolsGuide/detailEN.png new file mode 100644 index 00000000..a12455a5 Binary files /dev/null and b/public/image/toolsGuide/detailEN.png differ diff --git a/src/App.vue b/src/App.vue index 6923d861..43d9d486 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,7 +1,16 @@ + + diff --git a/src/component/Canvas/CanvasEditor/index.vue b/src/component/Canvas/CanvasEditor/index.vue index eecafc6f..df61599f 100644 --- a/src/component/Canvas/CanvasEditor/index.vue +++ b/src/component/Canvas/CanvasEditor/index.vue @@ -902,7 +902,7 @@ const changeCanvas = async (command) => { ...command, // 传递完整的命令数据 }; emit("changeCanvas", commandData); - if (command.canUndo || command.canRedo) { + if ((command.canUndo || command.canRedo) && props.enabledRedGreenMode) { setTimeout(async () => { const imageData = await canvasManager.exportImage({ restoreOpacityInRedGreen: true, // 恢复红绿图模式下的透明度 diff --git a/src/component/Canvas/CanvasEditor/managers/ExportManager.js b/src/component/Canvas/CanvasEditor/managers/ExportManager.js index 14bca2bd..6ee777fe 100644 --- a/src/component/Canvas/CanvasEditor/managers/ExportManager.js +++ b/src/component/Canvas/CanvasEditor/managers/ExportManager.js @@ -555,23 +555,17 @@ export class ExportManager { ); } - // 获取固定图层对象的边界矩形(包含位置、尺寸、缩放等信息) - const fixedBounds = fixedLayerObject?.getBoundingRect?.(); - // 使用固定图层的实际显示尺寸作为导出画布尺寸 - const canvasWidth = Math.round(fixedBounds.width); - const canvasHeight = Math.round(fixedBounds.height); + const canvasWidth = Math.round(fixedLayerObject.width * fixedLayerObject.scaleX); + const canvasHeight = Math.round(fixedLayerObject.height * fixedLayerObject.scaleY); console.log(`红绿图模式导出,画布尺寸: ${canvasWidth}x${canvasHeight}`); - console.log("固定图层边界:", fixedBounds); // 创建固定尺寸的临时画布 const scaleFactor = 2; // 高清导出 const tempCanvas = document.createElement("canvas"); tempCanvas.width = canvasWidth * scaleFactor; tempCanvas.height = canvasHeight * scaleFactor; - tempCanvas.style.width = canvasWidth + "px"; - tempCanvas.style.height = canvasHeight + "px"; const tempFabricCanvas = new fabric.StaticCanvas(tempCanvas, { width: canvasWidth, @@ -584,8 +578,7 @@ export class ExportManager { try { // 获取裁剪路径对象(如果存在) - const clipPathObject = await this._getClipPathObject(fixedBounds); - + const clipPathObject = await this._getClipPathObject(fixedLayerObject); // 克隆并添加所有对象到临时画布,需要调整位置相对于固定图层 for (let i = 0; i < objectsToExport.length; i++) { const obj = objectsToExport[i]; @@ -594,19 +587,20 @@ export class ExportManager { restoreOpacityInRedGreen && true ); if (cloned) { - // 调整对象位置:将原画布坐标转换为以固定图层为原点的相对坐标 cloned.set({ - left: cloned.left - fixedBounds.left, - top: cloned.top - fixedBounds.top, + left: 0, + top: 0, + originX: "left", + originY: "top", }); // 更新对象坐标 cloned.setCoords(); // 设置裁剪路径到对象 - if (clipPathObject) { - cloned.clipPath = clipPathObject; - } + // if (clipPathObject) { + // cloned.clipPath = clipPathObject; + // } tempFabricCanvas.add(cloned); } diff --git a/src/component/Detail/DesignDetail.vue b/src/component/Detail/DesignDetail.vue index d887d1a2..4b63b4d4 100644 --- a/src/component/Detail/DesignDetail.vue +++ b/src/component/Detail/DesignDetail.vue @@ -61,7 +61,7 @@
-
+
+ +
+
@@ -128,17 +137,18 @@ import { useI18n } from 'vue-i18n' import addDetails from '@/component/Detail/addDetails.vue' export default defineComponent({ components:{ - detailLeft,model,detailRight,canvasBox + detailLeft,model,detailRight,canvasBox,addDetails }, emits:['destroy'], setup(props,{emit}) { const store = useStore(); - + const {locale} = useI18n() const detailDom = reactive({ model:null, canvasBox, detailRight, detailLeft:null as any, + addDetails:null as any, }) const userDetail = computed(()=>{ return store.state.UserHabit.userDetail @@ -506,6 +516,17 @@ export default defineComponent({ sessionStorage.setItem('revocation', JSON.stringify(revocation)); sessionStorage.setItem('oppositeRevocation',JSON.stringify([])); } + + const addDetail = () =>{ + let addDetails:any = detailDom.addDetails + addDetails.init(detailData.selectDetail,'') + } + const setSloganData = (data:any)=>{ + detailData.selectDetail.sketchString = data + if(detailData.currentDetailType == 'sketch' && detailData.selectDetail?.newDetail?.sketch){ + detailData.selectDetail.newDetail.sketch = null + } + } onMounted(()=>{ window.addEventListener('resize', handleResize); }) @@ -518,6 +539,7 @@ export default defineComponent({ }) return{ + locale, ...toRefs(detailDom), ...toRefs(detailData), closeModal, @@ -531,6 +553,8 @@ export default defineComponent({ canvasReload, modelOnLoad, sketchSysToLibrary, + addDetail, + setSloganData, } }, diff --git a/src/component/Detail/detailLeft/index.vue b/src/component/Detail/detailLeft/index.vue index 37c64ef5..e97c4ed0 100644 --- a/src/component/Detail/detailLeft/index.vue +++ b/src/component/Detail/detailLeft/index.vue @@ -6,7 +6,6 @@ -
- - \ No newline at end of file +}) + + diff --git a/src/component/LibraryPage/brandDetail.vue b/src/component/LibraryPage/brandDetail.vue index 47c97c2e..6470d71f 100644 --- a/src/component/LibraryPage/brandDetail.vue +++ b/src/component/LibraryPage/brandDetail.vue @@ -41,7 +41,7 @@
-
+
@@ -21,7 +21,7 @@ props: { text: { type: String, - default: 'Sign in with Google' + default: '' } }, setup(props, { emit }) { @@ -108,6 +108,9 @@ const toGmailLogin = ()=>{ message.info(t('account.canNotUtilize')) } + const displayText = computed(() => { + return props.text || t('Login.LoginWithGoogle') + }) onBeforeUnmount(()=>{ var existingScript = document.querySelector(`script[src="${data.scriptSrc}"]`); if(existingScript){ @@ -120,6 +123,7 @@ }) return { toGmailLogin, + displayText, } }, }) diff --git a/src/component/LoginPage/login/personal.vue b/src/component/LoginPage/login/personal.vue index 3f774ce1..a597ba09 100644 --- a/src/component/LoginPage/login/personal.vue +++ b/src/component/LoginPage/login/personal.vue @@ -553,13 +553,14 @@ export default defineComponent({ loginType: "EMAIL", userId: this.userId, }; - this.$emit('update:isMask',true) + this.store.commit('set_loading', true) Https.axiosPost(Https.httpUrls.accountLogin, data) .then((rv: any) => { - this.setSuccessLogin(rv); + this.setSuccessLogin(rv); + this.store.commit('set_loading', false) }) .catch((res) => { - this.$emit('update:isMask',false) + this.store.commit('set_loading', false) }); },1000) }, @@ -853,6 +854,10 @@ export default defineComponent({ font-size: 2.2rem; font-weight: bold; color: #030303; + @media (max-width: 767px) { + font-size: 1.2rem; + margin-left: .5rem; + } } .email_last_step_block_icon { cursor: pointer; diff --git a/src/component/LoginPage/verificationCodeInput.vue b/src/component/LoginPage/verificationCodeInput.vue index 4b113036..d539c546 100644 --- a/src/component/LoginPage/verificationCodeInput.vue +++ b/src/component/LoginPage/verificationCodeInput.vue @@ -161,6 +161,13 @@ font-size: 2.4rem; line-height: 8.7rem; outline: none; + @media (max-width: 767px) { + border-radius: .7rem; + width: 3.5rem; + height: 3.5rem; + font-size: 1.8rem; + line-height: 3.5rem; + } } input:last-of-type { margin-right: 0; diff --git a/src/component/LoginPage/weiXinLogin.vue b/src/component/LoginPage/weiXinLogin.vue index 915b22b9..f4d72bf8 100644 --- a/src/component/LoginPage/weiXinLogin.vue +++ b/src/component/LoginPage/weiXinLogin.vue @@ -2,7 +2,7 @@
- {{ $props.text }} + {{ displayText }}
@@ -18,6 +18,7 @@ import { toRefs, } from "vue"; import weiXinModel from "./weiXinModel.vue"; +import { useI18n } from 'vue-i18n' export default defineComponent({ name: "login", components: { @@ -26,20 +27,25 @@ export default defineComponent({ props: { text: { type: String, - default: "Sign in with Wechat", + default: '' }, }, - setup() { + setup(props) { let weiXinDom = reactive({ weiXinModel: null, }); + const { t } = useI18n() const openWeiXinModel = () => { weiXinDom.weiXinModel.init(); }; + const displayText = computed(() => { + return props.text || t('Login.LoginWithWechat') + }) onMounted(() => {}); return { ...toRefs(weiXinDom), openWeiXinModel, + displayText, }; }, }); diff --git a/src/component/WorksPage/newScaleImage.vue b/src/component/WorksPage/newScaleImage.vue index b77d8f86..19afe3b7 100644 --- a/src/component/WorksPage/newScaleImage.vue +++ b/src/component/WorksPage/newScaleImage.vue @@ -113,8 +113,8 @@
-
{{$t('newScaleImage.SecondaryCreation')}}
- + +
{{$t('newScaleImage.SecondaryCreation')}}
@@ -276,7 +276,6 @@ import { Modal,message } from "ant-design-vue"; import { useI18n } from 'vue-i18n'; import { ExclamationCircleOutlined } from '@ant-design/icons-vue'; import fullScreenImg from '@/component/HomePage/fullScreenImg.vue' -import { debounce } from 'lodash-es' export default defineComponent({ components:{fullScreenImg}, @@ -438,25 +437,36 @@ export default defineComponent({ }) } - let setChoose = debounce(async()=>{ - if(userDetail.value.systemList.indexOf(1) == -1){ - return message.info(t('newScaleImage.jsContent1')) - } + let flag = true + let setChoose = async()=>{ + if(!flag) return + flag = false + try { + if(userDetail.value.systemList.indexOf(1) == -1){ + message.info(t('newScaleImage.jsContent1')) + return + } - const targetDate = new Date('2025-09-01T00:00:00'); - // 解析输入日期字符串 - const inputDate = new Date(imgData.scaleImageData.createDate); - if(inputDate < targetDate){ - return message.info(t('newScaleImage.jsContent2')) - } - if(imgData.scaleImageData.openSource == 0){ - return message.info(t('newScaleImage.jsContent2')) - } - let id = await getWorks(imgData.scaleImageData.id) - router.push(`/home/history/${id}`) - // router.push({name:'home',params: {id:imgData.scaleImageData.id,type:'Works'}}) - store.commit('setChooseIsDesign',false) - },300) + const targetDate = new Date('2025-09-01T00:00:00'); + // 解析输入日期字符串 + const inputDate = new Date(imgData.scaleImageData.createDate); + if(inputDate < targetDate){ + message.info(t('newScaleImage.jsContent2')) + return + } + if(imgData.scaleImageData.openSource == 0){ + message.info(t('newScaleImage.jsContent2')) + return + } + store.state.Workspace.cachedRoutes = []; + let id = await getWorks(imgData.scaleImageData.id) + await router.push(`/home/history/${id}`) + store.commit('setChooseIsDesign',false) + } finally { + // 函数执行完成后恢复为 true,确保无论成功还是失败都能再次点击 + flag = true + } + } let setCommentReply = (value:any,str:any)=>{ imgData.commentReply.leve1Id = value.id diff --git a/src/component/home/design/collection/MoodboardUpload.vue b/src/component/home/design/collection/MoodboardUpload.vue index f938579d..77e20dec 100644 --- a/src/component/home/design/collection/MoodboardUpload.vue +++ b/src/component/home/design/collection/MoodboardUpload.vue @@ -132,8 +132,8 @@
--> -
+
@@ -55,13 +55,16 @@ export default defineComponent({ const data = reactive({ openType:'', componentKey:null, - isShowMark:false, + isShowMark:true, routeQuery:{} as any, selectObject:computed(()=>store.state.Workspace.probjects) as any,//选择的项目 chatData:null as any, dataLoad:true as any, cachedRoutes:computed(()=>store.state.Workspace.cachedRoutes),// }) + onMounted(()=>{ + data.isShowMark = false + }) let settingGetHistory:any = inject('settingGetHistory') const setIsShowMark = (boolean:boolean)=>{ data.isShowMark = boolean diff --git a/src/component/home/newProject/workspace.vue b/src/component/home/newProject/workspace.vue index 92f0a20a..67dbca2d 100644 --- a/src/component/home/newProject/workspace.vue +++ b/src/component/home/newProject/workspace.vue @@ -38,7 +38,7 @@
{{$t('Habit.Style')}}:
-
{{ selectObject?.styleName?selectObject?.styleName:'All' }}
+
{{ selectObject?.styleName?selectObject?.styleName:$t('Header.All') }}
diff --git a/src/component/home/tools/poseTransfer/index.vue b/src/component/home/tools/poseTransfer/index.vue index bdae0cb5..6034702c 100644 --- a/src/component/home/tools/poseTransfer/index.vue +++ b/src/component/home/tools/poseTransfer/index.vue @@ -777,6 +777,7 @@ export default defineComponent({ }) } const likeSetBtn = (id: any, str: string) => { + console.log(1111) data.likeList.forEach((item: any, index: any) => { if (item.id == id && id) { if (str == 'zoom') { @@ -814,6 +815,7 @@ export default defineComponent({ let likeFile = (item: any, str: any, index: any) => { let url let value = {} + console.log(props.isDesignPage) if (str == 'like') { value = { likeOrDislike: 'like', @@ -1669,7 +1671,7 @@ export default defineComponent({ .ant-upload-select-picture-card { width: 100%; height: 100%; - border: 1px solid #000; + border: 0.1rem solid #000; background: #fff; } } diff --git a/src/component/home/tools/poseTransfer/promptInput.vue b/src/component/home/tools/poseTransfer/promptInput.vue index 56c75528..5d0852ac 100644 --- a/src/component/home/tools/poseTransfer/promptInput.vue +++ b/src/component/home/tools/poseTransfer/promptInput.vue @@ -65,7 +65,7 @@ defineExpose({