谷粒商城-商品服务三级分类功能·-后端代码

news2025/1/24 4:55:21

在这里插入图片描述

递归获取树形结构

CategoryController

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

CategoryServiceImpl
第一步: 1.查出所有分类
第二步:2.组装成父子的树形结构

使用Java Streams和递归实现代码,递归体现递归获取每个分类的子分类。Streams将数据视为数据流,可以对数据进行filter, map, sorted, collect等操作
filter:对数据进行过滤可加过滤条件 返回新的stream
map:map对数据进行映射 映射后数量不变 返回新的stream
sorted :对Stream中的元素进行排序 可加排序条件
collect:将结果收集到一个新的容器中

/**
     * 1.查出所有分类
     * 2.组装成父子的树形结构
     * @return
     */
    @Override
    public List<CategoryEntity> listWithTree() {
        //1.查出所有分类
        List<CategoryEntity>entities =baseMapper.selectList(null);
        //2.组装成父子的树形结构
        //1)找到所有一级分类
        //什么是Streams
        List<CategoryEntity> level1Meaus=entities.stream().filter((categoryEntity)->{
            return categoryEntity.getParentCid()==0;
        }).map((meau)-> {
            meau.setChildren(getChildrens(meau,entities));
            return meau;
        }).sorted((meau1,meau2)->{
            //菜单排序
            return (meau1.getSort()==null?0:meau1.getSort())-(meau2.getSort()==null?0:meau2.getSort());
        }).collect(Collectors.toList());
        return level1Meaus;
    }


    //递归获取每一个菜单的子菜单

    /**
     *
     * @param root 当前分类
     * @param all 所有分类
     */
    private List<CategoryEntity> getChildrens(CategoryEntity root,List<CategoryEntity> all){
        List<CategoryEntity> children =all.stream().filter(categoryEntity->{
            //分类的父id等于当前id
            return categoryEntity.getParentCid()== root.getCatId();
        }).map(categoryEntity->{
            //递归找子菜单
            categoryEntity.setChildren(getChildrens(categoryEntity,all));
            return categoryEntity;
        }).sorted((meau1,meau2)->{
            //菜单排序
            return (meau1.getSort()==null?0:meau1.getSort())-(meau2.getSort()==null?0:meau2.getSort());
        }).collect(Collectors.toList());
        return children;
    }

配置网关

将请求发送至网关 由网关转发给其他服务
前端配置
更改主页请求发送地址

  window.SITE_CONFIG['baseUrl'] = 'http://localhost:88/api';

将管理模块注册到注册中心
管理模块配置

  application:
    name: renren-fast
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

网关配置

//商品
- id: product_route
          uri: lb://guliproduct
          predicates:
            - Path=/api/guliproduct/**
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment}
//主页
- id: admin_route
          uri: lb://renren-fast
          predicates:
            - Path=/api/** //指定路径的请求转给网关
          filters:
            - RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}

解决跨域问题

前端向后端请求数据由于前后端端口号不同存在跨域问题
解决方法:在网关模块中配置跨域

@Configuration
public class GulimallCorsConfiguration {
    @Bean
    public CorsWebFilter corsWebFilter(){
        UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration =new CorsConfiguration();
        //1.配置跨域
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.setAllowCredentials(true);
        source.registerCorsConfiguration("/**",corsConfiguration);
        return new CorsWebFilter(source);
    }
}

在前端通过路径请求即可

菜单删除

批量删除

 @Override
    public void removeMeauByIds(List<Long> asList) {
        //TODO 检查当前删除的菜单何处被引用
        //逻辑删除

        baseMapper.deleteBatchIds(asList);
    }

Mybatis-plus 逻辑删除
1,配置全局逻辑删除规则

mybatis-plus:
  mapper-locations: classpath:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto
      logic-delete-value: 1
      logic-not-delete-value: 0

2.加上逻辑删除注解

	/**
	 * 是否显示[0-不显示,1显示]
	 */
	@TableLogic(value = "1",delval = "0")
	private Integer showStatus;

修改

批量修改
CategoryServiceImpl

 /**
     * 批量修改
     * @param category
     * @return
     */
    @RequestMapping("/update/sort")
    public R updateSort(@RequestBody CategoryEntity[] category){
        categoryService.updateBatchById(Arrays.asList(category));

        return R.ok();
    }

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

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

相关文章

MySQL 中的锁(三)

8.7. 死锁和空间锁 一般来说&#xff0c;只要有并发和加锁这两种情况的共同加持下&#xff0c;都会有死锁的身影。 死锁的具体成因&#xff0c;借用我们在并发编程中的内容&#xff1a; 8.7.1. 死锁 8.7.1.1. 概念 是指两个或两个以上的进程在执行过程中&#xff0c;由于竞…

史上最全接单平台集锦,程序员不容错过!

非典型程序员不是每天都累成狗&#xff0c;天天”996"甚至”007“。可能&#xff0c;面临着上班摸鱼没事干&#xff0c;下班躺尸打游戏的无聊境况。那么&#xff0c;如果你也是这样的程序员&#xff0c;有没有什么安排可以打发时间&#xff1f; 闲着还不如挣钱~心情好的时…

聚焦 6G 无线技术——目标和需求

从 3G 到 5G 乃至之后的每一种无线标准&#xff0c;都在设计时加入了推动行业发展的具体目标。例如&#xff0c;4G 专注于以 IP 为中心的灵活语音、数据和视频通信&#xff0c;而 5G 则在此基础上进行了改进。6G 的目标是提供更加无处不在、更高效、更身临其境的无线连接。6G 系…

记录一次YAMLException异常

记录一次YAMLException异常 ✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 报错以及B…

【从删库到跑路 | MySQL总结篇】表的增删查改(进阶下)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、联合…

Linux常用命令----touch命令

文章目录 Linux操作系统中&#xff0c;touch 命令是一个常用且强大的工具&#xff0c;主要用于创建空文件或设置文件的时间戳。本文将详细介绍 touch 命令的各种参数及其用法&#xff0c;并通过实例演示来加深理解。 1. touch命令基础 touch 命令的基本语法格式为&#xff1a…

鸿蒙4.0开发笔记之ArkTS装饰器语法基础@Extend扩展组件样式与stateStyles多态样式(十一)

一、Extend扩展组件样式 1、作用 前文提到可以使用Styles用于样式的扩展&#xff0c;在Styles的基础上&#xff0c;ArkTS语法还提供了Extend&#xff0c;⽤于扩展原生组件样式&#xff0c;包括Text、Button等等。 2、定义语法 Extend(UIComponentName) function functionNam…

Flutter下拉框使用和可替换按钮的组件

前言 1、下拉框 在使用flutter框架完成项目的时候&#xff0c;有一个下拉框选择排序条件的需求&#xff0c;需要将下拉的选择内容&#xff0c;放在下拉按钮的下面&#xff0c;如Unity的Dropdown。下图是完整的需求。但是flutter系统自带的DropdownButtonFormField&#xff0c…

RabbitMQ消息模型之Work Queues

Work Queues Work Queues&#xff0c;也被称为&#xff08;Task Queues&#xff09;&#xff0c;任务模型&#xff0c;也是官网给出的第二个模型&#xff0c;使用的交换机类型是直连direct&#xff0c;也是默认的交换机类型。当消息处理比较耗时的时候&#xff0c;可能生产消息…

pkpmbs 建设工程质量监督系统 文件上传漏洞复现

0x01 产品简介 pkpmbs 建设工程质量监督系统是湖南建研信息技术股份有限公司一个与工程质量检测管理系统相结合的&#xff0c;B/S架构的检测信息监管系统。 0x02 漏洞概述 pkpmbs 建设工程质量监督系统 FileUpOrDown.aspx、/Platform/System/FileUpload.ashx、接口处存在任意文…

编程实现bf算法

BF算法&#xff08;Brute Force算法&#xff09;是一种朴素的字符串匹配算法&#xff0c;其基本思想是在文本串中不断地比较模式串和文本串中的子串&#xff0c;直到找到匹配的位置或者搜索完整个文本串。 下面是用Python实现BF算法的代码&#xff1a; def bf_search(text, p…

vuepress-----8、自定义域名

# 8、自定义域名 购买域名 [外链图片转存中…(img-0XcE3Zjv-1701236952478)] 填写域名、https # 自定义域名

【机器学习 | 可视化系列】可视化系列 之 决策树可视化

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

基于SSM的航空票务推荐系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

光伏、储能双层优化配置接入配电网研究(附带Matlab代码)

由于能源的日益匮乏&#xff0c;电力需求的不断增长等&#xff0c;配电网中分布式能源渗透率不断提高&#xff0c;且逐渐向主动配电网方向发展。此外&#xff0c;需求响应(demand response&#xff0c;DR)的加入对配电网的规划运行也带来了新的因素。因此&#xff0c;如何综合考…

UE 事件分发机制(二) day10

自定义事件分发机制 自建事件分发机制与结构 Unreal推荐的游戏逻辑开发流程 基于 Unreal推荐的游戏逻辑开发流程&#xff0c;一般我们的整体规划也就是这样 大致结构类图 创建接口类与管理类以及所需函数 新建一个Unreal接口类作为接口 然后创建一个蓝图函数库的基类 Ev…

适合大部分人可以做的兼职副业

大部分人每天八点上班&#xff0c;五点下班&#xff0c;日复一日地重复着枯燥的工作内容&#xff0c;关键是工资还不够花。那么&#xff0c;怎么才能增加日常收入、提高生活质量呢&#xff1f;副业兼职是个不错的赚钱选择。打工人除去日常工作&#xff0c;额外的空闲时间还是很…

宏基因组分析项目又双叒叕出新了!期盼已久的铁循环来了!!

铁是地球上几乎所有生命的微量营养素。它可以被铁氧化和铁还原微生物用作电子供体和电子受体&#xff0c;并用于多种生物过程&#xff0c;包括光合作用和呼吸作用。虽然铁是地壳中含量第四丰富的金属&#xff0c;但在有毒环境中&#xff0c;铁的生长往往受到限制&#xff0c;因…

惠威M200MKII音箱拆机

惠威M200MKII音箱是一对老音箱了&#xff0c;买了大概快有十多年了吧&#xff0c;几年前就已经有音量旋钮旋转的时候有噪音问题&#xff0c;一直用使用前快速左右旋一段时间&#xff0c;让电位器内部摩擦一下&#xff0c;就会好不少&#xff0c;但过些天又不行了。因为不是蓝牙…

基于springboot和vue的教务学生选课管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于Springboot和vue的教务&#xff08;学生&#xff09;管理系统拥有三种角色&#xff1a;管理员、教师和学生 管理员&#xff1a;班级管理、课程管理、创建课程、管理员管理、教师管理…