vue动态路由 导航栏列表展示 权限管理

效果图

在这里插入图片描述

先来看看后台返回数据格式

在这里插入图片描述

1.处理后台返回数据

getPermission(){//获取权限的方法
  getPermissoonList(state).then(res => {//getPermissoonList:接口  获取权限数组
    if(res.code === 200){
      let permissionList = mapPermission(res.data)//获取到perimission数组
      let accessedRouters = filterAsyncRouter(asyncRoutes, permissionList)//asyncRoutes为router>index.js路由
      router.addRoutes(accessedRouters)
    }
  })
}

2.整理权限 只保留权限名称放入数组

function mapPermission(permission) {
  let arr = []
  permission.forEach(i => {
    arr.push(i.permission)
    let _arr = []
    if (i.childList && i.childList.length) {//向下递归调用 查询到最内层数据 把所有permission字段拿到
      _arr = mapPermission(i.childList)
    }
    arr.push(..._arr)
  })
  return arr
}
console.log(permissionList)

在这里插入图片描述

3.根据router>index.js过滤接口获得的权限

function filterAsyncRouter(asyncRouterMap, permissionList) {
  let arr = asyncRouterMap.filter(router => {
    if (checkRouter(router,permissionList)) {
      if (router.children && router.children.length) {
        router.children = filterAsyncRouter(router.children,permissionList)//向下递归调用直到最内层
      }
      return true
    } else {
      return false
    }
  })
  return arr
}

4.后台获取的权限数组与router>index.js里的路由进行对比看是否存在

function checkRouter(router,permissionList) {
  if (permissionList.indexOf(router.name) != -1) { //后台获取的权限数组与router>index.js里的路由进行对比
    return true
  } else {
    return false
  }
}

用router.addRoutes把根据router内的路由过滤出的权限路由动态添加进去

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现步骤: 1. 在Vue中定义动态导航栏数据结构,包括菜单项的名称、路由路径、子菜单等。 2. 在Vue组件中使用v-for循环渲染动态导航栏,使用router-link组件实现路由跳转。 3. 在Spring Boot中编写Controller或RestController,返回动态导航栏所需的数据结构。 4. 在前端使用axios或fetch等工具,发送异步请求获取动态导航栏数据,在mounted生命周期钩子函数中初始化动态导航栏数据。 5. 根据用户权限或其他条件,动态生成导航栏的菜单项及子菜单。 6. 根据当前路由路径,动态设置导航栏菜单项的选中状态。 示例代码如下: Vue组件部分: ```html <template> <div class="nav"> <ul> <li v-for="(menu, index) in menus" :key="menu.id"> <router-link :to="menu.path" :class="{active: isActive(menu)}">{{menu.name}}</router-link> <ul v-if="menu.children"> <li v-for="(child, i) in menu.children" :key="child.id"> <router-link :to="child.path">{{child.name}}</router-link> </li> </ul> </li> </ul> </div> </template> <script> import axios from 'axios' export default { data () { return { menus: [] } }, methods: { isActive (menu) { return this.$route.path === menu.path } }, mounted () { axios.get('/api/menus').then(res => { this.menus = res.data }) } } </script> <style> .nav { background-color: #f5f5f5; padding: 10px; } .nav ul { list-style: none; padding: 0; margin: 0; } .nav li { display: inline-block; margin-right: 10px; } .nav li ul { display: none; position: absolute; top: 100%; left: 0; z-index: 1000; background-color: #fff; padding: 0; margin: 0; } .nav li:hover > ul { display: block; } .nav li ul li { display: block; margin: 0; } .nav li ul li:hover { background-color: #f5f5f5; } .nav .active { color: red; } </style> ``` Spring Boot控制器部分: ```java @RestController @RequestMapping("/api") public class MenuController { @GetMapping("/menus") public List<Menu> getMenus() { // 根据用户权限或其他条件,动态生成菜单项及子菜单 List<Menu> menus = new ArrayList<>(); Menu menu1 = new Menu(1L, "首页", "/home"); Menu menu2 = new Menu(2L, "管理中心", "/admin"); Menu menu3 = new Menu(3L, "用户中心", "/user"); List<Menu> children = new ArrayList<>(); children.add(new Menu(4L, "个人信息", "/user/info")); children.add(new Menu(5L, "订单管理", "/user/order")); menu3.setChildren(children); menus.add(menu1); menus.add(menu2); menus.add(menu3); return menus; } } class Menu { private Long id; private String name; private String path; private List<Menu> children; // getter和setter省略 } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值