谷粒商城实战笔记-45-商品服务-API-三级分类-查询-递归树形结构数据获取

文章目录

  • 一,准备工作
    • 1,启动虚拟机
    • 2,启动mysql
    • 3,执行MySQL脚本插入分类数据
    • 4,关于三级分类
  • 二,Controller层新增接口
  • 三,Service层新增接口
    • 1,代码实现
    • 2,测试

从这一节开始,开始接触与到实际工作非常相似的内容,前面学习到的都是基础知识,现在开始学习和积累工作经验。

这里要慎重提醒,请逐行敲代码,逐行敲代码,逐行敲代码。

在敲代码之前,先理解三级分类。

第一条工作经验就是:先理解业务,再敲代码。做不到这点,工作效率一定非常低。

本节的主要内容是开发产品模块的查询三级分类的接口。

一,准备工作

1,启动虚拟机

MySQL数据库安装在虚拟机的docker容器中,所以需要启动虚拟机和docker容器。

因为我们之前使用vagrant来管理虚拟机,使用如下命令就可以启动虚拟机了。

vagrant up

启动成功后使用如下命令连接虚拟机。

vagrant ssh

2,启动mysql

在前面的课程中,我们设置了MySQL容器的开机自启动,所以虚拟机启动后MySQL容器会自动启动,可以通过如下命令查看是否启动成功:

sudo docker ps

有如下输出,说明已经启动。

在这里插入图片描述

如果没有启动,可以执行如下命令。

sudo docker start mysql

3,执行MySQL脚本插入分类数据

在这里插入图片描述
执行成功后,会插入1425条数据。
在这里插入图片描述

4,关于三级分类

为了便于管理,谷粒商城的商品分类有三级,这是所有商城都有的特点。

“三级分类”特指商品分类的层级结构,即商品被分为一级分类、二级分类和三级分类三个层次,这样的设计有助于用户更清晰地找到他们感兴趣的商品类别。

以京东为例,三级分类如下。

在这里插入图片描述

三级菜单的结构如下:

  1. 一级分类:通常是较为广泛的类别,比如“电子产品”,“服装”,“家居用品”等。
  2. 二级分类:是在一级分类下的细分,比如在“电子产品”下面可能会有“手机”,“电脑”,“配件”等。
  3. 三级分类:是更为具体的商品类型,例如在“手机”下面可能有“智能手机”,“功能手机”,“翻盖手机”等。

在技术实现上,这种多级菜单可以通过数据库中带有父ID字段的表来实现,其中每个分类都有一个唯一的ID,而除了最顶层的分类外,每个分类都指向其父分类的ID。这样,通过递归查询数据库,可以构建出整个分类树。

二,Controller层新增接口

在模块Product中的CatogeryController新增接口。

在这里插入图片描述

 @RequestMapping("/list/tree")public R listTree(){List<CategoryEntity> categoryEntities = categoryService.listWithTree();return R.ok().put("data", categoryEntities);}

三,Service层新增接口

1,代码实现

Controller层调用了Serivce的listWithTree方法,这个方法需要在CategoryServiceImpl中实现。

 @Overridepublic List<CategoryEntity> listWithTree() {// 查询所有的分类信息,共1124条List<CategoryEntity> categoryEntities = baseMapper.selectList(null);// 查找一级分类,即parent_cid为0的分类List<CategoryEntity> roots = categoryEntities.stream().filter(e -> e.getParentCid() == 0).sorted(Comparator.comparingInt(e -> (e.getSort() == null ? 0 : e.getSort()))).collect(Collectors.toList());// 将分类组织为树形,即把父类的所有直接子分类存放到父类的children属性中roots.forEach(root->{List<CategoryEntity> children = getChildren(root, categoryEntities);root.setChildren(children);});return roots;}/*** 使用递归的方式把三级分类组织为树形数据结构* @param root* @param categoryEntities* @return*/private List<CategoryEntity> getChildren(CategoryEntity root, List<CategoryEntity> categoryEntities) {return categoryEntities.stream().filter(e-> e.getParentCid().equals(root.getCatId())).map(e->{List<CategoryEntity> childrenSub = getChildren(e, categoryEntities);e.setChildren(childrenSub);return e;}).sorted(Comparator.comparingInt(e -> (e.getSort() == null ? 0 : e.getSort()))).collect(Collectors.toList());}

此接口负责查询商城中所有商品分类信息,并将其组织成树形结构返回。通过递归算法处理,能够准确地展示商品分类的一级、二级和三级关系。

实现细节

  1. 查询所有分类信息

    • 使用baseMapper.selectList(null)方法从数据库中获取所有分类信息,无条件查询所有记录。
  2. 筛选一级分类

    • 利用Stream API过滤出所有parent_cid为0的分类,即一级分类。
    • 对结果进行排序,根据sort字段升序排列,若sort为空则默认为0。
  3. 构建树形结构

    • 遍历所有一级分类,调用getChildren方法递归地填充每一级分类的子分类列表至children属性。
  4. 递归获取子分类

    • getChildren方法接收一个父分类和所有分类列表作为参数。
    • 过滤出所有直接子分类,再次调用自身处理子分类的子分类,直至所有层级遍历完毕。
    • 最终对子分类列表进行排序,排序规则同上。

返回值

  • 返回一个List<CategoryEntity>,其中每个CategoryEntity对象的children属性包含其直接子分类的列表,从而形成完整的树形结构。

注意事项

  • 该实现依赖于CategoryEntity类的CatId, ParentCid, Sort等字段。
  • 数据库中的分类数据必须正确反映分类间的父子关系,否则树形结构无法正确构建。
  • getChildren方法中的递归调用需小心处理,避免无限循环或堆栈溢出。

性能考量

  • 大量数据查询可能会影响性能,考虑分页查询或缓存机制优化。
  • 递归处理在大数据集上可能导致性能瓶颈,应评估是否需要优化递归深度或采用非递归算法。

扩展性

  • 当商品分类层级增加时,递归函数应能够灵活适应,无需修改代码即可处理更多层级的分类结构。

2,测试

在浏览器中输入如下地址。

http://localhost:10000/product/category/list/tree

在浏览器控制查看结果。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1486339.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

实验二 FPGA使用Verilog HDL设计分频器

实验目的 掌握使用Vivado软件进行设计、综合、仿真、布线的方法。掌握FPGA程序的下载方法。掌握使用Verilog HDL设计分频器的方法。 实验要求 采用Verilog HDL语言设计分频器&#xff0c;实现以下功能&#xff1a; 输出时钟周期为1s的分频时钟信号&#xff1b;通过LED灯或数码…

15个在线地图瓦片URL分享

数据是GIS的血液&#xff0c;我们在《10个在线地图瓦片URL分享》一文中为你分享了10个地图瓦片URL链接&#xff0c;现在再为你分享5个在线的瓦片地图URL图源&#xff01; 该在线地图瓦片URL支持在GIS软件或开发平台进行调用&#xff0c;比如ArcGIS、QGIS、Global Mapper、Open…

PowerBI宝藏级资料分享推荐

有同学留言想学习PowerBI&#xff0c;求推荐可以免费学习的网站&#xff0c;最好是比较系统的&#xff0c;不要那种广告或诱导付费才能学习的网站。 这样的学习网站确实有&#xff0c;主打大家要求的免费。 推荐大家几个我一直私藏的宝藏级&#xff0c;学习和使用资料网站. …

《经典图论算法》贝尔曼-福特算法(Bellman-Ford)

摘要&#xff1a; 1&#xff0c;Bellman-Ford 算法的介绍 2&#xff0c;Bellman-Ford 算法为什么可以解决有负权边的图 3&#xff0c;Bellman-Ford 算法为什么不能解决有负权回路的图 4&#xff0c;Bellman-Ford 算法的代码实现和负权回路的判断 5&#xff0c;Bellman-Ford 算法…

测试——Selenium

内容大纲: 什么是自动化测试 什么是Selenium Selenium工作原理 Selenium环境搭建 Selenium API 目录 1. 什么是自动化测试 2. 什么是Selenium 3. Selenium工作原理 4. Selenium环境搭建(java) 5. Selenium API 5.1 定位元素 5.1.1 CSS选择器定位元素 5.1.2 XPath定位元…

# Redis 入门到精通(十一)-- 集群

Redis 入门到精通&#xff08;十一&#xff09;-- 集群 一、redis 集群 – 集群简介 1、现状问题&#xff1a;业务发展过程中遇到的峰值瓶颈 redis提供的服务OPS可以达到10万/秒&#xff0c;当前业务OPS已经达到10万/秒。内存单机容量达到256G&#xff0c;当前业务需求内存容…

【机器学习】模型验证曲线(Validation Curves)解析

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 模型验证曲线(Validation Curves)解析什么是模型验证曲线?模型验证曲线的解读模…

微信答题小程序产品研发-确定产品的定位

盛夏蝉鸣起&#xff0c;荷风香十里。我前面说过&#xff0c;我决意仿一款答题小程序&#xff0c;所以我做了大量的调研。 答题小程序软件产品开发不仅仅是写代码这一环&#xff0c;它包含从需求调研、分析与构思、设计到开发、测试再到部署上线一系列复杂过程。 在软件开发中…

增材制造与智能制造关系

在撰写的增材制造技术与装备书籍中有着明确的描述&#xff0c;增材制造是智能制造的典型范例&#xff0c;是智能制造“类”的实例化过程。这种借助于计算机编程面向对象思想的解释可以更全面的理解增材制造和智能制造的关系。增材制造实例具备了智能制造类的属性&#xff0c;智…

数据库中字符串连接符的使用

在数据库操作中&#xff0c;字符串处理是日常工作中不可或缺的一部分。无论是构建动态查询&#xff0c;还是处理数据输出&#xff0c;字符串连接符的使用都是至关重要的。那么&#xff0c;如何正确地使用字符串连接符&#xff0c;才能高效地进行字符串操作呢&#xff1f; 在数据…

网站安全-CDN篇

为了保证 CDN 不被恶意刷流量导致高额账单&#xff0c;可以对 CDN 做防护措施&#xff0c;或使用高防 CDN。 ‍ ‍ ‍ 普通 CDN 普通 CDN 受到恶意攻击&#xff0c;也是会计费的。目前国内大部分 CDN 厂商都是这样的套路&#xff1a;即使你的 CDN 流量用完了&#xff0c;还…

Pyside6绘制折线图并计算面积

Pyside6绘制折线图并计算面积 import sys import random from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QMainWindow from PySide6.QtCore import Qt, QRectF, QPointF, Signal from PySide6.QtGui import QPainter, QPen, QColor, QMouseEventclass P…

微服务分布式事务

1、分布式事务是什么&#xff1f; 微服务架构中的分布式事务是指在多个服务实例之间保持数据一致性的机制。由于微服务通常涉及将业务逻辑拆分成独立的服务&#xff0c;每个服务可能有自己的数据库&#xff0c;因此当一个业务操作需要跨多个服务进行时&#xff0c;确保所有服务…

【知识】PyTorch种两种CUDA时间测量的方法对比

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 在PyTorch中使用CUDA进行时间测量时&#xff0c;以下两者各有优缺点&#xff1a; torch.cuda.current_stream(self._device).synchronize() torch.cud…

泰迪智能科技携广州华商学院共讨产教融合,校企合作

7月19日&#xff0c;广州华商学院人工智能学院的领导及骨干教师一行莅临泰迪智能科技参观交流&#xff0c;广州华商学院人工智能学院院长助理杨本胜、院长助理洪绍勇、大数据系主任颜远海、金融数学系主任石金诚、人工智能系主任霍永良&#xff0c;以及骨干教师许丽娟、李志青、…

恐怖数字暗影:猜中才能逃离

大家可以看看这个&#xff0c;也很有意思&#xff01; 猜数字游戏&#xff08;老六版&#xff09;-CSDN博客 1、 剧情介绍 在一个阴暗潮湿的古堡中&#xff0c;你独自一人走进了一间散发着诡异气息的房间。房间的正中央有一张古老的桌子&#xff0c;上面放着一本泛黄的羊皮卷…

2024-07-22 Unity AI行为树1 —— 框架介绍

文章目录 1 行为树2 行为树驱动方式3 行为树结点分类3.1 控制节点3.2 执行节点 4 行为树与状态机比较 本文章参考 B 站唐老狮 2023年直播内容。 点击前往唐老狮 B 站主页。 1 行为树 ​ 行为树&#xff08;Behavior Tree&#xff0c;BT&#xff09;在游戏 AI 中是一种用于控制…

【git】git 提交修改报错 ERROR: do not set execute permissions for source files

目录 问题报错信息解决方法 问题 修改文件后&#xff0c;使用git 提交修改到gerrit时报错&#xff1a;ERROR: do not set execute permissions for source files 文件修改前 $ll deinterlace_mtn.c -rw-r--r-- 1 xxx users 31599 Jul 22 08:10 deinterlace_mtn.c文件修改后…

前端JS特效第49波:简洁时尚的jQuery和CSS3侧边栏菜单插件

简洁时尚的jQuery和CSS3侧边栏菜单插件&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" c…

mysql高阶语句:

mysql高阶语句&#xff1a; 高级语法的查询语句&#xff1a; select * from 表名 where limitsdistinct 去重查询like 模糊查询 排序语法&#xff1a;关键字排序 升序和降序 默认的排序方式就是升序 升序&#xff1a;ASC 配合order by语法 select * from 表名…