1、首先保证/src/store/文件夹下所有目录和文件齐全(含modules文件夹,getters.js文件,index.js文件),特别注意/src/store/modules/permission.js中的代码准确性
2、进入/src/router修改index.js,添加需要动态根据权限加载的路由表,注意变量名称为asyncRoutes
export const asyncRoutes = [
{
path: '/order1',
component: Layout,
name: 'Order1',
meta: { title: '订单管理', icon: 'user', roles: ['admin'] },
children: [
{
path: 'order',
name: 'Order',
component: () => import('@/views/order/index'),
meta: { title: '订单管理', icon: 'user', roles: ['admin'] }
},
]
},
{ path: '*', redirect: '/404', hidden: true }
];3、动态挂载核心代码,修改/src/permission.js文件下NProgress.done() } else { 下面的代码(catch后代码没变,主要是catch前的代码修改)
const hasRoles = store.getters.roles && store.getters.roles.length > 0
if (hasRoles) {
next()
} else {
try {
// get user info
const { roles } = await store.dispatch('user/getInfo')
const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
console.log(accessRoutes);
router.addRoutes(accessRoutes)
next({ ...to, replace: true })
} catch (error) {
// remove token and go to login page to re-login
await store.dispatch('user/resetToken')
Message.error(error || 'Has Error')
next(`/login?redirect=${to.path}`)
NProgress.done()
}
}4、若以上console.log有返回对象,证明挂载成功。若有必要,修改左侧栏的菜单显示,进入/src/layout/components/Sidebar/index.vue
// sidebar-item的v-for="route in routes"改为v-for="route in permission_routes" <sidebar-item v-for="route in permission_routes" :key="route.path" :item="route" :base-path="route.path" />
// computed的...mapGetters([下添加'permission_routes',
...mapGetters([
'permission_routes',
'sidebar'
]),5、后端user的getInfo方法返回的数据格式为
$re = Db::name('admin')->where('token',$token)->find();
$returnData['name'] = $re['adminname'];
$returnData['avatar'] = 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif';
$returnData['roles'] = [$re['roles']];
return $this->setResult($returnData);以上经测试成功