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

news2024/11/15 11:32:28

文章目录

  • 一,准备工作
    • 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中实现。

 @Override
    public 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.coloradmin.cn/o/1942570.html

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

相关文章

海康威视综合安防管理平台 detection 前台RCE漏洞复现

0x01 产品简介 海康威视综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通、停车场、报警检测等系统的设备。海康威视集成化综合管理软件平台,可以对接入的视频监控点集中管理,实现统一部署、统一配置、统一管理和统一调度。 0x02 漏洞概述 海康…

Stateflow中的状态转换表

状态转换表是表达顺序模态逻辑的另一种方式。不要在Stateflow图表中以图形方式绘制状态和转换&#xff0c;而是使用状态转换表以表格格式表示模态逻辑。 使用状态转换表的好处包括&#xff1a; 易于对类列车状态机进行建模&#xff0c;其中模态逻辑涉及从一个状态到其邻居的转换…

【Axure高保真原型】批量增加标签——中继器版

今天和大家分享批量增加标签——中继器版的原型模板&#xff0c;效果包括&#xff1a; 添加标签&#xff1a;在输入框了输入需要添加的标签信息&#xff0c;点击添加标签按钮或者按键盘回车键可以动态添加该标签 批量添加&#xff1a;可以一次性添加多个标签&#xff0c;在输入…

15现代循环神经网络—GRU与LSTM

目录 1.门控循环单元 GRU关注一个序列门候选隐状态(candidate hidden state)隐状态总结从零开始代码实现代码简洁实现2.长短期记忆网络 LSTM门候选记忆单元(candidate memory cell)记忆单元隐状态代码1.门控循环单元 GRU GRU 是最近几年提出来的,在 LSTM 之后,是一个稍微简…

FastAPI(六十六)实战开发《在线课程学习系统》接口开发--用户注册接口开发

源码见"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 在前面我们分析了接口的设计&#xff0c;那么我们接下来做接口的开发。 首先&#xff0c;我们先设计下pydantic用户参数的校验&#xff1a; """…

2024-07-20 Unity插件 Odin Serializer2 —— 序列化教程

文章目录 1 由根对象决定序列化2 实现 Odin 序列化器2.1 继承已有序列化类2.2 自定义序列化类 3 避免 Unity 无限深度警告4 指定序列化秘钥4.1 External String Reference Resolver4.2 External GUID Reference Resolver4.3 External Index Reference Resolver 4 功能与限制4.1…

物联网在电力行业的应用

作者主页: 知孤云出岫 这里写目录标题 作者主页:物联网在电力行业的应用简介主要应用领域代码案例分析1. 智能电表数据采集和分析2. 设备监控和预测性维护3. 能耗管理和优化4. 电力负载预测5. 分布式能源管理6. 电动汽车充电管理7. 电网安全与故障检测 物联网在电力行业的应用…

vue3-video-play 导入 以及解决报错

npm install vue3-video-play --save # 或者 yarn add vue3-video-play import Vue3VideoPlay from vue3-video-play; import vue3-video-play/dist/style.css; app.use(Vue3VideoPlay) <template><div id"main-container-part"><div class"al…

基于Qt的上位机通用框架

0.前言 最近一年多的时间一直在开发设备控制相关的软件&#xff0c;加上之前在聚光的两年时间&#xff0c;前前后后开发这种设备控制类型的上位机软件也有三年的时间了。总结出了一套基于Qt的上位机编程框架&#xff0c;核心思想类似于C#的依赖注入&#xff0c;对象的初始化都…

【启明智显分享】甲醛检测仪HMI方案:ESP32-S3方案4.3寸触摸串口屏,RS485、WIFI/蓝牙可选

今年&#xff0c;“串串房”一词频繁引发广大网友关注。“串串房”&#xff0c;也被称为“陷阱房”“贩子房”——炒房客以低价收购旧房子或者毛坯房&#xff0c;用极度节省成本的方式对房子进行装修&#xff0c;之后作为精修房高价租售&#xff0c;因甲醛等有害物质含量极高&a…

[Python库](5) rich库

作者制作不易&#xff0c;关注、点赞、收藏一下吧&#xff01; 目录 1.rich库简介 2.下载并导入rich库 2.1.下载 2.2.导入 3.使用 3.1.输出表情包 3.2.文本的样式 3.3.表格 3.4.日志 1.rich库简介 Rich 是一个 Python 库&#xff0c;用于在终端中添加丰富的文本&…

月影护眼大路灯怎么样?书客|月影|霍尼韦尔超硬核实力性能测评pk!

月影护眼大路灯怎么样&#xff1f;选到专业优质的护眼大路灯是真的可以使我们在用眼时减少疲劳感&#xff0c;达到护眼效果&#xff0c;但如果不慎买到劣质的护眼灯产品&#xff0c;不仅达不到健康的环境光&#xff0c;还越用越觉得眼睛疲劳感加重&#xff0c;在水深的护眼灯市…

数学建模(7)——Logistic模型

一、马尔萨斯人口模型 import numpy as np import matplotlib.pyplot as plt# 初始人口 N0 100 # 人口增长率 r 0.02 # 时间段&#xff08;年&#xff09; t np.linspace(0, 200, 200)# 马尔萨斯人口模型 N N0 * np.exp(r * t)# 绘图 plt.plot(t, N, labelPopulation) plt.…

适用于 Mac 或 MacBook 的最佳数据恢复软件

Apple 设计的电脑可靠且用户友好&#xff0c;但即使是最好的最新款 MacBook硬件也会出现故障。当您的存储出现问题时&#xff0c;数据恢复软件可以帮助您恢复丢失和损坏的文件。 数据丢失的另一个原因是有时会发生令人尴尬的错误。如果您不小心丢弃了所需的文件&#xff0c;然…

《智能物联技术》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《智能物联技术》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《智能物联技术》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;中国电子科技集团公司 主办单位&#xff1a;…

微软的Edge浏览器如何设置兼容模式

微软的Edge浏览器如何设置兼容模式&#xff1f; Microsoft Edge 在浏览部分网站的时候&#xff0c;会被标记为不兼容&#xff0c;会有此网站需要Internet Explorer的提示&#xff0c;虽然可以手动点击在 Microsoft Edge 中继续浏览&#xff0c;但是操作起来相对复杂&#xff0c…

LeetCode 125.验证回文串 C++写法

LeetCode 125.验证回文串 C写法 思路&#x1f914;&#xff1a; 我们不对字符串进行删除&#xff0c;这样效率太低了&#xff0c;所以可以左右开工&#xff0c;下标begin和end遇到不是字母数字字符的就跳过&#xff0c;当两边都是字母就进行比对&#xff0c;一样就继续往后走&a…

ubuntu本地部署llama3大模型

安装大模型 首先需要安装curl&#xff1a; sudo apt install curl 然后安装 ollama&#xff0c;可以去ollama.com复制下载命令&#xff1a; curl -fsSL https://ollama.com/install.sh | sh 然后就是启动ollama服务&#xff1a; ollama serve 出现这个说明已经运行&#xff0c…

PyTorch手写体数字识别实例

MNIST数据集的准备 “HelloWorld”是所有编程语言入门的基础程序&#xff0c;在开始编程学习时&#xff0c;我们打印的第一句话通常就是这个“HelloWorld”。本书也不例外&#xff0c;在深度学习编程中也有其特有的“HelloWorld”&#xff0c;一般就是采用MNIST完成一项特定的…

Java二十三种设计模式-代理模式模式(8/23)

代理模式&#xff1a;为对象访问提供灵活的控制 引言 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供一个代替或占位符&#xff0c;以控制对它的访问。 基础知识&#xff0c;java设计模式总体来说设计模式分为三大类&#…