当前位置: 首页 > news >正文

P45 创建三级类目树形数据结构

1.三级类目实体类创建

catagory表的表结构,首先一级类目的parent_cid为0,二级类目以及三级类目的parent_cid为上一级的cat_id,sort字段用于排序.

catagory表对应的实体类:

package com.atguigu.gulimail.product.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.util.Date; import java.util.List; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; /** * 商品三级分类 * * @author bryan * @email bryanliu@gulimall.com * @date 2022-09-24 17:49:33 */ @Data @TableName("pms_category") public class CategoryEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 分类id */ @TableId private Long catId; /** * 分类名称 */ private String name; /** * 父分类id */ private Long parentCid; /** * 层级 */ private Integer catLevel; /** * 是否显示[0-不显示,1显示] */ @TableLogic(value = "1", delval = "0") private Integer showStatus; /** * 排序 */ private Integer sort; /** * 图标地址 */ private String icon; /** * 计量单位 */ private String productUnit; /** * 商品数量 */ private Integer productCount; @JsonInclude(JsonInclude.Include.NON_EMPTY) @TableField(exist = false) private List<CategoryEntity> children; }

注意:我们要保存每一类对应的子类,可以在 CategoryEntity 中新增一个属性 children 进行存放。

这里@TableField注解用来标识此属性不在数据库表中存在,防止 MyBatisPlus 集成的 mapper 误识。

2.三级类目查询后台代码实现

首先在 CategoryController 中编写处理请求的方法

/** * 查出所有分类以及子分类,以树形结构组装起来 */ @RequestMapping("/list/tree") public R list(){ List<CategoryEntity> entities = categoryService.listWithTree(); return R.ok().put("data", entities); }

categoryService中的listWithTree具体实现

@Override public List<CategoryEntity> listWithTree() { // 1. 查出所有类 List<CategoryEntity> entities = baseMapper.selectList(null); // 2. 组装成父子的树形结构 List<CategoryEntity> level1Menus = entities.stream().filter((categoryEntity) -> { return categoryEntity.getParentCid() == 0; }).map((menu)->{ menu.setChildren(getChildrens(menu, entities)); return menu; }).sorted((menu1, menu2)->{ // 会报空指针异常, 在此要进行处理 return (menu1.getSort() == null? 0:menu1.getSort()) - (menu2.getSort() == null? 0: menu2.getSort()); }).collect(Collectors.toList()); return level1Menus; } // 递归查找所有菜单的子菜单 private List<CategoryEntity> getChildrens(CategoryEntity root, List<CategoryEntity> all) { List<CategoryEntity> children = all.stream().filter(categoryEntity -> { return categoryEntity.getParentCid() == root.getCatId(); }).map(categoryEntity->{ // 1、找到子菜单 categoryEntity.setChildren(getChildrens(categoryEntity, all)); return categoryEntity; }).sorted((menu1, menu2)->{ // 2、菜单的排序 // 会报空指针异常, 在此要进行处理 return (menu1.getSort() == null? 0:menu1.getSort()) - (menu2.getSort() == null? 0: menu2.getSort()); }).collect(Collectors.toList()); return children; }
http://www.jsqmd.com/news/1112779/

相关文章:

  • Hive 的四表类型
  • 从API到Agent:万字长文洞悉LangChain工程化设计
  • 基础知识-ISO模型常见协议和每一层作用
  • 突破性Book118文档下载器:一站式免费获取完整PDF的终极方案
  • PostgreSQL 数据误删恢复技术指南
  • 网站关键词SEO排名是什么意思?
  • Claude Code 实战指南:AI 代码助手如何提升 Python Flask 开发效率
  • 酷安UWP桌面版:在Windows上畅享酷安社区的完整体验
  • Insta360 AI剪辑技术解析:从语义理解到智能成片
  • Honey Select 2专业增强套件:自动化翻译、去码与高级插件配置实战指南
  • 程序代码行数统计脚本
  • 【Linux】章11 管理网络安全(RH134知识点问答题)
  • 理论都会,实战就废?7个分析模板,帮你打通任督二脉
  • 机器学习模型生产部署:从服务化到漂移监控的四层实战体系
  • 三进制太玄经·八十一首(坤至乾·每行一卦·配原文)
  • 从Hello World到部署上线,ChatGPT辅助编程全流程拆解,含17个避坑清单与3个私藏Prompt模板
  • 2026年企业安全基建的误区、重构与最优解
  • 从0开始学AI Agent:设计一个coding agent,Java佬必看
  • 郴州火锅排行榜|客观实测,理性就餐选型指南
  • 开源AI创作工作台infinite-canvas:一站式可视化无限画布部署与使用指南
  • AutoRaise终极指南:3分钟实现macOS鼠标悬停自动激活窗口,提升300%工作效率
  • 推算术:中华传统阴阳数理思维的文化探析
  • AOT 的使用以及 .NET 与 Go 互相调用
  • 从对话到行动:基于LangChain构建AI Agent的实战指南
  • ASP.NET Core Kestrel服务器HTTPS配置与传输安全加固实战指南
  • apate文件伪装工具:如何在3秒内绕过格式限制的完整指南
  • 一文看懂PCIe 20年狂飙史与硬核避坑指南
  • 图片分类与对象识别
  • Orca ADE:多智能体并行编程,突破AI开发效率瓶颈
  • Java毕业设计-基于 SpringBoot 的社区康养管理系统的设计与实现 基于 SpringBoot 的社区老人康养综合中心管理系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)