You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
265 lines
7.8 KiB
265 lines
7.8 KiB
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) {
|
|
// 不显示的菜单配置隐藏
|
|
let _noShowMenus = localStorage.getItem('menuHiddenConfig').split(',')
|
|
data.forEach(item => {
|
|
let _item = {
|
|
path: '/'+item.name,
|
|
component: loadView(item.name),
|
|
hidden: _noShowMenus.indexOf(item.name) >= 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 _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,_menuList,true)
|
|
}else{
|
|
let _data = []
|
|
for(let i in _menuList){
|
|
_data.push({name:_menuList[i]})
|
|
}
|
|
_initTreeMenus = initTreeMenusHandle(_data,_menuList,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
|
|
}
|