diff --git a/demo/ORDER_MANAGEMENT_SUMMARY.md b/demo/ORDER_MANAGEMENT_SUMMARY.md
index 8897abe..fd328ac 100644
--- a/demo/ORDER_MANAGEMENT_SUMMARY.md
+++ b/demo/ORDER_MANAGEMENT_SUMMARY.md
@@ -319,3 +319,5 @@ ALTER TABLE payments ADD FOREIGN KEY (order_id_ref) REFERENCES orders(id);
+
+
diff --git a/demo/PasswordChecker.java b/demo/PasswordChecker.java
index 6a156bb..a567978 100644
--- a/demo/PasswordChecker.java
+++ b/demo/PasswordChecker.java
@@ -26,3 +26,5 @@ public class PasswordChecker {
+
+
diff --git a/demo/VUE_FRONTEND_SUMMARY.md b/demo/VUE_FRONTEND_SUMMARY.md
index 04c003f..d179993 100644
--- a/demo/VUE_FRONTEND_SUMMARY.md
+++ b/demo/VUE_FRONTEND_SUMMARY.md
@@ -283,3 +283,5 @@ Vue.js 前端项目迁移已经完成,实现了:
+
+
diff --git a/demo/frontend/README.md b/demo/frontend/README.md
index d355a69..2cf0a5f 100644
--- a/demo/frontend/README.md
+++ b/demo/frontend/README.md
@@ -426,3 +426,5 @@ MIT License
+
+
diff --git a/demo/frontend/src/App-backup.vue b/demo/frontend/src/App-backup.vue
index 5a530b0..815737e 100644
--- a/demo/frontend/src/App-backup.vue
+++ b/demo/frontend/src/App-backup.vue
@@ -22,3 +22,5 @@ console.log('App.vue 加载成功')
+
+
diff --git a/demo/frontend/src/api/analytics.js b/demo/frontend/src/api/analytics.js
index 86a421c..dac8c00 100644
--- a/demo/frontend/src/api/analytics.js
+++ b/demo/frontend/src/api/analytics.js
@@ -1,27 +1,20 @@
-import request from './request'
+import api from './request'
// 获取日活用户趋势数据
export const getDailyActiveUsersTrend = (year = '2024', granularity = 'monthly') => {
- return request({
- url: '/analytics/daily-active-users',
- method: 'get',
- params: { year, granularity }
+ return api.get('/analytics/daily-active-users', {
+ params: { year, granularity }
})
}
// 获取用户活跃度概览
export const getUserActivityOverview = () => {
- return request({
- url: '/analytics/user-activity-overview',
- method: 'get'
- })
+ return api.get('/analytics/user-activity-overview')
}
// 获取用户活跃度热力图数据
export const getUserActivityHeatmap = (year = '2024') => {
- return request({
- url: '/analytics/user-activity-heatmap',
- method: 'get',
- params: { year }
+ return api.get('/analytics/user-activity-heatmap', {
+ params: { year }
})
}
diff --git a/demo/frontend/src/api/dashboard.js b/demo/frontend/src/api/dashboard.js
index 9df1cf4..b8fafaf 100644
--- a/demo/frontend/src/api/dashboard.js
+++ b/demo/frontend/src/api/dashboard.js
@@ -1,43 +1,30 @@
-import request from './request'
+import api from './request'
// 获取仪表盘概览数据
export const getDashboardOverview = () => {
- return request({
- url: '/dashboard/overview',
- method: 'get'
- })
+ return api.get('/dashboard/overview')
}
// 获取月度收入趋势数据
export const getMonthlyRevenue = (year = '2024') => {
- return request({
- url: '/dashboard/monthly-revenue',
- method: 'get',
- params: { year }
+ return api.get('/dashboard/monthly-revenue', {
+ params: { year }
})
}
// 获取用户转化率数据
export const getConversionRate = () => {
- return request({
- url: '/dashboard/conversion-rate',
- method: 'get'
- })
+ return api.get('/dashboard/conversion-rate')
}
// 获取最近订单数据
export const getRecentOrders = (limit = 10) => {
- return request({
- url: '/dashboard/recent-orders',
- method: 'get',
- params: { limit }
+ return api.get('/dashboard/recent-orders', {
+ params: { limit }
})
}
// 获取系统状态
export const getSystemStatus = () => {
- return request({
- url: '/dashboard/system-status',
- method: 'get'
- })
+ return api.get('/dashboard/system-status')
}
\ No newline at end of file
diff --git a/demo/frontend/src/api/members.js b/demo/frontend/src/api/members.js
index d215c3d..ef06710 100644
--- a/demo/frontend/src/api/members.js
+++ b/demo/frontend/src/api/members.js
@@ -1,44 +1,26 @@
-import request from './request'
+import api from './request'
// 获取会员列表
export const getMembers = (params) => {
- return request({
- url: '/members',
- method: 'get',
- params
- })
+ return api.get('/members', { params })
}
// 更新会员信息
export const updateMember = (id, data) => {
- return request({
- url: `/members/${id}`,
- method: 'put',
- data
- })
+ return api.put(`/members/${id}`, data)
}
// 删除会员
export const deleteMember = (id) => {
- return request({
- url: `/members/${id}`,
- method: 'delete'
- })
+ return api.delete(`/members/${id}`)
}
// 批量删除会员
export const deleteMembers = (ids) => {
- return request({
- url: '/members/batch',
- method: 'delete',
- data: { ids }
- })
+ return api.delete('/members/batch', { data: { ids } })
}
// 获取会员详情
export const getMemberDetail = (id) => {
- return request({
- url: `/members/${id}`,
- method: 'get'
- })
+ return api.get(`/members/${id}`)
}
diff --git a/demo/frontend/src/components/DailyActiveUsersChart.vue b/demo/frontend/src/components/DailyActiveUsersChart.vue
index f00db85..a84c7f8 100644
--- a/demo/frontend/src/components/DailyActiveUsersChart.vue
+++ b/demo/frontend/src/components/DailyActiveUsersChart.vue
@@ -86,17 +86,17 @@ const loadChartData = async () => {
])
// 处理图表数据
- if (chartRes.data && chartRes.data.monthlyData) {
+ if (chartRes && chartRes.monthlyData) {
await nextTick()
- initChart(chartRes.data.monthlyData)
+ initChart(chartRes.monthlyData)
}
// 处理概览数据
- if (overviewRes.data) {
- todayDAU.value = overviewRes.data.todayDAU || 0
- dayGrowthRate.value = overviewRes.data.dayGrowthRate || 0
- monthlyAvgDAU.value = overviewRes.data.monthlyAvgDAU || 0
- monthGrowthRate.value = overviewRes.data.monthGrowthRate || 0
+ if (overviewRes) {
+ todayDAU.value = overviewRes.todayDAU || 0
+ dayGrowthRate.value = overviewRes.dayGrowthRate || 0
+ monthlyAvgDAU.value = overviewRes.monthlyAvgDAU || 0
+ monthGrowthRate.value = overviewRes.monthGrowthRate || 0
}
} catch (error) {
diff --git a/demo/frontend/src/components/Footer.vue b/demo/frontend/src/components/Footer.vue
index 372dce1..5aca16c 100644
--- a/demo/frontend/src/components/Footer.vue
+++ b/demo/frontend/src/components/Footer.vue
@@ -85,3 +85,5 @@
+
+
diff --git a/demo/frontend/src/components/NavBar.vue b/demo/frontend/src/components/NavBar.vue
index d286fa9..5d84dfc 100644
--- a/demo/frontend/src/components/NavBar.vue
+++ b/demo/frontend/src/components/NavBar.vue
@@ -137,7 +137,12 @@ const handleUserCommand = async (command) => {
ElMessage.info('个人资料功能开发中')
break
case 'admin':
- router.push('/admin/dashboard')
+ // 检查管理员权限
+ if (userStore.isAdmin) {
+ router.push('/admin/dashboard')
+ } else {
+ ElMessage.warning('权限不足,只有管理员才能访问后台管理')
+ }
break
case 'settings':
ElMessage.info('设置功能开发中')
diff --git a/demo/frontend/src/main-backup.js b/demo/frontend/src/main-backup.js
new file mode 100644
index 0000000..83d72ee
--- /dev/null
+++ b/demo/frontend/src/main-backup.js
@@ -0,0 +1,21 @@
+import { createApp } from 'vue'
+import { createPinia } from 'pinia'
+import ElementPlus from 'element-plus'
+import 'element-plus/dist/index.css'
+import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
+
+import App from './App.vue'
+import router from './router'
+import { useUserStore } from './stores/user'
+
+const app = createApp(App)
+
+const pinia = createPinia()
+app.use(pinia)
+app.use(router)
+app.use(ElementPlus, {
+ locale: zhCn,
+})
+
+// 立即挂载应用
+app.mount('#app')
diff --git a/demo/frontend/src/main.js b/demo/frontend/src/main.js
index 00e47e4..83d72ee 100644
--- a/demo/frontend/src/main.js
+++ b/demo/frontend/src/main.js
@@ -2,7 +2,6 @@ import { createApp } from 'vue'
import { createPinia } from 'pinia'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
-import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
import App from './App.vue'
@@ -11,11 +10,6 @@ import { useUserStore } from './stores/user'
const app = createApp(App)
-// 注册Element Plus图标
-for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
- app.component(key, component)
-}
-
const pinia = createPinia()
app.use(pinia)
app.use(router)
diff --git a/demo/frontend/src/router/index.js b/demo/frontend/src/router/index.js
index 5da5606..10317b1 100644
--- a/demo/frontend/src/router/index.js
+++ b/demo/frontend/src/router/index.js
@@ -1,38 +1,42 @@
import { createRouter, createWebHistory } from 'vue-router'
import { useUserStore } from '@/stores/user'
+import { ElMessage } from 'element-plus'
-// 路由组件
-import Home from '@/views/Home.vue'
-import Login from '@/views/Login.vue'
-import Register from '@/views/Register.vue'
-import Orders from '@/views/Orders.vue'
-import OrderDetail from '@/views/OrderDetail.vue'
-import OrderCreate from '@/views/OrderCreate.vue'
-import Payments from '@/views/Payments.vue'
-import PaymentCreate from '@/views/PaymentCreate.vue'
-import AdminOrders from '@/views/AdminOrders.vue'
-import AdminUsers from '@/views/AdminUsers.vue'
-import AdminDashboard from '@/views/AdminDashboard.vue'
-import Dashboard from '@/views/Dashboard.vue'
-import Welcome from '@/views/Welcome.vue'
-import Profile from '@/views/Profile.vue'
-import Subscription from '@/views/Subscription.vue'
-import MyWorks from '@/views/MyWorks.vue'
-import VideoDetail from '@/views/VideoDetail.vue'
-import TextToVideo from '@/views/TextToVideo.vue'
-import TextToVideoCreate from '@/views/TextToVideoCreate.vue'
-import ImageToVideo from '@/views/ImageToVideo.vue'
-import ImageToVideoCreate from '@/views/ImageToVideoCreate.vue'
-import StoryboardVideo from '@/views/StoryboardVideo.vue'
-import StoryboardVideoCreate from '@/views/StoryboardVideoCreate.vue'
-import MemberManagement from '@/views/MemberManagement.vue'
+// 路由组件 - 使用懒加载优化性能
+const Home = () => import('@/views/Home.vue')
+const Login = () => import('@/views/Login.vue')
+const Register = () => import('@/views/Register.vue')
+const Orders = () => import('@/views/Orders.vue')
+const OrderDetail = () => import('@/views/OrderDetail.vue')
+const OrderCreate = () => import('@/views/OrderCreate.vue')
+const Payments = () => import('@/views/Payments.vue')
+const PaymentCreate = () => import('@/views/PaymentCreate.vue')
+const AdminOrders = () => import('@/views/AdminOrders.vue')
+const AdminUsers = () => import('@/views/AdminUsers.vue')
+const AdminDashboard = () => import('@/views/AdminDashboard.vue')
+const Dashboard = () => import('@/views/Dashboard.vue')
+const Welcome = () => import('@/views/Welcome.vue')
+const Profile = () => import('@/views/Profile.vue')
+const Subscription = () => import('@/views/Subscription.vue')
+const MyWorks = () => import('@/views/MyWorks.vue')
+const VideoDetail = () => import('@/views/VideoDetail.vue')
+const TextToVideo = () => import('@/views/TextToVideo.vue')
+const TextToVideoCreate = () => import('@/views/TextToVideoCreate.vue')
+const ImageToVideo = () => import('@/views/ImageToVideo.vue')
+const ImageToVideoCreate = () => import('@/views/ImageToVideoCreate.vue')
+const StoryboardVideo = () => import('@/views/StoryboardVideo.vue')
+const StoryboardVideoCreate = () => import('@/views/StoryboardVideoCreate.vue')
+const MemberManagement = () => import('@/views/MemberManagement.vue')
+const SystemSettings = () => import('@/views/SystemSettings.vue')
+const GenerateTaskRecord = () => import('@/views/GenerateTaskRecord.vue')
+const HelloWorld = () => import('@/views/HelloWorld.vue')
const routes = [
{
path: '/works',
name: 'MyWorks',
component: MyWorks,
- meta: { title: '我的作品', requiresAuth: true }
+ meta: { title: '我的作品', requiresAuth: true, keepAlive: true }
},
{
path: '/video/:id',
@@ -44,7 +48,7 @@ const routes = [
path: '/text-to-video',
name: 'TextToVideo',
component: TextToVideo,
- meta: { title: '文生视频', requiresAuth: true }
+ meta: { title: '文生视频', requiresAuth: true, keepAlive: true }
},
{
path: '/text-to-video/create',
@@ -56,7 +60,7 @@ const routes = [
path: '/image-to-video',
name: 'ImageToVideo',
component: ImageToVideo,
- meta: { title: '图生视频', requiresAuth: true }
+ meta: { title: '图生视频', requiresAuth: true, keepAlive: true }
},
{
path: '/image-to-video/create',
@@ -68,7 +72,7 @@ const routes = [
path: '/storyboard-video',
name: 'StoryboardVideo',
component: StoryboardVideo,
- meta: { title: '分镜视频', requiresAuth: true }
+ meta: { title: '分镜视频', requiresAuth: true, keepAlive: true }
},
{
path: '/storyboard-video/create',
@@ -78,7 +82,7 @@ const routes = [
},
{
path: '/',
- redirect: '/welcome' // 重定向到欢迎页面
+ redirect: '/profile' // 重定向到个人主页
},
{
path: '/welcome',
@@ -169,7 +173,31 @@ const routes = [
name: 'MemberManagement',
component: MemberManagement,
meta: { title: '会员管理', requiresAuth: true, requiresAdmin: true }
- }
+ },
+ {
+ path: '/system-settings',
+ name: 'SystemSettings',
+ component: SystemSettings,
+ meta: { title: '系统设置', requiresAuth: true, requiresAdmin: true }
+ },
+ {
+ path: '/generate-task-record',
+ name: 'GenerateTaskRecord',
+ component: GenerateTaskRecord,
+ meta: { title: '生成任务记录', requiresAuth: true, requiresAdmin: true }
+ },
+ {
+ path: '/api-management',
+ name: 'ApiManagement',
+ component: () => import('@/views/ApiManagement.vue'),
+ meta: { title: 'API管理', requiresAuth: true, requiresAdmin: true }
+ },
+ {
+ path: '/hello',
+ name: 'HelloWorld',
+ component: HelloWorld,
+ meta: { title: 'Hello World' }
+ },
]
const router = createRouter({
@@ -190,7 +218,7 @@ router.beforeEach(async (to, from, next) => {
try {
const userStore = useUserStore()
- // 初始化用户状态
+ // 优化:只在首次访问时初始化用户状态
if (!userStore.initialized) {
await userStore.init()
}
@@ -208,8 +236,9 @@ router.beforeEach(async (to, from, next) => {
// 检查管理员权限
if (to.meta.requiresAdmin && !userStore.isAdmin) {
- // 权限不足,跳转到首页
- next('/home')
+ // 权限不足,跳转到个人主页并显示警告
+ ElMessage.warning('权限不足,只有管理员才能访问此页面')
+ next('/profile')
return
}
}
diff --git a/demo/frontend/src/views/AdminDashboard.vue b/demo/frontend/src/views/AdminDashboard.vue
index 043b56b..5f14bc2 100644
--- a/demo/frontend/src/views/AdminDashboard.vue
+++ b/demo/frontend/src/views/AdminDashboard.vue
@@ -23,7 +23,7 @@
API管理
-
+
生成任务记录
@@ -144,16 +144,16 @@
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { ElMessage } from 'element-plus'
-import {
- Grid,
- User,
+import {
+ Grid,
+ User,
ShoppingCart,
Document,
- Briefcase,
+ User as Briefcase,
Setting,
- Search,
+ User as Search,
Bell,
- Avatar,
+ User as Avatar,
ArrowDown,
Money
} from '@element-plus/icons-vue'
@@ -173,6 +173,10 @@ const goToOrders = () => {
router.push('/admin/orders')
}
+const goToTasks = () => {
+ router.push('/generate-task-record')
+}
+
// 页面加载时获取数据
onMounted(() => {
console.log('后台管理页面加载完成')
diff --git a/demo/frontend/src/views/AdminOrders.vue b/demo/frontend/src/views/AdminOrders.vue
index d0c70f5..ab6936c 100644
--- a/demo/frontend/src/views/AdminOrders.vue
+++ b/demo/frontend/src/views/AdminOrders.vue
@@ -315,6 +315,23 @@
+
+
\ No newline at end of file
diff --git a/demo/frontend/src/views/BasicTest.vue b/demo/frontend/src/views/BasicTest.vue
new file mode 100644
index 0000000..4883b02
--- /dev/null
+++ b/demo/frontend/src/views/BasicTest.vue
@@ -0,0 +1,50 @@
+
+
+
基础测试页面
+
这个页面不使用任何Element Plus图标
+
+
+
如果你能看到这个内容,说明Vue组件能正常渲染
+
+
+
+
+
+
+
diff --git a/demo/frontend/src/views/GenerateTaskRecord.vue b/demo/frontend/src/views/GenerateTaskRecord.vue
new file mode 100644
index 0000000..7d07284
--- /dev/null
+++ b/demo/frontend/src/views/GenerateTaskRecord.vue
@@ -0,0 +1,629 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.status }}
+
+
+
+
+
+
+ 查看
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/frontend/src/views/HelloWorld.vue b/demo/frontend/src/views/HelloWorld.vue
new file mode 100644
index 0000000..bbe3bca
--- /dev/null
+++ b/demo/frontend/src/views/HelloWorld.vue
@@ -0,0 +1,10 @@
+
+
+
Hello World!
+
Vue is working!
+
+
+
+
diff --git a/demo/frontend/src/views/Home.vue b/demo/frontend/src/views/Home.vue
index c25b748..d9580d7 100644
--- a/demo/frontend/src/views/Home.vue
+++ b/demo/frontend/src/views/Home.vue
@@ -20,7 +20,7 @@
订单管理
-
+
API管理
@@ -99,84 +99,7 @@
-
-
-
-
-
-
-
-
- {{ data.label }}
-
-
- {{ tick }}
-
-
-
+
@@ -235,6 +158,17 @@ import { ref, onMounted, computed } from 'vue'
import { useRouter } from 'vue-router'
import { useUserStore } from '@/stores/user'
import { ElMessage } from 'element-plus'
+import {
+ Grid,
+ User,
+ ShoppingCart,
+ Document,
+ Setting,
+ Search,
+ Bell,
+ ArrowDown,
+ Money
+} from '@element-plus/icons-vue'
import * as dashboardAPI from '@/api/dashboard'
import DailyActiveUsersChart from '@/components/DailyActiveUsersChart.vue'
@@ -242,6 +176,8 @@ const router = useRouter()
const userStore = useUserStore()
// 数据状态
+const loading = ref(false)
+const selectedYear = ref('2024')
const dashboardData = ref({
totalUsers: 0,
paidUsers: 0,
@@ -266,70 +202,7 @@ const systemStatus = ref({
serviceStatus: '运行中'
})
-const selectedYear = ref(2024)
-const highlightedPoint = ref(null)
-const loading = ref(false)
-
-// 计算图表尺寸和比例
-const chartWidth = 800
-const chartHeight = 200
-const padding = 60
-
-// 计算数据点的SVG坐标
-const chartPoints = computed(() => {
- if (monthlyData.value.length === 0) return []
-
- const maxValue = Math.max(...monthlyData.value.map(d => d.revenue || 0))
- const minValue = Math.min(...monthlyData.value.map(d => d.revenue || 0))
- const valueRange = maxValue - minValue || 1
-
- return monthlyData.value.map((data, index) => {
- const x = padding + (index * (chartWidth - 2 * padding) / (monthlyData.value.length - 1))
- const y = padding + ((maxValue - (data.revenue || 0)) / valueRange) * (chartHeight - 2 * padding)
- return {
- x,
- y,
- value: data.revenue || 0,
- label: `${data.month}月`,
- month: data.month
- }
- })
-})
-
-// 生成SVG路径
-const chartPath = computed(() => {
- if (chartPoints.value.length < 2) return ''
-
- let path = `M ${chartPoints.value[0].x},${chartPoints.value[0].y}`
-
- for (let i = 1; i < chartPoints.value.length; i++) {
- const prev = chartPoints.value[i - 1]
- const curr = chartPoints.value[i]
- const next = chartPoints.value[i + 1]
-
- if (next) {
- // 使用三次贝塞尔曲线创建平滑路径
- const cp1x = prev.x + (curr.x - prev.x) / 3
- const cp1y = prev.y
- const cp2x = curr.x - (next.x - curr.x) / 3
- const cp2y = curr.y
-
- path += ` C ${cp1x},${cp1y} ${cp2x},${cp2y} ${curr.x},${curr.y}`
- } else {
- // 最后一个点
- const cp1x = prev.x + (curr.x - prev.x) / 3
- const cp1y = prev.y
- path += ` C ${cp1x},${cp1y} ${curr.x},${curr.y} ${curr.x},${curr.y}`
- }
- }
-
- return path
-})
-
-// 处理数据点点击
-const handlePointClick = (point) => {
- highlightedPoint.value = point
-}
+// 清理未使用的图表相关代码
// 导航功能
const goToUsers = () => {
@@ -346,15 +219,15 @@ const goToOrders = () => {
}
const goToAPI = () => {
- ElMessage.info('跳转到API管理')
+ router.push('/api-management')
}
const goToTasks = () => {
- ElMessage.info('跳转到生成任务记录')
+ router.push('/generate-task-record')
}
const goToSettings = () => {
- ElMessage.info('跳转到系统设置')
+ router.push('/system-settings')
}
// 加载仪表盘数据
@@ -371,39 +244,39 @@ const loadDashboardData = async () => {
])
// 处理概览数据
- if (overviewRes.data) {
+ if (overviewRes) {
dashboardData.value = {
- totalUsers: overviewRes.data.totalUsers || 0,
- paidUsers: overviewRes.data.paidUsers || 0,
- todayRevenue: overviewRes.data.todayRevenue || 0,
- totalOrders: overviewRes.data.totalOrders || 0,
- totalRevenue: overviewRes.data.totalRevenue || 0,
- monthRevenue: overviewRes.data.monthRevenue || 0
+ totalUsers: overviewRes.totalUsers || 0,
+ paidUsers: overviewRes.paidUsers || 0,
+ todayRevenue: overviewRes.todayRevenue || 0,
+ totalOrders: overviewRes.totalOrders || 0,
+ totalRevenue: overviewRes.totalRevenue || 0,
+ monthRevenue: overviewRes.monthRevenue || 0
}
}
// 处理月度数据
- if (monthlyRes.data && monthlyRes.data.monthlyData) {
- monthlyData.value = monthlyRes.data.monthlyData
+ if (monthlyRes && monthlyRes.monthlyData) {
+ monthlyData.value = monthlyRes.monthlyData
}
// 处理转化率数据
- if (conversionRes.data) {
+ if (conversionRes) {
conversionData.value = {
- totalUsers: conversionRes.data.totalUsers || 0,
- paidUsers: conversionRes.data.paidUsers || 0,
- conversionRate: conversionRes.data.conversionRate || 0,
- membershipStats: conversionRes.data.membershipStats || []
+ totalUsers: conversionRes.totalUsers || 0,
+ paidUsers: conversionRes.paidUsers || 0,
+ conversionRate: conversionRes.conversionRate || 0,
+ membershipStats: conversionRes.membershipStats || []
}
}
// 处理系统状态
- if (statusRes.data) {
+ if (statusRes) {
systemStatus.value = {
- onlineUsers: statusRes.data.onlineUsers || 0,
- systemUptime: statusRes.data.systemUptime || '0小时0分',
- databaseStatus: statusRes.data.databaseStatus || '正常',
- serviceStatus: statusRes.data.serviceStatus || '运行中'
+ onlineUsers: statusRes.onlineUsers || 0,
+ systemUptime: statusRes.systemUptime || '0小时0分',
+ databaseStatus: statusRes.databaseStatus || '正常',
+ serviceStatus: statusRes.serviceStatus || '运行中'
}
}
diff --git a/demo/frontend/src/views/ImageToVideo.vue b/demo/frontend/src/views/ImageToVideo.vue
index 5796685..02099dd 100644
--- a/demo/frontend/src/views/ImageToVideo.vue
+++ b/demo/frontend/src/views/ImageToVideo.vue
@@ -25,8 +25,8 @@
图生视频
-
-
+
+
分镜视频
Sora2.0
@@ -148,7 +148,7 @@
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { ElIcon, ElButton, ElTag, ElMessage, ElDialog } from 'element-plus'
-import { User, Compass, Document, VideoPlay, Picture } from '@element-plus/icons-vue'
+import { User, Document, VideoPlay, Picture, Film, Compass } from '@element-plus/icons-vue'
const router = useRouter()
@@ -204,7 +204,7 @@ const goToTextToVideo = () => {
router.push('/text-to-video')
}
-const goToStoryboard = () => {
+const goToStoryboardVideo = () => {
router.push('/storyboard-video')
}
@@ -252,46 +252,54 @@ onMounted(() => {
/* 左侧导航栏 */
.sidebar {
- width: 280px;
- background: #1a1a1a;
- border-right: 1px solid #333;
- padding: 24px 0;
+ width: 280px !important;
+ background: #1a1a1a !important;
+ padding: 24px 0 !important;
+ border-right: 1px solid #1a1a1a !important;
+ flex-shrink: 0 !important;
+ z-index: 100 !important;
+ display: block !important;
+ position: relative !important;
}
.logo {
- font-size: 18px;
- font-weight: 600;
- color: #fff;
- text-align: center;
- margin-bottom: 32px;
+ padding: 0 24px 32px;
+ font-size: 20px;
+ font-weight: 500;
+ color: white;
}
.nav-menu {
- display: flex;
- flex-direction: column;
- gap: 8px;
- padding: 0 20px;
+ padding: 0 24px;
}
.nav-item {
display: flex;
align-items: center;
- gap: 12px;
- padding: 12px 16px;
+ padding: 14px 18px;
+ margin-bottom: 4px;
border-radius: 8px;
cursor: pointer;
- transition: all 0.2s;
- color: #d1d5db;
+ transition: all 0.3s ease;
+ position: relative;
}
.nav-item:hover {
background: #2a2a2a;
- color: #fff;
}
.nav-item.active {
- background: #3b82f6;
- color: #fff;
+ background: #1e3a8a;
+}
+
+.nav-item .el-icon {
+ margin-right: 14px;
+ font-size: 20px;
+}
+
+.nav-item span {
+ font-size: 15px;
+ flex: 1;
}
.nav-divider {
diff --git a/demo/frontend/src/views/ImageToVideoCreate.vue b/demo/frontend/src/views/ImageToVideoCreate.vue
index 09b16b0..214540f 100644
--- a/demo/frontend/src/views/ImageToVideoCreate.vue
+++ b/demo/frontend/src/views/ImageToVideoCreate.vue
@@ -782,3 +782,5 @@ const startGenerate = () => {
+
+
diff --git a/demo/frontend/src/views/ImageToVideoDetail.vue b/demo/frontend/src/views/ImageToVideoDetail.vue
index 0c0029a..c7cdb76 100644
--- a/demo/frontend/src/views/ImageToVideoDetail.vue
+++ b/demo/frontend/src/views/ImageToVideoDetail.vue
@@ -150,8 +150,8 @@ import { ref, onMounted, onUnmounted } from 'vue'
import { useRoute } from 'vue-router'
import { ElMessage, ElMessageBox } from 'element-plus'
import {
- User, Setting, Bell, Document, Picture, VideoPlay, VideoPause,
- FullScreen, Share, Download, Delete, ArrowUp, ArrowDown
+ User, Setting, Bell, Document, User as Picture, User as VideoPlay, User as VideoPause,
+ User as FullScreen, User as Share, User as Download, User as Delete, User as ArrowUp, User as ArrowDown
} from '@element-plus/icons-vue'
const route = useRoute()
diff --git a/demo/frontend/src/views/Login.vue b/demo/frontend/src/views/Login.vue
index 8fb398f..1106814 100644
--- a/demo/frontend/src/views/Login.vue
+++ b/demo/frontend/src/views/Login.vue
@@ -71,8 +71,8 @@
管理员: 15538239326 / 0627
-
-
普通用户: demo / demo
+
+ 普通用户: 13689270819 / 0627
测试用户: testuser / test123
@@ -92,7 +92,7 @@ import { ref, reactive, onMounted } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { useUserStore } from '@/stores/user'
import { ElMessage } from 'element-plus'
-import { ArrowDown } from '@element-plus/icons-vue'
+import { User } from '@element-plus/icons-vue'
const router = useRouter()
const route = useRoute()
diff --git a/demo/frontend/src/views/MemberManagement.vue b/demo/frontend/src/views/MemberManagement.vue
index ac35717..d5ed37b 100644
--- a/demo/frontend/src/views/MemberManagement.vue
+++ b/demo/frontend/src/views/MemberManagement.vue
@@ -20,7 +20,7 @@
订单管理
-
+
API管理
@@ -199,6 +199,18 @@
import { ref, onMounted, computed } from 'vue'
import { useRouter } from 'vue-router'
import { ElMessage, ElMessageBox } from 'element-plus'
+import {
+ Grid,
+ User,
+ ShoppingCart,
+ Document,
+ Setting,
+ User as Search,
+ Bell,
+ User as ArrowDown,
+ User as Edit,
+ User as Delete
+} from '@element-plus/icons-vue'
import * as memberAPI from '@/api/members'
const router = useRouter()
@@ -253,15 +265,15 @@ const goToOrders = () => {
}
const goToAPI = () => {
- ElMessage.info('跳转到API管理')
+ router.push('/api-management')
}
const goToTasks = () => {
- ElMessage.info('跳转到生成任务记录')
+ router.push('/generate-task-record')
}
const goToSettings = () => {
- ElMessage.info('跳转到系统设置')
+ router.push('/system-settings')
}
// 表格操作
@@ -455,15 +467,15 @@ const loadMembers = async () => {
})
// 处理API响应数据
- if (response.data && response.data.list) {
- memberList.value = response.data.list.map(member => ({
+ if (response && response.list) {
+ memberList.value = response.list.map(member => ({
id: member.id,
username: member.username,
level: getMembershipLevel(member.membership),
points: member.points,
expiryDate: getMembershipExpiry(member.membership)
}))
- totalMembers.value = response.data.total || 0
+ totalMembers.value = response.total || 0
} else {
// 如果API暂时不可用,使用模拟数据
memberList.value = [
diff --git a/demo/frontend/src/views/MyWorks.vue b/demo/frontend/src/views/MyWorks.vue
index f66b38b..a376b3f 100644
--- a/demo/frontend/src/views/MyWorks.vue
+++ b/demo/frontend/src/views/MyWorks.vue
@@ -1,6 +1,74 @@
+
+
@@ -233,12 +314,13 @@
import { ref, onMounted, computed } from 'vue'
import { useRouter } from 'vue-router'
import { ElMessage, ElMessageBox } from 'element-plus'
-import { Star, MoreFilled, User } from '@element-plus/icons-vue'
+import { Star, User, Compass, Document, VideoPlay, Picture, Film, Bell, Setting, Search } from '@element-plus/icons-vue'
const router = useRouter()
const activeTab = ref('all')
const dateRange = ref([])
+const dateFilter = ref('')
const category = ref('all')
const resolution = ref('')
const sortBy = ref('date')
@@ -443,6 +525,42 @@ const bulkDelete = async () => {
} catch (_) {}
}
+// 导航方法
+const goToProfile = () => {
+ console.log('导航到个人主页')
+ router.push('/profile')
+}
+
+const goToSubscription = () => {
+ console.log('导航到会员订阅')
+ router.push('/subscription')
+}
+
+const goToTextToVideo = () => {
+ console.log('导航到文生视频')
+ router.push('/text-to-video')
+}
+
+const goToImageToVideo = () => {
+ console.log('导航到图生视频')
+ router.push('/image-to-video')
+}
+
+const goToStoryboardVideo = () => {
+ console.log('导航到分镜视频')
+ router.push('/storyboard-video')
+}
+
+// 重置筛选器
+const resetFilters = () => {
+ dateFilter.value = ''
+ category.value = 'all'
+ resolution.value = ''
+ sortBy.value = 'date'
+ keyword.value = ''
+ ElMessage.success('筛选器已重置')
+}
+
onMounted(() => {
loadList()
})
@@ -450,8 +568,189 @@ onMounted(() => {
\ No newline at end of file
diff --git a/demo/frontend/src/views/StoryboardVideo.vue b/demo/frontend/src/views/StoryboardVideo.vue
index 18eb6e3..ae09bbf 100644
--- a/demo/frontend/src/views/StoryboardVideo.vue
+++ b/demo/frontend/src/views/StoryboardVideo.vue
@@ -26,7 +26,7 @@
图生视频
-
+
分镜视频
Sora2.0
@@ -148,7 +148,7 @@
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { ElIcon, ElButton, ElTag, ElMessage, ElDialog } from 'element-plus'
-import { User, Compass, Document, VideoPlay, Picture } from '@element-plus/icons-vue'
+import { User, Document, VideoPlay, Picture, Film, Compass } from '@element-plus/icons-vue'
const router = useRouter()
@@ -252,46 +252,54 @@ onMounted(() => {
/* 左侧导航栏 */
.sidebar {
- width: 280px;
- background: #1a1a1a;
- border-right: 1px solid #333;
- padding: 24px 0;
+ width: 280px !important;
+ background: #1a1a1a !important;
+ padding: 24px 0 !important;
+ border-right: 1px solid #1a1a1a !important;
+ flex-shrink: 0 !important;
+ z-index: 100 !important;
+ display: block !important;
+ position: relative !important;
}
.logo {
- font-size: 18px;
- font-weight: 600;
- color: #fff;
- text-align: center;
- margin-bottom: 32px;
+ padding: 0 24px 32px;
+ font-size: 20px;
+ font-weight: 500;
+ color: white;
}
.nav-menu {
- display: flex;
- flex-direction: column;
- gap: 8px;
- padding: 0 20px;
+ padding: 0 24px;
}
.nav-item {
display: flex;
align-items: center;
- gap: 12px;
- padding: 12px 16px;
+ padding: 14px 18px;
+ margin-bottom: 4px;
border-radius: 8px;
cursor: pointer;
- transition: all 0.2s;
- color: #d1d5db;
+ transition: all 0.3s ease;
+ position: relative;
}
.nav-item:hover {
background: #2a2a2a;
- color: #fff;
}
.nav-item.active {
- background: #3b82f6;
- color: #fff;
+ background: #1e3a8a;
+}
+
+.nav-item .el-icon {
+ margin-right: 14px;
+ font-size: 20px;
+}
+
+.nav-item span {
+ font-size: 15px;
+ flex: 1;
}
.nav-divider {
diff --git a/demo/frontend/src/views/StoryboardVideoCreate.vue b/demo/frontend/src/views/StoryboardVideoCreate.vue
index 571a0e0..1c0d5f9 100644
--- a/demo/frontend/src/views/StoryboardVideoCreate.vue
+++ b/demo/frontend/src/views/StoryboardVideoCreate.vue
@@ -733,3 +733,5 @@ const startGenerate = () => {
+
+
diff --git a/demo/frontend/src/views/Subscription.vue b/demo/frontend/src/views/Subscription.vue
index 62acd3d..15a614a 100644
--- a/demo/frontend/src/views/Subscription.vue
+++ b/demo/frontend/src/views/Subscription.vue
@@ -15,7 +15,7 @@
会员订阅
-
+
我的作品
@@ -29,15 +29,15 @@