switch roles will refresh the sidebar correctly

This commit is contained in:
inklake 2018-09-07 15:25:55 +08:00
parent 62fb5d1e14
commit 6ee9487d1b
2 changed files with 37 additions and 15 deletions

View File

@ -7,29 +7,50 @@ import { asyncRouterMap, constantRouterMap } from '@/router'
*/ */
function hasPermission(roles, route) { function hasPermission(roles, route) {
if (route.meta && route.meta.roles) { if (route.meta && route.meta.roles) {
return roles.some(role => route.meta.roles.indexOf(role) >= 0) return roles.some(role => route.meta.roles.includes(role))
} else { } else {
return true return true
} }
} }
/**
* 递归过滤异步路由表返回符合用户角色权限的路由表
* 方法优化 避免执行一次以后 对原始 aysncRouterMap 的改动
* @param routes asyncRouterMap
* @param roles
*/
function filterAsyncRouter(routes, roles) {
const res = []
routes.forEach(route => {
const tmp = { ...route }
if (tmp.children) {
tmp.children = filterAsyncRouter(tmp.children, roles)
}
hasPermission(roles, tmp) && res.push(tmp)
})
return res
}
// 原方法 执行一次后 会修改 import 进来的 asyncRouterMap 导致切换权限菜单无法重绘
/** /**
* 递归过滤异步路由表返回符合用户角色权限的路由表 * 递归过滤异步路由表返回符合用户角色权限的路由表
* @param asyncRouterMap * @param asyncRouterMap
* @param roles * @param roles
*/ */
function filterAsyncRouter(asyncRouterMap, roles) { // function filterAsyncRouter(asyncRouterMap, roles) {
const accessedRouters = asyncRouterMap.filter(route => { // const accessedRouters = asyncRouterMap.filter(route => {
if (hasPermission(roles, route)) { // if (hasPermission(roles, route)) {
if (route.children && route.children.length) { // if (route.children && route.children.length) {
route.children = filterAsyncRouter(route.children, roles) // route.children = filterAsyncRouter(route.children, roles)
} // }
return true // return true
} // }
return false // return false
}) // })
return accessedRouters // return accessedRouters
} // }
const permission = { const permission = {
state: { state: {
@ -47,7 +68,7 @@ const permission = {
return new Promise(resolve => { return new Promise(resolve => {
const { roles } = data const { roles } = data
let accessedRouters let accessedRouters
if (roles.indexOf('admin') >= 0) { if (roles.includes('admin')) {
accessedRouters = asyncRouterMap accessedRouters = asyncRouterMap
} else { } else {
accessedRouters = filterAsyncRouter(asyncRouterMap, roles) accessedRouters = filterAsyncRouter(asyncRouterMap, roles)

View File

@ -122,7 +122,7 @@ const user = {
}, },
// 动态修改权限 // 动态修改权限
ChangeRoles({ commit }, role) { ChangeRoles({ commit, dispatch }, role) {
return new Promise(resolve => { return new Promise(resolve => {
commit('SET_TOKEN', role) commit('SET_TOKEN', role)
setToken(role) setToken(role)
@ -132,6 +132,7 @@ const user = {
commit('SET_NAME', data.name) commit('SET_NAME', data.name)
commit('SET_AVATAR', data.avatar) commit('SET_AVATAR', data.avatar)
commit('SET_INTRODUCTION', data.introduction) commit('SET_INTRODUCTION', data.introduction)
dispatch('GenerateRoutes', data) // 动态修改权限后 重绘侧边菜单
resolve() resolve()
}) })
}) })