rt-sim-training-client/src/permission.js
2019-10-15 09:39:01 +08:00

124 lines
4.0 KiB
JavaScript

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();
});