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

  • 相关阅读:
    C# WinForm开发系列 文章索引
    C#程序集版本控制文件属性祥解(转)
    大型网站调试工具之一(php性能优化分析工具XDebug)
    Web Control 开发系列(二) 深入解析Page的PostBack过程和IPostBackDataHandler
    ASP.NET服务器控件开发(3)事件和回传数据的处理
    理解Session State模式+ASP.NET SESSION丢失FAQ [翻译]
    什么是publickeytoken及publickeytoken的作用
    C#取得页面URL信息
    ASP.NET服务器控件开发(2)继承WebControl类
    [网络收集]ASP.NET 网站路径
  • 原文地址:https://www.cnblogs.com/shiyuelp/p/6726353.html
Copyright © 2011-2022 走看看