自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

inconspicuousy-start

一步一个脚印,出发吧!!!

  • 博客(53)
  • 资源 (3)
  • 收藏
  • 关注

原创 抛开数据结构,InnoDB中B+树究竟存的是什么

文章目录提出问题数据页数据页的组成User RecordUser Record的特点Page Directory多个数据页之间的关系存储目录信息的数据页索引聚簇索引特点二级索引特点唯一索引联合索引番外话提出问题InnoDB中B+树各个节点存储的内容是什么?InnoDB中索引的种类有哪些?它们节点存储的内容各自有什么区别?数据页InnoDB中页是内存和磁盘交互的基本单位, 默认是16KB。其中存储用户记录的页被称为数据页,也被称为索引页。数据页的组成其中我们重点关注的就是 User R

2022-03-17 14:34:56 2869

原创 Ubuntu使用root用户远程登录

Ubuntu使用root用户登录图形化界面且开启ssh远程登录服务开启命令如下(默认登录的是一个普通用户):inconspicuousy@inconspicuousy:~$ sudo passwd root[sudo] inconspicuousy 的密码: 输入新的 UNIX 密码: 重新输入新的 UNIX 密码: passwd:已成功更新密码inconspicuousy@inconspicuousy:~$ su root密码: root@inconspicuousy:/home/inc

2020-11-18 11:51:13 291

原创 行为型模式之解释器模式

行为型模式之解释器模式1. 简介解释器模式(Interpreter Pattern)指的是给定一个表达式,定义它的文法的一种表示,并定义个解释器,使用该解释器来解释表达式。比如,Mybaties、hibernate都有自己的文法,使用者需要编写类似的SQL文法的语句,然后交给ORM框架进行解析然后执行。2. 相关角色Abstrat Expression- 抽象表达式解释器, 定义解释器的接口,主要就是声明interpret方法。Terminal Expression- 终结符表达式解释器

2020-11-05 18:10:03 186

原创 HttpServletResponse

HttpServletResponse1. 简介HttpServletResponse接口继承于ServletResponse接口,主要用于封装HTTP的响应信息,通过Servlet的service方法将响应消息发送给客户端。2. 相关方法由于 HTTP 相应消息分为状态行、响应消息头、消息体三部分。因此在 HttpServletResponse 接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。2.1 发送状态码相关的方法方法名称方法签名描述注意se

2020-11-04 13:31:38 702

原创 RequestDispatcher

RequestDispatcher1. 简介见名自其义,RequestDispatcher实现的是请求转发。请求转发的意思就是说通知其他web资源处理当前Servlet的请求。RequestDispatcher对象由Servlet容器创建, 该对象用于接收客户端的请求并将请求发送到服务器上的任意资源(例如:Servlet,HTML文件或JSP文件)。因为对于RequestDispatcher对象来说,WEB资源都是可见的,可直接将请求转发到任意资源。RequestDispatcher对象可用于将

2020-11-03 23:50:50 4518 1

原创 HttpServletRequest

HttpServletRequest1. 简介javax.servlet.http.HttpServletRequest是Servlet处理HTTP请求的http包下的一个接口。该接口用于为处理HTTP请求的Servlet提供请求信息。Servlet容器在接收到HTTP请求时,会创建HttpServletRequest对象,并将该对象作为参数传递给Servlet的service方法。下面就是 HttpServlet的service方法。@Override public void ser

2020-11-03 16:15:36 504

原创 ServletConfig

ServletConfig1. 概述ServletConfig是Servlet容器使用的Servlet配置对象,用于在初始化期间将信息传递给Servlet。简单来说,就是负责保存Servlet的配置信息, 包括Servlet初始化参数。我们在Servlet接口中可以看到初始化方法public void init(ServletConfig config) throws ServletException;在Servlet调用init方法初始化时,会作为方法参数传递给Servlet。2. 方

2020-10-27 00:31:49 150 1

原创 Servlet配置虚拟路径映射

Servlet配置虚拟路径映射1. 简介虚拟路径:在web.xml文件中,一个<servlet-mapping>元素用于映射一个Servlet的对外访问路径,该路径也就是所说的虚拟路径。Servlet容器就是解析客户端的请求路径,根据符合条件的虚拟路径找到能够处理请求的Servlet的。 <servlet-mapping> <servlet-name>LifecycleServlet</servlet-name> &

2020-10-24 23:04:40 1513

原创 Tomcat启动乱码问题

Tomcat启动乱码问题情景描述:1、当使用Tomcat的 startup.bat启动Tomcat时,启动的控制台出现乱码。2、当将外部Tomcat作为Idea的Web服务器时,Idea的控制台输出出现乱码。1. 原因及其解决方案乱码出现的原因则是因为字符的编码方式和解码方式不一致导致的。在windows电脑中,系统默认的编码方式为GBK,而Tomcat默认的控制台的编码方式UTF-8,我们只要将其更换为一致即可。2. 解决方式2.1 Tomcat控制台编码方式配置从Tomcat安装目

2020-10-23 17:04:19 773

原创 Servlet

Servlet1. 简介Servlet 是在Web服务器中运行的小型Java程序,Servlet通常通过HTTP(超文本传输协议)接收和响应来自Web客户端的请求。在Java中定义了一个 Servlet接口,该接口定义了所有的Servlet必须实现的方法。针对Servlet接口,Sun公司提供了两个默认的实现类: GenericServlet、HttpServlet。其中,GenericServlet是一个抽象类,该类为Servlet接口提供了部分实现,他并没有实现HTTP请求处理。一般我们

2020-10-23 17:02:08 99

原创 ServletContext

ServletContext1. 简介ServletContext是一个接口,称为Servlet上下文。ServletContext定义了一组Servlet与其容器进行通信的方法,例如获取MIME文件类型、进行请求的调度、写入日志等。2. 作用范围每个Java虚拟机的每个Web应用程序都有一个上下文。注意:该处的上下文有且仅有一个,我们可以通过该上下文实现全局数据共享,多个Servlet之间的消息传递。一个Java虚拟机中可以存在多个Web应用程序,也就是说会存在多个上下文,在这种情

2020-10-23 17:01:16 187

原创 Servlet技术概述

Servlet技术概述1. 什么是 ServletServlet是基于Java技术实现的Web组件,是在Web服务器上运行的小型的Java程序,Servlet通常通过HTTP接收和响应来自Web客户端的请求,可以被基于Java技术实现的Web服务器动态加载并运行。1.1 基于 Java 实现的 Web 服务器列表TomcatJetty1.2 Servlet Jar包普通的Java EE项目一般我们项目中如果添加了 Tomcat Web 服务器配置的话, 会自动引入 Servlet

2020-10-23 16:59:38 532

原创 SPI源码解析

SPI源码解析1. 什么是SPISPI是Service Provide Interface的简称,是JDK内置的一种服务提供发现机制。简单来说, 就是用来发现某个接口或者规范的实现类。2. 快速开始2.1 项目结构2.2 类图2.3 相关代码Service接口类package com.inconspicuousy.spi;/** * 待实现的接口类 * @author peng.yi */public interface Service { void say

2020-10-15 11:27:19 453

原创 MapStruct高性能实体类映射工具

MapStruct高性能实体类映射工具1. 简介MapStruct是一个Java Annotation Processor注解处理器。利用注解生成类型安全的bean映射类。2. 快速开始Talk is cheap. Show me the code.2.1 类图设计2.2 pom文件定义引入必要的依赖设置项目属性<properties> <!-- 设置项目源代码的编码方式 --> <project.build.sourceEncodi

2020-10-15 10:00:54 993

原创 解决Idea控制台乱码问题

解决Idea控制台乱码问题场景描述在大多数Web服务器中,比如Tomcat,默认设置的控制台编码方式为UTF-8,但是默认情况下,Idea控制台编码方式为GBK,所以我们将两者改为一致即可。1. Tomcat控制台编码方式设置tomcat控制台日志输出配置文件为tomcat安装位置下conf/logging.properties。其中 java.util.logging.ConsoleHandler.encoding属性就是设置控制台编码方式的,默认情况下设置为java.util.logging

2020-10-15 09:58:16 1167 2

原创 结构型模式之组合模式

结构型模式之组合模式1. 简介组合模式(Composite Pattern)又叫部分整体模式。他创建了对象组的树形结构,将对象组合成树状结构表示整体-部分的层次关系。简单来说,组合模式常用于构建具有层级关系的类结构。组合模式依据树形结构来组合对象,层级高的为父节点,最底层为叶子节点,层级高的包含子节点。所有的对象都是节点,具有统一的类型,组合模式使得客户端对单个对象和组合对象的访问具有一致性,即组合模式能让客户端以一致的方式处理单个对象或者是组合对象。2. 组合模式相关角色Compone

2020-10-15 09:54:02 168

原创 结构型模式之装饰者模式

结构型模式之装饰者模式1. 简介装饰者模式(Decoretor Pattern)别名也叫包装器(Wrapper)。主要作用就是已对客户透明的方式动态的给一个对象增加一些额外的职责。透明的方式:客户端并不会觉得对象在装饰前和装饰后有什么不同。动态:给对象添加的职责是可以控制的,不同的装饰器实现类具有不同的职责。简单来说,装饰器模式就是为原有的对象添加一些额外的功能,装饰器通过与被装饰者组合后,就可以对原有的被装饰者对象进行职责添加。为什么对象在装饰前和装饰后客户端并不会觉得对象有什么不同?是因

2020-10-15 09:53:19 95

原创 结构型模式之享元模式

结构型模式之享元模式1. 简介享元模式(Flyweight Pattern)也叫蝇量模式。享,表示共享;元,表示对象。享元模式就是利用共享技术实现大量细粒度对象的重用。什么是细粒度对象?享元模式中将对象的内容区分为内部状态和外部状态。内部状态指对象共享出来的信息,存储在享元对象的内部不会随着环境的变化而变化。外部状态指对象得以依赖的一个标记,是随着环境改变而改变不可共享的状态。举例来说,线程池就是用来管理共享线程对象的工厂容器,普通线程对象中线程的状态是需要共享的内容就是内部状态, 而对

2020-10-15 09:52:41 79

原创 结构型模式之外观模式

结构型模式之外观模式1. 简介外观模式(Facade Pattern)又叫门面模式。外观模式主要就是说提供一个接口用控制访问一系列子接口。对于客户端来说, 只与高层接口打交道,并不知道真正执行的子系统细节。2. 代码演示情景描述:我们平时通过遥控器控制电视的开关,做到一键启动和一键关闭。这里的遥控器就是客户端,电视就是外观模式中的高层接口。遥控器与电视直接交互,不知道电视内部子系统的执行细节。打开电视,打开显示器,启动相应的启动类软件。关闭电视,关闭所有的软件,关闭显示器。2.1

2020-10-15 09:51:50 91

原创 结构型模式之适配器模式

结构型模式之适配器模式1. 简介适配器模式(Adapter Pattern)主要就是将某个类的接口转换成客户端期望的另一份接口,让原本因接口不匹配不能一起工作的两个类可以协同工作。适配器的别名也叫包装器(Wrapper)。简单来说, 与客户端交互的是适配器,客户端是感知不到被适配者的存在。客户端与适配器交互时,真正底层工作就是被适配者。2. 适配器的分类适配器的分类依赖于被适配者和适配器组合的形式。类适配器,适配器继承被适配者对象适配器,适配器与被适配者采用组合的关系接口适配器,默

2020-10-15 09:51:13 110

原创 结构型模式之桥接模式

结构型模式之桥接模式1. 简介桥接模式(Bridge Pattern)又叫接口模式(Interface Pattern)。桥接模式主要是说将实现和抽象放在两个不同的类层次中,使两个层次可以独立改变。桥接模式基于类的最小设计原则,通过使用封装、聚合、继承等行为让不同类承担不同的责任。主要特点是将抽象和行为实现分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。简单来说,就是从多个维度考虑设计一个类时,可以将每个维度抽象出来形成一个接口或者是抽象类,最后再以组合的形式将接口的实现类组合在一

2020-10-15 09:50:42 146 1

原创 结构型模式之代理模式

结构型模式之代理模式1. 简介代理模式(Proxy Pattern)主要是为一个对象提供一个替身,客户端通过这个替身可以对目标对象进行访问。代理的底层原理基本上就是当执行代理的某个方法时,底层真正执行者就是被代理对象,只是说代理对象负责与客户端进行交互。注意:代理模式真正的核心是提供一个替身去访问目标对象,其中对原方法做一些增强只是代理模式的附属品。2. 静态代理静态代理的静态就是通过硬编码,在代码还没运行时就确定代理类代理的目标类。代理条件:被代理类要有实现一个接口。核心逻辑就是代理

2020-10-15 09:49:53 68

原创 行为型模式之状态模式

行为型模式之状态模式1. 简介状态模式(State Pattern)是指对有状态的对象,把复杂的判断逻辑提取到不同的状态对象中,允许状态对象在其内部状态发生变化时改变其行为。什么是有状态的对象?对象的某些属性与外部事件产生互动时会发生改变,从而使对象表现出不同的行为,这种影响对象行为的一个或者多个动态变化的属性称为状态,拥有状态属性的对象就是有状态对象。2. 相关角色Context- 上下文环境。负责维护一个当前状态,并将与状态相关的操作交给当前状态来处理。该类负责与客户端交互。简单来说

2020-10-14 19:16:11 103

原创 行为型模式之中介者模式

行为型模式之中介者模式1. 简介中介者模式(Mediator Pattern)又叫调停模式。中介者模式主要是定义一个中介对象来封装一系列对象之间的交互,使原有对象之间耦合松散,且可以独立的改变他们之间的交互。简单来说,多个对象之间的相互交互, 交给中间人去传话处理,实现多个对象之间的解耦,直接交互变为间接交互。独立改变: 当交流的规则发生改变时, 我们只需要修改中间人传话规则就行。2. 角色Mediator- 抽象中介者,因为涉及到多个对象的之间的交互, 所以需要提供管理对象的注册功能

2020-10-14 19:15:26 117

原创 行为型模式之职责链模式

行为型模式之职责链模式1. 简介职责链模式(Chain Of Resposibility Pattern):又叫责任链模式,为请求创建了一个接收者对象的链。简单来说, 将客户端与处理客户端请求的接收者进行解耦, 防止出现客户端与请求接收者交互式处理问题。当客户端发出请求时,由请求的接收者链式处理完之后将结果返回给客户端。举例来说, 当客户端发起请求时, 接收者A处理完交给接收者B处理, 接收者B处理完交给接收者C处理,以此类推,直到链式处理完请求将结果返回给客户端。在比如, Spring中队请求

2020-10-14 19:14:55 70

原创 行为型模式之模板方法模式

行为型模式之模板方法模式1. 简介模板方法模式(Template Method Pattern)又叫模板模式(Template Pattern)。模版方法模式主要就是建立一个抽象类定义一个算法的骨架,而将算法的一些步骤延迟到子类中完成,使得子类可以在不改变算法骨架的情况下,重新定义该算法中某些特定的步骤。注意:抽象类中的骨架方法最好用final修饰,防止子类对骨架方法进行重写。我们一般会在骨架方法中定义若干个钩子函数,使子类在某些步骤前后实现一些定制化逻辑。2. 代码演示情景描述:

2020-10-14 19:13:58 88

原创 行为型模式之命令模式

行为型模式之命令模式1. 简介命令模式(Command Pattern)主要就是说将命令抽象化成对象,使得命令的发起者和命令的执行者进行解耦,两者之间通过命令交互,这样方便对命令进行管理。简单来说,就是将执行命令抽象化成对象进行管理,比如我们可以将要执行的命令保存到队列中,队列依次执行相应的命令。2. 角色描述Command- 命令抽象化的接口,一般会定义命令的执行方法。ConcreteCommand- 实际具体的命令对象,一般命令对象会与命令的执行者产生组合依赖,方便执行者执行命令。

2020-10-14 19:13:21 79

原创 行为型模式之解释器模式

行为型模式之解释器模式1. 简介解释器模式(Interpreter Pattern)指的是给定一个表达式,定义它的文法的一种表示,并定义个解释器,使用该解释器来解释表达式。比如,Mybaties、hibernate都有自己的文法,使用者需要编写类似的SQL文法的语句,然后交给ORM框架进行解析然后执行。2. 相关角色Abstrat Expression- 抽象表达式解释器, 定义解释器的接口,主要就是声明interpret方法。Terminal Expression- 终结符表达式解释器

2020-10-14 19:12:43 109

原创 行为型模式之观察者模式

行为型模式之观察者模式1. 简介观察者模式(Observer Pattern)又叫发布订阅模式(Publish Subscription Pattern)。观察者模式指的是多个对象间存在一对多的依赖关系, 当一个对象的状态发生改变时,所有依赖与它的对象都得到通知并自动更新。发布者,是一对多对象关系中的1,负责管理和维护多个订阅者,当自身状态发生改变时,通知订阅者作相应的处理。订阅者,是一对多对象关系中的多,负责当接收到发布者通知时作相应的处理。2. 角色Subject- 抽象的发布者,

2020-10-13 10:02:50 403 1

原创 行为型模式之访问者模式

行为型模式之访问者模式1. 简介访问者模式(Visitor Pattern)主要是指有多种不同的处理方式处理一个对象中集合属性中的元素。此时这里不同的处理方式抽象出来就是访问者对象,每个访问者对于属性中元素都有自己的不同的理解和处理方式。注意:集合中的元素的种类是确定的, 因为对于访问者来说,对于不同的元素需要提前定义好不同的处理方式。但是对于元素的个数是不确定的,集合中可以有一个种类的多个元素。举例说明:对于游乐场, 游乐场中有多种不同的游乐玩具,对于游客来说有大人和小孩,大人和小孩对于游乐

2020-10-13 10:02:18 155 1

原创 行为型模式之迭代器模式

行为型模式之迭代器模式1. 简介迭代器模式(Iterator Pattern)主要就是说提供一种遍历集合元素的统一接口,在不需要知道集合底层表示的情况下,用一致的方法遍历集合对象。简单来说, 不用管集合底层是数组还是Java中的其他集合类, 统一都可以用一致的方法进行处理。2. 角色Iterator- 抽象迭代器接口,用于定义统一处理集合的方法,常见的方法就是hasNext、next、remove等。ConcreteIterator- 具体的迭代器对象,实现了迭代器接口中处理集合的方法,

2020-10-13 10:01:44 256 1

原创 行为型模式之策略模式

行为型模式之策略模式1. 简介策略模式(Strategy Pattren)是指封装一系列算法使他们之间可以相互替换,且算法的变化不会影响使用算法的客户。简单来说, 就是将用户某类行为抽象化成接口, 并提供一系列的实现。用来给用户赋予不同的行为属性,用户就表现出不同的行为。举例来说,旅行可以有坐飞机、坐动车等,做螃蟹可以有清蒸、红烧等。2. 相关角色Context- 上下文, 持有策略类的引用,也就是该用户的某类行为被抽象出来的。Strategy- 抽象策略接口, 用来定义抽象策略方法

2020-10-13 10:01:18 115

原创 行为型模式之备忘录模式

行为型模式之备忘录模式1. 简介备忘录模式(Memento Pattern)又叫快照模式, 主要就是保存对象在某一个时间的状态信息。备忘录模式就是程序中的后悔药。备忘录模式指的是在不破坏代码的封装性的前提下, 捕获一个对象的内部状态, 并在该对象之外保存这个状态, 以便以后当需要的时候能将该对象恢复到原先保存的状态。2. 角色Originator- 发起人,需要保存状态的对象。Memento- 备忘录,用于保存对象状态的对象。Caretaker- 管理者, 管理备忘录对象的对象, 提

2020-10-13 10:00:15 75

原创 创建型模式之原型模式

创建型模式之原型模式1. 简介原型模式(Prototype Pattern)是一种根据原型实例创建指定的类对象。简单来说就是在已知原有的类对象的情况下, 可以通过拷贝的方式获取到该类的新对象。在Java中Object类提供了clone方法,所以每个类都具有克隆的功能。2. 使用clone方法注意细节原型类必须实现 Cloneable 接口。原型类有必要重写 clone 方法, 因为从Object类继承过来的clone方法默认访问权限为protected, 需要重写该方法扩大访问权限。对于

2020-10-13 09:59:43 108

原创 创建型模式之建造者模式

创建型模式之建造者模式1. 简介建造者模式(Builder Pattern)又叫做生成器模式。他可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构建出不同表现的对象。简单来说,建造者模式是将对象属性的赋值操作分离出来,通过一系列的操作对对象的属性进行赋值, 不同的操作导致对象的属性不同,也就可以构建出不同表现的对象。注意,不是说一个操作对应一个赋值操作,两者之间没有数量关系。2. 建造者模式的四个角色Product- 最终需要生成的产品对象类。Builder- 抽象建造

2020-10-13 09:59:13 76

原创 创建型模式之简单工厂模式

创建型模式之简单工厂模式简单工厂模式(Simple Factory)又称为静态工厂方法模式(Static Factory Method)。简单工厂模式简单来说就是根据参数的不同返回不同类的实例。特点简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。代码演示类图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jwkkaf81-1602554304537)(https://raw.githubusercontent.com/in

2020-10-13 09:58:42 350 1

原创 创建型模式之工厂方法模式

创建型模式之工厂方法模式1. 简介工厂方法模式(Factory Method Pattern)是一种将创建对象的方法抽象化到抽象父类或者接口中, 然后实际的创建对象的逻辑交给子类去完成的一种模式。简单来说,就比如服装行业,大工厂只负责设计衣服的版面(建立生产衣服的规范),具体生产衣服需要由子工厂自己实现。2. 代码展示场景描述:此时, 我们需要建立一个支付服务体系。 消费者需要什么支付服务就从工厂类中获取对应的支付服务就行。父工厂负责建立创建支付服务的规范,具体的支付服务工厂实现具体的获

2020-10-13 09:58:14 295

原创 创建型设计模式之单例模式

创建型设计模式之单例模式单例模式(Singleton Pattern)采取一定的方法保证在整个软件系统中, 对某个类只能存在一个对象实例。使用单例模式减少对象的创建,可提升系统的性能,节省系统的资源。一般来说,实现的方式就是该类只提供一个静态方法获取其对象实例的入口。单例模式三种实现方式饿汉式在类加载的时候, 对象实例就随之创建。饿汉式实现方式之静态常量式package com.inconspicuousy.pattern.singleton.hungry;class Singl

2020-10-13 09:57:41 102

原创 创建型模式之抽象工厂模式

创建型模式之抽象工厂模式1. 简介抽象工厂模式(Abstract Factory Pattern)本质上是简单工厂模式和工厂方法模式的结合体。简单工厂模式和工厂方法模式面向的创建单一对象, 而抽象工厂模式面向的多元化的产品, 提供多种对象的创建。以服装举例来说,在很久之前,服装都是有用户自己在家里自产自;随着需求的提升,就有了专门的工厂来生产服装,也就有了简单工厂; 随着用户对服装个性化的差异性需求提升,简单工厂越做越大,实现将产品根据不同的款式由不同的工厂生产,总厂只负责定制服装的规范,这就有

2020-10-12 14:54:50 384

原创 设计模式的分类

设计模式的分类设计模式分为三种类型。创建型模式创建型模式(Creational Pattren)处理对象创建的设计模式。重点关注的是对象的创建。单例模式简单工厂模式工厂方法模式抽象工厂模式原型模式建造者模式结构型模式结构型模式(Structural Pattern)处理类或者对象之间的布局关系的设计模式。重点关注的是类或者对象的结构。适配器模式桥接模式装饰模式组合模式外观模式享元模式代理模式行为型模式行为型模式(Behavioral Patter

2020-10-12 14:54:16 72

adblock plus

可帮助谷歌屏蔽广告的插件,这里双击是提示安装失败的,打开浏览器,扩展工具,直接往里面丢就行!

2016-07-26

smartsvn破解,理论上适用于各种版本

smartsvn破解,理论上适用于各种版本

2016-03-27

空空如也

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

TA关注的人

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