// +---------------------------------------------------------------------- // | CRMEB [ CRMEB赋能开发者,助力企业发展 ] // +---------------------------------------------------------------------- // | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved. // +---------------------------------------------------------------------- // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 // +---------------------------------------------------------------------- // | Author: CRMEB Team // +---------------------------------------------------------------------- import { asyncRoutes, constantRoutes } from '@/router'; import * as roleApi from '@/api/roleApi.js'; import { formatRoutes } from '@/utils/parsing'; /** * 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 (tmp.child) { tmp.child = filterAsyncRoutes(tmp.child, roles); } res.push(tmp); }); return res; } const state = { routes: [], addRoutes: [], topbarRouters: [], sidebarRouters: [], }; const mutations = { SET_ROUTES: (state, routes) => { state.addRoutes = routes; // state.routes = constantRoutes.concat(routes) state.routes = routes; }, SET_TOPBAR_ROUTES: (state, routes) => { state.topbarRouters = routes; }, SET_SIDEBAR_ROUTERS: (state, routes) => { state.sidebarRouters = routes; }, }; const actions = { generateRoutes ({ commit }, roleid) { return new Promise(async (resolve) => { let accessedRoutes = []; let menus = []; // const { rules } = await roleApi.getRoleById(roleid) let menusAll = await roleApi.menuListApi(); menusAll = formatRoutes(menusAll); menus = menusAll.filter((item) => item.url !== '/javaMobile'); const _routerResult = comRouter(menus, asyncRoutes); accessedRoutes = filterAsyncRoutes(_routerResult); // todo 这里控制是否过滤路由,经测试有些菜单不能予以设置,比如系统设置等等 this.state.settings.showSettings = false; commit('SET_ROUTES', menus); commit('SET_TOPBAR_ROUTES', menus); if (this.state.settings.topNav) { commit('SET_SIDEBAR_ROUTERS', state.sidebarRouters.length ? state.sidebarRouters : menus[0].child); } else { commit('SET_SIDEBAR_ROUTERS', menus); } resolve(accessedRoutes); }); }, }; function comRouter (menus, asyncRouter, hasLeft) { const res = []; asyncRouter.forEach((router) => { const _leftUrl = hasLeft ? hasLeft + '/' + router.path : router.path; const _hasPromise = menus.filter((item) => item.url.startsWith(_leftUrl)); if (_hasPromise.length > 0) { res.push(router); } if (router.children) { comRouter(menus, router.children, router.path); } }); return res; } export default { namespaced: true, state, mutations, actions, };