查询所有商品分类-树形结构
/**
* 查出所有分类以及子分类,以树形结构组装起来
*/
@RequestMapping("/list/tree")
@Override
public List<CategoryEntity> listithTree() {
//1.查出分类
List<CategoryEntity> entities = baseMapper.selectList(null);
//2.组成父子结构
//entities.stream().filter(()->{})
List<CategoryEntity> level1Menus = entities.stream().filter((categoryEntity) -> {
return categoryEntity.getParentCid() == 0;//找到所有的一级分类【parentId】
}).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()));//菜单排序,给空赋值0
}).collect(Collectors.toList());
return level1Menus;
}
/**
* 递归返回指定一级分类下的所有子菜单
* @param root 一级分类
* @param all 所有菜单
* @return 子菜单合集
*/
private List<CategoryEntity> getChildrens(CategoryEntity root,List<CategoryEntity> all){
List<CategoryEntity> children = all.stream().filter((categoryEntity) -> {
return categoryEntity.getParentCid() == root.getCatId();//当前菜单是他的子菜单
}).map((categoryEntity) -> {
categoryEntity.setChildren(getChildrens(categoryEntity, all));//递归调用,找出子菜单的子菜单
return categoryEntity;
}).sorted((menu1,menu2)->{
return (menu1.getSort()==null?0:menu1.getSort()-(menu2.getSort()==null?0:menu2.getSort()));//菜单排序,给空赋值0
}).collect(Collectors.toList());
return children;
}
修改前端遗留bug:【renren-fast-vue】安装npm时候出现问题
以为是node版本太低,只要在powershell里切换就可以。结果出现新的问题【淘宝镜像过期】
解决方法:【在settings.txt中替换新的镜像】
成功解决
出现新bug
原因:因为之前版本npm的命令一般是XXX -g,但是随着版本更替,这个老方法被弃用了,--global
, --local
被弃用删除,要求改为使用--location=global
node版本太高出现报错
最终只能选择低版本node
前后端联调成功:【曾出现bug:没有验证码-原因:虚拟机没有启动,缺少数据库】
前端请求:
角色管理:sys-role 前端路径:src\views\modules\sys\role.vue
分类维护:路径url:product/category 网页请求:product-category
偶遇bug:'parent.relativePath' of POM io.renren:renren-fast:3.0.0 (D:\LiaoningUniversityofTechnology\2025\code\liyumall\renren-fast\pom.xml) points at com.lnut.liyumall:liyumall instead of org.springframework.boot:spring-boot-starter-parent, please verify your project structure
解决办法:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.6</version> <relativePath/> </parent>
把renren-fast注册到nacos上,出现新bug:
解决办法:新版的人人fast降低springboot 版本,CorsConfig类改下.allowedOrigins("*")
不要引入公共commom模块,直接引入<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
网关重写路径:
修复之前的gateway项目bug【网关失效,无法拦截和断言】
原因【gateway项目依赖有问题,导入了谷粒商城的gateway的pom文件后就成功了】
网关重写业务逻辑:
gateway网关将前端传来的请求进行过滤和断言,修改后发送到renren-fast模块,调用出验证码,最后返回给前端页面。
spring:
cloud:
gateway:
routes:
- id: admin_route
uri: lb://renren-fast
predicates:
- Path=/api/**
filters:
- RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}
#前端->gateway->renrenfast
#http://localhost:88/api/captcha:jpg -> http://localhost:8080/renren-fast/captcha:jpg
跨域问题:浏览器不能执行其他网站的脚本,是浏览器对javascript施加的安全限制。
同源策略:协议,域名,端口任一不相同,都会产生跨域问题。
解决方法一:【使用nginx部署为同一域】,很少用
解决方法二:【常用方式】
第一步:在gateway项目中配置
@Configuration
public class liyumallCorsConfiguration {
@Bean
public CorsWebFilter corsWebFilter(){
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
//1.配置跨域
corsConfiguration.addAllowedHeader("*");//跨域请求暴露的手段
corsConfiguration.addAllowedMethod("*");//支持哪些方法跨域
corsConfiguration.addAllowedOrigin("*");//支持哪些来源的请求跨域
corsConfiguration.setAllowCredentials(true);//跨域请求包含cookie
source.registerCorsConfiguration("/**",corsConfiguration);
return new CorsWebFilter(source);
}
}
第二步:将renren-fast中的跨域配置注释
结果:成功登录人人快速开发平台,并且成功发送两次请求【预检请求和真实请求】
查询-树形展示三级分类数据
1.将product模块注册到nacos当中
#配置中心文件
cloud: nacos: discovery: server-addr: 127.0.0.1:8848 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.namespace=6b0f61b9-1001-46b3-83f9-f012671f1d58 spring.application.name=liyumall-product
2.在gateway模块中的网关配置,把product请求转发到product模块当中
- id: product_route uri: lb://liyumall-product predicates: - Path=/api/product/** filters: - RewritePath=/api/(?<segment>.*),/$\{segment}
3.在前端代码中展现响应的数据
methods: {
handleNodeClick(data) {
console.log(data);
},
getMenus(){
this.$http({
//向product模块的树状分类方法发送请求
url: this.$http.adornUrl('/product/category/list/tree'),
method: 'get',
}).then(({data}) => {
console.log("成功获取到菜单数据...",data)
this.menus=data.page
})
}
},
需要对照控制台中的属性来获取,可能是data也可能是page
完成:
三级分类:删除功能
逻辑删除:不是物理删除,而是不显示。【开发中要给实体类预留显示属性】
* 逻辑删除功能 * 1。配置全局的逻辑删除规则【可省略】 * 2。配置逻辑删除的组件bean【可省略】 * 3.给实体bean加上逻辑删除注解TableLogic
/** * 是否显示[0-不显示,1显示] */ @TableLogic(value = "1",delval = "0") private Integer showStatus;
删除和新增功能主要编写前端代码,直接调用后端接口,这里省略前端代码记录。。。