全局permission.js修改
try {
const { perms } = await store. dispatch ( 'user/getInfo' )
const accessRoutes = await store. dispatch ( 'permission/generateRoutes' , perms)
router. addRoutes ( accessRoutes)
next ( { ... to, replace: true } )
} catch ( error) {
await store. dispatch ( 'user/resetToken' )
Message. error ( error || 'Has Error' )
next ( ` /login?redirect= ${ to. path} ` )
NProgress. done ( )
}
src/store/modules/user.js修改
getInfo ( { commit, state } ) {
return new Promise ( ( resolve, reject ) => {
getInfo ( state. token) . then ( response => {
const { data } = response. data
if ( ! data) {
reject ( 'Verification failed, please Login again.' )
}
const { roles, permissions, user, perms} = data
if ( ! roles || roles. length <= 0 ) {
reject ( 'getInfo: roles must be a non-null array!' )
}
commit ( 'SET_PERMS' , perms)
commit ( 'SET_ROLES' , roles)
commit ( 'SET_PERMISSIONS' , permissions)
commit ( 'SET_USER' , user)
resolve ( data)
} ) . catch ( error => {
reject ( error)
} )
} )
} ,
src/store/modules/perission.js修改
function hasPermission ( roles, route ) {
if ( route. meta && route. meta. roles) {
return roles. includes ( route. meta. roles)
} else {
return true
}
}
export function generaMenu ( routes, data ) {
data. forEach ( item => {
const menu = {
path: item. path === '#' ? item. id + '_key' : item. path,
component: item. component === '#' ? Layout : ( ) => import ( ` @/views ${ item. component} ` ) ,
hidden: item. hidden,
redirect: item. redirect,
children: [ ] ,
name: 'menu_' + item. id,
meta: item. meta
}
if ( item. children) {
generaMenu ( menu. children, item. children)
}
routes. push ( menu)
} )
}
export function filterAsyncRoutes ( routes, perms ) {
const res = [ ]
routes. forEach ( route => {
const tmp = { ... route }
if ( hasPermission ( perms, tmp) ) {
if ( tmp. children) {
tmp. children = filterAsyncRoutes ( tmp. children, perms)
}
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} , data) {
return new Promise ( resolve => {
console. log ( data) ;
const perms = data;
let accessedRoutes;
accessedRoutes = filterAsyncRoutes ( asyncRoutes, perms) ;
commit ( 'SET_ROUTES' , accessedRoutes) ;
console. log ( accessedRoutes) ;
resolve ( accessedRoutes)
} )
}
}
export default {
namespaced: true ,
state,
mutations,
actions
}