谷粒商城学习笔记(二)
知识点
Java 8 Stream
网关URL配置
解释以下内容:
1
2
3
4
5
6
7
8
9
10spring:
cloud:
gateway:
routes:
- id: admin_route
uri: lb://renren-fast
predicates:
- Path=/api/**
filters:
- RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}
跨域
什么是跨域
网关中如何配置跨域(响应式)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25package cn.insectmk.gulimall.gateway.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
public class GulimallCorsConfigure {
public CorsWebFilter corsWebFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
// 跨域配置
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.setAllowCredentials(true);
source.registerCorsConfiguration("/**", corsConfiguration);
return new CorsWebFilter(source);
}
}
逻辑删除
疑问
以下方法递归了,没有看到退出条件,为什么没有死循环?
1
2
3
4
5
6
7
8
9private List<CategoryEntity> getChildren(CategoryEntity root, List<CategoryEntity> allCategories) {
// 装载root分类的子分类
List<CategoryEntity> children = allCategories.stream()
.filter(category -> root.getCatId().equals(category.getParentCid()))
.peek(category -> category.setChildren(getChildren(category, allCategories)))
.sorted(Comparator.comparingInt(category -> ((category.getSort() == null) ? 0 : category.getSort())))
.collect(Collectors.toList());
return children;
}ChatGLM解答:
这个方法确实是一个递归方法,但是它没有导致死循环的原因在于递归的退出条件是隐含在
filter
方法中的。让我们逐步分析这个方法:- 递归的基(退出条件):
filter
方法用于过滤出所有父分类ID等于root.getCatId()
的分类实体。这意味着,对于非根节点的分类,这个条件会过滤出它的直接子节点;而对于叶节点(没有子节点的节点),这个条件不会匹配任何元素,因此filter
返回的流将为空。- 当
filter
返回一个空流时,后续的peek
和sorted
操作将不会执行,因此递归不会继续。
- 递归步骤:
- 对于每个匹配的子节点,
peek
方法会调用setChildren
方法,这是递归的步骤。setChildren
方法会递归地调用getChildren
方法来找到当前子节点的子节点。 - 这个过程会一直重复,直到达到叶节点,即没有子节点的节点。
- 对于每个匹配的子节点,
- 递归的顺序:
- 递归是深度优先的,这意味着它会首先探索一个分支直到叶节点,然后回溯并探索下一个分支。
- 代码分析:
category.getParentCid().equals(root.getCatId())
确保只有当category
的父ID与root
的ID相同时,category
才会被考虑。category.setChildren(getChildren(category, allCategories))
是递归调用,它为当前category
设置子节点。sorted
方法用于排序,它不会影响递归的行为。collect(Collectors.toList())
将最终的流转换为一个列表。
这个方法之所以不会进入死循环,是因为它依赖于数据结构中节点之间的父子关系。每个节点最多只会被访问一次,因此即使存在循环引用,递归也能正确终止。
理解:退出条件在filter中,判断没有子节点就不会执行后续步骤了。
- 递归的基(退出条件):
Cookie是什么,存在哪儿的,客户端与服务端是如何传输cookie的
什么是响应式编程
Vue2插槽
踩坑
p46,将人人开源后端注册到nacos出现问题。
将人人开源
pom.xml
的springboot版本切换为2.3.3.RELEASE
。按照p47的说明,修改
io.renren.config.CorsConfig.java
,将跨域配置注释掉就行了。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 InsectMk的个人空间!
评论