rt-sim-training-client/src/permission.js

156 lines
5.3 KiB
JavaScript
Raw Normal View History

2019-07-02 16:29:52 +08:00
import Vue from 'vue';
import store from '@/store';
import router from './router';
2019-11-14 13:59:33 +08:00
import NProgress from 'nprogress';
import { admin} from './router';
2019-11-25 15:57:11 +08:00
import { getToken, removeToken} from '@/utils/auth';
2019-07-02 16:29:52 +08:00
import { LoginParams } from '@/utils/login';
2019-09-23 17:47:54 +08:00
import { getSessionStorage } from '@/utils/auth';
2019-10-23 19:00:35 +08:00
import localStore from 'storejs';
2019-07-02 16:29:52 +08:00
function hasPermission(roles, permissionRoles) {
2019-10-29 15:06:15 +08:00
if (roles.indexOf(admin) >= 0) return true;
if (!permissionRoles) return true;
return roles.some(role => permissionRoles.indexOf(role) >= 0);
2019-07-02 16:29:52 +08:00
}
2020-01-14 16:19:36 +08:00
const whiteList = ['/login', '/design/login', '/xty/login', '/designxty/login', '/gzb/login', '/designgzb/login', '/jlmap3d/devicetrain', '/hyd/login']; // 不重定向白名单
2019-07-02 16:29:52 +08:00
2020-03-27 13:52:14 +08:00
const designPageRegex = [/^\/design/, /^\/scriptDisplay/, /^\/publish/, /^\/orderauthor/, /^\/system/, /^\/iscs/, /^\/display\/record/, /^\/display\/manage/, /^\/apply/, /^\/plan/, /^\/display\/plan/, /^\/displayNew\/record/, /^\/displayNew\/manage/, /^\/displayNew\/plan/];
2019-11-14 16:22:39 +08:00
function isDesignPage(toRoutePath) {
return designPageRegex.some(item => {
return item.test(toRoutePath);
});
}
2019-10-17 14:31:59 +08:00
const loginPage = whiteList[0];
2019-10-24 14:03:19 +08:00
const loginDesignPage = whiteList[1];
const loginXtyPage = whiteList[2];
2019-10-28 17:08:22 +08:00
const loginDesignXtyPage = whiteList[3];
const loginGzbPage = whiteList[4];
const loginDesignGzbPage = whiteList[5];
2020-01-13 13:56:03 +08:00
const loginHydPage = whiteList[7];
const loginDesignPageMenu = {
design: loginDesignPage,
designxty: loginDesignXtyPage,
2020-01-19 18:36:17 +08:00
designgzb: loginDesignGzbPage
};
const loginPageMenu = {
login: loginPage,
xty: loginXtyPage,
2020-01-13 13:33:35 +08:00
gzb: loginGzbPage,
hyd: loginHydPage
};
2019-07-02 16:29:52 +08:00
// 获取路径数据
function getRouteInfo(to) {
let loginPath = '/login';
2019-10-29 15:06:15 +08:00
let clientId = '';
const toRoutePath = to.redirectedFrom || to.path;
2019-11-25 18:58:39 +08:00
const current_session = getSessionStorage('project');
2019-10-29 15:06:15 +08:00
if (/^\/designxty/.test(toRoutePath)) {
loginPath = loginDesignXtyPage;
clientId = LoginParams.Design.clientId;
} else if (/^\/designgzb/.test(toRoutePath)) {
loginPath = loginDesignGzbPage;
clientId = LoginParams.Design.clientId;
2019-11-14 16:22:39 +08:00
} else if (isDesignPage(toRoutePath)) {
2019-12-31 09:12:40 +08:00
loginPath = loginDesignPageMenu[current_session] || loginDesignPage;
2019-10-29 15:06:15 +08:00
clientId = LoginParams.Design.clientId;
2019-11-25 15:57:11 +08:00
if (current_session && !current_session.startsWith('design')) {
removeToken();
}
2019-10-29 15:06:15 +08:00
} else if ( /^\/xty/.test(toRoutePath)) {
loginPath = loginXtyPage;
clientId = null;
} else if ( /^\/gzb/.test(toRoutePath)) {
loginPath = loginGzbPage;
clientId = null;
2020-01-13 13:33:35 +08:00
} else if (/^\/hyd/.test(toRoutePath)) {
loginPath = loginHydPage;
clientId = null;
2019-10-29 15:06:15 +08:00
} else {
2019-12-31 09:12:40 +08:00
loginPath = loginPageMenu[current_session] || loginPath;
2019-10-29 15:06:15 +08:00
clientId = null;
2019-11-25 15:57:11 +08:00
if (current_session && current_session.startsWith('design')) {
removeToken();
}
2019-10-29 15:06:15 +08:00
}
2019-07-02 16:29:52 +08:00
2019-11-14 13:59:33 +08:00
return { clientId, loginPath };
2019-07-02 16:29:52 +08:00
}
function handleRoute(to, from, next, routeInfo) {
2019-10-29 15:06:15 +08:00
if (store.getters.roles.length === 0) {
// 拉取用户信息
2019-11-14 13:59:33 +08:00
store.dispatch('GetInfo', getToken()).then(res => {
2019-10-29 15:06:15 +08:00
// 根据roles权限生成可访问的路由表
const roles = res.roles;
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 });
}
});
2019-07-02 16:29:52 +08:00
2019-10-29 15:06:15 +08:00
}).catch(() => {
2019-11-14 13:59:33 +08:00
store.dispatch('FedLogOut').then(() => {
2019-10-29 15:06:15 +08:00
Vue.prototype.$messageBox('验证失败,请重新登录!');
next({ path: routeInfo.loginPath });
});
});
} else {
// 除没有动态改变权限的需求可直接next() 删下方权限判断
if (hasPermission(store.getters.roles, to.meta.roles)) {
if (to.path === '/404' && to.redirectedFrom === '/') {
next(localStore.get('trainingPlatformRoute' + store.getters.id) || '/trainingPlatform');
} else {
next();
}
} else {
next({ path: '/401', replace: true, query: { noGoBack: true } });
}
}
2019-07-02 16:29:52 +08:00
}
router.beforeEach((to, from, next) => {
2019-10-29 15:06:15 +08:00
NProgress.start();
const routeInfo = getRouteInfo(to);
2019-11-14 13:59:33 +08:00
if (getToken()) {
2019-10-29 15:06:15 +08:00
// 已登录
if (to.path === routeInfo.loginPath) {
// 登录页面不拦截
next();
} else {
// 进入系统重新计算路由
handleRoute(to, from, next, routeInfo);
}
} else {
// 未登录情况下
if (whiteList.indexOf(to.path) !== -1) {
// 在免登录白名单,直接进入
next();
} else {
// 否则全部重定向到登录页
next(routeInfo.loginPath);
}
}
2019-07-02 16:29:52 +08:00
});
2019-11-12 17:20:23 +08:00
NProgress.configure({
easing: 'ease', // 动画方式
speed: 500, // 递增进度条的速度
showSpinner: false, // 是否显示加载ico
trickleSpeed: 200, // 自动递增间隔
minimum: 0.3 // 初始化时的最小百分比
});
2019-07-02 16:29:52 +08:00
router.afterEach(() => {
2019-10-29 15:06:15 +08:00
// 结束Progress
NProgress.done();
2019-07-02 16:29:52 +08:00
});