自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 分析 java.util.LinkedHashMap

该实现与HashMap不同的是它维护一个双向链表,可以使HashMap有序。与HashMap一样,该类不安全。

2022-07-27 14:15:45 223

原创 kubernetes之Deployment

Deployment(简写为deploy)是kubernetes控制器的又一种实现,构建于ReplicasSet控制器之上,可以为Pod和ReplicaSet提供声明式更新。相比较而言,Pod和ReplicaSet很少用来直接使用,而是借助于控制器来使用。DeploymentController核心功能也是保证Pod资源的正常使用,大部分功能调用ReplicaSet来实现。1.2我们只需要描述Deployment中目标Pod期望状态,而Deployment控制器以控制更改为实际状态,使其变成期望状态。...

2022-07-27 14:12:51 865

原创 AOP案例之测量业务层接口执行效率

这个的目的是查看每个业务层执行的时间,这样就可以监控出哪个业务比较耗时,将其查找出来方便优化。原始方法如果只执行一次,时间太快,两个时间差可能为0,所以我们要执行万次来计算时间差。我们没有办法区分到底是哪个接口的哪个方法执行的具体时间,具体如何优化?因为程序每次执行的时长是不一样的,所以运行多次最终的结果是不一样的。(4)用后一个时间减去前一个时间的差值,就是我们需要的结果。配置切入点表达式,需要添加一个方法,并添加@Pointcut。所以要在方法执行的前后添加业务,经过分析我们将采用。...

2022-07-27 14:10:26 205

原创 说透缓存一致性与内存屏障

我们最熟悉的内存是一种动态随机访问存储器(DynamicRAM,DRAM),存储器中每个存储单元由配对出现的晶体管和电容器构成,每隔一段时间,固定要对DRAM刷新充电一次,否则内部的数据就会消失。而高速缓存是一种静态随机访问存储器(StaticRAM,SRAM),不需要刷新电路就能保存它内部存储的数据,这就是静态的含义,因此SRAM的存储性能非常高!工作速度在纳秒级别,勉强能跟得上CPU的运算速度。但是SRAM的缺点就是集成度低,相同容量的内存可以设计成较小的体积,但是SRAM却需要更大的体积;、...

2022-07-27 14:07:43 676

原创 分布式系统架构理论与组件

1.分布式系统的发展在计算机发展的早期,一直都是集中式计算,计算能力依赖大型计算机。随着互联网的发展,繁重的业务需要巨大的计算能力才能完成,而集中式计算无法满足要求,大型计算机的价格也非常昂贵。分布式计算将任务分解成更小的部分,分配给多台计算机处理,这样可以节约整体计算时间,大大提高计算效率。互联网大型网站往往面临高并发访问、海量数据处理等问题,必须保证系统高可用、易伸缩等等。分布式架构采用多台机器协同工作,动态伸缩容量,使用冗余节点来消除单点故障,提高系统可用性。2.分布式系统的挑战软件开发没有银弹,任何

2022-07-27 13:59:59 1201 1

原创 深度解析springcloud分布式微服务的实现

其实降级,当你系统迎来高并发的时候,这时候发现系统马上承载不了这个大的并发,可以先关闭一些不重要的微服务(就是在降级方法返回一个比较友好的信息)把资源让出来给主服务,其实就是整体资源不够用了,忍痛关闭某些服务,待过渡后再打开。微服务中client->微服务A->微服务B->微服务C->微服务D,其中微服务B异常了,所有请求微服务A的请求都会卡在B这里,就会导致线程一直累积在这里,那么其他微服务就没有可用线程,导致整个服务器雪崩。区间的通信是可能失败的如一个在本地,一个在外地,他们之间是无法通信的。...

2022-07-27 13:58:26 522

原创 置顶各大平台,22版面试核心知识解析笔记,强势上榜

1、线程池(具体参数,拒绝策略,减少线程的机制,具体实现类及对应的阻塞队列,阻塞队列有什么特点,为什么用这个阻塞队列,线程复用的原理)2、JVM(对象是否可回收的判断条件,怎么判断,回收算法,垃圾回收器的类别及特点,担保机制)3、JAVA内存模型4、线程之间的通信方式,通过volatile,synchronized,Lock的实现类那些,结合内存模型去讲。另外,在求职的过程中也碰到过少数没有素质的面试官,比如一上来就一副很不屑的语气,话没说两句就开始diss你的项目,给人的体验很不好。......

2022-07-26 14:23:22 136

原创 Flink Window&Time 原理

今天我们分享了Tomcat的核心组件,接着讲解了Tomcat处理请求过程时的3个核心参数及其调优经验。对于maxThreads参数而言,如果按照公式计算的话,我们需要获取IO时间和CPU时间,但实际上这两个值并不是很好获取。所以一般情况下,我们可以通过压测的方式来获得一个比较合适的maxThreads。对于maxConnections参数而言,可以设置一个与maxThreads相同的值,再根据具体情况进行调整。如果想降低响应时间,那么可以稍微调低一些,否则可以调高一些。...

2022-07-26 14:20:59 457

原创 谷歌 Material Design 的文本框为什么没人用?

或许,也有可能他们测试了传统文本框,但是因为希望让MaterialDesign的组件样式更有特色,最终还是选择现在的样式。而MaterialDesign的文本框,就刚好触犯了N/NGroup的忌讳,用占位符来当标题了。不过真正那个标题的动态效果,却几乎没有哪家真正使用的,哪怕Google自己都用得少。他们最推荐的,就是这种很常见的文本框样式,尤其是下面哪种说明文字不消失的最保险(保守)。一般来说,任何产品的大改版,哪怕做得再好都要被骂的,除非以前那版实在太烂。...

2022-07-26 14:07:46 342

原创 为什么 ThreadLocal 可以做到线程隔离?

到此,我们发现了,原来ThreadLocal就是把我们要传递的对象放到了当前线程的threadLocals属性中。ThreadLocal的get()方法其实和set()方法逻辑很相似,先从当前线程的threadLocals属性中取,如果该属性为null,那么就初始化。当线程结束时,会调用当前线程实例的exit()方法,将threadLocals设置为null,以便垃圾回收器将其回收掉。但,如果线程一直不结束呢?如果线程会被复用呢?是的,线程结束时,确实会做清理工作。......

2022-07-26 14:06:06 155

原创 SpringBoot对Spring MVC都做了哪些事?

如果你使用Jackson来序列化和反序列化JSON数据,你可能需要编写自己的JsonSerializer和JsonDeserializer类。自定义序列化器通常通过模块注册到Jackson,但SpringBoot提供了一个替代的@JsonComponent注释,可以更容易地直接注册Springbean。你可以在JsonSerializer、JsonDeserializer或KeyDeserializer实现中直接使用@JsonComponent注释。...

2022-07-26 14:03:43 275

原创 我来教你如何组装一个注册中心?

注册、注销可以是服务提供方的进程发起,也可以是其他的旁路程序辅助发起,比如发布系统在发布一台机器完成后,可调用注册接口,将其注册到注册中心,注销也是类似流程,但这种方式并不多见,而且如果只考虑实现一个注册中心,必然是可以单独运行的,所以通常注册、注销由提供方进程负责。数据不能丢失,这点必须要保证,否则稳定性就无从谈起了。第二可以学习技术选型的方法,注册中心中的每个模块,都会在不同的需求下有不同的选择,最终的选择取决于对需求的把握以及技术视野,但这两项是内功,一时半会练不成,学个选型的方法还是可以的。...

2022-07-26 14:01:51 232

原创 1w5字详细介绍分布式系统的那些技术方案

这是一篇概括性的综述类文章,可能并没有很多的干货,当然也限于“一灰灰”我个人的能力,上面的总结可能并不准确,如有发现,请不吝赐教全文总结如下常见的分布式架构设计方案•主备,主从,多主多从,普通无中心集群,数据分片架构分布式系统中的理论基石•CAP,BASE,PACELEC•共识算法paxos,raft,zab•一致性协议2pc,3pc•数据同步gossip分布式系统中的算法•分区的一致性hash算法基于hash环,减少节点动态增加减少对整个集群的影响。...

2022-07-26 14:00:49 467

原创 Java中Static关键字-Static定义代码块-单例设计模式

工具类工具类中定义的都是一些静态方法,每个方法都是以完成一个共用的功能为目的。现状问题分析在企业的管理系统中,通常需要在一个系统的很多业务处使用验证码进行防刷新等安全控制。如果登录和注册等多处地方都存在验证码逻辑,就会导致同一个功能多处开发,会出现代码重复度过高。工具类的好处一是调用方便,二是提高了代码复用(一次编写,处处可用)我们在工具类使用静态成员方法,方便调用节约内存实例方法需要创建对象调用,此时用对象只是为了调用方法,这样只会浪费内存。工具类的定义注意))...

2022-07-26 13:58:58 196

原创 阿里近2000页Java面试手抄本,知乎一周狂转50w/次

新冠疫情已经是第三个年头了,虽然国内防控做得非常好,但是他对职场的影响还在,一个月后即将又迎来一次大考。近两年企业越来越不好做,导致面试时对程序员的要求越来越高,越来越挑剔;2022年的金九银十很快就到了,铁子们做好跳槽拿高薪的准备了吗?为了帮助大家能够找到一份满意的工作,我找到了在阿里任职的同学,他把内网上十万字Java面试手抄本直接开源分享了出来;......

2022-07-25 16:37:15 260

原创 记一次SQL优化

昨天(2022-7-22)上线了我的一个功能,测试环境数据量较小,问题不大,但是上生产之后,直接卡死了,然后就开始了这么一次SQL优化,这里记录一下。不太方便透露公司的表结构,这里我自己建了几张表,模拟一下就可以了。肯定有杠精要说表可以不这样设计了,但是事实现在系统就是这样设计的,如果想改动表设计,影响面就太大了(我们急着上线哦)。当然,本文的后面也会给出修改设计的方案,以达到更优解。...

2022-07-25 15:11:53 234

原创 RabbitMQ细说之开篇

关于消息中间件的应用场景,小伙伴们应该都耳熟能详了吧,比如经常提到的削峰填谷、分布式事务、异步业务处理、大数据分析等等,分布式消息队列成为其中比较关键的桥梁,也就意味着小伙伴们得掌握相关技能;......

2022-07-25 15:10:09 164

原创 JavaScript进阶内容——jQuery

jQuery是一个快速,简洁的JavaScript库,其设计的宗旨是“WriteLess,DoMore”,即提倡更少的代码做更多的事轻量级,核心文件只有不到100kb,不会影响页面加载速度跨浏览器兼容,基本兼容所有浏览器链式编程,隐式迭代对事件,样式,动画,大大的简化了DOM操作支持插件开发拓展,支持第三方软件免费且开源$(选择器).action()...

2022-07-25 15:08:06 187

原创 四大经典算法思想

上图就是一个回溯算法的思路,即先在第一行放置一个皇后,然后再试探性地再第二行放置一个皇后,以此类推,如果出现不满足要求的情况,则及时止损,返回上一行继续试探性地选择不同的方案,直到所有的方案都被列举出来位置。分治算法字面上的解释是“分而治之”,就是把一个复杂的问题拆分成两个或多个相同或相似的子问题,再把子问题拆分成更小的子问题......直到最后子问题可以简单地求解,原问题的解即子问题的解的合并。动态规划的思想是,若要解决一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。..

2022-07-25 15:04:55 880

原创 在混合云中管理数据库:八个关键注意事项

增加的费用可能是值得的,但对于部署新的云数据库服务,企业还需要仔细权衡所带来的挑战,毕竟这些服务作为混合战略的一部分会带来额外的困难。他解释说“重要的是,在所有可能的环境中绘制数据的架构流程,以及部署安全和治理措施,并在所有可能的环境中管理、部署、移植和虚拟化数据时,保护数据。Joshi表示“随着数据审查的增加、强大的数据引力、对延迟的工作负载要求、许可复杂性和数据分散化,并非所有数据都可以放在一个地方,例如公共云,这是混合模型可以增加价值的地方。混合云数据库可能会引入需要解决的新数据工作流。...

2022-07-25 15:01:56 245

原创 如何正确计算 Kubernetes 容器 CPU 使用率

是指container使用分配主机CPU相对值,比如share设置的是500m,代表窗口启动时向主机节点申请0.5个CPU,也就是50,000微秒,通常对应kubernetes的resource.cpu.requests的值。是指容器的使用CPU时间周期总量,如果quota设置的是700,000,就代表该容器可用的CPU时间是7*100,000微秒,通常对应kubernetes的resource.cpu.limits的值。...

2022-07-25 15:00:32 3705

转载 Java之数据库篇

上面名词傻傻分不清,一问搞定数据库数据库(DataBase简称DB)就是信息的集合(数据库是由数据库管理系统管理的数据的集合)数据库管理系统数据库管理系统(DatabaseManagementSystem简称DBMS)是一种操纵和管理数据库的大型软件,通常用于建立、使用和维护数据库。数据库系统数据库系统(DataBaseSystem,简称DBS)通常由软件、数据库和数据管理员(DBA)组成。数据库管理员第一范式数据库表中的每一列都不可再分,也就是原子性。注意。...

2022-07-25 14:58:28 3590

原创 Java并发的基石,Java内存模型(JMM)

为了保证共享内存的正确性(可见性、有序性、原子性),内存模型定义了共享内存系统中多线程程序读写操作行为的规范。通过这些规则来规范对内存的读写操作,从而保证指令执行的正确性。它与处理器有关、与缓存有关、与并发有关、与编译器也有关。他解决了CPU多级缓存、处理器优化、指令重排等导致的内存访问问题,保证了并发场景下的一致性、原子性和有序性。...

2022-07-25 14:56:14 95

原创 《Java高分指南(25专题)》金九银十海底捞月,终极翻盘

以上便是这“Java高分指南(25专题)”Elasticsearch、微服务、Linux、JavaOOP、集合/泛型、Mysql、Redis、JVM、MongoDB、IO与NIO、反射、Spring、SpringBoot、序列化、Kafka、ZooKeeper、算法、注解、MyBatis、Dubbo、多线程、RabbitMQ、Dubbo、数据结构、Memcached、SpringCloud等的全部精品面试问题。面试造火箭,工作拧螺丝!也祝各位金九银十都能收到自己心愿的Offer!...

2022-07-22 14:42:09 145

原创 一份神级的Java手册面世,1658页,慢慢刷,努力总会有回报

含单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式,适配器模式,装饰器模式,代理模式等23种设计模式...)含红黑树,B+树,贪心算法,哈希分治法,七大查找算法,动态规划,一致性算法,数据结构等...)(含mysql数据库基础知识,数据类型,失误,试图,mysql索引,mysql锁,mysql优化,等...)(含Java概述,语法,面向对象,IO流,API,集合,NIO,HashMap,基础常见面试题....)(含Dubbo基础,架构设计,集群,配置,通信协议,SPI,等...)...

2022-07-22 14:38:46 137

原创 java8函数式编程之Stream流处理的方法和案例讲解

函数式编程最早是数学家阿隆佐·邱奇研究的一套函数变换逻辑,又称LambdaCalculus(λ-Calculus),所以也经常把函数式编程称为Lambda计算。为什么Java需要Lambda表达式进行函数式编程呢?不多啰嗦,下面开始函数式编程之Stream流处理的方法和案例讲解。...

2022-07-22 14:36:01 309

原创 工作流引擎在vivo营销自动化中的应用实践

工作流(Workflow)——对工作流程及其各操作步骤之间业务规则的抽象,将流程中的工作组织逻辑和规则进行建模,交由计算机进行自动处理。工作流的本质思想是通过预定义的工作流程模板,对现实活动进行实例化的过程。简单说就是通过预设的格式或者可视化配置好流程的模板(比如一种分享活动的运行流程模板),使用时通过该模板构造出一个流程实例对象,通过实例对象完成活动运行跟踪和回溯。本文分析了引入工作流引擎的背景,驱使业务逻辑从控制流中剥离出来,让产研团队更聚焦于业务,解决研发效率低的问题。httpshttps。.....

2022-07-22 14:32:54 138

原创 面试官让我手写一个RPC框架

远程服务调用(Remoteprocedurecall)的概念历史已久,1981年就已经被提出,最初的目的就是为了调用远程方法像调用本地方法一样简单,经历了四十多年的更新与迭代,RPC的大体思路已经趋于稳定,如今百家争鸣的RPC协议和框架,诸如Dubbo(阿里)、Thrift(FaceBook)、gRpc(Google)、brpc(百度)等都在不同侧重点去解决最初的目的,有的想极致完美,有的追求极致性能,有的偏向极致简单。持久节点(PERSISENT)httpshttpshttps。...

2022-07-22 14:29:39 320

原创 真人踩过的坑,告诉你避免自动化测试常犯的10个错误

如果决定用无代码自动化工具的智慧参加自动化测试人员的面试,或者一直单独用无代码自动化来自动化复杂的web应用程序,那么将经历一段艰难的时光。这有助于帮助排除自动化测试脚本的故障,万一事情不顺利,就会知道该寻求谁的帮助,了解团队也可以帮助自己在需要的时候进行协调。正如在最后一点中所讨论的,一个项目可能需要不同的工具来实现组合的目标,可以让擅长不同工具的测试人员发挥自己的作用。其次,自动化所有的东西会增加测试自动化百分比,这会提供书面上很好的数据,让自己觉得完成了一项出色的工作,然而实际上并非如此。...

2022-07-22 14:28:47 206

原创 一文深入浅出理解国产开源木兰许可系列协议

木兰系列许可证包含“木兰宽松许可证”和“木兰公共许可证”(后续可能还有更多),均由北京大学作为牵头单位,依托全国信标委云计算标准工作组和中国开源云联盟,联合开源生态圈产学研优势团队和个体、尤其是开源法务和律师,起草、修订并发布。木兰开源许可证第一个版本于2019年8月5日发布,第二版本于2020年1月发布。PSMulanPSL是国内首个被OSI认定的“国产开源软件协议”。MulanPSLv2版本通过OSI认证,是否意味着v1本身就不符合开源定义,在开源生态中不具有实际意义?...

2022-07-22 14:27:41 3072

原创 用RocketMQ实现可靠消息最终一致性方案

对于常见的微服务系统,大部分接口调用是同步的,也就是一个服务直接调用另外一个服务的接口。这个时候,用TCC分布式事务方案来保证各个接口的调用,要么一起成功,要么一起回滚,是比较合适的。但是在实际系统的开发过程中,可能服务间的调用是异步的。也就是说,一个服务发送一个消息给MQ,即消息中间件,比如RocketMQ、RabbitMQ、Kafka、ActiveMQ等等。然后,另外一个服务从MQ消费到一条消息后进行处理。这就成了基于MQ的异步调用了。...

2022-07-22 14:25:11 2697

原创 无代码生产新模式探索

▐一点感悟关于低代码/无代码由于近年来各种LCDP/Low-Code概念太热各种方案及平台层出不穷,导致不少偏执的认识。部分人粗暴的把所有研发内容可视化,比如一些仅仅是把写代码的过程转化为可视化过程的产品,针对某些人群在某种程度上是降低了门槛,但在真实生产中效果有限定位尴尬。另外一种声音是完全否定,只要是听到相关名词就觉得是重复的,或者说觉得做不到、效果一定不好。很多过程的配置化、可视化确实不适合就如前面的描述。关于新工具学习使用成本及收益关于研发生产httpshttpshttpshttps。...

2022-07-22 14:24:33 178

原创 北上广深杭30K试题:如何分配JVM内存模型?

前言由于我们生产环境使用的虚拟机HotSpot居多,所以下面的描述都是基于HotSpot虚拟机而言的,对于其他类型的虚拟机,如JRockit(Oracle)、J9(IBM)可能并不太一样根据虚拟机规范,JVM的内存分为堆、虚拟机栈、本地方法栈、程序计数器、本地方法栈5部分JDK1.8同JDK1.7比,最大的差别就是元数据区取代了永久代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于元数据空间并不在虚拟机中,而是使用本地内存。...

2022-07-21 14:45:49 109

原创 总结整理大全,69个后端技术头大问题

工欲善其事,必先利其器;士欲宣其义,必先读其书。后台开发作为互联网技术领域的掌上明珠,一直都是开发者们的追逐的高峰。本文将从后台开发所涉及到的技术术语出发,基于系统开发、架构设计、网络通信等几个方面让大家对后台开发有一个清晰的了解,讲解全面易懂。...

2022-07-21 14:42:47 883

原创 【ZooKeeper】 Java 代码使用 ZooKeeper

ZooKeeper中的get命令可查看节点中存储的数据,并绑定【节点数据改变事件】(是一次性事件)监听当前节点的数据改变和当前节点(路径)的子节点的创建和删除,子节点数据发生改变不会触发事件监听。ZooKeeper中的list命令可查看子节点列表,并绑定【节点改变事件】(是一次性事件)创建ZooKeeper对象,放入IoC容器即可。b.获取子节点列表绑定的子节点改变事件。a.获取节点数据绑定的节点改变事件。若无法连接成功,尝试关闭防火墙。e.查看防火墙状态。...

2022-07-21 14:40:35 424

原创 Spring整合Mybatis及Junit

Junit是一个搞单元测试用的工具,它不是我们程序的主体,也不会参加最终程序的运行,从作用上来说就和之前的东西不一样,它不是做功能的,看做是一个辅助工具就可以了。Junit运行后是基于Spring环境运行的,所以Spring提供了一个专用的类运行器,这个务必要设置,这个类运行器就在Spring的测试专用包中提供的,导入的坐标就是这个东西。Mybatis的基础环境我们已经准备好了,接下来就得分析下在上述的内容中,哪些对象可以交给Spring来管理?...

2022-07-21 14:37:34 223

原创 MySQL进阶的增删改查操作,包含各类查询的详细解释和操作以及表的设计讲解

对于大多数企业级应用系统而言,数据库是整个应用系统的基石,因此数据库的表设计(也被称为schema设计)也就成为整个系统设计的重中之重。表设计的不好或者不合理,不仅会影响系统性能,而且会增加开发和集成的复杂性,甚至埋下隐患,最终会导致一系列的问题,例如数据不一致性问题等。概括而言,需要根据业务需求和系统功能,采用如下步骤设计表。应用系统往往涉及很多表,这些表的涉及存在先后顺序,而表之间也具有各种关联和依赖关系.因此,表的涉及并不是一蹴而就的,步骤2、3和4在大多数时候也不是清晰可分的,甚至整个设计也是一个循

2022-07-21 14:32:52 696

原创 Mybatis代理对象生成

在了解Mybatis如何实现代理前,我们先大概看下它的架构是什么样的,对这些关键的类有个大概的认识,知道它所处的位置在哪里。MapperMethod,简单看下流程,里面有2个重要的实现类,分别用于判断sql类型,处理方法参数(解析@Param参数)并最终交给SqlSession执行。本篇我们只深入研究下代理层,学习下mybatis是如何进行代理操作的,而关于sql的最终执行,放到下一篇执行流程中来研究。首先不要慌,看上面这个图,Mybatis的代理流程还是比较简单的。...

2022-07-21 14:29:19 496

原创 理解JS的三座大山

现在开始执行微任务,我们发现了process1和then1两个微任务,执行process1,输出6,执行then1,输出8,第一轮事件循环正式结束,这一轮的结果输出1,7,6,8.那么第二轮事件循环从setTimeout1宏任务开始。7.完整输出是1,7,6,8,2,4,3,5,9,11,10,12(请注意,node环境下的事件监听依赖libuv与前端环境不完全相同,输出顺序可能会有误差)5.整体代码script作为第一个宏任务执行结束,查看当前有没有可执行的微任务,执行then的回调。......

2022-07-21 14:27:14 281

原创 【TypeScript】常见的设计模式

设计模式就是软件开发过程中形成的套路和经验总结,熟悉设计模式能够在编程过程中更高效有自信,毕竟是前人印证过的最好的设计,同时也能够更好地掌控项目,方便预估开发时间以及对团队成员进行管理。通常所提的前端工程化,设计模式才是前端工程化的灵魂。...

2022-07-21 14:20:55 351

空空如也

空空如也

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

TA关注的人

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