• 数据库model ```java public class Menu { @TableId(type = IdType.AUTO) private Integer id;

      @TableField(fill =FieldFill.INSERT) private Date addTime;

      @TableField(fill = FieldFill.INSERT_UPDATE) private Date modifyTime;

      @ApiModelProperty(value = “排序”) private Integer sort;

      @ApiModelProperty(value = “类型(0.按钮 1.菜单)”) private Integer type;

      @ApiModelProperty(value = “图标”) private String icon;

      @ApiModelProperty(value = “菜单URL”) private String url;

      @ApiModelProperty(value = “上级菜单ID 第一级为0”) private Integer parentId;

      @ApiModelProperty(value = “菜单/按钮名称”) private String menuName;

      @ApiModelProperty(value = “菜单状态(0.失效,1.有效)”) private Integer state;

      @ApiModelProperty(value = “菜单级别”) private Integer level;

    }

    1. 返回model
    2. ```java
    3. public class MenuVo {
    4. @ApiModelProperty(value = "菜单/按钮Id")
    5. private Integer menuId;
    6. @ApiModelProperty(value = "菜单/按钮名称")
    7. private String menuName;
    8. @ApiModelProperty(value = "类型(0.按钮 1.菜单)")
    9. private Integer type;
    10. @ApiModelProperty(value = "图标")
    11. private String icon;
    12. @ApiModelProperty(value = "菜单/按钮 URL")
    13. private String url;
    14. @ApiModelProperty(value = "排序")
    15. private Integer sort;
    16. @ApiModelProperty(value = "菜单级别")
    17. private Integer level;
    18. @ApiModelProperty(value = "上级菜单ID 第一级为0")
    19. private Integer parentId;
    20. @ApiModelProperty(value = "是否选中 0未选 1已选")
    21. private Integer selected;
    22. @ApiModelProperty(value = "下级菜单信息")
    23. private List<MenuVo> children;
    24. }

    数据处理

    
       //roleId 为角色Id,用来标注这个角色有没有选中这个菜单
      @Override
        public GenericResponse findAllMenu(Integer roleId) {
            Role role = roleMapper.selectById(roleId);
            String menuIds = role.getMenuIds();
            List<String> listmenuIds = Lists.newArrayList();
            if (StringUtils.isNotBlank(menuIds)) {
                listmenuIds = Arrays.asList(menuIds.split(",")).stream().map(s -> (s.trim())).collect(Collectors.toList());
            }
            //所有有效的菜单 1:有效的
            List<Menu> menuList = menuMapper.selectList(new LambdaQueryWrapper<Menu>().eq(Menu::getState, 1));
            List<MenuVo> collect = combingParam(menuList, listmenuIds);
            return GenericResponse.response(collect);
        }
    
    
        /** 
         * 参数整理
         * @author X-MD
         * @date 2020/12/31 0031
         * @param  menuList
         * @param  listmenuIds
         * @return List
         **/
        private List<MenuVo> combingParam(List<Menu> menuList,List<String> listmenuIds){
            List<MenuVo> listVo = Lists.newArrayList();
            if (CollectionUtils.isEmpty(menuList)) {
                return listVo;
            }
            //使用stream拷贝list
            List<MenuVo> voList = menuList.stream()
                    .map(menu -> {
                        MenuVo menuVo = new MenuVo();
                        BeanUtils.copyProperties(menu, menuVo);
                        return menuVo.setMenuId(menu.getId());
                    })
                    .collect(Collectors.toList());
    
            //先将所有一级部门添加至rslist
            for (MenuVo menuVo : voList) {
                //如果父级为空,则为顶级部门
                if (menuVo.getParentId().equals(0)) {
                    menuVo = listmenuIds.contains(String.valueOf(menuVo.getMenuId())) ? menuVo.setSelected(2) : menuVo.setSelected(1);
                    listVo.add(menuVo);
                }
            }
    
            // 为父级部门设置子部门,getChild是递归调用的
            for (MenuVo menuVo : listVo) {
                //传入父级部门Id,以及所有查询结果
                menuVo.setChildren(getChild(menuVo.getMenuId(), voList, listmenuIds));
            }
            return listVo.stream().sorted(Comparator.comparing(MenuVo::getSort)).collect(Collectors.toList());
        }
    
        /**
         * 传进父级ID,查找其子部门
         *
         * @param id
         * @param depts
         * @return List<MenuVo>
         * @author X-MD
         * @date 2020/12/30 0030
         **/
        public List<MenuVo> getChild(Integer id, List<MenuVo> depts, List<String> listmenuIds) {
            List<MenuVo> childList = new ArrayList<>();
            for (MenuVo menuVo : depts) {
                // 遍历所有属于父级节点的子节点
                if (menuVo.getParentId() != 0 && menuVo.getParentId().equals(id)) {
                    menuVo = listmenuIds.contains(String.valueOf(menuVo.getMenuId())) ? menuVo.setSelected(2) : menuVo.setSelected(1);
                    childList.add(menuVo);
                }
            }
            List<MenuVo> collect = childList.stream().sorted(Comparator.comparing(MenuVo::getSort))
                    .collect(Collectors.toList());
            //然后给所有子节点添加子节点
            for (MenuVo menuVo : collect) {
                // 遍历所有属于父级节点的子节点
                menuVo.setChildren(getChild(menuVo.getMenuId(), depts, listmenuIds));
            }
            // 递归退出条件
            if (CollectionUtils.isEmpty(childList)) {
                return Lists.newArrayList();
            }
            return childList;
        }