diff --git a/apps/FrontendDesigner/package.json b/apps/FrontendDesigner/package.json index 3030347..56fa260 100644 --- a/apps/FrontendDesigner/package.json +++ b/apps/FrontendDesigner/package.json @@ -12,8 +12,10 @@ }, "dependencies": { "@element-plus/icons-vue": "^2.3.2", + "@types/three": "^0.180.0", "element-plus": "^2.11.7", "pinia": "^2.2.6", + "three": "^0.180.0", "vue": "^3.5.24", "vue-i18n": "^9.14.2", "vue-router": "^4.4.5" diff --git a/apps/FrontendDesigner/src/App.vue b/apps/FrontendDesigner/src/App.vue index cf11d3d..db947b3 100644 --- a/apps/FrontendDesigner/src/App.vue +++ b/apps/FrontendDesigner/src/App.vue @@ -133,12 +133,7 @@ onUnmounted(() => {
- -
diff --git a/apps/FrontendDesigner/src/assets/demo/model.glb b/apps/FrontendDesigner/src/assets/demo/model.glb new file mode 100644 index 0000000..04b201b Binary files /dev/null and b/apps/FrontendDesigner/src/assets/demo/model.glb differ diff --git a/apps/FrontendDesigner/src/components/common/ModelViewer.vue b/apps/FrontendDesigner/src/components/common/ModelViewer.vue new file mode 100644 index 0000000..947065a --- /dev/null +++ b/apps/FrontendDesigner/src/components/common/ModelViewer.vue @@ -0,0 +1,649 @@ + + + + + \ 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 eceeb62..be6a935 100644 --- a/apps/FrontendDesigner/src/locales/lang/en-US.js +++ b/apps/FrontendDesigner/src/locales/lang/en-US.js @@ -7,10 +7,11 @@ export default { save: 'Save', delete: 'Delete', edit: 'Edit', - add: 'Add', search: 'Search', - reset: 'Reset', loading: 'Loading...', + viewAll: 'View All', + reset: 'Reset', + retry: 'Retry', noData: 'No Data', error: 'Error', success: 'Success', @@ -18,6 +19,22 @@ export default { info: 'Info' }, + // 3D Model Viewer + modelViewer: { + resetView: 'Reset View', + toggleWireframe: 'Toggle Wireframe', + centerModel: 'Center Model', + modelInfo: 'Model Info', + fileSize: 'File Size', + loadError: 'Model Load Error', + touchControls: 'Touch Controls Available', + mouseControls: 'Mouse Controls Available', + exportModel: 'Export Model', + exportInProgress: 'Export in progress...', + exportSuccess: 'Export successful', + exportFailed: 'Export failed' + }, + // 应用 app: { title: 'Vue3 Frontend Designer Tool', @@ -114,7 +131,19 @@ export default { reset: 'Reset', startDate: 'Start Date', endDate: 'End Date', - loading: 'Loading...' + loading: 'Loading...', + refreshSuccess: 'Refresh successful', + confirm: 'Confirm', + cancel: 'Cancel', + save: 'Save', + delete: 'Delete', + edit: 'Edit', + add: 'Add', + noData: 'No Data', + error: 'Error', + success: 'Success', + warning: 'Warning', + info: 'Info' }, layout: { dashboard: 'Dashboard', @@ -218,6 +247,61 @@ export default { credit: 'Credit Card' } }, + review: { + title: 'IP Review Management', + subtitle: 'Manage creator-submitted IP content review process', + list: 'Review List', + search: 'Search Creator', + status: 'Review Status', + dateRange: 'Date Range', + orderPrice: 'Order Price', + creator: 'Creator', + ipName: 'IP Name', + thumbnail: 'Thumbnail', + preview: 'Preview', + preview3D: '3D Preview', + preview3DModel: '3D Model Preview', + previewImage: 'Image Preview', + approve: 'Approve', + reject: 'Reject', + approved: 'Approved', + rejected: 'Rejected', + pending: 'Pending Review', + rejectReason: 'Reject Reason', + enterRejectReason: 'Please enter reject reason', + pleaseInputReason: 'Please enter reject reason', + modelPreview: 'Model Preview', + proceedToParts: 'Parts', + noRejectReason: 'Please enter reject reason', + confirmApprove: 'Confirm approve this IP?', + confirmReject: 'Confirm reject this IP?', + enterFeedback: 'Please enter feedback', + approveSuccess: 'IP approved successfully', + rejectSuccess: 'IP rejected successfully', + disassemblyComingSoon: 'Disassembly feature coming soon', + redirectToDisassembly: 'Redirecting to disassembly page:', + model3DPlaceholder: '3D Model Display Area', + creatorStudioA: 'Creative Studio A', + creatorStudioB: '3D Design Team B', + creatorStudioC: 'Digital Art Studio C', + nonComplianceReason: 'Does not meet content compliance requirements', + dateFormat: 'en-US', + rejectReview: 'Reject Review', + createTime: 'Create Time', + actions: 'Actions', + goToDisassembly: 'Disassembly', + stats: { + total: 'Total Reviews', + pending: 'Pending Review', + approved: 'Approved', + rejected: 'Rejected' + }, + statusOptions: { + pending: 'Pending Review', + approved: 'Approved', + rejected: 'Rejected' + } + }, users: { title: 'User Management', add: 'Add User', @@ -257,23 +341,5 @@ export default { vip: 'VIP User' } } - }, - - // 通用文本 - common: { - confirm: 'Confirm', - cancel: 'Cancel', - save: 'Save', - delete: 'Delete', - edit: 'Edit', - search: 'Search', - loading: 'Loading...', - viewAll: 'View All', - reset: 'Reset', - noData: 'No Data', - error: 'Error', - success: 'Success', - warning: 'Warning', - info: 'Info' } } \ No newline at end of file diff --git a/apps/FrontendDesigner/src/locales/lang/zh-CN.js b/apps/FrontendDesigner/src/locales/lang/zh-CN.js index e9397d9..7e4a630 100644 --- a/apps/FrontendDesigner/src/locales/lang/zh-CN.js +++ b/apps/FrontendDesigner/src/locales/lang/zh-CN.js @@ -139,7 +139,19 @@ export default { reset: '重置', startDate: '开始日期', endDate: '结束日期', - loading: '加载中...' + loading: '加载中...', + refreshSuccess: '刷新成功', + confirm: '确认', + cancel: '取消', + save: '保存', + delete: '删除', + edit: '编辑', + add: '添加', + noData: '暂无数据', + error: '错误', + success: '成功', + warning: '警告', + info: '信息' }, layout: { dashboard: '仪表板', @@ -152,113 +164,166 @@ export default { settings: '设置', notifications: '通知' }, - pages: { - content: { - title: '内容管理', - add: '添加内容', - status: '状态', - type: '类型', - search: '搜索内容', - author: '作者', - publishDate: '发布时间', - views: '浏览量', - actions: '操作', - view: '查看', - edit: '编辑', - delete: '删除', - statusOptions: { - published: '已发布', - pending: '待审核', - draft: '草稿', - rejected: '已拒绝' - }, - typeOptions: { - article: '文章', - image: '图片', - video: '视频' - } + content: { + title: '内容管理', + add: '添加内容', + status: '状态', + type: '类型', + search: '搜索内容', + author: '作者', + publishDate: '发布时间', + views: '浏览量', + actions: '操作', + view: '查看', + edit: '编辑', + delete: '删除', + statusOptions: { + published: '已发布', + pending: '待审核', + draft: '草稿', + rejected: '已拒绝' }, - orders: { - title: '订单管理', - export: '导出订单', - search: '搜索订单', - status: '状态', - dateRange: '日期范围', - orderNumber: '订单号', - customer: '客户', - total: '总金额', - payment: '支付方式', - date: '下单日期', - actions: '操作', - view: '查看', - updateStatus: '更新状态', - detail: '订单详情', - basicInfo: '基本信息', - items: '订单商品', - itemName: '商品名称', - quantity: '数量', - price: '价格', - currentStatus: '当前状态', - newStatus: '新状态', - selectStatus: '选择状态', - stats: { - total: '总订单', - pending: '待处理', - completed: '已完成', - revenue: '总收入' - }, - statusOptions: { - pending: '待处理', - processing: '处理中', - completed: '已完成', - shipped: '已发货', - delivered: '已送达', - cancelled: '已取消' - }, - paymentOptions: { - alipay: '支付宝', - wechat: '微信支付', - credit: '信用卡' - } + typeOptions: { + article: '文章', + image: '图片', + video: '视频' + } + }, + orders: { + title: '订单管理', + export: '导出订单', + search: '搜索订单', + status: '状态', + dateRange: '日期范围', + orderNumber: '订单号', + customer: '客户', + total: '总金额', + payment: '支付方式', + date: '下单日期', + actions: '操作', + view: '查看', + updateStatus: '更新状态', + detail: '订单详情', + basicInfo: '基本信息', + items: '订单商品', + itemName: '商品名称', + quantity: '数量', + price: '价格', + currentStatus: '当前状态', + newStatus: '新状态', + selectStatus: '选择状态', + stats: { + total: '总订单', + pending: '待处理', + completed: '已完成', + revenue: '总收入' }, - users: { - title: '用户管理', - add: '添加用户', - search: '搜索用户', - status: '状态', - role: '角色', - registerDate: '注册日期', - username: '用户名', - email: '邮箱', - phone: '手机号', - lastLogin: '最后登录', - loginCount: '登录次数', - actions: '操作', - view: '查看', - edit: '编辑', - resetPassword: '重置密码', - ban: '封禁', - unban: '解封', - detail: '用户详情', - selectRole: '选择角色', - selectStatus: '选择状态', - save: '保存', - stats: { - total: '总用户', - active: '活跃用户', - inactive: '非活跃用户', - vip: 'VIP用户' - }, - statusOptions: { - active: '活跃', - inactive: '非活跃', - banned: '已封禁' - }, - roleOptions: { - admin: '管理员', - user: '普通用户', - vip: 'VIP用户' - } + statusOptions: { + pending: '待处理', + processing: '处理中', + completed: '已完成', + shipped: '已发货', + delivered: '已送达', + cancelled: '已取消' + }, + paymentOptions: { + alipay: '支付宝', + wechat: '微信支付', + credit: '信用卡' + } + }, + review: { + title: 'IP审核管理', + subtitle: '管理创作者提交的IP内容审核流程', + list: '审核列表', + search: '搜索创作者', + status: '审核状态', + dateRange: '日期范围', + orderPrice: '订单价格', + creator: '创作者', + ipName: 'IP名称', + thumbnail: '缩略图', + preview: '预览', + preview3D: '3D预览', + preview3DModel: '3D模型预览', + previewImage: '图片预览', + approve: '通过', + reject: '拒绝', + approved: '已通过', + rejected: '已拒绝', + pending: '待审核', + rejectReason: '拒绝原因', + enterRejectReason: '请输入拒绝原因', + pleaseInputReason: '请输入拒绝原因', + modelPreview: '模型预览', + proceedToParts: '拆件', + noRejectReason: '请输入拒绝原因', + confirmApprove: '确认通过此IP?', + confirmReject: '确认拒绝此IP?', + enterFeedback: '请输入反馈', + approveSuccess: '审核通过成功', + rejectSuccess: '审核拒绝成功', + disassemblyComingSoon: '拆件功能即将上线', + redirectToDisassembly: '跳转到拆件页面:', + model3DPlaceholder: '3D模型展示区域', + creatorStudioA: '创意工作室A', + creatorStudioB: '3D设计团队B', + creatorStudioC: '数字艺术工作室C', + nonComplianceReason: '不符合内容规范要求', + dateFormat: 'zh-CN', + rejectReview: '拒绝审核', + createTime: '创建时间', + actions: '操作', + goToDisassembly: '拆件', + stats: { + total: '总审核数', + pending: '待审核', + approved: '已通过', + rejected: '已拒绝' + }, + statusOptions: { + pending: '待审核', + approved: '已通过', + rejected: '已拒绝' + } + }, + users: { + title: '用户管理', + add: '添加用户', + search: '搜索用户', + status: '状态', + role: '角色', + registerDate: '注册日期', + username: '用户名', + email: '邮箱', + phone: '手机号', + lastLogin: '最后登录', + loginCount: '登录次数', + actions: '操作', + view: '查看', + edit: '编辑', + resetPassword: '重置密码', + ban: '封禁', + unban: '解封', + detail: '用户详情', + selectRole: '选择角色', + selectStatus: '选择状态', + save: '保存', + stats: { + total: '总用户', + active: '活跃用户', + inactive: '非活跃用户', + vip: 'VIP用户' + }, + statusOptions: { + active: '活跃', + inactive: '非活跃', + banned: '已封禁' + }, + roleOptions: { + admin: '管理员', + user: '普通用户', + vip: 'VIP用户' } } }, @@ -290,10 +355,27 @@ export default { loading: '加载中...', viewAll: '查看全部', reset: '重置', + retry: '重试', noData: '暂无数据', error: '错误', success: '成功', warning: '警告', info: '信息' + }, + + // 3D模型预览器 + modelViewer: { + resetView: '重置视图', + toggleWireframe: '切换线框', + centerModel: '居中模型', + modelInfo: '模型信息', + fileSize: '文件大小', + loadError: '模型加载失败', + touchControls: '触摸控制可用', + mouseControls: '鼠标控制可用', + exportModel: '导出模型', + exportInProgress: '正在导出...', + exportSuccess: '导出成功', + exportFailed: '导出失败' } } \ No newline at end of file diff --git a/apps/FrontendDesigner/src/router/index.js b/apps/FrontendDesigner/src/router/index.js index e7a29f9..e35b095 100644 --- a/apps/FrontendDesigner/src/router/index.js +++ b/apps/FrontendDesigner/src/router/index.js @@ -9,6 +9,7 @@ const AdminDashboard = () => import('@/views/admin/AdminDashboard.vue') const AdminContent = () => import('@/views/admin/AdminContent.vue') const AdminOrders = () => import('@/views/admin/AdminOrders.vue') const AdminUsers = () => import('@/views/admin/AdminUsers.vue') +const AdminContentReview = () => import('@/views/admin/AdminContentReview.vue') const routes = [ { @@ -64,6 +65,14 @@ const routes = [ title: '内容管理' } }, + { + path: 'content-review', + name: 'AdminContentReview', + component: AdminContentReview, + meta: { + title: '内容审核' + } + }, { path: 'orders', name: 'AdminOrders', diff --git a/apps/FrontendDesigner/src/views/AdminLogin.vue b/apps/FrontendDesigner/src/views/AdminLogin.vue index 44cb394..612a79d 100644 --- a/apps/FrontendDesigner/src/views/AdminLogin.vue +++ b/apps/FrontendDesigner/src/views/AdminLogin.vue @@ -22,9 +22,6 @@ clearable @keyup.enter="handleLogin" > - diff --git a/apps/FrontendDesigner/src/views/admin/AdminContentReview.vue b/apps/FrontendDesigner/src/views/admin/AdminContentReview.vue new file mode 100644 index 0000000..a679742 --- /dev/null +++ b/apps/FrontendDesigner/src/views/admin/AdminContentReview.vue @@ -0,0 +1,871 @@ + + + + + \ No newline at end of file diff --git a/apps/FrontendDesigner/src/views/admin/AdminDashboard.vue b/apps/FrontendDesigner/src/views/admin/AdminDashboard.vue index ddbdc2f..b9ce0d0 100644 --- a/apps/FrontendDesigner/src/views/admin/AdminDashboard.vue +++ b/apps/FrontendDesigner/src/views/admin/AdminDashboard.vue @@ -117,23 +117,22 @@
-
-
-
+
+
-
- {{ t('admin.orders.statusOptions.completed') }} ({{ orderStats.completed }}%) -
-
-
- {{ t('admin.orders.statusOptions.pending') }} ({{ orderStats.pending }}%) -
-
-
- {{ t('admin.orders.statusOptions.cancelled') }} ({{ orderStats.cancelled }}%) -
+
+ {{ t('admin.orders.statusOptions.completed') }} ({{ orderStats.completed }}%) +
+
+
+ {{ t('admin.orders.statusOptions.pending') }} ({{ orderStats.pending }}%) +
+
+
+ {{ t('admin.orders.statusOptions.cancelled') }} ({{ orderStats.cancelled }}%) +
@@ -437,16 +436,34 @@ onMounted(() => { /* 饼图 */ .pie-chart { + display: flex; + align-items: center; + justify-content: center; + margin: 0 auto 16px; + position: relative; +} + +.pie-visual { width: 120px; height: 120px; border-radius: 50%; background: conic-gradient( - from 0deg, - #10b981 0deg calc(var(--completed) * 3.6deg), - #f59e0b calc(var(--completed) * 3.6deg) calc((var(--completed) + var(--pending)) * 3.6deg), - #ef4444 calc((var(--completed) + var(--pending)) * 3.6deg) 360deg + #10b981 0deg 270deg, + #f59e0b 270deg 342deg, + #ef4444 342deg 360deg ); - margin: 0 auto 16px; + position: relative; +} + +.pie-center { + position: absolute; + width: 60px; + height: 60px; + background: white; + border-radius: 50%; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); } .pie-legend { diff --git a/apps/FrontendDesigner/vercel.json b/apps/FrontendDesigner/vercel.json new file mode 100644 index 0000000..5d82951 --- /dev/null +++ b/apps/FrontendDesigner/vercel.json @@ -0,0 +1,31 @@ +{ + "version": 2, + "buildCommand": "npm run build", + "outputDirectory": "dist", + "installCommand": "npm install", + "framework": "vite", + "routes": [ + { + "src": "/assets/(.*)", + "headers": { + "cache-control": "public, max-age=31536000, immutable", + "access-control-allow-origin": "*", + "access-control-allow-methods": "GET, POST, PUT, DELETE, OPTIONS", + "access-control-allow-headers": "Content-Type, Authorization, X-Requested-With" + } + }, + { + "src": "/(.*)", + "headers": { + "access-control-allow-origin": "*", + "access-control-allow-methods": "GET, POST, PUT, DELETE, OPTIONS", + "access-control-allow-headers": "Content-Type, Authorization, X-Requested-With", + "access-control-max-age": "86400" + } + }, + { + "src": "/(.*)", + "dest": "/index.html" + } + ] +} \ No newline at end of file diff --git a/apps/frontend/docs/environment-setup.md b/apps/frontend/docs/environment-setup.md index f860325..4594847 100644 --- a/apps/frontend/docs/environment-setup.md +++ b/apps/frontend/docs/environment-setup.md @@ -52,7 +52,7 @@ VITE_APP_DESCRIPTION=AI-Powered Creation Platform 1. 登录 [Vercel Dashboard](https://vercel.com/dashboard) 2. 选择你的项目 -3. 进入 `Settings` → `Environment Variables` +3. 拆件 `Settings` → `Environment Variables` 4. 添加以下环境变量: #### 生产环境变量 diff --git a/apps/frontend/docs/vercel-deployment-guide.md b/apps/frontend/docs/vercel-deployment-guide.md index 73b598c..a0a972f 100644 --- a/apps/frontend/docs/vercel-deployment-guide.md +++ b/apps/frontend/docs/vercel-deployment-guide.md @@ -222,7 +222,7 @@ jobs: #### 在 Vercel Dashboard 中配置: -1. 进入项目设置 → Domains +1. 拆件项目设置 → Domains 2. 添加你的域名 3. 按照指示配置 DNS 记录 @@ -250,7 +250,7 @@ Vercel 会自动为你的域名配置 Let's Encrypt SSL 证书,通常在几分 在 Vercel Dashboard 中启用 Web Analytics 以监控性能: -1. 进入项目 → Analytics +1. 拆件项目 → Analytics 2. 启用 Web Analytics #### 配置缓存策略 @@ -288,7 +288,7 @@ Vercel 会自动为你的域名配置 Let's Encrypt SSL 证书,通常在几分 在 Vercel Dashboard 中查看部署状态和日志: -1. 进入项目 → Deployments +1. 拆件项目 → Deployments 2. 点击任意部署查看详细日志 ### 2. 监控应用性能 diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 20e0eeb..7f8b01f 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -11,8 +11,6 @@ "clean": "rimraf dist" }, "dependencies": { - "@deotaland/ui": "workspace:*", - "@deotaland/utils": "workspace:*", "@element-plus/icons-vue": "^2.3.2", "@google/genai": "^1.27.0", "@stripe/stripe-js": "^4.8.0", @@ -36,8 +34,10 @@ }, "devDependencies": { "@iconify-json/feather": "^1.2.1", + "@vitejs/plugin-vue": "^6.0.1", "unplugin-auto-import": "^20.2.0", "unplugin-icons": "^22.5.0", - "unplugin-vue-components": "^30.0.0" + "unplugin-vue-components": "^30.0.0", + "vite": "^7.2.2" } } diff --git a/apps/frontend/src/views/ModernHome.vue b/apps/frontend/src/views/ModernHome.vue index 5b70d1c..93a513c 100644 --- a/apps/frontend/src/views/ModernHome.vue +++ b/apps/frontend/src/views/ModernHome.vue @@ -396,7 +396,7 @@ export default { transition: all 0.3s ease; position: relative; overflow: hidden; - /* 进入动画 */ + /* 拆件动画 */ opacity: 0; transform: translateY(40px); animation: buttonFloatIn 0.6s ease-out 0.2s forwards; @@ -482,7 +482,7 @@ export default { background: rgba(255, 255, 255, 0.1); backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.2); - /* 进入动画 */ + /* 拆件动画 */ opacity: 0; transform: translateY(30px) scale(0.8); animation: circleFloatIn 0.8s ease-out forwards; diff --git a/apps/frontend/src/views/UiTest.vue b/apps/frontend/src/views/UiTest.vue index cbe5d70..846fd04 100644 --- a/apps/frontend/src/views/UiTest.vue +++ b/apps/frontend/src/views/UiTest.vue @@ -8,106 +8,88 @@

Button 组件测试

- 主要按钮 - 成功按钮 - 警告按钮 - 危险按钮 - 信息按钮 - 中等按钮 - 小按钮 - 禁用按钮 - 加载按钮 + 主要按钮 + 成功按钮 + 警告按钮 + 危险按钮 + 信息按钮 + 大尺寸按钮 + 小尺寸按钮

Card 组件测试

- +

这是一个基础的卡片组件,展示基本内容。

-
+ - +

这是一个带有图片的卡片组件。

-
+ - +

这是一个无阴影边框卡片。

-
+

Modal 组件测试

- +

这是一个基础的模态框测试内容。

测试组件的基本功能和响应式设计。

-
+ - +

这是一个大尺寸的模态框测试内容。

在大屏幕上会有更好的展示效果。

大内容区域
-
+ - +

这是一个小尺寸的模态框测试内容。

适合简单的确认对话框。

-
+ - +

这是一个全屏模态框测试内容。

适合需要大量空间展示内容的场景。

-
+

Loading 组件测试

- + {{ showLoading ? '隐藏' : '显示' }}加载动画 - - + + {{ showCustomLoading ? '隐藏' : '显示' }}自定义加载 - +
@@ -117,18 +99,12 @@
- - - + +
+
+

测试内容区域

+
+
@@ -155,14 +131,18 @@