自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(88)
  • 收藏
  • 关注

原创 mysql存储过程学习记录-一篇极速掌握存储过程

存储过程其实相对学起来我认为还是比较容易的。由于各个数据库的方言有些出入导致如何系统在开发过程中使用存储过程导致数据库迁移的难度是比较大的。一、存储过程简介一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有 SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。(1).存储过程增强了 SQL 语言的功能和灵活性。存储过程可以用流控制

2021-07-20 10:23:18 242

原创 Spingboot-jpa的原理分析

说到jpa应该是一组规范,就像jdbc一样,mysql和oracle都是实现了jdbc规范。hibernate也是实现了jpa规范的框架。同时我们经常谈到ORM ,hibernate也是实现了orm规范。行了在深入的了解jpa你可以看看官网以及其他博主的帖子介绍的比较详细。这里就没有必要写了。一、主要说一下jpa如何实现crud的操作。1、springboot来整合jpa 的maven坐标 <!-- hibernate对jpa的支持包 --> <depe

2021-07-01 12:06:02 600

原创 gradle构建项目 干掉maven的项目构建利器

gradle 在项目构建方面现在应该比maven来简单的多虽然groupId、artifactId、version组成的Coordination(坐标)唯一标识一个依赖。但是繁重的xml配置也是导致性能不如gradle的主要原因。一、gradle的下载https://services.gradle.org/distributions/下载地址http://services.gradle.org/distributions/ ,下载你所需要对应的版本,我这里下载的是gradle-4.7-bin.zi

2021-05-08 13:49:54 249 5

原创 还不会导入导出表格?easyExcel学习分享-干掉poi利器

写这篇文章我不会大篇幅的将easyExcel在性能读取速度以及内存消耗上面如何吊打03版的poi和07版的poi。网上关于这类框架底层分析的文章很多。而且我本人能力也没有达到那种程度。作为一个两年研发经验的程序员来说。学习完成之后我只会总结并且分享告诉你如何快速的掌握这款高性能的常用框架一、easyExcel主要是用来干什么的...

2021-04-27 19:11:17 201

原创 个人学习规划-送给所有奋斗的兄弟

这两天在持续学习react这一块前端框架,之前学习过vue,Angular学习起来是比较顺手的。去年项目前端就是用vue开发。结合element-ui组件用起来挺方便的。为什么今天要写一篇这样的博客呢。以前每一篇都是分享和记录学习的知识点。可能是最近挺好挺多身边的兄弟说没有时间学习提升自己。我当时也没说一些谁谁谁的学习经历或者学习方法。只是想这种问题确实都是一个通病。真的时间是挤出来的所以我只想把我自己的学习经历放到这个上面来,能够激励一些‘迷茫’ 的兄弟就行。我本身是19年毕业的。现在薪资10.5K,

2021-03-15 11:03:32 120 4

原创 springboot 整合swagger2

一、swagger的主要是用来干什么swagger已经不算什么很新的框架了,基本上各大项目组都在用。主要作用就是很多人员会抱怨别人写的接口文档不规范,不及时更新。但是当自己写的时候确实最烦去写接口文档。所以接口文档可以实时动态生成就不会出现上面问题话不多说,直接开整二、springboot整合swagger21、创建好一个springboot项目,加入依赖 <dependency> <groupId>org.springframework.b

2021-03-05 11:11:52 594 3

原创 Gof-责任链模式

继续打卡设计模式今天来聊一下的是责任链设计模式一、实际问题学校需要在OA审批采购项目中开发一个功能。需求大概是如果金额 小于等于 5000, 由教学主任审批 (0<=x<=5000)如果金额 小于等于 10000, 由院长审批 (5000<x<=10000)如果金额 小于等于 30000, 由副校长审批 (10000<x<=30000)如果金额 超过 30000 以上,有校长审批 ( 30000<x)...

2021-02-22 16:15:54 173 7

原创 Gof-策略模式

继续打卡设计模式今天来聊一下的是策略模式一、实际问题有各种鸭子(比如 野鸭、北京鸭、水鸭等, 鸭子有各种行为,比如 叫、飞行等)显示鸭子的信息【问题分析】:我们想如果直接编码我们可以写一个抽象的鸭子类。里面有叫 飞行 游泳等功能。然后我们让其它鸭子来继承这个抽象类。于是其它的子类来重写里面的方法,来完成对应的功能/** * @author: 德鑫 * Description: * @Date: 2021/02/07 */public abstract class Duck {

2021-02-20 17:53:17 148 4

原创 Gof-状态模式

继续打卡设计模式今天来聊一下状态模式依然是先提出一个实际需求一、实际需求现在有一个APP抽奖活动。我们需要编写程序来完成这个抽奖(1) 假如每参加一次这个活动要扣除用户 50 积分,中奖概率是 10%(2)奖品数量固定,抽完就不能抽奖(3) 活动有四个状态: 可以抽奖、不能抽奖、发放奖品和奖品领完这个问题我们看起来很像一个抽奖系统的核心流程。那么我们分析来看主要是需要解决对象在多种状态转换时,需要对外输出不同的行为问题。状态和行为是一一对应的二、状态模式来解决我们先写一个抽象类 里面包

2021-02-20 15:57:25 125

原创 Gof-解释器模式

继续打卡设计模式今天要聊一下的就是解释器模式一、实际问题四则表达式的问题。通过解释器模式来实现四则运算如 a+b+c具体要求先输入表达式的形式,比如 a+b+c-d+e, 要求表达式的字母不能重复在分别输入 a ,b, c, d, e 的值分析 :首先java代码实现一个表达式的运算肯定不难。我们完全可以根据一个方法所传递的形参来确定四则运算。但是一旦如果假如了新的运算就会出错二、解释器模式来解决该问题/** * @author: 德鑫 * Description: 抽象类表达

2021-02-06 16:18:45 134

原创 Gof-备忘录模式

继续打卡设计模式今天来聊一下的是备忘录模式一、实际问题先看一个实际问题。游戏角色有攻击力和防御力,在大战 Boss 前保存自身的状态(攻击力和防御力),当大战 Boss 后攻击力和防御 力下降,从备忘录对象恢复到大战前的状态分析该问题这个问题就是说保存一个对象的某一时刻的状态。基于这个状态我们可以选择在某个节点来恢复。简单的逻辑我们可以想到的是我们可以先new一个对象,再把需要备份的数据放到这个新对象,但这就暴露了 对象内部的细节。二、备忘录模式解决问题/** * @author: 德鑫

2021-02-05 13:28:57 71

原创 Gof-中介者模式

继续打卡设计模式今天来聊一下的是中介者模式一、实际问题智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘 等主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始 做咖啡->窗帘自动落下->电视机开始播放问题分析:首先大家搞清楚一点这个例子是不是有点类似于我们之前的命令模式说提供一个一致性的界面来操作是不是调用流程上更加清晰。我们传统方法的弊端就在于如果需要用到这一系列流程就必须让各个对象之间相互糅杂在一起增加耦合了。各个对象之间的

2021-02-04 18:25:23 92

原创 Gof-观察者模式

继续打卡设计模式今天来聊一下观察者模式气象站可以将每天测量到的温度、湿度、压力等以公告的形式发出1一、实际问题需要设计开发型的API。便于其它第三方也能接入气象站获取数据测量数据更新时,要能实时的通知给第三方分析:首先我们想一下该问题如果直接写一个类通过把第三方的类都注入进来通过get方法可以让第三方接入。当数据有更新时,气象站可以调用dataChange方法来做修改首先我们需要模拟出一个数据类/** * @author: 德鑫 * Description: 最新数据类 * @Dat

2021-02-03 14:04:48 161

原创 Gof-迭代器模式

继续打卡设计模式今天来聊一下迭代器模式一、实际问题现在有这样一个问题 编程展示在一个页面中学校的院系组成,一个学校有多个学院, 一个学院有多个系。分析问题:将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的这样遍历的特别是比较简单,可以很直观的看到从大到小的结构。但是注意这里有一个要求是在一个页面中。这就不能说我在遍历一个对象的同时继续遍历它的子类对象。可能说我学java基础的双重for循环不就ok了吗那我们还是先看看迭代器模式的解决方案。揣摩一下其中的不同点二

2021-02-02 17:03:00 76

原创 Gof-访问者模式

继续打卡设计模式今天来聊一下的是访问者模式一、实际问题将观众分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(评价 有不 同的种类,比如 成功、失败 等)这个问题的关键是说对于一个歌手评价而言它的结果是有两个数据属性来共同决定二、访问者模式来解决首先我们分析一下这个问题肯定是需要 男人和女人这个类的。抽象一点就是一个人以及对于歌手的评价也是包含男人和女人的评价所以我们先写一个评价的抽象类/** * @author: 德鑫 * Description: *

2021-02-01 12:04:15 112

原创 Gof-命令模式

继续打卡设计模式今天来聊一下的是命令模式命令模式使得请求发送者与请求接受者消除彼此之间的耦合

2021-01-28 19:38:38 297

原创 Gof-模板方法模式

继续打卡设计模式今天来聊一下的是模板方法模式一、实际问题来看一个实际问题编写制作豆浆的程序,说明如下:制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎通过添加不同的配料,可以制作出不同口味的豆浆选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的也是很容易理解到。这个过程中,我们选取豆浆的流程的前面几步都是一样的。大家这里回过头思考我们上一篇提到的享元模式。说需要给不同的客户定制一批网站,这里体现的不是说过程是一样。而是在对于这个结果而言涵盖

2021-01-27 10:07:27 136 2

原创 Gof-享元模式

继续打卡设计模式今天来聊一下享元模式享元模式 也叫蝇量模式,运用共享技术有效支持大量细粒度的对象常用于底层系统开发,解决系统的性能问题,像数据库连接池。一、实际问题首先提出一个实际的需求小型的外包项目,给客户 A 做一个产品展示网站,客户 A 的朋友感觉效果不错,也希望做这样的产品展示网 站,但是要求都有些不同:有客户要求以新闻的形式发布有客户人要求以博客的形式发布有客户希望以微信公众号的形式发布那么现在解决这个问题我们出发点可能就是说在把原来的东西复制一份然后简单的修改一下。但是大

2021-01-26 21:41:18 98

原创 Gof-外观模式

继续打开设计模式今天来聊一下外观模式依然跑出来一个实际的需求来引入外观模式一、提出一个实际的需求家庭影院 ,我们在自己家里面看电影的时候,是不是包含了直接用遥控器:统筹各设备开关开爆米花机放下屏幕开投影仪开音响开 DVD,选 dvd去拿爆米花调暗灯光播放观影结束后 关闭各种设备也就是说这些步骤如果按照传统的办法应该是有各种各样的类。然后里面涵盖了这些操作,我们想要实现这样的效果就必须要通过客户端也就是用户来直接操作这些实例。这样得到的结果是混乱的,不是我们想看到的。而现在假象一

2021-01-22 11:39:07 100

原创 Gof-组合模式

继续打卡设计模式今天来聊一下组合模式一、提出一个实际问题我们现在有一个学校,里面涵盖了学院,学院下面又分为各个子专业。那么现在如何方便的来管理查看这些学校学院专业的对应关系呢。对于传统不用设计模式一般的做法无非把学校想象成一个集合,学院为这个学校集合的各个元素,其中学院元素又是一个集合,这个集合中包含了多个专业。那么这样看我们就是需要三个类以及对应容器来承载,假如后面需要添加学院在往集合中添加元素。首先这种方式对于处理这个需求来说肯定是可行的。又回到一个场景了。谈设计模式一定是对代码的优化,我们肯

2021-01-21 11:03:49 125

原创 Gof-装饰者模式

继续打卡设计模式今天来聊一下装饰者设计模式一、实际需求先提出这样一个实际问题:咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡)相对应与咖啡的种类。我们还可以添加不同的调料。例如milk,soy,chocolate这个时候用户来点不同的咖啡可以选择性对的添加不同的调料来改善口味我们首先想到的可能会是桥接模式那种感觉,把抽象和实现分开,继而创建不同的实例化对象。我们有没有相关因为现在的实现并不是说简单的创建对象。在于

2021-01-20 14:44:35 80 1

原创 Gof-抽象工厂模式

继续打卡设计模式今天聊一下抽象工厂模式依然回到我们订购披萨的需求 ,我们现在依然存在北京的(希腊、奶酪、胡椒三种口味)以及伦敦(希腊、奶酪、胡椒三种口味)。学习抽象工厂一定先了解一下简单工厂模式1、抽象工厂模式那么现在我们看看二者的区别在哪里首先我们需要有一个pizza的基类/** * @author: 德鑫 * Description: * @Date: 2021/01/05 */public abstract class Pizza { protected Strin

2021-01-12 14:40:30 73

原创 Gof-桥接模式

继续打开设计模式。今天聊聊桥接模式桥接模式应该来说是比较好理解的一种结构性设计模式了,提出一个案例来学校该设计模式案例:现在我们有 三种外观类型的手机。分别为折叠类、直立式、旋转式。那么假如说小米、华为、vivo、oppo这些手机供应商需要满足客户的需求来生产这些手机。那我们大概就可以想到每一个外观下面都有这些手机品牌。假如在加一个外观翻盖的等等。是不是我们传统列举方法会导致出现类爆炸的问题。使用桥接模式来实现上述问题首先我们继续分析。我们现在面临的问题就是不同的厂商以及不同手机的外观。那么我们

2021-01-11 17:18:33 102

原创 Gof-工厂方法模式

继续打卡设计模式今天来聊一下工厂方法模式1、实际问题首先我们依然还是选择使用订购披萨的需求来使用之前我们提到使用简单工厂模式来订购 希腊、奶酪、胡椒口味的披萨。现在假如我们再加上一个地域的划分,针对不同地域来制作不同口味的披萨。那么就是北京的(希腊、奶酪、胡椒三种口味)以及伦敦(希腊、奶酪、胡椒三种口味)。那么我们思考如果继续使用简单工厂模式的话出现的问题就是我们需要自己创建出来这些类。根据输入不同的orderType。简单工厂来选择创建不同的类。今天我们就选择使用工厂方法模式来实现这个问题。

2021-01-07 09:48:41 140

原创 Gof-简单工厂模式

继续打卡设计模式聊一下简单工程模式提出一个问题:提起一个披萨的订购任务;我们现在有很多种披萨,需要写一个小项目来便于披萨的扩展。便于后期自己添加披萨的种类和口味首先我们有一个制作披萨的基类 , 包含了制作披萨的三个行为 烘烤、切割、打包三个服务/** * @author: 德鑫 * Description: 简单工程模式 * @Date: 2020/12/30 *///pizza的基类public abstract class Pizza { //抽象方法 public

2021-01-06 13:51:36 141 1

原创 Gof-建造者模式

今天来聊一下建造者设计模式提出一个问题盖一栋房子过程分为打桩、砌墙、封顶房子有各种各样的,比如普通房、高楼、别墅、那么我们说建造的过程一样。但是要求却不一样1、使用代码模拟传统方法解决盖房我们先模拟一个抽象的地基类/** * @author: 德鑫 * Description: 打地基的基类 * @Date: 2020/12/31 */public abstract class AbstractHouse { //打地基 public abstract void b

2021-01-05 13:48:25 91

原创 Gof-原型模式

原型模式属于创建者模式的一种现在我们例如要来复制一个对象我们的做法1、复制一个对象的第一种方法/** * author: 德鑫 * Description: * 实体bean * @since: 2020/12/29 */public class Sheep { private String name; private int age; private String color; public Sheep(String name, int age, S

2021-01-04 18:36:48 149

原创 Gof-单例设计模式

从今天开始每天花半个小时学习设计模式专题,废话不多说开始造设计模式分为三种类型 共23种创建者模式:单例、抽象工厂、原型、建造者、工厂 --------- (5种)结构型模式: 适配器、桥接、装饰、组合、外观、享元、代理 -----------(7种)行为型模式: 模板方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(也叫责

2020-12-29 15:58:22 103

原创 NodeJS学习总结

较之前写的vue ECMAJavaScript,nodeJs其实是应该之前就写一写总结一下的。闲来无事就总结一下吧(北京的风真大!!!)一、为什么要学习nodeJs?其实我一开始很迷,我觉得我一个后端程序员应该不需要学习nodeJs ,但是你会发现2020年各大公司的Java招聘内卷都特别严重。越来越多的中小型公司趋近于全栈式的开发人员。所以NodeJs成为了很热门的(一直都很热门,但是笔者感觉更为严重了)说一个题外话。其实NodeJs 本身学习起来对前端后端都没有坏处。因为Node的主要作用是开发服

2020-11-24 19:29:20 2687

原创 使用webservice实现远程服务发布和调用

时至今日。webservice这种远程调用技术都已经淘汰了,不排除有些老项目用但是非常少。笔者最近还就有个需求用到所以学习了一下。做个简单的总结一、SOAPsoap是基于xml格式的消息交换协议。soap定义了信息交换的格式,它包含了一个重要的信封。使用信封来包装要传递的信息。xml里面都有一个命名空间叫做namespace来区分传递的信息;二、wsdlwsdl 是web service描述语言,它使用了xml对web Service描述,比如提供服务的方法、参数、返回值、数据类型等信息进行描述。

2020-11-10 20:04:10 587 2

原创 ECMAJavascrpit6.0 新特性-案例详解

前端时间做了一个vue+ springcloudAlibaba的项目。把前端的知识恶补了一下。然后又学完了Angular和react,总体感受我觉得学习前端的主流框架之前最后了解一下ECMAJava6.0的一些新特性要好一点。对于大家vue和node进阶或者开发来讲大大提高了开发效率。当然我说的这个es6的新特性也可以直接学习nodeJS 和vue都没有问题。这些新特性你肯定都会接触到。我只是尽量通过一个个小的案例来总结一下。毕竟写博客就当记笔记总结一些肯定是没有坏处的。-------------那我们

2020-09-28 21:40:29 186

原创 线程专题-从最底层讲解多线程的执行原理 (2/10)

开始先放一张图吧,这个图是我手动画的网上也有很多,描述线程的生命周期状态图。1、线程的新建状态 : 你简单点就是new Thread的吧。2、就绪状态:只运行start()方法。这里特别注意一点有些朋友说运行start的方法就表示线程已经运行了,这其实你在做测试的时候看到的程序确实是这样但是在线程生命周期中,运行start方法只是代表了这个线程具备了抢夺CPU时间片的权利。线程其实并没有处于运行状态。3、运行状态:运行状态的开启表示是执行了run方法。我们创建线程的两种方式 extends Thre.

2020-09-25 13:42:35 150

原创 线程专题-从最底层讲解多线程的执行原理 (1/10)

本次决定专门写一篇线程系列的文章。讲清楚Java jvm在加载一个程序的时候起始到终止的生命线。一、谈线程必须说一下进程(process)进程如果大家打开任务管理器。这些都是运行在操作系统上面的进程。可以说进程是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位。可以说进程是线程的容器,一个进程是包含一个或多个线程的。二、线程一个线程就是进程中一个单一顺序的控制流,进程中的一个执行单元。在操作系统中是以进程为单位分配资源。每个线程都有各自的线程栈。自己的寄存器环

2020-09-22 10:55:13 200

原创 shiro一款简易的Java安全框架(2)-基于注解实现和标签的使用

上篇谈到shiro利用doGetAuthenticationInfo方法来实现用户的认证protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;

2020-07-24 10:45:48 921

原创 shiro一款简易的Java安全框架

这两天因为项目中一直有用到shiro这款框架,所以也是趁着休息的时间好好补课一下shiro。一、什么是shiro?shiro是一个强大的Java安全框架,执行身份验证。授权、密码和会话管理的。使用shiro易于理解API,可以非常方便的集成到任何应用程序中。在这里也说明一下:后续会写关于Spring Security这款安全框架,两者在功能上是非常类似的,所以在学习完一种后最后把另一种也学习一下。二、shiro的三大核心组件1、subject:简单理解为表示当前操作用户。其实它的深层表达的意思是第

2020-05-24 20:33:17 1918

原创 面试点-布隆过滤器

直入主题,布隆过滤器是什么?布隆过滤器是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中,它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定 的误差率 和删除困难 。面试题–腾讯2019有一道面试题就说:一个网站有 20 亿 url 存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?并且需在给定内存空间(比如:500M)内快速判断出我们假设就用hashset基于haspMap的特

2020-05-16 19:24:03 549 2

原创 SpringCloud-组件服务熔断Hystrix和声明式服务消费Feign

一、什么是Hystrix?Hystrix叫做熔断器也称为断路器,微服务架构中的熔断器就是当被调用方没有响应时,调用方直接返回一个错误响应即可,而不是长时间的等待,这样避免调用时因为等待而现场一直得不到释放,避免故障在分布式系统间蔓延。例如: 电商平台中用户下单,我们一个是订单服务,一个是减库存服务,当用户下订单时调用下订单服务,然后下订单服务又调用减库存服务,如果减库存服务响应延迟或者没有响应...

2020-05-08 16:45:31 211

原创 面试点-Springcloud-Eureka高可用集群和Eureka自我保护机制

接着前面说,我们谈到服务可以注册到Eureka注册中心,通过Ribbon来消费调用我们注册中心注册的服务,那么现在考虑的就是假如注册中心出现故障的时候我们怎么保证我们的服务任然可以继续被发现调用。一、Eureka高可用集群那么第一篇springcloud介绍springcloud的框架时候我们说,springcloud的微服务架构也可以说是一个分布式架构,那么所有的分布式架构都满足我们经典的C...

2020-04-25 23:55:41 934 2

原创 Springcloud微服务-组件三Ribbon

继上两篇接着说我们将服务注册到Eureka注册中心后,那么服务之间的调用是怎么完成的?我们的消费者想要去注册中心上消费我们的服务这里就需要使用到springcloud 的组件ribbon 。一、Ribbon是什么?Ribbon是一个基于HTTP和TCP的客户端负载均衡器。当使用Ribbon对服务进行访问的时候,它会实现从Eureka注册中心中获取服务端列表,并通过Eureka客户端来确定服务...

2020-04-25 23:26:33 188

原创 面试-服务注册中心Eureka与zookeeper比较

继续接着我上一篇说。Eureka是SpringCloud的核心组件之一。用于支持服务的注册。一、先简单说一个Eureka:Eureka是一个服务管理组件。是基于Rest的服务。用来定位服务。进行中间层服务器的负载均衡和故障转移。Eureka采用C-S的设计架构。也就是Eureka客户端和Eureka Service服务端。通过Eureka的客户端连接到EUreka的服务端,并维持心跳。二、E...

2020-04-19 22:12:01 222

空空如也

空空如也

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

TA关注的人

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