构建树形菜单

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39478044/article/details/85018645

构建树形菜单

菜单实体类:

public class Menu {
    // 菜单id
    private String id;
    // 菜单名称
    private String name;
    // 父菜单id
    private String parentId;
    // 菜单url
    private String url;
    // 菜单图标
    private String icon;
    // 菜单顺序
    private int order;
    // 子菜单
    private List<Menu> children;
    // ... 省去getter和setter方法以及toString方法
}

菜单一般需要排序,我们根据Menu的order字段进行排序:

  /*
     * 排序,根据order排序
     */
    public Comparator<Menu> order(){
        Comparator<Menu> comparator = new Comparator<Menu>() {

            @Override
            public int compare(Menu o1, Menu o2) {
                if(o1.getOrder() != o2.getOrder()){
                    return o1.getOrder()  - o2.getOrder();
                }
                return 0;
            }
        };
        return comparator;
    }

生成树的方法:

public Map<String,Object> findTree(){
    Map<String,Object> data = new HashMap<String,Object>();
        try {//查询所有菜单
            List<Menu> allMenu = menuDao.findTree();
            
            //根节点
            List<Menu> rootMenu = new ArrayList<Menu>();
            for (Menu nav : allMenu) {
                if(nav.getParentId().equals("0")){//父节点是0的,为根节点。
                    rootMenu.add(nav);
                }
            }
            /* 根据Menu类的order排序 */
            Collections.sort(rootMenu, order());
            //为根菜单设置子菜单,getClild是递归调用的
            for (Menu nav : rootMenu) {
                /* 获取根节点下的所有子节点 使用getChild方法*/
                List<Menu> childList = getChild(nav.getId(), allMenu);
                nav.setChildren(childList);//给根节点设置子节点
            }
            /**
             * 输出构建好的菜单数据。
             * 
             */
            data.put("success", "true");
            data.put("list", rootMenu);
            return data;
        } catch (Exception e) {
            data.put("success", "false");
            data.put("list", new ArrayList());
            return data;
        }
    }

获取子菜单:

public List<Menu> getChild(String id,List<Menu> allMenu){
        //子菜单
        List<Menu> childList = new ArrayList<Menu>();
        for (Menu nav : allMenu) {
            // 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
            //相等说明:为该根节点的子节点。
            if(nav.ParentId().equals(id)){
                childList.add(nav);
            }
        }
        //递归
        for (Menu nav : childList) {
            nav.setChildren(getChild(nav.getId(), allMenu));
        }
        Collections.sort(childList,order());//排序
        //如果节点下没有子节点,返回一个空List(递归退出)
        if(childList.size() == 0){
            return new ArrayList<Menu>();
        }
        return childList;
    }

Controller
    @ApiOperation(value ="根据角色id查询已绑定菜单")
    @RequestMapping(value = "/findMenuByRoleId", method = RequestMethod.POST)
    public InvokeResult<List<Menu>> findDepByRoleId(@RequestBody Role role, HttpSession session) {
        if (role==null ||StringUtils.isEmpty(role.getRoleId())){
            InvokeResult.voidResult("角色或id不能为空");
        }
        List<Menu> menus = menuService.findByRoleId(role.getRoleId());
        return InvokeResult.success(menus);
    }
Service
   @Override
    public List<Menu> findByRoleId(String roleId) {
        List<Menu> all = menuDao.listNoDisabledAndDr();
        List<Menu> myMenus = menuDao.listTreeByRoleId(roleId);
        for (Menu m : myMenus) {
            for (Menu menu : all) {
                if (menu.getMenuId().equals(m.getMenuId())) {
                    menu.setChecked(true);
                    break;
                }
            }
        }
        return initTree(all);
    }
第一种方式构建树
 /**
     * 根据menus列表构建树
     *
     * @param
     * @return
     */
    private List<Menu> initTree(List<Menu> myMenus) {
        List<Menu> myMenuTree = new ArrayList<Menu>();
        for (Menu menu : myMenus) {
            if (StringUtil.isEmpty(menu.getParentId())) {
                myMenuTree.add(menu);
            }
            for (Menu m : myMenus) {
                if (menu.getMenuId().equals(m.getParentId())) {
                    if (menu.getChildren() == null) {
                        List<Menu> myChildren = new ArrayList<Menu>();
                        myChildren.add(m);
                        menu.setChildren(myChildren);
                        menu.setChecked(false);/* 非叶子节点,设置checked为false */
                    } else {
                        menu.getChildren().add(m);
                    }
                }
            }
        }
        return myMenuTree;
    }

第二种方式构建树
  private List<Menu> initTree(List<Menu> allMenu) {
        List<Menu> rootMenu = new ArrayList<Menu>();
        for (Menu nav : allMenu) {
            if(StringUtil.isEmpty(nav.getParentId())){
                rootMenu.add(nav);
            }
        }
        for (Menu nav : rootMenu) {
            List<Menu> childList = getChild(nav.getMenuId(), allMenu);
            nav.setChildren(childList);
        }
        return rootMenu;
    }
    public List<Menu> getChild(String id,List<Menu> allMenu){
        List<Menu> childList = new ArrayList<Menu>();
        for (Menu nav : allMenu) {
            if(StringUtils.isNotBlank(nav.getParentId())&&nav.getParentId().equals(id)){
                childList.add(nav);
            }
        }
        for (Menu nav : childList) {
            nav.setChildren(getChild(nav.getMenuId(), allMenu));
        }
        if(childList.size() == 0){
            return new ArrayList<Menu>();
        }
        return childList;
    }
展开阅读全文

没有更多推荐了,返回首页