自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Object类的常见方法有那些?2024/9/28/19/37

【代码】Object类的常见方法有那些?

2024-09-28 20:28:15 25

原创 关联关系映射202409281652

在MyBatis中,我们可以使用<select>标签来定义子查询,并通过resultMap将查询结果映射到对象中。在MyBatis中,我们可以使用<select>标签来定义子查询,并通过resultMap将查询结果映射到对象中。嵌套结果映射是指将主表和关联表的查询结果分别映射到不同的对象中,并通过对象之间的关系建立关联。嵌套结果映射是指将主表和关联表的查询结果分别映射到不同的对象种,并通过对象之间的关系建立关联。嵌套结果映射是指将主表和关联表的查询结果分别映射到不同的对象中,并通过对象之间的关系建立关联。

2024-09-28 20:01:46 236

原创 关于关系映射的一些建议 2024-9-28-16-42

在定义Java对象时,尽量使用包装类而不是基本类型,以避免空指针异常。在编写SQL语句时,尽量要使用参数化查询,以避免SQL注入攻击。在执行数据库操作时,尽量使用事务来保证数据一致性和完整性。尽量使用基于注解的关系映射方式,因为它更加简洁和灵活。

2024-09-28 16:49:55 44

原创 如何使用MyBatis进行关系映射?2024/9/28 16:35

1.引入MyBatis的依赖:在项目的配置文件中添加MyBatis的依赖,以便能够使用MyBatis的功能。4.定义Java对象:定义于数据库表对应的Java对象,并在对象的属性上添加注解和在XML文件中进行配置。5.执行数据库操作:通过MyBatis提供的API,执行数据库操作,包括查询,插入,更新,删除等操作。3.编写SQL语句:根据业务需求,编写对应的SQL语句,包括查询,插入,更新,删除等操作。2.配置数据库连接信息:在配置文件中添加数据库的连接信息,包括URL,用户名,密码等。

2024-09-28 16:41:34 100

原创 MyBatis的关系映射方式

通过这个XML文件,MyBatis可以根据配置信息自动生成对应的SQL语句,并将查询结果映射到Java对象上。在基于XML配置的方式中,我们需要编写一个XML文件来描述数据库和Java对象之间的映射关系。MyBatis提供了两种主要的关系映射方式:基于XML配置和基于注解。SQL语句:包括查询,插入,更新,删除等操作的SQL语句。数据库连接信息:包括数据库的URL,用户名,密码等。结果映射:将查询结果映射到Java对象的属性上。1.基于XML配置的关系映射。

2024-09-28 16:31:12 55

原创 什么是关联关系映射

在MyBatis中,通过association元素来处理对象与对象之间的关联关系,association元素提供了一系列属性用于维护数据表之间的关系。association元素是resultMap元素的子元素,它有两种配置方式,嵌套查询方式和嵌套结果映射。关联关系映射是指在数据库表之间建立关联关系,并将这种关系映射到对象之间的关系。在关系型数据库中,我们通常使用外键来建立表与表之间的关联。

2024-09-28 16:07:35 18

原创 深拷贝和浅拷贝区别了解吗?什么是引用拷贝?2024/9/28

浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象混入原对象共用同一个内部对象。这里我们简单对Person类的clone()方法进行修改,连带着要把Person对象内部的Address对象一起复制。从输出结构就可以看出,显然,person1的克隆对象和person1包含的Address对象已经是不同的了。深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。那什么是引入拷贝呢?

2024-09-28 15:56:01 247

原创 接口和抽象类有什么共同点和区别?20240928

Java8引入的static方法无法再实现类中被覆盖,只能通过接口名直接调用(MyInterface.staticMethod()),类似于类中的静态方法。在Java8及以上版本中,接口引入了新的方法类型:default方法,static方法和private方法。实例化:接口和抽象类都不能直接实现,只能被实现(接口)或继承(抽象类)后才能创建具体的对象。Java8引入的default方法用于提供接口方法的默认实现,可以在实现类中被覆盖。但一个类可以实现多个接口,一个接口也可以继承多个其他接口。

2024-09-28 15:26:10 179

原创 面向对象三大特性

通过使用继承,可以快速地创建新的类们可以提高代码的重用,程序的可维护性,节省大量创建新类的时间,提高代码的重用,程序的可维护性,节省大量创建类的时间,提供我们的开发效率。继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。如果子类重写了父类的方法,真正执行的是子类重写的方法,如果子类没有重写父类的方法,执行的是父类的方法。多态,顾名思义,表示一个对象具有多种的状态,具体表现为父类的引用指向子类的实例。

2024-09-28 10:46:25 152

原创 构造方法有那些特点?是否可被override?

因此,一个类中可以有多个构造方法,这些构造方法可以具有不同的参数列表,以提供不同的对象初始化方式。构造方法不能重写(override),但可以被重载(overload).自动执行:在生成类的对象时,构造方法会自动执行,无须显示调用。没有返回值:构造方法没有返回类型,且不能使用void声明。名称与类名相同:构造方法的名称必须与类名完全一致。

2024-09-28 09:45:01 49

原创 如果一个类没有声明构造方法,该程序能正确执行吗?2024-9-28

如果我们重载了有参的构造方法,记得都要把无参的构造方法也写出来(无论是否用到),因为这可以帮助我们在创建对象的时候少踩坑。我们一直在不知不觉地使用构造方法,这也是为什么我们在创建对象的时候后面要加入一个括号(因为要调用无参的构造方法)。如果我们自己添加了类的构造方法,(无论是否有参),Java就不会添加默认的无参数的构造方法了。因为一个类即时没有声明构造方法也会有默认的不带参数的构造方法。构造方法是一种特殊的方法,主要作用是完成对象的初始化工作。如果一个类没有声明构造方法,也可以执行!

2024-09-28 09:39:19 52

原创 Java基础常见面试题总结(中)2024/9/27

面向对象和面向过程的区别面向过程编程(Procedural-Oriented Programming,POP)和面向对象编程(Object-Oriented Programming,OOP)是两种常见的编程范式,两者的主要区别在于解决问题的方式不同:面向过程编程(POP):面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。面向对象编程(OOP):面向对象会先抽象出对象,然后用对象执行方法的方式解决问题相比较于POP,OOP开发的程序一般具有下面这些优点。

2024-09-28 09:15:06 269

原创 Java基础常见面试题总结(上)

在Java中,JVM可以理解的代码就叫做字节码(即扩展名.class的文件),它不面向任何特定的处理器,只面向虚拟机。Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以,Java程序运行时相对来说还是高效的(不过,和C,C=++,Rust,Go等语言还是有一定差距的),而且,由于字节码并不针对一种特定的机器,因此,Java程序无须重新编译便可在多种不同操作系统的计算机上运行。

2024-09-27 20:54:51 694

原创 常见面试自测20240926

在《Java面试指北》的【技术面试题自测篇】,我总结了Java面试中最重要的知识点的最常见的面试题并按照面试提问的方式展现出来。面试之前,强烈建议大家多拿常见的面试题来进行自测,检查一下自己的掌握情况,这是一种非常实用的备栈技术面试小技巧。每一道用于自测的面试题我都会给出重要程度,方便大家在时间比较紧张的时候根据自身情况来选择性自测。在面试中如果你实在没有头绪的话,一个好的面试官也是会给你提示的。并且,我还会给出提示。方便你回忆对应的知识点。

2024-09-26 16:26:02 177

原创 优质面经汇总2024-9-26

2.给出的参考资料基本都是我的原创,假如后续我想对面试问题的答案进行完善,就不需要挨个把之前的面经写的答案给修改了(面试中的很多问题都是比较类似的)。在《Java面试纸杯》的【面积篇】,我分享了15+编高质量的Java后端面经,有校招的,也有社招的,有大厂的,也有中心厂的。当然了,我的原创文章也不太可能覆盖到面试的每个点,部分面试问题的答案,我是精选的其他技术博主写的优质文章,文章质量都很高。想不予牛客或者其他网站的面经,《Java面试纸杯》中整理的面经质量更高,并且,我会提供优质的参考资料。

2024-09-26 16:11:22 239

原创 项目经验指南2024-9-26

代码质量这里就不提了,更重要的是你要尽量让自己的项目有一些亮点(比如你是如何提升项目性能的,如何解决项目中存在的一个痛点),项目经历取得的成果尽量要量化一下比如我使用xxx技术解决了xxx问题,系统qps从xxx提高到了xxx.你可以参考Java优质开源实战项目上面推荐的实战类1开源项目,质量都很高,项目类型也比较全面,涵盖博客/论坛系统,考试/刷题系统,商城系统,权限管理系统,快速开发脚手架以及各种轮子。甚至所,有很多有工作经验的程序员,对自己在公司做的项目不满意,也想找一个比较有技术含量的项目来做。

2024-09-26 15:22:01 638

原创 Java面试重点总结(重要)2024-9-26

比如说你要去阿里这种公司的话,项目和八股文就是重点,阿里笔试一般会有代码题,进入面试后就很少问代码题了,但是对原理性的问题问的比较深,经常会问一些你对技术的思考。如果你的技能介绍或者项目经历涉及到分布式/微服务,高并发的知识,那建议你尽量也要抽时间去认真准备一下,面试中很可能会被问到,尤其是项目经历用到的时间。5.JVM相关的知识点,一般是大厂(例如美团,阿里)和一些不错的中厂(例如携程,顺丰,招银网络)才会问到,面试国企,差一点的中厂和小厂就没必要准备了。效率最低,对自身帮助也最小!

2024-09-26 13:41:35 443

原创 程序员简历编写指南2024-9-25

一般情况下你的简历上注明你会的东西才会被问到(Java基础,集合,并发,MySQL,Redis,Spring,Spring Boot这些算是每个人必问的),比如写了你熟练使用Redis,那面试官就很大概率会问你Redis的一些问题,再比如你写了你的项目中使用了消息队列,那面试官大概率问很多消息队列相关的问题。虽然收费只有培训班/训练营的百分之一,但是知识星球里的内容质量更高,提供的服务也更全面,非常适合准备Java面试和学习Java的同学。

2024-09-26 12:04:05 554

原创 手把手教你如何准备Java面试(重要)

这些技术你吃透了没有?举个例子,你的项目经历使用了Seata来做分布式事务,那seata相关的问题你要提前准备一下吧,比如说Seate支持那些配置中心,Seate的事务分组是怎么做的,Seata支持那些事务模式,怎么选择?一般是只能投递一个岗位,不过,也有极少数投递不同部门两个岗位的情况,这个应该不会有影响,但你的前一次面试情况可能会被记录,也就是说就算你投递成功两个岗位,第一个岗位面试失败的话,对第二个岗位也会有影响,很可能直接就被pass。另一份对技术面试官说的,主要讲自己会的技术细节和项目经验。

2024-09-25 19:55:47 949

原创 MyBatis框架的关联映射

假设有两个表:user(用户表)和user_details(用户详细表),其中每个用户都有对应的详细信息。涉及两个表的多对多关系,通常需要中间表来管理,可以通过<collection>定义在关联的结果集中。MyBatis的关联映射功能非常强大,可以灵活地处理不同类型的关系,提供了清晰的数据访问层设计。用途:表示用户和角色之间的关系,每个用户可以有多个角色,每个角色也可以有多个用户。用途:用来表示两个表之间的一个记录对应一个记录的关系,比如用户和用户详细信息。

2024-09-25 16:55:38 376

原创 使用建议2024-9-25

对于不准备面试的同学来说,本文档倾向于给你提供一个比较详细的学习路径,目录清晰,让你对于Java整体的知识体系有一个清晰认识。你可以跟着视频,书籍或者官方文档学习完某个知识点之后,然后来这里找对应的总结,帮助你更好地掌握对应的知识点。甚至说,你在有编程基础的情况下,想要学习某个知识点的话,可以直接看我的总结,这样学习效率会非常高。最后,准备技术面的同学一定要定期复习(自测的方式非常好),不然确实会遗忘的。另外,记录博客用自己的理解把对应的知识点讲给别人听也是不错的选择。对于准备面试的同学来说,

2024-09-25 08:09:43 190

原创 组合式异步编程2024-9-24

组合式编程在Java8这通过CompletableFature提供了强大的异步任务管理能力、

2024-09-24 22:22:45 253

原创 Java 8的日期和时间API 2024-9-24

这个API提供了更简洁和更安全的日期时间操作方式,避免了旧版API的许多问题。java8引入了全新的日期和时间API,主要在java.time包中。修改日期和时间的方法通常以with或plus、minus开头。Duration:用于表示时间间隔(例如,小时,分钟,秒)LocalDate:表示没有时区的日期(年,月,日)LocalTime:表示没有时区的时间(时,分,秒)ZonedDateTime:表示带时区的日期和时间。Period:用于表示日期间隔(例如,年,月,日)1. 表示日期和时间。

2024-09-24 20:04:30 261

原创 Mybatis一级,二级缓存 2024-9-24

相同的查询语句和参数在同一个SqlSession内,MyBatis会直接从缓存中获取数据,避免重复查询数据库。作用范围:一级缓存是SqlSession级别的缓存,也就是说,每个SqlSession都有自己的缓存。对于相同的查询,在不同的SqlSession中,如果二级缓存存在,MyBatis会从中获取数据。作用范围:二级缓存是Mapper级别的缓存,多个SqlSession可以共享同一个二级缓存。通过合理配置一级和二级缓存,可以显著提升应用的性能,减少数据库的负担。二级缓存需要显示开启和配置。

2024-09-24 18:23:10 184

原创 单点登入这块怎么实现的2024-9-24

1.身份验证中心:建立一个身份验证中心(如OAuth2.0、OpenID Connect等),用于管理用户的认证和授权。通过将Session存储在共享的Redis或数据库中,使得各个应用可以共享用户的登录状态。在身份验证中心登录时生成一个JWT或其他类型的Token,并返回给用户。如果请求没有有效的Token,重定向用户到身份验证中心进行登录。用户在身份验证中心进行登录,输入凭证(如用户名和密码)如果存在令牌,应用会向身份验证中心验证该令牌的有效性。用户访问其他应用时,应用会检查是否存在有效的令牌。

2024-09-24 18:05:21 258

原创 权限认证是如何实现的2024-9-24

在Spring Boot中,通常使用Spring Security来实现权限与控制,提供了全面的功能和灵活的配置选项。在请求到达控制器之前,可以使用中间件或拦截器来检查请求中包含的令牌是否有效,并验证用户的权限。每个用户可能有不同的角色(如管理员,普通用户等),不同角色可以访问不同的资源。用户登录时,系统会验证输入的凭据(如用户名和密码)与数据库中的记录是否匹配。结合其他因素,如短信验证码,电子邮件验证码,指纹或面部识别,以增强安全性。用户注册时,收集必要的信息(如用户名,密码等),并将其存储在数据库中。

2024-09-24 16:28:04 181

原创 上传数据的安全性你们怎么控制?2024-9-24

7.使用安全的传输协议:使用HTTPS等安全协议进行数据传输,防止数据在传输过程中被窃取。4.身份验证和权限控制:确保只有经过身份验证的用户才能上传文件,并根据用户角色控制权限。1.文件类型限制:限制可上传的文件类型,例如只允许特定的图片或文档格式。5.数据加密:在传输和存储过程中对敏感数据进行加密,保护数据的隐私。3.病毒扫描:在服务器端对上传的文件进行病毒扫描,确保文件安全。6.内容过滤:对上传的内容进行过滤,防止恶意代码或脚本注入。2.文件大小限制:设置最大文件大小,防止上传过大的文件。

2024-09-24 15:47:19 105

原创 遇到了那些比较棘手的问题,怎么解决的2024-9-24

解决方法:检查pom.xml或build.gradle文件,确保使用兼容的依赖版本,或者使用maven dependency:tree命令查看依赖关系。解决方法:确保对象字段有对应的getter/setter方法,检查使用的JSON库(如Jackson或Gson)的配置。解决方法:确保正确配置了MyBatis的缓存使用,检查缓存键的生成逻辑,确认数据已经成功存入Redis。解决方法:检查数据库连接字符串,用户名和密码是否正确,确保数据库服务正在运行,并检查网络配置。4.JSON序列化/反序列化问题。

2024-09-24 15:35:15 158

原创 你们项目中日志怎么采集2024-9-24

Docker Logging Drivers:Docker支持多种日志驱动,可以将容器日志直接发送到日志系统(如gelf,fluentd,json-file等)log4j/Logback:Java项目常用的日志框架,支持多种日志级别,输出格式和输出目标(如控制台,文件,数据库)AWS CloudWatch:用于监控和日志记录,支持从AWS资源和应用程序中收集日志。通过这些方式和工具,可以有效地采集和管理项目中的日志,便于后续的分析和排查。配置日志文件路径,日志级别和日志格式。可以使用异步日志来提高性能。

2024-09-24 14:30:06 185

原创 常见日志的命令2024-9-24

awk '/2024-09-24/{flay=1}/2024-09-25/{flag=0} flag' /var/log/syslog:查找特定日期的日志。tail -f path/to/your/logfile.log:实时查看指定日志文件。查看指定路径的日志文件:tail -f /path/to/logs/app/log。tail -n 100 /var/log/messages:查看最近100行日志。tail -f /var/log/syslog:实时查看系统日志。使用PowerShell。

2024-09-24 13:48:34 88

原创 生产问题怎么排查2024-9-24

1.收集信息:获取用户反馈,错误日志和监控数据,了解问题的具体表现和发生频率。2.设定优先级:根据问题的严重程序和影响范围设定优先级,优先处理关键问题。2.确定影响范围:识别受影响的系统,功能和用户,优先处理影响较大的问题。1.团队协助:与开发,运维和测试密切合作,集思广益,共同分析和解决问题。1.记录解决方案:详细记录问题分析和解决过程,形成知识库,便于未来查阅。1.分类问题:将问题按照类型(如性能,功能,配置等)进行分类。2.预防措施:分析问题根源,提出改进措施,减少类似问题的发生。

2024-09-24 13:33:14 205

原创 怎么快速定位系统的拼接?2024-9-23

通过实时监控,性能分析,负载测试和优化措施,可以有效识别和解决系统中的性能瓶颈,确保系统的稳定性和高效性。VisualVM,JProfiler,YourKit:分析CPU和内存使用,查找性能热点。同时,建立持续的监控和优化机制,有助于预防潜在的性能问题,提升整体系统的可靠性和用户体验。无论是软件应用,硬件系统还是网络环境,识别和解决瓶颈问题都需要系统化的方法和有效的工具。4.优化迭代:根据监控数据和业务需求,持续优化系统性能,保持系统的高效运行。

2024-09-24 10:17:01 342

原创 企业简历筛选规则2024-9-23

企业在筛选简历时,应综合考虑候选人的教育背景,工作经验,技能匹配,简历格式及个性化程序等多个方面。为了吸引优秀人才,企业应制定明确,合理的筛选规则,并不断优化招聘流程,以确保找到最适合的候选人。技能:如编程语言,项目管理,数据分析等,与职位描述中提到的技能匹配。外语水平:根据职位需求,是否具备必要的外语能力,如英语,日语等。持续学习:是否有持续学习和自我提升的记录,如在线课程,研讨会等。硬技能:如编程语言,软件使用,数据分析等,是否符合职位需求。软技能:如沟通能力,团队合作,问题解决能力等,是否突出展示。

2024-09-23 20:58:56 406

原创 如何实现一个IOC容器2024-9-23

IOC(Inversion of Control)是一种设计原则,用于将对象的创建和管理的控制权从代码中反转出来,由IOC容器负责。通过上述步骤,我们实现了一个基本的IOC容器,能够扫描指定包下的组件,进行依赖注入并管理对象的生命周期。在实际开发中,建议使用成熟的IOC框架,因为它们提供了丰富的功能和优化,能够满足复杂应用的需要。通过IOC容器,组件之间的依赖关系可以通过配置或注解来管理,从而实现松耦合和更容易的测试。依赖注入(DI)是实现IOC的一种方式,主要包括构造器注入,Setter注入和接口注入。

2024-09-23 20:05:48 364

原创 HashMap和HashTable区别 2024-9-23

迭代器(Iterator):提供了fail-fast的迭代器,如果在迭代过程中结构被修改(除了通过迭代器自身的remove方法),会抛出ConcurrentModificationException。说明:所有的关键方法(如put,get等)都是同步的(synchronized),因此在多线程环境下可以安全使用。同步方式:Hashtable的所有公共方法都是同步的,使用内置的锁(monitor)来保证线程安全。方法较少:作为早期的类,Hashtable没有引入许多现代集合框架中的新方法。

2024-09-23 17:18:44 507

原创 sleep和wait区别,2024-9-23

用途:使当前线程进入等待状态,直到其他线程调用同一对象的notify()或notifyAll()方法。影响:如果线程在持有锁的情况下调用sleep,其他需要该锁的线程将无法获取锁,直到睡眠时间结束或线程主动释放锁。在编程中,sleep和wait方法常用于控制线程的执行,但他们在使用场景,行为和机制上存在显著差异。理解sleep和wait的区别有助于在多线程编程中正确选择合适的方法,从而实现高效和安全的线程控制。需要持有锁:必须在同步块或同步方法中调用,即当前线程必须持有对象的监视器锁。

2024-09-23 15:34:01 206

原创 为什么HashMap的容量是2的倍数呢?2024-9-23

2的整数次幂(或者叫2的整数倍)刚好是偶数,偶数-1是奇数,奇数的二进制最后一位是1,保证了hash&(length-1)的最后一位可能为0,也可能为1(取决于hash的值),即&运算后的结果可能为偶数,也可能为奇数,这样可以保证哈希值的均匀分布。HashMap在定位元素位置时,先通过hash(key)=(h =key.hashCode())^(h>>16)计算出哈希值,再通过hash&(n-1)来定位元素位置的,n为数组的大小,也就是HashMap的容量。

2024-09-23 14:33:41 193

原创 为什么hash函数能降哈希碰撞?2024-9-23

其作用就相当hash%n,n为数组的长度,比如说数组长度是16,hash值为20,那么20%16 =4,也就是说20这个元素应该放在数组的第4个位置;比如说hash&($2^{4} -1$)的结果实际上是取hash的低4位,这四位能表示的取值范围刚好是0000到1111,也就是0到15,正好是数组长度为16的下标范围。异或--------------------------------------------------------

2024-09-23 14:21:18 285

原创 2024-9-23 java八股文

适用于需要精细控制的事务逻辑:当事务行为需要根据特定条件进行复制控制时,编程式事务更为合适。易出错:手动管理事务容易导致漏写提交和回滚的代码,增加了发生错误的风险。2.封装:封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。更加灵活:开发者可以根据具体的业务逻辑细节对事务进行精细控制。代码冗长:需要手动编写大量的事务管理代码,增加了代码复杂性。定义:编程式事务是指通过显示的编程代理来管理事务的开始,提交和回归。3.多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。

2024-09-23 10:39:22 182

原创 2024-9-22 Map

如果只重写equals方法,没有重写hascode方法,那会导致equals相等的两个对象,hashcode不相等,这样的话,这两个对象会被放到不同的桶中,这样就会导致get的时候,找不到对应的值。其作用就相当于hash%n,n为数组的长度,比如说数组长度是16,hash值位20,那么20%16=4,也就是说20这个元素应该放在数组的第4个位置;HashMap的哈希函数是先拿到key的hashcode,是一个32位的int类型的数值,然后让hashcode的高16位和低16位进行异或操作。

2024-09-23 10:39:20 333

空空如也

空空如也

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

TA关注的人

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