import { constantRoutes, asyncRoutes } from '@/router' import { Role } from '@/constant' function hasPermission (roles, { include, exclude }) { if (include) { return roles.some(role => include.includes(role)) } return !exclude || !roles.some(role => exclude.includes(role)) } export function filterAsyncRoutes (routes, roles, force) { const res = [] routes.forEach(route => { if (!route.dev && (force || hasPermission(roles, route))) { if (route.children) { const children = filterAsyncRoutes(route.children, roles, force) if (!children.length) { return } res.push({ ...route, children }) } else { res.push({ ...route }) } } }) return res } const state = { routes: [] } const mutations = { SET_ROUTES (state, routes) { state.routes = routes } } const actions = { generateRoutes ({ commit }, roles) { let accessedRoutes if (roles.includes(Role.ADMIN)) { accessedRoutes = __DEV__ ? asyncRoutes : filterAsyncRoutes(asyncRoutes, roles, true) } else { accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) } commit('SET_ROUTES', constantRoutes.concat(accessedRoutes)) } } export default { namespaced: true, state, mutations, actions }