import { asyncRoutes, constantRoutes } from '@/router' import Layout from '@/layout' import { getWebMenu } from '@/api/wms-auth' import { getDefinitionMenu } from '@/api/wms-interface' /** * 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: [] } const mutations = { SET_ROUTES: (state, routes) => { state.addRoutes = routes state.routes = constantRoutes.concat(routes) } } // todo-new:有token后使用generateRoutes,去掉下方一行代码 // state.routes = constantRoutes.concat(asyncRoutes) /** * 静态路由懒加载 * @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 || '', 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,zh,first) { let _res = [] tree.forEach(item=>{ if(list.indexOf(item.name) >= 0){ item.title = zh[item.name] || item.name if(first)item.component = '@/layout' if (item.children && item.children.length > 0) { item.children = initTreeMenusHandle(item.children,list,zh) } _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 _zh = res.localization.values[localStorage.getItem('columnsApiNamesZh')]; localStorage.setItem("interfaceBoardColumnsNames", JSON.stringify(_zh)); 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)) } } let _noShowMenus = ['Z.AsnDet']//不显示的菜单 // 去掉不显示的菜单后全部显示的菜单 let _showMenus = _menuList.filter(item1 => !_noShowMenus.some(item2 => item2 === item1)) // 数据模拟,todo:接口获取 let _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,_zh,true) }else{ _initTreeMenus = _showMenus } // 最后查重+层级查重后的菜单 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) }) }) }, // generateRoutes({ // 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) // // todo-new:动态路由(等token接口恢复后处理) // getWebMenu({userId: userId}).then(res => { // let accessedRoutes = generaMenu(asyncRoutes, res) // 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 }