自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 创建springboot项目默认生成的mvnw和mvnw.cmd文件有什么作用

Maven Wrapper是一个用于管理和包装Maven的工具,它允许你在没有全局Maven安装的情况下使用项目特定的Maven版本。它的作用是确保项目的构建和依赖管理与特定的Maven版本保持一致,从而避免了因为不同的Maven版本而导致的构建问题。`mvnw`和`mvnw.cmd`文件的作用是在项目目录中执行Maven命令,而不需要在系统中安装全局的Maven。因此,`mvnw`和`mvnw.cmd`文件是用于在项目中使用Maven Wrapper来执行Maven命令的实用工具。

2023-09-30 13:54:59 505

原创 MyBatis中#{}和${}的区别

1. `#{}`是预编译的占位符,会将传入的参数值进行预处理,将参数值安全地替换到SQL语句中,可以有效防止SQL注入攻击。2. `${}`是字符串替换的占位符,会直接将传入的参数值字符串替换到SQL语句中,不会进行预处理。但是,由于不进行预处理,使用`${}`占位符可能存在SQL注入的风险,因此需要谨慎使用。综上所述,使用`#{}`可以提供更安全的参数传递方式,能够有效防止SQL注入攻击。而`${}`则更适用于一些不需要进行预处理的场景,但需要注意防范潜在的安全风险。

2023-09-22 15:41:35 89

原创 MyBatis怎么防止sql注入

1. 使用`#{}`占位符:在SQL语句中使用`#{}`占位符来代替传入的参数值,而不是直接拼接参数值到SQL语句中。通过使用动态SQL的条件判断和循环等功能,可以避免直接拼接参数值到SQL语句中,从而减少SQL注入的风险。综上所述,通过使用`#{}`占位符、动态SQL、输入参数校验、预编译语句和限制权限等方法,可以有效地防止SQL注入攻击。5. 限制权限:在数据库层面,可以限制数据库用户的权限,只给予其执行特定操作的权限,避免恶意操作和注入攻击。

2023-09-22 15:41:23 3059

原创 线程阻塞状态能在什么情况下转换成什么状态

3. 计时等待状态(Timed Waiting):当线程调用了带有超时时间的`Thread.sleep()`方法、`Object.wait(long timeout)`方法、`Thread.join(long millis)`方法或`LockSupport.parkNanos()`方法时,线程会从阻塞状态转换为计时等待状态,等待其他线程的通知或特定条件的满足,但有一个超时时间限制。需要注意的是,阻塞状态的转换是由操作系统进行管理和调度的,具体的转换条件和实现可能会因操作系统的不同而有所差异。

2023-09-22 15:41:10 140

原创 线程在操作系统的状态

这些状态是根据线程在执行过程中的不同情况而定义的,操作系统根据线程的状态来进行线程调度和管理。线程的状态会随着线程的执行和等待条件的变化而转换。需要注意的是,不同的操作系统可能对线程状态的定义和实现有所不同。5. 计时等待(Timed Waiting):线程被阻塞,等待其他线程的通知或特定条件的满足,但有一个超时时间限制。3. 阻塞(Blocked):线程被阻塞,等待某个条件的满足,例如等待I/O操作完成或等待获取锁。4. 等待(Waiting):线程被阻塞,等待其他线程的通知或特定条件的满足。

2023-09-22 15:40:24 122

原创 Redis的使用场景

在分布式系统中,通过Redis的SETNX命令可以实现一个互斥锁,保证同一时间只有一个客户端能够执行关键代码段,从而解决分布式环境下的并发问题。这种发布/订阅的方式可以实现简单的消息通信,适用于一些实时性要求不高的场景。6. 分布式会话:在分布式系统中,可以将用户的会话信息存储在Redis中,实现分布式会话。通过将会话信息存储在共享的Redis中,可以实现多个应用服务器之间的会话共享。Redis是一种高性能的内存数据库,它支持多种数据结构,并提供了丰富的功能和灵活的配置选项。

2023-09-22 15:40:08 20

原创 进程和线程的区别

3. 并发性:由于进程之间相互独立,每个进程都有自己的执行流,因此进程可以并发执行,从而提高系统的吞吐量。而线程是进程内的执行单位,多个线程共享同一个进程的执行环境,因此线程之间可以更方便地进行通信和共享数据,实现并发执行。1. 资源占用:进程是程序的执行实例,它拥有独立的内存空间和系统资源(如文件、网络连接等),因此进程之间相互隔离,每个进程都有自己的资源。而线程切换的开销较小,因为线程共享进程的资源,切换时只需要保存和恢复线程的上下文信息即可。

2023-09-22 15:39:57 25

原创 面向对象的开闭原则

为了实现开闭原则,我们可以使用一些设计模式和技术,如抽象、接口、多态、依赖倒置等,来降低代码的耦合性,提高代码的可扩展性。1. 对扩展开放:表示我们应该设计软件实体时考虑到未来可能的变化和扩展,使得新功能的添加或旧功能的修改能够通过扩展而不是修改已有代码来实现。总结起来,开闭原则是面向对象设计中的一个重要原则,要求我们设计的软件实体应该对扩展开放,对修改关闭。2. 对修改关闭:表示我们在设计软件实体时应该尽量避免对已有代码的修改,特别是对已经测试和稳定的代码的修改。

2023-09-22 15:38:43 44

原创 http和https的区别

在实际应用中,需要根据具体的需求和场景选择使用HTTP还是HTTPS,以确保通信的安全性和性能的平衡。一般来说,对于涉及用户隐私和敏感信息的网站,应该使用HTTPS来保护数据的安全。而HTTPS通过使用SSL/TLS协议对数据进行加密和身份验证,确保数据的机密性和完整性,提供更高的安全性。因此,在浏览器中访问HTTP网站时,可以省略端口号,而访问HTTPS网站时需要明确指定443端口。4. 性能:由于HTTPS需要进行加密和解密操作,相比于HTTP,会增加一定的计算和网络开销,导致性能略有下降。

2023-09-22 15:38:29 24

原创 MySQL

在MySQL Workbench中,可以选择要备份的数据库,然后选择“备份”选项,设置备份文件的保存路径和其他选项,最后点击“开始备份”按钮。这些工具提供了更高级的备份功能,如增量备份、并行备份等。需要注意的是,修改`lower_case_table_names`参数的值可能会对现有的数据库和表产生影响,因此在进行修改之前,应该仔细考虑和备份相关数据。其中,``和``是登录MySQL的用户名和密码,``是要备份的数据库名,``是备份文件的保存路径。

2023-09-22 15:38:08 118

原创 InnoDB与MyISAM的区别

此外,MyISAM支持全文搜索索引,可以进行全文搜索,而InnoDB需要使用全文搜索插件。1. 事务支持:InnoDB是一个支持事务的存储引擎,它遵循ACID(原子性、一致性、隔离性、持久性)特性。它支持事务的提交和回滚,并提供了行级锁定,可以避免数据冲突和并发问题。而MyISAM不支持事务,只支持表级锁定。5. 数据备份和恢复:InnoDB支持热备份和增量备份,可以在不停止数据库的情况下进行备份。InnoDB和MyISAM是MySQL中两种常见的存储引擎,它们在性能、事务支持和功能方面有一些区别。

2023-09-22 15:37:56 31

原创 DDL、DML、DQL、DCL

DDL用于定义数据库的结构和对象,DML用于操作数据库中的数据,DQL用于查询数据库中的数据,DCL用于控制数据库的访问权限和安全性。根据具体的需求,可以选择合适的语言来操作和管理数据库。1. DDL(数据定义语言):DDL用于定义数据库的结构和对象,包括创建表(CREATE TABLE)、修改表结构(ALTER TABLE)、删除表(DROP TABLE)等操作。2. DML(数据操作语言):DML用于对数据库中的数据进行操作,包括插入(INSERT)、更新(UPDATE)、删除(DELETE)等操作。

2023-09-22 15:37:43 23

原创 为什么new 一个string之后会创建两个对象

在上述代码中,`str1`和`str2`都是使用字面量方式创建的`String`对象,它们指向的是同一个对象,因为常量池中已经存在相同内容的字符串。而`str3`和`str4`是使用`new`关键字创建的`String`对象,它们指向的是不同的对象,即使内容相同。在上述代码中,`str1`和`str2`都是使用`new`关键字创建的`String`对象,它们指向的是不同的对象,即使内容相同。需要注意的是,使用`new`关键字创建`String`对象时,会在堆内存中创建一个新的对象,而不是在字符串常量池中。

2023-09-22 15:37:28 414

原创 java反射中常用的API

`invoke(Object obj, Object... args)`:调用方法,第一个参数是方法所属的对象,后面的参数是方法的参数。`Method`类:用于表示方法的元数据信息,包括方法的名称、参数类型、返回类型等。- `getDeclaredMethods()`:获取类中定义的所有方法,包括私有方法。`Class`类:用于表示类的元数据信息,包括类的名称、方法、字段等。`Field`类:用于表示字段的元数据信息,包括字段的名称、类型等。- `getReturnType()`:获取方法的返回类型。

2023-09-22 15:35:42 151

原创 spring boot 进行单元测试时注入对象为空

作用是告诉java你这个类通过什么运行环境运行,例如启动和创建spring的应用上下文。

2023-09-20 16:19:46 224

原创 从栈中查找一个数应该怎么做

需要注意的是,由于栈是一种后进先出的数据结构,查找操作并不是栈的主要用途。如果需要频繁进行查找操作,可能需要考虑使用其他数据结构,如数组或链表,以提高查找效率。5. 将元素重新压入原栈:在比较完元素后,将弹出的元素重新压入原栈中,以保持栈的原有顺序。2. 遍历原栈:从原栈中依次弹出元素,每次弹出一个元素后,将其与目标数进行比较。1. 准备一个辅助栈:创建一个空的辅助栈,用于保存从原栈中弹出的元素。3. 比较元素:在每次弹出元素后,将其与目标数进行比较,判断是否相等。

2023-09-16 00:54:26 264

原创 从队列中查找一个数应该怎么做

需要注意的是,队列是一种线性数据结构,通常只支持顺序访问,即只能从队头到队尾依次访问元素。因此,如果需要频繁进行查找操作,可能需要考虑使用其他数据结构,如数组或链表,以提高查找效率。1. 遍历队列:从队列的头部开始,依次遍历队列中的每个元素,直到找到目标数或遍历完整个队列。4. 遍历完整个队列:如果遍历完整个队列都没有找到目标数,表示目标数不存在于队列中。2. 比较元素:在遍历过程中,将每个元素与目标数进行比较,判断是否相等。3. 找到目标数:如果找到目标数,返回该数的位置或索引。

2023-09-16 00:53:21 305

原创 队列和栈的区别

队列(Queue)和栈(Stack)是两种常见的数据结构,它们在数据的存储和访问方式上有一些区别。- 队列:采用先进先出(FIFO)的方式存储数据,即最先进入队列的元素最先被取出。- 队列:允许从队头和队尾分别访问元素,但一般只能在队头删除元素,在队尾插入元素。- 栈:采用后进先出(LIFO)的方式存储数据,即最后进入栈的元素最先被取出。- 队列:元素只能从队尾插入,从队头删除,保持了元素的顺序。- 栈:元素只能从栈顶插入和删除,新插入的元素成为新的栈顶。

2023-09-16 00:51:49 279

原创 数据库事务的四个原则

3. 隔离性(Isolation):每个事务的执行都应该与其他事务的执行相互隔离,使得每个事务感觉自己是唯一在运行的事务。隔离性保证了并发事务的正确性和一致性,避免了并发执行时可能出现的问题,如脏读、不可重复读和幻读等。4. 持久性(Durability):一旦事务提交成功,其所做的修改将永久保存在数据库中,并且对于后续的事务和系统故障是可见的。1. 原子性(Atomicity):事务是一个不可分割的最小工作单元,要么全部执行成功,要么全部回滚到事务开始前的状态,不存在部分执行的情况。

2023-09-16 00:50:25 404

原创 数据库的三大范式

3. 第三范式(3NF):在满足第二范式的基础上,要求数据库表中的非主键字段之间不能存在传递依赖关系。也就是说,每个非主键字段之间应该是互相独立的,不能通过其他非主键字段推导出来。2. 第二范式(2NF):在满足第一范式的基础上,要求数据库表中的非主键字段必须完全依赖于主键。通过遵循这三大范式,可以有效地规范化数据库的结构,减少数据冗余和数据更新异常,提高数据的一致性和查询效率。数据库的三大范式是指关系数据库设计中的三个规范化级别,用于规范化数据库中的数据结构,提高数据的一致性和减少数据冗余。

2023-09-16 00:48:25 604

原创 tcp的三次握手和四次挥手

3. 第三次握手:客户端接收到服务器的SYN-ACK包后,会发送一个ACK(确认)包给服务器,确认号为服务器的初始序列号加1,同时客户端也会发送自己的初始序列号。2. 第二次握手:服务器接收到客户端的SYN包后,会发送一个SYN-ACK(同步-确认)包作为响应,其中包含确认号(ACK)和服务器的初始序列号(ISN)。1. 第一次挥手:当客户端没有数据要发送时,会发送一个FIN(结束)包给服务器,表示客户端已经完成数据的发送。通过这四次挥手,客户端和服务器完成了连接的关闭,释放了连接资源。

2023-09-16 00:47:16 21

原创 cookie和session的区别

2. 数据存储方式:Cookie将数据以键值对的形式存储在客户端的浏览器中,每个请求都会将Cookie发送给服务器。而Session将数据存储在服务器端的内存或磁盘中,客户端只会保存一个Session ID,每个请求通过Session ID来标识对应的Session。4. 存储容量:Cookie的存储容量有限,一般为4KB左右,而Session的存储容量没有明确限制,可以根据服务器的配置和硬件资源进行调整。1. 存储位置:Cookie是存储在客户端(浏览器)中的,而Session是存储在服务器端的。

2023-09-16 00:42:49 153

原创 java八大基础类型

这些基础类型用于存储简单的数据,可以直接在内存中存储和操作,相比于引用类型(如对象),它们具有较低的内存占用和更高的执行效率。此外,Java还提供了对基础类型的封装类(Wrapper Classes),可以将基础类型转换为对象,以便于在面向对象的环境中使用。6. double:8字节,表示双精度浮点数,范围为4.9E-324到1.7976931348623157E308,精度为15位小数。5. float:4字节,表示单精度浮点数,范围为1.4E-45到3.4028235E38,精度为6-7位小数。

2023-09-16 00:40:50 361

原创 JDK JRE JVM的区别

1. JDK(Java Development Kit):JDK是Java开发工具包,它包含了Java编译器(javac)、Java运行时环境(JRE)以及Java开发工具(如调试器和监控工具)等。2. JRE(Java Runtime Environment):JRE是Java运行时环境,它包含了Java虚拟机(JVM)以及运行Java程序所需的核心类库和支持文件。简单来说,JDK是用于开发Java程序的工具包,JRE是用于运行Java程序的环境,而JVM是Java程序运行的引擎。

2023-09-16 00:39:51 116

原创 Redis的基本数据结构

Redis的数据结构不仅仅支持基本的数据存储,还提供了丰富的操作命令和功能,如对数据结构的增删改查、事务、持久化、过期时间设置等。4. 有序集合(Sorted Set):有序的字符串集合,每个元素关联一个分数,可以根据分数进行排序。Redis是一种基于内存的数据存储系统,它支持多种数据结构。6. HyperLogLog:用于基数统计的数据结构,可以估计集合中不重复元素的个数。2. 列表(List):有序的字符串列表,可以在头部或尾部插入、删除元素。3. 集合(Set):无序的字符串集合,不允许重复元素。

2023-09-16 00:39:18 17

原创 Spring Boot的常用注解

4. `@GetMapping`、`@PostMapping`、`@PutMapping`、`@DeleteMapping`:用于分别映射HTTP GET、POST、PUT、DELETE请求的URL路径到相应的处理方法。15. `@Service`、`@Repository`、`@Controller`:用于分别标识一个类是服务层、持久层、控制器层的组件。12. `@Configuration`:用于将一个类标记为配置类,通常与`@Bean`一起使用。11. `@Value`:用于注入配置文件中的属性值。

2023-09-16 00:35:38 38

原创 HashMap

除了上述常用方法外,`HashMap`还提供了其他一些方法,如`keySet()`返回所有键的集合,`values()`返回所有值的集合,`entrySet()`返回所有键值对的集合等,用于方便地进行遍历和操作。需要注意的是,由于`HashMap`是非线程安全的,如果在多线程环境下使用,需要进行额外的同步处理,或者使用线程安全的`ConcurrentHashMap`。总之,`HashMap`是Java集合框架中常用的存储键值对的数据结构,具有高效的插入、删除和查找操作,适用于大多数的键值对存储需求。

2023-09-16 00:32:30 41 1

原创 java的集合

除了以上常用的集合类,Java还提供了一些其他的集合类和接口,如SortedSet、SortedMap、PriorityQueue等,以及一些辅助类如Collections和Arrays,用于提供集合操作的工具方法。3. Map(映射):键值对的集合,每个键只能对应一个值,常用的实现类有HashMap、LinkedHashMap和TreeMap。4. Queue(队列):先进先出(FIFO)的集合,常用的实现类有LinkedList和ArrayDeque。

2023-09-16 00:28:21 39 1

原创 MySQL索引失效的情况

例如,如果你有一个索引在`name`列上,但查询条件是`age > 30`,那么这个查询将不会使用到`name`索引。4. 使用LIKE操作符的模糊查询:如果使用`LIKE`操作符进行模糊查询,并且通配符(`%`)在开头,例如`WHERE name LIKE '%John'`,MySQL将无法使用索引。2. 对索引列进行函数操作:如果在查询条件中对索引列进行了函数操作,例如`WHERE UPPER(name) = 'JOHN'`,MySQL将无法使用索引,因为函数操作会使索引失效。

2023-09-16 00:26:51 122 1

原创 MyBatis的三级缓存

当不同的SqlSession执行相同的SQL语句时,会先从二级缓存中获取结果,如果缓存中没有,则再去数据库查询,并将查询结果放入缓存中。它是基于SqlSession的,即在同一个SqlSession中,如果执行相同的SQL语句,那么第二次以后的查询将直接从缓存中获取结果,而不再去数据库查询。3. 三级缓存:MyBatis的三级缓存是指基于SessionFactory级别的缓存,也称为定制缓存。需要注意的是,虽然MyBatis提供了缓存机制来提高性能,但缓存也可能导致数据不一致的问题。

2023-09-16 00:24:23 323 1

原创 Linux中的关机命令

在Linux中,关机命令通常是`shutdown`或`poweroff`。这两个命令可以用来正常关机系统。这些命令可以根据需要选择使用,具体使用哪个命令取决于你的Linux发行版和个人偏好。上述命令中,`poweroff`命令用于关机,`init 0`命令也可以用于关机。上述命令中,`-h`选项表示关机,`-r`选项表示重启,`now`表示立即执行。需要注意的是,执行关机命令通常需要具有root权限或使用`sudo`命令。

2023-09-15 20:40:35 559

原创 java读取属性文件

在上述代码中,`config.properties`是属性文件的名称,`property.name`是需要获取的属性值的键。使用`Properties`类的`load`方法可以将属性文件加载到`Properties`对象中,然后使用`getProperty`方法获取属性值。可以使用绝对路径或相对路径来指定属性文件的位置。在纯Java中,可以使用`java.util.Properties`类来读取属性文件。总之,在纯Java中可以使用`Properties`类来读取属性文件,并通过键来获取属性值。

2023-09-15 20:38:28 188

原创 springboot中怎么拿到属性的值

2. 使用`Environment`对象:可以通过注入`Environment`对象来获取属性的值。1. 使用`@Value`注解:通过在需要获取属性值的字段或方法上添加`@Value`注解,并指定属性的名称,即可将属性值注入到对应的字段或方法参数中。总之,通过使用`@Value`注解或`Environment`对象,可以方便地获取Spring Boot应用中配置的属性值。在Spring Boot中,可以通过使用`@Value`注解或`Environment`对象来获取属性的值。

2023-09-15 20:35:47 347

原创 创建线程的方式

2. 实现Runnable接口:创建一个类,实现Runnable接口,并实现其run()方法。然后通过创建该类的实例,将其作为参数传递给Thread类的构造函数,再调用start()方法来启动线程。1. 继承Thread类:创建一个类,继承自Thread类,并重写run()方法。3. 使用匿名内部类:可以在创建Thread类的实例时,使用匿名内部类来重写run()方法,从而实现线程的创建和启动。以上是常用的创建线程的方式,每种方式都有其适用的场景和特点,根据具体需求选择合适的方式来创建线程。

2023-09-15 20:32:58 11

原创 springboot如何进行事务管理,不用注解如何配置

此外,Spring Boot还提供了其他一些注解来进行更细粒度的事务管理,如`@Transactional(propagation = Propagation.REQUIRED)`用于指定事务的传播行为,`@Transactional(readOnly = true)`用于指定事务的只读属性等。通过以上步骤,Spring Boot会自动为被`@Transactional`注解标记的方法或类创建事务,并在方法执行前开启事务,在方法执行后根据方法的执行结果进行事务的提交或回滚。

2023-09-15 20:28:04 457

原创 MySQL 事务的状态

在执行`START TRANSACTION`或者`BEGIN`语句后,事务进入开始状态。在执行`ROLLBACK`语句或者发生错误时,事务进入回滚状态。通过监视事务的状态,可以了解事务的执行情况,并根据需要进行相应的处理。3. 部分提交(PARTIALLY COMMITTED):事务的一部分操作已经提交,但尚未完成整个事务。在执行`COMMIT`语句后,事务进入提交状态。2. 活动(ACTIVE):事务正在进行中的状态。6. 失败(FAILED):事务执行过程中发生错误,导致事务无法继续执行。

2023-09-15 20:24:25 213

原创 MyBatis-Plus 和 MyBatis 的区别

总的来说,MyBatis-Plus在MyBatis的基础上提供了更多的功能和便捷的开发方式,可以减少开发工作量,提高开发效率。但同时,MyBatis-Plus也增加了一定的学习成本,需要熟悉其提供的API和用法。1. CRUD操作简化:MyBatis-Plus提供了BaseMapper接口,通过继承该接口,可以直接使用其中的通用CRUD方法,无需编写SQL语句。MyBatis-Plus(简称MP)是在MyBatis基础上进行封装和扩展的一款持久层框架,它提供了一系列的增强功能和便捷的开发方式。

2023-09-15 20:03:57 634

原创 MySQL索引

【代码】MySQL索引。

2023-09-15 20:01:35 16

原创 MySQL的事务隔离级别

(Repeatable Read):事务在执行期间看到的数据保持一致,即使其他事务对数据进行了修改,也不会被当前事务读取到,解决了不可重复读的问题,但可能会出现幻读的问题。(Read Uncommitted):最低级别的隔离级别,事务可以读取其他事务未提交的数据,可能会出现脏读、不可重复读和幻读的问题。(Read Committed):事务只能读取其他事务已提交的数据,解决了脏读的问题,但可能会出现不可重复读和幻读的问题。需要注意的是,不同的数据库引擎对事务隔离级别的支持可能有所不同。

2023-09-15 19:34:05 128

原创 内连接和外连接有什么区别和联系

内连接的结果集只包含连接的列,而外连接的结果集包含连接的列和不满足连接条件的列(为空值或NULL)。内连接只返回满足连接条件的行,而外连接除了返回满足连接条件的行,还包括了不满足连接条件的行。内连接和外连接都是用于将多个表进行连接操作,根据连接条件将满足条件的行连接在一起。内连接和外连接都是用于在SQL中进行表连接操作,将满足连接条件的行连接在一起。内连接只返回满足连接条件的行,而外连接还包括了不满足连接条件的行。内连接只返回满足连接条件的行,外连接还包括了不满足连接条件的行。

2023-09-14 15:22:06 3663 1

JSP综合案例:图书管理系统

JSP综合案例:图书管理系统

2023-08-19

Servlet案例:学生查询成绩

Servlet案例:学生查询成绩

2023-08-15

Servlet案例:学生查询成绩

Servlet案例:学生查询成绩

2023-08-14

锅打灰太狼(源码,内含图片)

锅打灰太狼(源码,内含图片)

2023-08-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除