80 lines
1.9 KiB
TypeScript
80 lines
1.9 KiB
TypeScript
import { createRouter, createWebHistory } from 'vue-router'
|
|
import routes from './routes'
|
|
import { getToken } from '@/utils/token'
|
|
import { useUserStore } from '@/stores/user'
|
|
import { usePermissionStore } from '@/stores/permission'
|
|
|
|
const router = createRouter({
|
|
history: createWebHistory(import.meta.env.BASE_URL),
|
|
routes,
|
|
})
|
|
|
|
// 权限码到路由路径的映射
|
|
const permRouteMap: Record<string, string> = {
|
|
'business:member:view': '/member/list',
|
|
'business:memberCard:view': '/member/card',
|
|
'business:groupCourse:view': '/groupCourse/list',
|
|
'business:groupCourseType:view': '/groupCourse/type',
|
|
'business:groupCourseRecommend:view': '/groupCourse/recommend',
|
|
'business:checkIn:view': '/checkIn',
|
|
'business:dataCount:view': '/datacount',
|
|
'system:log:view': '/operationLog',
|
|
'system:user:view': '/system/account',
|
|
'system:role:view': '/system/role',
|
|
'system:dict:view': '/system/dict',
|
|
}
|
|
|
|
let permissionFetched = false
|
|
|
|
router.beforeEach(async (to, _from, next) => {
|
|
const token = getToken()
|
|
|
|
// 登录页:已登录则跳转仪表盘
|
|
if (to.path === '/login') {
|
|
if (token) {
|
|
next('/dashboard')
|
|
return
|
|
}
|
|
next()
|
|
return
|
|
}
|
|
|
|
// 未登录则跳转登录
|
|
if (!token) {
|
|
next('/login')
|
|
return
|
|
}
|
|
|
|
const userStore = useUserStore()
|
|
const permStore = usePermissionStore()
|
|
|
|
// 首次进入时拉取权限并生成路由
|
|
if (!permissionFetched) {
|
|
try {
|
|
await userStore.fetchCurrentUser()
|
|
permissionFetched = true
|
|
} catch {
|
|
next('/login')
|
|
return
|
|
}
|
|
}
|
|
|
|
// 仪表盘无需权限检查
|
|
if (to.path === '/dashboard') {
|
|
next()
|
|
return
|
|
}
|
|
|
|
// 查找该路径需要的权限
|
|
const requiredPerm = Object.entries(permRouteMap).find(([, path]) => path === to.path)?.[0]
|
|
|
|
if (requiredPerm && !userStore.hasPermission(requiredPerm)) {
|
|
next('/dashboard')
|
|
return
|
|
}
|
|
|
|
next()
|
|
})
|
|
|
|
export default router
|