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 @@ + + \ No newline at end of file +.plan_list { + margin-top: 1rem; + display: flex; + // flex-wrap: wrap; + padding-left: 2.8rem; + column-gap: 0.6rem; + margin-bottom: 2rem; + .plan_item { + height: 4rem; + width: auto; + min-width: 10rem; + display: flex; + align-items: center; + justify-content: center; + // font-size: 1.8rem; + + font-weight: 600; + border-radius: 1.3rem; + color: #fff; + cursor: pointer; + border: 1.8px solid #000; + background-color: #000; + padding: 0 1rem 0 2rem; + + &:hover { + color: #000; + background-color: #fff; + } + + &.active { + background: #ffffff; + color: #000000; + } + + &.disabled { + opacity: 0.5; + cursor: not-allowed; + background-color: #d9d9d9; + border-color: #d9d9d9; + color: #999; + + &:hover { + background-color: #d9d9d9; + color: #999; + } + } + } + + .plan_item { + column-gap: 0.6rem; + } + + .plan_more_icon { + font-size: 1.6rem; + cursor: pointer; + } +} +.subscription-plan-cell { + display: flex; + align-items: center; + justify-content: center; +} +.rename-plan-form { + padding: 2rem 0; + .admin_state_item { + display: flex; + align-items: center; + > span { + width: 10rem; + margin-right: 1rem; + } + } +} +.all-user { + .admin_table_content { + :deep(.ant-table-wrapper) { + overflow: hidden; + } + } +} + diff --git a/src/component/Administrator/subscriptionPlan.vue b/src/component/Administrator/subscriptionPlan.vue new file mode 100644 index 00000000..e0bf2077 --- /dev/null +++ b/src/component/Administrator/subscriptionPlan.vue @@ -0,0 +1,1037 @@ + + + + + diff --git a/src/component/Canvas/CanvasEditor/managers/CanvasManager.js b/src/component/Canvas/CanvasEditor/managers/CanvasManager.js index 87ceb8d3..2b079427 100644 --- a/src/component/Canvas/CanvasEditor/managers/CanvasManager.js +++ b/src/component/Canvas/CanvasEditor/managers/CanvasManager.js @@ -993,7 +993,21 @@ export class CanvasManager { throw new Error("获取画布JSON失败"); } } - +/** 修复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, + }] + } + }) + } loadJSON(json, calllBack) { console.log("加载画布JSON数据:", json); 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/canvas/index.vue b/src/component/Detail/canvas/index.vue index 4b14e789..bc6ecf33 100644 --- a/src/component/Detail/canvas/index.vue +++ b/src/component/Detail/canvas/index.vue @@ -265,9 +265,22 @@ export default defineComponent({ let canvasJSON = detailDom?.editCanvas?.getJSON() let canvasData = JSON.parse(canvasJSON) if(!canvasData)return resolve() - canvasData.canvas.objects.forEach((objectsItem:any) => { - if(objectsItem.type == 'image')objectsItem.minioUrl = getMinioUrl(objectsItem.src) - }); + function deepProcessObjects(data:any, callback:any) { + if (!Array.isArray(data)) return data; + return data.map(item => { + callback(item) + const processedItem = {...item}; + if (processedItem.objects && + Array.isArray(processedItem.objects) && + processedItem.objects.length > 0) { + processedItem.objects = deepProcessObjects(processedItem.objects, callback); + } + return processedItem; + }); + } + canvasData = deepProcessObjects(canvasData.canvas.objects,(item:any)=>{ + if(item.type == 'image')item.minioUrl = getMinioUrl(item.src) + }) let blob = new Blob([JSON.stringify(canvasData)], { type: "application/json" }); let formData = new FormData(); formData.append("file", blob, "data.json"); 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/deReconstruction/index.vue b/src/component/home/tools/deReconstruction/index.vue index e6d7c772..0d2c1cd6 100644 --- a/src/component/home/tools/deReconstruction/index.vue +++ b/src/component/home/tools/deReconstruction/index.vue @@ -206,11 +206,22 @@ export default defineComponent({ if(!canvasJSON)return if(!store.state.Workspace.probjects?.id)return let canvasData = JSON.parse(canvasJSON) - console.log(canvasData) - canvasData.canvas.objects.forEach((objectsItem:any) => { - if(objectsItem.type == 'image')objectsItem.minioUrl = getMinioUrl(objectsItem.src) - - }); + function deepProcessObjects(data:any, callback:any) { + if (!Array.isArray(data)) return data; + return data.map(item => { + callback(item) + const processedItem = {...item}; + if (processedItem.objects && + Array.isArray(processedItem.objects) && + processedItem.objects.length > 0) { + processedItem.objects = deepProcessObjects(processedItem.objects, callback); + } + return processedItem; + }); + } + canvasData = deepProcessObjects(canvasData.canvas.objects,(item:any)=>{ + if(item.type == 'image')item.minioUrl = getMinioUrl(item.src) + }) let blob = new Blob([JSON.stringify(canvasData)], { type: "application/json" }); let formData = new FormData(); formData.append("file", blob, "data.json"); 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({