This commit is contained in:
beabigegg
2025-09-12 08:56:44 +08:00
commit 0bc8c4c81c
86 changed files with 23146 additions and 0 deletions

View File

@@ -0,0 +1,174 @@
import { createRouter, createWebHistory } from 'vue-router'
import { useAuthStore } from '@/stores/auth'
import { ElMessage } from 'element-plus'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
// 配置 NProgress
NProgress.configure({
showSpinner: false,
minimum: 0.1,
speed: 200
})
const routes = [
{
path: '/login',
name: 'Login',
component: () => import('@/views/LoginView.vue'),
meta: {
title: '登入',
requiresAuth: false,
hideLayout: true
}
},
{
path: '/',
name: 'Layout',
component: () => import('@/layouts/MainLayout.vue'),
redirect: '/home',
meta: {
requiresAuth: true
},
children: [
{
path: '/home',
name: 'Home',
component: () => import('@/views/HomeView.vue'),
meta: {
title: '首頁',
icon: 'House',
showInMenu: true
}
},
{
path: '/upload',
name: 'Upload',
component: () => import('@/views/UploadView.vue'),
meta: {
title: '檔案上傳',
icon: 'Upload',
showInMenu: true
}
},
{
path: '/jobs',
name: 'Jobs',
component: () => import('@/views/JobListView.vue'),
meta: {
title: '任務列表',
icon: 'List',
showInMenu: true
}
},
{
path: '/history',
name: 'History',
component: () => import('@/views/HistoryView.vue'),
meta: {
title: '歷史記錄',
icon: 'Clock',
showInMenu: true
}
},
{
path: '/profile',
name: 'Profile',
component: () => import('@/views/ProfileView.vue'),
meta: {
title: '個人設定',
icon: 'User'
}
},
{
path: '/admin',
name: 'Admin',
component: () => import('@/views/AdminView.vue'),
meta: {
title: '管理後台',
icon: 'Setting',
requiresAdmin: true,
showInMenu: true
}
},
{
path: '/admin/jobs',
name: 'AdminJobs',
component: () => import('@/views/AdminJobsView.vue'),
meta: {
title: '全部任務',
requiresAdmin: true
}
}
]
},
{
path: '/job/:uuid',
name: 'JobDetail',
component: () => import('@/views/JobDetailView.vue'),
meta: {
title: '任務詳情',
requiresAuth: true,
hideLayout: false
}
},
{
path: '/:pathMatch(.*)*',
name: 'NotFound',
component: () => import('@/views/NotFoundView.vue'),
meta: {
title: '頁面不存在',
hideLayout: true
}
}
]
const router = createRouter({
history: createWebHistory(),
routes,
scrollBehavior(to, from, savedPosition) {
if (savedPosition) {
return savedPosition
} else {
return { top: 0 }
}
}
})
// 路由守衛
router.beforeEach(async (to, from, next) => {
NProgress.start()
const authStore = useAuthStore()
// 設置頁面標題
document.title = to.meta.title ? `${to.meta.title} - PANJIT Document Translator` : 'PANJIT Document Translator'
// 檢查是否需要認證
if (to.meta.requiresAuth && !authStore.isAuthenticated) {
ElMessage.warning('請先登入')
next('/login')
return
}
// 檢查管理員權限
if (to.meta.requiresAdmin && !authStore.isAdmin) {
ElMessage.error('無權限存取此頁面')
next('/home')
return
}
// 如果已經登入且訪問登入頁面,重定向到首頁
if (to.path === '/login' && authStore.isAuthenticated) {
next('/home')
return
}
next()
})
router.afterEach(() => {
NProgress.done()
})
export default router