三级分类部分三级目录无法加载,后端接口能在前端返回所有数据

news2025/1/17 0:56:36

项目场景:

实现ElementUI中三级分类的功能,发现没有前端三级目录的二级目录可以新建三级目录,数据库中也有数据,但是无法在前端显示!后端的接口没有返回数据库的数据。
在这里插入图片描述


问题描述

提示:这里描述项目中遇到的问题:

例如:数据传输过程中数据不时出现丢失的情况,偶尔会丢失一部分数据
APP 中接收数据代码:

@Override
	public void run() {
		bytes = mmInStream.read(buffer);
		mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();
	}

原因分析:

提示:例如:在骑行运动耳机目录之后新建的目录,前端界面显示新建成功,数据库也有数据,但是不会显示在前端。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据库中新建数据成功,但是在骑行运动中不会显示出这个新建的婴儿车三级目录。
在这里插入图片描述
IDEA 日志打印记录显示插入成功
在这里插入图片描述
使用sql查询 parent_cid为128的二级目录
在这里插入图片描述

再使用接口测试前端界面没有婴儿车
在这里插入图片描述

代码:

后端接口

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

//接口Service层
    List<CategoryEntity> listWithTree();


Service的具体实现

    @Override
    public List<CategoryEntity> listWithTree() {
        //1、查出所有分类
        List<CategoryEntity> entities = baseMapper.selectList(null);

        //2、 组装成父子的树形结构
            //2.1) 找到所有一级分类(父分类id为0)
        List<CategoryEntity> level1Menus = entities.stream().filter(categoryEntity ->
                categoryEntity.getCatLevel() == 1
        ).map((menu)->{
//            System.out.println(menu);
            menu.setChildren(getChildrens(menu,entities));
//            menu.setChildren(getSubtreeById(menu.getCatId(), 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){

        //1.找到当前菜单的子菜单(每个子菜单还有子菜单)
//        Stream<CategoryEntity> categoryEntityStream = all.stream().filter(entity -> (long)entity.getParentCid() == (long)root.getCatId()); //出bug语句
        Stream<CategoryEntity> categoryEntityStream = all.stream().filter(entity -> entity.getParentCid() == root.getCatId());

        Stream<CategoryEntity> mapEntityStream = categoryEntityStream.map(item -> {
            item.setChildren(getChildrens(item,all));
            return item;
        });

        List<CategoryEntity> children = mapEntityStream.sorted((menu1,menu2)->{
            return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());
        }).collect(Collectors.toList());
        return  children;

解决方案:

提示:CatID为128以后的二级目录都不显示数据库中有的三级目录

1 数据库序号问题

DROP TABLE IF EXISTS `pms_category`;

CREATE TABLE `pms_category` (
  `cat_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类id',
  `name` char(50) DEFAULT NULL COMMENT '分类名称',
  `parent_cid` bigint(20) DEFAULT NULL COMMENT '父分类id',
  `cat_level` int(11) DEFAULT NULL COMMENT '层级',
  `show_status` tinyint(4) DEFAULT NULL COMMENT '是否显示[0-不显示,1显示]',
  `sort` int(11) DEFAULT NULL COMMENT '排序',
  `icon` char(255) DEFAULT NULL COMMENT '图标地址',
  `product_unit` char(50) DEFAULT NULL COMMENT '计量单位',
  `product_count` int(11) DEFAULT NULL COMMENT '商品数量',
  PRIMARY KEY (`cat_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1424 DEFAULT CHARSET=utf8mb4 COMMENT='商品三级分类';

AUTO_INCREMENT=1424 原来的数据库是1434,改成了1424让cat_id自增 序号不断层,问题还是解决。 开始以为是数据库很多序号乱码,后面才发现是128二级目录开始出问题。

JAVA层面

1 递归改成非递归写法

        //原版代码
//        List<CategoryEntity> children = all.stream().filter(categoryEntity -> {
//            return categoryEntity.getParentCid() == root.getCatId();
//        }).map(categoryEntity->{
//            //2.利用映射递归查找 子菜单的子菜单
//            categoryEntity.setChildren(getChildrens(categoryEntity,all));
//            return categoryEntity;
//        }).sorted((menu1,menu2)->{
//            //3.对当前菜单进行排序,升序排序
//            return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());
//        }).collect(Collectors.toList());
//
//        return children;

        //非递归写法
//        List<CategoryEntity> result = new ArrayList<>();
//        for (int i = 0; i < all.size(); i++){
//            CategoryEntity entity = all.get(i);
//            if (entity.getParentCid() == root.getCatId()) {
//                result.add(entity);
//            }
//        }
//        System.out.println(result);
//
//        for (int i = 0; i < result.size(); i++){
//            CategoryEntity current = result.get(i);
//            List<CategoryEntity> sub = new ArrayList<>();
//            for (int j = 0; j < all.size(); j++){
//                CategoryEntity entity = all.get(j);
//                if (entity.getParentCid() == current.getCatId()) {
//                    List<CategoryEntity> subsub = new ArrayList<>();
//                    for (int k = 0; k < all.size(); k++){
//                        CategoryEntity subEntity = all.get(k);
//                        if (subEntity.getParentCid() == entity.getCatId()){
//                            subsub.add(subEntity);
//                        }
//                    }
//                    entity.setChildren(subsub);
//                    sub.add(entity);
//                }
//            }
//            current.setChildren(sub);
//        }
//
//        return result;

还是不行

重新写接口: 查询cat_id为128的子目录

//Controller层
    /**
     * 信息
     */
    @RequestMapping("/info/{catId}")
    //@RequiresPermissions("product:category:info")
    public R info(@PathVariable("catId") Long catId) {

        CategoryEntity category = categoryService.getById(catId);
        return R.ok().put("data", category);
    }

//Service层
    List<CategoryEntity> getSubtreeById(long catId);

接口实现功能

    @Override
    public List<CategoryEntity> getSubtreeById(long catId) {
        List<CategoryEntity> entities = baseMapper.selectList(null);

        List<CategoryEntity> filterList = entities.stream().filter(item -> item.getParentCid() == catId)
                .map(item -> {
                    item.setChildren(getSubtreeById(item.getCatId()));
                    return item;})
                .collect(Collectors.toList());
        return filterList;
    }

前端端口测试: 直接通过id的方式能够查询到父ID为128的所有目录,既婴儿车的父目录找到了。
在这里插入图片描述
后续按照这个思路重新写程序能够实现三级分类展现所有子目录的功能,但是对bug产生的原因不太清晰!!!

解决方法

改变一行代码
在这里插入图片描述
就是因为递归调用了太多次,自动装箱成Long对象,但是Long对象装箱的源码实现跟128有很大的关系!! 下面解释中的Integer是一个道理,(Integer) 128 == (Integer) 128 为false,所以128之后的二级目录都不满足这个判断,所以他们的三级目录无法加载!!!
具体代码实现可以看引用!!!

Integer类 -128~127 之间的值都是直接从缓存中取出的,(Integer)127 == (Integer)127两边装箱后,实际指向堆内存中同一个对象,大于127 后就new一个新的对象返回。(Integer)128 == (Integer)128,装箱为引用类型后,没有做缓存,指向堆内存中不同对象,所以比较结果为false。至于为什么要缓存,若不缓存,每次都要new一个新对象,资源消耗多,所以缓存一些常用的数,来减少资源损耗。
————————————————
版权声明:本文为CSDN博主「有时候我也会」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43849277/article/details/108275997

总结

开发过程中不要随便用递归!!!Debug不好调整,遇到其他问题结合,真的是头皮发麻!!!本文只是精简的讲述了核心找bug的过程,但是Debug打各种条件断点,查看Tomcat源码,StackFlow看英文,,,等等困扰了我一天的bug,终于跟冠哥合理解决了!!!

推荐看一下阿里开发手册对递归使用的建议!!!

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

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

相关文章

MySQL数据库varchar字段求和出现精度丢失

问题描述 在MySQL数据库中&#xff0c;将varchar字段用于数值运算时&#xff0c;会将其转换为数值类型进行计算。然而&#xff0c;由于varchar字段的可变长度特性&#xff0c;可能存在数值精度丢失的问题。 我用varchar类型存储学生的分数&#xff0c;分数有两位小数&#xff…

新业务场景如何个性化配置验证码?

验证码作为人机交互界面经常出现的关键要素&#xff0c;是身份核验、防范风险、数据反爬的重要组成部分&#xff0c;广泛应用网站、App上&#xff0c;在注册、登录、交易、交互等各类场景中发挥着巨大作用&#xff0c;具有真人识别、身份核验的功能&#xff0c;在保障账户安全方…

Cron表达式每隔两小时执行一次

Cron表达式每隔两小时执行一次 0 0 */2 * * ?验证正确性

7.自定义凸多边形

愿你出走半生,归来仍是少年&#xff01; 在Gis中常用的地物表达包含点线面&#xff0c;三维场景中可通过立方体的形式表达面妆物体&#xff0c;例如房屋等等。在Unity中为提供多边形的构建对象&#xff0c;此处通过wkt构建出在三维场景中的基于面的立方体。 通过传入wkt、底部高…

【数据结构与算法】JavaScript实现栈结构(Stack)

文章目录 一、前言1.1.什么是数据结构&#xff1f;1.2.什么是算法&#xff1f; 二、栈结构&#xff08;Stack&#xff09;2.1.简介2.2.封装栈类 一、前言 1.1.什么是数据结构&#xff1f; 数据结构就是在计算机中&#xff0c;存储和组织数据的方式。 例如&#xff1a;图书管…

功率放大器如何驱动超声波换能器

驱动超声波换能器的功率放大器在超声波应用中起着至关重要的作用。它能够提供足够的功率和精确的信号控制&#xff0c;使换能器能够有效地将电能转换为超声波能量。下面安泰电子将介绍功率放大器如何驱动超声波换能器的原理和关键要点。 首先&#xff0c;让我们了解一下超声波换…

2021款别克英朗,汽车空调使用方法

2021款别克英朗&#xff0c;汽车空调使用方法 今天就给大家一起交流探讨一下别克英朗2021款1.5L配置的汽车空调该如何正确使用。 别克英朗2021款1.5L配置的空调为手动空调&#xff0c;所有的空调操作都需要我们自己判断&#xff0c;比如如何正确使用制冷制热&#xff0c;内外循…

如何理解交通部EDI报文:舱单报文IFCSUM

舱单报文IFCSUM的发送方向 发送方&#xff1a;船公司、船舶代理 接收方&#xff1a;集装箱码头、理货、港监等 舱单报文IFCSUM的功能 此文件对应IFCSUM报文的舱单子集&#xff0c;提供某一航次运输货物的信息&#xff0c;说明承运人、运输方式、运输工具、设备及联运货物的细…

大模型的实践应用2-基于BERT模型训练医疗智能诊断问答的运用研究,协助医生进行疾病诊断

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用2-基于BERT模型训练医疗智能诊断问答的运用研究,协助医生进行疾病诊断。医疗大模型通过收集和分析大量的医学数据和临床信息,能够协助医生进行疾病诊断、制定治疗方案和评估预后等任务。利用医疗大模型,可以帮助医生…

南美玻利维亚市场最全分析开发攻略,收藏一篇就够了

中国也是玻利维亚最大的贸易伙伴。当地时间2023年7月27日&#xff0c;玻利维亚经济与公共财政部长蒙特内格罗表示&#xff0c;玻利维亚政府决心在对外贸易中减少对美元的依赖&#xff0c;一些玻利维亚外贸企业已经开始使用人民币进行结算。到目前为止&#xff0c;玻利维亚跟中国…

选择腾讯共享wifi贴项目公司时,有哪些注意事项?!

在如今移动互联网时代&#xff0c;无线网络已经成为人们生活中必不可少的部分。虽然公共场所和商家开始提供免费WiFi&#xff0c;但是用户在连接时都要去咨询密码很是麻烦&#xff0c;腾讯共享WiFi贴凭借着高效、快速地便捷连接方式切入顾客的需求和共享市场&#xff0c;很多创…

14.9 Socket 高效文件传输

网络上的文件传输功能也是很有必要实现一下的&#xff0c;网络传输文件的过程通常分为客户端和服务器端两部分。客户端可以选择上传或下载文件&#xff0c;将文件分块并逐块发送到服务器&#xff0c;或者从服务器分块地接收文件。服务器端接收来自客户端的请求&#xff0c;根据…

【软考】6.1 信息安全及技术

《信息安全和信息系统安全》 信息安全系统的体系架构 网络安全空间五大要素&#xff1a;认证、权限、完整、加密、不可否认&#xff08;抵赖&#xff09; 信息安全含义及属性 信息安全三要素&#xff1a;保密性、完整性、可用性最小授权原则&#xff1a;该有什么权限&#xf…

软件测试基础知识 + 面试理论(超详细)

一、什么是软件&#xff1f; 软件是计算机系统中的程序和相关文件或文档的总称。 二、什么是软件测试&#xff1f; 说法一&#xff1a;使用人工或自动的手段来运行或测量软件系统的过程&#xff0c;以检验软件系统是否满足规定的要求&#xff0c;并找出与预期结果之间的差异…

Mac系统快速切换和管理node版本

如何下载node 不要下载最新版&#xff0c;推荐先下载稳定版的nodejs.org/zh-cn/downl…&#xff0c;下载完一键式安装即可&#xff0c;安装完成后&#xff0c;命令行查看是否成功。 1、使用n切换node版本 node有一个模块n&#xff0c;是专门用来管理node.js的版本的。npm是用…

数据导入与预处理-第4章-Python标准库之json

文章目录 资源json概述json案例dumps案例dump案例中文编码问题格式化问题 loads案例load案例 资源 参考:https://zhuanlan.zhihu.com/p/436465279 https://blog.csdn.net/impoijimlq/article/details/130445399 json概述 什么是json json是一种轻量级的文本数据 交换格式jso…

【代码软实力】职场高效沟通技巧

一、沟通三要素 二、什么是沟通 三、沟通的难点 四、向上沟通-结构化表达 上级结构化表达的案例 五、平级沟通-非暴力沟通 平级非暴力沟通案例 六、下级沟通-行为影响结果原则BIC 下级沟通案例分析 思维导图

如何在MT4和MT5复制交易?有缺点吗?anzo capital昂首资本1秒答

很多投资者不知道如何在MT4和MT5上复制交易信号&#xff1f;其实很简单&#xff0c;今天anzo capital昂首资本1分钟解答&#xff0c;复制交易的方法包括&#xff1a; 在MetaQuotes社区进行交易复制和信号的传播。MT4和MT5均具备连接到这个社区的功能。以下是使用该功能的步骤&…

Crypto(2)攻防世界-幂数加密

先看题&#xff0c;给出了flag格式和幂数加密的方式。 附件里的内容为8842101220480224404014224202480122 正常的二进制幂数加密只有0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;是不会出现8的。通过百度了解到这是云影密码、 简单说来…

Anaconda安装

前言&#xff1a; 在学习机器学习时&#xff0c;一般都会使用Anaconda。 Anaconda是一个强大的开源数据科学平台,它将很多好的工具整合在一起&#xff0c;极大地简化了使用者的工作流程&#xff0c;并能够帮助使用者解决一系列数据科学难题。 有小伙伴纠结先安装python还是安…