一、前言
最近在写一个博客的项目,菜单页面需要递归实现。
天天写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 '菜单权限表';
二、 实现思路
- 遍历所有菜单,把parentId字段为0添加到父集合中。
- 遍历父菜单集合,调用方法getChildList(allList, menuId)。
- 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;
}
四、 总结
代码一看就会,用的时候就是想不起来。
代码很简单,最基本的递归。
网友评论