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 };