From 87c7fffd3ee2b8c8d19230817efb55b3ea09016d Mon Sep 17 00:00:00 2001 From: 13121765685 Date: Fri, 26 Dec 2025 18:18:13 +0800 Subject: [PATCH] 222 --- .trae/documents/新建项目系列选择功能实现.md | 178 ++ .../src/locales/lang/en-US.js | 22 +- .../src/locales/lang/zh-CN.js | 22 +- apps/FrontendDesigner/src/main.js | 2 +- apps/FrontendDesigner/src/router/index.js | 72 +- apps/FrontendDesigner/src/stores/index.js | 4 +- .../src/views/admin/AdminContentReview.vue | 4 - .../AdminDisassemblyDetail.vue | 10 +- .../views/admin/AdminOrders/AdminOrders.vue | 3 +- .../admin/AdminPointsManagement/index.js | 4 +- .../components/CustomizationModal/index.vue | 2 +- .../HeaderComponent/HeaderComponent.vue | 16 +- .../components/OrderProcessModal/index.vue | 22 +- .../src/components/SeriesSelector.vue | 351 ++++ .../src/components/layout/AppSidebar.vue | 18 +- apps/frontend/src/locales/index copy.js | 8 +- apps/frontend/src/locales/index.js | 24 +- apps/frontend/src/router/index.js | 2 +- apps/frontend/src/views/CreationWorkspace.vue | 534 ++--- apps/frontend/src/views/OrderDetail.vue | 4 +- .../src/views/Project/CreateProject.vue | 16 +- apps/frontend/src/views/Project/index.js | 10 +- apps/frontend/src/views/user/index copy.vue | 1831 +++++++++++++++++ apps/frontend/src/views/user/index.vue | 38 +- .../monorepo-architecture-design/design.md | 2 +- .../monorepo-architecture-design/proposal.md | 2 +- openspec/project.md | 2 +- .../utils/src/api/FrontendDesigner/order.js | 12 +- packages/utils/src/api/frontend/user.js | 10 +- packages/utils/src/servers/fileserver.js | 4 +- packages/utils/src/servers/meshyserver.js | 2 +- 31 files changed, 2782 insertions(+), 449 deletions(-) create mode 100644 .trae/documents/新建项目系列选择功能实现.md create mode 100644 apps/frontend/src/components/SeriesSelector.vue create mode 100644 apps/frontend/src/views/user/index copy.vue diff --git a/.trae/documents/新建项目系列选择功能实现.md b/.trae/documents/新建项目系列选择功能实现.md new file mode 100644 index 0000000..d6c06cc --- /dev/null +++ b/.trae/documents/新建项目系列选择功能实现.md @@ -0,0 +1,178 @@ +# 新建项目系列选择功能实现 + +## 需求分析 +- 当用户点击"新建项目"卡片时,需要弹出系列选择弹窗 +- 系列弹窗包含两个选项:Done 和 Oone,对应图片在 src/assets/xh 文件夹中 +- 选中后将系列名称作为 type 参数传递给 createNewProject 函数 + +## 实现计划 + +### 1. 创建 SeriesSelector 组件 +- **文件路径**:`src/views/components/SeriesSelector.vue` +- **功能**: + - 显示两个系列选项(Done 和 Oone) + - 每个选项显示对应的图片 + - 支持选中状态切换 + - 提供确认和取消按钮 + - 通过 emit 事件返回选中的系列名称 + +### 2. 修改 CreationWorkspace.vue +- **引入组件**:在 CreationWorkspace.vue 中引入 SeriesSelector 组件 +- **添加状态管理**: + - `showSeriesSelector`:控制系列选择弹窗的显示/隐藏 +- **修改新建项目逻辑**: + - 点击"新建项目"卡片时,显示系列选择弹窗 + - 监听 SeriesSelector 的确认事件,获取选中的系列名称 + - 将系列名称作为 type 参数调用 createNewProject 函数 + +### 3. 样式设计 +- 系列选择弹窗采用与现有删除确认弹窗一致的设计风格 +- 系列选项卡片包含图片和名称,支持悬停和选中效果 +- 确认和取消按钮使用现有按钮样式 + +## 代码结构 + +### SeriesSelector.vue +```vue + + + + + \ No newline at end of file diff --git a/apps/FrontendDesigner/src/locales/lang/en-US.js b/apps/FrontendDesigner/src/locales/lang/en-US.js index 28176dd..150afc3 100644 --- a/apps/FrontendDesigner/src/locales/lang/en-US.js +++ b/apps/FrontendDesigner/src/locales/lang/en-US.js @@ -175,7 +175,8 @@ export default { shenhe: 'Under Review', unsuccess: 'Rejected', clz: 'Processing', - dfh: 'Pending Shipment' + dfh: 'Pending Shipment', + success:'Completed' }, sort: { created_at: 'Created Time', @@ -741,7 +742,26 @@ export default { }, commissionManagement: { title: 'Commission Management', + configTitle: 'Commission Configuration', commissionRate: 'Commission Rate', + minWithdrawAmount: 'Minimum Withdraw Amount', + withdrawFeeRate: 'Withdraw Fee Rate', + settlementCycle: 'Settlement Cycle', + status: 'Status', + remark: 'Remark', + saveConfig: 'Save Configuration', + selectSettlementCycle: 'Please select settlement cycle', + enterRemark: 'Please enter remark', + daily: 'Daily', + weekly: 'Weekly', + monthly: 'Monthly', + requiredCommissionRate: 'Please enter commission rate', + invalidCommissionRate: 'Commission rate should be between 1-100', + requiredMinWithdrawAmount: 'Please enter minimum withdraw amount', + invalidMinWithdrawAmount: 'Minimum withdraw amount cannot be less than 0', + getConfigFailed: 'Failed to get commission configuration', + saveConfigSuccess: 'Configuration saved successfully', + saveConfigFailed: 'Failed to save configuration', saveRate: 'Save', defaultRate: '15%', rateSaved: 'Commission rate saved successfully', diff --git a/apps/FrontendDesigner/src/locales/lang/zh-CN.js b/apps/FrontendDesigner/src/locales/lang/zh-CN.js index 58de6a3..ae2ea7f 100644 --- a/apps/FrontendDesigner/src/locales/lang/zh-CN.js +++ b/apps/FrontendDesigner/src/locales/lang/zh-CN.js @@ -80,7 +80,8 @@ orderManagement: { shenhe:'待审核', unsuccess:'已拒绝', clz:'处理中', - dfh:'待发货' + dfh:'待发货', + success:'已完成' }, sort: { created_at: '创建时间', @@ -738,7 +739,26 @@ orderManagement: { }, commissionManagement: { title: '佣金管理', + configTitle: '佣金配置', commissionRate: '佣金比例', + minWithdrawAmount: '最低提现金额', + withdrawFeeRate: '提现费率', + settlementCycle: '结算周期', + status: '状态', + remark: '备注', + saveConfig: '保存配置', + selectSettlementCycle: '请选择结算周期', + enterRemark: '请输入备注', + daily: '每日', + weekly: '每周', + monthly: '每月', + requiredCommissionRate: '请输入佣金比例', + invalidCommissionRate: '佣金比例应在1-100之间', + requiredMinWithdrawAmount: '请输入最低提现金额', + invalidMinWithdrawAmount: '最低提现金额不能小于0', + getConfigFailed: '获取佣金配置失败', + saveConfigSuccess: '保存配置成功', + saveConfigFailed: '保存配置失败', saveRate: '保存', defaultRate: '15%', rateSaved: '佣金比例保存成功', diff --git a/apps/FrontendDesigner/src/main.js b/apps/FrontendDesigner/src/main.js index 6ebd292..02c7ac1 100644 --- a/apps/FrontendDesigner/src/main.js +++ b/apps/FrontendDesigner/src/main.js @@ -57,7 +57,7 @@ const initRoutes = () => { } } -// initRoutes() +initRoutes() // 配置路由 app.use(router) diff --git a/apps/FrontendDesigner/src/router/index.js b/apps/FrontendDesigner/src/router/index.js index b764637..faed81f 100644 --- a/apps/FrontendDesigner/src/router/index.js +++ b/apps/FrontendDesigner/src/router/index.js @@ -196,6 +196,43 @@ export const permissionRoutes = [ requiresAuth: true } }, + + + + ] +const routes = [ + { + path: '/', + name: 'Home', + meta: { + title: '首页重定向' + } + }, + { + path: '/about', + name: 'About', + component: About, + meta: { + title: '关于页面' + } + }, + { + path: '/login', + name: 'Login', + component: AdminLogin, + meta: { + title: '登录', + requiresAuth: false + } + }, + { + path: '/admin', + name: 'Admin', + component: AdminLayout, + meta: { + requiresAuth: true + }, + children: [ { path: 'disassembly-orders/:id', name: 'AdminDisassemblyDetail', @@ -232,40 +269,7 @@ export const permissionRoutes = [ requiresAuth: true } } - ] -const routes = [ - { - path: '/', - name: 'Home', - meta: { - title: '首页重定向' - } - }, - { - path: '/about', - name: 'About', - component: About, - meta: { - title: '关于页面' - } - }, - { - path: '/login', - name: 'Login', - component: AdminLogin, - meta: { - title: '登录', - requiresAuth: false - } - }, - { - path: '/admin', - name: 'Admin', - component: AdminLayout, - meta: { - requiresAuth: true - }, - children: permissionRoutes//[]// + ]//[]// }, { path: '/:pathMatch(.*)*', diff --git a/apps/FrontendDesigner/src/stores/index.js b/apps/FrontendDesigner/src/stores/index.js index dd8c37b..a8dae04 100644 --- a/apps/FrontendDesigner/src/stores/index.js +++ b/apps/FrontendDesigner/src/stores/index.js @@ -11,7 +11,7 @@ export const useAuthStore = defineStore('auth', { permissionButton: JSON.parse(localStorage.getItem('permissionButton') || '[]'), router: null, routesUpdated: 0,//路由更新次数 - routerList: permissionRoutes//侧边栏路由 + routerList: []//侧边栏路由 }), getters: { @@ -161,8 +161,6 @@ export const useAuthStore = defineStore('auth', { return; } this.routerList = []; - console.log(accessibleRoutes,'accessibleRoutes'); - accessibleRoutes.forEach(route => { this.router.addRoute('Admin', route); this.routerList.push(route); diff --git a/apps/FrontendDesigner/src/views/admin/AdminContentReview.vue b/apps/FrontendDesigner/src/views/admin/AdminContentReview.vue index 0eb8d9b..9323999 100644 --- a/apps/FrontendDesigner/src/views/admin/AdminContentReview.vue +++ b/apps/FrontendDesigner/src/views/admin/AdminContentReview.vue @@ -310,10 +310,6 @@ const rejectRules = { // 选中行数据 const selectedReview = ref(null) - - - - // 计算属性 const filteredReviewList = computed(() => { let list = ordersList.value.map((item) =>{ diff --git a/apps/FrontendDesigner/src/views/admin/AdminDisassemblyDetail/AdminDisassemblyDetail.vue b/apps/FrontendDesigner/src/views/admin/AdminDisassemblyDetail/AdminDisassemblyDetail.vue index 90b0e03..53ccd1c 100644 --- a/apps/FrontendDesigner/src/views/admin/AdminDisassemblyDetail/AdminDisassemblyDetail.vue +++ b/apps/FrontendDesigner/src/views/admin/AdminDisassemblyDetail/AdminDisassemblyDetail.vue @@ -179,7 +179,7 @@ >

{{ $t('admin.disassemblyOrders.detail.step3') }}

-
+
{ } const handleCanvasSave = (editedImageUrl,editContent) => { + fileServer.uploadFile(editedImageUrl).then((url) => { const newItem = { id: new Date().getTime(), - thumbnailUrl: editedImageUrl, + thumbnailUrl: url, taskID: '', taskQueue: '', prompt: editContent, @@ -424,6 +425,7 @@ const handleCanvasSave = (editedImageUrl,editContent) => { project_id: orderDetail.value.projectId, }; disassembledImages.value.push(newItem); + }) } canvasEditorVisible.value = false; // 当前步骤 @@ -708,11 +710,13 @@ const generateModelFromImage = async (image) => { // console.log('generateModelFromImage',image); const newModel = { id: new Date().getTime(), - imgUrl: image, + image: image, taskId: '' }; + // 使用展开运算符创建新数组以确保响应式更新 generatedModels.value = [...generatedModels.value, newModel]; + console.log('generatedModels.value',generatedModels.value); // 如果是第一次生成模型,进入第三步 // if (currentStep.value < 3) { // currentStep.value = 3 diff --git a/apps/FrontendDesigner/src/views/admin/AdminOrders/AdminOrders.vue b/apps/FrontendDesigner/src/views/admin/AdminOrders/AdminOrders.vue index ff8caf5..40ff25b 100644 --- a/apps/FrontendDesigner/src/views/admin/AdminOrders/AdminOrders.vue +++ b/apps/FrontendDesigner/src/views/admin/AdminOrders/AdminOrders.vue @@ -827,13 +827,14 @@ const executeAction = (action) => { // 处理更新支付状态 const handleUpdatePayStatus = (row) => { adminOrders.updatePayStatus(row,1).then(res=>{ + selectedOrderForAction.value = false + actionDialogVisible.value = false if(res.code === 0){ ElMessage.success('更新支付状态成功'); init(); }else{ ElMessage.error(res.msg || '更新支付状态失败'); } - selectedOrderForAction.value = false; }) // selectedOrderForStatus.value = row // statusForm.status = 'paid' // 默认设置为已支付 diff --git a/apps/FrontendDesigner/src/views/admin/AdminPointsManagement/index.js b/apps/FrontendDesigner/src/views/admin/AdminPointsManagement/index.js index a6b42b8..bd2e999 100644 --- a/apps/FrontendDesigner/src/views/admin/AdminPointsManagement/index.js +++ b/apps/FrontendDesigner/src/views/admin/AdminPointsManagement/index.js @@ -9,7 +9,7 @@ export class AdminPointsManagement { status:data.status } let requestURL = { - url:(adminApi.default.updateRechargePackageStatus.url.replace('{id}', data.id)).replace('status',data.status), + url:(adminApi.default.updateRechargePackageStatus.url.replace('{id}', data.id)).replace('status',`status?status=${data.status}`), method:adminApi.default.updateRechargePackageStatus.method, isLoading:adminApi.default.updateRechargePackageStatus.isLoading } @@ -31,7 +31,7 @@ export class AdminPointsManagement { isRecommended:data.isRecommended } let requestURL = { - url:(adminApi.default.updateRecommendedStatus.url.replace('{id}', data.id)).replace('isRecommended',data.isRecommended), + url:(adminApi.default.updateRecommendedStatus.url.replace('{id}', data.id)).replace('recommended',`recommended?isRecommended=${data.isRecommended}`), method:adminApi.default.updateRecommendedStatus.method, isLoading:adminApi.default.updateRecommendedStatus.isLoading } diff --git a/apps/frontend/src/components/CustomizationModal/index.vue b/apps/frontend/src/components/CustomizationModal/index.vue index 0c6e7ea..5266dad 100644 --- a/apps/frontend/src/components/CustomizationModal/index.vue +++ b/apps/frontend/src/components/CustomizationModal/index.vue @@ -51,7 +51,7 @@
  • 订单确认:在下单后的1个工作日内,我们会确认信息后开始处理。
  • 生产时间:生产周期为 5–15 个工作日,节假日可能顺延。
  • 物流:发货后将提供订单与跟踪编号,物流信息会发送到您的邮箱。
  • -
  • 售后与退款:请参考退款政策;如有问题,请联系13121765685
  • +
  • 售后与退款:请参考退款政策;如有问题,请联系
  • diff --git a/apps/frontend/src/components/HeaderComponent/HeaderComponent.vue b/apps/frontend/src/components/HeaderComponent/HeaderComponent.vue index 36c1971..2b97d53 100644 --- a/apps/frontend/src/components/HeaderComponent/HeaderComponent.vue +++ b/apps/frontend/src/components/HeaderComponent/HeaderComponent.vue @@ -36,18 +36,12 @@
    -
    -
    - - - - {{ t('header.imageFreeCount') }}: {{ freeImageCount }}{{ t('header.times') }} -
    +
    - {{ t('header.modelFreeCount') }}: {{ freeModelCount }}{{ t('header.times') }} + {{ t('header.remainingCredits') }}: {{ total_score }}
    产品零件示例图 @@ -34,7 +34,7 @@
    -

    {{ $t('orderProcess.note') || '注意:以上时间为工作日计算,节假日可能会顺延。如有问题,请联系客服:13121765685' }}

    +

    {{ $t('orderProcess.note') || '注意:以上时间为工作日计算,节假日可能会顺延。如有问题,请联系客服' }}

    -
    +
    @@ -148,13 +148,13 @@ const coreMenuItems = computed(() => [ icon: 'OrdersIcon', badge: null }, - // { - // id: 'user-center', - // path: '/user-center', - // label: t('sidebar.userCenter'), - // icon: 'UserIcon', - // badge: null - // }, + { + id: 'user-center', + path: '/user-center', + label: t('sidebar.userCenter'), + icon: 'UserIcon', + badge: null + }, ]) // 判断当前路由是否激活 diff --git a/apps/frontend/src/locales/index copy.js b/apps/frontend/src/locales/index copy.js index 9c8c960..2cfdc90 100644 --- a/apps/frontend/src/locales/index copy.js +++ b/apps/frontend/src/locales/index copy.js @@ -126,7 +126,7 @@ export default { orderProcess: { title: '定制到家流程', subtitle: '了解您的订单从支付到发货的全过程', - note: '注意:以上时间为工作日计算,节假日可能会顺延。如有问题,请联系客服:13121765685', + note: '注意:以上时间为工作日计算,节假日可能会顺延。如有问题,请联系客服: ', acknowledge: '我已知晓', steps: { payment: { @@ -617,7 +617,7 @@ export default { orderConfirmation: '订单确认:在下单后的1个工作日内,我们会确认信息后开始处理。', productionTime: '生产时间:生产周期为 5–15 个工作日,节假日可能顺延。', logistics: '物流:发货后将提供订单与跟踪编号,物流信息会发送到您的邮箱。', - afterSales: '售后与退款:请参考退款政策;如有问题,请联系13121765685', + afterSales: '售后与退款:请参考退款政策;如有问题,请联系 ', error: { firstNameRequired: '名不能为空', lastNameRequired: '姓不能为空', @@ -1404,7 +1404,7 @@ export default { 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: 13121765685', + 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: { @@ -1844,7 +1844,7 @@ export default { 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 13121765685' + afterSales: 'After-sales & Refund: Please refer to the refund policy; if you have any questions, please contact ' }, // 中国省份中文映射 cnProvinces: { diff --git a/apps/frontend/src/locales/index.js b/apps/frontend/src/locales/index.js index 4a01d45..7660310 100644 --- a/apps/frontend/src/locales/index.js +++ b/apps/frontend/src/locales/index.js @@ -156,7 +156,7 @@ export default { orderProcess: { title: '定制到家流程', subtitle: '了解您的订单从支付到发货的全过程', - note: '注意:以上时间为工作日计算,节假日可能会顺延。如有问题,请联系客服:13121765685', + note: '注意:以上时间为工作日计算,节假日可能会顺延。如有问题,请联系客服: ', acknowledge: '我已知晓', steps: { payment: { @@ -210,6 +210,7 @@ export default { imageFreeCount: '生图免费', modelFreeCount: '模型免费', times: '次', + remainingCredits: '剩余积分', guide: '使用指南', back: '返回', skip: '跳过', @@ -505,7 +506,8 @@ export default { shenhe:'待审核', unsuccess:'已拒绝', clz:'处理中', - dfh:'待发货' + dfh:'待发货', + success:'已完成' }, sort: { created_at: '创建时间', @@ -678,7 +680,7 @@ export default { orderConfirmation: '订单确认:在下单后的1个工作日内,我们会确认信息后开始处理。', productionTime: '生产时间:生产周期为 5–15 个工作日,节假日可能顺延。', logistics: '物流:发货后将提供订单与跟踪编号,物流信息会发送到您的邮箱。', - afterSales: '售后与退款:请参考退款政策;如有问题,请联系13121765685', + afterSales: '售后与退款:请参考退款政策;如有问题,请联系 ', error: { firstNameRequired: '名不能为空', lastNameRequired: '姓不能为空', @@ -1270,7 +1272,9 @@ export default { dropToDeleteHint: '释放鼠标即可删除项目', confirmDelete: '确认删除', deleteProject: '删除项目', - cancel: '取消' + cancel: '取消', + selectSeries: '选择系列', + confirm: '确认' }, loading: '加载中...', allLoaded: '已加载全部数据', @@ -1474,7 +1478,7 @@ export default { orderProcess: { title: 'Customize to Home Process', subtitle: 'Understand the complete process of your order from payment to delivery', - note: 'Note: The above times are calculated on working days, holidays may be delayed. If you have any questions, please contact customer service: 13121765685', + note: 'Note: The above times are calculated on working days, holidays may be delayed. If you have any questions, please contact customer service: ', acknowledge: 'I Acknowledge', steps: { payment: { @@ -1528,6 +1532,7 @@ export default { imageFreeCount: 'Free Image Generation', modelFreeCount: 'Free Model', times: 'times', + remainingCredits: 'Remaining Credits', guide: 'User Guide', back: 'Back', skip: 'Skip', @@ -1899,7 +1904,8 @@ export default { shenhe:'Pending Review', unsuccess:'Rejected', clz:'Processing', - dfh:'To Be Shipped' + dfh:'To Be Shipped', + success:'Completed' }, sort: { created_at: 'Created Time', @@ -2069,7 +2075,7 @@ export default { orderConfirmation: 'Order Confirmation: Within 1 business day after placing the order, we will confirm the information and start processing.', productionTime: 'Production Time: The production cycle is 5–15 business days, which may be extended during holidays.', logistics: 'Logistics: After shipment, we will provide the order and tracking number, 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 13121765685', + afterSales: 'After-sales & Refund: Please refer to the refund policy; if you have any questions, please contact ', error: { firstNameRequired: 'First name cannot be empty', lastNameRequired: 'Last name cannot be empty', @@ -2554,7 +2560,9 @@ export default { dropToDeleteHint: 'Release mouse to delete project', confirmDelete: 'Confirm Delete', deleteProject: 'Delete Project', - cancel: 'Cancel' + cancel: 'Cancel', + selectSeries: 'Select Series', + confirm: 'Confirm' }, loading: 'Loading...', allLoaded: 'All data loaded', diff --git a/apps/frontend/src/router/index.js b/apps/frontend/src/router/index.js index d6585aa..56e0ab4 100644 --- a/apps/frontend/src/router/index.js +++ b/apps/frontend/src/router/index.js @@ -131,7 +131,7 @@ export const freeRoutes = [ meta: { requiresAuth: true, keepAlive: false } }, { - path: '/project/:id', + path: '/project/:id/:series', name: 'project', component: () => import('../views/Project/CreateProject.vue'), meta: { requiresAuth: true, fullScreen: true } diff --git a/apps/frontend/src/views/CreationWorkspace.vue b/apps/frontend/src/views/CreationWorkspace.vue index 7909cdf..0277c14 100644 --- a/apps/frontend/src/views/CreationWorkspace.vue +++ b/apps/frontend/src/views/CreationWorkspace.vue @@ -72,7 +72,7 @@
    @@ -129,330 +129,242 @@
    + + + +
    - \ No newline at end of file diff --git a/apps/frontend/src/views/user/index.vue b/apps/frontend/src/views/user/index.vue index 7666bc4..a82894a 100644 --- a/apps/frontend/src/views/user/index.vue +++ b/apps/frontend/src/views/user/index.vue @@ -12,30 +12,30 @@
    - + /> --> - +

    {{ userData.nickname }}

    + @@ -48,7 +48,7 @@
    -
    +

    {{ $t('userCenter.points.title') }}

    @@ -114,9 +114,9 @@
    -
    -

    {{ $t('userCenter.invitation.title') }}

    -
    +
    +

    {{ $t('userCenter.invitation.title') }}

    +
    {{ userData.inviteCount }} @@ -128,7 +128,7 @@

    {{ $t('userCenter.invitation.inviteCodes') }}

    -