From 4c59a1349d9fc996d1a7906631d3c5101fbec232 Mon Sep 17 00:00:00 2001 From: 13121765685 Date: Mon, 5 Jan 2026 09:51:07 +0800 Subject: [PATCH] 2 --- apps/FrontendDesigner/src/App.vue | 1 + .../src/locales/lang/en-US.js | 2 +- .../src/locales/lang/zh-CN.js | 2 +- .../AdminDisassemblyDetail.vue | 4 +- .../AdminPromptManagement.vue | 2 +- .../ProductManagement/ProductManagement.vue | 3 +- apps/FrontendDesigner/vite.config.js | 4 +- apps/frontend/package.json | 1 + apps/frontend/src/App.vue | 1 + apps/frontend/src/components/CanvasEditor.vue | 559 ---- .../src/components/GuideModal/index.vue | 39 +- .../HeaderComponent/HeaderComponent.vue | 62 +- .../src/components/IPCard/index copy.vue | 175 +- apps/frontend/src/components/IPCard/index.vue | 171 +- .../src/components/SeriesSelector.vue | 3 +- .../src/components/iPandCardLeft/index.vue | 2 + .../src/components/layout/AppSidebar.vue | 2 +- .../src/components/layout/MainLayout.vue | 2 +- apps/frontend/src/locales/index copy.js | 2252 ----------------- apps/frontend/src/locales/index.js | 51 +- apps/frontend/src/router/index.js | 164 +- .../CreationWorkspace/CreationWorkspace.vue | 13 +- .../views/OrderManagement/OrderManagement.js | 1 + .../{ => PointsRecharge}/PointsRecharge.vue | 131 +- .../src/views/PointsRecharge/index.js | 20 + .../src/views/Project/CreateProject.vue | 42 +- apps/frontend/src/views/Project/index.js | 1442 +++++------ apps/frontend/src/views/Waitlist.vue | 127 +- apps/frontend/src/views/home/index.vue | 19 +- apps/frontend/src/views/home/spline.vue | 4 +- apps/frontend/src/views/user/index.vue | 65 +- apps/frontend/vite.config.js | 4 +- .../components/CanvasEditor}/CanvasEditor.vue | 71 +- packages/ui/src/index.js | 16 +- packages/utils/src/api/frontend/index.js | 2 + .../utils/src/api/frontend/rechargeconfig.js | 5 + packages/utils/src/servers/fileserver.js | 244 +- packages/utils/src/servers/payserver.js | 68 +- packages/utils/src/utils/request.js | 5 +- pnpm-lock.yaml | 19 + 40 files changed, 1700 insertions(+), 4100 deletions(-) delete mode 100644 apps/frontend/src/components/CanvasEditor.vue delete mode 100644 apps/frontend/src/locales/index copy.js rename apps/frontend/src/views/{ => PointsRecharge}/PointsRecharge.vue (74%) create mode 100644 apps/frontend/src/views/PointsRecharge/index.js rename {apps/FrontendDesigner/src/components/common => packages/ui/src/components/CanvasEditor}/CanvasEditor.vue (86%) create mode 100644 packages/utils/src/api/frontend/rechargeconfig.js diff --git a/apps/FrontendDesigner/src/App.vue b/apps/FrontendDesigner/src/App.vue index 73291f4..20e4c5b 100644 --- a/apps/FrontendDesigner/src/App.vue +++ b/apps/FrontendDesigner/src/App.vue @@ -128,6 +128,7 @@ window.setElLoading = (qp=false)=>{ }else{ loading.value = true } + window.closeMethods = closeMethods; return closeMethods } window.closeMethods = closeMethods; diff --git a/apps/FrontendDesigner/src/locales/lang/en-US.js b/apps/FrontendDesigner/src/locales/lang/en-US.js index b4e0c04..d038186 100644 --- a/apps/FrontendDesigner/src/locales/lang/en-US.js +++ b/apps/FrontendDesigner/src/locales/lang/en-US.js @@ -797,7 +797,7 @@ export default { animal: 'Animal', person: 'Person', general: 'General', - O1: 'O1', + E1: 'E1', title: 'Title', enterTitle: 'Please enter prompt title', content: 'Content', diff --git a/apps/FrontendDesigner/src/locales/lang/zh-CN.js b/apps/FrontendDesigner/src/locales/lang/zh-CN.js index 23d9ff3..34f6bb0 100644 --- a/apps/FrontendDesigner/src/locales/lang/zh-CN.js +++ b/apps/FrontendDesigner/src/locales/lang/zh-CN.js @@ -791,7 +791,7 @@ orderManagement: { animal: '动物', person: '人物', general: '通用', - O1: 'O1', + E1: 'E1', title: '标题', enterTitle: '请输入提示词标题', content: '内容', diff --git a/apps/FrontendDesigner/src/views/admin/AdminDisassemblyDetail/AdminDisassemblyDetail.vue b/apps/FrontendDesigner/src/views/admin/AdminDisassemblyDetail/AdminDisassemblyDetail.vue index 53ccd1c..baaf738 100644 --- a/apps/FrontendDesigner/src/views/admin/AdminDisassemblyDetail/AdminDisassemblyDetail.vue +++ b/apps/FrontendDesigner/src/views/admin/AdminDisassemblyDetail/AdminDisassemblyDetail.vue @@ -320,7 +320,7 @@ - { currentEditImageIndex.value = index; canvasEditorVisible.value = true; } - const handleCanvasSave = (editedImageUrl,editContent) => { fileServer.uploadFile(editedImageUrl).then((url) => { const newItem = { diff --git a/apps/FrontendDesigner/src/views/admin/AdminPromptManagement/AdminPromptManagement.vue b/apps/FrontendDesigner/src/views/admin/AdminPromptManagement/AdminPromptManagement.vue index 28c10c0..1899cbb 100644 --- a/apps/FrontendDesigner/src/views/admin/AdminPromptManagement/AdminPromptManagement.vue +++ b/apps/FrontendDesigner/src/views/admin/AdminPromptManagement/AdminPromptManagement.vue @@ -82,7 +82,7 @@ - + diff --git a/apps/FrontendDesigner/src/views/admin/ProductManagement/ProductManagement.vue b/apps/FrontendDesigner/src/views/admin/ProductManagement/ProductManagement.vue index cd340d8..71e49c9 100644 --- a/apps/FrontendDesigner/src/views/admin/ProductManagement/ProductManagement.vue +++ b/apps/FrontendDesigner/src/views/admin/ProductManagement/ProductManagement.vue @@ -522,7 +522,6 @@ const formatDate = (dateString) => { const beforeImageUpload = (file) => { const isImage = file.type.startsWith('image/') const isLt5M = file.size / 1024 / 1024 < 5 - if (!isImage) { ElMessage.error(t('admin.productManagement.imageTypeError')) return false @@ -539,12 +538,12 @@ const handleImageChange = (file) => { if (!beforeImageUpload(file.raw)) { return } - const reader = new FileReader() reader.onload = (e) => { const imageUrl = e.target.result fileServer.uploadFile(imageUrl).then((url) => { formData.value.image = url + window?.closeMethods?.close(); ElMessage.success(t('admin.productManagement.imageUploadSuccess')) }).catch((error) => { console.error('图片上传失败:', error) diff --git a/apps/FrontendDesigner/vite.config.js b/apps/FrontendDesigner/vite.config.js index 8c9047a..4a9be00 100644 --- a/apps/FrontendDesigner/vite.config.js +++ b/apps/FrontendDesigner/vite.config.js @@ -34,8 +34,8 @@ export default defineConfig({ // 配置代理解决CORS问题 proxy: { '/api': { - target: 'https://api.deotaland.ai', - // target: 'http://api.deotaland.local', + // target: 'https://api.deotaland.ai', + target: 'http://api.deotaland.local', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, '') } diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 00ae367..5d3c772 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -15,6 +15,7 @@ "@deotaland/utils": "workspace:*", "@element-plus/icons-vue": "^2.3.2", "@google/genai": "^1.27.0", + "@splinetool/runtime": "^1.12.29", "@twind/core": "^1.1.3", "@twind/preset-autoprefix": "^1.0.7", "@twind/preset-tailwind": "^1.1.4", diff --git a/apps/frontend/src/App.vue b/apps/frontend/src/App.vue index 9f25946..76cc68f 100644 --- a/apps/frontend/src/App.vue +++ b/apps/frontend/src/App.vue @@ -47,6 +47,7 @@ window.setElLoading = (qp=false)=>{ }else{ loading.value = true } + window.closeMethods = closeMethods; return closeMethods } window.closeMethods = closeMethods; diff --git a/apps/frontend/src/components/CanvasEditor.vue b/apps/frontend/src/components/CanvasEditor.vue deleted file mode 100644 index 567d75b..0000000 --- a/apps/frontend/src/components/CanvasEditor.vue +++ /dev/null @@ -1,559 +0,0 @@ - - - - - diff --git a/apps/frontend/src/components/GuideModal/index.vue b/apps/frontend/src/components/GuideModal/index.vue index c9c5d33..185d826 100644 --- a/apps/frontend/src/components/GuideModal/index.vue +++ b/apps/frontend/src/components/GuideModal/index.vue @@ -37,8 +37,7 @@

{{ step.title }}

-

{{ step.description }}

- +

💡
@@ -113,30 +112,30 @@ const guideSteps = computed(() => [ id: 1, title: t('guideModal.step1.title'), description: t('guideModal.step1.description'), - image: 'https://draft-user.s3.us-east-2.amazonaws.com/images/de7142df-ceb9-48f9-9367-af2a65e786a5.png', + image: 'https://draft-user.s3.us-east-2.amazonaws.com/images/f1cde4d7-bafd-41cb-8795-ad9ddcd521fb.png', tips: t('guideModal.step1.tips') }, { id: 2, title: t('guideModal.step2.title'), description: t('guideModal.step2.description'), - image:'https://draft-user.s3.us-east-2.amazonaws.com/images/40773ee8-7f85-40c9-8c23-7ea1718e58a8.png', + image:'https://draft-user.s3.us-east-2.amazonaws.com/images/2ec4b422-3b42-4447-b049-6342184a5c50.png', tips: t('guideModal.step2.tips') }, - { - id: 3, - title: t('guideModal.step3.title'), - description: t('guideModal.step3.description'), - image: 'https://draft-user.s3.us-east-2.amazonaws.com/images/47cdd95f-23fb-486b-bd19-5fca67c2ce45.png', - tips: t('guideModal.step3.tips') - }, - { - id: 4, - title: t('guideModal.step4.title'), - description: t('guideModal.step4.description'), - image: 'https://draft-user.s3.us-east-2.amazonaws.com/images/690f2da4-400e-4cb0-a815-246e614d79b1.png', - tips: t('guideModal.step4.tips') - } + // { + // id: 3, + // title: t('guideModal.step3.title'), + // description: t('guideModal.step3.description'), + // image: 'https://draft-user.s3.us-east-2.amazonaws.com/images/47cdd95f-23fb-486b-bd19-5fca67c2ce45.png', + // tips: t('guideModal.step3.tips') + // }, + // { + // id: 4, + // title: t('guideModal.step4.title'), + // description: t('guideModal.step4.description'), + // image: 'https://draft-user.s3.us-east-2.amazonaws.com/images/690f2da4-400e-4cb0-a815-246e614d79b1.png', + // tips: t('guideModal.step4.tips') + // } ]); // 计算属性:当前步骤数据 @@ -312,7 +311,7 @@ const skipGuide = () => { position: relative; width: 100%; height: 100%; - max-height: 350px; + max-height:350px; border-radius: 16px; overflow: hidden; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); @@ -321,7 +320,7 @@ const skipGuide = () => { .guide-image { width: 100%; height: 100%; - object-fit: cover; + object-fit: contain; transition: transform 0.5s ease; } diff --git a/apps/frontend/src/components/HeaderComponent/HeaderComponent.vue b/apps/frontend/src/components/HeaderComponent/HeaderComponent.vue index cacc13d..edccff6 100644 --- a/apps/frontend/src/components/HeaderComponent/HeaderComponent.vue +++ b/apps/frontend/src/components/HeaderComponent/HeaderComponent.vue @@ -42,6 +42,9 @@ {{ t('header.remainingCredits') }}: {{ total_score }} +
import { ref, computed, nextTick, onMounted, onUnmounted } from 'vue' import { useI18n } from 'vue-i18n' +import { useRouter } from 'vue-router' import { Picture, MagicStick, ArrowLeft, Edit, Check, Guide } from '@element-plus/icons-vue' import { ElButton, ElIcon, ElInput } from 'element-plus' import ThemeToggle from '../ui/ThemeToggle.vue' @@ -79,14 +83,17 @@ const props = defineProps({ default: 'project' } }) -// 编辑相关状态 +const router = useRouter() +const { t, locale } = useI18n() + +const handleRecharge = () => { + router.push('/points-recharge') +} + const isEditing = ref(false) const editedProjectName = ref('') const editInput = ref(null) -// 国际化支持 -const { t, locale } = useI18n() - // 语言切换功能已由LanguageToggle组件内部处理 // 处理返回按钮点击 const handleBack = () => { @@ -412,6 +419,48 @@ html.dark .project-name-input :deep(.el-input__wrapper:focus) { white-space: nowrap; } +.recharge-btn { + display: flex; + align-items: center; + justify-content: center; + padding: 4px 10px; + border: none; + background-color: #6B46C1; + color: white; + border-radius: 6px; + cursor: pointer; + transition: all 0.3s ease; + font-size: 11px; + font-weight: 500; + margin-left: 4px; +} + +.recharge-btn:hover { + background-color: #7C3AED; + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(107, 70, 193, 0.3); +} + +.recharge-btn:active { + transform: translateY(0); +} + +.recharge-text { + font-size: 11px; + font-weight: 500; + color: white; + white-space: nowrap; +} + +html.dark .recharge-btn { + background-color: #8B5CF6; +} + +html.dark .recharge-btn:hover { + background-color: #A78BFA; + box-shadow: 0 2px 8px rgba(139, 92, 246, 0.4); +} + /* 指南按钮样式 */ .guide-btn { display: flex; @@ -508,6 +557,11 @@ html.dark .count-text { padding: 6px 10px; } + .recharge-btn { + padding: 3px 8px; + font-size: 10px; + } + .count-icon { font-size: 14px; } diff --git a/apps/frontend/src/components/IPCard/index copy.vue b/apps/frontend/src/components/IPCard/index copy.vue index 1dfb2f4..eb88676 100644 --- a/apps/frontend/src/components/IPCard/index copy.vue +++ b/apps/frontend/src/components/IPCard/index copy.vue @@ -15,7 +15,7 @@ ref="textInputRef" v-model="textInputValue" class="text-input-area" - placeholder="请输入文本内容..." + :placeholder="t('modelModal.textInputPlaceholder')" rows="4" @keydown.enter.ctrl="handleTextInputConfirm" @keydown.esc="handleTextInputCancel" @@ -53,6 +53,9 @@ +
@@ -71,6 +74,10 @@ + + @@ -80,6 +87,7 @@ import {cjt} from './tsc.js' // import cjimg from '@/assets/sketches/cjt.png'; import { computed, ref, onMounted, watch, nextTick } from 'vue'; +import { useI18n } from 'vue-i18n'; import { GiminiServer } from '@deotaland/utils'; // import humanTypeImg from '@/assets/sketches/tcww.png' // import humanTypeImg from '@/assets/sketches/tcww2.webp' @@ -87,8 +95,9 @@ import { GiminiServer } from '@deotaland/utils'; // import anTypeImg from '@/assets/sketches/dwww2.png'; // import cz2 from '@/assets/material/cz2.png'; // 引入Element Plus图标库和组件 -import { Cpu, ChatDotRound, CloseBold,Grid,View } from '@element-plus/icons-vue' +import { Cpu, ChatDotRound, CloseBold,Grid,View,EditPen } from '@element-plus/icons-vue' import { ElIcon,ElMessage,ElSkeleton,ElImage } from 'element-plus' +const { t } = useI18n(); const formData = ref({ internalImageUrl: '',//内部图片URL status:'loading',//状态 @@ -138,6 +147,12 @@ const handleTextcjt = ()=>{ cardData: props.cardData }); } +const handleCustomizeToHome = () => { + emit('customize-to-home', { + imageUrl: formData.value.internalImageUrl, + cardData: props.cardData + }); +} // 处理文本输入确认 const handleTextInputConfirm = () => { // 触发创建新卡片事件,传递用户输入的文本内容 @@ -173,7 +188,7 @@ const handleTouchEnd = () => { }; // 定义组件属性 const props = defineProps({ - combinedPromptJson:{ + combinedPromptJson:{//动态提示词 type: Object, default: () => ({}) }, @@ -210,8 +225,10 @@ const props = defineProps({ }); // 定义事件 -const emit = defineEmits(['generate-model-requested', 'create-new-card','create-prompt-card','delete','preview-image']); - +const emit = defineEmits(['generate-model-requested', 'create-new-card','create-prompt-card','delete','preview-image','customize-to-home','handlePartialEdit']); +const handlePartialEdit = ()=>{ + emit('handlePartialEdit', formData.value.internalImageUrl); +} // 处理图片生成 const handleGenerateImage = async () => { const iscjt = props?.cardData?.diyPromptText&&props?.cardData?.diyPromptText?.indexOf('[CJT_DEOTA]')!=-1; @@ -222,72 +239,32 @@ const handleGenerateImage = async () => { if (props?.cardData?.inspirationImage) { referenceImages.push(props.cardData.inspirationImage); } - if(props?.cardData?.ipType){ - if(props?.cardData?.ipType==1){ - humanTypeImg&&referenceImages.push(humanTypeImg); - }else{ - anTypeImg&&referenceImages.push(anTypeImg); - } - } if(iscjt){ props.cardData.imgyt&&referenceImages.push(props.cardData.imgyt); referenceImages.push(props.cardData.diyPromptImg); referenceImages.push(cjimg); - } - // if(props.cardData.diyPromptText){ - // console.log(props.cardData.diyPromptImg,'diyPromptImgdiyPromptImgdiyPromptImg'); - // referenceImages.push(props.cardData.diyPromptImg); - // if(iscjt){ - // props.cardData.imgyt&&referenceImages.push(props.cardData.imgyt); - // referenceImages.push(cjimg); - // } - // }else{ - // referenceImages.push(humanTypeImg); - // referenceImages.push(anTypeImg); - // } - // referenceImages.push(cz2); - // referenceImages.push(humanTypeImg); - // if(props?.cardData?.selectedExpression){ - // referenceImages.push(props.cardData.selectedExpression.imageUrl); - // } - // 忽略第二张参考图 - let prompt = props.cardData.diyPromptText|| ` - 首先保证生成的角色符合以下要求 - 角色肤色和衣服材质都为纯色一种颜色如下: - 重点:保证角色所有的服饰衣服都为木头材质颜色,并且要带一些木头纹理,颜色为#e2cfb3 - 一个通体由单一纯色木材雕刻而成的角色,全身无布料、无皮肤、无金属,表面光滑,颜色均匀一致,无纹理变化,整体呈现木质雕塑或木偶风格,极简设计. - A full-body character portrait - 角色特征:Q 版萌系造型,头身比例夸张(大头小身),神态纯真,服饰设计融合童话风与复古感(简化一下复杂衣服纹理,只保留特征). - Style:潮玩盲盒角色设计,采用 3D 立体建模渲染,呈现细腻的质感与精致的细节。 - ${props?.cardData?.prompt? `Appearance: ${props?.cardData?.prompt}.`:``} - Note: The image should not have white borders. - 去除原图中复杂的背景,只保留人物角色的主体。 - 适配3D打印:请保持服装边缘、装饰等细节略微加厚、避免过细结构,以提高打印稳定性,手指头轮廓清晰,重点:保证角色全身包括衣服都为木头材质颜色,并且要带一些木头纹理,颜色为#e2cfb3。 - 【3D打印结构优化】 - 模型用于3D打印,必须保持结构厚实、稳定,无细小悬空部件或过薄结构。 - 不生成透明或复杂内构。 - 保持厚度和连贯性,适合打印。 - 【材质处理】 - 整体需光滑、稳固、边缘柔和,防止打印时断裂。 - 模型应呈现专业3D效果。 - ${props.cardData?.ipType==1?` - 调整角色的发型,使其厚实、蓬松且结构坚固,轮廓清晰扎实,适合3D打印。 - 确保头发具备足够的厚度与结构完整性,避免在打印过程中出现脆弱断裂,同时保留原有的可爱美感。 - 头发纹理细节需针对3D制造进行优化——层次平滑且分明,兼顾视觉吸引力与可打印性,维持整体俏皮且高品质的盲盒角色风格。 - `:`采用疯狂动物城的设计风格`} - 调整背景为极简风格,换成中性纯白色,让图片中的人物呈现3D立体效果。 - 保证生成的图片一定要有眼睛,一定要有嘴巴,眼睛效果要可爱童真,Q版大眼睛。 - 角色肤色和衣服材质都为纯色一种颜色如下: - 保证角色全身都为木头材质颜色,并且要带一些木头纹理,颜色为#e2cfb3。 - 衣服如果不适合做木制一定要简化衣服,不能用复杂的衣服设计,保留衣服特征即可,衣服一定要纯色木质材质。 - 保证角色所有的服饰衣服都为木头材质颜色,并且要带一些木头纹理,颜色为#e2cfb3。 - ` - ; + } + if(props.cardData.diyPromptText){ + referenceImages.push(props.cardData.diyPromptImg); + } + let dtprompt; + if(props?.cardData?.ipType==1){ + dtprompt = props.combinedPromptJson.person.content; + referenceImages.push(...props.combinedPromptJson.person.imgs); + }else if(props?.cardData?.ipType==2){ + dtprompt = props.combinedPromptJson.animal.content; + referenceImages.push(...props.combinedPromptJson.animal.imgs); + } + if(props.cardData.prompt){ + dtprompt = `角色外观:${props.cardData.prompt}.${dtprompt}` + } + let prompt = props.cardData.diyPromptText|| dtprompt // 角色姿势:${props.cardData.ipType==1?``:``} - if(props.cardData.prompt&&props.cardData.prompt.indexOf('nospec')!=-1){ prompt = '按原图生成' referenceImages = [props.cardData.inspirationImage]; + formData.value.internalImageUrl = props?.cardData?.inspirationImage; + return } const taskResult = await giminiServer.handleGenerateImage(referenceImages, prompt,{ project_id: props.cardData.project_id, @@ -301,6 +278,7 @@ const handleGenerateImage = async () => { formData.value.status = 'success'; saveProject(); } catch (error) { + console.log(error); emit('delete'); } }; @@ -686,6 +664,77 @@ const handleImageLoad = (event) => { border: 2px solid rgba(167, 139, 250, 0.2); } +.ip-card-image { + width: 100%; + height: 100%; + display: block; +} + +.customize-to-home-btn { + position: absolute; + bottom: 16px; + left: 50%; + transform: translateX(-50%); + min-width: 120px; + padding: 10px 24px; + border-radius: 8px; + border: 1px solid rgba(139, 92, 246, 0.25); + background: rgba(107, 70, 193, 0.9); + color: #ffffff; + font-size: 14px; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + font-weight: 500; + cursor: pointer; + transition: all 0.3s ease; + opacity: 0; + pointer-events: none; + backdrop-filter: blur(8px); + box-shadow: 0 4px 16px rgba(107, 70, 193, 0.3); + z-index: 5; + white-space: nowrap; +} + +.ip-card-container:hover .customize-to-home-btn, +.ip-card-container.controls-visible .customize-to-home-btn { + opacity: 1; + pointer-events: auto; +} + +.customize-to-home-btn:hover { + background: rgba(139, 92, 246, 1); + border-color: rgba(139, 92, 246, 0.5); + box-shadow: 0 6px 20px rgba(107, 70, 193, 0.4); + transform: translateX(-50%) translateY(-2px); +} + +:global(.dark) .customize-to-home-btn { + background: rgba(139, 92, 246, 0.85); + border-color: rgba(167, 139, 250, 0.4); + box-shadow: 0 4px 16px rgba(139, 92, 246, 0.4); +} + +:global(.dark) .customize-to-home-btn:hover { + background: rgba(167, 139, 250, 0.95); + border-color: rgba(167, 139, 250, 0.6); + box-shadow: 0 6px 20px rgba(139, 92, 246, 0.5); +} + +@media (hover: none) and (pointer: coarse) { + .ip-card-container:active .customize-to-home-btn, + .ip-card-container.controls-visible .customize-to-home-btn { + opacity: 1; + pointer-events: auto; + } +} + +@media (max-width: 768px) { + .customize-to-home-btn { + padding: 8px 20px; + font-size: 13px; + bottom: 12px; + } +} + /* 右侧控件容器 - 使用绝对定位避免布局重排 */ .right-controls-container { position: absolute; diff --git a/apps/frontend/src/components/IPCard/index.vue b/apps/frontend/src/components/IPCard/index.vue index eb88676..d70558b 100644 --- a/apps/frontend/src/components/IPCard/index.vue +++ b/apps/frontend/src/components/IPCard/index.vue @@ -53,31 +53,43 @@ - - -
- -
- - - - - + + -
@@ -95,7 +107,7 @@ import { GiminiServer } from '@deotaland/utils'; // import anTypeImg from '@/assets/sketches/dwww2.png'; // import cz2 from '@/assets/material/cz2.png'; // 引入Element Plus图标库和组件 -import { Cpu, ChatDotRound, CloseBold,Grid,View,EditPen } from '@element-plus/icons-vue' +import { Cpu, ChatDotRound, CloseBold,Grid,View,EditPen,Download,Delete } from '@element-plus/icons-vue' import { ElIcon,ElMessage,ElSkeleton,ElImage } from 'element-plus' const { t } = useI18n(); const formData = ref({ @@ -225,10 +237,17 @@ const props = defineProps({ }); // 定义事件 -const emit = defineEmits(['generate-model-requested', 'create-new-card','create-prompt-card','delete','preview-image','customize-to-home','handlePartialEdit']); +const emit = defineEmits(['generate-model-requested', 'create-new-card','create-prompt-card','delete','preview-image','customize-to-home','handlePartialEdit','download-image','delete-card']); const handlePartialEdit = ()=>{ emit('handlePartialEdit', formData.value.internalImageUrl); } +//删除 +const handleDeleteCard = ()=>{ + emit('delete-card'); +} +const downloadImage = async ()=>{ + emit('download-image', formData.value.internalImageUrl); +} // 处理图片生成 const handleGenerateImage = async () => { const iscjt = props?.cardData?.diyPromptText&&props?.cardData?.diyPromptText?.indexOf('[CJT_DEOTA]')!=-1; @@ -735,90 +754,107 @@ const handleImageLoad = (event) => { } } -/* 右侧控件容器 - 使用绝对定位避免布局重排 */ -.right-controls-container { +/* 上侧控件容器 - 使用绝对定位避免布局重排 */ +.top-controls-container { position: absolute; - left: 100%; - top: 50%; - transform: translateY(-50%); - margin-left: 24px; + top: 100%; + left: 50%; + transform: translateX(-50%); + margin-top: 16px; z-index: 10; } -/* 右侧圆形按钮控件 */ -.right-circular-controls { +/* 上侧按钮控件 */ +.top-controls { display: flex; - flex-direction: column; - align-items: flex-start; - gap: 16px; + align-items: center; + gap: 12px; + padding: 12px 16px; + background: linear-gradient(135deg, rgba(107, 70, 193, 0.95) 0%, rgba(139, 92, 246, 0.9) 100%); + border-radius: 12px; + border: 1px solid rgba(167, 139, 250, 0.3); + box-shadow: 0 8px 24px rgba(107, 70, 193, 0.3); opacity: 0; - transform: translateX(-20px); + transform: translateY(-10px); transition: all 0.3s ease; pointer-events: none; + backdrop-filter: blur(8px); } /* 当鼠标悬停在卡片容器上时显示控件 */ -.ip-card-container:hover .right-circular-controls { +.ip-card-container:hover .top-controls { opacity: 1; - transform: translateX(0); + transform: translateY(0); pointer-events: auto; } -/* 在 iPad 及更大触控屏上,按下即显示右侧圆形控件 */ +/* 在 iPad 及更大触控屏上,按下即显示上侧控件 */ @media (hover: none) and (pointer: coarse) { - .ip-card-container:active .right-circular-controls, - .ip-card-container.controls-visible .right-circular-controls { + .ip-card-container:active .top-controls, + .ip-card-container.controls-visible .top-controls { opacity: 1; - transform: translateX(0); + transform: translateY(0); pointer-events: auto; } } /* 非触控设备保持 hover 显示 */ @media (hover: hover) { - .ip-card-container:hover .right-circular-controls { + .ip-card-container:hover .top-controls { opacity: 1; - transform: translateX(0); + transform: translateY(0); pointer-events: auto; } } + /* 移动端适配:点击卡片后显示功能按钮 */ @media (max-width: 1024px) { /* 点击卡片容器时显示功能按钮 */ - .ip-card-container:active .right-circular-controls, - .ip-card-container.controls-visible .right-circular-controls { + .ip-card-container:active .top-controls, + .ip-card-container.controls-visible .top-controls { opacity: 1; - transform: translateX(0); + transform: translateY(0); pointer-events: auto; } } -.control-button { - width: 48px; - height: 48px; - border-radius: 50%; - background: linear-gradient(135deg, rgba(167, 139, 250, 0.15) 0%, rgba(107, 70, 193, 0.1) 100%); - border: 1px solid rgba(167, 139, 250, 0.3); - color: #A78BFA; +.control-item { display: flex; align-items: center; - justify-content: center; + gap: 6px; + padding: 8px 12px; + border-radius: 8px; + background: rgba(255, 255, 255, 0.15); + border: 1px solid rgba(255, 255, 255, 0.2); + color: #ffffff; cursor: pointer; transition: all 0.3s ease; + font-size: 13px; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; } -.control-button:hover { - background: linear-gradient(135deg, rgba(167, 139, 250, 0.25) 0%, rgba(107, 70, 193, 0.2) 100%); +.control-item:hover { + background: rgba(255, 255, 255, 0.25); + border-color: rgba(255, 255, 255, 0.4); transform: translateY(-2px); - box-shadow: 0 4px 12px rgba(167, 139, 250, 0.3); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); } -.control-button:active { +.control-item:active { transform: translateY(0); } -.btn-icon { - font-size: 20px; +.control-text { + font-size: 13px; + font-weight: 500; + white-space: nowrap; +} + +.control-icon { + font-size: 18px; + display: flex; + align-items: center; + justify-content: center; } .ip-card:hover { @@ -1016,21 +1052,32 @@ const handleImageLoad = (event) => { transform: none; } - .right-controls-container { + .top-controls-container { position: static; transform: none; - margin-left: 0; margin-top: 16px; } - .right-circular-controls { - flex-direction: row; + .top-controls { + flex-wrap: wrap; justify-content: center; - align-items: center; - margin-bottom: 16px; opacity: 1; transform: none; pointer-events: auto; + padding: 10px 12px; + } + + .control-item { + padding: 6px 10px; + font-size: 12px; + } + + .control-text { + font-size: 12px; + } + + .control-icon { + font-size: 16px; } .right-actions-controls { diff --git a/apps/frontend/src/components/SeriesSelector.vue b/apps/frontend/src/components/SeriesSelector.vue index b74b0b2..b70205b 100644 --- a/apps/frontend/src/components/SeriesSelector.vue +++ b/apps/frontend/src/components/SeriesSelector.vue @@ -258,7 +258,8 @@ onMounted(()=>{ border-radius: 12px; margin-bottom: 16px; position: relative; - background: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%); + /* background: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%); */ + background-color: #fdfdfd; display: flex; align-items: center; justify-content: center; diff --git a/apps/frontend/src/components/iPandCardLeft/index.vue b/apps/frontend/src/components/iPandCardLeft/index.vue index 883a24b..0e03bdf 100644 --- a/apps/frontend/src/components/iPandCardLeft/index.vue +++ b/apps/frontend/src/components/iPandCardLeft/index.vue @@ -800,9 +800,11 @@ const handleFileChange = async (event) => { try { const imgUrl = await filePlug.uploadFile(file); formData.value.previewImage = imgUrl; + window?.closeMethods.close(); } catch (error) { console.error('图片上传失败:', error); ElMessage.error('图片上传失败,请重试'); + window?.closeMethods.close(); } finally { isUploading.value = false; } diff --git a/apps/frontend/src/components/layout/AppSidebar.vue b/apps/frontend/src/components/layout/AppSidebar.vue index ca731ef..4d7d510 100644 --- a/apps/frontend/src/components/layout/AppSidebar.vue +++ b/apps/frontend/src/components/layout/AppSidebar.vue @@ -643,7 +643,7 @@ onUnmounted(() => { left: 0; top: 0; height: 100vh; - z-index: 1000; + z-index: 20; transform: translateX(-100%); box-shadow: 4px 0 24px rgba(107, 70, 193, 0.2); /* transition: transform 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); */ diff --git a/apps/frontend/src/components/layout/MainLayout.vue b/apps/frontend/src/components/layout/MainLayout.vue index cbbcd8f..7f49917 100644 --- a/apps/frontend/src/components/layout/MainLayout.vue +++ b/apps/frontend/src/components/layout/MainLayout.vue @@ -244,7 +244,7 @@ watch(() => window.location.pathname, () => { top: 0; /* left: -120px; */ transform: translateX(-100%); - z-index: 999; + z-index: 99; transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); width: 60px; } diff --git a/apps/frontend/src/locales/index copy.js b/apps/frontend/src/locales/index copy.js deleted file mode 100644 index 2cfdc90..0000000 --- a/apps/frontend/src/locales/index copy.js +++ /dev/null @@ -1,2252 +0,0 @@ -const savedLang = localStorage.getItem('lang') || 'cn' - -export default { - legacy: false, - locale: savedLang, - fallbackLocale: 'en', - messages: { - zh: { - app: { - title: 'DeotalandAI', - home: '首页', - list: '列表示例', - theme_light: '浅色', - theme_dark: '深色', - lang_zh: '中文', - lang_en: '英文', - }, - breadcrumb: { - home: '首页', - login: '登录', - register: '注册', - forgotPassword: '忘记密码', - modelPurchase: '模型购买' - }, - sidebar: { - dashboard: '仪表盘', - analytics: '数据分析', - notifications: '通知', - textCreation: '文本创作', - imageCreation: '图像生成', - videoCreation: '视频制作', - chatAi: 'AI对话', - projects: '项目', - gallery: '画廊', - orders: '订单', - orderManagement: '订单', - apiKeys: 'API密钥', - settings: '设置', - mainMenu: '主要菜单', - creationMenu: '创作工具', - managementMenu: '管理', - expand: '展开侧边栏', - collapse: '折叠侧边栏', - creationWorkspace: '项目', - projectGallery: '画廊', - deviceSettings: '设置', - agentManagement: { - title: '智能体', - description: '管理和配置您的AI智能体', - createAgent: '创建智能体', - createTitle: '创建智能体', - name: '智能体名称', - namePlaceholder: '请输入智能体名称', - nameRequired: '请输入智能体名称', - modelPlaceholder: '请选择语言模型', - filters: { - status: '状态筛选', - search: '搜索智能体', - sort: '排序方式', - category: '分类筛选' - }, - searchPlaceholder: '搜索智能体名称、描述...', - stats: { - totalAgents: '智能体总数', - online: '在线', - offline: '离线', - totalConversations: '总对话数' - }, - agentsList: '智能体列表', - actions: { - view: '查看详情', - edit: '编辑', - delete: '删除', - configure: '配置', - more: '更多操作', - connect: '连接设备', - test: '测试对话' - }, - empty: { - title: '暂无智能体', - description: '您还没有创建任何智能体', - action: '创建智能体' - }, - status: { - all: '全部', - active: '活跃', - inactive: '未激活', - maintenance: '维护中' - }, - sort: { - name: '名称', - created_at: '创建时间', - lastActive: '最后活跃', - status: '状态' - }, - category: { - all: '全部分类', - assistant: '助手', - customerService: '客服', - content: '内容', - education: '教育', - business: '商业' - }, - form: { - name: '智能体名称', - description: '描述', - category: '分类', - model: '模型', - prompt: '系统提示', - temperature: '温度', - maxTokens: '最大令牌数', - status: '状态', - active: '激活', - inactive: '未激活' - }, - dialog: { - createTitle: '创建智能体', - editTitle: '编辑智能体', - deviceBindTitle: '绑定设备' - } - } - }, - modelModal: { - customizeToHome: '定制到家' - }, - orderProcess: { - title: '定制到家流程', - subtitle: '了解您的订单从支付到发货的全过程', - note: '注意:以上时间为工作日计算,节假日可能会顺延。如有问题,请联系客服: ', - acknowledge: '我已知晓', - steps: { - payment: { - title: '支付订单', - description: '选择支付方式完成订单支付,支付成功后订单将进入审核状态。', - time: '即时处理' - }, - review: { - title: '订单审核', - description: '后台将审核订单对应的模型是否可以制作,审核通过后进入排期生产,审核不通过将自动退款。', - time: '1-2个工作日' - }, - scheduling: { - title: '生产排期', - description: '审核通过后,订单将进入生产排期队列,等待生产开始。', - time: '1个工作日' - }, - production: { - title: '模型制作', - description: '专业团队使用高精度3D打印机制作您的定制模型,确保每个细节都完美呈现。', - time: '7-10个工作日' - }, - inspection: { - title: '产品检测包装', - description: '模型制作完成后,将进行产品质量检测和零件整理包装,确保产品完好无损。', - time: '1个工作日' - }, - shipping: { - title: '物流发货', - description: '包装完成后将通过顺丰速运发货,您将收到包含跟踪号码的邮件通知。', - time: '1-3个工作日' - } - } - }, - header: { - searchPlaceholder: '搜索功能、内容或帮助...', - notifications: '通知', - profile: '个人资料', - settings: '设置', - logout: '退出登录', - logoutConfirm: '确定要退出登录吗?', - logoutSuccess: '退出登录成功', - viewProfile: '查看个人资料', - accountSettings: '账户设置', - languageSettings: '语言设置', - themeSettings: '主题设置', - projectName: '数字创作平台', - projectNamePlaceholder: '请输入项目名称', - editProjectName: '编辑项目名称', - saveProjectName: '保存', - imageFreeCount: '生图免费', - modelFreeCount: '模型免费', - times: '次', - guide: '使用指南', - back: '返回', - skip: '跳过', - next: '下一步', - previous: '上一步', - startCreating: '开始创作', - skipGuide: '跳过引导', - step: '步骤' - }, - roles: { - creator: '创作者', - admin: '管理员', - viewer: '访客' - }, - home: { - welcome: '欢迎使用 Vue3 + Element Plus 模板', - description: '统一设计、国际化与性能优化已集成。', - floatingCards: { - orders: '订单', - settings: '智能体', - gallery: '画廊' - }, - welcome: { - title: '欢迎回来,{name}', - defaultName: '创作者', - subtitle: '今天想创作什么精彩内容?', - greetingMessage: '欢迎回到你的创意空间,今天想创造什么呢?', - startCreating: '开始创作', - loginToStart: '登录开始创作', - register: '免费注册', - clickToLogin: '点击登录' - }, - stats: { - creations: '创作作品', - credits: '创作积分', - hours: '创作时长', - projects: '项目数量' - }, - features: { - title: '创作工具', - textCreation: '文本创作', - textCreationDesc: '使用AI生成高质量文本内容,支持多种风格和语言', - imageCreation: '图像生成', - imageCreationDesc: '基于文本描述创建精美图像,支持多种艺术风格', - videoCreation: '视频制作', - videoCreationDesc: '将文本和图像转换为动态视频内容', - chatAi: 'AI对话', - chatAiDesc: '与智能AI助手进行创意对话和头脑风暴', - analytics: '数据分析', - analyticsDesc: '查看创作数据统计和趋势分析', - templates: '模板库', - templatesDesc: '使用专业模板快速开始创作', - tryNow: '立即体验', - create: { - title: '智能创作', - desc: 'AI驱动的创意内容生成平台' - }, - orders: { - title: '订单管理', - desc: '查看和管理您的所有订单' - }, - settings: { - title: '系统设置', - desc: '个性化配置您的创作环境' - }, - gallery: { - title: '作品画廊', - desc: '浏览和分享您的创意作品' - } - }, - recentActivity: { - title: '最近活动', - viewAll: '查看全部', - textCreated: '文本创作', - textCreatedDesc: '创作了一篇关于人工智能的文章', - imageGenerated: '图像生成', - imageGeneratedDesc: '生成了一幅未来城市概念图', - videoCreated: '视频制作', - videoCreatedDesc: '制作了一个产品介绍视频', - chatSession: 'AI对话', - chatSessionDesc: '与AI助手进行了创意讨论', - minutesAgo: '{count} 分钟前', - hoursAgo: '{count} 小时前', - daysAgo: '{count} 天前' - }, - creationWorkspace: { - title: '工作区', - description: '开始您的创意之旅,从这里创造令人惊叹的内容', - placeholder: { - title: '项目创作', - description: '选择或创建一个项目,开始您的创作之旅' - } - }, - projectGallery: { - title: '项目画廊', - description: '浏览和管理您的所有创作项目', - placeholder: { - title: '项目画廊', - description: '您的所有创作项目将在这里展示' - } - }, - - deviceSettings: { - title: '智能体', - description: '配置您的设备偏好和连接设置', - placeholder: { - title: '智能体', - description: '个性化您的设备体验和连接偏好' - } - }, - createProject: { - title: '创建项目', - description: '开始一个全新的创作项目', - placeholder: { - title: '创建新项目', - description: '选择项目模板或从零开始创建' - }, - backButton: '返回' - } - }, - guideModal: { - step1: { - title: '参考图片', - description: '选择您喜欢的图片作为创作参考', - tips: '点击生成按钮后,平台会根据您的选择生成相应的3D模型。' - }, - step2: { - title: '模型生成/文字优化', - description: '根据您的参考图片,平台会生成对应的3D模型。', - tips: '您也可以输入文字描述,平台会根据您的需求进行图片优化。' - }, - step3: { - title: '查看详情', - description: '点击查看详情按钮,您可以查看更多关于您创作的3D模型的信息。', - tips: '' - }, - step4: { - title: '定制到家', - description: '根据您的需求,平台会为您定制专属的3D模型机器人,确保符合您的要求。', - tips: '您可以优先在智能体中配置模型角色' - } - }, - list: { - title: '虚拟滚动列表示例', - }, - agentManagement: { - title: '智能体', - description: '管理和配置您的AI智能体', - createAgent: '创建智能体', - createTitle: '创建智能体', - name: '智能体名称', - namePlaceholder: '请输入智能体名称', - nameRequired: '请输入智能体名称', - modelPlaceholder: '请选择语言模型', - filters: { - status: '状态筛选', - search: '搜索智能体', - sort: '排序方式', - category: '分类筛选' - }, - searchPlaceholder: '搜索智能体名称、描述...', - stats: { - totalAgents: '智能体总数', - online: '在线', - offline: '离线', - totalConversations: '总对话数' - }, - agentsList: '智能体列表', - actions: { - view: '查看详情', - edit: '编辑', - delete: '删除', - configure: '配置', - more: '更多操作', - connect: '连接设备', - test: '测试对话' - }, - empty: { - title: '暂无智能体', - description: '您还没有创建任何智能体', - action: '创建智能体' - }, - status: { - all: '全部', - active: '活跃', - inactive: '未激活', - maintenance: '维护中' - }, - sort: { - name: '名称', - created_at: '创建时间', - lastActive: '最后活跃', - status: '状态' - }, - category: { - all: '全部分类', - assistant: '助手', - customerService: '客服', - content: '内容', - education: '教育', - business: '商业' - }, - form: { - name: '智能体名称', - description: '描述', - category: '分类', - model: '模型', - prompt: '系统提示', - temperature: '温度', - maxTokens: '最大令牌数', - status: '状态', - active: '激活', - inactive: '未激活' - }, - dialog: { - createTitle: '创建智能体', - editTitle: '编辑智能体', - deviceBindTitle: '绑定设备' - }, - pageTitle: '智能体管理', - addAgent: '添加智能体', - editAgent: '编辑', - rebindDevice: '绑定设备', - bindDevice: '绑定设备', - deleteAgent: '删除', - character: '角色', - llmModel: '语言模型', - deviceCount: '已绑设备', - notSet: '未设置', - loading: '加载中...', - noAgents: '暂无智能体', - bindDeviceTitle: '绑定设备', - enterVerificationCode: '请输入设备上显示的6位验证码:', - verificationCodePlaceholder: '请输入6位验证码', - confirmBind: '确认绑定', - deleteConfirmTitle: '删除确认', - deleteConfirmContent: '您确定要删除智能体 "{agentName}" 吗?', - deleteWarning: '此操作不可恢复,所有相关数据将被永久删除。', - devices: '台设备' - }, - orderManagement: { - title: '订单', - description: '查看和管理您的购买和订阅信息', - createOrder: '创建订单', - filters: { - status: '状态筛选', - search: '搜索订单', - sort: '排序方式' - }, - searchPlaceholder: '搜索订单号、客户名称...', - stats: { - totalOrders: '总订单数', - pending: '待处理', - completed: '已完成', - revenue: '总收入' - }, - ordersList: '订单列表', - actions: { - view: '查看详情', - payNow: '立即支付', - pay: '立即支付', - cancel: '取消订单', - confirm: '确认收货', - more: '更多操作', - downloadInvoice: '下载发票', - viewTracking: '查看物流', - contactSeller: '联系卖家' - }, - empty: { - title: '暂无订单', - description: '您还没有任何订单记录', - action: '创建订单' - }, - refundStatus:{ - wtk:'无退款', - sqtk:'申请退款', - jjtk:'拒绝退款', - tytk:'同意退款', - ytk:'已退款' - }, - status: { - yjj:'已拒绝', - dsh:'待审核', - all: '全部', - pending: '待处理', - paid: '已支付', - processing: '处理中', - shipped: '已发货', - delivered: '已发货', - completed: '已完成', - cancelled: '已取消', - refunded: '已退款', - expired: '已过期', - shenhe:'待审核', - unsuccess:'已拒绝', - clz:'处理中', - dfh:'待发货' - }, - sort: { - created_at: '创建时间', - total: '订单总额', - status: '订单状态', - customer: '客户名称' - }, - order: { - products: '商品列表', - shipping: '收货信息', - recipient: '收件人', - phone: '联系电话', - address: '收货地址', - payment: '支付信息', - paymentMethod: '支付方式', - paymentStatus: '支付状态', - paidAt: '支付时间', - tracking: '物流信息', - courier: '快递公司', - trackingNumber: '快递单号' - }, - payment: { - pending: '待支付', - paid: '已支付', - failed: '支付失败', - refunded: '已退款' - }, - cancelConfirm: { - title: '取消订单', - message: '确定要取消此订单吗?此操作不可恢复。' - }, - cancelSuccess: '订单取消成功', - cancelFail: '订单取消失败', - countdown: { - remaining: '剩余支付时间', - expired: '已超时' - }, - expiredNotice: '订单已超时,无法支付,请重新下单' - }, - logistics: { - title: '物流状态', - trackingNumber: '快递单号', - carrierInfo: '承运信息', - carrier: '快递公司', - service: '服务类型', - estimatedDelivery: '预计送达', - currentLocation: '当前位置', - lastUpdate: '最后更新时间' - }, - login: { - divider_text: '或', - role_system: '角色系统', - creator_role: '创作者', - admin_role: '管理员', - viewer_role: '访客', - creator_desc: '完整系统访问权限,包括用户管理和系统配置', - admin_desc: '内容管理和用户管理权限', - viewer_desc: '基础功能访问权限', - theme_toggle_tooltip: '切换到深色主题', - theme_toggle_tooltip_light: '切换到浅色主题', - language_toggle_tooltip: '切换到英文', - login_success: '登录成功', - login_error: '登录失败', - google_login: '使用 Google 登录', - google_logging: '正在登录...', - email_login: '登录', - email_logging: '正在登录...', - email_placeholder: '请输入您的邮箱', - password_placeholder: '请输入您的密码', - email_label: '邮箱地址', - password_label: '密码', - email_empty_error: '请输入邮箱地址', - email_invalid_error: '请输入有效的邮箱地址', - password_empty_error: '请输入密码', - password_min_error: '密码至少需要6位字符', - login_success_message: '登录成功!', - login_error_message: '登录失败', - google_login_success: 'Google 登录成功!', - google_login_error: 'Google 登录失败', - login_processing_error: '登录过程中发生错误', - google_login_processing_error: 'Google 登录过程中发生错误', - email_login_notice: '邮箱登录功能预留中,敬请期待', - theme_toggle_light: '切换到浅色主题', - theme_toggle_dark: '切换到深色主题', - forgot_password: '忘记密码?', - register_account: '注册账号', - }, - payment: { - methods: '支付方式', - methods: { - creditCard: '信用卡', - alipay: '支付宝', - wechat: '微信支付' - }, - orderSummary: '订单摘要', - subtotal: '小计', - tax: '税费', - shipping: '运费', - free: '免费', - total: '总计', - couponPlaceholder: '输入优惠码', - applyCoupon: '应用优惠券', - couponApplied: '优惠已应用', - couponSuccess: '优惠券应用成功', - invalidCoupon: '优惠券无效', - couponError: '优惠券处理失败', - payNow: '立即支付', - processing: '正在处理支付...', - stripeNotInitialized: 'Stripe 未初始化', - securityNotice: '您的支付信息将通过加密安全传输' - }, - checkout: { - customModel: '定制模型', - from: '起价', - configuration: '配置', - contact: '联系', - emailOrPhone: '邮箱/手机号', - subscribe: '给我发电子邮件,提供新闻和优惠', - shipping: '送货地址', - country: '国家/地区', - chooseCountry: '选择国家', - lastName: '姓', - firstName: '名字', - postalCode: '邮政编码', - state: '省/州', - chooseState: '选择省/州', - city: '城市', - address1: '地址', - address2: '公寓/套房', - phone: '电话', - saveInfo: '保存此信息以备下次使用', - size: '尺寸', - quantity: '数量', - ipName: 'IP名称', - ipNamePlaceholder: '请输入IP名称', - buy: '购买', - processTitle: '我们的流程如下', - orderConfirmation: '订单确认:在下单后的1个工作日内,我们会确认信息后开始处理。', - productionTime: '生产时间:生产周期为 5–15 个工作日,节假日可能顺延。', - logistics: '物流:发货后将提供订单与跟踪编号,物流信息会发送到您的邮箱。', - afterSales: '售后与退款:请参考退款政策;如有问题,请联系 ', - error: { - firstNameRequired: '名不能为空', - lastNameRequired: '姓不能为空', - postalCodeRequired: '邮政编码不能为空', - stateRequired: '省/州不能为空', - cityRequired: '城市不能为空', - address1Required: '地址不能为空', - phoneRequired: '电话不能为空', - emailOrPhoneRequired: '邮箱/手机号不能为空', - ipNameRequired: 'IP名称不能为空' - } - }, - agentTemplate: { - basicInfo: '基本信息', - assistantName: '唤醒词', - assistantNamePlaceholder: '请输入唤醒词', - selectTemplate: '选择模板', - selectTemplatePlaceholder: '请选择角色模板', - createCustom: '创建自定义', - dialogConfig: '对话配置', - language: '语言', - languagePlaceholder: '请选择语言', - modelPlaceholder: '请选择模型', - voice: '音色', - voicePlaceholder: '请选择音色', - playing: '正在播放', - listen: '试听', - pause: '暂停', - play: '播放', - model: '模型', - advancedConfig: '高级配置', - introduction: '角色介绍', - introductionPlaceholder: '请输入角色介绍,描述角色的性格、特点和行为方式', - aiOptimize: 'AI优化', - optimizationHistory: '优化历史', - version: '版本', - optimizationPreview: '优化预览', - original: '原始文本', - optimized: '优化后文本', - accept: '接受', - reject: '拒绝', - memoryType: '记忆类型', - memoryTypePlaceholder: '请选择记忆类型', - memoryContent: '记忆内容', - memoryContentPlaceholder: '请输入智能体的记忆内容,支持多行文本', - asrSpeed: '语音识别速度', - asrSpeedPlaceholder: '请选择语音识别速度', - ttsSpeechSpeed: '角色语速', - ttsSpeechSpeedPlaceholder: '请选择角色语速', - ttsPitch: '角色音调', - lowPitch: '低', - highPitch: '高', - slow: '慢', - normal: '正常', - fast: '快', - officialServices: '官方服务', - weather: '天气', - jokes: '笑话', - music: '音乐', - news: '新闻', - restartNotice: '重启提示', - restartDescription: '修改以下配置需要重启智能体才能生效', - restartEmphasis: '重启后,当前对话历史将被清空', - createCustomTitle: '创建自定义模板', - templateName: '模板名称', - templateNamePlaceholder: '请输入模板名称', - templateDescription: '模板描述', - templateDescriptionPlaceholder: '请输入模板描述', - defaultLanguage: '默认语言', - defaultVoice: '默认声音', - validation: { - nameRequired: '请输入智能体名称', - assistantNameRequired: '请输入唤醒词', - templateRequired: '请选择角色模板', - languageRequired: '请选择语言', - voiceRequired: '请选择音色', - modelRequired: '请选择模型', - introductionRequired: '请输入角色介绍', - introductionLength: '角色介绍长度应在10-2000个字符之间', - memoryTypeRequired: '请选择记忆类型', - asrSpeedRequired: '请选择语音识别速度', - ttsSpeechSpeedRequired: '请选择角色语速', - ttsPitchRequired: '请调整角色音调', - knowledgeBaseRequired: '请至少选择一个官方服务' - } - }, - agents: { - title: '智能体', - description: '管理您的智能体助手', - subtitle: '创建和管理您的AI智能体', - add: '添加智能体', - create: '创建智能体', - edit: '编辑智能体', - delete: '删除智能体', - save: '保存', - cancel: '取消', - confirm: '确认', - search: { - placeholder: '搜索智能体名称或描述...', - noResults: '未找到相关智能体' - }, - filters: { - all: '全部', - recent: '最近使用', - favorites: '收藏' - }, - list: { - title: '智能体列表', - subtitle: '管理您的AI助手集合', - empty: { - title: '还没有智能体', - description: '创建您的第一个智能体助手开始体验吧!', - action: '创建智能体' - }, - loading: '正在加载智能体...' - }, - card: { - role: '角色', - voice: '音色', - model: '模型', - lastChat: '最新对话', - noChat: '暂无对话记录', - boundDevice: '已绑定设备', - unboundDevice: '未绑定设备', - bindDevice: '绑定设备', - configRole: '配置角色', - edit: '编辑', - delete: '删除', - viewDetails: '查看详情' - }, - form: { - basicInfo: { - title: '基本信息', - name: '智能体名称', - namePlaceholder: '请输入智能体名称', - nameRequired: '请输入智能体名称', - description: '描述', - descriptionPlaceholder: '简要描述这个智能体的功能和特点', - avatar: '头像', - selectAvatar: '选择头像' - }, - role: { - title: '角色配置', - roleType: '角色类型', - personality: '性格特征', - expertise: '专业领域', - knowledgeBase: '知识库', - customPrompt: '自定义提示词', - systemPrompt: '系统提示词', - systemPromptPlaceholder: '定义智能体的行为和回答风格' - }, - voice: { - title: '音色配置', - voiceType: '音色类型', - voiceList: { - female1: '温柔女声', - female2: '知性女声', - male1: '磁性男声', - male2: '活力男声', - neutral1: '中性音色', - child1: '童声' - }, - speed: '语速', - pitch: '音调', - volume: '音量' - }, - model: { - title: '模型配置', - selectedModel: '选择模型', - modelConfig: '模型参数', - temperature: '创意度', - creativity: '创造性', - coherence: '逻辑性' - } - }, - device: { - title: '设备绑定', - bindTitle: '设备绑定', - unbindTitle: '解绑设备', - bindSuccess: '绑定成功', - unbindSuccess: '解绑成功', - bindFailed: '绑定失败', - unbindFailed: '解绑失败', - verifyCode: { - title: '验证设备', - codePlaceholder: '请输入6位验证码', - codeInvalid: '请输入正确的6位验证码', - expired: '验证码已过期', - resend: '重新获取验证码', - confirm: '确认绑定', - cancel: '取消', - sending: '正在发送验证码...', - success: '绑定成功', - error: '绑定失败' - }, - deviceList: '已绑定设备', - bindNew: '绑定新设备', - unbind: '解绑设备', - currentDevice: '当前设备', - bindingStatus: '绑定状态', - lastActive: '最后活跃', - deviceInfo: { - name: '设备名称', - type: '设备类型', - platform: '设备平台', - version: '版本号' - } - }, - actions: { - createSuccess: '智能体创建成功', - updateSuccess: '智能体更新成功', - deleteSuccess: '智能体删除成功', - saveSuccess: '保存成功', - loading: '正在处理...', - confirmDelete: '确定要删除这个智能体吗?', - deleteConfirm: '删除后无法恢复,请谨慎操作!', - operationFailed: '操作失败', - networkError: '网络连接失败' - }, - validation: { - nameRequired: '请输入智能体名称', - nameMaxLength: '名称不能超过50个字符', - descriptionMaxLength: '描述不能超过500个字符', - roleRequired: '请选择角色类型', - voiceRequired: '请选择音色', - modelRequired: '请选择语言模型' - }, - settings: { - general: '通用设置', - privacy: '隐私设置', - security: '安全设置', - advanced: '高级设置', - autoDelete: '自动删除', - exportData: '导出数据', - importData: '导入数据', - backup: '备份' - } - }, - // 中国省份中文映射 - cnProvinces: { - 'CN-BJ': 'Beijing', - 'CN-SH': 'Shanghai', - 'CN-TJ': 'Tianjin', - 'CN-CQ': 'Chongqing', - 'CN-HE': 'Hebei', - 'CN-SX': 'Shanxi', - 'CN-NM': 'Inner Mongolia', - 'CN-LN': 'Liaoning', - 'CN-JL': 'Jilin', - 'CN-HL': 'Heilongjiang', - 'CN-JS': 'Jiangsu', - 'CN-ZJ': 'Zhejiang', - 'CN-AH': 'Anhui', - 'CN-FJ': 'Fujian', - 'CN-JX': 'Jiangxi', - 'CN-SD': 'Shandong', - 'CN-HA': 'Henan', - 'CN-HB': 'Hubei', - 'CN-HN': 'Hunan', - 'CN-GD': 'Guangdong', - 'CN-GX': 'Guangxi Zhuang Autonomous Region', - 'CN-HI': 'Hainan', - 'CN-SC': 'Sichuan', - 'CN-GZ': 'Guizhou', - 'CN-YN': 'Yunnan', - 'CN-XZ': 'Tibet Autonomous Region', - 'CN-SN': 'Shaanxi', - 'CN-GS': 'Gansu', - 'CN-QH': 'Qinghai', - 'CN-NX': 'Ningxia Hui Autonomous Region', - 'CN-XJ': 'Xinjiang Uygur Autonomous Region', - 'CN-TW': 'Taiwan', - 'CN-HK': 'Hong Kong SAR', - 'CN-MO': 'Macau SAR' - }, - modelPurchase: { - inputLabel: '请填写模型链接或 ID', - inputPlaceholder: 'https://studio.tripo3d.ai/workspace/generate?project=... 或模型ID', - timeline: { - title: '订单状态', - orderPlaced: '已下单', - orderShipped: '已发货', - delivered: '已发货', - hint: '物流信息将通过邮件发送,您可随时查看订单状态' - } - }, - deviceList: { - pageTitle: '设备列表', - unnamedDevice: '未命名设备', - macAddress: 'MAC地址', - createdAt: '创建时间', - updatedAt: '更新时间', - unbindDevice: '解除绑定', - unbindConfirmTitle: '解除绑定确认', - unbindConfirmContent: '您确定要解除该设备的绑定吗?', - confirmUnbind: '确认解除绑定', - unbindSuccess: '设备解除绑定成功', - unbindFailed: '设备解除绑定失败', - loading: '加载中...', - loadingMore: '加载更多...', - noMoreDevices: '没有更多设备了', - noDevices: '暂无设备', - notSet: '未设置', - unknown: '未知' - }, - forgotPassword: { - title: '重置密码', - subtitle: '输入您的邮箱地址,我们将发送验证码来重置您的密码', - back_to_login: '返回登录', - remember_password: '记起密码了?', - login_now: '立即登录', - no_account: '还没有账号?', - register_now: '立即注册', - theme_toggle_tooltip: '切换到深色主题', - language_toggle_tooltip: '切换到英文', - email_label: '邮箱地址', - email_placeholder: '请输入邮箱地址', - verification_code_label: '验证码', - verification_code_placeholder: '请输入6位验证码', - verification_hint: '请输入6位数字验证码', - send_code: '发送验证码', - sending_code: '发送中...', - new_password_label: '新密码', - new_password_placeholder: '请输入新密码', - confirm_password_label: '确认新密码', - confirm_password_placeholder: '请再次输入新密码', - reset_password: '重置密码', - resetting: '重置中...', - email_empty_error: '请输入邮箱地址', - email_invalid_error: '请输入有效的邮箱地址', - verification_code_empty_error: '请输入验证码', - verification_code_invalid_error: '请输入有效的6位验证码', - new_password_empty_error: '请输入新密码', - new_password_min_error: '新密码至少需要6个字符', - confirm_password_empty_error: '请确认新密码', - confirm_password_mismatch_error: '两次输入的密码不一致', - verification_code_sent: '验证码发送成功', - verification_code_send_failed: '验证码发送失败', - reset_processing_error: '重置密码过程中发生错误', - resend_after: '重新发送', - resend_code: '重新发送', - reset_success: '密码重置成功', - reset_success_message: '您的密码已成功重置,请使用新密码登录', - password_weak: '弱', - password_fair: '一般', - password_good: '良好', - password_strong: '强', - password_very_strong: '非常强' - }, - register: { - title: '创建账号', - subtitle: '欢迎加入我们,开始您的创作之旅', - back_to_login: '返回登录', - has_account: '已有账号?', - login_now: '立即登录', - no_account: '还没有账号?', - register_now: '立即注册', - theme_toggle_tooltip: '切换到深色主题', - language_toggle_tooltip: '切换到英文', - email_label: '邮箱地址', - email_placeholder: '请输入邮箱地址', - password_label: '密码', - password_placeholder: '请输入密码', - verification_code_label: '验证码', - verification_code_placeholder: '请输入6位验证码', - send_code: '发送验证码', - sending_code: '发送中...', - register_button: '注册', - registering: '注册中...', - terms_agreement: '注册即表示您同意我们的', - terms_link: '服务条款', - and: '和', - privacy_link: '隐私政策', - email_empty_error: '请输入邮箱地址', - email_invalid_error: '请输入有效的邮箱地址', - password_empty_error: '请输入密码', - password_min_error: '密码至少需要6个字符', - password_strength_error: '密码必须包含字母和数字', - verification_code_empty_error: '请输入验证码', - verification_code_invalid_error: '请输入有效的6位验证码', - verification_code_sent: '验证码发送成功', - verification_code_send_failed: '验证码发送失败', - register_processing_error: '注册过程中发生错误' - }, - common: { - close: '关闭', - confirm: '确认', - yes: '是', - no: '否', - cancel: '取消', - generate: '生成', - back: '返回', - save: '保存', - create: '创建', - validation: { - referenceImageRequired: '请上传参考图像或选择草图以继续生成' - } - }, - iPandCardLeft: { - textPrompt: '文本提示', - placeholder: { - characterDescription: '请描述您想要创建的角色形象...' - }, - addReferenceImage: '添加参考图片', - uploadOrSelectImage: '上传或选择一张图片', - dragImageHere: '或拖拽图片到此处', - ipType: 'IP类型', - character: '人物', - animal: '动物', - characterImport: '角色导入', - expression: { - title: '表情选择', - description: '选择一个表情来丰富您的角色形象', - happy: '开心', - surprised: '惊讶', - smile: '微笑', - laugh: '大笑', - naughty: '调皮', - cool: '酷', - shy: '害羞', - angry: '生气', - thinking: '思考', - love: '爱心' - }, - hairColor: { - title: '发色选择', - description: '选择角色的发色', - black: '黑色', - brown: '棕色', - blonde: '金色', - red: '红色', - gray: '灰色', - white: '白色', - blue: '蓝色', - green: '绿色', - purple: '紫色', - pink: '粉色' - }, - skinColor: { - title: '肤色选择', - description: '选择角色的肤色', - fair: '白皙', - light: '浅色', - medium: '中等', - olive: '橄榄色', - tan: '古铜色', - brown: '深棕色', - dark: '深色' - }, - material: { - title: '材质选择', - description: '选择材质来提升您的设计质感', - metal: '白毛绒', - type: 'Metal' - }, - color: { - title: '颜色选择', - description: '为您的{{material}}材质选择一种颜色' - }, - electronicModule: '电子模块', - sketch: { - title: '草图选择', - description: '选择与您的{{module}}模块相匹配的草图' - }, - creativeStyle: '创意风格选择', - imageQuantity: '图片数量选择', - selectQuantity: '选择图片数量', - styles: { - general: '通用', - anime: '动漫', - realistic: '写实', - cyberpunk: '赛博朋克', - chinese: '国风', - pixel: '像素风' - } - }, - creationWorkspace: { - changeCover: '更换封面', - createNewProject: '创建新项目', - dropToDelete: '拖到此处删除', - dropToDeleteHint: '释放鼠标即可删除项目', - confirmDelete: '确认删除', - deleteProject: '删除项目', - cancel: '取消' - }, - loading: '加载中...', - allLoaded: '已加载全部数据', - emptyProjects: { - title: '暂无项目', - description: '您还没有创建任何项目,点击下方按钮开始创建吧', - action: '创建新项目' - } - }, - en: { - app: { - title: 'DeotalandAI', - home: 'Home', - list: 'List Demo', - theme_light: 'Light', - theme_dark: 'Dark', - lang_zh: 'Chinese', - lang_en: 'English', - }, - breadcrumb: { - home: 'Home', - login: 'Login', - register: 'Register', - forgotPassword: 'Forgot Password', - modelPurchase: { - inputLabel: 'Please fill in the model link or ID', - inputPlaceholder: 'https://studio.tripo3d.ai/workspace/generate?project=... or Model ID', - timeline: { - title: 'Order Status', - orderPlaced: 'Order Placed', - orderShipped: 'Order Shipped', - delivered: 'Shipped', - hint: 'Shipping information will be sent via email, you can check order status anytime' - } - } - }, - forgotPassword: { - title: 'Reset Password', - subtitle: 'Enter your email address and we will send you a verification code to reset your password', - back_to_login: 'Back to Login', - remember_password: 'Remember your password?', - login_now: 'Login Now', - no_account: 'No account yet?', - register_now: 'Register Now', - theme_toggle_tooltip: 'Switch to dark theme', - language_toggle_tooltip: 'Switch to Chinese', - email_label: 'Email Address', - email_placeholder: 'Enter your email', - verification_code_label: 'Verification Code', - verification_code_placeholder: 'Enter 6-digit verification code', - verification_hint: 'Please enter 6-digit numeric verification code', - send_code: 'Send Code', - sending_code: 'Sending...', - new_password_label: 'New Password', - new_password_placeholder: 'Enter new password', - confirm_password_label: 'Confirm New Password', - confirm_password_placeholder: 'Enter new password again', - reset_password: 'Reset Password', - resetting: 'Resetting...', - email_empty_error: 'Please enter email address', - email_invalid_error: 'Please enter a valid email address', - verification_code_empty_error: 'Please enter verification code', - verification_code_invalid_error: 'Please enter a valid 6-digit verification code', - new_password_empty_error: 'Please enter new password', - new_password_min_error: 'New password must be at least 6 characters', - confirm_password_empty_error: 'Please confirm new password', - confirm_password_mismatch_error: 'Passwords do not match', - verification_code_sent: 'Verification code sent successfully', - verification_code_send_failed: 'Failed to send verification code', - reset_processing_error: 'An error occurred during password reset processing', - resend_after: 'Resend after', - resend_code: 'Resend Code', - reset_success: 'Password Reset Successful', - reset_success_message: 'Your password has been successfully reset, please login with your new password', - password_weak: 'Weak', - password_fair: 'Fair', - password_good: 'Good', - password_strong: 'Strong', - password_very_strong: 'Very Strong' - }, - sidebar: { - dashboard: 'Dashboard', - analytics: 'Analytics', - notifications: 'Notifications', - textCreation: 'Text Creation', - imageCreation: 'Image Generation', - videoCreation: 'Video Creation', - chatAi: 'AI Chat', - projects: 'Projects', - gallery: 'Gallery', - orders: 'Orders', - orderManagement: 'Order', - apiKeys: 'API Keys', - settings: 'Settings', - mainMenu: 'Main Menu', - creationMenu: 'Creation Tools', - managementMenu: 'Management', - expand: 'Expand Sidebar', - collapse: 'Collapse Sidebar', - creationWorkspace: 'Projects', - projectGallery: 'Gallery', - deviceSettings: 'Settings', - agentManagement: { - title: 'Agents', - description: 'Manage and configure your AI agents', - createAgent: 'Create Agent', - createTitle: 'Create Agent', - name: 'Agent Name', - namePlaceholder: 'Enter agent name', - nameRequired: 'Please enter agent name', - modelPlaceholder: 'Select language model', - filters: { - status: 'Status Filter', - search: 'Search Agents', - sort: 'Sort By', - category: 'Category Filter' - }, - searchPlaceholder: 'Search agents by name or description...', - stats: { - totalAgents: 'Total Agents', - online: 'Online', - offline: 'Offline', - totalConversations: 'Total Conversations' - }, - agentsList: 'Agents List', - actions: { - view: 'View Details', - edit: 'Edit', - delete: 'Delete', - configure: 'Configure', - more: 'More Actions', - connect: 'Connect Device', - test: 'Test Conversation' - }, - empty: { - title: 'No Agents Found', - description: 'You have not created any agents yet', - action: 'Create Agent' - }, - status: { - all: 'All', - active: 'Active', - inactive: 'Inactive', - maintenance: 'Maintenance' - }, - sort: { - name: '名称', - created_at: 'Created At', - lastActive: 'Last Active', - status: 'Status' - }, - category: { - all: '全部分类', - assistant: 'Assistant', - customerService: 'Customer Service', - content: 'Content', - education: 'Education', - business: 'Business' - }, - form: { - name: 'Agent Name', - description: 'Description', - category: 'Category', - model: 'Model', - prompt: 'System Prompt', - temperature: 'Temperature', - maxTokens: 'Max Tokens', - status: 'Status', - active: 'Active', - inactive: 'Inactive' - }, - dialog: { - createTitle: 'Create Agent', - editTitle: 'Edit Agent', - deviceBindTitle: 'Bind Device', - bindSuccess: 'Device bound successfully', - bindFailed: 'Failed to bind device' - } - } - }, - - agentTemplate: { - basicInfo: 'Basic Information', - assistantName: 'wake word', - assistantNamePlaceholder: 'Enter wake word', - selectTemplate: 'Select Template', - selectTemplatePlaceholder: 'Please select a role template', - createCustom: 'Create Custom', - dialogConfig: 'Dialog Configuration', - language: 'Language', - languagePlaceholder: 'Select language', - voice: 'Voice', - voicePlaceholder: 'Select voice', - playing: 'Playing', - listen: 'Listen', - pause: 'Pause', - play: 'Play', - model: 'Model', - modelPlaceholder: 'Select model', - advancedConfig: 'Advanced Configuration', - introduction: 'Character Introduction', - introductionPlaceholder: 'Enter character introduction, describing personality, characteristics and behavior', - aiOptimize: 'AI Optimization', - optimizationHistory: 'Optimization History', - version: 'Version', - optimizationPreview: 'Optimization Preview', - original: 'Original Text', - optimized: 'Optimized Text', - accept: 'Accept', - reject: 'Reject', - memoryType: 'Memory Type', - memoryTypePlaceholder: 'Select memory type', - memoryContent: 'Memory Content', - memoryContentPlaceholder: 'Enter memory content for the agent, supports multi-line text', - asrSpeed: 'ASR Speed', - asrSpeedPlaceholder: 'Please select ASR speed', - ttsSpeechSpeed: 'Speech Speed', - ttsSpeechSpeedPlaceholder: 'Please select speech speed', - ttsPitch: 'Speech Pitch', - lowPitch: 'Low', - highPitch: 'High', - slow: 'Slow', - normal: 'Normal', - fast: 'Fast', - officialServices: 'Official Services', - weather: 'Weather', - jokes: 'Jokes', - music: 'Music', - news: 'News', - restartNotice: 'Restart Notice', - restartDescription: 'Modifying the following configurations requires restarting the agent to take effect:', - restartEmphasis: 'After restarting, the current conversation history will be cleared.', - createCustomTitle: 'Create Custom Template', - templateName: 'Template Name', - templateNamePlaceholder: 'Enter template name', - templateDescription: 'Template Description', - templateDescriptionPlaceholder: 'Enter template description', - defaultLanguage: 'Default Language', - defaultVoice: 'Default Voice', - validation: { - nameRequired: 'Please enter agent name', - assistantNameRequired: 'Please enter wake word', - templateRequired: 'Please select a role template', - languageRequired: 'Please select language', - voiceRequired: 'Please select voice', - modelRequired: 'Please select model', - introductionRequired: 'Please enter character introduction', - introductionLength: 'Character introduction should be between 10-2000 characters', - memoryTypeRequired: 'Please select memory type', - asrSpeedRequired: 'Please select ASR speed', - ttsSpeechSpeedRequired: 'Please select speech speed', - ttsPitchRequired: 'Please adjust speech pitch', - knowledgeBaseRequired: 'Please select at least one official service' - } - }, - guideModal: { - step1: { - title: 'Reference Image', - description: 'Select your preferred image as a creative reference', - tips: 'After clicking the generate button, the platform will generate the corresponding 3D model based on your selection.' - }, - step2: { - title: 'Model Generation/Text Optimization', - description: 'Based on your reference image, the platform will generate the corresponding 3D model.', - tips: 'You can also input text descriptions, and the platform will optimize the image according to your needs.' - }, - step3: { - title: 'View Details', - description: 'Click the view details button to see more information about your created 3D model.', - tips: '' - }, - step4: { - title: 'Customize to Home', - description: 'According to your needs, the platform will customize an exclusive 3D model robot for you to ensure it meets your requirements.', - tips: 'You can configure the model character in the agent first' - } - }, - deviceList: { - pageTitle: 'Device List', - unnamedDevice: 'Unnamed Device', - macAddress: 'MAC Address', - createdAt: 'Created At', - updatedAt: 'Updated At', - unbindDevice: 'Unbind Device', - unbindConfirmTitle: 'Unbind Confirmation', - unbindConfirmContent: 'Are you sure you want to unbind this device?', - confirmUnbind: 'Confirm Unbind', - unbindSuccess: 'Device unbound successfully', - unbindFailed: 'Failed to unbind device', - loading: 'Loading...', - loadingMore: 'Loading more...', - noMoreDevices: 'No more devices', - noDevices: 'No Devices', - notSet: 'Not Set', - unknown: 'Unknown' - }, - modelModal: { - customizeToHome: 'Customize to Home' - }, - orderProcess: { - title: 'Customize to Home Process', - subtitle: 'Understand the complete process from payment to delivery', - note: 'Note: The above times are calculated in working days. Holidays may cause delays. If you have any questions, please contact customer service: ', - acknowledge: 'I Acknowledge', - steps: { - payment: { - title: 'Payment', - description: 'Select a payment method to complete your order. After successful payment, the order will enter the review status.', - time: 'Instant processing' - }, - review: { - title: 'Order Review', - description: 'Our team will review whether the model corresponding to your order can be produced. If approved, it will enter production scheduling; if rejected, the order will be automatically refunded.', - time: '1-2 business days' - }, - scheduling: { - title: 'Production Scheduling', - description: 'After approval, your order will enter the production queue and wait for production to begin.', - time: '1 business day' - }, - production: { - title: 'Model Creation', - description: 'Our professional team will use high-precision 3D printers to create your custom model, ensuring every detail is perfectly presented.', - time: '7-10 business days' - }, - inspection: { - title: 'Product Inspection & Packaging', - description: 'After the model is completed, we will conduct product quality inspection and parts packaging to ensure the product is intact.', - time: '1 business day' - }, - shipping: { - title: 'Shipping', - description: 'Once packaged, your order will be shipped via SF Express. You will receive an email notification with a tracking number.', - time: '1-3 business days' - } - } - }, - header: { - searchPlaceholder: 'Search features, content or help...', - notifications: 'Notifications', - profile: 'Profile', - settings: 'Settings', - logout: 'Logout', - logoutConfirm: 'Are you sure you want to logout?', - logoutSuccess: 'Logout successful', - viewProfile: 'View Profile', - accountSettings: 'Account Settings', - languageSettings: 'Language Settings', - themeSettings: 'Theme Settings', - projectName: 'Digital Creation Platform', - projectNamePlaceholder: 'Please enter project name', - editProjectName: 'Edit Project Name', - saveProjectName: 'Save', - imageFreeCount: 'Image Free', - modelFreeCount: 'Model Free', - times: 'times', - guide: 'User Guide', - back: 'Back', - skip: 'Skip', - next: 'Next', - previous: 'Previous', - startCreating: 'Start Creating', - skipGuide: 'Skip Guide', - step: 'Step' - }, - roles: { - creator: 'Creator', - admin: 'Admin', - viewer: 'Viewer' - }, - home: { - welcome: 'Welcome to Vue3 + Element Plus template', - description: 'Design system, i18n, and performance optimizations integrated.', - floatingCards: { - orders: 'Orders', - settings: 'Agent', - gallery: 'Gallery' - }, - welcome: { - title: 'Welcome back, {name}', - defaultName: 'Creator', - subtitle: 'What amazing content will you create today?', - greetingMessage: 'Welcome back to your creative space, what would you like to create today?', - startCreating: 'Start Creating', - loginToStart: 'Login to Start Creating', - register: 'Free Register', - clickToLogin: 'Click to Login' - }, - stats: { - creations: 'Creations', - credits: 'Credits', - hours: 'Hours', - projects: 'Projects' - }, - features: { - title: 'Creation Tools', - textCreation: 'Text Creation', - textCreationDesc: 'Generate high-quality text content with AI, supporting multiple styles and languages', - imageCreation: 'Image Generation', - imageCreationDesc: 'Create stunning images based on text descriptions, supporting various artistic styles', - videoCreation: 'Video Creation', - videoCreationDesc: 'Transform text and images into dynamic video content', - chatAi: 'AI Chat', - chatAiDesc: 'Have creative conversations and brainstorm with intelligent AI assistants', - analytics: 'Analytics', - analyticsDesc: 'View creation data statistics and trend analysis', - templates: 'Templates', - templatesDesc: 'Start creating quickly with professional templates', - tryNow: 'Try Now', - create: { - title: 'Smart Creation', - desc: 'AI-powered creative content generation platform' - }, - orders: { - title: 'Order Management', - desc: 'View and manage all your orders' - }, - settings: { - title: 'System Settings', - desc: 'Personalize your creative environment' - }, - gallery: { - title: 'Gallery', - desc: 'Browse and share your creative works' - } - }, - recentActivity: { - title: 'Recent Activity', - viewAll: 'View All', - textCreated: 'Text Creation', - textCreatedDesc: 'Created an article about artificial intelligence', - imageGenerated: 'Image Generated', - imageGeneratedDesc: 'Generated a futuristic city concept art', - videoCreated: 'Video Created', - videoCreatedDesc: 'Created a product introduction video', - chatSession: 'AI Chat', - chatSessionDesc: 'Had a creative discussion with AI assistant', - minutesAgo: '{count} minutes ago', - hoursAgo: '{count} hours ago', - daysAgo: '{count} days ago' - }, - creationWorkspace: { - title: 'Creation Workspace', - description: 'Start your creative journey and create amazing content here', - placeholder: { - title: 'Project Creation', - description: 'Select or create a project to start your creative journey' - } - }, - projectGallery: { - title: 'Project Gallery', - description: 'Browse and manage all your creative projects', - placeholder: { - title: 'Project Gallery', - description: 'All your creative projects will be displayed here' - } - }, - - deviceSettings: { - title: 'Device Settings', - description: 'Configure your device preferences and connection settings', - placeholder: { - title: 'Device Settings', - description: 'Personalize your device experience and connection preferences' - } - }, - createProject: { - title: 'Create Project', - description: 'Start a brand new creative project', - placeholder: { - title: 'Create New Project', - description: 'Choose project template or create from scratch' - }, - backButton: 'Back' - } - }, - list: { - title: 'Virtual Scroller List Demo', - }, - orderManagement: { - title: 'Order Management', - description: 'View and manage your purchases and subscriptions', - createOrder: 'Create Order', - filters: { - status: 'Status Filter', - search: 'Search Orders', - sort: 'Sort By' - }, - searchPlaceholder: 'Search order ID, customer name...', - stats: { - totalOrders: 'Total Orders', - pending: 'Pending', - completed: 'Completed', - revenue: 'Total Revenue' - }, - ordersList: 'Orders List', - actions: { - view: 'View Details', - payNow: 'Pay Now', - pay: 'Pay', - cancel: 'Cancel Order', - confirm: 'Confirm Receipt', - more: 'More Actions', - downloadInvoice: 'Download Invoice', - viewTracking: 'View Tracking', - contactSeller: 'Contact Seller' - }, - empty: { - title: 'No Orders Yet', - description: 'You don\'t have any order records yet', - action: 'Create Order' - }, - refundStatus:{ - wtk:'No Refund', - sqtk:'Refund Requested', - jjtk:'Refund Rejected', - tytk:'Refund Approved', - ytk:'Refunded' - }, - status: { - yjj:'Rejected', - dsh:'Pending Review', - all: 'All', - pending: 'Pending', - paid: 'Paid', - processing: 'Processing', - shipped: 'Shipped', - delivered: 'Shipped', - completed: 'Completed', - cancelled: 'Cancelled', - refunded: 'Refunded', - expired: 'Expired', - shenhe:'Pending Review', - unsuccess:'Rejected', - clz:'Processing', - dfh:'Pending Shipment' - }, - sort: { - created_at: 'Created Time', - total: 'Order Total', - status: 'Order Status', - customer: 'Customer Name' - }, - order: { - products: 'Products', - shipping: 'Shipping', - recipient: 'Recipient', - phone: 'Phone', - address: 'Address', - payment: 'Payment', - paymentMethod: 'Payment Method', - paymentStatus: 'Payment Status', - paidAt: 'Paid At', - tracking: 'Tracking', - courier: 'Courier', - trackingNumber: 'Tracking Number' - }, - payment: { - pending: 'Pending Payment', - paid: 'Paid', - failed: 'Payment Failed', - refunded: 'Refunded' - }, - cancelConfirm: { - title: 'Cancel Order', - message: 'Are you sure you want to cancel this order? This action cannot be undone.' - }, - cancelSuccess: 'Order cancelled successfully', - cancelFail: 'Failed to cancel order', - countdown: { - remaining: 'Time left to pay', - expired: 'Expired' - }, - expiredNotice: 'Order expired, cannot pay. Please create a new order' - }, - logistics: { - title: 'Logistics', - trackingNumber: 'Tracking Number', - carrierInfo: 'Carrier Info', - carrier: 'Carrier', - service: 'Service', - estimatedDelivery: 'Estimated Delivery', - currentLocation: 'Current Location', - lastUpdate: 'Last Update' - }, - login: { - divider_text: 'OR', - role_system: 'Role System', - creator_role: 'Creator', - admin_role: 'Admin', - viewer_role: 'Viewer', - creator_desc: 'Full system access including user management and system configuration', - admin_desc: 'Content management and user management permissions', - viewer_desc: 'Basic functionality access permissions', - theme_toggle_tooltip: 'Switch to dark theme', - theme_toggle_tooltip_light: 'Switch to light theme', - language_toggle_tooltip: 'Switch to Chinese', - login_success: 'Login successful', - login_error: 'Login failed', - google_login: 'Sign in with Google', - google_logging: 'Signing in...', - email_login: 'Login', - email_logging: 'Signing in...', - email_placeholder: 'Enter your email', - password_placeholder: 'Enter your password', - email_label: 'Email Address', - password_label: 'Password', - email_empty_error: 'Please enter email address', - email_invalid_error: 'Please enter a valid email address', - password_empty_error: 'Please enter password', - password_min_error: 'Password must be at least 6 characters', - login_success_message: 'Login successful!', - login_error_message: 'Login failed', - google_login_success: 'Google login successful!', - google_login_error: 'Google login failed', - login_processing_error: 'An error occurred during login', - google_login_processing_error: 'An error occurred during Google login', - email_login_notice: 'Email login feature coming soon', - theme_toggle_light: 'Switch to light theme', - theme_toggle_dark: 'Switch to dark theme', - }, - register: { - title: 'Create Account', - subtitle: 'Join us and start your creative journey', - back_to_login: 'Back to Login', - has_account: 'Already have an account?', - login_now: 'Login Now', - no_account: 'No account yet?', - register_now: 'Register Now', - theme_toggle_tooltip: 'Switch to dark theme', - language_toggle_tooltip: 'Switch to Chinese', - email_label: 'Email Address', - email_placeholder: 'Enter your email', - password_label: 'Password', - password_placeholder: 'Enter your password', - verification_code_label: 'Verification Code', - verification_code_placeholder: 'Enter 6-digit verification code', - send_code: 'Send Code', - sending_code: 'Sending...', - register_button: 'Register', - registering: 'Registering...', - terms_agreement: 'By registering, you agree to our ', - terms_link: 'Terms of Service', - and: ' and ', - privacy_link: 'Privacy Policy', - email_empty_error: 'Please enter email address', - email_invalid_error: 'Please enter a valid email address', - password_empty_error: 'Please enter password', - password_min_error: 'Password must be at least 6 characters', - password_strength_error: 'Password must contain letters and numbers', - verification_code_empty_error: 'Please enter verification code', - verification_code_invalid_error: 'Please enter a valid 6-digit code', - verification_code_sent: 'Verification code sent successfully', - verification_code_send_failed: 'Failed to send verification code', - register_processing_error: 'An error occurred during registration processing' - }, - payment: { - title: 'Pay Order', - orderId: 'Order ID', - orderInfo: 'Order Information', - orderDetails: 'Order Details', - totalItems: 'Total Items', - items: 'items', - subtotal: 'Subtotal', - tax: 'Tax', - shipping: 'Shipping', - free: 'Free', - total: 'Total', - shippingAddress: 'Shipping Address', - successTitle: 'Payment Successful', - successMessage: 'Your order has been paid successfully', - transactionId: 'Transaction ID', - amountPaid: 'Amount Paid', - viewOrder: 'View Order', - continueShopping: 'Continue Shopping', - errorTitle: 'Payment Failed', - retry: 'Retry Payment', - cancel: 'Cancel Payment', - needHelp: 'Need Help?', - paymentIssues: 'Payment Issues', - securityInfo: 'Security Info', - refundPolicy: 'Refund Policy', - orderNotFound: 'Order not found', - initializationError: 'Failed to initialize payment page', - previousPaymentFailed: 'Previous payment failed', - success: 'Payment successful', - postPaymentError: 'An error occurred while processing payment success', - failure: 'Payment failed', - cancelConfirmation: 'Are you sure you want to cancel payment?', - status: { - pending: 'Pending', - processing: 'Processing', - succeeded: 'Succeeded', - failed: 'Failed', - canceled: 'Canceled' - }, - methods: { - creditCard: 'Credit Card', - alipay: 'Alipay', - wechat: 'WeChat Pay' - }, - orderSummary: 'Order Summary', - couponPlaceholder: 'Enter coupon code', - applyCoupon: 'Apply Coupon', - couponApplied: 'Coupon Applied', - couponSuccess: 'Coupon applied successfully', - invalidCoupon: 'Invalid coupon', - couponError: 'Failed to process coupon', - payNow: 'Pay Now', - processing: 'Processing payment...', - stripeNotInitialized: 'Stripe not initialized', - securityNotice: 'Your payment information will be securely transmitted with encryption' - }, - checkout: { - customModel: 'Custom Model', - from: 'Starting from', - configuration: 'Configuration', - contact: 'Contact', - emailOrPhone: 'Email or Phone', - subscribe: 'Email me news and offers', - shipping: 'Shipping Address', - country: 'Country/Region', - chooseCountry: 'Select country', - lastName: 'Last Name', - firstName: 'First Name', - postalCode: 'Postal Code', - state: 'State/Province', - chooseState: 'Select state/province', - city: 'City', - address1: 'Address', - address2: 'Apartment/Suite', - phone: 'Phone', - saveInfo: 'Save this information for next time', - size: 'Size', - quantity: 'Quantity', - ipName: 'IP Name', - ipNamePlaceholder: 'Please enter IP name', - buy: 'Buy', - processTitle: 'Our Process', - orderConfirmation: 'Order Confirmation: We will confirm the information within 1 business day after placing the order and begin processing.', - productionTime: 'Production Time: The production cycle is 5-15 business days, which may be extended during holidays.', - logistics: 'Logistics: After shipping, we will provide order and tracking numbers, and logistics information will be sent to your email.', - afterSales: 'After-sales & Refund: Please refer to the refund policy; if you have any questions, please contact ' - }, - // 中国省份中文映射 - cnProvinces: { - 'CN-BJ': 'Beijing', - 'CN-SH': 'Shanghai', - 'CN-TJ': 'Tianjin', - 'CN-CQ': 'Chongqing', - 'CN-HE': 'Hebei', - 'CN-SX': 'Shanxi', - 'CN-NM': 'Inner Mongolia', - 'CN-LN': 'Liaoning', - 'CN-JL': 'Jilin', - 'CN-HL': 'Heilongjiang', - 'CN-JS': 'Jiangsu', - 'CN-ZJ': 'Zhejiang', - 'CN-AH': 'Anhui', - 'CN-FJ': 'Fujian', - 'CN-JX': 'Jiangxi', - 'CN-SD': 'Shandong', - 'CN-HA': 'Henan', - 'CN-HB': 'Hubei', - 'CN-HN': 'Hunan', - 'CN-GD': 'Guangdong', - 'CN-GX': 'Guangxi Zhuang Autonomous Region', - 'CN-HI': 'Hainan', - 'CN-SC': 'Sichuan', - 'CN-GZ': 'Guizhou', - 'CN-YN': 'Yunnan', - 'CN-XZ': 'Tibet Autonomous Region', - 'CN-SN': 'Shaanxi', - 'CN-GS': 'Gansu', - 'CN-QH': 'Qinghai', - 'CN-NX': 'Ningxia Hui Autonomous Region', - 'CN-XJ': 'Xinjiang Uygur Autonomous Region', - 'CN-TW': 'Taiwan', - 'CN-HK': 'Hong Kong SAR', - 'CN-MO': 'Macau SAR' - }, - - agents: { - title: 'Agents', - description: 'Manage your AI assistants', - subtitle: 'Create and manage your AI agents', - add: 'Add Agent', - create: 'Create Agent', - edit: 'Edit Agent', - delete: 'Delete Agent', - save: 'Save', - cancel: 'Cancel', - confirm: 'Confirm', - search: { - placeholder: 'Search agent name or description...', - noResults: 'No agents found' - }, - filters: { - all: 'All', - recent: 'Recent', - favorites: 'Favorites' - }, - list: { - title: 'Agent List', - subtitle: 'Manage your AI assistant collection', - empty: { - title: 'No agents yet', - description: 'Create your first AI assistant to get started!', - action: 'Create Agent' - }, - loading: 'Loading agents...' - }, - card: { - role: 'Role', - voice: 'Voice', - model: 'Model', - lastChat: 'Latest Chat', - noChat: 'No chat history', - boundDevice: 'Device Bound', - unboundDevice: 'No Device', - bindDevice: 'Bind Device', - configRole: 'Configure Role', - edit: 'Edit', - delete: 'Delete', - viewDetails: 'View Details' - }, - form: { - basicInfo: { - title: 'Basic Information', - name: 'Agent Name', - namePlaceholder: 'Enter agent name', - nameRequired: 'Please enter agent name', - description: 'Description', - descriptionPlaceholder: 'Brief description of this agent\'s features and capabilities', - avatar: 'Avatar', - selectAvatar: 'Select Avatar' - }, - role: { - title: 'Role Configuration', - roleType: 'Role Type', - personality: 'Personality', - expertise: 'Expertise', - knowledgeBase: 'Knowledge Base', - customPrompt: 'Custom Prompt', - systemPrompt: 'System Prompt', - systemPromptPlaceholder: 'Define the agent\'s behavior and response style' - }, - voice: { - title: 'Voice Configuration', - voiceType: 'Voice Type', - voiceList: { - female1: 'Gentle Female', - female2: 'Elegant Female', - male1: 'Deep Male', - male2: 'Dynamic Male', - neutral1: 'Neutral Voice', - child1: 'Child Voice' - }, - speed: 'Speed', - pitch: 'Pitch', - volume: 'Volume' - }, - model: { - title: 'Model Configuration', - selectedModel: 'Select Model', - modelConfig: 'Model Parameters', - temperature: 'Creativity', - creativity: 'Creativity', - coherence: 'Coherence' - } - }, - device: { - title: 'Device Binding', - bindTitle: 'Bind Device', - unbindTitle: 'Unbind Device', - bindSuccess: 'Bind successful', - unbindSuccess: 'Unbind successful', - bindFailed: 'Bind failed', - unbindFailed: 'Unbind failed', - verifyCode: { - title: 'Verify Device', - codePlaceholder: 'Enter 6-digit verification code', - codeInvalid: 'Please enter a valid 6-digit code', - expired: 'Code expired', - resend: 'Resend Code', - confirm: 'Confirm Bind', - cancel: 'Cancel', - sending: 'Sending verification code...', - success: 'Bind successful', - error: 'Bind failed' - }, - deviceList: 'Bound Devices', - bindNew: 'Bind New Device', - unbind: 'Unbind Device', - currentDevice: 'Current Device', - bindingStatus: 'Binding Status', - lastActive: 'Last Active', - deviceInfo: { - name: 'Device Name', - type: 'Device Type', - platform: 'Device Platform', - version: 'Version' - } - }, - actions: { - createSuccess: 'Agent created successfully', - updateSuccess: 'Agent updated successfully', - deleteSuccess: 'Agent deleted successfully', - saveSuccess: 'Saved successfully', - loading: 'Processing...', - confirmDelete: 'Are you sure you want to delete this agent?', - deleteConfirm: 'This action cannot be undone. Please proceed with caution!', - operationFailed: 'Operation failed', - networkError: 'Network connection failed' - }, - validation: { - nameRequired: 'Please enter agent name', - nameMaxLength: 'Name cannot exceed 50 characters', - descriptionMaxLength: 'Description cannot exceed 500 characters', - roleRequired: 'Please select role type', - voiceRequired: 'Please select voice', - modelRequired: 'Please select language model' - }, - settings: { - general: 'General Settings', - privacy: 'Privacy Settings', - security: 'Security Settings', - advanced: 'Advanced Settings', - autoDelete: 'Auto Delete', - exportData: 'Export Data', - importData: 'Import Data', - backup: 'Backup' - } - }, - agentManagement: { - deviceCount:'Device Count', - - title: 'Agent', - description: 'Manage and configure your AI agents', - createAgent: 'Create Agent', - createTitle: 'Create Agent', - name: 'Agent Name', - namePlaceholder: 'Please enter agent name', - nameRequired: 'Please enter agent name', - modelPlaceholder: 'Please select a language model', - filters: { - status: 'Status Filter', - search: 'Search Agents', - sort: 'Sort By', - category: 'Category Filter' - }, - searchPlaceholder: 'Search agent name, description...', - stats: { - totalAgents: 'Total Agents', - online: 'Online', - offline: 'Offline', - totalConversations: 'Total Conversations' - }, - agentsList: 'Agents List', - actions: { - view: 'View Details', - edit: 'Edit', - delete: 'Delete', - configure: 'Configure', - more: 'More Actions', - connect: 'Connect Device', - test: 'Test Conversation' - }, - empty: { - title: 'No Agents Yet', - description: 'You haven\'t created any agents yet', - action: 'Create Agent' - }, - status: { - all: 'All', - active: 'Active', - inactive: 'Inactive', - maintenance: 'Maintenance' - }, - sort: { - name: 'Name', - created_at: 'Created Time', - lastActive: 'Last Active', - status: 'Status' - }, - category: { - all: 'All Categories', - assistant: 'Assistant', - customerService: 'Customer Service', - content: 'Content', - education: 'Education', - business: 'Business' - }, - form: { - name: 'Agent Name', - description: 'Description', - category: 'Category', - model: 'Model', - prompt: 'System Prompt', - temperature: 'Temperature', - maxTokens: 'Max Tokens', - status: 'Status', - active: 'Active', - inactive: 'Inactive' - }, - dialog: { - createTitle: 'Create Agent', - editTitle: 'Edit Agent', - deviceBindTitle: 'Bind Device' - }, - pageTitle: 'Agent Management', - addAgent: 'Add Agent', - editAgent: 'Edit', - rebindDevice: 'Rebind Device', - bindDevice: 'Bind Device', - deleteAgent: 'Delete', - character: 'Character', - llmModel: 'Language Model', - notSet: 'Not Set', - loading: 'Loading...', - noAgents: 'No Agents Yet', - bindDeviceTitle: 'Bind Device', - enterVerificationCode: 'Please enter the 6-digit verification code displayed on the device:', - verificationCodePlaceholder: 'Please enter 6-digit verification code', - confirmBind: 'Confirm Bind', - deleteConfirmTitle: 'Delete Confirmation', - deleteConfirmContent: 'Are you sure you want to delete agent "{agentName}"?', - deleteWarning: 'This action cannot be undone, all related data will be permanently deleted.', - devices:'devices' - }, - common: { - close: 'Close', - confirm: 'Confirm', - yes: 'Yes', - no: 'No', - cancel: 'Cancel', - generate: 'Generate', - back: 'Back', - save: 'Save', - create: 'Create', - validation: { - referenceImageRequired: 'Please upload a reference image or select a sketch to continue generation' - } - }, - iPandCardLeft: { - textPrompt: 'Text Prompt', - placeholder: { - characterDescription: 'Please describe the character you want to create...' - }, - addReferenceImage: 'Add Reference Image', - uploadOrSelectImage: 'Upload or select an image', - dragImageHere: 'Or drag image here', - ipType: 'IP Type', - character: 'Character', - animal: 'Animal', - characterImport: 'Character Import', - expression: { - title: 'Expression Selection', - description: 'Choose an expression to enrich your character', - happy: 'Happy', - surprised: 'Surprised', - smile: 'Smile', - laugh: 'Laugh', - naughty: 'Naughty', - cool: 'Cool', - shy: 'Shy', - angry: 'Angry', - thinking: 'Thinking', - love: 'Love' - }, - hairColor: { - title: 'Hair Color Selection', - description: 'Choose character hair color', - black: 'Black', - brown: 'Brown', - blonde: 'Blonde', - red: 'Red', - gray: 'Gray', - white: 'White', - blue: 'Blue', - green: 'Green', - purple: 'Purple', - pink: 'Pink' - }, - skinColor: { - title: 'Skin Color Selection', - description: 'Choose character skin color', - fair: 'Fair', - light: 'Light', - medium: 'Medium', - olive: 'Olive', - tan: 'Tan', - brown: 'Brown', - dark: 'Dark' - }, - material: { - title: 'Material Selection', - description: 'Choose material to enhance your design texture', - metal: 'White Plush', - type: 'Metal' - }, - color: { - title: 'Color Selection', - description: 'Choose a color for your {{material}} material' - }, - electronicModule: 'Electronic Module', - sketch: { - title: 'Sketch Selection', - description: 'Choose a sketch that matches your {{module}} module' - }, - creativeStyle: 'Creative Style Selection', - imageQuantity: 'Image Quantity Selection', - selectQuantity: 'Select Image Quantity', - styles: { - general: 'General', - anime: 'Anime', - realistic: 'Realistic', - cyberpunk: 'Cyberpunk', - chinese: 'Chinese Style', - pixel: 'Pixel Art' - } - }, - creationWorkspace: { - changeCover: 'Change Cover', - createNewProject: 'Create New Project', - dropToDelete: 'Drop to Delete', - dropToDeleteHint: 'Release to delete project', - confirmDelete: 'Confirm Delete', - deleteProject: 'Delete Project', - cancel: 'Cancel' - }, - loading: 'Loading...', - allLoaded: 'All data loaded', - emptyProjects: { - title: 'No Projects Yet', - description: 'You haven\'t created any projects yet. Click the button below to get started.', - action: 'Create New Project' - }, - modelCard: { - generateModelButton: 'Generate 3D Model', - generatingIndicator: 'Generating model...', - progressText: '{percentage}%', - loadingModelText: 'Loading model...', - loadingErrorText: 'Model loading failed' - } - }, - }, -} \ No newline at end of file diff --git a/apps/frontend/src/locales/index.js b/apps/frontend/src/locales/index.js index dc44f64..9193bd4 100644 --- a/apps/frontend/src/locales/index.js +++ b/apps/frontend/src/locales/index.js @@ -125,7 +125,12 @@ export default { }, modelModal: { customizeToHome: '定制到家', - textInputPlaceholder: '请输入调整内容,例如:更改角色表情' + textInputPlaceholder: '请输入调整内容,例如:更改角色表情', + preview: '预览', + modify: '修改', + sceneGraph: '场景图', + edit: '编辑', + download: '下载' }, modelCard: { generateModelButton: '生成模型', @@ -212,6 +217,7 @@ export default { modelFreeCount: '模型免费', times: '次', remainingCredits: '剩余积分', + recharge: '充值', guide: '使用指南', back: '返回', skip: '跳过', @@ -334,13 +340,16 @@ export default { guideModal: { step1: { title: '参考图片', - description: '选择您喜欢的图片作为创作参考', - tips: '点击生成按钮后,平台会根据您的选择生成相应的3D模型。' + description: '输入文字描述您的IP,或者选择您喜欢的图片作为创作参考', + tips: '点击生成按钮后,平台会根据您的选择生成相应的图片。' }, step2: { - title: '模型生成/文字优化', - description: '根据您的参考图片,平台会生成对应的3D模型。', - tips: '您也可以输入文字描述,平台会根据您的需求进行图片优化。' + title: '图片节点按钮控件', + description: ` + ①.customizeToHome:将您的IP角色定制为您的专属3D模型机器人。
+ ②.controls:图片节点控件,支持修改预览和删除等操作
+ `, + tips: '您通过画布或者聊天框修改图片,平台会根据您的需求进行图片优化。' }, step3: { title: '查看详情', @@ -1088,6 +1097,7 @@ export default { currentPoints: '当前积分', expiryDate: '积分到期时间', pointsList: '积分明细', + recharge: '充值', consumptionRules: { title: '积分消耗规则', behavior: '行为', @@ -1166,10 +1176,10 @@ export default { }, premium: { name: '高级套餐', - badge: '热门' + badge: '推荐' } }, - period: '年', + period: '天', points: '积分', validity: '有效期', features: { @@ -1296,7 +1306,8 @@ export default { goHome: '返回首页', submitInviteCode: '提交邀请码', hasInviteCode: '已有邀请码?', - inviteCodePlaceholder: '填写邀请码升级为免费会员' + inviteCodePlaceholder: '填写邀请码升级为免费会员', + logout: '退出登录' } }, en: { @@ -1326,10 +1337,10 @@ export default { }, premium: { name: 'Premium Plan', - badge: 'HOT' + badge: 'Picks' } }, - period: 'year', + period: 'day', points: 'Points', validity: 'Validity', features: { @@ -1448,7 +1459,12 @@ export default { }, modelModal: { customizeToHome: 'Customize to Home', - textInputPlaceholder: 'Please enter adjustment content, e.g. change character expression' + textInputPlaceholder: 'Please enter adjustment content, e.g. change character expression', + preview: 'Preview', + modify: 'Modify', + sceneGraph: 'Scene Graph', + edit: 'Edit', + download: 'Download' }, modelCard: { generateModelButton: 'Generate Model', @@ -1535,6 +1551,7 @@ export default { modelFreeCount: 'Free Model', times: 'times', remainingCredits: 'Remaining Credits', + recharge: 'Recharge', guide: 'User Guide', back: 'Back', skip: 'Skip', @@ -1552,6 +1569,7 @@ export default { currentPoints: 'Current Points', expiryDate: 'Points Expiry Date', pointsList: 'Points Details', + recharge: 'Recharge', consumptionRules: { title: 'Points Consumption Rules', behavior: 'Behavior', @@ -1732,9 +1750,9 @@ export default { }, guideModal: { step1: { - title: 'Reference Images', - description: 'Select images you like as creative references', - tips: 'After clicking the generate button, the platform will generate corresponding 3D models based on your selection.' + title: 'Reference Image', + description: 'Enter text to describe your IP, or select an image you like as a creative reference.', + tips: 'After clicking the generate button, the platform will generate the corresponding image based on your selection.' }, step2: { title: 'Model Generation / Text Optimization', @@ -2585,7 +2603,8 @@ export default { goHome: 'Go Home', submitInviteCode: 'Submit Invite Code', hasInviteCode: 'Already have an invite code?', - inviteCodePlaceholder: 'Enter invite code to upgrade to free membership' + inviteCodePlaceholder: 'Enter invite code to upgrade to free membership', + logout: 'Logout' } } }, diff --git a/apps/frontend/src/router/index.js b/apps/frontend/src/router/index.js index 33bf903..a99071f 100644 --- a/apps/frontend/src/router/index.js +++ b/apps/frontend/src/router/index.js @@ -1,4 +1,4 @@ -import { createRouter, createWebHistory,createWebHashHistory} from 'vue-router' +import { createRouter, createWebHistory, createWebHashHistory } from 'vue-router' import { useAuthStore } from '@/stores/auth' import { nextTick } from 'vue' import NProgress from 'nprogress' @@ -17,50 +17,56 @@ const AddAgent = () => import('../views/AddAgent.vue') const DeviceList = () => import('../views/DeviceList.vue') const UiTest = () => import('../views/UiTest.vue') const home = () => import('../views/home/index.vue') -const PointsRecharge = () => import('../views/PointsRecharge.vue') +const PointsRecharge = () => import('../views/PointsRecharge/PointsRecharge.vue') const UserCenter = () => import('../views/user/index.vue') const NotFound = () => import('../views/NotFound.vue') const Waitlist = () => import('../views/Waitlist.vue') -NProgress.configure({ +NProgress.configure({ showSpinner: false, - })// 开启轻量模式(顶部细线) +})// 开启轻量模式(顶部细线) // 路由配置 const routes = [ - { - path: '/', - name: 'home', + { + path: '/', + name: 'home', component: home, - meta: { fullScreen: false } - },{ - path: '/login', + meta: { requiresAuth: false, keepAlive: false, fullScreen: true } + }, { + path: '/login', name: 'login', component: Login, - meta: { requiresGuest: true } + meta: { requiresGuest: true } }, - { - path: '/login/phone', + { + path: '/login/phone', name: 'phone-login', component: () => import('@/views/Login/PhoneLogin.vue'), - meta: { requiresGuest: true, fullScreen: true } + meta: { requiresGuest: true, fullScreen: true } }, - { - path: '/czhome', - name: 'czhome', + { + path: '/czhome', + name: 'czhome', component: ModernHome, - meta: { requiresAuth: false, keepAlive: false } + meta: { requiresAuth: true, keepAlive: false } }, - { - path: '/register', - name: 'register', - component: Register, - meta: { requiresGuest: true, fullScreen: true } + { + path: '/register', + name: 'register', + component: Register, + meta: { requiresGuest: true, fullScreen: true } }, - { - path: '/forgot-password', - name: 'forgot-password', + { + path: '/forgot-password', + name: 'forgot-password', component: ForgotPassword, meta: { requiresGuest: true, fullScreen: true } }, + { + path: '/Waitlist', + name: 'Waitlist', + component: Waitlist, // 升级页 + meta: { requiresAuth: true, keepAlive: false, fullScreen: true } + }, { path: '/:pathMatch(.*)*', name: 'NotFound', @@ -70,44 +76,44 @@ const routes = [ ] //免费会员/达人会员动态路由 export const freeRoutes = [ - { - path: '/ui-test', - name: 'ui-test', + { + path: '/ui-test', + name: 'ui-test', component: UiTest, meta: { requiresAuth: false, keepAlive: false } }, - { - path: '/creation-workspace', - name: 'creation-workspace', + { + path: '/creation-workspace', + name: 'creation-workspace', component: CreationWorkspace, meta: { requiresAuth: true, keepAlive: false } }, - { - path: '/project-gallery', - name: 'project-gallery', + { + path: '/project-gallery', + name: 'project-gallery', component: ProjectGallery, meta: { requiresAuth: true, keepAlive: false } }, - { - path: '/order-management', - name: 'order-management', + { + path: '/order-management', + name: 'order-management', component: OrderManagement, meta: { requiresAuth: true, keepAlive: false } }, - { - path: '/order-management/:orderId', - name: 'order-detail', + { + path: '/order-management/:orderId', + name: 'order-detail', component: OrderDetail, meta: { requiresAuth: true } }, { - path: '/agent-management', + path: '/agent-management', name: 'agent-management', component: AgentManagement, meta: { requiresAuth: true, keepAlive: false } }, { - path: '/user-center', + path: '/user-center', name: 'user-center', component: UserCenter, meta: { requiresAuth: true, keepAlive: false } @@ -118,39 +124,39 @@ export const freeRoutes = [ component: AddAgent, meta: { requiresAuth: true, fullScreen: false } }, - { - path: '/device-settings', - name: 'device-settings', + { + path: '/device-settings', + name: 'device-settings', component: DeviceSettings, meta: { requiresAuth: true, keepAlive: false } }, - { - path: '/device-list/:agentId', - name: 'device-list', + { + path: '/device-list/:agentId', + name: 'device-list', component: DeviceList, meta: { requiresAuth: true, keepAlive: false } }, - { - path: '/project/:id/:series', - name: 'project', + { + path: '/project/:id/:series', + name: 'project', component: () => import('../views/Project/CreateProject.vue'), meta: { requiresAuth: true, fullScreen: true } }, - { - path: '/purchase', - name: 'model-purchase', + { + path: '/purchase', + name: 'model-purchase', component: () => import('../views/ModelPurchase.vue'), meta: { requiresAuth: true, fullScreen: true } }, - { - path: '/points-recharge', - name: 'points-recharge', + { + path: '/points-recharge', + name: 'points-recharge', component: PointsRecharge, - meta: { requiresAuth: true,fullScreen: true } + meta: { requiresAuth: true, fullScreen: true } }, - { - path: '/list', - name: 'list', + { + path: '/list', + name: 'list', component: List, meta: { requiresAuth: true } }, @@ -163,7 +169,7 @@ export const freeRoutes = [ ] const router = createRouter({ // history: createWebHistory(), - history:createWebHashHistory(), + history: createWebHashHistory(), routes, }) // 路由守卫 @@ -171,9 +177,9 @@ router.beforeEach(async (to, from, next) => { NProgress.start() // if(window.location.hostname=='localhost'){ // window.localStorage.setItem('token','123') - // return next() + // return next() // } - if(to.path=='/login'||to.path=='/login/phone'||to.path=='/register'||to.path=='/forgot-password'){ + if (to.path == '/login' || to.path == '/login/phone' || to.path == '/register' || to.path == '/forgot-password') { const token = localStorage.getItem('token') // 如果有 token,跳转到首页 if (token) { @@ -181,7 +187,8 @@ router.beforeEach(async (to, from, next) => { return } } - const newto = freeRoutes.find(route => route.path == to.path) + const findRoutes = [...freeRoutes, ...routes] + let newto = findRoutes.find(route => route.path == to.path) if (newto?.meta?.requiresAuth) { const token = localStorage.getItem('token') // 如果没有 token,跳转到登录页 @@ -195,27 +202,24 @@ router.beforeEach(async (to, from, next) => { // const info = await authStore.updateUserInfo(); // console.log(info,'infoinfo'); const user_role = authStore.user?.userRole; - if((user_role == 1||user_role == 2) && router.getRoutes().length == routes.length) { + if ((user_role == 1 || user_role == 2) && router.getRoutes().length == routes.length) { // 添加动态路由 addDynamicRoutes(); - if(isDynamicRoute(to.path)) { + if (isDynamicRoute(to.path)) { next('/czhome') setTimeout(() => { router.push(to.path) }, 20); return } - }else if(user_role == 0){ - // 恢复默认路由 - removeDynamicRoutes() - router.addRoute( - { - path: '/:pathMatch(.*)*', - name: 'NotFound', - component: Waitlist, // 显示404页面组件 - meta: { requiresAuth: false, keepAlive: false, fullScreen: true } - } - ) + } + // else if (user_role == 0) { + // // 恢复默认路由 + // removeDynamicRoutes() + // } + if (user_role == 0&&to.path!='/Waitlist'&&to.path!='/') { + // 跳转升级页 + return next('/Waitlist') } next() }) @@ -228,7 +232,7 @@ function addDynamicRoutes() { } //恢复默认路由 function removeDynamicRoutes() { - if(router.getRoutes().length == routes.length){ + if (router.getRoutes().length == routes.length) { return } router.getRoutes().forEach(route => { diff --git a/apps/frontend/src/views/CreationWorkspace/CreationWorkspace.vue b/apps/frontend/src/views/CreationWorkspace/CreationWorkspace.vue index ac7f40a..a10cbd7 100644 --- a/apps/frontend/src/views/CreationWorkspace/CreationWorkspace.vue +++ b/apps/frontend/src/views/CreationWorkspace/CreationWorkspace.vue @@ -243,7 +243,18 @@ const handleFileSelect = (event) => { } const openProject = (project) => { - router.push(`/project/${project.id}/${project.tags[0]}`) + let series = project.tags[0] + switch(series){ + case 'Oone': + series = 'E1'; + break; + case 'Done': + series = 'D1'; + break; + default: + break; + } + router.push(`/project/${project.id}/${series}`) } const createNewProject = (series) => { diff --git a/apps/frontend/src/views/OrderManagement/OrderManagement.js b/apps/frontend/src/views/OrderManagement/OrderManagement.js index 6749dd6..31615e0 100644 --- a/apps/frontend/src/views/OrderManagement/OrderManagement.js +++ b/apps/frontend/src/views/OrderManagement/OrderManagement.js @@ -4,6 +4,7 @@ export class OrderManagement { } //获取订单列表 getOrderList(params){ + params.source_type = 0 return requestUtils.common(clientApi.default.getOrderList, params); } //获取订单详情 diff --git a/apps/frontend/src/views/PointsRecharge.vue b/apps/frontend/src/views/PointsRecharge/PointsRecharge.vue similarity index 74% rename from apps/frontend/src/views/PointsRecharge.vue rename to apps/frontend/src/views/PointsRecharge/PointsRecharge.vue index 6f7d313..70aca52 100644 --- a/apps/frontend/src/views/PointsRecharge.vue +++ b/apps/frontend/src/views/PointsRecharge/PointsRecharge.vue @@ -6,13 +6,11 @@ -
-