多级菜单存在同一张表,一次性把所有关系取出来-编程思维

这两天遇到一个问题,一般来说下一级菜单都是点击了上一级菜单后再请求出来,但是这边项目有一个需求就是要把所有的菜单全部一次性拿出来,那么就出现了一个问题,怎样给前端返回数据,于是想了一个办法,那就是菜单类嵌套菜单类,这样的话不管有多少级菜单都可以一次性取出来,前端也能直接清楚当前数据是的关系,不需要太多的辅助条件来判断

首先写一个辅助类

public class MenuDto implements Serializable{
    /** */
    private static final long serialVersionUID = 7365890239552237558L;
    //每一行自增id
    private Integer id;
    //菜单名字
    private String  menuName;
    //子菜单,为0则为顶级菜单,为字菜单则为父级菜单ID
    private Integer submenu;
    
    private List<MenuDto>  menulist;
   //更多属性省略
    //set get方法省略      
}

原始类

public class Menu {
    //每一行自增id
    private Integer id;
    //菜单uri
    private String  menuUri;
    //菜单名字
    private String  menuName;
    //子菜单
    private Integer submenu;
    //更多属性省略   
    //set get省略
}

接下来就是重点了,首先需要把菜单的数据全部查出来,以list数组存放

/**
     * 顶级
     * 
     * @param allMenu
     * @return
     */
    public List<MenuDto> menuDtoList(List<Menu> allMenu) {
        List<MenuDto> dtos = new ArrayList<>();
        for (int i = 0; i < allMenu.size(); i++) {
            MenuDto menuDto = new MenuDto();
            if (allMenu.get(i).getSubmenu() == 0) {
                menuDto.setId(allMenu.get(i).getId());
                menuDto.setMenuName(allMenu.get(i).getMenuName());
                menuDto.setSubmenu(allMenu.get(i).getSubmenu());
                menuDto.setMenulist(SunMenuDtoList(allMenu, allMenu.get(i).getId(), allMenu.size()));
                dtos.add(menuDto);
                allMenu.remove(i);
                i--;
            }
        }
        return dtos;
    }

接下来子集的需要开始一个递归的方法来操作,这样就可以把所有的子级菜单都按顺序插入进去

 /**
     * 子集
     * 
     * @param allMenu 需要遍历的Menu
     * @param id 父级菜单ID
     * @param menuSize 传入的Menu长度
     * @return
     */
    public List<MenuDto> SunMenuDtoList(List<Menu> allMenu, Integer id, Integer menuSize) {
        List<MenuDto> dtos = new ArrayList<>();
        for (int i = 0; i < allMenu.size(); i++) {
            MenuDto menuDto = new MenuDto();
            if (allMenu.get(i).getSubmenu() == id) {
                menuDto.setId(allMenu.get(i).getId());
                menuDto.setMenuName(allMenu.get(i).getMenuName());
                menuDto.setSubmenu(allMenu.get(i).getSubmenu());
                menuDto.setMenulist(SunMenuDtoList(allMenu, allMenu.get(i).getId(), allMenu.size()));
                dtos.add(menuDto);
                allMenu.remove(i);
                i--;
            }
        }
        Integer menuSize2 = allMenu.size();
        if (menuSize == 0 || allMenu.isEmpty() || menuSize2 == menuSize) {
            return dtos;
        } else {
            SunMenuDtoList(allMenu, id, menuSize2);
        }
        return dtos;
    }

但是感觉这样算法还是有点问题,有点太复杂了,欢迎大家加入QQ群一起交流

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/shiyuelp/p/6726353.html

关于ajax post请求,参数过大产生的问题解决 java-编程思维

之前做了一个图片上传的功能,前端是把图片编码成BASE64,但是图片一大了,后台用request.getParameter("前端参数");来接收参数打印不出来,没有值,这就很尴尬了   然后一直觉得是前端POST没传过来,左思右想都觉得不应该,POST没有大小限制啊, 后来用debug查看,发现后台数据时传输过来了

java下优雅地构建假数据-编程思维

在以前我做开发的时候,经常会遇到需要向数据库中添加假数据的需求,有时又需要使用批量的随机数据来验证接口或是方法的稳定性以及容错测验。那个时候我还不知道有类似于 jmockdata 或是 easy-random 的数据生成工具,就只有傻傻地用姓名库和for循环来构造数据。 后来我知道了 jmockdata,也用过 eas

文件夹右键菜单增加“用vscode打开”-编程思维

windows文件右键菜单增加“用vscode打开” 1.创建一个txt文本文件 2.编辑文件内容 复制一下内容至该txt文件中 我的位置是D:\\software\\vscode\\Microsoft VS Code\\Code.exe 更换成安装vscode的位置即可,记得将\更换为\\ Windows Regis

个人文章-编程思维

Foxnic-Web 代码生成 (10) —— 生成菜单与授权概述  模块代码生成之后,我们需要为配置菜单。配置菜单是一系列的过程,包括创建资源、创建菜单并关联资源,并将菜单授权给指定的角色。  本文中的示例代码均可在 https://gitee.com/LeeFJ/foxni... 项目中找到,本文对照 webful

国庆节,零代码帮你搞定假期美食菜单_华为云开发者联盟-编程思维

当国庆假期遇上美食 每一口都唇齿留香 特色美食太多,不知道吃什么? AppCube带你一分钟搞定假期美食 来一场舌尖上的旅行 零代码,让假期生活有滋有味 国庆小长假,三五好友结伴出游,最纠结的莫过于中午吃什么,晚上吃什么?翻翻攻略,当地特色美食令人眼花缭乱……体验通过AppCube设计一款“国庆假期美食菜单收集”应用