import { loginIgnore } from '@/router/index'; import { getUserInfo } from '@/utils'; import { checkAuthorization } from '@/utils/requestUtil'; import NProgress from 'nprogress'; import { globalRoutes } from '@/router/config'; NProgress.configure({ showSpinner: false }); function hasAuthority(to) { const { path } = to; if (globalRoutes.find(m => m.path === path)) return true; const { menuList = [] } = getUserInfo(); // return !!menuList.find(i => i.menuUrl === path); return true; } /** * 进度条开始 * @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 { message } = options; if (!hasAuthority(to)) { 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], };