一.知识回顾
【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网关服务搭建】
二.启动我们的管理端的后端项目和前端项目
2.1 后台项目部署
如果启动后端项目的时候遇到如下错误:
-Djps.track.ap.dependencies=false
那么直接在Settings->Complier->添加上述配置重新启动即可
后台项目启动后的效果:
2.2 前端项目部署
2.3 访问测试登陆
三.商品分类管理开发
3.1 商品模块对应的商品分类数据库表增加数据
3.2 启动商品类,对获取我们所有商品分类接口进行测试,看能否成功获取刚插入的数据
启动过程中如果发现报错,错误是Nacos的配置中心地址找不到,我们之前只用订单模块做了案例,并没有给其它模块做案例,所以其它模块直接启动会报错。那么是因为我们没有进行配置中心地址的配置,因为commons模块中引入了Nacos的配置中心依赖,而我们又引入了commons的依赖,所以,如果我们不进行Nacos配置中心的配置,那么启动肯定会报错。
解决方案如下:
数据展示:
因为后台为我们传过来的是json数据,显示效果不明显,为了更加明显,我们需要下载一个json插件
打开我们的插件,将我们的数据拷贝到json插件中
3.3 数据已经获取了,接下来就需要处理我们的大量数据,说明白了,就是将数据进行分类,具有父子层级关系的目录结构
controller层定义具有层级结构的访问接口
/**
* 返回具有层级目录的商品分类数据
* @param params
* @return
*/
@GetMapping("/listTree")
public R listTree(@RequestParam Map<String, Object> params){
List<CategoryEntity> list = categoryService.queryPageWithTree(params);
return R.ok().put("data", list);
}
service中定义我们的具体业务接口
/**
* CategoryService中同步定义对应的接口方法
* @param params
* @return
*/
List<CategoryEntity> queryPageWithTree(Map<String, Object> params);
对应的service实现类中实现相关的接口,并进行相关业务逻辑的处理
这个地方的实现是比较重要的:递归的思想+JDK8特性中stream流相关方法的使用+而且这个解决方案是通用的+可以用在任何想要返回具有层级结构、父子关系的查找当中。
补充一下:JDK8相关的特性文章可以看一下恩师dpb的博客:JDK8新特性
/**
* 实现CategoryService中对应的接口方法中具体的事项逻辑
* 查询所有的类别数据,然后将数据封装为树形结构,便于前端使用
* @param params
* @return
*/
@Override
public List<CategoryEntity> queryPageWithTree(Map<String, Object> params) {
// 1.查询所有的商品分类信息
List<CategoryEntity> categoryEntities = baseMapper.selectList(null);
// 2.将商品分类信息拆解为树形结构【父子关系】
// 第一步遍历出所有的大类 parent_cid = 0
List<CategoryEntity> 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<CategoryEntity> getCategoryChildrens(CategoryEntity categoryEntity
, List<CategoryEntity> categoryEntities) {
List<CategoryEntity> 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;
}
最后就是启动我们是商品模块,访问测试我们是实现逻辑是否可行:---->如果出现下面的结果—》搞定!