参考: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;
}