自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL索引优化+慢查询全解析

联合索引是由多个字段组合而成的索引,例如(a,b,c),表示先按a排序,a相同再按b排序,b相同再按c排序。1. 索引核心:聚簇索引(数据=索引)、非聚簇索引(需回表),覆盖索引是避免回表的关键,主键优先选自增ID;2. 联合索引:严格遵循最左前缀原则,范围查询后列失效,记牢口诀避免踩坑;3. 优化思路:先EXPLAIN分析SQL,再优化索引和SQL,最后调配置、升架构;4. 慢查询:开启后定位慢SQL,核心看3个配置参数,结合EXPLAIN进一步优化;

2026-04-07 22:55:02 644

原创 MySQL核心考点:存储引擎区别+视图详解

数据库崩溃是难免的,能否快速恢复数据至关重要。InnoDB支持崩溃自动恢复,通过Redo Log和Undo Log记录操作,重启后能恢复到崩溃前的状态,无需手动干预。MyISAM不支持崩溃恢复,一旦崩溃,可能需要手动修复,甚至面临数据丢失的风险,这也是它逐渐被淘汰的重要原因之一。● 高并发、需要事务、追求数据安全可靠 → 首选InnoDB(电商、金融、社交等核心业务表必用);● 只读多、写极少、追求极致查询速度 → 可选MyISAM(比如静态网站日志表、历史数据归档表)。

2026-04-07 22:50:46 431 1

原创 Redis缓存三大“坑”:穿透、击穿、雪崩,一文吃透原理与解决方案

缓存穿透,通俗来讲就是“查询一个根本不存在的数据”。因为数据库中没有该数据,所以查询后不会将结果写入Redis缓存,导致每次针对这个不存在数据的请求,都会“穿透”缓存,直接打到数据库上。一旦这类请求量大(比如黑客恶意攻击),数据库就会承受大量无效查询,最终可能被压垮。举个真实场景:某电商平台,黑客通过脚本批量请求不存在的商品ID(比如id=-1、id=9999999),由于Redis和数据库中都没有这些商品的数据,每一次请求都会直达数据库。

2026-04-01 11:44:55 575

原创 Redis架构演进:从主从到Cluster,读懂高可用与分布式核心

单节点Redis存在性能和单点故障隐患→主从复制解决读写分离和数据冗余→哨兵模式解决自动故障转移,实现高可用→Redis Cluster解决写压力集中和在线扩容,适配大型分布式场景。其中,哈希槽是Redis Cluster实现分片的核心,也是Redis与其他分布式存储方案的关键区别;而一致性哈希作为通用的分布式分片算法,了解它与哈希槽的差异,不仅能帮我们更好地理解Redis Cluster,也是面试中的高频考点。

2026-04-01 11:03:03 601

原创 自动化神器Tasker全面指南:从入门到进阶,解放你的双手

根据你定制的“配置文件(Profiles)”,在特定的“场景(Contexts)”下,自动执行指定的“任务(Tasks)”。简单来说,就是你提前设定好“触发条件”和“执行动作”,手机检测到触发条件满足时,就会自动完成对应的动作,全程无需你手动操作。除此之外,Tasker还提供了桌面插件(Widget),支持“点击触发”或“定时触发”,让你无需进入APP,就能快速调用常用任务,进一步提升操作效率。更贴心的是,它支持多款第三方插件,能拓展出更多实用功能,同时完全无需编程基础,新手也能快速上手。

2026-03-31 15:06:06 3013

原创 MySQL事务详解:ACID特性、并发问题与隔离级别实战指南

简单来说,事务就是一组不可分割的数据库操作集合,这组操作要么全部执行成功,要么全部执行失败,不存在“部分成功、部分失败”的中间状态。举个最经典的例子——银行转账:用户A向用户B转账100元,这个操作包含两个核心步骤:① 扣除A账户100元;② 增加B账户100元。这两个步骤必须同时成功,一旦其中一个失败(比如系统崩溃、网络中断),另一个步骤也必须回滚,否则就会出现“A的钱少了,B的钱没多”的尴尬局面,而事务就是用来解决这个问题的。BEGIN;-- 开启事务(也可用START TRANSACTION)

2026-03-30 23:17:29 656

原创 Redis持久化详解:RDB与AOF的核心原理及使用指南

Redis持久化的核心是“平衡数据安全与性能”:RDB以“定时快照”的方式,实现高效备份与恢复,适合对数据完整性要求不高的场景;AOF以“写操作日志”的方式,最大限度保证数据安全,适合对数据敏感的场景。实际开发中,无需过分纠结于“二选一”,根据业务需求灵活选择即可——混合使用RDB和AOF,往往能兼顾安全与性能,既避免数据丢失,又不影响Redis的核心读写能力。

2026-03-30 23:12:50 401

原创 深入理解AQS:Java并发编程的核心基石

AQS的全称是AbstractQueuedSynchronizer,即抽象队列同步器。它不是一个具体的同步工具,而是一个抽象类,提供了一套通用的机制来管理同步状态、阻塞/唤醒线程、维护等待队列。

2026-03-29 23:09:13 445

原创 吃透JMM:原子性、可见性、有序性的底层逻辑与实现方案

在三大特性中,volatile是最常用、也最容易被误解的关键字。很多人以为volatile能保证原子性,但实际上,volatile只保证可见性和有序性,不保证原子性。

2026-03-26 17:44:37 416

原创 深入浅出理解原子操作:从单核到多核的实现原理

简单来说,原子操作就是“不可中断的操作”。这里的“不可中断”,不是指代码执行速度快到无法被打断,而是指操作的“原子性”——无论在什么情况下,它都不会出现“执行了一半”的中间状态。举个生活化的例子:我们给手机充电,要么充电器正常通电(充电成功),要么完全没通电(充电失败),不会出现“充了一半电就突然中断,手机电量停在中间”的情况;原子操作也是如此,比如给变量a赋值为1,要么赋值成功(a=1),要么赋值失败(a还是原来的值),绝不会出现a的值处于“未赋值完成”的模糊状态。

2026-03-26 17:40:18 454

原创 YOLO图像识别全过程:从像素到目标的“一眼识别”魔法

YOLO的本质,就是“把图像拆成小网格,让每个网格负责预测自己地盘里的目标,最后通过筛选去掉重复框”。它用“分工明确、一步到位”的思路,打破了传统算法的速度瓶颈,实现了“又快又准”的目标检测,也让计算机视觉的实时应用变得更加普及。

2026-03-25 14:09:16 860

原创 线程池核心知识点解析:从关闭方式到异常处理全攻略

可以为线程设置自定义名称(如“order-thread-1”)、优先级、守护状态(守护线程/非守护线程)等,便于区分不同业务的线程。

2026-03-24 14:27:02 475

原创 深入理解CAS:无锁编程的核心,面试必考点解析

CAS,全称Compare And Swap(比较并交换),是CPU层面原生支持的原子操作,核心作用是解决多线程环境下变量修改的安全问题,无需手动加锁,比synchronized更轻量、开销更低。先判断内存中变量的当前值,是否和线程预期的旧值一致;如果一致,就把变量替换成新值;如果不一致,就放弃修改,重新尝试。整个过程由CPU保证原子性,不会被其他线程中断,这也是它安全的根本原因。

2026-03-23 10:50:16 590

原创 Java锁升级深度解析:从偏向锁到重量级锁,一文读懂锁的“进化”之路

理解了锁升级的逻辑,我们在实际开发中,就可以根据场景优化代码,让锁的性能达到最优:尽量减少锁的竞争:比如缩小同步代码块范围(只锁需要同步的代码,不锁无关代码),避免大量线程同时争抢同一把锁;适配无竞争/轻度竞争场景:如果是单线程或少量线程交替执行的场景,无需额外操作,JVM会自动使用偏向锁/轻量级锁,无需手动优化;避免轻量级锁自旋浪费:如果锁持有时间较长(比如同步代码块中有IO操作、循环耗时操作),建议直接使用重量级锁(可通过JVM参数关闭偏向锁/轻量级锁),避免自旋消耗CPU;

2026-03-22 22:47:01 600

原创 Java并发避坑:一文搞懂死锁的本质、实例与解决方案

先抛开复杂的概念,我们用一个生活中的场景理解死锁:两个人吃饭,每人手里都拿着一把叉子,却都需要对方手里的勺子才能开动。两个人都不肯先放下自己手里的叉子,也拿不到对方的勺子,就这么一直僵持着——这就是死锁的本质。两个或两个以上的线程,为了争抢同一个或多个共享资源,陷入互相等待的状态。在没有外部干预的情况下,这些线程会一直阻塞,无法继续执行,最终导致程序卡死。再举个线程层面的具体例子:有ThreadA和ThreadB两个线程,它们都需要获取LOCK1和LOCK2两个锁才能完成任务。

2026-03-22 22:35:00 622

原创 Redis通用命令+五大核心数据结构

Redis 的核心竞争力的是“高速读写+灵活的数据结构”,而想要用好 Redis,关键就是:吃透通用命令(搞定基础操作)、掌握五大数据结构(匹配业务场景)。本文讲解的命令和数据结构,是 Redis 最常用、最基础的内容,覆盖了日常开发中 90% 以上的场景。新手可以先熟练掌握这些内容,后续再逐步深入持久化(RDB/AOF)、分布式部署等进阶知识点。

2026-03-21 16:11:30 464

原创 新手入门:NoSQL与Redis核心基础解析

首先要明确,NoSQL并不是“没有SQL”,而是“Not Only SQL”(不仅仅是SQL)。它是相对于传统关系型数据库而言的,是一类非关系型数据库的统称,核心作用是解决传统关系型数据库在特定场景下的局限性。我们先回想一下传统关系型数据库的特点:需要提前定义表结构、表与表之间有明确的关联关系(比如学生表和成绩表通过学号关联),适合数据结构固定、查询逻辑严谨的场景(比如财务系统、教务系统)。

2026-03-21 16:05:07 399

原创 Java集合入门必看:ArrayList与LinkedList常用方法详解(附实战案例)

很多初学者分不清两者的使用场景,核心差异在于底层实现不同,导致查询、增删效率不同,以下是关键差异对比,帮你快速选择:对比维度ArrayListLinkedList底层实现动态数组双向链表查询效率高(O(1),直接通过索引访问)低(O(n),需遍历链表)增删效率低(O(n),需移动后续元素)高(O(1),仅修改指针)内存占用较低(数组存储,无额外指针开销)较高(每个元素需存储前后指针)适用场景查询频繁、增删较少(如数据展示、分页查询)

2026-03-20 21:24:06 316

原创 吃透JVM核心重点:从区域划分到线上问题定位,一篇搞定

JVM的核心重点,本质是“理解内存区域、掌握垃圾回收、学会问题定位”。本文从七大核心模块出发,拆解了JVM区域划分、双亲委派模型、分代回收、垃圾判定、CMS与G1收集器、OOM解决方案、线上问题定位,覆盖面试高频考点和线上实战需求。核心总结:① 内存区域是基础,明确各区域职责和异常表现,才能快速定位OOM;② 双亲委派模型是类加载的安全保障,理解执行流程,就能应对类加载相关面试题;③ 分代回收和垃圾判定是GC的核心,掌握算法差异,就能理解不同收集器的工作原理;

2026-03-20 21:16:28 423

原创 吃透Java后端三大框架:Spring+Spring Boot+MyBatis核心解析

Spring、Spring Boot、MyBatis三大框架,并非孤立存在,而是协同工作、各有侧重:Spring负责核心的Bean管理与解耦,是整个架构的基石;Spring Boot简化开发、一键部署,降低框架使用门槛;MyBatis简化数据库操作,打通数据访问层。三者结合,既能保证项目的可扩展性、可维护性,又能大幅提升开发效率,是Java后端开发的最优组合。

2026-03-20 21:11:35 673

原创 深入浅出理解Spring:从核心思想到实际应用,吃透面试高频考点

Spring的核心价值,在于“解耦”和“简化开发”——通过IoC容器管理对象依赖,通过AOP抽离通用逻辑,让开发者能从繁琐的对象管理、通用逻辑编写中解放出来,专注于业务本身。它不是一个“大而全”的框架,而是一个“轻量级、可扩展”的生态,无论是核心的Spring Core,还是衍生的Spring Boot、Spring Cloud,都基于Spring的核心思想构建。

2026-03-20 21:07:50 367

原创 线上问题定位+JVM核心面试题全解析

核心:一块极小的内存区域,核心作用是记录当前线程正在执行的字节码指令地址(行号)。为什么需要?JVM多线程是CPU轮流调度,线程切换时,CPU需要知道上次执行到哪里,程序计数器为每个线程单独存在,互不干扰,切换后可恢复执行位置。关键考点:唯一不会出现OOM的JVM区域。线程私有,与线程生命周期一致,核心作用是描述Java方法的执行过程,基本单位是栈帧。栈帧包含4部分(必背):局部变量表:存方法内的局部变量(基本类型、对象引用地址)。操作数栈:用于执行运算(如1+1,先入栈1和1,计算后出栈结果)

2026-03-19 15:48:53 453 2

原创 深入剖析JVM垃圾回收:从GC Root到收集器,一篇吃透面试核心

JVM垃圾回收的核心逻辑的是:通过GC Root判断对象可达性,用合适的算法回收死亡对象,通过收集器实现高效回收,最终达到“高吞吐、低停顿”的目标。面试中,重点关注这几个点:GC Root的4种类型、4种引用类型的区别、4种垃圾收集算法的优劣、G1和ZGC的核心特点、三色标记的弊端与解决方案。没有最好的垃圾收集算法,也没有最好的垃圾收集器,只有最合适的——结合业务场景,通过测试和调优,才能让GC发挥最佳性能。

2026-03-19 11:16:58 616

原创 JVM核心知识点部分总结(快速入门)

JVM:Java Virtual Machine,即Java虚拟机。位置:JVM运行在操作系统之上,与硬件没有直接的交互,是连接Java代码与底层系统的桥梁。栈(栈内存):主管Java程序的运行,线程创建时随之创建,生命周期与线程一致,线程结束时栈内存释放,是线程私有的。栈帧(Stack Frame):线程上正在执行的每个方法,都对应一个栈帧,是栈内存的基本单位。

2026-03-18 15:45:17 502

原创 吃透HTTP及相关协议核心区别,从基础到进阶全覆盖

以上就是HTTP及相关协议的核心知识点,涵盖了TCP/UDP、HTTP/HTTPS、GET/POST、数字签名、Session/Cookie等高频考点,每一个知识点都拆解了核心区别和底层原理,兼顾专业性和通俗性。这些知识点不仅是面试中的高频问题,也是日常开发中必备的基础,掌握这些内容,能帮助我们更好地理解网络通信的原理,快速定位开发中的问题(如HTTPS证书异常、Session失效、请求跳转异常等)。

2026-03-17 11:08:03 277

原创 吃透计算机网络10大核心问题,从协议到实操全解析

以上10个问题,涵盖了计算机网络的核心知识点,从OSI七层协议的理论架构,到TCP/IP模型的实际应用,再到TCP的核心机制、DNS解析、URL访问流程,每一个知识点都相互关联,串联起整个网络通信的逻辑。理解这些问题,不仅能应对面试中的高频考点,更能帮助我们理解日常网络应用的底层原理——比如为什么网页加载有时慢、为什么视频直播会卡顿、为什么文件传输需要确认。网络学习的核心是“理解逻辑,而非死记硬背”,希望这篇博客能帮你梳理清楚这些核心知识点,真正吃透计算机网络的底层逻辑,为后续的学习和工作打下坚实的基础。

2026-03-16 17:35:45 1106

原创 深入理解 HashMap 扩容流程:从 1.7 到 1.8 的演进与细节解析

HashMap 的扩容流程,本质上是「空间换时间」的优化策略——通过增加数组容量,分散哈希冲突,保证查询效率的稳定。从 JDK 1.7 到 1.8,扩容机制的每一处优化,都围绕着「提升效率、解决缺陷、平衡性能与内存」展开:触发条件上,1.8 增加了链表树化的前置扩容判断,避免过早树化带来的内存开销。迁移方式上,1.8 用尾插法替代头插法,解决了环形链表问题;用批量拆分替代逐个计算,提升了迁移效率。底层结构上,1.8 引入红黑树,解决了链表过长导致的性能退化问题,让极端场景下的查询性能更稳定。

2026-03-15 22:11:26 404

原创 Java集合核心知识点深度解析:数组与集合区别、ArrayList原理及线程安全问题

本文围绕Java数组与集合的核心区别、集合框架体系、ArrayList动态扩容机制及线程安全问题,进行了全面且深入的解析。数组与集合的差异决定了其适用场景,集合框架的接口体系保证了操作的统一性,而ArrayList的扩容机制和线程安全特性,直接影响开发中的性能和稳定性。掌握这些知识点,不仅能应对面试中的高频问题,更能在实际开发中根据场景选择合适的容器、优化性能、规避并发bug。

2026-03-14 12:15:52 453

原创 面试必背!7个高频Linux指令(附考点+避坑指南)

以上7个指令,是Linux面试中最基础、最高频的考点,不在于“会用”,而在于“会说、会排查、避坑”。面试中,面试官不会只问“这个指令怎么写”,更会追问细节、异常场景处理,比如:ps和top的区别、netstat和ss的区别;kill -9的风险、如何安全杀死进程;日志过滤技巧、端口占用排查流程;chmod数字权限换算、目录与文件的权限差异。记住:面试中,不仅要说出指令用法,还要补充细节和场景,体现你的实际操作经验,这样才能拿到高分。

2026-03-13 14:32:11 712

原创 手写Tomcat改进:线程池的引入意义与核心知识点解析

通过对比两版手写Tomcat代码,我们可以清晰地看到:线程池的引入,从根本上解决了初始版本的并发瓶颈、资源浪费、职责耦合等问题,让Tomcat具备了处理多客户端并发请求的能力,同时提升了系统的稳定性和可维护性。从知识点来看,线程池的核心是“线程复用”和“资源管控”,通过核心参数的配置,实现线程资源的高效利用,避免资源耗尽;其工作流程则围绕“核心线程→任务队列→非核心线程”的顺序,确保任务有序、高效执行。手写Tomcat的过程,也是逐步理解Web服务器底层逻辑的过程。

2026-03-12 14:32:24 484

原创 Java高频面试题(2)深入底层+实战场景

泛型是Java中提升代码复用性、安全性的核心特性,很多初学者会觉得泛型抽象,其实核心是“参数化类型”,通俗来说就是“给类型定义一个参数,使用时再指定具体类型”。具体来说,泛型允许我们在定义类、接口、方法时,使用一个或多个“类型参数”(如<T>、<E>),这些类型参数不指定具体类型,直到使用该类、接口、方法时,再传入具体的类型(如List<String>、Map<Integer, String>)。

2026-03-12 13:27:40 339

原创 Java基础高频面试题(含详细解析+易错点,面试必看)

考察基本类型和包装类的转换机制,核心是“自动装箱/拆箱的底层方法”,避免只知道概念,不了解原理。装箱和拆箱,是Java中基本数据类型和其对应包装类之间的相互转换过程,目的是解决“基本类型无法直接使用在泛型、集合中”的问题。1. 装箱:将基本数据类型转换为对应的包装类类型(如int→Integer、double→Double)。2. 拆箱:将包装类类型转换为对应的基本数据类型(如Integer→int、Double→double)。

2026-03-12 13:08:32 942

原创 高频Docker面试题(含详细解析,面试必过版)

对比维度传统虚拟机(VM)Docker容器虚拟化层级硬件级虚拟化操作系统级虚拟化是否有独立内核有(每个虚拟机有自己的内核)无(共享宿主机内核)资源占用高(GB级内存、存储)低(MB级内存、存储)启动速度慢(几分钟)快(几秒/毫秒)隔离性极强(完全独立)较好(进程级隔离)体积大(几GB-几十GB)小(几十MB-几百MB)从仓库拉取镜像 → 基于镜像创建容器 → 容器运行应用;

2026-03-12 12:56:32 1062 1

原创 高频Nginx面试题(含详细解析,面试必看)

这是Nginx面试的高频应用题,考察对“正向代理”和“反向代理”的区别,以及Nginx实现反向代理的具体配置,回答时需先明确两者的核心差异,再补充Nginx的配置示例和工作流程。定义:当Nginx的多个worker进程同时监听同一个端口(如80端口)时,客户端发起一个连接请求,该连接会触发内核的事件通知,此时所有监听该端口的worker进程都会被唤醒,去争抢这个连接,最终只有一个worker进程能抢到连接并处理,其他被唤醒的worker进程发现没有连接可处理,会重新进入睡眠状态。危害。

2026-03-12 12:43:54 977

原创 从0到1理解K8s:为什么用、怎么设计、如何搭建

看到这里,相信你已经明白:K8s不是“多余的工具”,而是容器化时代的“必备工具”——它解决了容器管理的痛点,实现了应用部署、管理、伸缩的全自动化,是云原生技术的核心基石。先理解“为什么用”,再搞懂“怎么设计”,最后动手“搭建实践”,不要一开始就陷入底层源码和复杂配置,先从基础操作入手,逐步深入。

2026-03-10 21:40:52 623

原创 MyBatis-Plus实战全解析(2):从入门到精通,高效搞定ORM开发

MyBatis-Plus的BaseMapper已封装了大部分基础CRUD操作,但在实际开发中,难免会遇到复杂的查询、联表等场景,此时就需要像MyBatis一样,自定义SQL语句。@Mapper // 标记为MyBatis的Mapper接口,Spring会自动扫描// 自定义方法:根据年龄查询用户(复杂场景可扩展为联表、多条件等)@Autowired// 测试自定义SQL:根据年龄查询用户@Test。

2026-03-06 23:11:55 514

原创 MyBatis-Plus超详细教程,从入门到精通

其核心定位是「增强不改变」,即引入MP后,不会对现有MyBatis工程产生任何侵入性影响,开发者依然可以使用MyBatis的原生语法,同时能享受MP提供的各种便捷功能,彻底摆脱重复的CRUD代码编写。关于多表操作的解决方案,MP提供两种常用思路:方式一:沿用MyBatis的原生方式,编写一对一、一对多、多对多的关联查询SQL;方式二:在Service层通过多次单表条件查询,再通过代码逻辑组装关联数据(适合中小项目,简化SQL编写)。eq:等于(=);ne:不等于(!=);gt:大于(>);

2026-03-05 17:41:51 1110

原创 Docker实操全解析:常用镜像安装+自定义镜像构建

commit命令适合简单的镜像定制,但无法实现版本控制、无法复用构建步骤。Dockerfile是一个文本文件,包含一系列构建指令,可精确控制镜像的构建过程,支持版本控制、批量构建,是企业级开发中定制镜像的首选方式。本文讲解了Docker常用镜像(JDK、Tomcat、MySQL、Nginx)的安装步骤,重点强调了MySQL的数据持久化、Nginx的配置修改和项目部署,以及两种定制镜像的方式(commit命令+Dockerfile)。

2026-03-03 16:06:00 1214

原创 Docker镜像与容器常用操作全解析

本文涵盖了Docker镜像、容器的核心操作,以及网络映射、项目部署的完整流程,所有命令均经过实操验证,适合新手入门和日常实操参考。以下是新手常踩的坑,务必注意:1. 拉取镜像时,不指定版本会默认拉取latest,建议根据项目需求指定具体版本(如mysql:5.7),避免版本兼容问题;2. 删除镜像或容器时,谨慎使用-f强制删除,避免误删正在运行的容器或核心镜像;3. 端口映射时,确保宿主机端口未被占用(可通过netstat -tuln | grep 端口号查看),否则容器启动失败;

2026-03-02 22:10:57 9408

原创 Docker从入门到安装:一篇搞定核心知识点

对比项传统虚拟机Docker容器隔离方式虚拟硬件,运行完整操作系统沙箱机制,共享宿主机内核体积庞大(几GB)小巧(几MB)启动速度几分钟秒级资源消耗高低Docker的核心价值在于“环境隔离”和“可移植性”,它解决了开发与运维之间的环境兼容痛点,让应用部署变得简单、高效。本文从“为什么用Docker”“Docker是什么”“Docker与虚拟机的区别”“Docker架构”“安装实操”“镜像加速”六个方面,梳理了Docker的核心知识点,适合新手入门。

2026-03-02 18:04:40 1315

空空如也

空空如也

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

TA关注的人

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