美文网首页
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 实现菜单递归

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

  • 39.React动态菜单组件实现

    实现动态菜单主要是使用递归+Menu组件来实现的。递归用来二级以及多级菜单。判断menu是否有children,有...

  • 链表

    一、单向链表 单向链表的普通实现 Java实现: Kotlin实现: 单向链表的递归实现 Java实现: 二、双向...

  • Java递归算法详解

    递归算法是一种直接或者间接调用自身函数或者方法的算法。Java递归算法是基于Java语言实现的递归算法。递归算法的...

  • Vue 树形菜单封装

    item.vue index.vue 使用 数据递归可以看看我另一篇文章使用递归实现树状菜单

  • element 导航菜单折叠动画,文字不隐藏

    问题 使用element导航菜单做侧边栏菜单,用递归组件实现路由菜单渲染,遇到两个问题 折叠后文字不隐藏 折叠动画...

  • Java实现文件目录操作书目录

    Java实现文件目录操作之使用IO和NIO创建目录 Java实现文件目录操作之递归遍历目录和文件 Java实现文件...

  • java 无限级菜单递归

  • 使用递归实现树状菜单

    对应element的Tree 树形控件 数据效果:

  • 排序

    八大排序算法 一、归并排序 递归及非递归的JAVA实现 二、快速排序 快排算法JAVA实现 三、堆排序 堆排序堆排...

网友评论

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

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