问题描述
解决方案
数据库SQL
CREATE TABLE `goods_category` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '分类id',
`category_level` tinyint(4) NOT NULL DEFAULT '0' COMMENT '分类级别(1-一级分类 2-二级分类 3-三级分类)',
`parent_id` int(11) NOT NULL DEFAULT '0' COMMENT '父分类id',
`category_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '分类名称',
`category_rank` int(11) NOT NULL DEFAULT '0' COMMENT '排序值(字段越大越靠前)',
`is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标识字段(0-未删除 1-已删除)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`create_user` int(11) NOT NULL DEFAULT '0' COMMENT '创建者id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`update_user` int(11) DEFAULT '0' COMMENT '修改者id',
PRIMARY KEY (`id`) USING BTREE
)
Service
/**
* <p>
* 服务实现类
* </p>
*
* @author ShenTuZhiGang
* @since 2020-11-08
*/
@Service
public class GoodsCategoryServiceImpl extends ServiceImpl<GoodsCategoryMapper, GoodsCategory> implements IGoodsCategoryService {
@Autowired
private GoodsCategoryMapper goodsCategoryMapper;
@Override
public List<GoodsCategory> listWithTree() {
//1、查出所有分类
List<GoodsCategory> entities = goodsCategoryMapper.selectList(null);
//2、组装成父子的树形结构
//2.1找到所有的一级分类
List<GoodsCategory> level1Menus = entities.stream()
.filter((goodsCategory) -> goodsCategory.getParentId() == 0)
.peek((menu)-> menu.setChildren(getChildren(menu,entities)))
.sorted((menu1,menu2)->(menu1.getCategoryRank()==null?0:menu1.getCategoryRank()) - (menu2.getCategoryRank()==null?0:menu2.getCategoryRank()))
.collect(Collectors.toList());
return level1Menus;
}
//递归查找所有菜单的子菜单
private List<GoodsCategory> getChildren(GoodsCategory root,List<GoodsCategory> all){
List<GoodsCategory> child = all.stream()
.filter(GoodsCategory -> GoodsCategory.getParentId().equals( root.getId()))
//找到子菜单
.peek(GoodsCategory -> GoodsCategory.setChildren(getChildren(GoodsCategory, all)))
//菜单的排序
.sorted((menu1,menu2)->(menu1.getCategoryRank())==null?0:menu1.getCategoryRank() - (menu2.getCategoryRank()==null?0:menu2.getCategoryRank()))
.collect(Collectors.toList());
return child.isEmpty()?null:child;
}
}