自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 设计模式-责任链模式及应用

日常生活中办理一件事情往往需要一系列的流程,且流程直接还是有顺序的。比如我们去医院看病,首先要挂号,然后再去排号会诊,医生根据病人的情况开具指定的药品,接口病人根据医生开具的药品单去缴费,缴费完成后再去取药窗口排队取药。这一系列的环节都是有顺序,且前后流程直接都是环环相扣的,不能说先完成某项再来处理前面未完成的。软件开发的过程中,也经常会用到此种场景。对于一个对象经过不同的处理器(过滤器)去处理,这里其实就运用到了今天所要讲的设计模式责任链模式。定义责任链也叫职责链,将请求的发送和接收解耦,让多个接收

2021-11-06 22:07:20 235

原创 设计模式-访问者模式及应用

在软件开发的过程中,经常会对一个数据结构(对象数据)进行不同的业务操作,被访问的方法也不同。例如我们对一个权限管理系统某一个用户对象做操作,用户的用户名查询、更改,用户的积分查询,用户的权限查询等。为满足不同的业务,且单一职责的原则。都是对一个对象,有不同的操作。现实生活中,比如我们使用某应用软件观看一部电影,对本部电影发表自己的见解评论及评分。每个用户的评价肯定都是不同的,但是评价的对象都是这部电影。 这种被处理的数据相对稳定且唯一,而访问的方式有多种,使用今天所要介绍的设计模式(访问者模式),处理此类

2021-11-04 19:40:20 198

原创 设计模式-策略模式及应用

在平时的编码过程中,我们往往会遇到一个接口的实现会有多种,不同的实现(不同的策略)使用在不同的场景中。举个简单的场景,项目中使用到的站内消息,站内消息的存储介质我们可以是关系型数据库(又分不同的厂商),也可以是非关系型数据库。比如新增插入一条消息这个方法,他的实现方式可能就会很多,如我们现实为了满足不同的客户,关系型数据库使用的有mysql、oracel有些客户则使用的是mongonDB非关系型数据库,客户根据自己的需求,我们动态去调整切换,而无需重新开发。不单单是代码层面,比如每年的双十一,我们买一件商

2021-11-03 19:52:21 247

原创 设计模式-迭代器模式及应用

在程序设计中,要访问集合对象时。一般通过for循环、foreach、迭代器等方式。Java中的集合提供都有迭代器,例如 Collection、List、Set、Map 都提供了迭代器,我们只需要获取相关迭代器,就可以对元素进行遍历。本文讲解的就是迭代器模式,JDK虽然已经提供了迭代器,自己如何实现迭代器模式,来遍历集合或者聚合的对象。迭代器模式定义与结构迭代器(Iterator)模式的定义:迭代器提供一个顺序方法指定类型聚合对象的操作,而不暴露聚合对象的内部细节。1.迭代器模式的结构:迭代器模式是

2021-06-21 22:41:02 179 1

原创 设计模式-模板模式及应用

一般生活中我们办理一件事需要一套指定的流水线。例如银行办事,需要先去营业厅取号、排队、办理业务、综合评分。这一套固有的流程,取号、排队、综合评分等都是固定的,不同的客户会办理不同的业务,只有这块是没个客户不同的。类似于这种有固定的流水线,在软件设计的过程中,也是时长被使用到的。定义这条流水线的方法为模板方法,执行到每个环节在调取相应方法的函数。在设计模式中,此类的问题为模板方法模式,下面就通过案例来说一下模板方法的使用。定义及结构特点看下GOF《设计模式》一书中的定义:模板方法模式在一个方法中定义一个

2021-05-17 22:49:22 1140 9

原创 设计模式-观察者模式及应用

在现实生活中,任何对象事务都不是孤立的。往往一个对象的改变,可能会造成相关对象的连锁反应。比如说我们日常生活中,参与公共交通的过程。红灯行绿灯行是灌输在每个人的意识中,当路口的红绿灯(对象)是红色时,所有参与这个路口的机动车、行人(对象)都会暂定,等待绿灯的指示的到来。类似于这种案例生活中还有很多,比如我们订阅了某个微信公众号,当公众号主体推送一篇公众号推文。所有的订阅者这时候都会收到此篇文章。程序的设计中,我们也有类似的模式。这就是接下来要说的观察者模式的使用。定义及结构特点观察者(Observe

2021-05-12 17:46:32 158 1

原创 设计模式-代理模式及应用

"代理"反应到生活中,有很多类似的案例。例如之前互联网没有那么发达的时候我们买火车票,除了去火车站买,往往每个区域或者街道会有火车票代售点。各个代售点,就类似于我们的代理模式中的代理对象。完成被代理对象的功能操作(这里就是买车票),代理点的剩余车票数量和火车站买的都是事实的。我从代理售卖窗口也能买到我需要的车票。在程序的设计过程中,我们往往需要一些额外的功能来统计或者做一些其他的业务操作。比如我们记录每个方法的执行时间,如果在每个方法的开始和执行完业务操作的末尾,统计时间并记录下来。这里的冗余代码会很多,

2021-04-28 09:18:44 93

原创 设计模式-组合模式及应用

组合模式在我们的生活场景中也有体现,比如说我们的公司组织结构,大的部门中间包含一个个一级部门,一级部门下还有不同的子部门。 或者说我们计算机中的文件系统,根目录下有各文件,文件夹下可以有子文件夹,也可以有文件。子文件夹下也可以有文件夹或者文件。类似于这种树形结构的业务架构,今天所说的组合模式能可好的解决此类问题。组合模式的定义与结构组合(Composite Pattern)模式的定义:将一组对象组织(Compose)成树形结构,以表示一种“部分-整体”的层次结构。使用户对单个对象和组合对象具有一致的访问

2021-04-26 23:12:40 193

原创 设计模式-享元模式及应用

  在程序开发的过程中,往往会存在大量的重复的对象。重复的创建对象往往需要虚拟机开辟多块内存来存储这些对象,这就造成了内存的浪费。如果流量洪峰过来,而且对于系统的稳定性也是一个挑战。享元模式就可以解决我们所说的问题,“享元”何为享元,就是共享对象。重复的对象,无需重复创建,节约了内存空间。享元的定义与特点  享元模式的定义提出了两种边界的要求,一个是内部状态,一个是外部状态。内部状态指对象共享出来的信息,存储在享元信息内部,并且不回随环境的改变而改变;外部状态指对象得以依赖的一

2021-04-22 20:18:07 111

原创 设计模式-外观模式及应用

  外观模式,有的资料也叫做“门面模式”,外观模式使用比较简单,使用的频率也不高,主要是这个思想。  举个生活中的例子,我们知道之前如果办理个证件后者手续,没有互联网之前,我们要各个单位部门的跑,可能一趟还不行;之前不是网上吐槽政府机构办事效率的问题,就是为了证明“我是我自己”。  现在各个行业都走上了信息化,不用来回跑,直接在网上就能办好很多事情,当然也不乏需要去现场的。大家手机里都会有支付宝这个APP,上面的“市民中心模块”,功能涵盖了很多我们常办的事情,什么生活缴费、

2021-04-21 09:25:58 152

原创 设计模式-桥接模式及应用

 在了解桥接模式之前,我们试着理解的这个名称的含义。“桥接”(Bridge Design Pattern),有连接引用之意。在GoF的《设计模式》一书中,是这样描述的 “将抽象和实现解耦,让它们可以独立变化”。抽象与实现解耦我的理解是,用连接替换继承,减少父类对子类的侵入性。  另外一种说法是一个事物属性的对维度解耦,举个例子我现在要买一台手机,首先我对手机的颜色有要求,其次我对其拍照的像素也有要有,最后可能我还会对手机的品牌再有些要求。这时候手机这个对象,就抽出了三个维度属性,程序

2021-04-19 23:23:29 156

原创 设计模式-适配器模式及应用

 生活中经常出现两个“事物”不能直接匹配,需要中间加一层转换层实现原本不兼容的接口或者规范变得通用。例如我们使用的各种电源适配器,还例如我前段时间更换电脑的SSD,应因新的SSD与老的不兼容,中间加了个转换头等等。 在程序软件世界中,同样存在着此问题。我们需要使用某些成熟的组件,但是接口或者方法定义又使得我们无法直接使用,而又不能去修改运行稳定的代码。重新开发的话成本和代价都很高,这可以通过中间加一层适配层来转换组件与新使用方的关系,从而达到复用组件的目的。这就是今天所要说到的适配器模

2021-04-14 20:14:53 112

原创 MacbookPro 15硬盘升级踩坑记

  前段时间入职新公司,公司标配电脑MacAir,不区分工种,行政开发统一配置。 用了几个月,随着项目越来越多,代码编辑器打开的项目,还有其他软件越来越多,最近实在受不了这速度。 别人启动个项目几十秒(已经提前换了自己的电脑),我编译将近半分钟,才开始启动,要花将近2分多钟。。。太耽误工作效率。想着陪着自己征战几年的15款MacbookPro,是时候发挥一下预热。但是硬盘容量实在是心有力而力不足,我的机子原本事15款硬盘256G,内存16G版本的。 内存比起公

2021-04-05 13:42:49 3932 4

原创 设计模式-装饰器模式及应用

  在传统的软件开发过程中,如果想对某一组件扩展相应的功能,首先想到的可能是继承的方式来实现。但是如果要增加一系列的功能的话,随着功能的增多。子类就会很膨胀,而且继承的方式耦合性很高。不便于我们代码后续的扩展,也违背了我们的开闭原则。  举个生活中的例子,我们去奶茶店点杯原味奶茶,如果我们想要加自己喜欢的料,比如有的人可能喜欢红豆,有的人喜欢珍珠,有的人两样都加…;这种配料组合搭配的方式很多。而且只是对我一杯奶茶上增加辅料,最后我得到的(对象)还是这杯奶茶。&nb

2021-03-30 09:23:53 203

原创 设计模式-建造者模式及应用

在系统开发中,往往会有创建一个复杂对象的需求。这个复杂对象由多个子部件组合而成。例如我们现在需要组装一台计算机,计算机由CPU、主板、硬盘、内存、显示器、鼠标、键盘…等组装而成,而选择需要根据我们真实的使用场景去组装不同配置的电脑。例如同一个公司的同事,不同岗位对计算机配置的需求也不同,研发同学的配置可能会高,而文职类工作的同学配置就无须那么高。公司IT运维部门的同学就需要按照不同需要组装不同配置的电脑。各个组件灵活替换,按需装配。类似于这种场景产品的创建,下面介绍的建造者模式,就能很好的描述此类场景。

2021-03-17 19:32:12 133

原创 设计模式-原型模式及应用

在一些系统中,可能会出现大量的相同的对象或者相似的对象,且创建此类对象时,会比较复杂且耗资源。那么使用本节需要讲的原型模式,可以解决此类问题。原型模式原型(Prototype)模式的定义如下:使用已经创建的对象,通过复制原型对象的方式创建相同或者相似的对象。无需知道创建对象的细节。原型模式结构与实现Java 提供了对象的 clone() 方法,所以用 Java 实现原型模式很简单。模式的结构原型模式包含以下主要角色。抽象原型类:规定了具体原型对象必须实现的接口,在这里指Cloneable

2021-03-11 22:40:35 97

原创 设计模式-抽象工厂模式及应用

在》中,可以看到一种工厂,只“产生”一种类别的具体产品信息,同种类称为同等级,也就是说:工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。模式的定义与特点抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。抽象工厂模式是工

2021-03-09 22:27:07 137

原创 设计模式-工厂方法模式及应用

在 简单工厂模式 一节介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。模式的结构与实现工厂方法模式由抽象工厂、具体工厂、抽象产品和具体产品等4个要素构成。本节来分析其基本结构和实现方法。模式的结构 工厂方法模式的主要角色如下。抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产

2021-03-05 09:55:39 113 2

原创 设计模式-简单工厂模式及应用

目录简单工厂模式角色代码案例优缺点应用场景简单工厂模式的典型应用及源码分析简单工厂模式 工厂模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。下面将陆续讲解几种设计模式。简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实

2021-03-03 19:27:21 202 1

原创 设计模式-单例模式及应用

设计模式-单例模式及应用单例模式单例模式三要素8种创建单例对象示例1.恶汉式-静态常量 (线程安全)2.恶汉式-静态变量 (线程安全)3.懒汉式(线程不安全)4.懒汉式-同步方法(线程安全)5.懒汉式-同步代码块(线程安全)6.双重锁检查(线程安全)7.静态内部类(线程安全)8.枚举(线程安全)单例模式的安全性序列化攻击序列化问题解决反射攻击终极方案枚举单例模式总结单例模式应用单例模式所谓的单例模式,就是采取一定的方法保证在整个系统中,对某个类只有一个对象实例;并且该类只提供一个获取该对象实例的方法。

2021-02-26 16:40:55 146

原创 Redis集群搭建&扩容

Redis集群搭建&动态扩容资源准备节点扩容本次采用伪集群的搭建方式,三主三从 端口分别是7001~7006资源准备下载安装资源下载路径:http://www.redis.cn/download.html这里使用的是5.0.5版本安装上传至指定服务器,解压。安装目录 /opt/redis-cluster/7001#进入解压目录cd /opt/redis/redis-5.0.5#安装make install PREFIX=/opt/redis-cluster/7001

2020-08-14 13:47:09 137 3

原创 Hbase安装与配置

这里写目录标题环境准备zookeeper集群安装Hbase安装集群启动环境准备首先需要安装配置好hadoop集群、zk集群,hadoop集群的搭建部署,可以参考 https://blog.csdn.net/fw19940314/article/details/107978151 博客zk的安装,这里再详细说一些配置流程。环境准备主机teacher1 192.168.52.133teacher2 192.168.52.135teacher3 192.168.52.136配置好免密操

2020-08-13 17:14:03 182

原创 Hadoop安装与集群配置

Hadoop安装与集群配置环境准备环境准备JDK 卸载安装hadoop安装集群环境配置集群启动集群测试环境准备主机服务器 CentOS 7.x X3Hadoop 7.2JDK 1.8环境准备主机teacher1 192.168.52.133teacher2 192.168.52.135teacher3 192.168.52.136集群部署规划节点teacher1teacher2teacher3HDFSNameNode,DataNodeDataN

2020-08-13 14:36:27 113

原创 FastDFS + Lua +GraphicsMagick 实现动态缩略图

FastDFS + Lua +GraphicsMagick 实现动态缩略图图片处理安装 GraphicsMagick安装nginx插件安装lua脚本图片处理本文使用GraphicsMagick的版本为1.3.18 (Released March 9, 2013)。简介GraphicsMagick是一个短小精悍的的图片处理工具和库集合。对于Java开发者来说,常用的图片处理工具有3个,JDK自带的图片处理库,ImageMagick,GraphicsMagick。JDK自带的图片处理库,虽稳定简单,

2020-07-24 23:00:53 460

原创 FastDFS 安装使用

FastDFS简介FastDFS是一个开源的 轻量级 分布式文件系统。它解决了大数据量存储和负载均衡问题。特别适合以 中小[4k-500M]文件为载体的在线服务。FastDFS特性分组存储,灵活简洁、对等结构,不存在单点文件不分块存储,上传的文件和OS文件系统中的文件一一对应文件ID由FastDFS生成,作为文件访问凭证,FastDFS不需要传统的name server和流行的web server无缝衔接,FastDFS已提供apache和nginx扩展模块中、小文件均可以很好支持,支持海

2020-07-24 22:44:26 280

原创 Mysql MHA 环境搭建

Mysql MHA 环境搭建基础架构环境准备MHA 工作原理Mysql主从环境搭建Master 主机配置slave 1从机配置slave 2 从机配置(备选主)主从设置MHA 搭建(坑很多)各服务之间配置ssh互认(免登陆认证)MHA安装配置MHAmha检查故障演示基础架构MHA(Master High Availability) 有 MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一

2020-07-04 01:55:18 495

原创 Springboot事件机制整合EventBus应用(事件驱动模型)

事件驱动模型事件监听机制观察者模式案例1.Spring事件机制(事件监听机制)案例2.基于Springboot事件监听机制整合EventBus应用案例3.事件监听机制熟悉Spring的同学,spring提供了一套完整的事件监听机制。要了解spring不妨先熟悉一下,观察者模式。Java 从1.0版本,已经有了观察者模式的设计。下面通过一个案例来了解一下Java所提供的观察者模式。观察者模式...

2019-08-22 15:10:07 16784 7

原创 基于Netty实现私有化协议(序列化数据结构协议ProtoBuf)

因为项目需要,需要自定义通信协议。序列化协议使用到了Google的ProtoBuf,这里也是通过一个案例来实现基于Netty的私有化协议的开发。protoBuf 介绍Google Protocol Buffer(protoBuf)是一种平台无关,语言无关,可扩展且轻便高效的序列化数据结构的协议,相比传统的XML、JSON序列化的方式,更小、序列化更快、传输速度更快。只需要定义一次你的结...

2019-06-25 21:58:49 639 1

原创 使用Docker 安装Elasticsearch、Elasticsearch-head、IK分词器 和使用

Elasticsearch的安装一、elasticsearch的安装1.镜像拉取docker pull elasticsearch:tag2.启动docker run -it -e "discovery.type=single-node" --name="es" -p 9200:9200 -p 9300:9300 elasticsearch 3.查看启动是否成功fengweid...

2019-01-14 19:55:02 8361 3

原创 Mybatis There is no getter for property named 'userId' in 'class java.lang.Long'

记录一个Mybatis错误,搞了老半天没找到原因,原本是这个样子的,我的parameterType参数是Long型,在下面引用时,也有注明jdbcType类型,但是一直报这个错There is no getter for property named 'userId' in 'class java.lang.Long'结果查询资料得出,是因为mybatis参数解析的问题。后面有机会研究一下...

2018-12-03 16:27:19 5361 1

原创 Springboot 学习之Swagger2整合

背景 在如今前后端分离的大背景下,前后端唯一打交道的就是API接口。前端只需要向后端请求url地址,后端只需将数据返回即可。前端工程师拿到的既是后端给到的一份完整的API文档,如果项目体量非常大的情况下,整理这些文档就需要浪费大量的时间。如果业务有变更的情况下,还需要再去更新文档,维护成本也是非常大。今天介绍的主角就是Swagger在线生成API文档,极大的减少了人力的维护成本。可以在线直接...

2018-11-05 15:54:42 192

原创 Docker 搭建javaweb运行环境

公司最近准备将java 环境放在docker容器上跑,方便以后做环境的迁移。趁着这次机会有时间来好好的学一一下docker的使用。下面是整理的一份文档,分享出来,供大家使用。一、虚拟机Docker服务安装1.1Linux(Ubuntu)Ubuntu系统安装,要求系统内核版本高于3.10,内核版本查看uname -r;1.1.1获取最新版本的 Docker 安装包#拉取安装包wget -...

2018-10-24 18:21:05 596

原创 Mybatis SqlSessionFactory常用创建方式(IDEA)

    最近在重新看mybatis文档时,又将mybatis的基本操作又练了练手。mybatis的操作,是通过SqlSessionFactory对象来操作数据sql,官网也写了两种SqlSessionFactory对象的创建方式,下面说一下两种方式不同的区别,一种是基于XML配置文件的创建方式,一种是JAVA代码的方式。今天想记录这篇博客也是因为中间通过Java代码创建方式的时候,中间遇到些问题。...

2018-08-18 11:08:50 11379 4

原创 SpringBoot学习之RabbitMQ整合

    RabbitMQ消息中间件,是一个由erlang开发的AMQP(Advanved Message Queue Protocol)的开源实现。可通过消息服务中间件来提升系统异步通信、扩展解耦能力。理论上的内容,就大概一下,这次主要说SpringBoot与RabbitMQ的整合。     消息服务,java自己也有一套实现JMS(Java Message Service)。基于JVM消息代...

2018-08-14 09:47:38 218

原创 SpringBoot 学习之Redis缓存技术

     在操作完SpringBoot底层使用的Spring的缓存之后见上一篇博客(链接地址),接下来学习一下在SpringBoot中是如何使用Redis缓存,怎样将springBoot与Redis相结合使用。   SpringBoot对Redis提供了完美的支持,我们如果想使用Redis,可以直接在通过引入spring-boot-starter-data-redis,SpringBoot会提...

2018-08-13 10:18:59 515

原创 SpringBoot学习之基于注解的Spring缓存技术

     Spring 从3.1版开始,Spring Framework提供了对现有Spring应用程序透明地添加缓存的支持。与事务 支持类似,缓存抽象允许一致地使用各种缓存解决方案,而对代码的影响最小。从Spring4.1  开始,JSR107提供了注解开发模式,以及自定义选项的支持,缓存技术得到显著的改善。Spring官网对本章介绍链接地址     Spring使用的缓存抽象也是基于JSR...

2018-08-10 19:51:53 2287

原创 SpringBoot 学习之整合Mybatis (注解&配置文件)

     今天主要介绍一下SpringBoot与MyBatis框架的整合,主要介绍两种方式的整合,一种是我们传统的xml配置文件的方式,另外一种是我们springBoot推崇的配置文件的方式整合。     配置文件方式        首先来介绍一下基于配置文件的整合;     首先需要我们创建一个SpringBoot的Maven项目,这里使用的是IDEA工具,选择需要的模块,Maven...

2018-08-09 17:55:44 3689

原创 Docker常用命令

       在本机安装完Docker后,该如何使用常用的操作,这和我们操作git命令是差不多的;因为本来的Docker的部分概念还是和git是差不多的。下面说一下在使用Docker时候,怎么来使用命令操作Docker。     常用命令      可以通过 docker --help 查看有哪些相关的命令;就如同我们在linux中使用的man命令;fengweideMacBook-...

2018-08-06 17:27:57 188

原创 SpringBoot 学习之自动配置讲解

       今天说一下SpringBoot自动配置的原理,在我们之前进行的web项目开发过程中,配置文件配置繁琐,如果是多个框架集成的话可能还维护多个配置文件。这样会将我们的很多时间去花在维护配置文件,假如加一个小的功能可能就需要一个繁杂的配置。到了SpringBoot后,这种情况就大大的改善,甚至于我们如果使用了默认的配置,我们就无需再去为这些配置文件所耗费时间,专心的去考虑我们的业务功能该如...

2018-08-04 19:58:16 489

原创 Mac 安装Mongodb 配置和启动

需求:因为项目中要用到Mongodb数据库,所以需要在本机安装。下载与安装步骤  Mongondb 官网下载地址;下载了MAC OS版本;下载完成后,解压到指定的文件夹;这里我在/usr/local路径下新建了mongodb文件夹,解压放在这里;解压完成后是这个样子的;我们新建一个data文件夹,data文件夹下再建一个db文件夹,存储数据;配置在本机的...

2018-08-01 18:25:17 3823 1

收费软件下载

收费软件,免费下载!星宇收费软件,免费版版,免费下载

2015-06-29

空空如也

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

TA关注的人

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