Files
jianbing_admin_vue/src/permission.ts
2025-05-20 13:28:17 +08:00

112 lines
3.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 权限控制
*/
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()
})