java从数据库读取菜单,递归生成菜单树
参考:https://blog.****.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; }