84 lines
2.7 KiB
TypeScript
84 lines
2.7 KiB
TypeScript
/**
|
|
* 权限控制
|
|
*/
|
|
|
|
import NProgress from 'nprogress'
|
|
import router, { findFirstValidRoute } from './router'
|
|
import 'nprogress/nprogress.css'
|
|
import { isExternal } from './utils/validate'
|
|
import useUserStore from './stores/modules/user'
|
|
import { INDEX_ROUTE, INDEX_ROUTE_NAME } from './router/routes'
|
|
import { PageEnum } from './enums/pageEnum'
|
|
import useTabsStore from './stores/modules/multipleTabs'
|
|
import { clearAuthInfo } from './utils/auth'
|
|
import config from './config'
|
|
|
|
// 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)
|
|
routes.forEach((route: any) => {
|
|
// https 则不插入
|
|
if (isExternal(route.path)) {
|
|
return
|
|
}
|
|
if (!route.children) {
|
|
router.addRoute(INDEX_ROUTE_NAME, route)
|
|
return
|
|
}
|
|
// 动态添加可访问路由表
|
|
router.addRoute(route)
|
|
})
|
|
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()
|
|
})
|