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