java从数据库读取菜单,递归生成菜单树

参考:https://blog.csdn.net/frankcheng5143/article/details/52958486

https://liuyanzhao.com/8846.html

返回json结果:

{
    "code": 0,
    "msg": "成功",
    "data": [
        {
            "menu_id": 1,
            "parent_id": 0,
            "name": "系统管理",
            "url": null,
            "perms": null,
            "type": 0,
            "icon": "system",
            "order_num": 0,
            "parentName": null,
            "open": null,
            "childMenus": [
                {
                    "menu_id": 2,
                    "parent_id": 1,
                    "name": "管理员列表",
                    "url": "sys/user",
                    "perms": null,
                    "type": 1,
                    "icon": "admin",
                    "order_num": 1,
                    "parentName": null,
                    "open": null,
                    "childMenus": null
                },
                {
                    "menu_id": 3,
                    "parent_id": 1,
                    "name": "角色管理",
                    "url": "sys/role",
                    "perms": null,
                    "type": 1,
                    "icon": "role",
                    "order_num": 2,
                    "parentName": null,
                    "open": null,
                    "childMenus": null
                },
                {
                    "menu_id": 4,
                    "parent_id": 1,
                    "name": "菜单管理",
                    "url": "sys/menu",
                    "perms": null,
                    "type": 1,
                    "icon": "menu",
                    "order_num": 3,
                    "parentName": null,
                    "open": null,
                    "childMenus": null
                },
                {
                    "menu_id": 5,
                    "parent_id": 1,
                    "name": "SQL监控",
                    "url": "http://localhost:8080/renren-fast/druid/sql.html",
                    "perms": null,
                    "type": 1,
                    "icon": "sql",
                    "order_num": 4,
                    "parentName": null,
                    "open": null,
                    "childMenus": null
                },
                {
                    "menu_id": 6,
                    "parent_id": 1,
                    "name": "定时任务",
                    "url": "job/schedule",
                    "perms": null,
                    "type": 1,
                    "icon": "job",
                    "order_num": 5,
                    "parentName": null,
                    "open": null,
                    "childMenus": null
                }
            ]
        },
        {
            "menu_id": 31,
            "parent_id": 0,
            "name": "产成品管理",
            "url": null,
            "perms": null,
            "type": 0,
            "icon": "zhedie",
            "order_num": 0,
            "parentName": null,
            "open": null,
            "childMenus": [
                {
                    "menu_id": 32,
                    "parent_id": 31,
                    "name": "成品",
                    "url": "chanchengpin/tang",
                    "perms": null,
                    "type": 1,
                    "icon": null,
                    "order_num": 0,
                    "parentName": null,
                    "open": null,
                    "childMenus": null
                }
            ]
        },
        {
            "menu_id": 30,
            "parent_id": 0,
            "name": "文件上传",
            "url": "oss/oss",
            "perms": "sys:oss:all",
            "type": 1,
            "icon": "oss",
            "order_num": 6,
            "parentName": null,
            "open": null,
            "childMenus": null
        }
    ]
}

1.菜单实体类:

/**
 * @description:菜单管理
 * @author: Administrator
 * @date: 2019-03-01 14:14
 */
@Data
@TableName("sys_menu")
public class SysMenu {
    /**
     * 菜单ID
     */
    private long menu_id;
    /**
     * 父菜单ID,一级菜单为0
     */
    private long parent_id;
    /**
     * 菜单名称
     */
    private String name;
    /**
     * 菜单URL
     */
    private String url;
    /**
     * 授权(多个用逗号分隔,如:user:list,user:create)
     */
    private String perms;
    /**
     * 类型     0:目录   1:菜单   2:按钮
     */
    private int type;
    /**
     * 菜单图标
     */
    private String icon;
    /**
     * 排序
     */
    private int order_num;
    /**
     * 父菜单名称
     */
    @TableField(exist=false)
    private String parentName;

    /**
     * ztree属性
     */
    @TableField(exist=false)
    private Boolean open;

    /**
     * 子菜单
     */
    @TableField(exist=false)
    private List<SysMenu> childMenus;

}

2.

// 原始的数据
List<SysMenu> sysMenuList=sysMenuDao.queryMenuList(role_id);
// 最后的结果
List<SysMenu> newMenuList = new ArrayList<>();
// 先找到所有的一级菜单
for (int i = 0; i < sysMenuList.size(); i++){
    SysMenu sysMenu=sysMenuList.get(i);
    Long parent_id=sysMenu.getParent_id();
    // 如果是顶级菜单,没有父菜单
    if (parent_id==0){
        newMenuList.add(sysMenu);
    }
}
// 为一级菜单设置子菜单,getChild是递归调用的
for (SysMenu menu : newMenuList) {
    menu.setChildMenus(getChild(menu.getMenu_id(), sysMenuList));
}
//    递归查找子菜单
private List<SysMenu> getChild(long id, List<SysMenu> rootMenu) {
    // 子菜单
    List<SysMenu> childList = new ArrayList<>();
    for (SysMenu menu : rootMenu) {
        // 遍历所有节点,将父菜单id与传过来的id比较
        if (menu.getParent_id()==id) {
            childList.add(menu);
        }
    }
    // 把子菜单的子菜单再循环一遍
    for (SysMenu menu : childList) {
        // 没有url子菜单还有子菜单
        if (menu.getUrl()==null) {
            // 递归
            menu.setChildMenus(getChild(menu.getMenu_id(), rootMenu));
        }
    } // 递归退出条件
    if (childList.size() == 0) {
        return null;
    }
    return childList;

}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值