自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

贱男

比你优秀的人还在努力,你知道吗?

  • 博客(207)
  • 资源 (9)
  • 收藏
  • 关注

原创 Nacos 根据服务名获取所有服务实例的IP和端口列表

类,这个类的作用可以注册实例,销毁实例、当然同时也可以查询实例。这个数据同步的思路大概是这个样子的,当对定时任务数据进行了:新增、修改、删除操作,执行完这些操作之后,调用。在这个时候,当在后台管理进行定时任务操作的时候,比如:修改、新增、删除操作,需要把最新数据同步给全部的。是一个单独的微服务,部署了多套,但是全部的可执行任务是在项目启动的时候,加载到内存中进行任务执行。首先,我们微服务注册中心用的是:Nacos,本文就用 Nacos 的解决方式。微服务实例,然后达到数据同步的目的。的课程,保证收获满满,

2023-05-30 16:50:56 3640 1

原创 我们是为了什么而工作?

你每天所做的工作,让你产生了成就感吗?

2023-02-09 09:57:28 1064

原创 深入ReentrantLock实现原理和源码分析

一、引言话不多说,扶我起来,我还可以继续撸。在学习ReentrantLock源码之前,先来回顾一下链表、队列数据结构的基本概念~~二、数据结构2.1 链表(Linked List)小学一、二年级的时候,学校组织户外活动,老师们一般都要求同学之间小手牵着小手。这个场景就很类似一个单链表。每个小朋友可以看作一个节点信息,然后通过牵手的方式,形成整个链表结构。1、链表是以节点的形式来存储数据,可以称之为:链式存储2、每个节点都包含所需要存放对应的数据(data 域),以及指..

2021-11-15 11:33:22 687 3

原创 一个简单算法解决集群定时任务重复执行

然后在每一个服务的定时任务执行之前,需要调用这个算法,来判断自己本身需不需要执行,如果不需要就跳过,只有判断返回为 true,才会进行真正的执行。那么这里就会带来一个问题,定时任务处理的相关的业务,其实是没有必要重复去执行的,如果重复执行反而会带来更加复杂的问题,那么我们如何来防止集群架构下,定时任务重复执行呢?那么我来讲讲在 Nacos 里面是如何巧妙的解决这个问题的,在 Nacos 里面也有很多后台定时任务,而 Nacos 只用了一个简单的算法,就很巧妙的解决了这个问题。解决的办法有很多种,可以用。

2023-10-12 13:58:53 470

原创 操作系统原理 —— 文件的逻辑结构(二十三)

我们来看下索引顺序文件,索引顺序文件是索引文件和顺序文件思想的结合,在索引顺序文件中,同样会为文件建立一张索引表,但是不同的是,并不是为每一个记录对应一个索引表项,而是一组记录对应一个索引表项。思考一下索引文件的缺点,表里面每一条数据都对应一个索引表项,因此索引表可能会很大,比如主表有1w条数据,那么对应的索引表也会是1w条数据,那有没有可能再优化一下呢?结构来看,我们可以打开一个记事本,里面的文字内容从用户的角度来看就是无结构的,但是又从 Excel 来看,它是有结构的,它可以包含表头、包含数据。

2023-06-13 15:10:28 1302

原创 深入 Synchroized 原理,从入门到精通

CAS的英文单词CompareAndSwap的缩写,比较并替换。CAS需要有3个操作数:内存地址V、旧的预期值A、即将要更新的目标值B。CAS指令执行时,当内存地址V的值与预期值A相等时,将目标值B保存到内存当中,否则就什么都不做。整个比较并替换的操作是一个原子操作。CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其他线程都失败,失败的线程并不会挂起,而是被告知这次竞争失败,并可以再次尝试。

2023-06-08 15:23:51 1037 1

原创 操作系统原理 —— 什么是基本分页存储管理?(二十二)

为了能知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表页表通常是存放在 PCB 当中。那页表是如何来记录的呢?如下图:在页表中会维护叶号和对应的块号,就能完成映射。

2023-06-08 14:15:17 863

原创 操作系统原理 —— 内存动态分区分配算法(二十一)

在上一个章节我们讲了的几种方式,有单一、固定、动态这三种,在固定、动态这种里面,操作系统会记录空闲分区表,这个表是用来记录当前空闲的内存。那么在之后有新的进程装入内存,需要从空闲分区表中找到一块比较合适的空闲内存,该怎么找呢? 这个就是今天我们要讲解的,几种不同方式的。算法思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区。如何实现:,每次分配内存时顺序查找空闲分区表或者空闲分区链,找到第一个能满足大小的空闲分区。这个算法很好理解,就从低位置开始找,找到第一个大小符合要求的就行,看下面的例子:在这

2023-06-07 18:12:25 1806 1

原创 操作系统原理 —— 内存连续分配管理方式(二十)

在之前的章节中,我们到了内存管理,其中有一个很重要的功能,就是对操作系统中的内存进行分配和回收。那如何对操作系统的内存进行分配呢? 整体上可以分为两种方式:连续分配管理方式、非连续分配管理方式。这里提到的是指:为用户进程分配的内存空间,必须是一个连续的内存空间地址。在连续分配管理方式,有划分了三种不同的方式,接下来我们一起来详细看看:在单一连续分配方式中,内存被划分为:系统区和用户区,系统区通常位于内存的低位置,用于存放操作系统相关数据,用户区就存放用户进程相关数据。在单一连续分配模式中,内存空间只能有一道

2023-06-06 17:55:51 833

原创 操作系统原理 —— 内存覆盖与交换(十九)

要弄清楚什么是覆盖与交换的概念,首先我们要知道在什么情况下才会使用到覆盖与交换。在早期的计算机内存很小的时候,比如 IBM 推出的第一台 PC 机最大只支持 1 MB 大小的内存,因此会经常出现内存大小不够的情况,后来就引入了 用来解决程序内存大小超过了物理内存总和的问题。说白了就是我需要运行一个 20 MB 大小的程序,但是这台计算机内存大小只有 10 MB 那怎么运行呢? 带入这个问题,我们接着往下看 是如何解决这个问题的。覆盖技术的思想:将程序分为多个段,常用的段常驻内存,不常用的段需要时调入内存

2023-06-06 15:00:11 663

原创 操作系统原理 —— 内存管理的概念(十八)

为什么要对内存进行管理,需要解决什么问题?要回答这个问题,首先我们需要明白:进程运行时,需放在内存才能运行。比如在执行一个程序时,需将该程序的相关数据与指令装入内存才能运行。但是内存是有限的,如果多个进程同时运行,就会出现内存不够用的情况。操作系统这时就帮我们做出抉择,并决定当前内存中应该存放哪几个进程,以及存放在内存中的什么位置。总的来说,需要对内存进行管理的原因是:内存空间有限,不能无限使用。引入内存管理能够解决的问题:进程在内存空间中怎么放,什么时候该放哪个进程进入内存。这一过程由操作系统帮助管理。以

2023-05-29 16:41:46 1052

原创 操作系统原理 —— 死锁的概念(十七)

什么是死锁,如果你是个程序员,那么这概念肯定是不陌生的,死锁通常是指,在并发环境下,各个进程因竞争资源而造成一种相互等待的现象,导致的结果就是各个进程都处于阻塞状态,无法往下继续执行,这种情况就能称之为死锁。举个生活中的例子就是,张三和李四放学回家,走到家门口,张三却发现钥匙在李四那,同时李四也发现自己家的钥匙在张三那,就这样,两个人都不能进家门。

2023-05-24 10:43:48 551

原创 操作系统原理 —— 什么是管程? 管程的概念以及作用(十六)

说白了,管程也是用来解决进程同步互斥的一种工具,他的操作比信号量更加简单,管程封装了同步操作,对进程隐藏了同步细节。那管程有什么好处?1、把分散在各个进程中临界区集中起来进行管理;2、防止进程有意或者无意的违法同步操作;3、便于用高级语言来写程序;说了这些好处,第一次看没理解也是很正常的,只能把管程了解透彻,才能明白它的好处,我们接着往下看。

2023-05-22 15:07:14 2403

原创 操作系统原理 —— 什么是信号量,信号量如何实现进程互斥、进程同步?(十五)

信号量可以这么简单的来理解,它其实就是一个变量,这个变量可以是一个整数,也可以是更复杂的记录型变量,可以用一个信号量来表示系统中某种资源的数量。比如:系统中只有一台打印机,就可以设置一个初始值为 1 的信号量。那怎么操作这个信号量变量呢?那么就是原语。原语是一种特殊的程序段,这个程序段它是能够保证原子性操作的,执行只能一气呵成,不能被中断。至于为什么原语能够保证原子性,是因为开中断/关中断这两个指令来实现的。知道原语的特性之后,那什么原语能够操作信号量呢?

2023-05-18 15:23:19 2289 1

原创 操作系统原理 —— 什么是进程互斥? 以及进程互斥的实现方式(十四)

在操作系统中,有两种资源共享方式,一种是互斥共享方式,一种是同时共享方式。互斥共享方式就是指在系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源。这里就会有一个互斥的概念,一个时间段只允许一个进程访问,这就是进程互斥,还有一个概念就是,我们把一个时间段内只允许一个进程使用的资源称之为临界资源,比如说摄像头、打印机都属于临界资源。对于临界资源的访问,必须互斥的进行。指当一个进程访问某些临界资源时,另一个想要访问该临界资源的进程必须等待。

2023-05-15 11:19:56 1612

原创 操作系统原理 —— 七种常见的调度算法(十三)

大家都知道,学习这种类型的算法,在很多时候,我们只是学习它的一种思想,那有没有好的学习调度算法的思路呢?

2023-05-10 14:21:58 1593

原创 操作系统原理 —— 操作系统什么时候会发生进程的调度(十二)

当 CPU 没有任何进程任务需要处理的时候,CPU 它也不会闲着,操作系统会运行闲逛进程,让 CUP 去执行。闲逛进程的特性一般是优先级最低,然后执行能耗低。

2023-05-08 11:44:51 1509

原创 操作系统原理 —— 调度的概念、层次(十一)

在操作系统中的,是指操作系统从就序队列中选择一个作业,或者进程进行执行。举个例子:比如我们去银行窗口排队,排队的人就相当于就绪列表,窗口就相当于是操作系统,窗口需要服务排队客户。如果在正常的排队过程当中,如果有一个 VIP 的客户来银行需要办理业务,由于他是 VIP 客户,所以他会被窗口优先进行处理,在操作系统汇总也是同样的道理,有些任务可能比较紧急,或者执行的时间比较短,都有可能被优先执行,这就需要确定。那我们先来看一下,在什么时候用,会发生调度。高级调度又称之为作业调度,按一定的原则,并且创建进程。每个

2023-05-05 17:45:01 807

原创 操作系统原理 —— 线程的概念、实现方式、多线程模型(十)

有的进程可能需要 “同时” 做很多事情,而传统的进程只能串行的执行一系列的程序,为此,引入了 “线程” ,来增加并发度。可以把线程理解为轻量级进程,线程是可以基本的 CPU 执行单位,也是程序执行流的最小单位,引入线程之后,不仅是进程之间可以并发,进程内的各个线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务。引入线程后,进程只作为除 CPU 之外的系统资源的分配单元。

2023-05-04 16:08:28 1176 1

原创 操作系统原理 —— 进程之间通讯的几种方式(九)

进程通讯是指两个进程之间产生了数据交互,简称 IPC Inter-Process Communication。什么情况下会产生进程之间通讯呢?比如你们现在用手机看到了我这篇文章,觉得写的非常好,然后想要分享到微信的某个朋友,在这个时候其实就是跨进程了。需要从当前浏览文章的 APP 中,把当前文章相关的信息,通过进程通讯的方式,传递给微信,最终才能转发对应的内容。所以说,进程之间的通讯是很重要的,但是,进程之间的通讯的前提,是需要操作系统支持。那为什么要基于操作系统的支持,才能做到呢?

2023-04-26 11:46:53 632

原创 操作系统原理 —— 进程状态切换具体做了哪些事情?(八)

进程控制的主要功能是:对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。简单来说,就是进程控制就是要现实进程状态的转换。那如何实现进程的控制呢?答案就是使用原语来实现,如下图:在之前我们有提到过,原语是具有原子性操作的,运行必须一气呵成,那如果没有原子性,会发生什么事情呢?我们来看一下假设:在上图中,假设需要使用源语进行状态的切换,至少需要做两件事:1、将 PCB 2 的 state 设置为 12、将 PCB 2 从阻塞队列放入到就绪列表。

2023-04-24 16:18:08 566

原创 操作系统原理 —— 进程有哪几种状态?状态之间如何切换?(七)

主要是掌握进程的状态,以及状态之间的切换。

2023-04-23 14:32:53 1546

原创 操作系统原理 —— 什么是进程?进程由什么组成?有什么特征?(六)

在我小时候,刚刚接触电脑的时候,只会在浏览器中输入 搜索小游戏玩一玩,到后来,我学会了安装游戏,然后知道安装完成之后,找到对应的 的图标就可以运行游戏。好,那么什么时候是程序? 程序就是我们下载好安装包之后,点击安装,然后需要选择安装目录,最后在中对应的磁盘位置就能找到这个程序。在程序安装好之后,它是存储在磁盘上的,并且它是静态的,程序也就是一系列的指令集合。那什么是进程? 我们来一起看看下图:在我们程序安装好之后,运行所安装的程序,如果是你 系统可以使用查看,如果你是使用的 系统,可以使用 来查看

2023-04-23 11:23:18 578

原创 操作系统原理 —— 什么是系统调用?(五)

我们想想怎么是系统调用呢?系统调用是操作系统提供给应用程序(程序员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务。我们一起来看下图:我们在操作系统中,可以使用控制台输入命令,不通过应用程序可以直接和操作系统交互,这个叫做:命令接口。而在应用程序中,我们程序员可以通过程序接口,来调用操作系统,让操作系统帮助我们完成所需的事情。那为什么需要系统调用呢?

2023-04-20 14:31:30 676

原创 操作系统原理 —— 什么是中断?(四)

为了解决程序只能串行执行的问题,人们发明了操作系统,操作系统相当于计算机的管理者,并且引入了中断机制,实现了多道程序并发执行。也就是说,在多个程序同时执行的时候,如果发生了中断就意味着需要操作系统来介入,展开管理工作。官方的定义:中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。从官方的定义来看,中断其实就是为了支持多道程序并发执行。

2023-04-19 16:22:44 1472

原创 操作系统原理 —— 操作系统运行机制与体系结构(三)

指令就是处理器(CPU)能识别、执行的最基本命令。比如我们平时写的 Java 代码、C 语言代码,CPU 它能直接识别并且运行吗?当然是不行的。Java、C 语言这些都属于高级语言,它们还需要经过一系列的编译最后才能成为 CPU 能够识别的指令。这里说几个重点:1、特权指令只能在核心态下执行2、内核程序只能在核心态下执行3、用户态、核心态之间的切换,也比较重要,这个后续再讲解。

2023-04-19 14:29:15 657

原创 操作系统原理 —— 操作系统的四个特征:并发、共享、虚拟、异步 (二)

本章我们来聊一下操作系统的四个特征在我们的操作系统中有四个特征:,我们结合每一个特征来进行讲解,我们先来看。这里所说的并发,最好不联想到并发编程。咱们就简简单单理解一下,在操作系统中的特性。定义:并发是指两个或多个事件,在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。这里和是两个概念,并行是指两个或者多个事件,在同一时间内,确确实实是一起在同步进行的,而并发不一样,并发是外表上看上去是在一起进行,实际上是底层交进行的。如果对并发、并行还不太了解的同学,可以先暂停,把这个问题弄清楚了,

2023-04-19 11:08:21 1530

原创 操作系统原理 —— 操作系统的概念、功能 (一)

不管是电脑、还是手机,都可以大致分为以下层级:我们从下往上看,首先肯定是需要硬件的支持,有了硬件之后才有我们的操作系统,我们可以在操作系统上进行安装应用程序,最终用户可以使用应用程序。在上图中,用户还可以直接来控制操作系统,比如我们可以不需要安装软件,使用命令行直接和操作系统进行交互。那从这个图中来看,操作系统它应该需要具备哪些作用呢?1、负责管理协调硬件、软件等计算机资源的工作2、为上层的应用程序、用户提供简单易操作的服务。

2023-04-18 14:52:31 527

原创 没有十几年的积累,你还真写不出什么好的代码

没有十几年的积累,你还真写不出什么好的代码

2022-10-30 13:14:49 7215 5

原创 程序员职场生活记录分享——打工人沪漂五年,2022年的想法

打工人沪漂五年,迷茫了

2022-08-03 10:19:52 2127 4

原创 五年的职业生涯感想,博客纪念日

机缘一开始写博客,只是单纯的为了做笔记,方便日后查看。所以17年的我,只简简单单的写了一篇文章。 到后来慢慢学习,还是感觉需要做笔记,记录下来,所以我成为了一名博主。收获 准确的来说写博客应该是4四年,毕业工作5年。 五年,收获很大。 技术上的收获,从入门到熟悉原理,走了很多弯路,也花费了很多时间。感觉上主要分两个阶段,第一个阶段就是应用,那会那毕业很多东西都没用过也不知道,就开始学习怎么用,...

2022-05-25 14:48:52 529 5

原创 Apipost 一款值得使用的利器

一、引言今天是小编隔离的第22天,天气晴,心情可以,状态不错。嗯,上海加油。今天小编来推荐一款利器。二、主角登场Apipost 是一个支持模拟POST、GET、PUT常见的HTTP请求,支持团队协作,并可直接生成并导出接口文档的API调试、管理工具。你可以把这款利器看成这样的组合:Apipost = Postman + Swagger + MockPo...

2022-05-05 14:43:20 24930 4

原创 springboot版本升级,oauth2授权401

2022新年上班第一天,简单记录下春节期间,给公司项目升级,遇到的一点问题。公司有个项目之前springboot的版本是1.x,由于注册中心要换成nacos,就不得已的吧springboot版本升级。升级之后,重新打开登录页面,发现登录不上去了,看控制台消息,spring security oauth2 授权接口401了小编这里用的授权模式是:密码模式,就是通过用户密码来认证的。排查过程如下,希望能帮到你:解决一:之前低版本授权下,不是需要client_secret参数的,所以就把c

2022-02-07 10:09:05 1775 2

原创 嗯,学习Spring框架第六个年头了

一、引言 2016年,“框架”这一词,在学习Java基础之后接触到了这个词。 最开始的疑问,什么是框架? 为什么要学习框架?有哪些框架?二、学习过程 最开始学习spring框架,就是老师会打开一个搭建好的spring框架,然后说把这个复制到这,把这个复制到这,然后这里写一个@Autuwried注解,然后这个对象就能用了。 然后我们需要在这个方法前后增加一些逻辑,我们可以复制这个,然后粘贴到这,然后加上这个@Aspect注解,就可以在这...

2021-10-15 10:18:06 790

原创 你的每一天都是在开心快乐的工作写代码吗?

2021年8月了小编今年2月份换了新工作、今年6月份兼职了一份完完全全和程序员没有一点儿关系的工作。

2021-08-04 17:40:24 574 12

原创 ConcurrentHashMap1.8 最最最最最详细源码分析

声明:本文只有源码分析注释,提供正在研究ConcurrentHashMap源码的同学参考!!!1、相关重要属性/** * concurrentHash数组存放数组,默认为null,初始化默认为16 * table 存放要么是Node节点,表示链表元素,要么是TreeBin,表示红黑树 */transient volatile Node<K,V>[] table;/** * 扩容时新生成的数组,其大小是原数组的两倍 */private transient volat

2021-05-18 14:46:25 540

原创 HashMap1.8 最最最最最详细源码分析

声明:本文只有源码分析注释,提供正在研究HashMap源码的同学参考!!!1、put 方法final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { // 声明几个变量 // n table数组长度 // p 当前hash计算出下标,对应的第一个元素 Node<K,V>[] tab; Node<K,V> p; in

2021-05-18 14:40:20 350

原创 ConcurrentHashMap1.7 最最最最最详细源码分析

声明:本文只有源码分析注释,提供正在研究ConcurrentHashMap源码的同学参考!!!1、内部结构:2、Segment 分析 static final class Segment<K,V> extends ReentrantLock implements Serializable { // 尝试获取锁最大次数,可以理解为自旋次数 static final int MAX_SCAN_RETRIES = Runtime.getRunt

2021-05-18 14:27:57 824 4

原创 HashMap1.7 最最最最最详细源码分析

声明:本文只有源码分析注释,提供正在研究HashMap源码的同学参考!!!1、重要参数容量 capacity :2的N幂次方,最大容量是 2的30次方,默认16负载因子 loadFactor :默认 0.75扩容阀值 threshold :当哈希表的大小 >= 阀值时 并且当前hash对应的数组中不等于null,才进行扩容,容量 * 负载因子2、构造方法// initialCapacity 数组容量,默认 16// loadFactor 负载因子public H.

2021-05-17 15:00:02 346 1

原创 【中间件】阿里云SLS日志服务

1、引言传统来说,如果服务发生了异常行为,一般都是由开发人员,登陆相对应的服务器,找到对应服务log文件去查看。在或者,如果发生了异常行为,把异常信息记录到数据库,再去数据库或者页面平台去展示。这两种方式其实都造成了很多不便捷,第一种方式需要开发人员登陆服务器找对应的日志文件,过程本身就就比较麻烦,并且如果是集群到环境下,那就更为复杂了。第二种方式提高了开发成本。本文讲解一下如何快速的接入阿里云的SLS日志服务,文本数据接入的方式是多行-文本,主要是采集log日志文件中的数据。友情链接:阿.

2021-03-29 17:17:26 4298

Vue调用SpringBoot后台实现文件下载功能

该案例实现前端Vue通过axios请求SpringBoot后台,实现文件下载功能。 filepack : 前端项目 8081端口。 fileServer: 后端项目 8080端口。

2019-04-02

SpringCloud_Eureka服务调用实战案例

本实战案例实现Eureka服务端、客户端的基本配置,以及配置Eureka高可用。 针对实际业务中进行实战演示,订单服务已知商品编码,通过Eureka调用商品服务从而获得商品信息等操作!

2019-03-26

spring集成redis实现聊天室功能

spring集成redis,实现订阅、发布消息聊天室网页群聊功能。

2019-02-17

CentOS-6.3-i386-bin-DVD1.iso 镜像文件

CentOS-6.3-i386-bin-DVD1.iso 镜像文件 用于虚拟机系统安装。

2019-02-08

SpringBoot前端网页上传文件案例

java web前端上传文件到后台常用三种方式,包括from表单提交、ajax提交、FormData对象提交,框架采用Spring Boot。

2019-02-05

springboot-websocket实战案例

该项目采用springboot+websocket 实现聊天小案例。 包括 springboot+websocket 实现服务端代码、html5 连接websocket客户端、springboot后台连接websockete客户端代码。

2019-01-12

IK Analyzer 2012FF_hf1

IK-Analyzer中文解析器,提供给搜索引擎进行中文分词,来达到更好的搜索效果!

2018-09-17

dubbo+zookeeper透明化远程调用实战案例下载

dubbo服务是阿里所出的一个框架,结合zookeeper来实现透明化远程调用。

2018-04-24

javamail发送邮件需要的jar包

需要使用javamail jar包的可以下载

2017-05-25

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

TA关注的人

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