当前位置:   article > 正文

【后端结合】新程序猿笔记Day15(商品分类实现)(京淘项目)_商品分类实现后端

商品分类实现后端

1. 商品分类实现

1.1 优化商品分类列表

1.1.1 优化策略

数据结构: Map<parentId, 当前父级下的子级>
例子:
Map<0, 所有的一级菜单>
Map<一级ID, 当前一级下的二级菜单>
Map<二级ID, 当前二级下的三级菜单>

设计的优势:
如果将数据保存到Map集合中,则可以有效的降低数据库的访问的次数. 提高查询效率.

 1.1.2 封装Map集合

  1. /**
  2. * 思路:
  3. * 1.判断map集合中是否存在key
  4. * 2.如果key 不存在 准备一个新list集合,将自己作为第一个元素添加
  5. * 3.如果key 存 在 获取list集合,将自己追加.
  6. * @return
  7. */
  8. public Map<Integer,List<ItemCat>> getMap(){
  9. Map<Integer,List<ItemCat>> map = new HashMap<>();
  10. //1.查询数据库的所有的记录
  11. List<ItemCat> list = itemCatMapper.selectList(null);
  12. for(ItemCat itemCat : list){
  13. int key = itemCat.getParentId();
  14. if(map.containsKey(key)){ //true 有数据
  15. map.get(key).add(itemCat);
  16. }else{ //false 没有数据
  17. List<ItemCat> childrenList = new ArrayList<>();
  18. childrenList.add(itemCat);
  19. map.put(key,childrenList);
  20. }
  21. }
  22. return map;
  23. }

通过图:理解Map集合的作用

1.1.3 商品分类列表实现完整代码 

  1. package com.jt.service;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.jt.mapper.ItemCatMapper;
  4. import com.jt.pojo.ItemCat;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11. @Service
  12. public class ItemCatServiceImpl implements ItemCatService{
  13. @Autowired
  14. private ItemCatMapper itemCatMapper;
  15. /**
  16. * 思路:
  17. * 1.判断map集合中是否存在key
  18. * 2.如果key 不存在 准备一个新list集合,将自己作为第一个元素添加
  19. * 3.如果key 存 在 获取list集合,将自己追加.
  20. * @return
  21. */
  22. public Map<Integer,List<ItemCat>> getMap(){
  23. Map<Integer,List<ItemCat>> map = new HashMap<>();
  24. //1.查询数据库的所有的记录
  25. List<ItemCat> list = itemCatMapper.selectList(null);
  26. for(ItemCat itemCat : list){
  27. int key = itemCat.getParentId();
  28. if(map.containsKey(key)){ //true 有数据 将自己追加
  29. map.get(key).add(itemCat);
  30. }else{ //false 没有数据 准备新集合,添加数据
  31. List<ItemCat> childrenList = new ArrayList<>();
  32. childrenList.add(itemCat);
  33. map.put(key,childrenList);
  34. }
  35. }
  36. return map;
  37. }
  38. //level 1/2/3
  39. @Override
  40. public List<ItemCat> findItemCatList(Integer level) {
  41. long startTime = System.currentTimeMillis();
  42. //1.获取数据信息
  43. Map<Integer,List<ItemCat>> map = getMap();
  44. if(level == 1){ //只获取一级菜单数据
  45. return map.get(0);
  46. }
  47. if(level == 2){ //获取1-2级数据
  48. return getTwoList(map);
  49. }
  50. List<ItemCat> list = getThreeList(map);
  51. long endTime = System.currentTimeMillis();
  52. System.out.println("业务执行耗时:"+(endTime - startTime)+"毫秒");
  53. //获取1-2-3级数据
  54. return list;
  55. }
  56. private List<ItemCat> getThreeList(Map<Integer, List<ItemCat>> map) {
  57. //1.获取一级和二级数据
  58. List<ItemCat> oneList = getTwoList(map);
  59. for (ItemCat oneItemCat : oneList){
  60. List<ItemCat> twoList = oneItemCat.getChildren();
  61. if(twoList == null){
  62. //说明 该一级下没有二级数据.所以跳过本次循环进入下一次
  63. continue;
  64. }
  65. for(ItemCat twoItemCat : twoList){
  66. //查询三级数据,使用二级的Id
  67. int key = twoItemCat.getId();
  68. List<ItemCat> threeList = map.get(key);
  69. twoItemCat.setChildren(threeList);
  70. }
  71. }
  72. return oneList;
  73. }
  74. //获取1-2
  75. private List<ItemCat> getTwoList(Map<Integer, List<ItemCat>> map) {
  76. //获取一级数据
  77. List<ItemCat> oneList = map.get(0);
  78. for(ItemCat oneItemCat : oneList){
  79. //根据一级ID查询二级集合
  80. int key = oneItemCat.getId();
  81. List<ItemCat> twoList = map.get(key);
  82. //将二级数据封装到一级中
  83. oneItemCat.setChildren(twoList);
  84. }
  85. return oneList;
  86. }
  87. /**
  88. * 只查询一级菜单 parent_id=0 或者 level=1
  89. * 查询二级菜单信息 parent_id = 一级ID
  90. * 查询三级菜单信息 parent_id = 二级ID
  91. * 思考: 如何优化代码 要求查询时间最好 控制在20ms+-
  92. * @param level
  93. * @return
  94. */
  95. /* @Override
  96. public List<ItemCat> findItemCatList(Integer level) {
  97. long startTime = System.currentTimeMillis();
  98. QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
  99. queryWrapper.eq("parent_id",0);
  100. List<ItemCat> oneList = itemCatMapper.selectList(queryWrapper);
  101. for (ItemCat oneItemCat : oneList){
  102. //获取一级对象的ID
  103. int oneId = oneItemCat.getId();
  104. //清空多余的条件
  105. queryWrapper.clear();
  106. //查询二级数据
  107. queryWrapper.eq("parent_id",oneId);
  108. List<ItemCat> twoList = itemCatMapper.selectList(queryWrapper);
  109. //获取3级菜单信息
  110. for(ItemCat twoItemCat : twoList){
  111. int twoId = twoItemCat.getId();
  112. queryWrapper.clear();
  113. queryWrapper.eq("parent_id",twoId);
  114. List<ItemCat> threeList = itemCatMapper.selectList(queryWrapper);
  115. //将三级数据封装到二级对象中
  116. twoItemCat.setChildren(threeList);
  117. }
  118. //将二级封装到一级对象中
  119. oneItemCat.setChildren(twoList);
  120. }
  121. long endTime = System.currentTimeMillis();
  122. System.out.println("业务调用耗时:"+(endTime - startTime)+"毫秒");
  123. return oneList;
  124. }*/
  125. }

1.2 商品分类新增

1.2.1 业务接口说明

  • 请求路径: /itemCat/saveItemCat
  • 请求类型: post
  • 请求参数: 表单数据
参数名称         参数说明备注
name商品分类名称不能为null        
parentId用户父级ID不能为null
level分类级别1 2 3 商品分类级别
  • 返回值: SysResult对象
参数名称         参数说明备注
status状态信息200表示服务器请求成功 201表示服务器异常
msg服务器返回的提示信息可以为null
data服务器返回的业务数据可以为null

1.2.2 前端页面URL请求 

1.页面请求

2.页面传递的JSON串 

1.2.3 编辑ItemCatController 

  1. /**
  2. * 业务需求:
  3. * 实现商品分类新增操作
  4. * url地址: /itemCat/saveItemCat
  5. * 参数: JSON串
  6. * 提交方式: post
  7. * 返回值: SysResult对象
  8. */
  9. @PostMapping("/saveItemCat")
  10. public SysResult saveItemCat(@RequestBody ItemCat itemCat){
  11. itemCatService.saveItemCat(itemCat);
  12. return SysResult.success();
  13. }

1.2.4 编辑ItemCatService

  1. /**
  2. * 有些数据应该提前填充 status/创建时间/修改时间
  3. * @param itemCat
  4. */
  5. @Override
  6. @Transactional //事务注解
  7. public void saveItemCat(ItemCat itemCat) {
  8. itemCat.setStatus(true)
  9. .setCreated(new Date())
  10. .setUpdated(itemCat.getCreated());
  11. itemCatMapper.insert(itemCat);
  12. }

1.3 数据自动填充 

1.3.1 官网介绍

1.3.2 编辑自动填充项 

1.3.3 配置自动填充功能 

说明: 在com.jt.config 中编辑配置类

  1. //将该类交给Spring容器管理
  2. @Component
  3. public class MyMetaObjectHandler implements MetaObjectHandler {
  4. @Override
  5. public void insertFill(MetaObject metaObject) {
  6. Date date = new Date();
  7. this.setFieldValByName("created",date,metaObject);
  8. this.setFieldValByName("updated",date,metaObject);
  9. }
  10. @Override
  11. public void updateFill(MetaObject metaObject) {
  12. this.setFieldValByName("updated",new Date(),metaObject);
  13. }
  14. }

1.4 商品分类删除

1.4.1 业务说明

当用户删除商品分类的时候,应该将它的子级数据全部删除.

  • 请求路径: /itemCat/deleteItemCat
  • 请求类型: delete
  • 业务描述: 当删除节点为父级时,应该删除自身和所有的子节点
  • 请求参数:
参数名称参数说明备注
id分类ID号不能为null
level商品分类级别 一级,二级,三级
  • 返回值结果 SysResult对象
参数名称参数说明备注
status状态信息200表示服务器请求成功 201表示服务器异常
msg服务器返回的提示信息可以为null
data服务器返回的业务数据可以为null

 1.4.2 编辑ItemCatController

  1. /**
  2. * 业务说明: 删除商品分类数据
  3. * URL地址: /itemCat/deleteItemCat
  4. * 参数: id/level
  5. * 返回值: SysResult对象
  6. */
  7. @DeleteMapping("/deleteItemCat")
  8. public SysResult deleteItemCat(ItemCat itemCat){
  9. itemCatService.deleteItemCat(itemCat);
  10. return SysResult.success();
  11. }

1.4.3 编辑ItemCatService 

  1. /**
  2. * 删除的思路:
  3. * 1.判断是否为3级 如果是直接删除
  4. * 2.判断是否为2级 如果是2级,先删除三级,再删除2级
  5. * 3.如果是1级,先查询2级,再删除3级/2级/1级
  6. * @param itemCat
  7. */
  8. @Override
  9. @Transactional
  10. public void deleteItemCat(ItemCat itemCat) {
  11. if(itemCat.getLevel() == 3){
  12. itemCatMapper.deleteById(itemCat.getId());
  13. return ;
  14. }
  15. if(itemCat.getLevel() == 2){
  16. int twoId = itemCat.getId();
  17. QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
  18. queryWrapper.eq("parent_id",twoId);
  19. //删除的是三级数据
  20. itemCatMapper.delete(queryWrapper);
  21. itemCatMapper.deleteById(twoId);
  22. return ;
  23. }
  24. //执行到这里 只剩下一级菜单
  25. //1.应该先查询二级id
  26. int oneId = itemCat.getId();
  27. QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
  28. queryWrapper.eq("parent_id",oneId);
  29. List twoIdList = itemCatMapper.selectObjs(queryWrapper);
  30. if(twoIdList.size() == 0){
  31. //如果没有二级数据,则直接删除一级信息
  32. itemCatMapper.deleteById(oneId);
  33. }else{
  34. //表示有二级,可以删除三级
  35. //思考: 如何快速删除 三级/二级/一级??
  36. //Sql: delete from item_cat where parent_id in (xx,xx,xx)
  37. // or id in (xxx,xxx,xx,oneId)
  38. queryWrapper.clear();
  39. queryWrapper.in("parent_id",twoIdList)
  40. .or()
  41. .in("id",twoIdList)
  42. .or()
  43. .eq("id",oneId);
  44. itemCatMapper.delete(queryWrapper);
  45. }
  46. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/247392?site
推荐阅读
相关标签
  

闽ICP备14008679号