import { asyncRouterMap, constantRouterMap } from '@/router'
|
|
/**
|
* 通过meta.perms判断是否与当前用户权限匹配
|
* @param perms
|
* @param route
|
*/
|
function hasPermission(perms, route) {
|
if (route.meta && route.meta.perms) {
|
return perms.some(perm => route.meta.perms.includes(perm))
|
} else {
|
return true
|
}
|
}
|
|
/**
|
* 递归过滤异步路由表,返回符合用户角色权限的路由表
|
* @param routes asyncRouterMap
|
* @param perms
|
*/
|
function filterAsyncRouter(routes, perms) {
|
const res = []
|
|
routes.forEach(route => {
|
const tmp = { ...route }
|
if (tmp.children) {
|
tmp.children = filterAsyncRouter(tmp.children, perms)
|
if (tmp.children && tmp.children.length > 0) {
|
res.push(tmp)
|
}
|
} else {
|
if (hasPermission(perms, tmp)) {
|
res.push(tmp)
|
}
|
}
|
})
|
|
return res
|
}
|
|
const permission = {
|
state: {
|
routers: constantRouterMap,
|
addRouters: []
|
},
|
mutations: {
|
SET_ROUTERS: (state, routers) => {
|
state.addRouters = routers
|
state.routers = constantRouterMap.concat(routers)
|
}
|
},
|
actions: {
|
GenerateRoutes({ commit }, data) {
|
return new Promise(resolve => {
|
const { perms } = data
|
let accessedRouters
|
if (perms.includes('*')) {
|
accessedRouters = asyncRouterMap
|
} else {
|
accessedRouters = filterAsyncRouter(asyncRouterMap, perms)
|
}
|
commit('SET_ROUTERS', accessedRouters)
|
resolve()
|
})
|
}
|
}
|
}
|
|
export default permission
|