当前位置:   article > 正文

[学习笔记]vue利用动态路由实现菜单权限管理_roles.some(role => route.meta.roles.includes(role)

roles.some(role => route.meta.roles.includes(role))

b站很多实战教程,尤其是后台管理系统的教程基本上只教了些皮毛,很多实用性强的功能基本上没有说,这也是我遇到这种问题无从下手的原因,这里推荐一个教程,也是b站上可看。https://www.bilibili.com/video/BV1zJ411g7Fx 不敢说他教的有多好,但是他的教学内容很接近实际开发了,其中就包含了动态路由。

前期很迷茫,看了许许多多的博客帖子,基本上所有的教程都围绕这一页面https://juejin.im/post/6844903478880370701,我的思路基本上就是照着这个来的。

首先写好静态和动态的路由(并非最终路由,仅供参考用)

  1. export const constantRouterMap = [{ //静态路由
  2. path: '/',
  3. redirect: '/login'
  4. },
  5. {
  6. path: '/login',
  7. component: Login
  8. },
  9. ]
  10. export const asyncRouterMap = [{ //动态路由
  11. name: 'home',
  12. path: '/home',
  13. component: Home,
  14. meta: {
  15. title: '首页',
  16. roles: ['admin', 'editor', 'list']
  17. },
  18. children: [{
  19. name: 'user',
  20. path: '/user',
  21. key: '1',
  22. components: User,
  23. meta: {
  24. title: '用户',
  25. roles: ['admin', 'editor']
  26. }
  27. },
  28. {
  29. name: 'shop',
  30. path: '/shop',
  31. key: '2',
  32. components: Shop,
  33. meta: {
  34. title: '商品',
  35. roles: ['admin', 'editor', 'list']
  36. }
  37. },
  38. {
  39. name: 'rights',
  40. path: '/rights',
  41. key: '3',
  42. components: Rights,
  43. meta: {
  44. title: '权限',
  45. roles: ['admin', 'editor']
  46. }
  47. },
  48. {
  49. name: 'operate',
  50. path: '/operate',
  51. key: '4',
  52. components: Operate,
  53. meta: {
  54. title: '设置',
  55. roles: ['admin']
  56. }
  57. },
  58. ]
  59. }, {
  60. path: '*',
  61. component: NotFound
  62. }]
  63. const router = new VueRouter({
  64. routes: constantRouterMap,
  65. })
  66. export default router

之后设置路由导航守卫

  1. router.beforeEach((to, from, next) => {
  2. if (getToken()) { //获取token
  3. if (to.path === '/login') {
  4. store.state.userinfo = [] //调试用,在登录页清空用户数据
  5. store.state.addRouters = []
  6. sessionStorage.clear()
  7. next()
  8. } else {
  9. if (sessionStorage.getItem('roles')) { //有角色信息,可直接跳转
  10. next()
  11. } else {
  12. axios({ //没有角色信息,根据用户token获取角色
  13. method: "post",
  14. url: "/userrole",
  15. data: {
  16. token: sessionStorage.getItem('token')
  17. }
  18. }).then(data => {
  19. const userRole = data.data //保存用户角色
  20. store.dispatch('GenerateRoutes', userRole).then(() => { //根据用户角色生成路由
  21. const newRouter = store.state.addRouters
  22. router.addRoutes(newRouter) //添加路由
  23. sessionStorage.setItem('roles', userRole) //将角色添加至session中
  24. sessionStorage.setItem('router', JSON.stringify(store.state.routers))
  25. next({...to, replace: true })
  26. }).catch(
  27. (err) => {
  28. if (err) {
  29. Message.error('网络错误,请重试')
  30. setTimeout(() => {
  31. sessionStorage.removeItem('roles')
  32. setTimeout(() => {
  33. location.reload()
  34. }, 0)
  35. NProgress.done()
  36. }, 2000)
  37. }
  38. }
  39. )
  40. });
  41. }
  42. }
  43. } else {
  44. if (whiteList.indexOf(to.path) !== -1) {
  45. next()
  46. } else {
  47. next('/login')
  48. }
  49. }
  50. })

GenerateRoutes:

  1. GenerateRoutes({ commit }, data) {
  2. return new Promise(resolve => {
  3. const roles = data //保存传入的角色
  4. let accessedRouters //设置临时路由
  5. if (roles.includes('admin') === true) {
  6. accessedRouters = asyncRouterMap //管理员赋予所有权限
  7. } else {
  8. accessedRouters = filterAsyncRouter(asyncRouterMap, roles) //非管理员筛选权限
  9. }
  10. commit('SET_ROUTERS', accessedRouters)
  11. resolve()
  12. })
  13. }

filterAsyncRouter和hasPermission:

  1. function filterAsyncRouter(asyncRouterMap, roles) { //传入两个参数,路由和角色
  2. const accessedRouters = asyncRouterMap.filter(route => {
  3. if (hasPermission(roles, route)) { //若得到true,执行下一步
  4. if (route.children && route.children.length) { //判断是否存在子路由
  5. route.children = filterAsyncRouter(route.children, roles) //对子路由进行过滤
  6. }
  7. return true
  8. }
  9. return false
  10. })
  11. return accessedRouters
  12. }
  13. function hasPermission(roles, route) {
  14. if (route.meta && route.meta.roles) { //需要角色的路由
  15. return roles.some(role => route.meta.roles.includes(role) === true) //存在该角色,返回true,否则返回false
  16. } else {
  17. return true
  18. }
  19. }

SET_ROUTERS:

  1. SET_ROUTERS: (state, routers) => {
  2. state.addRouters = routers //将筛选后的权限添加到addRouters内
  3. state.routers = constantRouterMap.concat(routers) //最终路由为默认路由+筛选后的路由
  4. }

admin界面:

editor界面:

list界面:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/58882
推荐阅读
相关标签
  

闽ICP备14008679号