1. 商品分类实现

1.1 优化商品分类列表

1.1.1 优化策略

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

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

1.1.2 封装Map集合

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

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

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

package com.jt.service;​import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.jt.mapper.ItemCatMapper;import com.jt.pojo.ItemCat;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;​import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;​@Servicepublic class ItemCatServiceImpl implements ItemCatService{​@Autowiredprivate ItemCatMapper itemCatMapper;​/*** 思路:*      1.判断map集合中是否存在key*      2.如果key 不存在 准备一个新list集合,将自己作为第一个元素添加*      3.如果key 存 在  获取list集合,将自己追加.* @return*/public Map<Integer,List<ItemCat>> getMap(){Map<Integer,List<ItemCat>> map = new HashMap<>();//1.查询数据库的所有的记录List<ItemCat> list = itemCatMapper.selectList(null);for(ItemCat itemCat : list){int key = itemCat.getParentId();if(map.containsKey(key)){ //true 有数据 将自己追加map.get(key).add(itemCat);}else{  //false 没有数据  准备新集合,添加数据List<ItemCat> childrenList = new ArrayList<>();childrenList.add(itemCat);map.put(key,childrenList);}}return map;}​//level 1/2/3@Overridepublic List<ItemCat> findItemCatList(Integer level) {long startTime = System.currentTimeMillis();//1.获取数据信息Map<Integer,List<ItemCat>> map = getMap();if(level == 1){ //只获取一级菜单数据return map.get(0);}​if(level == 2){ //获取1-2级数据return getTwoList(map);}​List<ItemCat> list = getThreeList(map);long endTime = System.currentTimeMillis();System.out.println("业务执行耗时:"+(endTime - startTime)+"毫秒");//获取1-2-3级数据return list;}​private List<ItemCat> getThreeList(Map<Integer, List<ItemCat>> map) {//1.获取一级和二级数据List<ItemCat> oneList = getTwoList(map);for (ItemCat oneItemCat : oneList){List<ItemCat> twoList = oneItemCat.getChildren();if(twoList == null){//说明 该一级下没有二级数据.所以跳过本次循环进入下一次continue;}for(ItemCat twoItemCat : twoList){//查询三级数据,使用二级的Idint key = twoItemCat.getId();List<ItemCat> threeList = map.get(key);twoItemCat.setChildren(threeList);}}return oneList;}​//获取1-2private List<ItemCat> getTwoList(Map<Integer, List<ItemCat>> map) {//获取一级数据List<ItemCat> oneList = map.get(0);for(ItemCat oneItemCat : oneList){//根据一级ID查询二级集合int key = oneItemCat.getId();List<ItemCat> twoList = map.get(key);//将二级数据封装到一级中oneItemCat.setChildren(twoList);}return oneList;}​​/*** 只查询一级菜单  parent_id=0 或者 level=1* 查询二级菜单信息 parent_id = 一级ID* 查询三级菜单信息 parent_id = 二级ID* 思考: 如何优化代码   要求查询时间最好 控制在20ms+-* @param level* @return*//* @Overridepublic List<ItemCat> findItemCatList(Integer level) {long startTime = System.currentTimeMillis();QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();queryWrapper.eq("parent_id",0);List<ItemCat> oneList = itemCatMapper.selectList(queryWrapper);for (ItemCat oneItemCat : oneList){//获取一级对象的IDint oneId = oneItemCat.getId();//清空多余的条件queryWrapper.clear();//查询二级数据queryWrapper.eq("parent_id",oneId);List<ItemCat> twoList = itemCatMapper.selectList(queryWrapper);//获取3级菜单信息for(ItemCat twoItemCat : twoList){int twoId = twoItemCat.getId();queryWrapper.clear();queryWrapper.eq("parent_id",twoId);List<ItemCat> threeList = itemCatMapper.selectList(queryWrapper);//将三级数据封装到二级对象中twoItemCat.setChildren(threeList);}//将二级封装到一级对象中oneItemCat.setChildren(twoList);}long endTime = System.currentTimeMillis();System.out.println("业务调用耗时:"+(endTime - startTime)+"毫秒");return oneList;}*/}

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

 /*** 业务需求:*   实现商品分类新增操作*   url地址: /itemCat/saveItemCat*   参数:    JSON串*   提交方式: post*   返回值:  SysResult对象*/@PostMapping("/saveItemCat")public SysResult saveItemCat(@RequestBody ItemCat itemCat){​itemCatService.saveItemCat(itemCat);return SysResult.success();}

1.2.4 编辑ItemCatService

/*** 有些数据应该提前填充 status/创建时间/修改时间* @param itemCat*/@Override@Transactional  //事务注解public void saveItemCat(ItemCat itemCat) {itemCat.setStatus(true).setCreated(new Date()).setUpdated(itemCat.getCreated());itemCatMapper.insert(itemCat);}

1.3 数据自动填充

1.3.1 官网介绍 (mybatis_plus)

1.3.2 编辑自动填充项

1.3.3 配置自动填充功能

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

//将该类交给Spring容器管理@Componentpublic class MyMetaObjectHandler implements MetaObjectHandler {​@Overridepublic void insertFill(MetaObject metaObject) {Date date = new Date();this.setFieldValByName("created",date,metaObject);this.setFieldValByName("updated",date,metaObject);}​@Overridepublic void updateFill(MetaObject metaObject) {this.setFieldValByName("updated",new Date(),metaObject);}}

1.4 商品分类删除

1.4.1 业务说明

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

  • 请求路径: /itemCat/deleteItemCat

  • 请求类型: delete

  • 业务描述: 当删除节点为父级时,应该删除自身和所有的子节点

  • 请求参数:

参数名称 参数说明 备注
id 分类ID号 不能为null
level 商品分类级别 一级,二级,三级
  • 返回值结果 SysResult对象

参数名称 参数说明 备注
status 状态信息 200表示服务器请求成功 201表示服务器异常
msg 服务器返回的提示信息 可以为null
data 服务器返回的业务数据 可以为null

1.4.2 编辑ItemCatController

/*** 业务说明: 删除商品分类数据* URL地址: /itemCat/deleteItemCat* 参数:    id/level* 返回值:  SysResult对象*/@DeleteMapping("/deleteItemCat")public SysResult deleteItemCat(ItemCat itemCat){​itemCatService.deleteItemCat(itemCat);return SysResult.success();}

1.4.3 编辑ItemCatService

/*** 删除的思路:*      1.判断是否为3级  如果是直接删除*      2.判断是否为2级  如果是2级,先删除三级,再删除2级*      3.如果是1级,先查询2级,再删除3级/2级/1级* @param itemCat*/@Override@Transactionalpublic void deleteItemCat(ItemCat itemCat) {if(itemCat.getLevel() == 3){itemCatMapper.deleteById(itemCat.getId());return ;}​if(itemCat.getLevel() == 2){int twoId = itemCat.getId();QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();queryWrapper.eq("parent_id",twoId);//删除的是三级数据itemCatMapper.delete(queryWrapper);itemCatMapper.deleteById(twoId);return ;}​//执行到这里 只剩下一级菜单//1.应该先查询二级idint oneId = itemCat.getId();QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();queryWrapper.eq("parent_id",oneId);List twoIdList = itemCatMapper.selectObjs(queryWrapper);if(twoIdList.size() == 0){//如果没有二级数据,则直接删除一级信息itemCatMapper.deleteById(oneId);}else{//表示有二级,可以删除三级//思考: 如何快速删除 三级/二级/一级??//Sql: delete from item_cat where parent_id in (xx,xx,xx)//     or id in (xxx,xxx,xx,oneId)queryWrapper.clear();queryWrapper.in("parent_id",twoIdList).or().in("id",twoIdList).or().eq("id",oneId);itemCatMapper.delete(queryWrapper);}}

15. 商品分类实现相关推荐

  1. python教程吾爱破解_2020年最新python入门到精通教程

    2020年最新python入门到精通教程 资源共享吧良心论坛,一直用心为每位会员服务,希望大家能学有所成,今天为大家分享一套2020年最新python入门到精通教程,如果你是0基础想学习python这 ...

  2. 视频教程-最新完整react教程从入门到精通包教包会-ReactJS

    最新完整react教程从入门到精通包教包会 10年以上开发经验,曾经是八维教育实训主任,千峰教育高级HTML5前端讲师,尚品中国创始人.现任程序思维创始人.曾和大厂.国企等大型企业合作开发项目.百余客 ...

  3. 视频教程-新React+VUE前端教程入门到精通-Vue

    新React+VUE前端教程入门到精通 10年以上开发经验,曾经是八维教育实训主任,千峰教育高级HTML5前端讲师,尚品中国创始人.现任程序思维创始人.曾和大厂.国企等大型企业合作开发项目.百余客户, ...

  4. 视频教程-Python框架Djanggo从入门到实战教程(企业级项目实战)-Python

    Python框架Djanggo从入门到实战教程(企业级项目实战) 多年web开发经验,精通HTML.CSS.JavaScript.HTML5.CSS3等Web前端开发技术,技术纯熟,项目经验丰富.授课 ...

  5. geotools学习(五)影像

    影像应用 前面的示例中,我们研究了读取和显示shapefile.对于ImageLab.java,我们将通过显示一个三波段的全球卫星图像,并将其与shapefile中的国家边界叠加,从而将栅格数据添加到 ...

  6. geotools学习(七)地图样式

    样式 请确保您的pom.xml包含以下内容: <dependencies><dependency><groupId>org.geotools</groupId ...

  7. 前端学习(2002)vue之电商管理系统电商系统之绘制商品分类的级联选择器

    目录结构 router.js import Vue from 'vue' import Router from 'vue-router' import Login from './components ...

  8. 前端学习(2001)vue之电商管理系统电商系统之获取商品分类数据

    目录结构 router.js import Vue from 'vue' import Router from 'vue-router' import Login from './components ...

  9. 前端学习(1962)vue之电商管理系统电商系统之渲染商品分类的选择框

    目录结构 router.js import Vue from 'vue' import Router from 'vue-router' import Login from './components ...

最新文章

  1. 谈谈服务雪崩、降级与熔断
  2. 微软软件测试的可借鉴之处
  3. -bash: fg: no job control -bash: /usr/java/jdk1.8.0_221-amd64/jre/bin: Is a directory
  4. typedef的用途
  5. 今天写的上传类,纯练手之作,供新人学习
  6. Warning: POST Content-Length of 29328854 bytes exceeds the limit of 8388608 bytes in Unknown on line
  7. 什么是eager loading
  8. 重庆大学微型计算机基础实验,计控课程方案设计书.doc
  9. Leetcode108. 有序数组转为二叉树
  10. 解决Cuda out of memory的一种思路
  11. 使用VProtect给自己开发的软件加密
  12. WEP 加密的工作原理和安全缺陷
  13. 微信发朋友圈的测试用例
  14. IPv6报头与IPv4报头的区别
  15. android手机iPhone对比,iPhone 6与Android旗舰手机的身材大对比
  16. MMDetection3d对KITT数据集的训练与评估介绍
  17. django学习问题及解决方法
  18. Java大数据培训学校全套教程-AJAX(27)-马克-专题视频课程
  19. esp8266之Arduino的mqtt客户端远程继电器控制,断电重连、断网重连,断mqtt服务器重连
  20. 对ROS功能包中package.xml文件的疑问

热门文章

  1. WordPress ripro日主题配套百度小程序
  2. 单端(Single-Ended)模式与差分(Differential)模式的区别
  3. ubuntu 安装repo
  4. 信息安全数学基础知识点学习笔记(一)
  5. html text-indent,css之text-indent
  6. text-indent html,css text-indent属性怎么用
  7. SPSS数据分析网络游戏行业应用范例
  8. 电商购物网站(登陆注册购物车详情页等)(仿jd)
  9. 使用代理ip防止爬虫被封ip(附蘑菇代理开发过程)
  10. 银行数字化转型导师坚鹏:平安银行数字化转型—橙E网战略研究