一、菜单表结构
-- auto-generated definition
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 '显示顺序',
path varchar(200) default '' null comment '路由地址',
component varchar(255) null comment '组件路径',
is_frame int(1) default 1 null comment '是否为外链(0是 1否)',
is_cache int(1) default 0 null comment '是否缓存(0缓存 1不缓存)',
menu_type char default '' null comment '菜单类型(M目录 C菜单 F按钮)',
visible char default '0' null comment '菜单状态(0显示 1隐藏)',
status char default '0' null comment '菜单状态(0正常 1停用)',
perms varchar(100) null comment '权限标识',
icon varchar(100) default '#' null comment '菜单图标',
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 '菜单表';
二、菜单实体类
@Data
public class SysMenu extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 菜单ID */
private Long menuId;
/** 菜单名称 */
private String menuName;
/** 父菜单名称 */
private String parentName;
/** 父菜单ID */
private Long parentId;
/** 显示顺序 */
private String orderNum;
/** 路由地址 */
private String path;
/** 组件路径 */
private String component;
/** 是否为外链(0是 1否) */
private String isFrame;
/** 是否缓存(0缓存 1不缓存) */
private String isCache;
/** 类型(M目录 C菜单 F按钮) */
private String menuType;
/** 显示状态(0显示 1隐藏) */
private String visible;
/** 菜单状态(0显示 1隐藏) */
private String status;
/** 权限字符串 */
private String perms;
/** 菜单图标 */
private String icon;
/** 子菜单 */
private List<SysMenu> children = new ArrayList<SysMenu>();
}
/**
* 统一返回结果实体类
*/
public class AjaxResult extends HashMap<String, Object>
{
private static final long serialVersionUID = 1L;
/** 状态码 */
public static final String CODE_TAG = "code";
/** 返回内容 */
public static final String MSG_TAG = "msg";
/** 数据对象 */
public static final String DATA_TAG = "data";
/**
* 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
*/
public AjaxResult()
{
}
/**
* 初始化一个新创建的 AjaxResult 对象
*
* @param code 状态码
* @param msg 返回内容
*/
public AjaxResult(int code, String msg)
{
super.put(CODE_TAG, code);
super.put(MSG_TAG, msg);
}
/**
* 初始化一个新创建的 AjaxResult 对象
*
* @param code 状态码
* @param msg 返回内容
* @param data 数据对象
*/
public AjaxResult(int code, String msg, Object data)
{
super.put(CODE_TAG, code);
super.put(MSG_TAG, msg);
if (StringUtils.isNotNull(data))
{
super.put(DATA_TAG, data);
}
}
/**
* 返回成功消息
*
* @return 成功消息
*/
public static AjaxResult success()
{
return AjaxResult.success("操作成功");
}
/**
* 返回成功数据
*
* @return 成功消息
*/
public static AjaxResult success(Object data)
{
return AjaxResult.success("操作成功", data);
}
/**
* 返回成功消息
*
* @param msg 返回内容
* @return 成功消息
*/
public static AjaxResult success(String msg)
{
return AjaxResult.success(msg, null);
}
/**
* 返回成功消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 成功消息
*/
public static AjaxResult success(String msg, Object data)
{
return new AjaxResult(HttpStatus.SUCCESS, msg, data);
}
/**
* 返回错误消息
*
* @return
*/
public static AjaxResult error()
{
return AjaxResult.error("操作失败");
}
/**
* 返回错误消息
*
* @param msg 返回内容
* @return 警告消息
*/
public static AjaxResult error(String msg)
{
return AjaxResult.error(msg, null);
}
/**
* 返回错误消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 警告消息
*/
public static AjaxResult error(String msg, Object data)
{
return new AjaxResult(HttpStatus.ERROR, msg, data);
}
/**
* 返回错误消息
*
* @param code 状态码
* @param msg 返回内容
* @return 警告消息
*/
public static AjaxResult error(int code, String msg)
{
return new AjaxResult(code, msg, null);
}
}
三、具体的方法
public AjaxResult getMenu() {
SysMenu sysMenu = new SysMenu();
//获取用户的所有菜单项
List<SysMenu> allList = sysMenuService.selectMenuList(sysMenu, 1L);
//获取一级菜单(parent_id=0的是一级菜单)
List<SysMenu> rootList = allList
.stream()
.filter(s -> s.getParentId().intValue() == 0)
.peek(s->s.setChildren(getChilden(s, allList)))
.collect(Collectors.toList());
return AjaxResult.success(rootList);
}
/**
* 递归获取子菜单
*
* @param menu 上级菜单
* @param allList 用户的所有菜单项
* @return 子菜单列表
*/
private List<SysMenu> getChilden(SysMenu menu, List<SysMenu> allList) {
List<SysMenu> childList = allList
.stream()
.filter(s -> menu.getMenuId().equals(s.getParentId()))
.peek(s-> s.setChildren(getChilden(s,allList)))
.collect(Collectors.toList());
return childList;
}
四、.map() 和 .peek()的区别
https://blog.csdn.net/tckt75433/article/details/81510743