1.商品分类业务实现
1.1问题说明
原始代码结构:出现2层for循环,如果外层循环10个,每个内内层循环也是10个,完成这项业务需要查询100次数据库
矛盾点:多次查询数据库!!!
优化的策略:数据库只查询一次,就可以获取商品分类三级嵌套结构
程序设计:
1.数据结构 Map<父级ID,所有子集列表信息> 列表信息中不包含嵌套关系
例如: map<0,一级列表信息> 一级列表不包含2级和3级
map<一级ID,二级列表信息> 只有2级列表 不包含3级
map<二级ID,三级列表信息> 只有3级列表
2.根据数据结构动态根据level查询子集。
1.2 业务实现
/**
* 1.数据结构:Map<k,v> key=parentId value="List<ItemCat>"
* 2.封装Map的数据类型
* 3.如果level=1 只获取一级
* 4.如果level=2 获取一级,一级嵌套2级
* 5.如果level=3 获取一级,一级嵌套2级,二级嵌套3级
* */
@Override
public List<ItemCat> findItemCatList(Integer level) {
long start = System.currentTimeMillis();
//1.封装Map集合
Map<Integer,List<ItemCat>> map =getMap();
//2.判断level的值
if (level==1){
return map.get(0);
}if (level==2){
return getTwoList(map);
}
long sum=System.currentTimeMillis()-start;
System.out.println(sum);
return getThreeList(map);
}
private List<ItemCat> getThreeList(Map<Integer, List<ItemCat>> map) {
//获取1级和二级
List<ItemCat> oneList = getTwoList(map);
for (ItemCat one :oneList){
List<ItemCat> twoList = one.getChildren();
if (twoList==null ||twoList.size()==0){
continue; //由于业务数据不合理 跳过本次循环,执行下一次
}
for (ItemCat two :twoList){
List<ItemCat> threeList = map.get(two.getId());
two.setChildren(threeList);
}
}
return oneList;
}
private List<ItemCat> getTwoList(Map<Integer, List<ItemCat>> map) {
//1.先获取1级的列表
List<ItemCat> oneList = map.get(0);
for (ItemCat one :oneList){
Integer parentId = one.getId();
List<ItemCat> twoList = map.get(parentId);
one.setChildren(twoList);
}
return oneList;
}
/**
* 1.查询所有的商品分类列表 数据库查询一次。
* 2.循环遍历所有的数据,按照parentId,List<ItemCat>
* 3.
* */
private Map<Integer, List<ItemCat>> getMap() {
Map<Integer, List<ItemCat>> map =new HashMap();
List<ItemCat> list = itemCatMapper.selectList(null);
for (ItemCat l :list){
Integer parentId = l.getParentId();
if (map.containsKey(parentId)){
map.get(parentId).add(l);
}else{
List<ItemCat> childrenList=new ArrayList();
childrenList.add(l);
map.put(parentId,childrenList);
}
}
return map;
}
1.3 商品分类状态修改
async updateStatus(itemCat) {
const {
data: result
} = await this.$http.put(`/itemCat/status/${itemCat.id}/${itemCat.status}`)
if (result.status !== 200) return this.$message.error("修改状态失败")
this.$message.success("状态修改成功")
},
业务接口的实现
请求路径: /itemCat/status/{id}/{status}
请求类型: put
请求参数:
1.4 新增商品分类
业务说明:商品分类实现中,需要添加一级/二级/三级分类信息。但是父级下拉框中勾选1-2级菜单,因为三级菜单不能当做父级。
代码实现:
@PostMapping("/saveItemCat")
@Transactional
public SysResult addItemCat(@RequestBody ItemCat itemCat){
itemCatService.addItemCat(itemCat);
return SysResult.success();
}
@Override
public void addItemCat(ItemCat itemCat) {
itemCat.setStatus(true);
itemCatMapper.insert(itemCat);
}
1.5 商品分类修改
代码实现
@PutMapping("/updateItemCat")
@Transactional
public SysResult updateItemCat(@RequestBody ItemCat itemCat){
itemCatService.updateItemCat(itemCat);
return SysResult.success();
}
@Override
public void updateItemCat(ItemCat itemCat) {
itemCatMapper.updateById(itemCat);
}
1.6 商品分类删除操作
1.6.1 业务说明
规则:
1.如果删除的商品分类是3级,可以直接删除
2.如果商品删除分类是2级,则先删除3级再删除2级
3.如果商品删除分类是1级,则先删除3级再删除2级最后删除1级
接口文档:
代码:
@DeleteMapping("/deleteItemCat")
public SysResult deleteItemCat(ItemCat itemCat){
itemCatService.deleteItemCat(itemCat);
return SysResult.success();
}
@Transactional
@Override
public void deleteItemCat(ItemCat itemCat) {
int level =itemCat.getLevel();
if (level==3){
//表示需要删除的数据是三级菜单,可以直接删除
itemCatMapper.deleteById(itemCat.getId());
}
if(level==2){
//表示需要删除的是二级,先删除二级下的三级
QueryWrapper<ItemCat> queryWrapper = new QueryWrapper();
queryWrapper.eq("parent_id", itemCat.getId())
.or()
.eq("id", itemCat.getId());
itemCatMapper.delete(queryWrapper);
}
if (level==1){
//1.必须获取二级ID
QueryWrapper<ItemCat> queryWrapper = new QueryWrapper();
queryWrapper.eq("parent_id",itemCat.getId());
//获取结果的第一列字段(主键)
List twoIdsList = itemCatMapper.selectObjs(queryWrapper);
queryWrapper.clear();
queryWrapper.in(twoIdsList.size()>0,"parent_id", twoIdsList)
.or()
.eq("parent_id",itemCat.getId())
.or()
.eq("id",itemCat.getId() );
itemCatMapper.delete(queryWrapper);
}
}