美文网首页
Java 实现菜单递归

Java 实现菜单递归

作者: 天不错啊 | 来源:发表于2020-03-08 17:55 被阅读0次

    一、前言

    最近在写一个博客的项目,菜单页面需要递归实现。
    天天写crud递归都忘了咋写。一边百度一边好不容易写完了。
    在此记录一下。

    表结构

    create table sys_menu
    (
        menu_id     bigint auto_increment comment '菜单ID'
            primary key,
        menu_name   varchar(50)              not null comment '菜单名称',
        parent_id   bigint       default 0   null comment '父菜单ID',
        order_num   int(4)       default 0   null comment '显示顺序',
        url         varchar(200) default '#' null comment '请求地址',
        target      varchar(20)  default ''  null comment '打开方式(menuItem页签 menuBlank新窗口)',
        menu_type   char         default ''  null comment '菜单类型(M目录 C菜单 F按钮)',
        visible     char         default '0' null comment '菜单状态(0显示 1隐藏)',
        perms       varchar(100)             null comment '权限标识',
        icon        varchar(100) default '#' null comment '菜单图标',
        is_deleted  varchar(1)   default '0' null comment '删除状态(0显示 1删除)',
        create_by   varchar(64)  default ''  null comment '创建者',
        create_time datetime                 null comment '创建时间',
        update_by   varchar(64)  default ''  null comment '更新者',
        update_time datetime                 null comment '更新时间',
        remark      varchar(500) default ''  null comment '备注'
    )
        comment '菜单权限表';
    

    二、 实现思路

    1. 遍历所有菜单,把parentId字段为0添加到父集合中。
    2. 遍历父菜单集合,调用方法getChildList(allList, menuId)
    3. getChildList(allList, menuId) 遍历所有parentId等于menuId添加到子集合中。遍历子集合调用getChildList(allList, menuId) 方法。

    三、 具体代码

        public List<SysMenu> selectMenusByUser(SysUser user) {
            List<SysMenu> menuList = menuMapper.selectMenusByUserId(user.getUserId());
            return getChildPerms(menuList);
        }
    
        private List<SysMenu> getChildPerms(List<SysMenu> allMenuList) {
            List<SysMenu> rootList = new ArrayList<>();
            for (Iterator<SysMenu> lt = allMenuList.iterator(); lt.hasNext(); ) {
                SysMenu menu = lt.next();
                if (menu.getParentId() == 0) {
                    rootList.add(menu);
                    lt.remove();
                }
            }
    
            for (SysMenu menu : rootList) {
                menu.setChildren(getChild(allMenuList, menu.getMenuId()));
            }
            return rootList;
        }
    
        private List<SysMenu> getChild(List<SysMenu> allMenuList, Long id) {
            List<SysMenu> childList = new ArrayList<>();
    
            for (Iterator<SysMenu> lt = allMenuList.iterator(); lt.hasNext(); ) {
                SysMenu menu = lt.next();
                if (menu.getParentId().equals(id)) {
                    childList.add(menu);
                    lt.remove();
                }
            }
    
                for (SysMenu menu : childList) {
                menu.setChildren(getChild(allMenuList, menu.getMenuId()));
            }
            return childList;
        }
    

    四、 总结

    代码一看就会,用的时候就是想不起来。
    代码很简单,最基本的递归。

    相关文章

      网友评论

          本文标题:Java 实现菜单递归

          本文链接:https://www.haomeiwen.com/subject/hghjdhtx.html