效果如下:
父对象中有子对象,对象之间有层级关系
知识储备
在数据表中有一个属性Pid用于储存父id,在java的实体类对象中,有一个List<object> children用于储存父对象下的子对象
核心代码:
通过已获取到的objects列表对象去获得Pid为null的对象
List<object> parentNodes = objects.stream().filter(o-> o.getPid() == null).collect(Collectors.toList());
是实现该功能:
1.创建数据表
2.创建实体类表
@Getter
@Setter
@TableName("sys_permission")
public class Permission implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 名称
*/
private String name;
/**
* 路径
*/
private String path;
/**
* 顺序
*/
private Integer orders;
/**
* 图标
*/
private String icon;
/**
* 页面路径
*/
private String page;
/**
* 权限
*/
private String auth;
/**
* 父级id
*/
private Integer pid;
/**
* 逻辑删除
*/
private Integer deleted;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
/**
* 类型,1目录 2菜单 3按钮
*/
private Integer type;
/**
* 是否隐藏
*/
private Boolean hide;
@TableField(exist = false)
private List<Permission> children;
}
3.controller层
抛出方法,让service层去实现
//查全部
@GetMapping
public Result findAll() {
return Result.success(permissionService.findChildren());
}
4.service层(核心)
实现该功能
@Autowired
PermissionMapper permissionMapper;
@Override
public List<Permission> findChildren() {
// 查询所有数据
List<Permission> permissions = permissionMapper.selectList(null);
// 找出pid为null的一级菜单
List<Permission> parentNodes = permissions.stream().filter(permission -> permission.getPid() == null).collect(Collectors.toList());
for ( Permission permission:parentNodes){
// 筛选所有数据中pid=父级id的数据就是二级菜单
List<Permission> collect = permissions.stream().filter(permission1 -> permission1.getPid() ==permission.getId()).collect(Collectors.toList());
//将选出的二级菜单对象写进去
permission.setChildren(collect);
}
return parentNodes;
}