自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

HX_2021

记录日常开发和科研的学习笔记

  • 博客(94)
  • 资源 (1)
  • 收藏
  • 关注

原创 ElasticSearch学习笔记

一、ElasticSearch简介1、定义开源的搜索引擎,建立在全文搜索引擎库 Apache Lucene 基础之上用 Java编写的,隐藏了Lucene的复杂想,取而代之的提供了一套简单一致的RestFul API,即Client与Server之间使用HTTP协议通信。不仅仅是全文搜索引擎,也是可以当做一个分布式的实时文档存储,Elasticsearch就是一款面向文档的NoSQL数据库,使用JSON作为文档序列化格式。它的高级之处在于,使用Lucene作为核心来实现所有索引和搜索的功能,使得每个

2021-03-30 14:39:37 228 2

原创 Netty的整体框架

以 Netty 4.1.42为基准版本,将分别从Netty 整体结构、逻辑架构、源码结构三个方面对其进行介绍。一、整体结构Netty是一个设计非常用心的网络基础组件,Netty官网给出了有关 Netty 的整体功能模块结构,却没有其他更多的解释。从图中,我们可以清晰地看出 Netty结构一共分为三个模块:1、Core 核心层Core核心层是 Netty 最精华的内容,它提供了底层网络通信的通用抽象和实现,包括可扩展的事件模型、通用的通信 API、支持零拷贝的 ByteBuf 等。2、Protoc

2021-03-17 23:26:42 1055

原创 Java NIO的学习总结

简介Java NIO 是由 Java 1.4 引进的异步 IO.Java NIO 由以下几个核心部分组成:ChannelBufferSelectorNIO 和 IO 的对比IO 和 NIO 的区别主要体现在三个方面:IO 基于流(Stream oriented), 而 NIO 基于 Buffer (Buffer oriented)IO 操作是阻塞的, 而 NIO 操作是非阻塞的IO 没有 selector 概念, 而 NIO 有 selector 概念.基于 Stream 与基

2021-02-27 23:29:03 272 2

原创 递归最小二乘法、增广最小二乘法、带遗忘因子的递归增广最小二乘法

一、递归最小二乘法递推最小二乘法:当矩阵维数增加时,矩阵求逆运算计算量过大,而且不适合在线辨识。为了减少计算量,并且可以实时地辨识出动态系统的特性,可以将最小二乘法转换成参数递推的估计。取前N组数据,然后从N+1项后向后迭代,当前估计值=上一次估计值+修正值。给定过程:式中,理想的系数值a1=1.5,a2=0.7,b1=1.0和b2=0.5。V(k)服从N(0,1)的随机噪声。clear allclose allclc%产生N(0,1)正态分布的随机噪声randn('seed',100);

2021-01-31 10:09:40 14225 6

原创 平衡二叉树图解以及代码实现

平衡二叉树平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1;左右两个子树都是一棵平衡二叉树。是为了解决二叉查找树查找节点在最坏的情况下,该二叉树有可能退化成一个链表。AVL树除了满足二叉查找树的性质之外,AVL树的特性如下:AVL树的左右子树的高度差别小于等于1。AVL树的左右子树也是AVL树。平衡因子:定义:某结点的左子树与右子树的高度

2020-12-06 17:08:43 787

原创 二叉排序树图解和代码实现

二叉排序树二叉排序树(Binary sort tree,BST),又叫二叉查找树、二叉搜索树,或者是一棵空树;或者是具有下列性质的二叉树:​ (1)若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;​ (2)若它的右子树不为空,则右子树上所有节点的值均大于它的根节点的值;​ (3)它的左、右子树也分别为二叉排序树。(注:二叉排序树中没有值相同的节点)二叉排序树属于一种动态查找表,关于二叉排序树节点的代码实现:public class TreeNode { p

2020-12-06 15:37:07 1358

原创 图论算法之最短路径(Dijkstra、Floyd、Bellman-ford和SPFA)

图论算法之最短路径(Dijkstra、Floyd、Bellman-ford和SPFA)1、图论最短路径概述图论算法为了求解一个顶点到另一个顶点的最短路径,即如果从图中某一顶点(称为源点)到达另一顶点(称为终点)的路径可能不止一条,如何找到一条路径,使得沿此路径各边上的权值总和(即从源点到终点的距离)达到最小,这条路径称为最短路径(shortestpath)。最短路径有很多特殊的情况,包括有向图还是无向图,有没有负权边等。通常解决图论中最短路径问题的算法有Dijkstra、Floyd、Bellman-f

2020-11-18 15:10:21 12166

原创 图论算法之拓扑排序

拓扑排序总结:1、AOV网一个较大的工程往往被划分成许多子工程,我们把这些子工程称作活动。在整个工程中,有些子工程(活动)必须在其它有关子工程完成之后才能开始,也就是说,一个子工程的开始是以它的所有前序子工程的结束为先决条件的,但有些子工程没有先决条件,可以安排在任何时间开始。为了形象地反映出整个工程中各个子工程(活动)之间的先后关系,可用一个有向图来表示,图中的顶点代表活动(子工程),图中的有向边代表活动的先后关系,即有向边的起点的活动是终点活动的前序活动,只有当起点活动完成之后,其终点活动才能进行。

2020-11-13 21:25:37 561

原创 哈夫曼树(Huffman Tree)和哈夫曼编码

哈夫曼树和哈夫曼编码1、哈夫曼树(Huffman Tree)哈夫曼树又称最优二叉树。是一种带权路径长度最短的二叉树。它的定义如下:假设有n个权值{w1,w2,w3,w4…,wn},构造一棵有n个节点的二叉树,若树的带权路径最小,则这颗树称作哈夫曼树。这里面涉及到几个概念,我们由一棵哈夫曼树来解释。路径与路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1;树的路径长度

2020-11-12 16:37:06 642

原创 图论算法之最小生成树(Prim、Kruskal)

图论算法之最小生成树(Krim、Kruskal)1、图论基础图论 (Graph theory) 是数学的一个分支,图是图论的主要研究对象。 图 (Graph) 是由若干给定的顶点及连接两顶点的边所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系。顶点用于代表事物,连接两顶点的边则用于表示两个事物间具有这种关系。图的相关名词解释:图的表示法:G=(V(G),E(G)),其中V(G)表示点集,E(G)表示边集;度:与一个顶点v关联的边的条数称作该顶点的度,如果是有向图的话,分

2020-11-11 21:20:11 668 2

原创 实现字典树(前缀树、Trie树)并详解其应用

今天看到一个比较好的数据结构,字典树,做一下记录,以供自己后期复习和读者朋友的参考。1、定义字典树又称单词查找树、前缀树、Trie树等,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。平衡树和哈希表也可以在字符串数据集中搜索单词,尽管哈希表可以在O(1)的时间内寻找键值,但是无法做到以下操作:①找到具有用一前

2020-11-10 22:15:34 215

原创 设计模式(四):行为型模式之模板方法模式、策略模式、命令模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式和解释器模式

设计模式之行为型模式一、概述行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。行为型模式是 GoF 设计模式中最为庞大的一类,它包含以下11 种模式。模板方法(Template Me

2020-11-06 21:53:13 865

原创 设计模式(三):结构型模式之代理模式、适配器模式、桥接模式、装饰器模式、外观模式、享元模式和组合模式

设计模式之结构型模式一、概述结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。结构型模式分为以下7种:代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。适配器(Adapter)模式:将一个类的接

2020-11-05 15:49:09 373

原创 设计模式(二):创建型模式之单例模式、原型模式、工厂方法模式、抽象工厂模式和建造者模式

设计模式之创建型模式由单例模式、原型模式、工厂方法模式、抽象工厂模式和建造者模式为代表的创建型模式,它的主要关注点是“怎样创建对象?”,主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成。就像我们去商场购买商品时,不需要知道商品是怎么生产出来一样,因为它们由专门的厂商生产。创建型模式分为以下几种:单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。原型(Pr

2020-11-02 18:57:27 459

原创 操作系统之内存管理

内存是用于存放数据的硬件,程序执行前需要先放到内存中才能被CPU处理。1.1、内存基础知识名词解释:进程运行的原理——指令:我们写的代码要翻译成CPU能识别的指令。这些指令会告诉CPU应该去内存的哪个地址存/取数据,这个数据应该做什么样的处理。在这个例子中,指令中直接给出了变量x的实际存放地址(物理地址)。但实际在生成机器指令的时候并不知道该进程的数据会被放到什么位置。所以编译生成的指令中一般是使用逻辑地址(相对地址)。进程运行的基本原理:编译:由编译程序将用户源代码编译成若千个目

2020-10-21 15:06:21 814

原创 动态代理

1、什么是代理模式​ 为其他对象提供一个代理以控制对某个对象的访问。代理类主要负责为委托了(真实对象)预处理消息、过滤消息、传递消息给委托类,代理类不现实具体服务,而是利用委托类来完成服务,并将执行结果封装处理。其实就是代理类为被代理类预处理消息、过滤消息并在此之后将消息转发给被代理类,之后还能进行消息的后置处理。代理类和被代理类通常会存在关联关系(即上面提到的持有的被带离对象的引用),代理类本身不实现服务,而是通过调用被代理类中的方法来提供服务。2、静态代理​ 创建一个接口,然后创建被代理的类实现

2020-08-31 22:37:44 101

原创 dubbo高可用

1、zookeeper宕机与dubbo直连现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务。原因:注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯zookeeper的健壮性:监控中心宕掉不影响使用,只是丢失部分采样数据数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务注册中心对等集群,任意一台宕掉后,将自动切换到另一台注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯服务提供者无状态,任意一台宕掉后,不影响使

2020-08-19 16:51:36 153

原创 zookeeper的 JavaAPI

​ znode是zooKeeper集合的核心组件,zookeeper API提供了一小组方法使用zookeeper集合来操纵znode的所有细节。​ 客户端应该遵循以步骤,与zookeeper服务器进行清晰和干净的交互。连接到zookeeper服务器。zookeeper服务器为客户端分配会话ID。定期向服务器发送心跳。否则,zookeeper服务器将过期会话ID,客户端需要重新连接。只要会话ID处于活动状态,就可以获取/设置znode。所有任务完成后,断开与zookeeper服务器的连接。如果

2020-08-03 17:36:02 290

原创 zookeeper的常用shell命令

常用shell命令如下:zookeeper——getting started——https://zookeeper.apache.org/doc/r3.4.14/zookeeperStarted.html#sc_FileManagement(1)查询get /hadoop 查看结点的数据和属性 stat /hadoop 查看结点的属性(2)创建create [-s] [-e] path data # 其中 -s 为有序结点,-e 临时结点(默认是持久结点)创建结点并写入数据:cre

2020-08-03 17:32:46 318

原创 关于git下载镜像的地址、python下载第三方库的地址镜像

关于git下载镜像的地址、python下载第三方库的地址镜像

2022-06-04 22:13:19 415 1

原创 Seq2Seq模型实现(Decoder部分)

0、引言:承接上一篇,现在继续对于seq2seq模型进行讲解,decoder部分是和encoder部分对应的,层数、隐藏层、单元数都要对应。1、LSTM Seq2Seq DecoderDecoder只执行一个解码步骤。第一层将从前一个时间步接收隐藏和单元状态,并通过将当前的token 传给LSTM,进一步产生一个新的隐藏和单元状态。Decoder的初始隐藏和单元状态是我们的上下文向量,它们是来自同一层的Encoder的最终隐藏和单元状态。接下来将隐藏状态传递给Linear层,预测目标序列下一个标记应

2021-06-02 10:39:53 1622 1

原创 Seq2Seq模型实现(Encoder部分)

最近在做一个多特征多步输出预测的时间序列预测问题,我打算将机器翻译的seq2seq的理论用在预测上面,通过nlp领域的机器翻译,从一般LSTM Seq2Seq -> GRU Seq2Seq -> 基于注意力机制的 Seq2Seq,分别讲解基于pytorch深度学习框架实现Encoder部分的对比。关于序列到序列框架,在构建模型的时候,对Encoder和Decoder进行拆分,最后通过Seq2Seq整合,如果含有Attention机制,还需要增加attention模块。Encoder就是处理输

2021-05-13 11:28:30 1066 1

原创 几种序列化方式的总结(Serializable,json,Fastjson,ProtoBuff,Hessian和Kyro)

0、背景当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。本文主要对几种常见Java序列化方式进行实现。包括Java原生以流的方法进行的序列化、Json序列化、FastJson序列化、Protobuff序列化、Hessian序列化和Kyro序列化。1、java原生序列化方式这种方式只能将支持 java.io.Serializable

2021-03-22 15:41:12 5159 2

原创 Redis(九) 关于缓存在高并发下的一些问题

一、缓存击穿定义: 缓存中的key一般设有过期时间,如果某个key过期了,恰在这个时候,有大量的并发请求访问这个key,则这些请求都会到达DB,导致DB瞬间压力过大,压垮DB。解决方案: 1.设置互斥锁,mutex。当缓存失效时不时立即去访问数据库,而是使用缓存工具的操作成功带返回值的操作,比如redis的setnx(set if not exit),memcache的add,利用setnx实现锁的效果。缺点:可能造成死锁,或线程池阻塞2.提前使用互斥锁redist的超时时间是timeout1,v

2021-02-25 16:47:06 150

原创 Redis(八) 备份、删除和淘汰机制

一、备份机制AOF、RDB和复制功能对于过期键的处理:①RDB对过期键的处理机制​ 在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中。​ 举个例子,如果数据库中包含三个键k1、k2、k3,并且k2已经过期,那么当执行SAVE命令或者BGSAVE命令时,程序只会将k1和k3的数据保存到RDB文件中,而k2则会被忽略。因此,数据库中包含过期键不会对生成新的RDB文件造成影响。载入RDB文件:在启动Redis服务

2021-02-25 16:44:40 474

原创 Redis(七) 线程模型

一、文件事件处理器Redis 内部使用文件事件处理器 file event handler,这个文件事件处理器是单线程的,所以 redis才叫做单线程的模型。它采用 IO 多路复用机制同时监听客户端的多个连接(多个 socket),根据 socket 上的事件来选择对应的事件处理器进行处理。文件事件处理器的结构包含4个部分:多个 socket(客户端连接)IO 多路复用程序(支持多个客户端连接的关键)文件事件分派器(将 socket 关联到相应的事件处理器)事件处理器(包括连接应答处理器、.

2021-02-25 16:29:01 1200 2

原创 Redis(六) 集群

一、简介Redis集群是Redis提供分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。节点:一个Redis 集群通常有多个节点(node)组成,开始时每个节点相互独立,都处于找一个包含自己的集群中,要组建一个真正工作的集群,需要将各个独立的节点连接起来,构成一个多节点的集群。集群中至少应该有奇数个节点,所以搭建集群最少需要3台主机。同时每个节点至少有一个备份节点,所以下面最少需要创建使用6台机器,才能完成Redis Cluster集群(主节点、备份节点由redis-cluste

2021-02-25 15:30:37 240

原创 Redis(五) 事务

一、简介Redis的事务并没有关系型数据库的事务那么复杂,只有几个命令就可以解决:multi/exec/discard/watch/unwatch.Redis 事务可以一次执行多个命令(允许在一次单独的步骤中执行一组命令), 并且带有以下两个重要的保证:在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。Redis会将一个事务中的所有命令序列化,然后按顺序执行;执行中不会被其它命令插入,不许出现加塞行为。一个事务从开始到执行会经历以下三个阶段:开始事务命

2021-02-23 23:34:27 79

原创 Redis(四) 常见命令和应用场景(下)

一、List类型1、简介Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素) ,类似JAVA中的LinkedList2、List命令赋值语法:LPUSH key value1 [value2] 将一个或多个值插入到列表头部(从左侧添加)RPUSH key value1 [value2] 在列表中添加一个或多个值(从右侧添加)LPUSH

2021-02-23 15:16:30 164

原创 Redis(三) 常见命令和应用场景(中)

一、Java连接Redis在官方网站列一些Java客户端访问,有:Jedis/Redisson/Jredis/JDBC-Redis等,其中官方推荐使用Jedis和Redisson。常用Jedis。开始在Java 中使用 Redis 前, 我们需要确保已经安装了 redis服务及Java redis驱动,且你的机器上能正常使用Java。 Java的安装配置可以参考我们的 Java开发环境配置 接下来让我们安装Java redis 驱动。安装相应JAR:<dependency> &l

2021-02-23 14:49:59 179 1

原创 Redis(二) 常见命令和应用场景(上)

Redis(二) 常见命令和应用场景一、基本命令概述Redis 命令用于在 redis 服务上执行操作。要在 redis 服务上执行命令需要一个redis客户端。Redis 客户端在我们之前下载的redis的安装包中。Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)等二、关于Redis的键key1、关于key的操作Redis 键命令用于管理 redis 的键DEL key该命令用于在 ke

2021-02-23 14:29:55 99

原创 Redis(一) Redis简介和安装

一、Redis简介1、关于RedisRedis是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。(Vmware在资助着redis项目的开发和维护)BSD是"Berkeley Software Distr.

2021-02-23 13:52:15 190 1

原创 十大排序算法总结及其代码实现

1、算法分类2、时间复杂度分析3、基本的排序算法3.1、冒泡排序public class BubbleSort1 { public static void main(String[]args){ int array[]={5,4,2,6,8,1}; System.out.println("排序前的数组数字排列顺序为:"); for(int i=0;i<array.length;i++){ System.out.

2020-12-28 16:47:44 160

原创 浅谈红黑树

红黑树1、概念红黑树(Red Black Tree)也属于平衡二叉树,是一种自平衡的二叉查找树,红黑树主要用于存储有序的数据,它的时间复杂度是O(logn),非常高效。除了符合二叉查找树的基本特性外,它还具有下列的附加特性:①节点是红色或黑色。②根节点是黑色。③每个叶子节点都是黑色的空节点(NIL节点)。(保证原有的节点的度为2)④每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)⑤从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。2、红黑树和A

2020-12-07 11:19:07 199

原创 SpringBoot整合Elasticsearch以及Elasticsearch的基本操作

Elasticsearch提供的Java客户端有一些不太方便的地方:很多地方需要拼接Json字符串,需要自己把对象序列化为json存储,查询到结果也需要自己反序列化为对象因此,非常麻烦,我们这里就不讲解原生的Elasticsearch客户端API了。而是学习Spring提供的套件:Spring Data ElasticsearchSpring Data Elasticsearch是Spring Data项目下的一个子模块。查看 Spring Data的官网Spring Data 的使命是给各种

2020-12-04 16:34:28 311

原创 如何使用Mybatis Generator代码生成器

Mybatis Generator代码生成器的相关配置:1、在pom.xml文件build下写pluginManagement: <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin&gt

2020-12-02 15:22:51 85

原创 leetcode第216场周赛

第216场周赛5605. 检查两个字符串数组是否相等流程题,按部就班。。。。class Solution { public boolean arrayStringsAreEqual(String[] word1, String[] word2) { String s1=""; String s2=""; for(String word:word1){ s1+=word; } for(Str

2020-11-22 18:21:55 124

原创 读《大型网站技术架构》总结之概述篇

读《大型网站技术架构》总结之概述篇一、大型网站架构演化与传统企业应用系统相比,大型互联网应用系统有以下特点:高并发、大流量高可用海量数据用户分布广泛,网络情况复杂安全环境恶劣需求快速变更,发布频繁渐进式发展大型网站架构演化发展历程:初始阶段的网站架构应用程序、文件和数据库放在一个Linux操作系统下应用服务和数据服务分离将应用程序,文件服务器和数据库服务器解耦使用缓存改善网站性能为缓解数据访问压力,使用缓存。网站上的缓存分为两种,缓存在应用服务器上的本地缓存和

2020-11-16 16:05:38 147

原创 leetcode第39场双周赛

第39场双周赛5550. 拆炸弹暴力流程题:class Solution { public int[] decrypt(int[] code, int k) { int n=code.length; int []res=new int [n]; if(k==0){ for(int i=0;i<n;i++){ res[i]=0; } }else

2020-11-15 21:28:34 121

原创 leetcode第215场周赛

第215场周赛 京东&力扣联合主办5601. 设计有序流class OrderedStream { private String []nums; private int ptr=1; public OrderedStream(int n) { nums=new String [n+2]; } public List<String> insert(int id, String value) { Lis

2020-11-15 21:23:10 123

空空如也

空空如也

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

TA关注的人

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