自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(217)
  • 资源 (19)
  • 收藏
  • 关注

原创 RocketMq存储设计——Index file

index file设计rocket mq存储设计

2022-06-30 09:36:48 323 1

原创 RocketMq存储设计——Consume Queue

consume queue是mq的消费索引文件,只要你知道consume queue offset就能快速定位到commit log offset,就能快速定位到一条消息。注意一个consume queue对象和某个topic下的某个队列的的一个文件等价。每个topic下默认会分配四个队列(0,1,2,3),队列下的一个文件就是一个consume queue对象。例如:我知道topic下的队列1的consume queue offset = 1 ,我可以知道我要去0000000000000000这个文

2022-06-30 09:28:45 530

原创 RocketMq存储设计——CommitLog

commit log是RocketMQ真正存储消息的文件,文件存储依赖于mapped file ,mapped file queue刷盘线程异步刷盘FlushRealTimeService,没啥好说的,调用MappedFileQueue的flush方法刷盘就好思想非常好,用两个非线程安全的list,只有swapRequests的时候有竞争,其余时候都没有竞争,类似于copy on write思想,实现刷盘的时候刷盘一组request,并唤醒一组等待线程堆外内存刷到page cacheCommitR

2022-06-30 09:11:57 633

原创 RocketMq存储设计——MappedFile

RocketMq存储很多地方使用到了他,例如commit log(存储真正的消息数据),consume queue(真正的消息数据的索引),store check point等。你可以把MappedFile理解成一个工具,当你需要把数据储存到磁盘,从磁盘快速查找数据,使用它会非常高效。它使用mmap和send file系统调用加速文件的存储与查找。mmap映射的就是os page cache,一页默认大小4kb,即使mq宕机了,只要机器还在运行,os会把page cache刷到磁盘,不会丢失数据。当消息过

2022-06-29 09:55:10 439

原创 Seata源码分析——@GlobalTransactional

Seata源码分析——@GlobalTransactional前言脑图Seata三大角色@GlobalTransactional源码入口GlobalTransactionScanner初始化TM,RMwrapIfNecessary分支事务总结前言研读Seata源码有一段时间了,打算出一系列关于源码的文章,旨在加强自己对Seata的理解,同时也希望能帮助到读者。脑图本文主要分析标红的地方Seata三大角色TC :事务协调者,netty serverTM :事务管理器,netty clie

2021-08-19 15:04:10 4619 3

原创 51单片机——LED点阵屏

51单片机——LED点阵屏LED点阵屏LED点阵屏原理74HC595串转并芯片源代码例程一:静态笑脸效果展示例程二:笑脸->平脸->哭脸效果展示LED点阵屏c51的LED点阵屏其实就是一个8*8像素的屏幕,一共有64个发光二极管。如下图LED点阵屏原理其实这个原理和数码管是一样的,都是利用人的视觉暂留,不停扫描LED点阵,依次点亮每一盏灯,只不过数码管扩引脚采用的是38译码器,点阵屏采用的是74HC595串转并芯片。参考数码管原理图如下:他的DPa~DPh其实就是上图的D0-D7

2021-06-26 21:04:21 23136 10

原创 51单片机——串口通信

51单片机——串口通信串口通信?串口通信的原理?串口的配置定时器的配置c源代码netty源代码结果本篇博客的最终效果是实现51单片机用串口发送Hello World,netty监听串口读到Hello World后回发给51单片机,最终51单片机回显到LCD1602显示屏。串口通信?其实我压根不知道串口通信是啥,我在这方面也是小白,只知道按照标准做就可以实现通信。上图示是四孔串口,应该算是全双工通信的,复杂的有9针串口,提供额外的口子可以调控发送速率等。开发板原理图如下:串口通信的原理?我

2021-06-18 00:47:01 5126 7

原创 51单片机——定时器

51单片机——定时器为什么使用定时器?定时器原理?定时器设置中断配置源代码为什么使用定时器?之前我们的led灯每隔1s循环左移点亮的时候,使用的定时方法是在c程序执行若干次空循环,这样会耗费很多cpu资源,因为空轮询。本篇博客将使用51单片机内置的定时器+中断系统完成循环左移LED灯。想一个问题:为什么中断不耗费cpu资源,或者说没那么耗费其实问题的答案很简单:因为发生中断的时候,cpu把当前任务放到等待队列里,然后去调用相应的中断处理程序,处理完中断后再从等待队列把进程丢到工作队列抢占cpu资源。

2021-06-15 23:25:55 48096 13

原创 51单片机——LCD1602液晶显示屏

如下图:红框就是LCD1602液晶显示屏,他是可插拔的,插上去后数码管就会乱码无效了,因为他两共用了MCU的8个P0口LCD1602原理图从上面两幅图可以看出来LCD1602的LCD_D0~LCD_D7分别对应MCU的P00-P07LCD1602的LCD_RS对应MCU的P26LCD1602的LCD_RW对应MCU的P25LCD1602的LCD_E对应MCU的P27LCD1602的16个引脚A在5*7点阵的字模PC收到41H的代码后就去字模文件中将代表A字的这一组数据送到显

2021-06-08 22:35:43 28162 8

原创 51单片机——数码管

如下图:红框就是数码管数码管原理这里说的都是共阴极连接的如果要显示数字0,我们只需要把G和dp置0,其他位置1即可,即ABCDEFG,DP=1111 1100原理图假设我们需要控制LED8口显示数字0:P2_2=1P2_3=1P2_4=1a,b,c,d,e,f,g,dp=1111 1100,即P00~P07为1111 1100,因为P00是低位,所以得反过来就是0011 1111,即P0=0x3Fps:74HC245在这里的作用是增大电流,之前LED是低电平点亮,现在这里是高电平点

2021-06-08 00:11:52 3504 13

原创 51单片机——独立按键

如图是独立按键的原理图:通电后io口都是高电平,当按下K1~k4后,io口接地,变为低电平,说明当P30-P33为0时,代表我们按下了独立按键例程1:独立按键控制LED亮灭#include <REGX52.H>void main(){ while(1) { //k2按下,点亮D1 if(P3_0==0){ P2_0=0; } //k1按下,点亮D2 if(P3_1==0){ P2_1=0; } //k3按下,点亮D3 if(P3

2021-06-07 23:17:33 6503

原创 51单片机——LED灯

如下图所示是51单片机的开发板原理图:我们想要让二极管D1亮,只需要把p20口置低电平即可,只需要把P2寄存器第0位置0LED原理解释:CPU配置寄存器的值来控制硬件电路达到我们预期效果例程1:点亮第一个LED#include <REGX52.H>void main(){ P2 = 0xFE; //1111 1110 //P2_0 = 0;//这种写法也行}例程2:LED闪烁#include<REGX52.H>void sleep(int i){ wh

2021-06-07 21:44:50 3651 2

原创 mycat分片join

mycat分片join全局表如果你的业务中有些数据类似于数据字典,比如配置文件的配置,常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大,而且大部分的业务场景都会用到,那么这种表适合于 Mycat 全局表,无须对数据进行切分,只要在所有的分片上保存一份数据即可,Mycat 在 Join 操作中,业务表与全局表进行 Join 聚合会优先选择相同分片内的全局表 join,避免跨库 Join,在进行数据插入操作时,mycat 将把数据分发到全局表对应的所有分片执行,在进行数据读取时候将会随

2021-06-02 18:41:14 495

原创 mycat全局序列号

mycat全局序列号本地文件方式数据库方式本地时间戳方式mycat安装本地文件方式sequence_conf.propertiesGLOBAL_SEQ.HISIDS=GLOBAL_SEQ.MINID=1001GLOBAL_SEQ.MAXID=1000000000GLOBAL_SEQ.CURID=1000server.xml<system> <!--0=本地文件,1=数据库,2=时间戳,3=zk,4=zk递增--> <property name="sequ

2021-06-02 13:56:05 290

原创 mycat安装使用

mycat的使用前提:先配置好mysql8的主从环境mysql8主从注意t_user不要使用自增主键下载mycat1.6.7.6mycat官网tar -zxvf Mycat…tar.gz我们修改conf目录下的server.xml和schame.xml文件schame.xml<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="h

2021-06-01 15:46:38 273

原创 mysql8主从搭建

centos7准备两台机器:192.168.131.101,192.168.131.102主节点:创建一个账户专门用于同步主从数据,赋权限CREATE USER 'slave'@'%' IDENTIFIED BY 'slave';GRANT REPLICATION SLAVE ON *.* To 'slave'@'%' WITH GRANT OPTION;flush privileges;设置binlog和server idvim /etc/my.cnflog-bin=mysql-b

2021-06-01 15:27:27 343

原创 centos7安装MySQL8

本文主要是记录一下供以后安装方便配置文件:/etc/my.cnfmysql位置:/var/lib/mysql检测系统是否有mysqlrpm -qa | grep mysql有的话删掉// 普通删除模式rpm -e mysql// 强力删除模式,如果使用上面命令删除时,提示有依赖的其它文件,则用该命令可以对其进行强力删除rpm -e --nodeps mysql(或者把mysql改成rpm -qa | grep mysql搜到的东西)下载rpmwget https://repo.my

2021-06-01 15:16:03 354

原创 redis-分布式锁

redis-分布式锁redis实现分布式锁四大条件:互斥:key不能死锁:过期时间解铃还须系铃人:value存储 uuid+threadId容错: 关于容错,redis集群环境下是没办法保证分布式锁的容错性的,具体原因如下:如图所示:一个三主三从的redis集群,当客户端发送写命令时,master会直接返回给用户写成功,并不会等master把命令复制到slave上再返回给用户,也就是说redis的复制是异步复制的,这会导致一个问题:试想当master把锁信息写入成功,返回给用户了,此时mas

2021-05-27 17:11:11 321

原创 缓存双写一致性

缓存双写一致性对于读:先读缓存,缓存没有,再读ku,回写缓存,这种没啥说的。对于写:先写库,再删除缓存,本文主要基于这种来探讨一下这样处理有什么问题?如下图所示:图中表示大量请求同时涌入,读数据和写数据请求同时执行,下面我们基于这幅图来剖析为何先写库,再删除缓存会有问题?大前提:缓存正好失效**正常情况:**有一个读数据和一个写数据请求同一时刻过来,读请求发现缓存失效,去读数据库(旧数据),然后回写缓存(旧数据),此时写请求也更新好了数据库,再把缓存删掉,这样的话即使之前读请求把旧值回写缓

2021-05-27 12:21:31 366

原创 ConcurrentHashMap-put

ConcurrentHashMap-put推荐先读:ConcurrentHashMap属性解释putVal主流程initTable初始化table分支流程helpTransfer帮助扩容分支流程putVal主流程锁住桶后,链表插入/更新putVal主流程锁住桶后,红黑树插入/更新putVal主流程addCount(LongAdder自增和并发扩容)transfer方法才是真正扩容方法,加上红黑树的读写锁设计这两块比较难,后续会补上...

2021-05-20 12:35:27 328

原创 ConcurrentHashMap-属性解释

ConcurrentHashMap-属性解释代表hashmap最大能存这么多个键值对高两位目的是为了控制?知道的评论区说下private static final int MAXIMUM_CAPACITY = 1 << 30;代表hashmap默认容量private static final int DEFAULT_CAPACITY = 16;数组的最大长度static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;默认的

2021-05-19 20:38:20 424

原创 LongAdder是啥?

本文源码研究基于jdk1.8阅读ConcurrentHashMap源码的时候发现了很多CountCell,看不太懂,所以先来研究一下LongAdder。LongAdder是啥?LongAdder是用来做线程安全的i++自增操作的,我们知道AtomicLong也可以现实这个功能,那为什么需要LongAdder呢?理由很简单,为了效率。AtomicLong是对整个数进行cas,那么当多个线程并发执行increment操作时,注定只有一个线程成功,其他线程都在失败自旋,很浪费cpu资源,LongAdder你

2021-05-18 22:03:25 660 3

原创 冒泡排序及其优化

冒泡核心思想:冒泡排序向右边冒泡的话,结果就是最后一个数就是最大的冒泡排序向左边冒泡的话,结果就是第一个数就是最小的这个好像不是冒泡吧。。。private static void maoPaoSort(int [] arr){ for(int i=0;i<arr.length;i++){ for(int j=i+1;j<arr.length;j++){ if(arr[i]>arr[j]){

2021-05-10 20:35:36 242

原创 mybatis实现数据库读写分离

ps:本文解决mybatis实现数据库读写分离,项目基础是ruoyi-vue方案一:自定义一个注解@DataSource, 利用aop切该注解,切了后设置注解@DataSource的值到ThreadLocal里面,再利用AbstractRoutingDataSource的determineCurrentLookupKey方法去选择数据源优点:通过注解方式,修改简便缺点:dao上配置注解,有点麻烦public enum DataSourceType{ /** * 主库, writ

2021-05-09 21:15:57 970 2

原创 关于ThreadLocal你要知道的一切

ThreadLocal是线程本地变量,可以应用在分布式系统追踪,事务管理方面,这里先提出几个较难的问题ThreadLocal的内部大致实现原理?ThreadLocal的Entry的key为何设计成弱引用?ThreadLocal的hash碰撞是如何处理的?ThreadLocal如何处理主线程传值到子线程?如何让子线程跟随主线程tl值变化而变化?线程池中使用threadLocal如何保持不变?阿里TransmittableThreadLocal?ThreadLocal的内部大致实现原理?T

2021-05-01 20:42:21 532 1

原创 seata配合nacos初体验

seata配合nacos初体验简介seata快速开始资料简介seata是阿里提供的分布式事务的解决方案,nacos是阿里提供的分布式注册中心,分布式配置中心解决方案。本文旨在介绍seata如何使用nacos作为配置中心。(AT模式)nacos官网nacos.io, seata官网seata.io, nacos的快速开始可以上官网看,几分钟就好了。seata快速开始seata整体是cs架构,第一步下载的软件就是s端,我们自己建项目然后pom里整合c端和s端进行通信。第一步:seata下载:seat

2021-02-25 13:38:34 1045

原创 数据结构-红黑树

数据结构-红黑树2-3树介绍2-3树红黑树性质2-3树插入红黑树性质fixUp代码参考2-3树介绍查阅很多博客好像都没有谈及红黑树的由来,包括著名的算法导论也只是先抛出5条红黑树的性质,在介绍红黑树之前不得不先介绍2-3树,左倾红黑树可以说等价于2-3树。2-3树一颗2-3树具有如下三个特性一个节点内部包含一个或两个关键码每个非叶子节点有两个孩子或者三个孩子(得名2-3树)所有叶子节点都在同一层除了这三个形状特性,还有一个如下特性,对于每一个节点,左子树所有节点值都小于第一个关键码,中间

2021-01-06 20:34:44 328

原创 数据结构-平衡二叉树

数据结构-平衡二叉树什么是平衡二叉树旋转RR型,左旋LL型,右旋LR型,先左旋再右旋RL型,先右旋再左旋源码AVLTreeAVLSetAVLMap什么是平衡二叉树阅读本篇博客前最好对二叉搜索树有一定了解。二叉搜索树二叉搜索树在最差的情况会退化成线性查找,所以才有了平衡二叉树。如下图所示:分别演示了平衡与不平衡的二叉树平衡二叉树每个节点都有一个平衡因子(图中红色数字),他的值为节点左子树树高-右子树树高平衡二叉树每个节点的左右孩子高度差<=1,平衡因子只能取-1,0,1三个值,否则就需要调

2021-01-05 19:05:40 515

原创 数据结构-二叉搜索树

数据结构-二叉搜索树结构作用实现结构作用如上图所示每个节点都大于左孩子,小于右孩子,以O(logn)复杂度进行如下操作插入一个元素查询是否包含某个元素删除某个元素插入元素7:从根节点出发,7>3,往右边走,7>5,往右边走,7>6&&6的右节点为空,把7插入到6的右孩子删除节点:如果删除的节点是根节点,注意修改root,叶子节点找到后直接删除,例如1,直接把2的左孩子置为null非叶子节点分为只含有左孩子的节点例如2,3.left=2.left即

2021-01-05 01:49:04 350

原创 数据结构-并查集

数据结构-并查集并查集是什么并查集的结构初始化合并查询并查集优化并查集实现并查集是什么并查集是一种用来管理元素分组的数据结构,可以高效进行合并查找操作查询元素a和元素b是否是同一分组合并元素a和元素b所在分组并查集的结构初始化准备n个节点表示n个元素,最开始每个节点都是单独的一个集合合并从一个组的根向另一个组的根连边查询为了查询两个节点是否属于同一组,我们需要沿着树网上找,来查询根是谁,如果两个节点根一样,则属于同一组元素1,2都网上找到根为3,属于同一组,元素4,6都找到

2021-01-04 21:40:21 336 1

原创 数据结构-字典树

数据结构-字典树什么是字典树源代码基于TreeMap的存储方案基于数组的存储方式部分算法解析match算法delete算法参考什么是字典树字典树又称Trie,单词查找树,典型用于统计,查找大量字符串,典型应用有通讯录,前缀搜索,搜索自动补全,打字补全等。如下图所示,树中存储单词cat,dog,deer, pan, pandaBST搜索树的时间复杂度为O(logn), trie的时间复杂度为O(w),w为单词长度源代码基于TreeMap的存储方案public class Trie {

2021-01-04 19:01:08 500

原创 数据结构-线段树

数据结构-线段树概述源代码概述线段树是一颗平衡的二叉搜索树,他以空间换区时间,让线性查找加速log级别的查找,用到的算法主要是二分搜索和递归。例如:有数组data[]={1,2,3,4}, 我有一个需求,我需要频繁的查找区间i~j的sum和。这里先给出两个解决方案:如果使用最普通的算法遍历,那么查找和更新的复杂度为O(n)。当然你还可以使用动态规划,定义dp数组为dp[i][j] ,意义为从i~j的sum和,但是更新某个数据的复杂度也是O(n)。又或者定义dp数组为dp[i], 意义为从0~i的

2020-12-30 11:32:31 270

原创 dubbo源码-服务导出

dubbo源码-服务导出前言源码本地导出:exportLocal(url);远程导出总结前言前面博客已经说了dubbo整合spring,不过还没有涉及到dubbo的核心服务导出,服务引入,服务调用的客户端和服务端的通信流程,本篇博客我们先来说dubbo的服务导出源码入口如下private static void startWithExport() throws InterruptedException { ServiceConfig<DemoServiceImpl> se

2020-12-27 14:49:29 364

原创 dubbo源码-Refrence注解

dubbo源码-Refrence注解前言源码findInjectionMetadata寻找注入点注入代理对象metadata.inject总结前言前几篇博客registerCommonBeans有个ReferenceAnnotationBeanPostProcessor没有说到,这个处理器就是负责扫描出@Reference注解然后动态代理生成代理对象赋值给该属性的源码父类AbstractAnnotationBeanPostProcessor负责扫描出@Reference注解对应的属性。子类Refe

2020-12-27 12:54:35 567

原创 dubbo源码-Service注解

dubbo源码-Service注解前言源码分析总结前言上一篇已经详细分析了dubbo的配置解析,本小节我们聊聊@Service注解。当你使用@Service注解时有没有疑惑,这不是spring自带的注解,dubbo是如何扫描到该注解的,扫描到后又做了什么处理。源码分析@EnableDubbo@EnableDubbo(scanBasePackages = “org.apache.dubbo.demo.provider”)@DubboComponentScanpublic @interface

2020-12-27 11:13:41 2657 1

原创 dubbo源码-整合spring之配置解析

dubbo源码-整合spring之配置解析前言源码解析分析总结前言@EnableDubbo(scanBasePackages = "org.apache.dubbo.demo.provider")@PropertySource("classpath:/spring/dubbo-provider.properties")如果想要使用dubbo,只需要添加上面两个注解即可,第一个路径是扫描@DubboService注解,第二个注解则是dubbo配置。关于配置dubbo又有很多种写法,preopert

2020-12-26 23:21:57 616 1

原创 dubbo源码—— spi机制

dubbo源码—— spi机制从一个小例子说起源码分析getExtensionLoadergetExtensiongetAdaptiveExtensiongetActivateExtension代码下载从一个小例子说起@SPIpublic interface Hello { String sayHello(String name); }public class HelloImpl implements Hello { @Override public String say

2020-12-24 14:46:22 335 1

原创 docker安装,镜像与容器操作

docker安装,镜像与容器操作docker相关组件介绍Host(Docker 宿主机)Docker daemon(Docker 守护进程):Images(镜像):Containers(容器):Docker Client(Docker 客户端)Registry(仓库服务注册)docker安装镜像操作容器操作tomcat安装示例docker相关组件介绍Docker使用C/S架构,Client通过接口与Server进程通信实现容器的构建,运行和发布,如图:Host(Docker 宿主机)安装了Dock

2020-11-02 17:08:59 459

原创 Zookeeper watch机制原理

Zookeeper watch机制原理准备工作watch示例源码解析准备工作经过上一小节的学习我们知道ZookeeperServerMain是单机版的服务器主类我们可以自己写一个ZkClient类public class ZkClient { public static void main(String[] args) throws IOException, KeeperException, InterruptedException { final CountDownLatch

2020-10-30 18:18:35 1351

原创 zookeeper单机服务器启动流程

zookeeper单机服务器启动流程一、源码编译二、启动流程总结一、源码编译源码编译编译zookeeper源码1:ant eclipse2:将bulild.xml中的(1900多行的地方)get src="http://downloads.sourceforge.net/project/ant-eclipse/ant-eclipse/1.0/ant-eclipse-1.0.bin.tar.bz2"替换成如下地址get src="http://ufpr.dl.sourceforge.net

2020-10-30 17:51:29 390

seata学习.rar

seata+nacos初体验seata+nacos初体验seata+nacos初体验seata+nacos初体验seata+nacos初体验

2021-02-25

mysql8.txt

网络配置,mysql8安装

2020-12-30

dubbo spi可扩展机制源码解析

dubbo spi可扩展机制源码解析

2020-12-24

mysql8安装指南

mysql8安装指南

2020-12-21

springcloud config配置中心

springcloud config配置中心

2020-03-10

springcloud zuul

springcloud zuul

2020-03-10

springcloud hystrix+feign

springcloud hystrix+feign

2020-03-10

springcloud应用之feign

springcloud应用之feign

2020-03-10

eureka集群搭建

eureka集群搭建

2020-03-10

eureka单体注册中心

eureka单体注册中心

2020-03-10

eureka.zip

spring cloud eureka集群+ribbon+feigspring cloud eureka集群+ribbon+feignspring cloud eureka集群+ribbon+feignspring cloud eureka集群+ribbon+feignspring cloud eureka集群+ribbon+feignn

2020-03-06

手写spring ioc 终版

笔者大概花了10天写了这套框架, 支持@Configuration @Component @ComponentScan @Import ImportBeanDefinitionRegistry FactoryBean @Bean @Lazy @Scope @Autowired @Value @Role autowiredMode 循环依赖 循环import, ImportBeanDefinitionRegistry +MapperScan+FactoryBean笔者也都实现了这些,并且测试用例有此案例,通过此例可以了解mybatis是怎样利用spring的这两个扩展接口来完成mapper的扫描与mapper的动态代理的

2019-12-19

手写spring ioc源代码 org.zip , 初步完成 version1.1

这是我手写的 spring ioc 源码,第一版初步完成,支持构造器推断选择,支持属性的循环依赖,支持注解功能,与spring源码相似度非常高,对spring源码不了解但又想学习的,强烈建议看这个,后续继续更新

2019-12-16

手写spring ioc(三) 资源org.zip

本资源是个人手写spring ioc的源码,实现了ioc基本功能,解决了循环依赖,推动构造器,自动注入等

2019-12-13

dubbo2.zip

dubbo链路追踪

2019-06-20

自定义mystruts

自定义 mystruts

2017-12-03

音乐url大全(303222个)

303222个音乐url

2017-11-11

apache-maven

搭建maven项目所需的文件 搭建maven项目所需的文件 搭建maven项目所需的文件

2017-10-24

坦克大战源码

坦克大战源码

2016-12-19

空空如也

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

TA关注的人

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