You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.7 KiB
JavaScript
51 lines
1.7 KiB
JavaScript
import router from './router'
|
|
import Performance from '@/tools/performance'
|
|
import { usePermissionStore } from "@/store/permission"
|
|
import { useUserStore } from "@/store/user"
|
|
|
|
export function usePermission() {
|
|
let end = null
|
|
const whiteList = ['/login'] // 不重定向白名单
|
|
router.beforeEach(async (to, from, next) => {
|
|
const { GenerateRoutes, routers } = usePermissionStore()
|
|
const { GetUserInfo, token, roles, logOut } = useUserStore()
|
|
end = Performance.startExecute(`${from.path} => ${to.path} 路由耗时`) /// 路由性能监控
|
|
if (token) {
|
|
if (to.path === '/login') {
|
|
next({ path: '/' })
|
|
} else {
|
|
const hasRoles = roles && roles.length > 0;
|
|
if (hasRoles && routers && routers.length > 0) {
|
|
next()
|
|
} else {
|
|
try {
|
|
const roles = await GetUserInfo()
|
|
const accessRoutes = await GenerateRoutes(roles)
|
|
accessRoutes.forEach(item => {
|
|
router.addRoute(item)
|
|
})
|
|
next({ ...to, replace: true })
|
|
} catch (error) {
|
|
await logOut()
|
|
console.error(error)
|
|
next('/login')
|
|
}
|
|
}
|
|
|
|
}
|
|
} else {
|
|
if (whiteList.includes(to.path)) {
|
|
next()
|
|
} else {
|
|
next('/login')
|
|
}
|
|
}
|
|
|
|
setTimeout(() => {
|
|
end()
|
|
}, 0)
|
|
})
|
|
|
|
router.afterEach(() => { })
|
|
}
|