import Vue from 'vue'; import store from '@/store'; import router from './router'; import NProgress from 'nprogress'; // Progress 进度条 import 'nprogress/nprogress.css';// Progress 进度条样式 import { admin, userDesign} from './router'; import { getToken, getScreenToken, getDesignToken} from '@/utils/auth'; // 验权 // getPlanToken import { LoginParams } from '@/utils/login'; import { getSessionStorage } from '@/utils/auth'; function hasPermission(roles, permissionRoles) { if (roles.indexOf(admin) >= 0) return true; if (!permissionRoles) return true; return roles.some(role => permissionRoles.indexOf(role) >= 0); } const isDev = process.env.NODE_ENV === 'development'; // '/plan/login', '/plan/login1', const whiteList = ['/login', '/login1', '/dp/login', '/dp/login1', '/design/login1']; // 不重定向白名单 const loginPage = isDev ? whiteList[1] : whiteList[0]; const loginScreenPage = isDev ? whiteList[3] : whiteList[2]; // const loginPlanPage = isDev ? whiteList[5] : whiteList[4]; const loginDesignPage = isDev ? whiteList[4] : whiteList[4]; // 获取路径数据 function getRouteInfo(to) { let loginPath = '/'; let getTokenInfo = () => { }; let clientId = ''; const toRoutePath = to.redirectedFrom || to.path; if (/^\/dp/.test(toRoutePath) || /^\/display\/dp/.test(toRoutePath)) { loginPath = loginScreenPage; getTokenInfo = getScreenToken; clientId = LoginParams.DaPing.clientId; } // else if (/^\/plan/.test(toRoutePath) || /^\/display\/plan/.test(toRoutePath) || /^\/planEdit/.test(toRoutePath)) { // loginPath = loginPlanPage; // getTokenInfo = getToken; // clientId = LoginParams.LianJiHua.clientId; else if (/^\/design/.test(toRoutePath) || /^\/scriptDisplay/.test(toRoutePath) || /^\/plan/.test(toRoutePath) || /^\/publish/.test(toRoutePath) || /^\/orderauthor/.test(toRoutePath) || /^\/system/.test(toRoutePath) || /^\/display\/plan/.test(toRoutePath) || /^\/display\/manage/.test(toRoutePath) || /^\/apply/.test(toRoutePath)) { loginPath = loginDesignPage; getTokenInfo = getDesignToken; clientId = LoginParams.Design.clientId; } else { loginPath = loginPage; getTokenInfo = getToken; clientId = null; } return { clientId, loginPath, getTokenInfo }; } function handleRoute(to, from, next, routeInfo) { if (store.getters.roles.length === 0) { // 拉取用户信息 store.dispatch('GetInfo', routeInfo.getTokenInfo).then(res => { // 根据roles权限生成可访问的路由表 // debugger; const roles = res.roles; if (getSessionStorage('design')) { roles.push(userDesign); } store.dispatch('GenerateRoutes', { roles, clientId: routeInfo.clientId }).then(() => { // 动态添加可访问路由表 router.addRoutes(store.getters.addRouters); // router.addRoutes(asyncRouter1); if (to.redirectedFrom) { next({ path: to.redirectedFrom, replace: true }); } else { next({ ...to, replace: true }); } }); }).catch(() => { store.dispatch('FedLogOut', routeInfo.clientId).then(() => { Vue.prototype.$messageBox('验证失败,请重新登陆!'); next({ path: routeInfo.loginPath }); }); }); } else { // 除没有动态改变权限的需求可直接next() 删下方权限判断 if (hasPermission(store.getters.roles, to.meta.roles)) { next(); } else { next({ path: '/401', replace: true, query: { noGoBack: true } }); } } } router.beforeEach((to, from, next) => { NProgress.start(); const routeInfo = getRouteInfo(to); if (routeInfo.getTokenInfo()) { // 已登录 if (to.path === routeInfo.loginPath) { // 登录页面不拦截 next(); } else { // 进入系统重新计算路由 handleRoute(to, from, next, routeInfo); } } else { // 未登录情况下 if (whiteList.indexOf(to.path) !== -1 || to.path.startsWith('/login/')) { // 在免登录白名单,直接进入 next(); } else { // 否则全部重定向到登录页 next(routeInfo.loginPath); } } }); router.afterEach(() => { // 结束Progress NProgress.done(); });