项目不知道第几天了,跟不上了。。。新学到的东西记录在这吧。。。

JavaScript中数组遍历方法

  • foreach遍历(无返回值)
data.forEach((item) => {
        item.leaf = !item.hasChildren
    });
  • map遍历(有返回值)
data.map(()=>{

     })

Javascript中数组的map方法

	let isHalf0Array = arr.map(item =>{
        return {"id":item.id,"isHalf":0}
    })

在你提供的代码中,arr.map 使用了 JavaScript 中的数组的 map 方法。arr.map 是一个数组方法,它用于遍历数
组的每个元素,并将每个元素传递给提供的回调函数,然后返回一个新的数组,其中包含回调函数返回的结果。

在你的代码中,arr 是一个数组,而 item 是回调函数中的参数,代表数组中的每个元素。回调函数返回一个新的对象,其中包含了元素的 “id” 属性和一个新的属性 “isHalf”,并将 “isHalf” 的值设置为 0。

以下是 arr.map 的基本用法:

javascript
const newArray = arr.map((item, index, array) => {
    // 处理每个元素并返回一个新的值
    return newValue;
});

在你的代码中,arr.map 遍历数组 arr 中的每个元素,对每个元素执行提供的回调函数,然后返回一个新的数组 isHalf0Array,其中包含了每个元素的 “id” 和 “isHalf” 属性。

let all =[…isHalf0Array,…isHalf1Array]使用扩展运算符合并数组

let all =[...isHalf0Array,...isHalf1Array] 

在你提供的代码中,[…isHalf0Array, …isHalf1Array] 使用了 JavaScript 的扩展运算符(spread operator)。扩展运算符用于将一个数组展开为单独的元素,然后将它们合并到一个新的数组中。

在这里,isHalf0Array 和 isHalf1Array 都是数组,[…isHalf0Array, …isHalf1Array] 将两个数组的内容合并成一个新的数组。

示例:

const isHalf0Array = [{"id": 1, "isHalf": 0}, {"id": 2, "isHalf": 0}];
const isHalf1Array = [{"id": 3, "isHalf": 1}, {"id": 4, "isHalf": 1}];

const all = [...isHalf0Array, ...isHalf1Array];
console.log(all);

// 输出合并后的数组
// [{“id”: 1, “isHalf”: 0}, {“id”: 2, “isHalf”: 0}, {“id”: 3, “isHalf”: 1}, {“id”: 4, “isHalf”: 1}]
上面的示例展示了如何使用扩展运算符将两个数组 isHalf0Array 和 isHalf1Array 合并成一个新数组 all,其中包含了这两个数组的所有元素。

spring中主方法上 @ComponentScan 注解

@ComponentScan注解是Spring框架中的一个注解,它用于告诉Spring容器在哪些包下扫描并识别标有特定注解的组件,然后将这些组件注册到Spring容器中,以便能够被Spring框架自动管理和注入到其他组件中。这个注解通常用于配置类(通常是带有@Configuration注解的类)上,以指定要扫描的包路径。

以下是@ComponentScan注解的一些主要作用:

组件扫描: 通过@ComponentScan注解,Spring容器会自动扫描指定包及其子包中的类,查找标有@Component及其派生注解(如@Service、@Repository、@Controller等)的类,然后将它们注册为Spring的Bean。

自动装配: 一旦组件被注册到Spring容器中,它们可以被自动注入到其他组件中,通过@Autowired或其他依赖注入方式。这简化了组件之间的协作和依赖管理。

模块化开发: @ComponentScan允许将应用程序分成多个模块,每个模块可以有自己的包结构和配置类。这有助于保持代码的清晰性和可维护性。

自定义扫描规则: 你可以使用basePackages属性来指定要扫描的包路径,也可以使用basePackageClasses属性指定包中的特定类,还可以使用includeFilters和excludeFilters属性来自定义扫描过程中的筛选规则。

下面是一个使用@ComponentScan注解的示例:

java
@Configuration
@ComponentScan(basePackages = "com.example.app")
public class AppConfig {
    // 其他配置和Bean定义可以在这里添加
}

在这个示例中,@ComponentScan注解指示Spring容器扫描com.example.app包及其子包中的类,将标有@Component及其派生注解的类注册为Spring的Bean。

resolve(data)作用

在 JavaScript 中,resolve 是 Promise 对象中的一个方法,通常用于成功时执行 Promise。它的作用如下:

Promise 解决成功(fulfilled)时的处理:resolve 方法被用于解决(fulfill)一个 Promise 对象,将其从等待状态转为已解决状态。当 Promise 成功完成其任务时,resolve 方法通常会被调用,以便在成功时执行与 Promise 相关的操作。

传递结果值:通常,resolve 方法可以接受一个参数,这个参数会成为 Promise 的解决值,也就是成功时的结果。这个结果值可以是任何 JavaScript 数据类型,例如对象、数组、字符串等。

示例代码:

const myPromise = new Promise((resolve, reject) => {
  // 一些异步操作,例如从服务器获取数据
  const data = "Promise resolved data";
  if (data) {
    resolve(data); // 解决 Promise 并传递结果值
  } else {
    reject("Promise rejected"); // 在出现错误时拒绝 Promise
  }
});

myPromise.then((result) => {
  console.log("Promise resolved with result: " + result);
}).catch((error) => {
  console.error("Promise rejected with error: " + error);
});

在上面的示例中,resolve 被用于成功解决 Promise,并传递了一个结果值(“Promise resolved data”),随后 .then() 方法用于处理成功的情况。如果出现错误,可以使用 .catch() 方法来处理拒绝(reject)情况。

Arrays.asList() 作用

在你提供的代码中,Arrays.asList() 用于将两个 StudentExcelVo 对象放入一个固定大小的列表(List)中。这个列表是一个视图,基于传入的数组或元素,它是不可变的,也就是不能进行结构上的修改(如添加或删除元素)。

StudentExcelVo studentExcelVo1 = new StudentExcelVo(1, "张三", "山东菏泽曹县");
StudentExcelVo studentExcelVo2 = new StudentExcelVo(1, "李四", "广西柳州");

// 使用Arrays.asList()将两个StudentExcelVo对象放入列表
List<StudentExcelVo> studentExcelVos = Arrays.asList(studentExcelVo1, studentExcelVo2);

这样,studentExcelVos 就成为一个包含两个 StudentExcelVo 对象的列表。需要注意的是,由于返回的列表是不可变的,所以不能对其进行结构上的修改。如果需要进行修改,可以考虑将其转换为一个可变的 ArrayList:

java
List mutableList = new ArrayList<>(studentExcelVos);
这样,mutableList 就是一个可变的列表,你可以对其进行结构上的修改。

对象转换的两种方式

1、先将一个对象通过JSONtoString()转化为JSON字符串,再将JSON字符串转化为其他对象 parseObject()


	Category categoty = new Category();
	String json = JSON.toString(category);
	CategotyExcelVo  categoryExcelVo = JSON.parseObject(json,CategoryExcelVo.class)
	

2、通过集成好的工具类 BeanUtils.copyProperties() 方法


	Category categoty = new Category();
	CategoryExcelVo categoryExcelVo = new CategoryExcelVo()
	BeanUtils.copyProperties(category,categoryExcelVo );
	

javascript中responseType:'blob’作用

// 获取分类列表
export const ExportCategoryData = () => {
  return request({
    url: `${api_path}/exportData`,
    method: 'get',
    responseType:'blob' //看成是后端接口返回的数据,是通过响应输出流响应的二进制文件流
  })
}

在JavaScript中,responseType: ‘blob’ 是XMLHttpRequest对象(XHR)或Fetch API的一个属性,用于指定响应的数据类型。当你发送一个HTTP请求时,服务器会返回不同类型的数据,比如文本、JSON、图像等。通过设置responseType属性,你可以告诉浏览器以何种形式来处理服务器响应的数据。

当你将responseType设置为 ‘blob’ 时,表示你期望接收的响应数据是一个二进制大对象(Blob对象)。Blob对象通常用于处理文件、图像等二进制数据。设置responseType: ‘blob’ 可以确保浏览器将响应数据解析为Blob对象,你可以进一步处理这个Blob对象,比如将其保存为文件、显示为图像等。

以下是一个使用Fetch API并设置responseType: 'blob’的示例:

fetch('https://example.com/file/image.jpg', {
  method: 'GET',
  responseType: 'blob' // 设置响应类型为Blob
})
  .then(response => response.blob()) // 将响应数据解析为Blob对象
  .then(blobData => {
    // 在这里可以处理Blob对象,比如保存为文件或显示为图像
    console.log(blobData);
  })
  .catch(error => {
    console.error('Error:', error);
  });

在上面的示例中,Fetch API发送了一个GET请求,响应数据被解析为Blob对象,并在.then()块中处理。这样,你就可以在前端代码中有效地处理服务器返回的二进制数据。

AntPathMatcher使用

今天在判断路径是否满足时使用AntPathMatcher

//2.判断路径是否满足/api/**/auth/**
        if(antPathMatcher.match("/api/**/auth/**",path)){

        }else{
            return chain.filter(exchange);
        }

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)注解使用

商城购物车功能不需要使用数据源,但是启动时会报没有配置数据源
使用 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) 注解在主方法上可以排除配置
在这里插入图片描述

对订单赋值是使用 System.currentTimeMillis()+“” 赋值

orderInfo.setOrderNo(System.currentTimeMillis()+"");

System.currentTimeMillis() 是 Java 中 System 类提供的一个方法,用于获取当前系统时间距离1970年1月1日 00:00:00 UTC(协调世界时)的毫秒数。这个时间被称为 “Epoch time” 或 “Unix time”。

long currentTimeMillis = System.currentTimeMillis();

返回的 currentTimeMillis 是一个 long 类型的整数,表示当前时间距离 Epoch time 的毫秒数。通常,这个值用于在程序中进行时间戳的记录,计算时间间隔,或者在一些需要时间信息的地方使用。

例如,你可以使用 System.currentTimeMillis() 来测量代码执行的时间:

long startTime = System.currentTimeMillis();

// 执行一些代码

long endTime = System.currentTimeMillis();
long elapsedTime = endTime - startTime;

System.out.println(“执行时间:” + elapsedTime + " 毫秒");
这对于性能分析和调试非常有用。需要注意的是,currentTimeMillis 返回的时间是以毫秒为单位的,但在一些情况下可能不够精确,因为它受到系统时钟的精度限制。在需要更高精度的情况下,可以考虑使用 System.nanoTime(),它返回纳秒级别的时间。

为什么System.currentTimeMillis()+""就变成了字符串类型

在表达式 System.currentTimeMillis() + “” 中,System.currentTimeMillis() 返回的是一个 long 类型的整数,然后通过与空字符串相加,会触发 Java 中的字符串连接操作。在 Java 中,当一个字符串与其他数据类型进行连接时,Java 会自动将其他数据类型转换为字符串,然后进行连接操作。

因此,System.currentTimeMillis() + “” 的执行过程如下:

System.currentTimeMillis() 返回一个 long 类型的整数。
通过与空字符串 “” 相加,触发了字符串连接操作。
由于其中一个操作数是字符串,Java 会将 long 类型的整数隐式地转换为字符串,然后进行字符串连接。
这是一种简便的将非字符串类型转换为字符串的方法,但在实际开发中,为了代码的清晰性和可读性,通常建议使用 String.valueOf 方法或 toString 方法来显式地将非字符串类型转换为字符串。例如:

String currentTimeString = String.valueOf(System.currentTimeMillis());

// 或者

String currentTimeString = Long.toString(System.currentTimeMillis());

这样的代码更加明确,易于理解。

Mybatis中useGeneratedKeys作用和keyProperty作用

mybatis 中useGeneratedKeys的作用

在 MyBatis 中,useGeneratedKeys 是一个配置选项,通常用于插入数据后获取自动生成的主键值(例如自增长的主键或序列的值)。它的作用是告诉 MyBatis 是否要使用数据库生成的键作为插入操作的结果,以便将其设置到相应的实体对象中。

当你执行一个插入操作并启用了 useGeneratedKeys 配置时,MyBatis 会在执行插入操作后,尝试从数据库获取自动生成的主键值,并将其设置到插入操作所影响的实体对象中。这样,你就可以在插入操作之后方便地获取新插入记录的主键值,而不必手动查询数据库以获取该值。

以下是在 MyBatis 中配置和使用 useGeneratedKeys 的一般步骤:

在你的 SQL 映射文件(例如 Mapper.xml)中,确保你的插入语句中指定了要生成的主键列,并使用 keyProperty 属性指定将主键值设置到哪个属性中,同时启用 useGeneratedKeys 选项。

<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO users (username, email) VALUES (#{username}, #{email})
</insert>

在 Java 代码中执行插入操作,并传递包含数据的对象作为参数。在插入操作后,你可以从对象中访问自动生成的主键值。

User user = new User();
user.setUsername("john_doe");
user.setEmail("john@example.com");

userMapper.insertUser(user);

// 现在可以访问自动生成的主键值
Long generatedKey = user.getId();
总之,useGeneratedKeys 的作用是简化获取自动生成的主键值的过程,使你不必手动查询数据库来获取这些值,从而提高了代码的可读性和维护性。但请注意,它的可用性取决于数据库的支持和配置。不同的数据库可能有不同的方式来生成主键,所以在使用前请确保你的数据库和 MyBatis 配置正确。

mybatis 中keyProperty的作用

在 MyBatis 中,keyProperty 是在执行插入操作时与 useGeneratedKeys 配合使用的属性。它用于指定将从数据库获取的自动生成的主键值设置到哪个实体类的属性中。

当你使用 useGeneratedKeys=“true” 配置并执行插入操作时,keyProperty 属性告诉 MyBatis 将自动生成的主键值设置到指定的实体类属性中,以便在插入操作后能够方便地访问这个主键值。

举个例子,在 SQL 映射文件中使用 keyProperty:

<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO users (username, email) VALUES (#{username}, #{email})
</insert>

在这个例子中,keyProperty=“id” 指定了将自动生成的主键值设置到 User 类中名为 id 的属性中。当执行插入操作后,MyBatis 会自动将数据库生成的主键值(例如自增长的主键或序列的值)设置到 User 对象的 id 属性中。

User user = new User();
user.setUsername("john_doe");
user.setEmail("john@example.com");

userMapper.insertUser(user);

// 访问自动生成的主键值
Long generatedKey = user.getId();
在这个例子中,插入操作后,你可以通过访问 User 对象的 getId() 方法来获取刚刚生成的主键值。这使得在执行插入操作后方便地获得自动生成的主键值,无需手动查询数据库。

验证用户登录的几种方式

用户登录成功以后,在后端会生成一个token(令牌),然后会把token作为键,用户信息作为值保存到Redis中,并且会将token返回给前端。当前端在访问后端系统的时候,会通过请求头把token传递到后端。

验证登录思想:需要先对请求进行拦截,然后从请求头中获取token,然后根据token从Redis中查询用户数据。
拦截请求的方式:
1、方式一:直接通过spring mvc的拦截器(HandlerInterceptor)
2、方式二:在Gateway中通过全局过滤器进行请求拦截(GlobalFilter, Ordered)
3、方式三:通过aop机制完成请求的拦截

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值