当前位置:   article > 正文

权限路由管理的实现,根据角色或者动态设置_rn根据角色动态加载路由

rn根据角色动态加载路由

1. 根据角色

1.配置路由信息的时候,添加一个role属性,可以是,所有用户可见的路由role设为0,A类型用户可见的路由role设为1,B类型用户可见的路由role设为2;

2.将数据库的用户数据表添加role字段;

3.用户登录之后获取到role属性值,将它存储到全局状态管理和本地存储;

4.给role为1的用户设置菜单栏为0+1,给role为2的用户设置菜单栏为0+2;

5.访问时,如果没有路由就返回404页面,如果有路由而没有权限就返回没有权限的页面。

2. 动态设置(更灵活)

1.配置路由信息的时候,添加一个keyid属性,在路由信息的数组里,每一个对象的keyid都是唯一的;

2.将数据库的用户数据表添加checkedKeys字段;

3.在系统里修改某用户权限信息的时候,应该使用树状结构的组件,例如element-plus的el-tree组件、antd的Tree组件;

4.当 vue 项目使用了 vue-router 的时候,RouteRecordRaw 的子路由数组的属性名和 elementui 的 el-tree 需要接收的数组的元素的子对象数组的属性名都为 'children' ,可以直接传递;当 react 项目使用了 react-router-dom 的时候,给 antd 的 Tree 组件 传递 checkedKeys 数组和 treeData 数组;

5.当树形组件的选择被改变的时候会触发一个事件check-change,可以根据需求和传递给回调函数的参数改变checkedKeys变量,当确定修改的时候,发送请求,修改该用户的数据表信息;

6.用户登录之后获取到checkedKeys属性值,将它存储到全局状态管理和本地存储;

然后根据需求和checkedKeys定义规则,给不同的checkedKeys返回不同的菜单栏;

例如,最高级菜单为三级的情况,定义一个函数获取新菜单:

  1. const getMenusFn = (menus: IMenuType[], [...arr]: string[]) => {
  2. // arr ['0-0', '0-7-1-1', '0-4-2', '0-4-3', '0-4-3-0', '0-4-3-1']
  3. // 原始二级菜单
  4. const secondaryMenu: IMenuType[] = []
  5. menus.forEach((item) => {
  6. if (item.children) {
  7. item.children?.forEach((semenu: IMenuType) => {
  8. secondaryMenu.push(semenu)
  9. })
  10. }
  11. })
  12. // 原始三级菜单
  13. const thirdLevelMenu: IMenuType[] = []
  14. secondaryMenu.forEach((item) => {
  15. if (item.children) {
  16. item.children?.forEach((thmenu: IMenuType) => {
  17. thirdLevelMenu.push(thmenu)
  18. })
  19. }
  20. })
  21. const newMenus: IMenuType[] = []
  22. // 用户一级菜单
  23. const firstLevelMenu: string[] = []
  24. // 用户二级菜单
  25. const secondLevelMenu: string[] = []
  26. arr.forEach((str: string) => {
  27. if (str.split('-').length === 2) {
  28. firstLevelMenu.push(str)
  29. const menu = menus.find((menu: IMenuType) => {
  30. return menu.keyid === str
  31. })
  32. menu && newMenus.push(menu)
  33. }
  34. })
  35. for (let i = 0; i < arr.length; i++) {
  36. const _arr = arr[i].split('-')
  37. if (_arr.length >= 3) {
  38. const _str = _arr.slice(0, 2).join('-')
  39. if (firstLevelMenu.findIndex((__str: string) => _str === __str) >= 0) {
  40. arr.splice(i, 1)
  41. i--
  42. }
  43. }
  44. }
  45. arr.forEach((str: string) => {
  46. if (str.split('-').length === 3) {
  47. secondLevelMenu.push(str)
  48. const menu = secondaryMenu.find((menu: IMenuType) => {
  49. return menu.keyid === str
  50. })
  51. menu && newMenus.push(menu)
  52. }
  53. })
  54. for (let i = 0; i < arr.length; i++) {
  55. const _arr = arr[i].split('-')
  56. if (_arr.length >= 4) {
  57. const _str = _arr.slice(0, 3).join('-')
  58. if (secondLevelMenu.findIndex((__str: string) => _str === __str) >= 0) {
  59. arr.splice(i, 1)
  60. i--
  61. }
  62. }
  63. }
  64. arr.forEach((str: string) => {
  65. if (str.split('-').length === 4) {
  66. const menu = thirdLevelMenu.find((menu: IMenuType) => {
  67. return menu.keyid === str
  68. })
  69. menu && newMenus.push(menu)
  70. }
  71. })
  72. return newMenus
  73. }

7.访问时,如果没有路由就返回404页面,如果有路由而没有权限就返回没有权限的页面。

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

闽ICP备14008679号