Vue 动态添加路由及生成菜单

举报
青年码农 发表于 2022/08/24 22:10:52 2022/08/24
【摘要】 写管理后台的都会遇到这个这种需求,管理员登录后台需要看到所有功能,普通的公司管理员或部门管理员登录只能看到部分功能权限 不同角色有不同的权限,这时如果管理平台的菜单定义在代码里,显然是不能满足上面的需求,我们就需要后台提供用户菜单,然后前台动态生成路由。 1 动态添加路由 利用 vue-router 的 addRo...

写管理后台的都会遇到这个这种需求,管理员登录后台需要看到所有功能,普通的公司管理员或部门管理员登录只能看到部分功能权限

不同角色有不同的权限,这时如果管理平台的菜单定义在代码里,显然是不能满足上面的需求,我们就需要后台提供用户菜单,然后前台动态生成路由。

1 动态添加路由

利用 vue-router 的 addRoutes 方法可以动态添加路由。请求接口返回菜单格式如下


   
  1. [
  2.     {
  3.         "id":"1332194352530083842",
  4.         "pid":"1331859957655007233",
  5.         "name":"TspUser",
  6.         "component":"user/tspuser/index",
  7.         "redirect":null,
  8.         "meta":{
  9.             "title":"用户信息 ",
  10.             "icon":"pic-right",
  11.             "show":true,
  12.             "target":null,
  13.             "link":null
  14.         },
  15.         "path":"/user",
  16.         "hidden":false
  17.     },
  18.     {
  19.         "id":"1334396728339042306",
  20.         "pid":"1333592942347546625",
  21.         "name":"Product",
  22.         "component":"fota/product/index",
  23.         "redirect":null,
  24.         "meta":{
  25.             "title":"产品信息",
  26.             "icon":"pic-right",
  27.             "show":true,
  28.             "target":null,
  29.             "link":null
  30.         },
  31.         "path":"/product",
  32.         "hidden":false
  33.     }
  34. ]

path是地址栏显示路径,component是这个菜单对应的文件地址。这里返回的结构并没有按照树型返回,都是平级,所以前台需要重新梳理关系。定义一个方法

 
 

   
  1. routerPackag(routers) {
  2.   let accessedRouters = routers.filter(router => {
  3.     if (router.component === "Layout") {
  4.       // Layout组件特殊处理
  5.       router.component = Layout;
  6.     } else {
  7.       //处理组件---重点
  8.       router.component = this.loadView(router.component);
  9.     }
  10.     //存在子集
  11.     if (router.children && router.children.length) {
  12.       router.children = this.routerPackag(router.children);
  13.     }
  14.     return true;
  15.   });
  16.   return accessedRouters;
  17. },
  18. loadView(view) {
  19.   // 路由懒加载
  20.   return () => import(`@/${view}`);
  21. },

这个方法就是把平级的处理成正确的父子级,同时路由懒加载。

2 生成菜单

后台提供的菜单数据需要前台身体生成菜单树。


   
  1. <a-layout-sider
  2.   :class="themeStyle == 'light'?'rightbg':'darkbg'"
  3.   :trigger="null"
  4.   collapsible
  5.   v-model="collapsed"
  6. >
  7.   <div :class="themeStyle == 'light'?'rightlogo':'darklogo'">
  8.     <img class="l-logo" v-show="collapsed" src="../assets/logo.png" a
  9.     <span v-show="!collapsed">管理平台</span>
  10.   </div>
  11.   <a-menu
  12.     mode="inline"
  13.     :theme="themeStyle"
  14.     :openKeys="openKeys"
  15.     @click="selectItem"
  16.     :selectedKeys="[$route.path]"
  17.     @openChange="onOpenChange"
  18.   >
  19.     <a-sub-menu v-for="item in menu" :key="item.id">
  20.       <span slot="title">
  21.         <i class="iconfont" :class="item.icon"></i>
  22.         <span v-show="!collapsed">
  23.           {{lang == "cn"
  24.           ? item.name
  25.           : lang == "en"
  26.           ? item.nameEnUS
  27.           : lang == "tw"
  28.           ? item.nameZhTW
  29.           : item.nameJA}}
  30.         </span>
  31.       </span>
  32.       <a-menu-item
  33.         v-for="childrenitem in item.children"
  34.         :key="childrenitem.showPath"
  35.         @click="titleClick(item,childrenitem)"
  36.       >
  37.         <i class="iconfont" :class="childrenitem.icon"></i>
  38.         <span>
  39.           {{lang == "cn"
  40.           ? childrenitem.name
  41.           : lang == "en"
  42.           ? childrenitem.nameEnUS
  43.           : lang == "tw"
  44.           ? childrenitem.nameZhTW
  45.           : childrenitem.nameJA}}
  46.         </span>
  47.       </a-menu-item>
  48.     </a-sub-menu>
  49.   </a-menu>
  50. </a-layout-sider>

上述功能已经在开源的管理平台实现,地址如下, 有兴趣的可以clone。

https://gitee.com/nmgwap/vue-antd

文章来源: blog.csdn.net,作者:NMGWAP,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/NMGWAP/article/details/125066834

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。