gxd-vue-library
Version:
依赖与element Ui插件库,聚福宝福利PC端插件库
87 lines (74 loc) • 1.79 kB
JavaScript
import asyncRoutes from '@/router/async';
import {constantRoutes} from '@/router';
import permissionRoles from "@/constant/permissions";
/**
* Use meta.role to determine if the current user has permission
* @param roles
* @param route
*/
function hasPermission(roles, route) {
if (route.meta && route.meta.roles) {
return roles.some(role => route.meta.roles.includes(role))
} else {
return true
}
}
/**
* Filter asynchronous routing tables by recursion
* @param routes asyncRoutes
* @param roles
*/
export function filterAsyncRoutes(routes, roles) {
const res = []
routes.forEach(route => {
const tmp = { ...route }
if (hasPermission(roles, tmp)) {
if (tmp.children) {
tmp.children = filterAsyncRoutes(tmp.children, roles)
}
res.push(tmp)
}
})
return res
}
let has404 = false;
const state = {
routes: [],
addRoutes: []
}
const mutations = {
SET_ROUTES: (state, routes) => {
state.addRoutes = routes
state.routes = constantRoutes.concat(routes)
}
}
const actions = {
generateRoutes({ commit }, roles) {
return new Promise(resolve => {
let accessedRoutes;
//超级管理员
if (roles.includes(permissionRoles.adminRoles) ||
roles.includes(permissionRoles.devRoles)
) {
accessedRoutes = asyncRoutes || []
//部分权限
} else {
accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
}
//已经加入404页面
if(!has404) {
accessedRoutes.push({path: '*', redirect: '/404', hidden: true});
has404 = true;
}
//保存权限值
commit('SET_ROUTES', accessedRoutes);
resolve(accessedRoutes)
})
}
}
export default {
namespaced: true,
state,
mutations,
actions
}