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管理 -