import { asyncRoutes, constantRoutes } from '@/router' import Layout from '@/layout' import { getWebMenu } from '@/api/wms-auth' /** * 静态路由懒加载 * @param view 格式必须为 xxx/xxx 开头不要加斜杠 * @returns */ export const loadView = (view) => { return (resolve) => require([`@/views/${view}`], resolve) } /** * 把从后端查询的菜单数据拼装成路由格式的数据 * @param routes * @param data 后端返回的菜单数据 */ export function generaMenu(routes, data) { data.forEach(item => { const menu = { path: item.code, component: item.component === '@/layout' ? Layout : loadView(item.component), // hidden: item.status === 0, // 状态为0的隐藏 children: [], name: item.code, // meta: item.meta meta: { title: item.name, icon: item.icon || '', roles: item.permission }, } // 一级菜单 二级菜单 特定属性 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 } /** * 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) const actions = { 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 }