rt-sim-training-client/src/store/modules/permission.js
2019-11-14 17:10:04 +08:00

118 lines
4.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { asyncRouter, constantRoutes, user, userLesson, userExam, userSimulation, userScreen, userPlan, superAdmin, admin, userTrainingPlatform } from '@/router';
import { PermissionType } from '@/utils/PermissionType';
import { UrlConfig } from '@/router/index';
import { getSessionStorage } from '@/utils/auth';
function setHonePagePath(route, roles) {
if (roles && roles.length === 2 && roles.indexOf(user) >= 0 && (route.path === '/' || route.path === 'dashboard')) {
if (roles.indexOf(userLesson) >= 0) {
route.redirect = `${UrlConfig.teach.home}`;
} else if (roles.indexOf(userExam) >= 0) {
route.redirect = `${UrlConfig.exam.home}`;
} else if (roles.indexOf(userSimulation) >= 0) {
route.redirect = `${UrlConfig.demonstration.home}`;
} else if (roles.indexOf(userScreen) >= 0) {
route.redirect = `${UrlConfig.dp.home}`;
} else if (roles.indexOf(userPlan) >= 0) {
route.redirect = `${UrlConfig.plan.home}`;
}
}
}
/**
* 通过meta.role判断是否与当前用户权限匹配
* @param roles
* @param route
*/
function hasPermission(roles, route, parentsRoles) {
setHonePagePath(route, roles);
if (route.meta && route.meta.roles) {
// 如果存在本级路由则使用自己的roles过滤
if (getSessionStorage('project').startsWith('design')) {
const result = roles.filter(role => route.meta.roles.indexOf(role) >= 0) || [];
return result.length && route.meta.roles.indexOf(userTrainingPlatform) < 0;
} else {
roles = roles.filter(function (role) {
return route.meta.roles.indexOf(role) >= 0;
});
return roles.some(role => route.meta.roles.indexOf(role) >= 0) && route.meta.roles.indexOf(userTrainingPlatform) > 0;
}
} else if (parentsRoles) {
// 如果没有本级路由,有父级路由,则使用父级路由过滤
return roles.some(role => parentsRoles.indexOf(role) >= 0);
} else {
// 如果父级和本级都没有则默认不需要过滤
return true;
}
}
/**
* 根据roles和系统类型重新设置权限列表
* @param roles
* @param type
*/
function convertRouterRoles({ roles, permissionType }) {
if (roles && roles.indexOf(user) >= 0) {
switch (permissionType) {
case PermissionType.LESSON: roles.push(userLesson); break;
case PermissionType.EXAM: roles.push(userExam); break;
case PermissionType.SIMULATION: roles.push(userSimulation); break;
case PermissionType.SCREEN: roles.push(userScreen); break;
case PermissionType.PLAN: roles.push(userPlan); break;
}
}
return { roles };
}
/**
* 递归过滤异步路由表,返回符合用户角色权限的路由表
* @param asyncRouter
* @param roles
*/
function filterAsyncRouter(asyncRouter, roles, parentsRoles) {
return asyncRouter.filter(route => {
if (route.name === '大屏系统' && roles.indexOf(admin) == -1 && roles.indexOf(userScreen) == -1) {
route.hidden = true;
}
if (hasPermission(roles, route, parentsRoles)) {
if (route.children && route.children.length) {
route.children = filterAsyncRouter(route.children, roles, route.meta ? route.meta.roles : undefined);
}
return true;
}
return false;
});
}
const permission = {
state: {
routes: constantRoutes,
addRouters: []
},
mutations: {
SET_ROUTERS: (state, routes) => {
state.addRouters = routes;
state.routes = constantRoutes.concat(routes);
}
},
actions: {
// 生成其他权限路由
GenerateRoutes({ commit }, data) {
return new Promise(resolve => {
const { roles } = convertRouterRoles(data);
if (roles.indexOf(superAdmin) >= 0 && roles.indexOf(admin) < 0) {
roles.push(admin);
}
const accessedRouters = filterAsyncRouter(asyncRouter, roles);
commit('SET_ROUTERS', accessedRouters);
resolve();
});
}
}
};
export default permission;