谷粒商城学习笔记(二)

知识点

Java 8 Stream

Java 8 Stream

网关URL配置

  1. 解释以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    spring:
    cloud:
    gateway:
    routes:
    - id: admin_route
    uri: lb://renren-fast
    predicates:
    - Path=/api/**
    filters:
    - RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}

跨域

  1. 什么是跨域

  2. 网关中如何配置跨域(响应式)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    package 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;

    @Configuration
    public class GulimallCorsConfigure {
    @Bean
    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);
    }
    }

逻辑删除

Mybatis-Plus 逻辑删除

疑问

  1. 以下方法递归了,没有看到退出条件,为什么没有死循环?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    private 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 方法中的。让我们逐步分析这个方法:

    1. 递归的基(退出条件):
      • filter 方法用于过滤出所有父分类ID等于 root.getCatId() 的分类实体。这意味着,对于非根节点的分类,这个条件会过滤出它的直接子节点;而对于叶节点(没有子节点的节点),这个条件不会匹配任何元素,因此 filter 返回的流将为空。
      • filter 返回一个空流时,后续的 peeksorted 操作将不会执行,因此递归不会继续。
    2. 递归步骤:
      • 对于每个匹配的子节点,peek 方法会调用 setChildren 方法,这是递归的步骤。setChildren 方法会递归地调用 getChildren 方法来找到当前子节点的子节点。
      • 这个过程会一直重复,直到达到叶节点,即没有子节点的节点。
    3. 递归的顺序:
      • 递归是深度优先的,这意味着它会首先探索一个分支直到叶节点,然后回溯并探索下一个分支。
    4. 代码分析:
      • category.getParentCid().equals(root.getCatId()) 确保只有当 category 的父ID与 root 的ID相同时,category 才会被考虑。
      • category.setChildren(getChildren(category, allCategories)) 是递归调用,它为当前 category 设置子节点。
      • sorted 方法用于排序,它不会影响递归的行为。
      • collect(Collectors.toList()) 将最终的流转换为一个列表。
        这个方法之所以不会进入死循环,是因为它依赖于数据结构中节点之间的父子关系。每个节点最多只会被访问一次,因此即使存在循环引用,递归也能正确终止。

    理解:退出条件在filter中,判断没有子节点就不会执行后续步骤了。

  2. Cookie是什么,存在哪儿的,客户端与服务端是如何传输cookie的

  3. 什么是响应式编程

  4. Vue2插槽

踩坑

  1. p46,将人人开源后端注册到nacos出现问题。

    1. 将人人开源pom.xml的springboot版本切换为2.3.3.RELEASE

    2. 按照p47的说明,修改io.renren.config.CorsConfig.java,将跨域配置注释掉就行了。