From 08b737b1ef9c3305e8405e9ab97b289479483909 Mon Sep 17 00:00:00 2001 From: AIGC Developer Date: Thu, 23 Oct 2025 09:59:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9D=83=E9=99=90=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E9=97=AE=E9=A2=98=EF=BC=9A=E6=99=AE=E9=80=9A=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=97=A0=E6=B3=95=E8=AE=BF=E9=97=AE=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- demo/ORDER_MANAGEMENT_SUMMARY.md | 2 + demo/PasswordChecker.java | 2 + demo/VUE_FRONTEND_SUMMARY.md | 2 + demo/frontend/README.md | 2 + demo/frontend/src/App-backup.vue | 2 + demo/frontend/src/api/analytics.js | 19 +- demo/frontend/src/api/dashboard.js | 29 +- demo/frontend/src/api/members.js | 30 +- .../src/components/DailyActiveUsersChart.vue | 14 +- demo/frontend/src/components/Footer.vue | 2 + demo/frontend/src/components/NavBar.vue | 7 +- demo/frontend/src/main-backup.js | 21 + demo/frontend/src/main.js | 6 - demo/frontend/src/router/index.js | 97 ++- demo/frontend/src/views/AdminDashboard.vue | 18 +- demo/frontend/src/views/AdminOrders.vue | 17 + demo/frontend/src/views/AdminUsers.vue | 18 +- demo/frontend/src/views/ApiManagement.vue | 18 + demo/frontend/src/views/BasicTest.vue | 50 ++ .../frontend/src/views/GenerateTaskRecord.vue | 629 ++++++++++++++ demo/frontend/src/views/HelloWorld.vue | 10 + demo/frontend/src/views/Home.vue | 203 +---- demo/frontend/src/views/ImageToVideo.vue | 56 +- .../frontend/src/views/ImageToVideoCreate.vue | 2 + .../frontend/src/views/ImageToVideoDetail.vue | 4 +- demo/frontend/src/views/Login.vue | 6 +- demo/frontend/src/views/MemberManagement.vue | 26 +- demo/frontend/src/views/MyWorks.vue | 405 ++++++++- demo/frontend/src/views/OrderCreate.vue | 2 +- demo/frontend/src/views/OrderDetail.vue | 16 + demo/frontend/src/views/Orders.vue | 25 +- demo/frontend/src/views/PaymentCreate.vue | 12 + demo/frontend/src/views/Payments.vue | 17 + demo/frontend/src/views/Profile.vue | 260 +++++- demo/frontend/src/views/Register.vue | 14 +- demo/frontend/src/views/SimpleTest.vue | 25 +- demo/frontend/src/views/StoryboardVideo.vue | 52 +- .../src/views/StoryboardVideoCreate.vue | 2 + demo/frontend/src/views/Subscription.vue | 486 ++++++++--- demo/frontend/src/views/SystemSettings.vue | 788 ++++++++++++++++++ demo/frontend/src/views/TestPage.vue | 24 + demo/frontend/src/views/TextToVideo.vue | 56 +- demo/frontend/src/views/VideoDetail.vue | 14 +- .../demo/controller/OrderApiController.java | 1 + .../com/example/demo/model/OrderType.java | 3 +- .../example/demo/model/UserActivityStats.java | 8 +- .../UserActivityStatsRepository.java | 32 +- .../security/PlainTextPasswordEncoder.java | 2 + .../main/resources/application-dev.properties | 3 + demo/src/main/resources/data.sql | 3 +- demo/src/main/resources/order_items_fixed.sql | 25 + .../main/resources/orders_12months_fixed.sql | 265 ++++++ .../main/resources/orders_12months_new.sql | 270 ++++++ demo/src/main/resources/payments_fixed.sql | 24 + .../resources/templates/orders/admin.html | 2 + .../resources/templates/orders/detail.html | 2 + .../main/resources/templates/orders/form.html | 2 + demo/start-app.bat | 13 + demo/start-backend.ps1 | 48 ++ 59 files changed, 3586 insertions(+), 607 deletions(-) create mode 100644 demo/frontend/src/main-backup.js create mode 100644 demo/frontend/src/views/ApiManagement.vue create mode 100644 demo/frontend/src/views/BasicTest.vue create mode 100644 demo/frontend/src/views/GenerateTaskRecord.vue create mode 100644 demo/frontend/src/views/HelloWorld.vue create mode 100644 demo/frontend/src/views/SystemSettings.vue create mode 100644 demo/frontend/src/views/TestPage.vue create mode 100644 demo/src/main/resources/order_items_fixed.sql create mode 100644 demo/src/main/resources/orders_12months_fixed.sql create mode 100644 demo/src/main/resources/orders_12months_new.sql create mode 100644 demo/src/main/resources/payments_fixed.sql create mode 100644 demo/start-app.bat create mode 100644 demo/start-backend.ps1 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管理 -