【0.三高商城系统的专题专栏都帮你整理好了,请点击这里!】
【1-系统架构演进过程】
【2-微服务系统架构需求】
【3-高性能、高并发、高可用的三高商城系统项目介绍】
【4-Linux云服务器上安装Docker】
【5-Docker安装部署MySQL和Redis服务】
【6-Git安装与配置过程、Gitee码云上创建项目、IDEA关联克隆的项目】
【7-创建商城系统的子模块并将修改后的信息使用Git提交到Gitee上】
【8-数据库表结构的创建&后台管理系统的搭建】
【9-前端项目的搭建部署、Node安装、VSCode安装】
【10-Node的安装以及全局环境变量的相关配置&解决启动报错的问题(1.Error: Cannot find module ‘fs/promises)(2.npm安装node-sass报错)】
【11-导入人人generator项目并自动生成相关的文件&商品子模块的调试&公共模块common子模块的抽离与实现&Lombok插件的安装】
【12-商品子模块整合MyBatisPlus技术&其它模块通过generator的自动生成与补充完善】
【13-项目中微服务组件的学习-SpringCloudAlibaba微服务生态体系的学习&SpringCloudAlibaba的依赖管理&项目中SpringBoot和SpringCloud版本的统一】
【14-微服务的注册中心与配置中心Nacos&Windows操作系统上安装Nacos和Linux操作系统上用Docker中安装Nacos&每个子项目模块使用Nacos进行服务注册与发现】
【15-项目中服务的远程调用之OpenFeign&订单模块与商品模块集成使用OpenFeign的案例】
【16-配置中心之Nacos的基本使用&Nacos服务之命令空间、Nacos服务之配置组、Nacos服务之配置拆分】
【17-微服务网关之Spring Cloud Gateway&Spring Cloud Gateway网关服务搭建】
如果启动后端项目的时候遇到如下错误:
-Djps.track.ap.dependencies=false
那么直接在Settings->Complier->添加上述配置重新启动即可
后台项目启动后的效果:
启动过程中如果发现报错,错误是Nacos的配置中心地址找不到,我们之前只用订单模块做了案例,并没有给其它模块做案例,所以其它模块直接启动会报错。那么是因为我们没有进行配置中心地址的配置,因为commons模块中引入了Nacos的配置中心依赖,而我们又引入了commons的依赖,所以,如果我们不进行Nacos配置中心的配置,那么启动肯定会报错。
解决方案如下:
数据展示:
因为后台为我们传过来的是json数据,显示效果不明显,为了更加明显,我们需要下载一个json插件
打开我们的插件,将我们的数据拷贝到json插件中
controller层定义具有层级结构的访问接口
/*** 返回具有层级目录的商品分类数据* @param params* @return*/@GetMapping("/listTree")public R listTree(@RequestParam Map params){List list = categoryService.queryPageWithTree(params);return R.ok().put("data", list);}
service中定义我们的具体业务接口
/*** CategoryService中同步定义对应的接口方法* @param params* @return*/List queryPageWithTree(Map params);
对应的service实现类中实现相关的接口,并进行相关业务逻辑的处理
这个地方的实现是比较重要的:递归的思想+JDK8特性中stream流相关方法的使用+而且这个解决方案是通用的+可以用在任何想要返回具有层级结构、父子关系的查找当中。
补充一下:JDK8相关的特性文章可以看一下恩师dpb的博客:JDK8新特性
/*** 实现CategoryService中对应的接口方法中具体的事项逻辑* 查询所有的类别数据,然后将数据封装为树形结构,便于前端使用* @param params* @return*/@Overridepublic List queryPageWithTree(Map params) {// 1.查询所有的商品分类信息List categoryEntities = baseMapper.selectList(null);// 2.将商品分类信息拆解为树形结构【父子关系】// 第一步遍历出所有的大类 parent_cid = 0List list = categoryEntities.stream().filter(categoryEntity -> categoryEntity.getParentCid() == 0).map(categoryEntity -> {// 根据大类找到多有的小类 递归的方式实现categoryEntity.setChildrens(getCategoryChildrens(categoryEntity,categoryEntities));return categoryEntity;}).sorted((entity1, entity2) -> {return (entity1.getSort() == null ? 0 : entity1.getSort()) - (entity2.getSort() == null ? 0 : entity2.getSort());}).collect(Collectors.toList());// 第二步根据大类找到对应的所有的小类return list;}/*** 查找该大类下的所有的小类 递归查找* @param categoryEntity 某个大类* @param categoryEntities 所有的类别数据* @return*/private List getCategoryChildrens(CategoryEntity categoryEntity, List categoryEntities) {List collect = categoryEntities.stream().filter(entity -> {// 根据大类找到他的直属的小类return entity.getParentCid() == categoryEntity.getCatId();}).map(entity -> {// 根据这个小类递归找到对应的小小类entity.setChildrens(getCategoryChildrens(entity, categoryEntities));return entity;}).sorted((entity1, entity2) -> {return (entity1.getSort() == null ? 0 : entity1.getSort()) - (entity2.getSort() == null ? 0 : entity2.getSort());}).collect(Collectors.toList());return collect;}
最后就是启动我们是商品模块,访问测试我们是实现逻辑是否可行:---->如果出现下面的结果—》搞定!