zoukankan      html  css  js  c++  java
  • 多级菜单存在同一张表,一次性把所有关系取出来

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

    首先写一个辅助类

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

  • 相关阅读:
    Shiro入门学习之shi.ini实现授权(三)
    Shiro入门学习之shi.ini实现认证及源码分析(二)
    猜字母游戏(Java)
    二维数组的语法
    鸡兔同笼问题(Java)
    成绩统计程序(Java)
    18位身份证验证(Java)加入身份证输入验证是否满足18位代码(修订稿)
    18位身份证验证(Java)
    键盘输入字符插入定义数组中并按顺序排列
    一个随机验证码且不重复的小程序以及求随机输入一组数组中的最大值(Java)
  • 原文地址:https://www.cnblogs.com/shiyuelp/p/6726353.html
Copyright © 2011-2022 走看看