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.
fu-hsi-web/src/config/permission.js

85 lines
2.4 KiB
JavaScript

11 months ago
import router from '@/router'
import store from '@/store'
import Progress from 'nprogress'
import 'nprogress/nprogress.css'
import getPageTitle from '@/utils/pageTitle'
import {
authentication,
loginInterception,
progressBar,
recordRoute,
routesWhiteList
} from '@/config'
Progress.configure({
easing: 'ease',
speed: 500,
trickleSpeed: 200,
showSpinner: false
})
router.beforeResolve(async(to, from, next) => {
if (progressBar) Progress.start()
let hasToken = store.getters['user/accessToken']
if (!loginInterception) hasToken = true
if (hasToken) {
if (to.path === '/login') {
next({ path: '/' })
if (progressBar) Progress.done()
} else {
const hasPermissions =
store.getters['user/permissions'] &&
store.getters['user/permissions'].length > 0
if (hasPermissions) {
next()
} else {
try {
let permissions
if (!loginInterception) {
// settings.js loginInterception为false时创建虚拟权限
await store.dispatch('user/setPermissions', ['admin'])
permissions = ['admin']
} else {
permissions = await store.dispatch('user/getUserInfo')
if (!permissions) {
await store.dispatch('user/resetAccessToken')
if (progressBar) Progress.done()
}
}
let accessRoutes = []
if (authentication === 'intelligence') {
accessRoutes = await store.dispatch('routes/setRoutes', permissions)
} else if (authentication === 'all') {
accessRoutes = await store.dispatch('routes/setAllRoutes')
}
accessRoutes.forEach((item) => {
router.addRoute(item)
})
next({ ...to, replace: true })
} catch {
await store.dispatch('user/resetAccessToken')
if (progressBar) Progress.done()
}
}
}
} else { // 没有登录
// 先判断是否是白名单
if (routesWhiteList.indexOf(to.path) !== -1) {
next()
} else {
// 重定向到登录页
if (recordRoute) {
next(`/login?redirect=${to.path}`)
} else {
next('/login')
}
if (progressBar) Progress.done()
}
}
// 获取跳转页面名称
document.title = getPageTitle(to.meta.title)
})
router.afterEach(() => {
if (progressBar) Progress.done()
})