本节的主要内容是在前一节的基础上,提供结构查询出所有的二级、三级分类数据。
一,构造响应体数据结构
后端返回给前端的数据结构是在开发详细设计中应该确定的内容。
分析前端需要的数据结构,后端要将所有一级分类包含的二级和三级分类信息封装好,返回给前端。
以JSON格式返回,JSON最外层是一个对象,这个对象有多个属性,key是所有一级分类的catId。
属性值是一个数组,包含这个一级分类下所有的二级分类信息。
每个二级分类对象中,除了包含本身的分类Id外,还包含其所属的一级分类Id,以及其下的所有三级分类信息。
package com.atguigu.gulimall.product.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
public class Catelog2Vo {
/**
* 一级父分类的id
*/
private String catalog1Id;
/**
* 三级子分类
*/
private List<Category3Vo> catalog3List;
private String id;
private String name;
/**
* 三级分类vo
*/
public static class Category3Vo {
/**
* 父分类、二级分类id
*/
private String catalog2Id;
private String id;
private String name;
}
}
二,后台接口
后台接口实现并不难,关键在于理解响应体的结构,根据结构进行封装。
Map<String, List<Catelog2Vo>> getCatalogJson() {
System.out.println("查询了数据库");
//将数据库的多次查询变为一次
List<CategoryEntity> selectList = this.baseMapper.selectList(null);
//1、查出所有分类
//1、1)查出所有一级分类
List<CategoryEntity> level1Categorys = getParentCid(selectList, 0L);
//封装数据
Map<String, List<Catelog2Vo>> parentCid = level1Categorys.stream().collect(Collectors.toMap(k -> k.getCatId().toString(), v -> {
//1、每一个的一级分类,查到这个一级分类的二级分类
List<CategoryEntity> categoryEntities = getParentCid(selectList, v.getCatId());
//2、封装上面的结果
List<Catelog2Vo> catelog2Vos = null;
if (categoryEntities != null) {
catelog2Vos = categoryEntities.stream().map(l2 -> {
Catelog2Vo catelog2Vo = new Catelog2Vo(v.getCatId().toString(), null, l2.getCatId().toString(), l2.getName().toString());
//1、找当前二级分类的三级分类封装成vo
List<CategoryEntity> level3Catelog = getParentCid(selectList, l2.getCatId());
if (level3Catelog != null) {
List<Catelog2Vo.Category3Vo> category3Vos = level3Catelog.stream().map(l3 -> {
//2、封装成指定格式
Catelog2Vo.Category3Vo category3Vo = new Catelog2Vo.Category3Vo(l2.getCatId().toString(), l3.getCatId().toString(), l3.getName());
return category3Vo;
}).collect(Collectors.toList());
catelog2Vo.setCatalog3List(category3Vos);
}
return catelog2Vo;
}).collect(Collectors.toList());
}
return catelog2Vos;
}));
return parentCid;
}
private List<CategoryEntity> getParentCid(List<CategoryEntity> selectList, Long parentCid) {
List<CategoryEntity> categoryEntities = selectList.stream().filter(item -> item.getParentCid().equals(parentCid)).collect(Collectors.toList());
return categoryEntities;
}
public
这段代码主要功能是从数据库中获取商品分类信息并将其组织成特定的数据结构返回。
整个过程可以概括为从数据库中获取所有分类信息,然后根据分类的层级关系(一级、二级、三级)对这些信息进行分组和组织,以便于前端展示或后续处理。
这种方法减少了对数据库的多次查询,提高了性能。