今天的项目需求中,需要根据原型实现类别的多级分类,具体的原型如下:
1、用到的相关参数类型
1、StoragePropertyCategoryVo.java
public class StoragePropertyCategoryVo implements Serializable {
private static final long serialVersionUID = 1L;
/** id */
@ApiModelProperty(value = "id")
private String id;
/**
* 父级id
*/
@ApiModelProperty(value = "父级id")
private String parentId;
/**
* 祖级id
*/
@ApiModelProperty(value = "祖级id")
private String ancestorsId;
/**
* 名称
*/
@ApiModelProperty(value = "名称")
private String name;
/**
* 排序
*/
@ApiModelProperty(value = "排序")
private Integer sort;
/**
* 是否启用,0正常,1停用
*/
@ApiModelProperty(value = "是否启用,0正常,1停用")
private Boolean enableStatus;
/**
* 删除状态,0正常,1删除
*/
@ApiModelProperty(value = "删除状态,0正常,1删除")
private String deleteStatus;
/**
* 创建人id
*/
@ApiModelProperty(value = "创建人id")
private Long createBy;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
private LocalDateTime createTime;
/**
* 修改人id
*/
@ApiModelProperty(value = "修改人id")
private Long updateBy;
/**
* 修改时间
*/
@ApiModelProperty(value = "修改时间")
private LocalDateTime updateTime;
/**
* 用户id
*/
@ApiModelProperty(value = "用户id")
private Long userId;
/**
* 部门id
*/
@ApiModelProperty(value = "部门id")
private Long deptId;
@ApiModelProperty(value = "子列表")
private List<StoragePropertyCategoryVo> children = new ArrayList<>();
public StoragePropertyCategoryVo() {}
}
2、CategoryListVo.java
public class CategoryListVo {
/** id */
@ApiModelProperty(value = "id")
private String id;
/**
* 名称
*/
@ApiModelProperty(value = "名称")
private String name;
/**
* 排序
*/
@ApiModelProperty(value = "排序")
private Integer sort;
/**
* 是否启用,0正常,1停用
*/
@ApiModelProperty(value = "是否启用,0正常,1停用")
private Boolean enableStatus;
@ApiModelProperty(value = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@ApiModelProperty(value = "子类列表")
private List<CategoryListVo> children = new ArrayList<>();
public CategoryListVo(StoragePropertyCategoryVo category)
{
this.id = category.getId();
this.name = category.getName();
this.sort = category.getSort();
this.enableStatus = category.getEnableStatus();
this.createTime = category.getCreateTime();
this.children = category.getChildren().stream().map(CategoryListVo::new).collect(Collectors.toList());
}
}
3、FindCategoryListDto.java
public class FindCategoryListDto {
@ApiModelProperty(value = "名称")
private String name;
@ApiModelProperty(value = "状态,0正常,1停用")
private Boolean enableStatus;
/**
* 开始时间
*/
@ApiModelProperty(value = "开始时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
/**
* 结束时间
*/
@ApiModelProperty(value = "结束时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
}
2、controller层
@GetMapping("/pageList")
@ApiOperation(value = "查询资产-分类列表")
public List<CategoryListVo> list(FindCategoryListDto dto)
{
List<CategoryListVo> list = storagePropertyCategoryService.selectCategoryList(dto);
return list;
}
3、service业务层
我们利用递归的实现
public List<CategoryListVo> selectCategoryList(FindCategoryListDto dto) {
//1.查出全部类别
List<StoragePropertyCategoryVo> listVos = storagePropertyCategoryMapper.selectCategoryList(dto);
//2.调用构建树形列表方法
List<StoragePropertyCategoryVo> resList = buildCategoryTree(listVos);
//3.将返回的结果resList转换
return resList.stream().map(CategoryListVo::new).collect(Collectors.toList());
}
/**
* 构建前端所需要树结构
* @param categorys 分类列表
* @return 树结构列表
*/
public List<StoragePropertyCategoryVo> buildCategoryTree(List<StoragePropertyCategoryVo> categorys)
{
List<StoragePropertyCategoryVo> returnList = new ArrayList<>();
List<String> tempList = new ArrayList<>();
for (StoragePropertyCategoryVo category : categorys)
{
tempList.add(category.getId());
}
for (Iterator<StoragePropertyCategoryVo> iterator = categorys.iterator(); iterator.hasNext();)
{
StoragePropertyCategoryVo category = iterator.next();
// 如果是顶级节点, 遍历该父节点的所有子节点
if (!tempList.contains(category.getParentId()))
{
recursionFn(categorys, category);
returnList.add(category);
}
}
if (returnList.isEmpty())
{
returnList = categorys;
}
return returnList;
}
/**
* 递归列表
*/
private void recursionFn(List<StoragePropertyCategoryVo> list, StoragePropertyCategoryVo t)
{
// 得到子节点列表
List<StoragePropertyCategoryVo> childList = getChildList(list, t);
t.setChildren(childList);
for (StoragePropertyCategoryVo tChild : childList)
{
if (hasChild(list, tChild))
{
recursionFn(list, tChild);
}
}
}
/**
* 得到子节点列表
*/
private List<StoragePropertyCategoryVo> getChildList(List<StoragePropertyCategoryVo> list, StoragePropertyCategoryVo t)
{
List<StoragePropertyCategoryVo> tlist = new ArrayList<>();
Iterator<StoragePropertyCategoryVo> it = list.iterator();
while (it.hasNext())
{
StoragePropertyCategoryVo n = it.next();
if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().equals(t.getId()))
{
tlist.add(n);
}
}
return tlist;
}
/**
* 判断是否有子节点
*/
private boolean hasChild(List<StoragePropertyCategoryVo> list, StoragePropertyCategoryVo t)
{
return getChildList(list, t).size() > 0 ? true : false;
}
4、结果展现
我们利用swagger进行测试,能够得到分级的数据结果
通过以上代码的编写,我们可以实现多级分类。