import {hasAuthority} from '@/utils/authorityUtil' import {loginIgnore} from '@/router/index' import {checkAuthorization} from '@/utils/requestUtil' import NProgress from 'nprogress' NProgress.configure({ showSpinner: false }) /** * 进度条开始 * @param to * @param form * @param next */ const progressStart = (to, from, next) => { // start progress bar if (!NProgress.isStarted()) { NProgress.start() } next() } /** * 登录守卫 * @param to * @param form * @param next * @param options */ const loginGuard = (to, from, next, options) => { const {message} = options if (!loginIgnore.includes(to) && !checkAuthorization()) { message.warning('登录已失效,请重新登录') next({path: '/login'}) } else { next() } } /** * 权限守卫 * @param to * @param form * @param next * @param options */ const authorityGuard = (to, from, next, options) => { const {store, message} = options const permissions = store.getters['accountModule/permissions'] const roles = store.getters['accountModule/roles'] if (!hasAuthority(to, permissions, roles)) { message.warning(`对不起,您无权访问页面: ${to.fullPath},请联系管理员`) next({path: '/403'}) // NProgress.done() } else { next() } } /** * 混合导航模式下一级菜单跳转重定向 * @param to * @param from * @param next * @param options * @returns {*} */ const redirectGuard = (to, from, next, options) => { const {store} = options const getFirstChild = (routes) => { const route = routes[0] if (!route.children || route.children.length === 0) { return route } return getFirstChild(route.children) } if (store.state.settingModule.layout === 'mix') { const firstMenu = store.getters['settingModule/firstMenu'] if (firstMenu.find(item => item.fullPath === to.fullPath)) { store.commit('settingModule/setActivatedFirst', to.fullPath) const subMenu = store.getters['settingModule/subMenu'] if (subMenu.length > 0) { const redirect = getFirstChild(subMenu) return next({path: redirect.fullPath}) } } } next() } /** * 进度条结束 * @param to * @param form * @param options */ const progressDone = () => { // finish progress bar NProgress.done() } export default { beforeEach: [progressStart, loginGuard, authorityGuard, redirectGuard], afterEach: [progressDone] }