• 多级菜单存在同一张表,一次性把所有关系取出来


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

    首先写一个辅助类

    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群一起交流

  • 相关阅读:
    AttributeError: '_csv.reader' object has no attribute 'next'
    AttributeError: type object '_io.StringIO' has no attribute 'StringIO'
    sklearn学习笔记2
    sklearn学习笔记1
    隐语义模型LFM(latent factor model)
    windows下python3.4安装scikit-learn
    关联规则1
    关联规则
    Jmeter上传文件
    jmeter 学习笔记
  • 原文地址:https://www.cnblogs.com/shiyuelp/p/6726353.html
Copyright © 2020-2023  润新知