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 @@
+
+
+
+
+
+
+
{{ error }}
+
+ {{ t('common.retry') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('modelViewer.modelInfo') }}: {{ modelInfo }}
+
{{ t('modelViewer.fileSize') }}: {{ formatFileSize(fileSize) }}
+
+
+
+
+
+
+
+
\ 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 @@
+
+
+
+
+
+
+
+
+
+
{{ reviewStats.total }}
+
{{ t('admin.review.stats.total') }}
+
+
+
+
+
+
+
+
+
{{ reviewStats.pending }}
+
{{ t('admin.review.stats.pending') }}
+
+
+
+
+
+
+
+
+
{{ reviewStats.approved }}
+
{{ t('admin.review.stats.approved') }}
+
+
+
+
+
+
+
+
+
{{ reviewStats.rejected }}
+
{{ t('admin.review.stats.rejected') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('admin.common.refresh') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ¥{{ row.orderPrice.toFixed(2) }}
+
+
+
+
+
+ {{ t(`admin.review.statusOptions.${row.status}`) }}
+
+
+
+
+
+
+ {{ row.rejectionReason || '-' }}
+
+ -
+
+
+
+
+ {{ formatDate(row.createTime) }}
+
+
+
+
+
+
+ {{ t('admin.review.preview3D') }}
+
+
+ {{ t('admin.review.approve') }}
+
+
+ {{ t('admin.review.reject') }}
+
+
+ {{ t('admin.review.goToDisassembly') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![]()
+
+
+
+
+ 放大
+
+
+
+ 缩小
+
+
+
+ 重置
+
+
+
+ 新窗口打开
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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 @@