11.1.1 vue-element-admin 后台动态加载菜单

前言

做后台项目,权限验证与安全性是非常重要的,vue-element-admin官方主要介绍了前端控制用户菜单加载显示,以及权限控制。这就带来一些不便,服务端无法(这里可能说的绝对了,起码实现起来不太友好)控制菜单的动态展示,用户权限跟菜单相互关系的绑定。

这里我们通过分析go-admin 代码来让大家一步步了解如何实现服务端控制前端菜单的展示的。

项目地址:

github:

https://github.com/guyan0319/go-admin

码云(国内):

https://gitee.com/jason0319/go-admin

注意:

这里下载vue-element-admin的多语言版i18n,不是master分支。

1、修改文件\src\router\index.js里面的asyncRoutes变量为

  1. export const asyncRoutes = [
  2. { path: '*', redirect: '/404', hidden: true }
  3. ]

2、修改文件 src\store\modules\permission.js

具体修改内容代码在go-admin项目里。

3、修改文件src/api/user.js中调取服务端接口方法

具体修改内容代码在go-admin项目里。

4、这里贴出服务端返回菜单数据结构

即:接口http://localhost:8090/dashboard

  1. {
  2. "code": 20000,
  3. "data": [{
  4. "children": [{
  5. "children": [{
  6. "alwaysShow": true,
  7. "component": "/system/user/create/index",
  8. "hidden": false,
  9. "id": 27,
  10. "meta": {
  11. "icon": "#",
  12. "status": true,
  13. "title": "添加用户"
  14. },
  15. "name": "添加用户",
  16. "path": "/system/user/create",
  17. "pid": 2,
  18. "url": "/user/create"
  19. }, {
  20. "component": "/system/user/list/index",
  21. "hidden": false,
  22. "id": 28,
  23. "meta": {
  24. "icon": "#",
  25. "status": true,
  26. "title": "用户列表"
  27. },
  28. "name": "用户列表",
  29. "path": "/system/user/list",
  30. "pid": 2,
  31. "url": "/user/index"
  32. }, {
  33. "alwaysShow": true,
  34. "component": "/system/user/edit/index",
  35. "hidden": true,
  36. "id": 29,
  37. "meta": {
  38. "icon": "#",
  39. "status": true,
  40. "title": "用户编辑"
  41. },
  42. "name": "用户编辑",
  43. "path": "/system/user/edit/:id(\\d+)",
  44. "pid": 2,
  45. "url": "/user/edit"
  46. }],
  47. "component": "/system/user/index",
  48. "hidden": false,
  49. "id": 2,
  50. "meta": {
  51. "icon": "#",
  52. "status": true,
  53. "title": "用户管理"
  54. },
  55. "name": "用户管理",
  56. "path": "/system/user",
  57. "pid": 1,
  58. "url": "/user"
  59. }, {
  60. "component": "/system/menu/index",
  61. "hidden": false,
  62. "id": 3,
  63. "meta": {
  64. "icon": "#",
  65. "status": true,
  66. "title": "菜单管理"
  67. },
  68. "name": "菜单管理",
  69. "path": "/system/menu",
  70. "pid": 1,
  71. "url": "/menu"
  72. }, {
  73. "alwaysShow": true,
  74. "component": "/system/role/index",
  75. "hidden": false,
  76. "id": 26,
  77. "meta": {
  78. "icon": "#",
  79. "status": true,
  80. "title": "角色管理"
  81. },
  82. "name": "角色管理",
  83. "path": "/system/role",
  84. "pid": 1,
  85. "url": "/roles"
  86. }],
  87. "component": "#",
  88. "hidden": false,
  89. "id": 1,
  90. "meta": {
  91. "icon": "fafa-adjust",
  92. "status": true,
  93. "title": "系统管理"
  94. },
  95. "name": "系统管理",
  96. "path": "#",
  97. "pid": 0,
  98. "url": "#"
  99. }, {
  100. "alwaysShow": true,
  101. "children": [{
  102. "alwaysShow": true,
  103. "component": "/article/create/index",
  104. "hidden": false,
  105. "id": 31,
  106. "meta": {
  107. "icon": "#",
  108. "status": true,
  109. "title": "创建文章"
  110. },
  111. "name": "创建文章",
  112. "path": "/article/create",
  113. "pid": 30,
  114. "url": "/article/create"
  115. }, {
  116. "alwaysShow": true,
  117. "component": "/article/edit/index",
  118. "hidden": true,
  119. "id": 32,
  120. "meta": {
  121. "icon": "#",
  122. "status": true,
  123. "title": "文章编辑"
  124. },
  125. "name": "文章编辑",
  126. "path": "/article/edit/:id(\\d+)",
  127. "pid": 30,
  128. "url": "/article/edit"
  129. }, {
  130. "alwaysShow": true,
  131. "component": "/article/list/index",
  132. "hidden": false,
  133. "id": 33,
  134. "meta": {
  135. "icon": "#",
  136. "status": true,
  137. "title": "文章列表"
  138. },
  139. "name": "文章列表",
  140. "path": "/article/list",
  141. "pid": 30,
  142. "url": "/article/list"
  143. }],
  144. "component": "#",
  145. "hidden": false,
  146. "id": 30,
  147. "meta": {
  148. "icon": "#",
  149. "status": true,
  150. "title": "内容管理"
  151. },
  152. "name": "内容管理",
  153. "path": "#",
  154. "pid": 0,
  155. "url": "/article"
  156. }]
  157. }

这里需要说明一下,返回的json数据结构中几个关键点:

url:这个是对应调取服务端接口,用于服务端控制路由权限,前端要按相应的接口调用(在api文件夹里面方法修改)。

component:等于#为一级参单,这里有个容易忽略的细节,如果修改component文件不好会造成重复嵌套参单。这里就用到vue的

  1. <router-view />

hidden:是否隐藏菜单显示,true:隐藏,false:显示。

5、实现的效果图

vue-element-admin 后台动态加载菜单 - 图1

小结:

  • 所有代码可在项目go-admin中找到,故有些代码没有在此展示,以免浪费大家篇幅。

  • 前后端分离,服务端用什么开发语言无所谓,可用java、go、php等,本项目用的go,感兴趣可以clone。

  • 需要注意跨域问题。

至此,服务端控制vue-element-admin 动态加载参单实现方式就讲完了,如有任何问题或建议欢迎提issues

参考:

https://blog.csdn.net/acoolper/article/details/97136553

links

  • 目录
  • 上一节:
  • 下一节: