一:pojo类
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("acl_permission")
@ApiModel(value="Permission对象", description="权限")
public class Permission implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "编号")
@TableId(value = "id", type = IdType.ID_WORKER_STR)
private String id;
@ApiModelProperty(value = "所属上级")
private String pid;
@ApiModelProperty(value = "名称")
private String name;
@ApiModelProperty(value = "类型(1:菜单,2:按钮)")
private Integer type;
@ApiModelProperty(value = "权限值")
private String permissionValue;
@ApiModelProperty(value = "访问路径")
private String path;
@ApiModelProperty(value = "组件路径")
private String component;
@ApiModelProperty(value = "图标")
private String icon;
@ApiModelProperty(value = "状态(0:禁止,1:正常)")
private Integer status;
@ApiModelProperty(value = "层级")
@TableField(exist = false)
private Integer level;
@ApiModelProperty(value = "下级")
@TableField(exist = false)
private List<Permission> children;
@ApiModelProperty(value = "是否选中")
@TableField(exist = false)
private boolean isSelect;
@ApiModelProperty(value = "逻辑删除 1(true)已删除, 0(false)未删除")
private Boolean isDeleted;
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
private Date gmtCreate;
@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmtModified;
}
二:主要思路。
首先先找到第一层的数据,也就是开头,他的pid = 0,然后过滤根据条件在filter中过滤数据,然后在map中进行为其添加子节点的信息。
专门有一个方法来实现为其找到所有的子节点,然后再进行递归调用,为其找到所有的子节点以及子子节点,然后进行过滤,然后收集等操作来封装子子节点的数据。
三:代码实现。
1:controller层
//根据stream流来获取全部菜单。
@GetMapping("/findall")
public R FindAllViews(){
List<Permission> list = permissionService.findAllMenu();
return R.ok().data("children",list);
}
2:service接口层
//根据stream流来获取全部菜单。
List<Permission> findAllMenu();
3:serviceImpl实现类。
//根据stream流来获取全部菜单。
@Override
public List<Permission> findAllMenu() {
//1 查询菜单表所有数据
QueryWrapper<Permission> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("id");
List<Permission> permissionList = baseMapper.selectList(wrapper);
//获取父节点,0表示父节点,让此次递归有个开头
List<Permission> collect = permissionList.stream()
//父节点的id = 0,根据它开始进行实现。
.filter(e -> e.getPid().equals("0"))
.map(e ->{
//将过滤之后的数据来进行方法调用,拿到他的所有的子节点信息并进行封装
e.setChildren(getchildrens(e, permissionList));
return e;
}).collect(Collectors.toList());
return collect;
}
//递归查询子节点
private List<Permission> getchildrens(Permission root,List<Permission> permissionList){
//root为每次最新的传递过来的数据,也就是上面过滤之后的 e ;
List<Permission> collect = permissionList.stream()
//根据传递过来的 e ,拿到他的id,来查询出他的子节点id 这里有个特点 e.id = 子节点的父节点id
.filter(e -> Objects.equals(e.getPid(), root.getId()))
.map(e -> {
//递归找到他的子节点,直到找到最后一个子节点为止,饼进行封装。
e.setChildren(getchildrens(e, permissionList));
return e;
}).collect(Collectors.toList());
return collect;
}