商品とサービスの3レベルの分類(1)-コードの実現
まず、レンダリングを見てみましょう。
以下は、データベースに保存されている製品分類の分類表です。
フィールドの説明:
parent_cId
:親カテゴリのcat_id。
cat_level
:分類レベル
sort
:優先度が小さいほど、優先度が高くなります
分析
分類にはツリー構造のように親子関係があるため、サブカテゴリを指すように分類のBeanクラスに属性を追加する必要があります。
/**
* 子分类List集合
*/
@TableField(exist = false)
private List<CategoryEntity> children;
ツリー構造を形成するには、リストコレクションを増やしてサブカテゴリを保存する必要があります。このTableFiled(exist = false)
関数は、この属性がデータベースに存在しないことを宣言することです。
コード
-
サービス:
public List<CategoryEntity> listWithTree() { //1、查出所有分类 List<CategoryEntity> entities = baseMapper.selectList(null); //2、组装成具有父子关系的树形结构(因为要形成树形结构,所以要有一个List的属性来存子分类) //2.1、找到所有一级分类(parentId == 0) List<CategoryEntity> level1Menus = entities.stream().filter(e -> e.getParentCid() == 0 ).map(e -> { //查找子分类 e.setChildren(getChildrens(e,entities)); return e; }).sorted((e1,e2) -> { //排序 return (e1.getSort()==null?0:e1.getSort()) -(e2.getSort()==null?0:e2.getSort()); }).collect(Collectors.toList()); return level1Menus; }
-
再帰的方法:
/** * 递归地在所有分类中找到当前分类的子分类 * @param currentMenu * @param all * @return */ private List<CategoryEntity> getChildrens(CategoryEntity currentMenu,List<CategoryEntity> all) { //找到所有子分类并加入到子分类的List中 List<CategoryEntity> children = all.stream().filter(e -> { return e.getParentCid().intValue() == currentMenu.getCatId().intValue(); }).map(e -> { //继续找每个子分类的子分类 e.setChildren(getChildrens(e,all)); return e; }).sorted((e1,e2) -> { //排序 return (e1.getSort()==null?0:e1.getSort()) -(e2.getSort()==null?0:e2.getSort()); }).collect(Collectors.toList()); return children; }
総括する