通过上面两幅图,先带大家直观感受下分类模块大概是个啥,脑子里有个画面。
再来通过一个例子了解一下商品分类层级结构:
- 服装(Clothing)
- 男装(Men’s Clothing)
- 衬衫(Shirts)
- 裤子(Pants)
- 外套(Jackets)
- 女装(Women’s Clothing)
- 连衣裙(Dresses)
- 上衣(Tops)
- 裙子(Skirts)
- 男装(Men’s Clothing)
- 鞋类(Shoes)
- 男鞋(Men’s Shoes)
- 运动鞋(Athletic Shoes)
- 皮鞋(Dress Shoes)
- 女鞋(Women’s Shoes)
- 高跟鞋(High Heels)
- 平底鞋(Flats)
- 男鞋(Men’s Shoes)
在导航菜单中显示主分类(例如"服装"和"鞋类"),在各自的子菜单中显示子分类(例如"男装"和"女装")。
商品分类和垃圾分类区别不大。
了解完分类模块到底是什么后,我们应该想想如何设计分类模块的代码?我们还是从Dao层->service层->controller层这个开发顺序。
设计Dao层
package com.imooc.mall.dao;
import com.imooc.mall.pojo.Category;
import java.util.List;
public interface CategoryMapper {
int deleteByPrimaryKey(Integer id); //根据主键id删除对应的商品分类记录
int insert(Category record); //插入一条商品分类记录
int insertSelective(Category record); //选择性地插入一条商品分类记录,只插入非空字段
Category selectByPrimaryKey(Integer id); //根据主键id查询对应的商品分类记录
int updateByPrimaryKeySelective(Category record); //选择性地更新商品分类记录,只更新非空字段
int updateByPrimaryKey(Category record); //更新商品分类记录的所有字段
List<Category> selectAll(); //查询所有的商品分类记录,返回一个商品分类列表
}
上面的代码是一个名为CategoryMapper
的接口,它定义了对商品分类数据进行操作的方法。这些方法定义了对商品分类表的常见操作,包括插入、更新、删除和查询等。它们提供了对商品分类数据的基本访问功能,供其他组件(如服务层)使用。实际的数据操作逻辑需要在CategoryMapper
的实现类中进行实现。
关于这些方法的实现类真的很复杂,我的建议是了解一下就好,不算太重点,实现类其实就长这样:
Dao层设计好了我们接着来设计service层
设计service层
package com.imooc.mall.service;
import com.imooc.mall.vo.CategoryVo;
import com.imooc.mall.vo.ResponseVo;
import java.util.List;
import java.util.Set;
public interface ICategoryService {
ResponseVo<List<CategoryVo>> selectAll();
void findSubCategoryId(Integer id, Set<Integer> resultSet);
}
上面的代码是一个名为ICategoryService
的接口,它定义了商品分类相关的服务方法。
这些方法定义了商品分类服务的功能,主要用于查询和处理商品分类相关的业务逻辑。
selectAll()
方法用于获取所有商品分类的信息,而findSubCategoryId()
方法用于查找指定分类下的所有子分类的主键id。这些方法可以被其他组件(如控制器层)调用,以实现具体的业务需求。
这里只提供了接口定义,并没有给出具体的实现逻辑。实际的业务逻辑需要在ICategoryService
的实现类中进行编写。我们接下来就讲讲怎么编写这些实现类。
package com.imooc.mall.service.impl;
import com.imooc.mall.dao.CategoryMapper;
import com.imooc.mall.pojo.Category;
import com.imooc.mall.service.ICategoryService;
import com.imooc.mall.vo.CategoryVo;
import com.imooc.mall.vo.ResponseVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import static com.imooc.mall.consts.MallConst.ROOT_PARENT_ID;
@Service
public class CategoryServiceImpl implements ICategoryService {
@Autowired
private CategoryMapper categoryMapper;
/**
* 耗时:http(请求微信api) > 磁盘 > 内存
* mysql(内网+磁盘)
* @return
*/
@Override
public ResponseVo<List<CategoryVo>> selectAll() {
List<Category> categories = categoryMapper.selectAll();
//查出parent_id=0
// for (Category category : categories) {
// if (category.getParentId().equals(ROOT_PARENT_ID)) {
// CategoryVo categoryVo = new CategoryVo();
// BeanUtils.copyProperties(category, categoryVo);
// categoryVoList.add(categoryVo);
// }
// }
//lambda + stream
List<CategoryVo> categoryVoList = categories.stream()
.filter(e -> e.getParentId().equals(ROOT_PARENT_ID))
.map(this::category2CategoryVo)
.sorted(Comparator.comparing(CategoryVo::getSortOrder).reversed())
.collect(Collectors.toList());
//查询子目录
findSubCategory(categoryVoList, categories);
return ResponseVo.success(categoryVoList);
}
@Override
![img](https://img-blog.csdnimg.cn/img_convert/371fc32f816a7942abb9f7844111161b.png)
![img](https://img-blog.csdnimg.cn/img_convert/afcac522f97d2e0093eaf868e0898184.png)
![img](https://img-blog.csdnimg.cn/img_convert/0713f7b75c74ec998828c4218bd28c36.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**