自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

梁老师教你编程序

编程没有什么大不了的!

  • 博客(235)
  • 资源 (10)
  • 收藏
  • 关注

原创 java的父类构造调用

首先实例化就是给对象分配内存,构造方法就是分配内存的实现,那么,子类如何才能更方便的分配内存呢?很显然,就是调用父类构造方法来分配父类部分的内存,然后再调用自己的构造方法来分配子类扩展的内存。因为子类的父类部分是完全和父类一样的,你觉得有必要再自己从头开始分配内存吗?既然父类的内存分配已经有现成的方法,为什么不直接调用来分配父类部分的内存呢?javascript在实现继承的时候,也是采用了原型链的方式,将父类与子类进行挂接,而java是直接通过构造方法的层级调用,从而将new的内存挂在一起。

2022-12-22 15:07:17 697 1

原创 SpringMVC的异步

注意:在Controller中使用时,一定要注意做好接口的线程池隔离,让慢的接口使用固定数量的线程池, 否则从tomcat减少的线程会转移到应用里,导致拥塞,在部分接口下游异常的情况的情况下,会出现影响正常接口的服务.所以,需要注意的一个错误用法是,如果a方法调用它同类中的标注@Async的b方法,是不会异步执行的,因为从a方法进入调用的都是该类对象本身,不会进入代理类。1,@Async注解在使用时,如果不指定线程池的名称,则使用Spring默认的线程池,Spring默认的线程池为。

2022-12-20 16:42:11 2467

原创 SpringMVC的AOP总结

1、Filter 过滤器Filter是Servlet规范中规定的,只能用于WEB中, 在Servlet前后起作用它可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次使用场景: 修改字符编码;对入参进行校验, 校验不通过返回错误信息.原理: 基于函数回调( filterchain)的方式调用2、Interceptor 拦截器拦截器是Spring容器内的,是Spring框架支持的,可以使用Spring内的任何资源、对象。

2022-12-20 16:37:48 771

原创 分布式文件系统

MinIO 是一款基于Go语言发开的高性能、分布式的对象存储系统。特别适合与图片服务器。客户端支持Java,Net,Python,Javacript, Golang语言。APACH提供的支持。注意,英文文档为准,中文文档坑比较多。基本概念1、Object:存储到minio的基本对象,如文件,字节流,Anything。。。。2、Bucket:用来存储Object的逻辑空间。每个Bucket之间的数据是互相隔离的。对于客户端而言,就相当于存放文件的顶层文件夹。

2022-11-30 11:50:26 1258

原创 kafka介绍(二)

费者可能会陷入循环中, 一直返回空数据。针对这一点, Kafka 的消费者在消费数据时会传入一个时长参数 timeout,如果当前没有数据可供消费, consumer 会等待一段时间之后再返回,这段时长即为 timeout。轮训那么消费者是如何知道生产者发送了数据呢?换一句话来说就是,消费者什么时候 pull 数据呢?其实生产者产生的数据消费者是不知道的,KafkaConsumer 采用的方式定期去 Kafka Broker 中进行数据的检索,如果有数据就用来消费,如果没有就再继续轮询等待。

2022-11-25 17:12:54 191

原创 kafka介绍(一)

这个部分,需要简单的解答一下,其实MQ就是消息队列,那么本质上,就是一个 FIFO的队列数据结构。因此,早期的使用方法,都是启动一个线程发送消息,写入消息队列,作为消息缓存,然后再启动一个线程消费消息。早期的windows程序(桌面程序)的设计方法。后期,随着分布式微服务的快速发展,消息这个东西变成了组件,变成了中间件,直接分离出来使用了。kafka是一款分布式、支持分区的、多副本,基于zookeeper协调的分布式消息系统。最大的特性就是可以实时处理大量数据来满足需求。

2022-11-25 17:11:54 2634

原创 mybatis动态SQL

在实际开发中会遇到许多相同的SQL,比如根据某个条件筛选,这个筛选很多地方都能用到,我们可以将其抽取出来成为一个公用的部分,这样修改也方便,一旦出现了错误,只需要改这一处便能处处生效了,此时就用到了这个标签了。有时候,我们不想用到所有的查询条件,只想选择其中的一个,查询条件有一个满足即可,使用 choose 标签可以解决此类问题,类似于 Java 的 switch 语句。原理为:使用 OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的功能。

2022-11-25 09:10:52 354

原创 mybatis关联映射

只不过,在实体关系获取时,可以通过join的查询构造,构造出该实体关系。而,一对多,一对一,多对一等都是属于实体关系。1.MyBatis一对多关联查询。2.MyBatis多对一关联查询。3.MyBatis多对多关联查询。SQL的表中记录的关系图。

2022-11-25 09:09:28 222

原创 mybatis自定义插件

简单的说,mybatis插件就是对ParameterHandler、ResultSetHandler、StatementHandler、Executor这四个接口上的方法进行拦截,利用JDK动态代理机制,为这些接口的实现类创建代理对象,在执行方法时,先去执行代理对象的方法,从而执行自己编写的拦截逻辑,所以真正要用好mybatis插件,主要还是要熟悉这四个接口的方法以及这些方法上的参数的含义;如果你想做的不仅仅是监控方法的调用,那么你最好相当了解要重写的方法的行为。

2022-11-25 09:08:47 518

原创 mybatis缓存介绍

MyBatis当中的缓存是有一级缓存和二级缓存。一级缓存默认开启。二级缓存需要手工开启。一级缓存一级缓存是默认开启的,且 SqlSession 级别的,也就是通过同一个 SqlSession 查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问二级缓存二级缓存是 SqlSessionFactory 级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取开启方法二级缓存开启的条件。

2022-11-25 09:07:53 796

原创 mybatis配置文件

方法二中,每一个在包中的Java bean,在没有注解的情况下,会使用bean的首字母小写的非限定类名来作为它的别名。开发中通过pojo传递查询条件,查询条件是综合的查询条件,不仅包括用户查询条件还包括其他的查询条件(比如将用户购买商品消息也作为查询条件),这时可以使用包装对象传递输入pojo类参数中包含pojo。有时候开发者查询的数据不止一条,比如,模糊查询,全表查询等,这时候返回的数据可能不止一条数据,对于多数据的处理可以存放在List集合中。#{}里面的名称对应的是Map里面的key名称。

2022-11-24 17:34:14 1107 1

原创 MyBatis介绍

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。MyBatis是一个优秀的持久层框架,它对JDBC的操作数据库的过程进行封装。

2022-11-22 17:28:40 580

原创 ORM概念

当我们实现一个应用程序时(不使用O/R Mapping),我们可能会写特别多数据访问层的代码,从数据库保存、删除、读取对象信息,而这些代码都是重复的。对象关系映射(Object Relational Mapping,简称ORM),主要实现程序对象到关系数据库数据的映射。来描述对象-关系映射细节,元数据通常采用XML格式,存放在专门的对象-关系映射文件中。中表中的记录映射为对象,以对象的形式展现,可以把对数据库的操作转化为对对象的操作。ORM框架:为了解决面型对象与关系数据库存在的互不匹配的现象的框架。

2022-11-22 17:25:08 359

原创 JDBC编程

Java数据库连接 Java Database Connectivity,简称JDBC,它是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。如果没有JDBC这个接口标准的存在,程序员面对各类数据库的操作将会变得十分复杂,并令人抓狂。w=794&h=500)]JDBC是接口,驱动是接口的实现类,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。

2022-11-22 17:23:42 312

原创 Redis的高可用

酱紫每个key都会对应一个编号在 016383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。由一个或多个Sentinel实例组成的Sentinel系统,它可以监视所有的Redis主节点和从节点,并在被监视的主节点进入下线状态时,自动将下线主服务器属下的某个从节点升级为新的主节点。但是呢,一个哨兵进程对Redis节点进行监控,就可能会出现问题(单点问题),因此,可以使用多个哨兵来进行监控Redis节点,并且各个哨兵之间还会进行监控。

2022-11-18 17:51:53 2907

原创 Redis分区/分片详解

redis在3.0版本前只支持单实例模式,虽然现在的服务器内存可以到100GB、200GB的规模,但是单实例模式限制了redis没法满足业务的需求(比如新浪微博就曾经用redis存储了超过1TB的数据)。它可以将众多小内存的redis实例整合起来,将分布在多台机器上的众多CPU核心的计算能力聚集在一起,完成海量数据存储和高并发读写操作。当一台物理机器存储不够的时候,我们可以将一般的实例移动到我们的第二台物理机上,依次类对,我们可以保证集群中Redis的实例数不变,又可以达到扩充机器的目的。

2022-11-18 17:40:49 4101

原创 JAVA淘汰技术

Java 已经发展了近20年,极其丰富的周边框架打造了一个繁荣稳固的生态圈JavaEE 框架,从百家混战到现在 Spring 基本一统天下Web 开发,从标配的 SSH 到现在 SpringMVC + MyBatis 组合IDE,从当年如火如荼的 JBuilder 到 Eclipse,再到更好用的 IDEA随着时间推移,一些优秀的框架崭露头角,一些低效框架也慢慢退出历史舞台今天,我们就来看看有哪些框架,以后可以不用学啦。

2022-11-17 09:16:52 233

原创 Redis的分布式锁

当主节点宕机后,主节点的数据还未来得及同步到从节点,进行主从切换后,新的主节点并没有老的主节点的全部数据,这就会导致刚写入到老的主节点的锁在新的主节点并没有,其他服务来获取锁时还是会加锁成功。此时则会有2个服务都可以操作公共资源,此时的分布式锁则是不安全的。因为redis是一个单独的非业务服务,不会受到其他业务服务的限制,所有的业务服务都可以向redis发送写入命令,且只有一个业务服务可以写入命令成功,那么这个写入命令成功的服务即获得了锁,可以进行后续对资源的操作,其他未写入成功的服务,则进行其他处理。

2022-11-15 12:13:30 415

原创 Redis的高可用

酱紫每个key都会对应一个编号在 016383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。由一个或多个Sentinel实例组成的Sentinel系统,它可以监视所有的Redis主节点和从节点,并在被监视的主节点进入下线状态时,自动将下线主服务器属下的某个从节点升级为新的主节点。但是呢,一个哨兵进程对Redis节点进行监控,就可能会出现问题(单点问题),因此,可以使用多个哨兵来进行监控Redis节点,并且各个哨兵之间还会进行监控。

2022-11-15 12:10:36 468

原创 Redis的简介

Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。与MySQL数据库不同的是,Redis的数据是存在内存中的。

2022-11-14 16:49:18 4952 2

原创 Win11安装JDK8的方案

买回来以后,准备安装jdk8,居然无论如何都安装不上,点击“下一步”以后,立刻就闪退了。最后最后,切换了输入法,记住使用系统自带的输入法,然后,就没有然后了,一切正常。这个都不知道算不算问题。

2022-11-11 10:41:01 822

原创 CAS和AOuth2的比较

1、OAuth2:Client端(第三方服务)是资源消费端,通过用户授权,允许用户不提供自己账号密码的情况下,使Client端有权访问用户资源(如个人信息、通讯录等);(如QQ授权页面,通过授权,使第三方服务有权访问QQ用户个人资料等)2、CAS:Client端(应用系统)是资源存储端,用户是资源消费者(应用使用者);认证中心存在 ,访问其中某一个项目时,重定向到统一登录页面,登录完成后,带上凭证信息重定向该项目,该项目通过。CAS只是SSO的一种实现方式。提供的认证信息,完成当前项目的登录 , CAS。

2022-11-10 16:57:00 650

原创 Git操作流程

Git的基本操作流程

2022-11-07 10:03:20 245

原创 Git的使用教程

8、但是两者冲突太多;7、看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。2、打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。8、一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。7、N个月后,码农A认为自己的改进已经尽善尽美了,于是合并自己的“产品A之码农A改进版”到当前的主版本。

2022-11-04 17:15:32 518

原创 Spring Security是什么? - 密码认证(四)

在 Spring Security当中,认证的过程,首先是获取用户名,然后通过用户名在数据库当中获取到用户的完整信息,然后根据用户信息再去 比对用户的密码。用户登录时,密码匹配阶段并没有进行密码解密(因为密码经过Hash处理,是不可逆的),而是使用相同的算法把用户输入的密码进行hash处理,得到密码的hash值,然后将其与从数据库中查询到的密码hash值进行比较。在注册用户的时候,使用SHA-256+随机盐+密钥把用户输入的密码进行hash处理,得到密码的hash值,然后将其存入数据库中。

2022-11-03 11:18:42 617

原创 Spring Security是什么? - 简单例子(三)

简单入门的例子

2022-11-03 11:17:25 140

原创 Spring Security是什么?(二)

总体而言,就是你在写filter的时候,可以完全的抛弃spring security当中的内容,也可以在后边增加补充的认证内容。目前网络上的大部分实现,都是补充进行email认证,手机短信认证,但是用户名和密码认证都是保留spring security的usernamepasswordanthenticationfilter的内容。其实,对于自定义方法三,就是不正宗的处理流程,虽然也进行了用户名和密码的判断,但是却破坏了spring security的流程。2、修改配置类当中的三个config函数。

2022-11-03 11:14:39 365

原创 Spring Security是什么?(一)

Spring Security 是 Spring 项目组中用来提供安全认证服务的框架。应该说,Spring Security是使用最多的安全框架。Spring Security使用的目的: 验证,授权,攻击防护。背景:谈论优点的同时,不妨先考虑一下,没有Spring Security我们难道就无法实现认证和授权了吗?肯定不是的,一般涉及到用户授权,我们都会分为用户表、角色表、用户角色表、菜单表、角色菜单表。有这五张表,就算没有Spring Security我们依旧可以完成用户菜单等控制。

2022-11-03 11:13:10 668

原创 什么是用户认证与授权 - Session认证(四)

因为根据HTTP协议,我们并不能知道是哪个用户发出的请求,所以为了我们的应用可以识别是哪个用户发起请求,我们只能在服务器中存储一份用户的登录信息,这份登录信息会在响应时传递给浏览器,并告诉浏览器保存为Cookie,下次请求时带上这份登录信息,这样我们的应用就可以识别是哪个用户发起的请求了,这就是传统的基于Session认证。用户B,再开一个浏览器的时候,访问到web服务器,此时,web服务器也会创建一个session,这个session对象与用户A的是不同的对象。因为这个是浏览器和服务器之间的传递过程。

2022-10-26 17:28:25 259

原创 安全认证中的CSRF

正常的访问时,客户端浏览器能够正确得到并传回这个伪随机数,而通过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪随机数的值,服务端就会因为校验token的值为空或者错误,拒绝这个可疑请求。而,跨域转发,是没有这个过程的。这个图说明,在浏览器向服务端请求页面时,服务端将自己生成的token,返回给了浏览器,然后在发送post的时候,浏览器就带有了token。如果是,第三方网站跳转过去,就是直接操作的界面,就算是有了cookie,认证通过了,但是因为没有这个请求字段,所以操作是无法成功的。

2022-10-26 17:15:21 2036

原创 什么是用户认证与授权 - JWT认证(三)

然后创建一个JWT TOKEN,使用随机生成的key作为jwt的有效载体,将生成好的JWT Token返给前端,前端保存在本地,当访问后端服务时,前端需要在请求头中携带 jwt token,后端通过拦截器对请求进行拦截,校验token是否有效,如果token有效,则在jwt token的有效载体中获取key,然后使用该key在redis中查找是否存在,如果存在说明登录验证通过,如果不存在说明验证登录信息已过期。3、其他的系统,自己解析jwt,如果能解析,就说明登录成功,就可以继续业务。

2022-10-25 16:55:31 953

原创 什么是用户认证与授权(二)

服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。用户B,再开一个浏览器的时候,访问到web服务器,此时,web服务器也会创建一个session,这个session对象与用户A的是不同的对象。每个用户经过认证之后,我们的应用都要在服务端做一次记录,以便识别该用户的请求,而通常来说,

2022-10-25 16:50:31 423

原创 什么叫做用户认证与授权(一)

认证和授权是两个不同的概念,更是两个不同的阶段,绝大多数带有认证和授权的系统,在用户操作流程上都是先进行认证,之后根据认证的结果再进行授权操作,有的初学者容易混淆二者的概念。因为根据HTTP协议,我们并不能知道是哪个用户发出的请求,所以为了我们的应用可以识别是哪个用户发起请求,我们只能在服务器中存储一份用户的登录信息,这份登录信息会在响应时传递给浏览器,并告诉浏览器保存为Cookie,下次请求时带上这份登录信息,这样我们的应用就可以识别是哪个用户发起的请求了,这就是传统的基于Session认证。

2022-10-25 16:49:01 655

原创 CSS扩展可点击区域

们先假设我们有如图所示的简单的一个按钮然后我们希望它的点击面积增加10px,四个方向都是。我们已经为它应用了一些简单的样式,包括cursor: pointer,这不仅可以为鼠标交互提供一些方便,还可以帮我们测试点击区域在哪。扩展点击区域的最简单的方法是一个透明的实线边框,因为鼠标和边框的交互也会作用在元素之上,不像outline和shadow。例如,把一个元素的点击区域在所有方向上扩展10px,代码可以简单地这样写:border: 10px solid transparent;但是,正如

2022-05-17 12:10:10 1131

原创 javascript:void(0) 含义

js当中的特性技巧

2022-05-09 16:57:10 3312

原创 JavaScript 中 forEach() 和 Map() 的区别

JavaScript 中 forEach() 和 Map() 的区别先看代码:下面是这些数组函数的代码片段,array.forEach((item) => { // your code});const mapArr = array.map((item) => { // some code return; //In map() function must always return some value});两个函数的本意,都是对于元素的遍历

2022-05-09 16:52:39 202

原创 浏览器解析机制

浏览器是如何解析一个html页面的?第一步,构建DOM树浏览器的渲染引擎,首先解析HTML文档,将html的标签转换为DOM树。第二步,构建渲染树浏览器引擎,继续渲染CSS样式文件,这里就包括JS,CSS,html指令,构建相应的渲染树。第三步,渲染页面渲染引擎结合DOM树和渲染树,共同渲染,进行具体元素的绘制工作。当render tree中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建, 这就称为回流(reflow)。每个页面至少需要一次回流,

2022-04-21 11:22:52 472

原创 理解element-ui中的slot-scope的理解

理解element-ui中的slot-scope的理解这个是一个固定用法,需要对比理解:普通表格的方法 使用slot-scope的方法 对比说明普通表格方法我们先说一说这个基础的用法里面,在el-table中,:data="tableData"是数据集,结构如下:那么对于每一个el-table-column,我们只需要使用prop="date",就可以将该列的数据绑定为该数组所有的对象中的“date”属性,我们可以理解为对于tableData,这里始终取的是tableData[$

2022-04-21 11:10:24 15984 4

原创 mock.js详细用法

mock.js使用方法MOCK.JS 是前端的一个模拟数据的库。这个库的使用,可以在前端开发时,就避免大量的后端请求。1.定义随机生成相应格式的数据。支持生成随机的文本、数字、布尔值、日期、邮箱、链接、图片、颜色等。官方文档:Mock.js2.安装npm install mockjs --save3. 使用方法方法一,直接使用一个mock.js文件的情况下:01 编写一个mock.js文件const Mock = require('mockjs') // 这..

2022-04-12 14:26:28 4698

原创 VUEX的结构目录使用

1、结构这个结构,其实就是再告诉你,导入store以后,就可以使用通过modules分组的方式使用。2 、关键点解析如何引入store在需要使用的js文件当中,包括:main.js,或者是。router当中的index.js文件中最常出现。main.jsimport Vue from 'vue' import App from './App.vue' import router from './router' import store from './store'rout..

2022-04-12 13:33:49 934

Git操作知识主要完成GIT的基本操作及概念理解

GIT的基本概念 GIT的操作流程 GIT的实用软件

2022-11-07

VUE的详细知识介绍,可以满足面试的全部需要

VUE的详细介绍,可以满足面试,学习,使用等初步的了解。

2022-03-30

RepositoryModeTest.rar

这是一个框架, 主要用于实现Repository的框架模式,里边用了func,泛型等基础知识,对于理解如何进行后端操作又很大的帮助。

2020-07-15

SpringMVC框架搭建

SpringMVC4.13+heiberante4.3.1+mysql connector 5.1.40的MVC框架搭建实例

2016-12-19

Spring SpringMVC hibernate

Spring MVC 4.1.3 + Spring4.1.3+Hibernate4.3.11+Mysql connector 5.1.40实现稳定可靠的分层框架搭建示例,提供了相关的学习使用!

2016-12-19

Struts2.5.5+Spring4.1.3+Hibernate4.3.11+Mysql5.1.40

网上找了很多的Struts2+spring4+hibernate4+myql5.1的代码,但是总是找不到,为了更好地理解和学习,手动搞一个,同时上传出来发给大家下载!绝对亲测! 该部分的代码示例,简单的描述了一个基本的框架搭建过程,同时也给出了相关的分层编码方式,更好地介绍了相关的初步架构。

2016-12-19

ASP.NET MVC4 Demo分步骤学习实例

ASP.NET MVC4.0 的一步一步实施过程实例,主要完成按照步骤,一个一个的实现具体的mvc项目,其中提供了EF,Autofac等参考。

2015-07-10

获取电脑的基本系统信息的工具

直接获得系统的基本硬件信息,方便使用,属于一个简单的工具!

2014-11-26

聊天工具详细设计

MFC聊天工具开发设计方案,分享出来帮助大家共同使用!

2013-09-01

LUA快速入门

帮助C/C++程序员快速学习LUA脚本!

2013-09-01

MYSQL操作类

mysql的数据库操作实例。编写的vc的工程,希望可以帮助各位。

2013-03-10

空空如也

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

TA关注的人

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