element-ui-admin生成动态路由
1、修改src/stroe/modules/permission.js
import { asyncRoutes, constantRoutes } from '@/router'
import Layout from '@/layout'
import axios from 'axios'
/**
* 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) {
return roles.some(role => route.meta.roles.includes(role))
} else {
return true
}
}
/**
* 后台查询的菜单数据拼装成路由格式的数据
* @param routes
*/
export function generaMenu(routes, datas) {
datas.forEach(item => {
const menu = {
path: item.url?item.url:item.menuId + '_key',
component: item.type === 0 ? Layout : (resolve) => require([`@/views${item.component}`],resolve),
name: item.name,
hidden:item.type==2?true:false,
meta: {
title: item.name,
roles: ['admin', 'editor']
},
children: []
}
if (item.url == '/SysUserAdd') {
}
if (item.children) {
generaMenu(menu.children, item.children)
}
routes.push(menu)
})
}
/**
* 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)
}
}
const actions = {
generateRoutes({ commit }, roles) {
return new Promise(resolve => {
const loadMenuData = []
axios.get('http://localhost:9999/WEISHU-SYSTEM-MANAGEMENT/sysMenu/getMenus', {
params: {
username: localStorage.getItem('username')
}
}).then((res) => {
const datas = res.data.obj
Object.assign(loadMenuData, datas)
generaMenu(asyncRoutes, loadMenuData)
let accessedRoutes
if (roles.includes('admin')) {
accessedRoutes = asyncRoutes || []
} else {
accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
}
commit('SET_ROUTES', accessedRoutes)
resolve(accessedRoutes)
})
})
}
}
export default {
namespaced: true,
state,
mutations,
actions
}
踩坑点
报错原因:
在拼接component时使用了 () => import(@/views${item.component}
)
正确写法:(resolve) => require([@/views${item.component}
],resolve)