需要将从数据库中查询出的分类对象构成下面的结构
[
{id:1,name:"手机/运行商/数码",parentId:0,depth:1,children:[
{id:2,name:"手机通讯",parentId:1,depth:2,children:[
{id:3,name:"智能手机",parentId:2,depth:3,children:null},
{id:4,name:"非智能手机",parentId:2,depth:3,children:null}
]}
]},
{id:5,name:"电脑/办公",parentId:0,depth:1,children:[....]}
]
判断Redis中是否有三级分类树
注:下面用到的三个实体类
- FrontCategoryTreeVO:可以理解为一个空的泛型list
private List<T> categories;
- FrontCategoryStandVO:就是包含category标准属性
- FrontCategoryEntity:除了标准分类属性,还包含一个children属性:
下面展示FrontCategoryEntity类多出来的属性
。
/**
* 如果当前isParent是1,则需要下级分类
*/
private List<FrontCategoryEntity> childrens;
- 有【直接获取并返回】
- 没有【查询+利用自己创建的方法转换所有分类树,并存在Redis中】
分类树存入Redis的方法
- 第一部分:
1.声明Map(key是分类对象的parentId,value是这个id下所有子分类对象)
2.遍历所有分类对象,并赋值到能够保存父子关系的Entity中
【如果key包含parentId,则把Entity放在key对应的value中(list),如果没有,则新建一个value(list)并存入】
简单点:就是将所有parentId相同分类对象的放进map中
- 第二部分: (将子分类对象关联到父分类对象的children中)
-
- map.get(0L)获取一级分类:(这里默认parentId=0,是一级分类)
-
- 一级分类对象id,是二级分类对象的parentId。
-
所以遍历一级对象,获取二级对象,并通过setChildren()的方法把二级变为一级的children
-
- 二级分类对象id,是三级分类对象的parentId。
-
所以遍历二级对象,获取三级对象,并通过setChildren()的方法把三级变为二级的children
-
- 最后通过FrontCategoryTreeVO中categoies属性的set方法将一级分类树集合实现赋值,最终并返回
实现效果示例图:
- 最后通过FrontCategoryTreeVO中categoies属性的set方法将一级分类树集合实现赋值,最终并返回
-
下面展示一些
代码片
。
//遍历所有一级分类对象,根据当前一级分类id,获取他包含的二级分类对象
for (FrontCategoryEntity oneLevel : firstLevels) {
Long secondLevelParentId = oneLevel.getId();
//获取当前分类的所有子分类对象
List<FrontCategoryEntity> secondLevels = map.get(secondLevelParentId);
if (secondLevels == null || secondLevels.isEmpty()) {
log.warn("当前分类没有二级分类内容:{}", secondLevelParentId);
continue;
}
//遍历二级分类集合
for (FrontCategoryEntity twoLevel : secondLevels) {
/*根据二级分类id获取三级分类对象*/
Long thirdLevelParentId = twoLevel.getId();
List<FrontCategoryEntity> thirdLevels = map.get(thirdLevelParentId);
if (thirdLevels == null || thirdLevels.isEmpty()) {
log.warn("当前分类没有三级分类内容:{}", secondLevelParentId);
continue;
}
/*将三级分类对象集合赋值到二级分类对象的children属性中*/
twoLevel.setChildrens(thirdLevels);
}
/*将二级分类对象集合赋值到一级分类对象的children属性中*/
oneLevel.setChildrens(secondLevels);
}
// 到此为止,所有对象的父子分类关系都已经构建完成
// 最后要按照方法要求的返回值来返回
FrontCategoryTreeVO<FrontCategoryEntity> treeVO =
new FrontCategoryTreeVO<>();
treeVO.setCategories(firstLevels);
return treeVO;
}