Files
gym-manage/gym-manage-cuit/src/router/index.ts
T

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