112 lines
3.6 KiB
TypeScript
112 lines
3.6 KiB
TypeScript
/**
|
||
* 权限控制
|
||
*/
|
||
|
||
import 'nprogress/nprogress.css'
|
||
|
||
import NProgress from 'nprogress'
|
||
|
||
import config from './config'
|
||
import { PageEnum } from './enums/pageEnum'
|
||
import router, { findFirstValidRoute } from './router'
|
||
import { INDEX_ROUTE, INDEX_ROUTE_NAME } from './router/routes'
|
||
import useTabsStore from './stores/modules/multipleTabs'
|
||
import useUserStore from './stores/modules/user'
|
||
import { clearAuthInfo } from './utils/auth'
|
||
import { isExternal } from './utils/validate'
|
||
|
||
// 动态添加路由-使用递归进行调整-(fix: 修复之前超过3级菜单导致使用keep-alive功能无效问题
|
||
const addRoutesRecursively = (routes: any, parentPath = '') => {
|
||
try {
|
||
routes.forEach((route: any) => {
|
||
// 如果路由是外部链接,则不添加
|
||
if (isExternal(route.path)) {
|
||
return
|
||
}
|
||
|
||
// 拼接父路由路径和当前路由路径
|
||
const fullPath = parentPath + route.path
|
||
|
||
// 创建路由对象,确保每个路由都有唯一的名称
|
||
const routerEntry = {
|
||
...route,
|
||
path: fullPath,
|
||
name: route.name || fullPath.replace(/\//g, '_').replace('_', '') // 替换斜杠为下划线,生成唯一名称
|
||
}
|
||
|
||
// 添加路由
|
||
if (!route.children) {
|
||
router.addRoute(INDEX_ROUTE_NAME, routerEntry)
|
||
} else {
|
||
router.addRoute(routerEntry)
|
||
}
|
||
|
||
// 递归处理子路由
|
||
if (route.children && route.children.length > 0) {
|
||
addRoutesRecursively(route.children, fullPath + '/')
|
||
}
|
||
})
|
||
} catch (e) {
|
||
console.error('Error adding routes:', e)
|
||
}
|
||
}
|
||
|
||
// NProgress配置
|
||
NProgress.configure({ showSpinner: false })
|
||
|
||
const loginPath = PageEnum.LOGIN
|
||
const defaultPath = PageEnum.INDEX
|
||
// 免登录白名单
|
||
const whiteList: string[] = [PageEnum.LOGIN, PageEnum.ERROR_403]
|
||
router.beforeEach(async (to, from, next) => {
|
||
// 开始 Progress Bar
|
||
NProgress.start()
|
||
document.title = to.meta.title ?? config.title
|
||
const userStore = useUserStore()
|
||
const tabsStore = useTabsStore()
|
||
if (whiteList.includes(to.path)) {
|
||
// 在免登录白名单,直接进入
|
||
next()
|
||
} else if (userStore.token) {
|
||
// 获取用户信息
|
||
const hasGetUserInfo = Object.keys(userStore.userInfo).length !== 0
|
||
if (hasGetUserInfo) {
|
||
if (to.path === loginPath) {
|
||
next({ path: defaultPath })
|
||
} else {
|
||
next()
|
||
}
|
||
} else {
|
||
try {
|
||
await userStore.getUserInfo()
|
||
const routes = userStore.routes
|
||
// 找到第一个有效路由
|
||
const routeName = findFirstValidRoute(routes)
|
||
// 没有有效路由跳转到403页面
|
||
if (!routeName) {
|
||
clearAuthInfo()
|
||
next(PageEnum.ERROR_403)
|
||
return
|
||
}
|
||
tabsStore.setRouteName(routeName!)
|
||
INDEX_ROUTE.redirect = { name: routeName }
|
||
|
||
// 动态添加index路由
|
||
router.addRoute(INDEX_ROUTE)
|
||
// 动态添加其余路由
|
||
addRoutesRecursively(routes)
|
||
next({ ...to, replace: true })
|
||
} catch (err) {
|
||
clearAuthInfo()
|
||
next({ path: loginPath, query: { redirect: to.fullPath } })
|
||
}
|
||
}
|
||
} else {
|
||
next({ path: loginPath, query: { redirect: to.fullPath } })
|
||
}
|
||
})
|
||
|
||
router.afterEach(() => {
|
||
NProgress.done()
|
||
})
|