import { asyncRoutes, constantRoutes } from '@/router' import Layout from '@/layout' import { getDefinitionMenu } from '@/api/wms-auth' import store from '@/store' /** * 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) { if (route.meta.roles == "skip") { return true } else { return roles.some(role => route.meta.roles.includes(role)) } } else { return false } } const filterAccessedRoutes = (items,indexVal,childrenIndex) => { const route = JSON.parse(JSON.stringify(items)) route.forEach((val, index) => { // debugger; if(val.meta && val.meta.roles == "skip"){ if (val.children && val.children.length != 0) { filterAccessedRoutes(items[index-indexVal].children,childrenIndex) } if(items[index-indexVal].children && items[index-indexVal].children.length == 0){ items.splice(index-indexVal, 1) indexVal++ } } }) indexVal = 0 } /** * 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 (hasPermission(roles, tmp)) { if (tmp.children) { tmp.children = filterAsyncRoutes(tmp.children, roles) } res.push(tmp) } }) return res } const state = { routes: [],//菜单 addRoutes: [], tablesName:null,//所有的表名 } const mutations = { SET_ROUTES: (state, routes) => { state.addRoutes = routes state.routes = constantRoutes.concat(routes) }, SET_TABLESNAME: (state, data) => { state.tablesName = data } } /** * 静态路由懒加载 * @param view 格式必须为 xxx/xxx 开头不要加斜杠 * @returns */ export const loadView = (view) => { return (resolve) => require([`@/views/menuList/${view}`], resolve) } /** * 把从后端查询的菜单数据拼装成路由格式的数据 * @param routes * @param data 后端返回的菜单数据 */ export function generaMenu(routes, data, first) { data.forEach(item => { let _item = { path: '/'+item.name, component: loadView(item.name), // hidden: item.status === 0, // 状态为0的隐藏 name: item.name, // meta: item.meta meta: { title: item.title, icon: item.icon || 'svg_default', roles: item.permission, outerFirst:first }, } let menu = _item if(first && item.component == '@/layout'){ menu = { path: '/', component: Layout, redirect: '/' + item.name, children: [], } menu.children = [] menu.children.push(_item) } // 一级菜单 二级菜单 特定属性 // if (item.component == '@/layout' || item.component == 'index') { // menu.alwaysShow = true // menu.redirect = 'noRedirect' // } // if (item.sort < 99) { // menu.level = 1 // } else if (item.sort > 99 && item.sort < 9999) { // menu.level = 2 // } else { // menu.level = 3 // } // iframe页面处理 // if (item.permission.indexOf('Report') > -1) { // // delete menu.component // menu.iframeComponent = item.component === '@/layout' ? Layout : loadView(item.component) // menu.hasOpen = false // 是否打开过,默认false // } if (item.children && item.children.length > 0) { generaMenu(menu.children, item.children) } // if (item.permission == 'skip' && item.children.length == 0) { // } routes.push(menu) }) return routes } // todo:接口返回的层级菜单,与查重后最终显示的菜单数组做查重及组合处理 export function initTreeMenusHandle(tree, list,first) { let _res = [] tree.forEach(item=>{ if(list.indexOf(item.name) >= 0){ item.title = store.getters.columZHList[item.name] || item.name if(first)item.component = '@/layout' if (item.children && item.children.length > 0) { item.children = initTreeMenusHandle(item.children,list) } _res.push(item) } }) return _res } const actions = { getApiColumnsNames({ commit }, userId) { return new Promise(resolve => { let accessedRoutes = asyncRoutes // accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) // let indexVal = 0 // let childrenIndex = 0 // filterAccessedRoutes(accessedRoutes,indexVal,childrenIndex) // commit('SET_ROUTES', accessedRoutes) // resolve(accessedRoutes) getDefinitionMenu(true).then(res => { let _allConfig = res.auth.grantedPolicies;//所有配置 let _menuList = []//接口获取所有的菜单 for(let item in _allConfig){ let point_number = item.split('.').length - 1 // 只选择配置项中的数据 if(point_number == 1 && item.substring(0,item.indexOf('.')) == localStorage.getItem('columnsApiNamesZh')){ _menuList.push(item.substring(item.indexOf('.') + 1,item.length)) } } // 存储所有的表名 commit('SET_TABLESNAME', _menuList) // todo-new:接口获取 接口没有走配置文件 let _noShowMenus = null//不显示的菜单 _noShowMenus = localStorage.getItem('menuHiddenConfig').split(',') // 去掉不显示的菜单后全部显示的菜单 let _showMenus = _noShowMenus && _noShowMenus.length > 0 ? _menuList.filter(item1 => !_noShowMenus.some(item2 => item2 === item1)) : _menuList // 数据模拟,todo-new:接口获取 let _treeMenusAll = null//树形菜单 // _treeMenusAll = [ // {name:"aaaaaaa"}, // {name:"ExportCustomUserSetting" // // ,children:[ // // {name:'OutgoingDataHistory',children:[ // // {name:'IncomingData',children:[ // // {name:'OutgoingDataHistory'}, // // {name:'IncomingData'}, // // {name:'333333'}, // // ]}, // // {name:'eee1111-bbb',children:[ // // {name:'ExportCustomUserSetting'}, // // {name:'MessageReceive'}, // // ]}, // // ]}, // // {name:'eee222'}, // // {name:'eee333'}, // // {name:'eee444'}, // // {name:'eee555'}, // // ] // }, // {name:"OutgoingDataHistory"}, // {name:"IncomingData"}, // {name:"IncomingDataHistory"}, // {name:"MesProductL7PartsNote"}, // {name:"MessageReceive"}, // {name:"OutgoingData"}, // {name:"AsnDet"}, // {name:"AsnMstr"}, // {name:"Bom"}, // {name:"CustPart"}, // {name:"Cust"}, // {name:"Inventory"}, // {name:"Loc"}, // {name:"Part"}, // {name:"PoDet"}, // {name:"PoMstr"}, // {name:"PrhHist"}, // {name:"ProdLine"}, // {name:"ReceiptDet"}, // {name:"ReceiptMstr"}, // {name:"ReturnDet"}, // {name:"ReturnMstr"}, // {name:"SodDet"}, // {name:"VendPart"}, // {name:"Vend"}, // ] let _initTreeMenus = [] if(_treeMenusAll && _treeMenusAll.length > 0){ _initTreeMenus = initTreeMenusHandle(_treeMenusAll,_showMenus,true) }else{ let _data = [] for(let i in _showMenus){ _data.push({name:_showMenus[i]}) } _initTreeMenus = initTreeMenusHandle(_data,_showMenus,true) } // 最后查重+层级查重后的菜单 let _initEndMenus = generaMenu(asyncRoutes, _initTreeMenus,true) let accessedRoutes = _initEndMenus // let indexVal = 0 // let childrenIndex = 0 // filterAccessedRoutes(accessedRoutes,indexVal,childrenIndex) commit('SET_ROUTES', accessedRoutes) resolve(accessedRoutes) }).catch(err => { console.log(err) }) }) }, } export default { namespaced: true, state, mutations, actions }