vue+springboot动态路由的实现

2022-08-01,,,

一.后台处理

1.后台资源表
2.封装成json格式
1.vo

2.把数据封装为嵌套格式,把查找到资源进行转换。

@UtilityClass
public class MenuUtil {
    public List<DynamicMenuVO> generateMenu(List<DynamicMenuVO> resourceList){
        List<DynamicMenuVO> menuList=new ArrayList<>();
        for (DynamicMenuVO childrenDynamicMenu:resourceList){
            //只要不是顶级目录都要寻找其父目录
            if(childrenDynamicMenu.getParentMenuId()!=0){
                //把其添加到其父目录里
                for (DynamicMenuVO parentDynamicMenu:resourceList){
                    //找到其父级目录
                    if(childrenDynamicMenu.getParentMenuId()==parentDynamicMenu.getId()){
                        List<DynamicMenuVO> children = parentDynamicMenu.getChildren();
                        if(children==null){
                            children=new ArrayList<DynamicMenuVO>();
                        }
                        children.add(childrenDynamicMenu);
                        parentDynamicMenu.setChildren(children);
                    }
                }
            }
        }
        //只返回父级菜单即可
        for (DynamicMenuVO dynamicMenuVO:resourceList){
            if(dynamicMenuVO.getParentMenuId()==0){
                menuList.add(dynamicMenuVO);
            }
        }
        return menuList;
    }
}

3.转换后返回的json格式

二.前端处理

1.登录时存储路由

2.生成菜单工具类

const _import = require('../router/_import_development' ) //获取组件的方法
import Layout from '@/layout' //Layout 是架构组件,不在后台返回,在文件里单独引入
import router from '../router'

export function generateMenu(data){
  var getRouter = filterAsyncRouter(data) //过滤路由
  console.log(getRouter)
  router.addRoutes(getRouter) //动态添加路由
  global.antRouter = getRouter //将路由数据传递给全局变量,做侧边栏菜单渲染工作
}
function filterAsyncRouter(asyncRouterMap) { //遍历后台传来的路由字符串,转换为组件对象
  const accessedRouters = asyncRouterMap.filter(route => {
    if (route.component) {
      if (route.component === 'Layout') { //Layout组件特殊处理
        route.component = Layout
      } else {
        route.component = _import(route.component)
      }
    }
    if (route.children && route.children.length) {
      route.children = filterAsyncRouter(route.children)
    }
    return true
  })

  return accessedRouters
}
}

_import_development.js

3.登陆后跳转第一个路由
4.在layout的sidebar中修改菜单生成方式

5.由于路由是存在global.runter中 所以需要每次更新,在permission.js中设置
至此动态路由已经实现。

本文地址:https://blog.csdn.net/qq_36185997/article/details/107359621

《vue+springboot动态路由的实现.doc》

下载本文的Word格式文档,以方便收藏与打印。