import * as roleApi from '@/api/system/roleApi.js'; import Layout from '@/layout/index' /** * 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: JSON.parse(localStorage.getItem('sidebarRouters')) || [], }; const mutations = { SET_ROUTES: (state, routes) => { state.addRoutes = routes; state.routes = routes; }, SET_TOPBAR_ROUTES: (state, routes) => { state.topbarRouters = routes; }, SET_SIDEBAR_ROUTERS: (state, routes) => { state.sidebarRouters = routes; localStorage.setItem('sidebarRouters', JSON.stringify(routes)); if (!routes.length) localStorage.removeItem('sidebarRouters'); }, }; const actions = { generateRoutes({ commit }) { return new Promise(async (resolve) => { let accessedRoutes = []; let menus = await roleApi.menuListApi(); commit('SET_SIDEBAR_ROUTERS', menus); let list = tree2arr(JSON.parse(JSON.stringify(menus)),[]) let menuData = []; if (list != null && list.length > 0) { const rlist = []; for (let i = 0; i < list.length; i++) { const sm = list[i]; if (sm.pid == 0) { rlist.push(getResultMap(sm)) list.splice(i, 1) i-- } } menuData = setChildren(list, rlist) } commit('SET_ROUTES', menuData); resolve(menuData); }); }, }; 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; } const setChildren = (list, rlist) => { let b// 减少没必要的遍历 for (let x = 0; x < rlist.length; x++) { const m = rlist[x] b = false for (let i = 0; i < list.length; i++) { const sm = list[i] if (sm.pid === m.id) { // 存在子节点 b = true if (m.children === undefined) { m.children = [] } const clist = m.children const cmap = getResultMap(sm) clist.push(cmap) list.splice(i, 1) i-- setChildren(list, clist) continue } if (b) { break } } } return rlist } const tree2arr = (tree)=>{ let arr=[] tree.map(item=>{ arr.push(item) if(item.childList.length>0){ arr.push(...tree2arr(item.childList)) } }) return arr } const getResultMap = sysMenu => { //M 目录 C菜单 F按钮 const result = {} result.id = sysMenu.id result.name = 'menu' + sysMenu.id if (sysMenu.menuType == 'M') { // 目录 if (sysMenu.pid == '0') { result.path = '' result.component = Layout result.redirect = 'noredirect' result.alwaysShow = false } else { result.path = '' result.component = () => import(`@/views/routerView/index`) result.redirect = 'noredirect' } } else if (sysMenu.menuType == 'C') { let url = sysMenu.component if(url.substr(0, 7) == 'http://' || url.substr(0,8)=='https://'){ if(url.indexOf('?')>-1){ result.path = url+'&sessionToken='+getToken() }else{ result.path = url+'?sessionToken='+getToken() } }else if(url.indexOf("?")>-1){ const params = url.substring(url.indexOf("?")+1,url.length).split("&"); let param={} params.forEach(function(v){ param[v.split("=")[0]] = v.split("=")[1] }) result.props=param url = url.substring(0,url.indexOf("?")) result.path = '/views' + url+'/'+sysMenu.id result.component = () => import(`@/views/${url}`) }else{ result.path = sysMenu.component // result.component = () => import(`@/views/${url}`) result.component= resolve => require([`@/views${url}`],resolve) } } else { result.hidden = true } const result1 = {} result1.title = sysMenu.name result1.icon = sysMenu.icons result1.noCache = false // result1.role = ['admin','editor'] result.meta = result1 return result } export default { namespaced: true, state, mutations, actions, };