import { asyncRoutes, constantRoutes } from '@/router';
|
import ConstantRoutes from '@/router/constroutes';
|
import { deepClone } from '@/utils/index';
|
import store from '..';
|
|
/**
|
* 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 filterRoutes(routers, permissionIds) {
|
const result = deepClone(routers);
|
for (let router of result) {
|
if (!router.id) {
|
continue;
|
}
|
|
if (permissionIds.includes(router.id)) {
|
if (router.hasOwnProperty('children')) {
|
router.children = filterRoutes(router.children, permissionIds);
|
}
|
} else {
|
router.hidden = true;
|
}
|
}
|
|
return result;
|
}
|
|
const state = {
|
routes: [],
|
addRoutes: []
|
};
|
|
const mutations = {
|
SET_ROUTES: (state, routes) => {
|
state.addRoutes = routes;
|
state.routes = ConstantRoutes.concat(routes);
|
}
|
};
|
|
const actions = {
|
generateRoutes({ commit }, permissionId) {
|
return new Promise(resolve => {
|
const isAdmin = store.getters.username === 'admin' || store.getters.username === 'superadmin';
|
const accessedRoutes = isAdmin ? ConstantRoutes : filterRoutes(ConstantRoutes, permissionId);
|
|
commit('SET_ROUTES', accessedRoutes);
|
resolve(accessedRoutes);
|
});
|
}
|
};
|
|
export default {
|
namespaced: true,
|
state,
|
mutations,
|
actions
|
};
|