自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(144)
  • 资源 (1)
  • 收藏
  • 关注

原创 计算机网络之应用层

计算机网络之应用层一、应用层协议原理网络应用体系结构客户-服务器体系结构P2P体系结构进程通信客户和服务器进程进程与计算机网络之间的接口进程寻址可供应用程序使用的运输服务TCP服务UDP服务二、Web和HTTPHTTP概况一、应用层协议原理网络应用体系结构客户-服务器体系结构有一个总是打开的主机称为服务器,它服务于来自许多其他称为客户的主机的请求,客户之间不直接通信,服务器具有固定的、周知的地址,该地址称为IP地址。P2P体系结构应用程序在间断连接的主机对之间使用直接通信,这些主机被称为对等方。

2022-01-16 15:44:14 1987

原创 Java并发包中ThreadLocalRandom类原理剖析

Java并发包中ThreadLocalRandom类原理剖析一、Random类的局限性二、ThreadLocalRandom一、Random类的局限性Random类产生随机数的两个步骤根据老的种子生成新的种子根据新的种子计算新的随机数在并发条件下,由于Random类在产生新种子的时候不是原子性操作,这就可能导致多个线程拿到了相同的新种子,产生了相同的随机数,破坏了随机性。random函数使用了一个原子变量能够让新的种子被计算出来之后,其他线程丢弃自己老的种子,而使用新产生出来的种子作为老种子计

2022-01-15 11:58:10 331

原创 并发编程的其他基础知识

并发编程的其他基础知识一、多线程并发编程二、多线程并发编程的好处三、Java中的线程安全问题四、Java中共享变量的内存可见性问题五、Java中的synchronized关键字六、Java中的volatile关键字七、Java中的原子操作八、Java中的CAS操作九、Unsafe类十、Java指令重排序十一、伪共享十二、锁的概述一、多线程并发编程多个线程在多个CPU上运行称为多线程并发编程。二、多线程并发编程的好处多个CPU意味着每个线程可以使用自己的CPU运行,减少了上下文切换的开销。三、Jav

2022-01-11 21:58:37 276

原创 并发编程线程基础

并发编程线程基础一、什么是线程二、线程的创建与运行三、线程等待与通知四、等待线程执行终止的join方法五、让线程睡眠的sleep方法六、让出CPU执行权的yield方法七、线程中断八、理解线程上下文切换九、线程死锁什么是线程死锁?如何避免线程死锁十、守护线程与用户线程十一、ThreadLocalThreadLocal实现原理ThreadLocal不支持继承性InheritableThreadLocal类一、什么是线程线程是进程的一个实体,线程本身不会单独存在。进程是代码在数据集合上的一次运行活动,是系统

2022-01-09 16:41:52 115

原创 计算机网络和因特网

计算机网络和因特网一、具体构成二、因特网提供商(ISP)三、协议四、边缘网络接入网数字用户线(DSL)电缆因特网接入光纤到户(FTTH)以太网和WiFi五、物理媒体双绞铜线同轴电缆光纤陆地无线电信道卫星无线电信道六、网络核心一、具体构成端系统:手机、电脑等。通信链路:由不同类型的物理媒体组成,如同轴电缆、铜线、光纤等分组:发送端将数据分段,并为每段加上首部字节,这样封装好的数据叫做分组。端系统通过通信链路和分组交换机连接到一起。在许多方面,分组类似于卡车,通信链路类似于高速公路,分组交换机类似于

2021-12-10 15:48:13 1744

原创 唯一索引与普通索引

你真的知道MySQL唯一索引和普通索引的区别吗

2021-12-06 19:19:20 574

原创 MySQL事务的隔离浅析

你知道mysql的事务的隔离是什么吗

2021-12-05 10:16:20 928

原创 MySQL的锁

你知道mysql的锁吗?

2021-12-03 16:41:21 373

原创 MySQL索引

索引一、索引模型哈希表有序数组二叉搜索树二、InnoDB的索引模型一、索引模型哈希表键值对,其中key是通过特定的哈希函数得到的,相同的key,不同的value,此时会拉出一个链表。等值查询非常快,区间范围查询比较慢。有序数组等值查询和范围查询性能很好,但是在插入数据的时候代价比较高,只适合静态存储引擎(不会再修改的数据)二叉搜索树每个节点的左儿子小于父节点,父节点又小于其右儿子。更新的复杂度是log(N),搜索效率很高,但是大多数数据库存储不使用二叉树,因为索引不止存在内存中,还要写到磁盘中

2021-12-03 16:11:13 582

原创 如何在linux上安装elasticsearch?

在linux上安装elasticsearch一、上传安装包二、解压到指定目录三、修改配置内存配置访问配置四、开放端口五、启动一、上传安装包本文的演示的操作系统是ubuntu20.4,centos大同小异,远程连接工具xshell、xftp。安装包下载:百度网盘地址提取码:8t7w使用xftp上传到目录/opt/software二、解压到指定目录使用tar命令解压到/opt/module目录下tar -zxvf elasticsearch-7.8.0-linux-x86_64.tar.gz

2021-11-17 21:27:14 1008

原创 如何在linux上安装RocketMQ

在linux上安装RocketMQ一、上传安装包二、解压安装包三、配置环境变量四、修改配置修改启动脚本JVM参数修改namesrv启动脚本内存参数修改broker启动脚本内存参数五、启动服务与测试启动nameserver启动broker发送消息关闭nameserver关闭Broker六、单节点远程配置一、上传安装包本文的演示的操作系统是ubuntu20.4,centos大同小异,远程连接工具xshell、xftp。在安装rocketmq之前,必须安装jdk,可以参考我的文章进行jdk的安装安装包下载:

2021-11-17 19:45:58 2155

原创 如何在linux上安装jdk

在linux上安装jdk一、删除已有的jdk二、上传jdk安装包创建目录上传安装包三、解压到指定目录四、配置环境变量五、查看Java版本一、删除已有的jdk本文的演示的操作系统是ubuntu20.4,centos大同小异,远程连接工具xshell、xftp。卸载自带openJdksudo apt-get remove openjdk* 二、上传jdk安装包创建目录在opt目录下创建两个文件夹module:软件的位置software:安装包的位置在opt下创建module目录md

2021-11-17 19:04:07 1468

原创 你知道事务隔离吗?

事务隔离一、事务的四大特性二、事务同时执行会出现的问题三、事务的隔离级别四、事务隔离的实现五、尽量不要使用长事务六 、事务的启动方式一、事务的四大特性原子性一致性隔离性持久性二、事务同时执行会出现的问题脏读不可重复读幻读三、事务的隔离级别读未提交:一个事务还没提交,它做的变更就能被别的事务看到读已提交:一个事务提交以后,它做的变更才会被其他事务看到可重复读:一个事务执行过程中看到的数据,总是跟这个事务启动时看到的数据是一致的串行化:写时加写锁,读时加读所,读写互斥,写写

2021-11-05 15:46:08 88

原创 更新的SQL语句是如何执行的?

redolog与binlog一、redolog二、binlog三、binlog和redolog的区别四、两阶段提交五、update语句的内部流程一、redolog当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到redo log(粉 板)里面,并更新内存,这个时候更新就算完成了。同时,InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做,这就像打烊以后掌柜做的事。InnoDB 的redo log是固定大小的。比如可以配置为一组4个文件,每个文件

2021-10-31 17:30:25 133

原创 SQL语句的执行流程是什么?

SQL语句的执行流程基础架构连接器长连接与短连接长连接的问题查询缓存分析器优化器执行器基础架构连接器负责与客户端的建立连接、获取权限、维持和管理连接。用户建立连接之后,即使被管理员更改了权限,也不会影响已经存在连接的权限。必须使用新的连接才会生效。客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数 wait_timeout控制的,默认值是8小时。长连接与短连接长连接: 连接成功后,如果客户端有持续的请求则一直使用同一个连接。短连接:执行完几次数据库操作就断开连接,下次执行操

2021-10-31 16:40:28 1540

原创 你知道状态模式吗?

状态模式一、状态模式二、举例一、状态模式允许对象在内部状态改变时改变它的行为,对像看起来好像修改了它的类。二、举例设计一个糖果机,要求如下糖果机有四个状态有硬币无硬币转轴投放糖果状态接口类package com.jackeys.StateMode;/** * @Description: 状态接口 * @ClassName: State * @Package com.jackeys * @Author: Jackeys 1623427047@qq.com * @Copy

2021-10-26 14:08:40 91

原创 你知道组合模式吗?

组合模式一、组合模式二、举例一、组合模式允许你将对象组合成树形状结构来表现“整体/部分”的层次结构。组合能让客户以一致的方式处理个别对象以及组合。二、举例设计一个二级菜单菜单组合类package com.jackeys.Component;import java.util.ArrayList;/** * @Description: 菜单组合类 * @ClassName: MenuComponet * @Package com.jackeys.Component * @Autho

2021-10-25 09:42:23 80

原创 你知道如何优化TCP吗?

TCP内核参数调优一、TCP三次握手优化(建立连接)客户端优化SYN_SENT状态的优化服务端优化SYN_RCV 状态的优化全队列溢出优化TCP Fast Open二、TCP四次挥手性能提升(断开连接)关闭连接的方式close函数与shutdown函数的区别主动方的优化FIN_WAIT1状态的优化FIN_WAIT2状态的优化一、TCP三次握手优化(建立连接)客户端优化SYN_SENT状态的优化客户端作为主动发起连接方,首先它将发送SYN 包,于是客户端的连接就会处于SYN_SENT状态。客户端在等待

2021-10-24 20:24:56 1162

原创 你知道操作系统有哪些调度算法吗?

调度算法一、进程调度算法非抢占式的先来先服务调度算法(First Come First Seved, FCFS)最短作业优先调度算法(Shortest Job First, SJF)高响应比优先调度算法(Highest Response Ratio Next, HRRN)时间片轮转调度算法(Round Robin, RR)最高优先级调度算法(Highest Priority First,HPF)多级反馈队列调度算法(Multilevel Feedback Queue)二、内存页面置换算法缺页中断(缺页中断)

2021-10-24 11:35:17 1173

原创 你知道迭代器模式吗?

迭代器模式一、迭代器模式二、举例自定义迭代器Java内置迭代器一、迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。二、举例合并一个餐厅菜单和煎饼屋菜单,要求如下餐厅菜单用数组存储菜单项煎饼屋用ArrayList存储菜单项女服务员需要遍历餐馆的所有菜单自定义迭代器迭代器接口类package com.jackeys.IteratorMode.DIY;/** * @Description: 迭代器接口 * @ClassName: Iterator

2021-10-24 09:14:00 138

原创 你知道TCP的半连接与全连接队列吗?

TCP的半连接与全连接队列TCP连接队列半连接队列全连接队列TCP全连接队列策略设置TCP全连接队列TCP半队列溢出最大半队列连接数服务端处于SYN_RECV状态的最大个数syncookiesTCP连接队列半连接队列服务端收到客户端发起的 SYN 请求后,内核会把该连接存储到半连接队列(SYN队列),并向客户端响应 SYN+ACK。全连接队列服务端收到第三次握手的ACK后,内核会把连接从半连接队列移除,然后创建新的完全的连接,并将其添加到accept队列,等待进程调用accept 函数时把连接取出

2021-10-22 15:18:44 1702 1

原创 TCP握手丢包分析与快速建立连接

TCP握手丢包分析与快速建立连接一、TCP握手丢包分析TCP第一次握手SYN丢包TCP第二次握手SYN + ACK丢包TCP第三次握手ACK丢包一、TCP握手丢包分析TCP第一次握手SYN丢包当客户端发起的TCP第⼀次握手SYN 包,在超时时间内没收到服务端的ACK,就会在超时重传SYN数据包,每次超时重传的RTO是翻倍上涨的,直到 SYN 包的重传次数到达 tcp_syn_retries值后,客户端不再发送 SYN 包。TCP第二次握手SYN + ACK丢包当TCP第⼆次握⼿ SYN、ACK 包

2021-10-21 20:42:01 493

原创 你知道TCP的重传机制、滑动窗口、流量控制、拥塞控制吗?

TCP的四大机制一、重传机制超时重传TCP以下两种情况会发生超时重传超时时间的设置连续发生超时重传快速重传SACKDuplicate SACKD-SACK的好处二、滑动窗口三、流量控制四、拥塞控制一、重传机制TCP针对数据包丢失的情况,会用重传机制解决。超时重传超时重传:就是在发送数据时,设定⼀个定时器,当超过指定的时间后,没有收到对方的ACK确认应答报文,就会重发该数据。TCP以下两种情况会发生超时重传数据包丢失ACK应答报文丢失超时时间的设置RTT:包的往返时间。超时重传时间是

2021-10-21 20:01:57 1936 1

原创 Socket编程

Socket编程服务端和客户端初始化socket,得到文件描述符服务端调用bind ,将绑定在IP地址和端口服务端调用listen ,进行监听服务端调用accept ,等待客户端连接(服务端调用accept时,连接成功了会返回⼀个已完成连接的socket,后续用来传输数据)客户端调用connect ,向服务器端的地址和端口发起连接请求服务端accept返回用于传输的socket的文件描述符客户端调用write写入数据服务端调用read读取数据客户端断开连接时,会调用close ,那么服

2021-10-21 20:00:46 86

原创 线程中的锁

线程中的锁一、互斥锁与自旋锁互斥锁自旋锁互斥锁和自旋锁的比较二、读写锁读优先锁写优先锁公平读写锁三、乐观锁与悲观锁一、互斥锁与自旋锁互斥锁互斥锁是⼀种独占锁,比如当线程 A 加锁成功后,此时互斥锁已经被线程A独占了,只要线程A没有释放手中的锁,线程B加锁就会失败,于是就会释放 CPU让给其他线程,既然线程B释放掉了CPU,自然线程B加锁的代码就会被阻塞。对于互斥锁加锁失败而阻塞的现象,是由操作系统内核实现的。当加锁失败时,内核会将线程置为睡眠状态,等到锁被释放后,内核会在合适的时机唤醒线程,当这个线

2021-10-20 07:38:21 231

原创 你知道死锁吗?

死锁一、死锁的基本概念死锁的四个条件二、避免死锁的发生一、死锁的基本概念当两个线程为了保护两个不同的共享资源而使用了两个互斥锁,那么这两个互斥锁应用不当的时候,可能会造成两个线程都在等待对方释放锁,在没有外力的作用下,这些线程会⼀直相互等待,就没办法继续运行,这种情况就是发生了死锁。死锁的四个条件互斥条件:多个线程不能同时使用同⼀个资源,线程A已经持有的资源,不能再同时被线程B持有,如果线程B请求获取线程A已经占用的资源,那线程 B只能等待,直到线程A释放了资源。持有并等待条件:线程A已经持有了

2021-10-19 21:47:41 81

原创 TCP四次挥手

TCP四次挥手一、TCP四次挥手第一次挥手第二次挥手第三次挥手第四次挥手二、四次回收的原因三、TIME_WAIT状态详解TIME_WAIT=2MSL的原因TIME_WAIT的作用TIME_WAIT没有等待时间或者时间太短导致的问题过多的TIME_WAIT导致的问题优化TIME_WAIT四、已经建立连接,客户端出现故障TCP保活机制保活机制需考虑的问题一、TCP四次挥手第一次挥手客户端打算关闭连接,此时会将TCP首部的FIN标志位标为1,将此报文发送给服务端,发送之后,客户端进入FIN_WAIT_1状态

2021-10-19 21:08:19 274

原创 你知道什么是外观模式吗?

外观模式一、外观模式二、举例一、外观模式提供一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。二、举例请设计一个类,要求如下电影类投影仪类将看电影的整个复杂过程包起来电影类package com.jackeys.AppearanceMode;/** * @Description: 电影类 * @ClassName: Movie * @Package com.jackeys.AppearanceMode * @Author: Jacke

2021-10-19 19:44:50 108

原创 你知道什么是适配器模式吗?

适配器模式一、适配器模式二、举例一、适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。二、举例请设一个类,要求如下:鸭子类火鸡类火鸡可以适配鸭子的接口鸭子接口类package com.jackeys.AdapterMode;/** * @Description: 鸭子接口 * @ClassName: Duck * @Package com.jackeys.AdapterMode * @Author: Jackeys 1623427

2021-10-19 19:35:55 124

原创 你知道什么是命令模式吗?

命令模式一、命令模式二、举例一、命令模式将“请求”封装成对象,以便于使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。二、举例请设计一个遥控器,要求如下:可以控制灯的开关也可以扩展其他的命令控制命令接口类package com.jackeys.CommandMode;/** * @Description: 命令接口 * @ClassName: Command * @Package com.jackeys.CommandMode * @Author: J

2021-10-19 19:28:05 232

原创 你知道什么是单例模式吗?

单例模式一、基本概念二、普通单例模式三、同步单例模式四、静态单例模式五、双检锁单例模式一、基本概念单例模式:确保一个类只有一个实例,并提供一个全局访问点二、普通单例模式package com.jackeys.Singleton;/** * @Description: 普通单例模式 * @ClassName: Singleton * @Package com.jackeys.Singleton.common * @Author: Jackeys 1623427047@qq.com * @

2021-10-18 13:07:09 132

原创 多线程同步

多线程同步一、竞争与协作互斥同步互斥与同步二、互斥与同步的使用锁信号量三、经典问题生产者-消费者问题哲学者就餐问题方案一:有叉子就用方案二:只准一个人拿叉子方案三:规定先拿的叉子方案四:记录状态读写者问题方案一:读者优先的策略方案二:写者优先策略方案三:公平策略一、竞争与协作互斥由于多线程执行操作共享变量的这段代码可能会导致竞争状态,因此我们将此段代码称为临界区,它是访问共享资源的代码片段,⼀定不能给多线程同时执行。所以我们希望这段代码是互斥的,也就说保证⼀个线程在临界区执行时,其他线程应该被组织进入

2021-10-17 21:48:19 109

原创 TCP的三次握手

TCP连接建立一、TCP的三次握手第一次握手第二次握手第三次握手二、为什么是三次握手?不是两次?四次?避免历史连接同步双方的初始序列号避免资源浪费三、为什么客户端ISN和服务端ISN不相同?四、初始化序列号ISN的生成方式五、IP层会分片,为什么TCP层还需要MSSMTU与MSS原因分析六、SYN攻击SYN攻击应对方法通过修改 Linux 内核参数,控制队列大小和当队列满时应做什么处理syncookie一、TCP的三次握手第一次握手客户端会随机初始化序号(client_isn),将此序号置于TCP首部

2021-10-17 15:52:05 569

原创 TCP的基本认识

TCP的基本认识一、TCP的头部格式二、TCP的特点三、TCP连接确定唯一的一个TCP连接TCP的最大连接数四、UDP和TCP的区别以及应用场景UDP和TCP的区别UDP和TCP的应用场景一、TCP的头部格式序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送⼀次数据,就累加⼀次该数据字节数的大小。用来解决网络包乱序问题。确认应答号:指下⼀次期望收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决不丢包的问题。

2021-10-17 11:35:28 866

原创 你知道HTTP3吗?

HTTP3一、HTTP2的问题对头阻塞TCP与TLS的握手时延迟网络迁移需要重新连接二、QUIC协议的特点无队头阻塞更快的连接建立连接迁移三、HTTP3协议HTTP2与HTTP3的帧格式头部算法一、HTTP2的问题对头阻塞HTTP/2 多个请求是跑在⼀个 TCP 连接中的,那么当 TCP 丢包时,整个 TCP 都要等待重传,那么就会阻塞该 TCP 连接中的所有请求。由于内核中的TCP 数据不是连续的,于是接受方的应用层就无法从内核中读取到,只有等到丢包的数据重传后,接收方的应用层才可以从内核中读取到数

2021-10-15 16:18:29 363

原创 你知道进程间怎么通信吗?

进程间通信一、管道创建管道父子进程的管道单向通信父子间的双向通信管道Shell中的管道通信匿名管道与命名管道管道特点二、消息队列不足三、共享内存四、信号量五、信号进程是相互独立的,他们之间的通信只能通过内核。一、管道创建管道匿名管道的创建,需要通过下这个系统调用:这里表示创建⼀个匿名管道,并返回了两个描述符,⼀个是管道的读取端描述符 fd[0]⼀个是管道的写入端描述符 fd[1] 。这个匿名管道是特殊的文件,只存在于内存,不存于文件系统中。其实,所谓的管道,就是内核里面的⼀串缓存。从

2021-10-15 15:21:09 417

原创 进程与线程

进程与线程一、进程概述中断并发与并行进程与程序的类比进程的状态进程的状态转换进程的控制结构PCB的组织结构链表方式索引方式进程的控制创建进程终止进程阻塞进程唤醒进程进程的上下文切换上下文上下文切换CPU上下文切换的类型进程上下文切换的场景二、线程概述优点缺点进程与线程的比较线程相比进程能减少开销线程的上下文切换线程的实现用户线程优点缺点内核线程优点缺点轻量级进程1:1模式一、进程概述运行中的程序被称为进程。中断当进程要从硬盘读取数据时,CPU不需要阻塞等待数据的返回,而是去执行另外的进程。当硬盘数

2021-10-10 14:57:54 111

原创 HTTP2牛逼在哪儿?

HTTP2的过人之处一、HTTP1.1的高延迟性能问题二、HTTP2的针对HTTP1.1的优化兼容老版本头部压缩HTTP1.1存在的问题静态表编码概述过程动态表编码概述过程使用前提不足一、HTTP1.1的高延迟性能问题HTTP头部巨大且重复对头阻塞问题不支持服务器推送消息并发连接有限二、HTTP2的针对HTTP1.1的优化兼容老版本HTTP没有在URI里引入新的协议名,仍然用http://表示明文协议,用https://表示加密协议, 于是只需要浏览器和服务器在背后自动升级协议,这样可

2021-10-09 17:01:38 278

原创 你知道简单工厂模式吗?

简单工厂模式一、简单工厂模式二、举例一、简单工厂模式将类的创建交给工厂,我们只需要接受工厂创建好的类。静态工厂:工厂创建对象的方法是静态的。抽象工厂:定义一个抽象类工厂,去继承。工厂方法:定义一个接口类工厂,去实现。二、举例设计一个工厂类负责生产不同种类的披萨,要求如下披萨,名称,面团,酱汁,配料列表披萨店,负责卖披萨工厂类,负责生产不同的披萨简单披萨工厂package com.jackeys.FactoryMode;/** * @Description: 简单披萨工厂

2021-10-08 15:25:32 80

原创 你知道虚拟内存吗?

虚拟内存一、虚拟内存概述二、内存分段分段虚拟地址结构分段映射过程一、虚拟内存概述为了在多进程环境下,使得进程之间的内存地址不受影响,相互隔离,于是操作系统就为每个进程独立分配⼀套虚拟地址空间。每个进程都有自己的虚拟空间,而物理内存只有⼀个,所以当启用了大量的进程,物理内存必然会很紧张,于是操作系统会通过内存交换技术,把不常使用的内存暂时存放到硬盘(换出),在需要的时候再装载回物理内存(换入)。操作系统会提供⼀种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来。二、内存分段程序是由若干个逻

2021-10-07 11:47:38 302

OJ安装说明书.pdf

本人在校期间,维护学校ACM刷题网站,对OJ的安装有一定的了解。文件内有十分详细的OJ安装步骤,一步一步教你如何在服务器上安装OJ在线判题

2021-10-19

空空如也

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

TA关注的人

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