最终效果

image.png

数据库表设计

image.png
在商品表中添加所属一级分类字段,少了冗余,避免需要多次查询一级分类下的子分类来获取商品信息

实现懒加载

前端监听滚动条触底,当距离底部一定距离时,向后端发送请求加载下一条主分类下的6条最新商品信息并展示

1、编写SQL查询

  1. SELECT
  2. f.id AS rootCatId,
  3. f.`name` AS rootCatName,
  4. f.slogan AS slogan,
  5. f.cat_image AS catImage,
  6. f.bg_color AS bgColor,
  7. i.id AS itemId,
  8. i.item_name AS itemName,
  9. ii.url AS itemUrl,
  10. i.created_time AS createdTime
  11. FROM
  12. category f #分类表
  13. LEFT JOIN
  14. items i #分类表关联商品表,用于找对于一级分类下的商品
  15. ON
  16. f.id = i.root_cat_id
  17. LEFT JOIN
  18. items_img ii #商品表关联商品图片表,用于找商品主图
  19. ON
  20. i.id = ii.item_id
  21. WHERE
  22. f.type = 1 #type = 1表示该分类是一级分类
  23. AND
  24. i.root_cat_id = 7 #商品对于的一级分类id
  25. AND
  26. ii.is_main = 1 #商品图片is_main = 1 表示该图片为商品主图
  27. ORDER BY
  28. i.created_time
  29. DESC
  30. LIMIT 0,6

image.png

2、分析创建VO

根据查询我们看到分类信息都是一样的,所以我们需要创建一个分类VO,在分类VO下包含6条最新商品的VO List信息。
给出前端信息如下:

  1. "data": [
  2. {
  3. "rootCatId": 4, // ==================== 一级分类 ====================
  4. "rootCatName": "素食/卤味",
  5. "slogan": "香辣甜辣麻辣,辣了才有味",
  6. "catImage": "http://122.152.205.72:88/foodie/category/duck.png",
  7. "bgColor": "#82ceff",
  8. "simpleItemList": [ // 👇👇👇👇👇👇👇👇一级分类下的商品信息👇👇👇👇👇👇👇👇
  9. {
  10. "itemId": "snacks-1005",
  11. "itemName": "【天天吃货】农家乐农家菜 香喷喷野生笋干",
  12. "itemUrl": "http://122.152.205.72:88/foodie/snacks-1005/img1.png",
  13. "createdTime": "2019-09-09 14:45:34"
  14. },
  15. {
  16. "itemId": "snacks-1002",
  17. "itemName": "【天天吃货】武汉鸭胗 卤味齐全 香辣麻辣",
  18. "itemUrl": "http://122.152.205.72:88/foodie/snacks-1002/img1.png",
  19. "createdTime": "2019-09-09 14:45:34"
  20. }
  21. //... // 👆👆👆👆👆👆👆一级分类下的商品信息👆👆👆👆👆👆👆
  22. ]
  23. }
  24. ]

创建分类NewItemsVO

  1. package com.shiers.pojo.vo;
  2. import java.util.List;
  3. /**
  4. * 最新商品VO
  5. *
  6. * @author shierS
  7. * @date 2021/5/29
  8. */
  9. public class NewItemsVO {
  10. private Integer rootCatId;
  11. private String rootCatName;
  12. private String slogan;
  13. private String catImage;
  14. private String bgColor;
  15. private List<SimpleItemVO> simpleItemList; //👈👈👈分类下的商品信息
  16. //省略get、set方法
  17. }

创建商品SimpleItemVO

  1. package com.shiers.pojo.vo;
  2. /**
  3. * 6个最新商品的简单数据类型
  4. *
  5. * @author shierS
  6. * @date 2021/5/30
  7. */
  8. public class SimpleItemVO {
  9. private String itemId;
  10. private String itemName;
  11. private String itemUrl;
  12. private String createdTime;
  13. //省略get、set方法
  14. }

3、编写mapper

  1. <resultMap id="myNewItemsVO" type="com.shiers.pojo.vo.NewItemsVO">
  2. <id column="rootCatId" property="rootCatId"/>
  3. <result column="rootCatName" property="rootCatName"/>
  4. <result column="slogan" property="slogan"/>
  5. <result column="catImage" property="catImage"/>
  6. <result column="bgColor" property="bgColor"/>
  7. <!--
  8. collection 标签:用于定义关联的lsit集合类型的封装规则
  9. property:对应三级分类的list属性名
  10. ofType:集合的类型,三级分类vo
  11. -->
  12. <collection property="simpleItemList" ofType="com.shiers.pojo.vo.SimpleItemVO">
  13. <id column="itemId" property="itemId"/>
  14. <result column="itemName" property="itemName"/>
  15. <result column="itemUrl" property="itemUrl"/>
  16. <result column="createdTime" property="createdTime"/>
  17. </collection>
  18. </resultMap>
  19. <select id="getSixNewItemsLazy" resultMap="myNewItemsVO" parameterType="Map">
  20. SELECT f.id AS rootCatId,
  21. f.`name` AS rootCatName,
  22. f.slogan AS slogan,
  23. f.cat_image AS catImage,
  24. f.bg_color AS bgColor,
  25. i.id AS itemId,
  26. i.item_name AS itemName,
  27. ii.url AS itemUrl,
  28. i.created_time AS createdTime
  29. FROM
  30. category f
  31. LEFT JOIN items i ON f.id = i.root_cat_id
  32. LEFT JOIN items_img ii ON i.id = ii.item_id
  33. WHERE
  34. f.type = 1
  35. AND
  36. i.root_cat_id = #{paramsMap.rootCatId}
  37. AND
  38. ii.is_main = 1
  39. ORDER BY
  40. i.created_time
  41. DESC
  42. LIMIT 0,6
  43. </select>

4、编写service

  1. @Transactional(propagation = Propagation.SUPPORTS)
  2. @Override
  3. public List<NewItemsVO> getSixNewItemsLazy(Integer rootCatId) {
  4. Map<String, Object> map = new HashMap<>(); //使用map来存放rootCatId
  5. map.put("rootCatId",rootCatId);
  6. return categoryMapperCustom.getSixNewItemsLazy(map);
  7. }

5、编写Controller

  1. @ApiOperation(value = "查询首页每个一级分类下的6条商品数据", notes = "查询首页每个一级分类下的6条商品数据", httpMethod = "GET")
  2. @GetMapping("/sixNewItems/{rootCatId}")
  3. public MyJSONResult sixNewItems(
  4. @ApiParam(name = "rootCatId", value = "一级分类id", required = true)
  5. @PathVariable Integer rootCatId) {
  6. if (rootCatId == null) {
  7. return MyJSONResult.errorMsg("分类不存在");
  8. }
  9. List<NewItemsVO> list = categoryService.getSixNewItemsLazy(rootCatId);
  10. return MyJSONResult.ok(list);
  11. }