前端用户权限
使用的技术栈:
vue-router、vuex、element-ui
利用vue-router的全局前置守卫 beforeEach
import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getAccessToken } from '@/utils/xl-auth'
import { getTenant } from '@/utils/xl-auth'
import getPageTitle from '@/utils/get-page-title'
NProgress.configure({ showSpinner: false })
const whiteList = ['/login']
router.beforeEach(async (to, from, next) => {
NProgress.start()
document.title = getPageTitle(to.meta.title)
const hasToken = getAccessToken()
const hasTenant = getTenant()
if (hasToken && hasTenant) {
if (to.path === '/login') {
next({ path: '/' })
NProgress.done()
} else {
const hasRoles = store.getters.roles && store.getters.roles.length > 0
if (hasRoles) {
next()
} else {
try {
const menus = await store.dispatch('user/getInfo')
const accessRoutes = await store.dispatch('permission/generateRoutes', menus)
router.addRoutes(accessRoutes)
next({ ...to, replace: true })
} catch (error) {
await store.dispatch('user/resetToken')
Message.error(error || '该账号没有权限!')
next(`/login`)
NProgress.done()
}
}
}
} else {
if (whiteList.indexOf(to.path) !== -1) {
next()
} else {
next(`/login`)
NProgress.done()
}
}
})
router.afterEach(() => {
NProgress.done()
})