自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 批处理相关总结

(4)start命令启动服务会打开一个新的cmd窗口进行服务的启动,当服务启动完成后原来的cmd窗口就会自动关闭,而start命令启动tomcat服务完成后原来的cmd窗口不会自动关闭的原因是因为即使tomcat服务已经启动完成,但是服务中可能还存在着一些其他的线程阻止cmd窗口的自动关闭,例如后台服务、定时任务、持久连接等等。(2)使用timeout /t /5 /nobreak命令等待5秒钟在进行执行后面的语句,这种等待的时间会比较固定,不能完全保证之前的进程和任务执行完毕,有一定的不确定性。

2024-01-30 16:16:08 117

原创 JavaFX窗口生成

创建两个类Main、Test,其中Test类继承Application抽象类并实现start()方法(start()方法中需要调用show()方法)JavaFX中存在Application类,用于窗口的初始化(init())、显示(show())、结束(stop())操作。这里通过Class对象调用指定类中的窗口可以使得窗口调用变得更加灵活、同时也减少代码的冗余(不同类中设置着不同的窗口样式)在Main类的main()方法中调用方法Application.launch(Test.class,args)

2023-12-12 18:16:34 543

原创 Linux常用命令

ls -a显示所有文件,包括隐藏文件(在linux操作系统中所有以.开头的文件都是隐藏文件)rm在删除文件时会进行询问,但是添加-f选项那么在删除文件时就不会进行询问直接强制删除。ls -l显示文件的详细信息,文件包括两种形态(d开头表示目录、-开头表示文件)touth 1.txt 2.txt 3.txt参数可以有多个。ls -l查看所有文件并显示详细信息,-l代表选项。ls命令参数为路径,表示显示指定目录下的文件。

2023-12-12 17:11:00 524

原创 线程相关问题

Vector给每一个方法都添加了synchronized关键字,同一时刻只能有一个线程访问同一个方法,CopyOnWriteArrayList允许同一时刻有多个线程进行读操作,但是同一时刻只能有一个线程进行写操作,CopyOnWriteArrayList在进行写操作时,会先对集合中的底层数组进行复制一份,并对复制出来的数组进行数据修改操作,当修改完成后再使用修改完成后的数组对原数组进行覆盖,这样在多线程的情况下,当一个线程对集合进行写操作的同时,其他线程还能对集合进行读操作,提高了运行效率。

2023-11-15 02:45:00 451

原创 Java虚拟机的垃圾回收机制

在Java语言中不再被任何引用所指向的对象被称为垃圾,这也是非常容易理解的,因为我们在对对象进行创建时,就需要给出一个对象引用变量用于指向我们在堆内存中创建的对象,所以如果一个对象没有被任何引用变量所指向的话,那么我们也就获取不到对象,也就没有办法对对象进行操作,这个对象自然就成了垃圾。引用计数算法判断对象是否为垃圾时比较方便快捷只是根据计数器中的值进行判断,但是会在每个对象的对象头中添加属性占用额外的空间,并且引用变量每一次指向对象都需要对对象的属性进行更新操作,占用大量的时间。为什么需要回收垃圾?

2023-11-15 02:30:00 364

原创 UML建模语言

继承关系相当于Java中的继承,是类和类之间的关系,在代码中通过extends实现,也是对象之间耦合关系最大的一种关系。实现关系是接口和类之间的关系,相当于Java中对接口的实现,在代码中通过implements实现。例如:学校和老师的关系,老师是学校的一部分,但是当学校不存在时老师依然可以单独存在。组合关系中成员变量是整体的一部分,但是当整体不存在时,成员变量则不可以单独存在。例如:医院和病房的关系,病房是医院的一部分,但是当医院不存在时病房也就不存在了。,同样聚合和组合关系也是部分与整体之间的关系。

2023-11-15 02:15:00 337

原创 UML建模语言

继承关系相当于Java中的继承,是类和类之间的关系,在代码中通过extends实现,也是对象之间耦合关系最大的一种关系。实现关系是接口和类之间的关系,相当于Java中对接口的实现,在代码中通过implements实现。例如:学校和老师的关系,老师是学校的一部分,但是当学校不存在时老师依然可以单独存在。组合关系中成员变量是整体的一部分,但是当整体不存在时,成员变量则不可以单独存在。例如:医院和病房的关系,病房是医院的一部分,但是当医院不存在时病房也就不存在了。,同样聚合和组合关系也是部分与整体之间的关系。

2023-11-14 22:08:45 344

原创 Spring封装数据结果

而对于引用数据类型的数据,只有字符串类型和数组类型较为特殊,不论是数据是什么格式进行传递的,字符串类型的数据键有值没有,就会封装成空字符串,数组类型就会变为length为0的数组,而其他的引用数据类型的数据,不论是以什么形式进行传值的,只要是没有明确的值,那么就会被封装成null。字符串类型类型为空的字符串,数组类型为length为0的数组,其余的则都为null。也是一样封装时采用默认的数据进行封装。封装时就会采用默认的数据进行封装。传键但是值为空字符串。传键但是值为空字符串。

2023-11-10 22:30:00 165

原创 PageHelper多表关联查询数量问题

正常情况下我们通过mybatis的封装,就可以将查询到的数据封装在4个角色对象当中,但是如果我们还想使用PageHelper进行分页查询,那么PageHelper给我们返回的数据总数total就会是8条,这样很显然不是我们想要的数据。通常我们会使用PageHelper进行分页查询,但是当分页查询被用到多个表的关联查询中时,就有可能导致查询出来的数据总数比我们想要的多得多。假设我们想要查询角色所对应的路径的名称有哪些,此时就会进行多表关联查询。role_path角色路径关系表。

2023-11-08 21:45:00 467

原创 二分搜索算法

对于一组有顺序的数据,不采用常见的遍历方式找到需要的数据,而是利用其规律,比中间数据小的一定在中间数据左边,比中间数据大的一定在中间数据右边,每次排除一般的数据,从而提高搜索算法的时间复杂度。这道题由于数据一定存在于数组当中,所以其下标的取值一定是0~数组长度-1,所以我们将left = 0,right = nums.length - 1,其他的题目也是相同的道理。,但是如果比目标值大,那么就可能是mid位置,也有可能是在mid左边,于是。,如果是left = mid,那么。,反之则是一定在其左边。

2023-09-21 20:00:00 96

原创 Java对象克隆

在克隆时对成员变量进行简单的赋值操作,两个对象的成员变量进行一一赋值,如果成员变量为基本数据类型,那将不会产生影响(基本数据类型的赋值会创建新的地址)而引用数据类型则不会,只是简单地将对象的地址值进行赋值,这样两个引用指向同一个地址,当一个引用类型的成员变量改变后就会影响另一个对象的成员变量也发生改变,并不能将原有的数据进行保存。在内存中新创建(生成一个对象),并且对象中成员变量的属性也完全相同,在内存中存在两个对象。想在原有对象的基础上产生新的数据,并且还想将原有的数据进行保存。

2023-09-21 00:00:00 121

原创 Java中的锁

轻量级锁锁的程度位于偏向锁和重量级锁中间,当线程获取轻量级锁对象失败后,线程不会阻塞,而是会采用CAS+自旋的方式尝试再次获取锁对象,直到自旋次数达到阈值,就会发生锁的膨胀,将锁升级为重量级锁。非公平锁中当一个线程获取锁对象时,都会先尝试获取锁对象,如果失败了就将请求放入队列当中,如果获取锁对象成功后,就会执行获取到锁对象的线程,不论请求队列中是否存在其他请求,是一种非公平的获取方式,每个请求在放入队列之前都有尝试的机会。互斥锁只有两种状态,相比于互斥锁,读写锁的状态比较多,维护起来不方便。

2023-09-10 19:00:00 208

原创 CAS策略

存在两个线程A和B都获取共享变量的值作为期望值,此时线程B先进行CAS操作,将共享变量从A改为B,线程B再一次进行CAS操作,将共享变量从B改为A,此时线程A使用期望值和共享变量进行判断,虽然是相等的,但是线程A此时的期望值已经不是共享变量的最新值,线程A并不知道,其在获取期望值到进行比较的过程中共享变量发生了几次变化,虽然操作的结果是正确的,但是并不知道迭代了几个版本,于是就出现了ABA问题。指的是一个线程获取到的期望值即使和共享变量的值相等,但是此时的期望值却不是最新的值。

2023-09-06 17:00:00 145

原创 Java---多线程

​Java中使用volatile关键字可以确保在多线程环境下共享数据的可见性,其原理是在对数据进行读操作时会先去主存当中读取数据,将数据读取到缓存当中,再从缓存中读取数据,写操作也是一样,会直接将数据的结果写入到缓存当中区,在从缓存将数据写入到主存当中,这种操作相当于牺牲了一部分缓存来换取共享数据的可见性。​ Java内存模型中规定所有的变量都存放在主内存当中,当存在线程对变量进行操作时,会将变量进行复制,变为变量副本存储在工作内存当中,从而对工作内存中的变量副本进行操作,每个线程的工作内存是独立的。

2023-09-04 15:45:00 104

原创 redis数据库及其常用数据结构

非关系型数据库其实是相对于关系型数据库而言的,关系型数据库中同种数据存储在一张表中,使用表将不同种类的数据进行分隔并且表中的数据如果存在主键,也可以根据主键确定表与表之间的关系,或者说是数据与数据之间的关系;而非关系型数据库中所有的数据都是存放在一起的,数据与数据之间没有关系,我们无法通过一次查询而找到具有某种关系的数据(即使数据真的有关系)。所以说在Java中通常使用hash类型的数据来存储对象,并且如果添加了相同属性的数据则会将原来属性的值进行替换。] 移除有序集合中的一个或多个成员。

2023-08-27 14:30:00 189

原创 KMP算法思路

的字符串的最长公共前后缀的长度,那么当出现元素不匹配情况时,如果串b前面的子串存在公共前后缀,那么公共前后缀的部分也就不需要再次进行比较,由于公共前后缀的长度为next[bIndex],那么bIndex就可以直接从索引为next[bIndex]的地方继续进行比较即可,也就是说bIndex不需要重新变为0,降低比较的次数。,数组的长度为串b的长度,数组的作用就是当两个字符串比较出现不相等字符的情况时,可以不重新开始从串b的第一个字符开始比较,减少比较次数以及降低时间复杂度。4、bIndex=0,进行第一步。

2023-08-22 19:15:00 344

原创 windows下redis服务启动及.bat文件中中redis服务的启动

【代码】windows下redis服务启动及.bat文件中中redis服务的启动。

2023-08-18 16:45:00 1377

原创 Comparable和Comparator接口的区别

Comparator接口在使用时通常需要传递接口实现类的对象作为方法的参数,但是由于方法传递的对象我们并不会使用,只会使用对象实现的compare()方法所以我们通常会采用匿名内部类的方式创建接口实现类的对象,并且由于接口中只存在一个抽象方法compare()所以可以采用Lambda表达式的方法进行代码书写,并且这种方式并不会改变待排序对象类中的代码。声明一个测试类A并在A类中声明一个需要传递CarInter接口实现类对象的方法。为什么Comparator接口中存在equals()方法?

2023-05-30 19:21:00 87

原创 equals方法和hashCode方法相关规则

例如在hashMap集合中存放着键值对,调用hashMap中的get和set方法时,hashMap会根据键的哈希值来计算键值对存放的位置,如果只是重写了equals方法,在调用get方法时虽然两个对象通过equals方法判断是相同的对象但是获取到的hash值却是不同的,所以就会导致会找不到键值对,有很严重的后果。1、同一个对象或者相同的对象的哈希值必须相同,对象的哈希值会用来比较两个对象是否相等,但在不同的程序中哈希值可以是不同的(启动两次main方法返回的哈希值可以是不同的)

2023-02-28 20:14:31 167 1

原创 序列化与反序列化的实现

对象序列化将对象转换为二进制字节流的形式,将内存中的对象输出到本地磁盘的文件中1、自定义类Window并实现Serializable接口2、创建文件对象3、创建文件输出流对象用于给文件中输出二进制字节信息4、对文件输出流进行封装,将其变为对象输出流5、将序列化之后的二进制字节流写入到文件中文本文件中的内容如下。

2023-02-28 17:00:00 159

原创 【Java虚拟机——本地方法接口&执行引擎】

JIT解释器是在将翻译后的机器指令保存在计算机之后才效率高,如果所有的代码都采用JIT编译器,那么如果代码过多的情况下,当Java虚拟机启动时,由于需要将所有的代码先翻译一遍,所以花费时间可能过长,导致Java虚拟机执行效率降低,所以Java虚拟机通常采用解释器和JIT编译器相结合的方式对字节码文件进行翻译。native关键字不能与abstract关键字一起使用,abstract关键字表示方法的方法体没有被实现,但是native方法的方法体需要被实现,两者相互矛盾。:唤醒对象的所有等待的线程。

2023-02-24 20:45:00 146

原创 强、软、弱和虚引用

使用软引用指向的对象,不会立即被垃圾回收器回收,而是当内存将要满的时候,先进行一次垃圾回收,如果此时内存还是不足,就会对使用弱引用指向的对象进行垃圾回收,对弱引用对象进行垃圾回收是在迫不得已的情况下才进行的。使用虚引用指向的对象,如果被垃圾回收器发现,就会被立即回收,虚引用必须和引用队列一起使用,当虚引用指向的对象被垃圾回收,Java虚拟机就会把这个虚引用加入到与虚引用关联的引用队列中,用于跟踪垃圾回收的过程。使用弱引用指向的对象,如果被垃圾回收器发现,就会立即被回收,不论内存中的空间是否充足。

2023-02-24 20:00:00 59

原创 Vue项目创建

单机Vue项目文件夹,然后使用按下Alt + c 快捷键,在下方弹出的小窗口中输入。点击任意一个链接进行页面跳转,并出现欢迎界面表示成功创建Vue项目。点击运行压缩文件中的HBuilderX.exe程序即可打开软件。解压缩的位置即为HBuilderX软件所在的位置。选择Vue项目,并设置项目名称和所在位置。将压缩包下载完成后需要进行解压缩。下载HBuilderX软件。6、运行成功后出现如下链接。

2023-02-20 22:00:00 101

原创 并发线程&多种锁

Vector给每一个方法都添加了synchronized关键字,同一时刻只能有一个线程访问同一个方法,CopyOnWriteArrayList允许同一时刻有多个线程进行读操作,但是同一时刻只能有一个线程进行写操作,CopyOnWriteArrayList在进行写操作时,会先对集合中的底层数组进行复制一份,并对复制出来的数组进行数据修改操作,当修改完成后再使用修改完成后的数组对原数组进行覆盖,这样在多线程的情况下,当一个线程对集合进行写操作的同时,其他线程还能对集合进行读操作,提高了运行效率。

2023-02-15 19:45:00 201

原创 【Java虚拟机——运行时数据区】

假设两个幸存者区中没有一个对象,新生成的对象刚开始会被存放伊甸园区内,伊甸园区中的对象经过一次垃圾回收后会将保存下来的对象存放在幸存者0区内,继续再生成新的对象仍然存放在伊甸园区,此时进行第二次垃圾回收,对伊甸园区和幸存者0区中的对象都进行垃圾回收,再将剩下保存下来的对象一起移动到幸存者1区,此时幸存者0区中不存在对象,按这样的过程一直循环,保证两个幸存者区中总是有一个区域中是不存在对象的,直到对象经历的垃圾回收的次数达到所设置的次数,就会将对象移动到老年代中。

2023-02-05 02:00:00 124

原创 【Java虚拟机——类加载】

我们可以通过继承ClassLoader类创建自定义的类加载器,除了引导类加载器以外,所有的类加载器都是ClassLoader类的派生类,ClassLoader类中有两个方法没有使用final关键字修饰,表示方法可以被重写,所以我们可以通过重写这两个方法来实现打破双亲委派机制。最顶层的类加载器,与Java无关,底层使用C/C++实现,加载Java的核心类库,用于启动Java虚拟机,特别的String类是由引导类加载器进行加载。一直到引导类加载器,然后从引导类加载器开始进行尝试加载该类,如果加载。

2023-02-02 23:45:00 164

原创 异常和自定义异常

try cat finally throw throws 传入一个字符串形式的全类名,这时程序就会出现编译时异常,因为我们传入的参数可能会出现找不到该类等等的问题,所以程序问了防止出现这种异常的情况会让我们对可能出现这种问题的情况进行。只有在程序运行的阶段数组才会调用方法取判断数组本身的长度以及给出的下标,子类在实现抽象方法时如果选择抛出异常,那么抛出异常的范围一定得是等于或者小于抽象方法抛出的异常,假设父类抽象方法抛出的是。,一般我们都会选择为编译时异常因为运行时异常在编译阶段是没有任何提示的

2023-01-24 22:15:00 140

原创 常见的日期类

SimpleDateFormat类用于日期和字符串之间的转换,平时我们在网上填写的表单日期信息都是String类型的,但是我们需要把信息放在Date类型的对象中进行存储,这时就需要这两种类型之间的转换,而SimpleDateFormat类可以帮助我们解决这个问题。如果是已知long类型的毫秒数来求毫秒数对应的时间的话,Date类中还有一个带有long类型参数的构造方法。由于其返回值是long类型的所以这个并不是很直观的表示当前的时间,于是就有了下面的日期类。SimpleDateFormat类。

2023-01-16 01:30:00 106

原创 自动装箱和拆箱

所以说Integer.valueOf方法为什么会先判断参数value的范围,如果在-128~127之间就会直接返回数组中已经创建好的对象的地址,如果没有在这个范围内才会新创建对象。,如果我们想要基本类型的包装类对象就需要使用new来创建对象,也可以使用包装类中的ValueOf方法。我们可能认为这是自动拆箱的结果是因为a和b的value值相等所以输出的是true。类型的值在一个范围内是并不会创建新对象的,而是返回一个数组中的结果。,a和b明显是两个不同的对象但是上面的结果输出的却是。

2023-01-15 16:45:00 127

原创 正则表达式及String类中使用正则表达式的方法

regex表示正则表达式,该方法是将字符串进行分割,就是以满足正则表达式的字符串进行分割,并以字符串的形式返回满足要求的字符串的左右两边,由于满足正则表达式的字符串不止一个,所以该方法返回一个字符串类型的数组,数组中存放的就是被分割后的字符串。[]表示括号中的元素满足或的关系,意思为括号中出现的字符都是满足要求的(这里如果是连续的字符我们也可以使用"-"来表示一个字符范围而不用一个一个全部列出来),后面的数量词也就是上面出现的那些。\D或者^[0-9 ] 表示不是[0-9]\w 数字、字母、下划线。

2023-01-15 00:00:00 490

原创 Arrays类中的常用方法

compareTo方法的返回值类型为int类型,我们可以在方法中制定两个对象比较大小的规则,compareTo方法需要传入一个对象类型的参数,我们此时就可以使用this以及传入的对象这两个对象中的某一个属性来决定这两个对象的大小,如果返回值小于零代表后面的对象大于前面的对象,如果等于零代表两个对象相等,如果大于零代表前面的对象大于后面的对象。比如说如果返回值为-3,那么就表示该元素如果需要插入时,应该在数组的第三个位置。这里我是根据两个对象中的age属性来决定对象的大小。比较数组中的内容是否相同。

2023-01-12 19:45:00 140

原创 接口、抽象类以及final关键字

修饰,final修饰的方法表示不能被重写,被private修饰的方法子类无法继承,由于继承抽象类的类需要实现父类中的抽象方法,不能被重写或者无法继承也就无法重写父类的抽象方法,所以final和private不能修饰抽象类中的抽象方法,由于static修饰的方法属于类的方法,继承该类的子类不能实现父类被static修饰的方法,如果static可以修饰抽象方法那么子类继承父类后就必须实现父类的抽象方法,这显然与被static修饰的方法存在矛盾。存在抽象方法的类一定是抽象类但是抽象类不一定存在抽象方法。

2023-01-12 17:00:00 248

原创 方法重写和重载

方法重载只有当参数的顺序,数量和类型不相同时才是重载。方法的访问权限修饰符的访问范围不能小于父类方法的访问权限修饰符。当父类中的某个方法无法满足子类中的需求时需要对父类的该方法进行重写。方法重写必须满足参数,返回值类型和父类的相同。方法重写是子类方法对于父类方法而言的。方法重载是对于同一个类中的方法而言的。方法名和参数需要和父类一致。方法重写和方法重载时的方法名相同。返回值需要和父类一致。

2023-01-10 21:00:00 98

原创 哈希表中哈希值的计算方法

这里为了方便字符串类型转换为整数类型我们是直接通过对象中的hashCode方法获取的,但是对象中的hashCode方法有时也是不能直接使用的,例如负数整数类型的hashCode方法获取到的哈希值是负数,这样当我们进行相加操作的时候有可能算出来的哈希值是为负数的,这将不利于我们在数组中进行存储,因为数组中的下标都是从0开始的不存在负数的下标。​ 一般的小范围的整数,例如0-99由于其长度不是特别的长所以我们可以直接分配一个长度为100的数组,每一个数字就相当于数组中的索引我们可以直接使用而不做任何的操纵。

2022-11-26 21:00:00 4431

原创 Java面向对象,类以及static关键字

​ 访问权限修饰符 修饰符 class 类名{}​ public访问权限修饰符修饰的类类名和文件名必须相同由于构造方法不能被子类所继承,而且使用final关键字修饰的方法不能被重写,所以使用final关键字修饰构造方法是没有意义的使用abstract关键字修饰的方法没有方法体,需要由子类重写来实现,但是由于构造方法不能被子类所继承,也就无法实现父类的构造方法,所以无法使用abstract关键字修饰构造方法。

2022-10-31 15:09:02 126

原创 Git版本控制工具

在将文件添加到暂存区之前可以安装ignore插件,用来排除一些不需要添加到暂存区的文件。点击3次回车即可生成SSH公钥,生成的公钥保存在C盘的用户目录中.ssh文件。有一台服务器,其他的客户端与服务器连接,客户端将修改的记录提交到服务器当中。​ 1、记录文件修改的历史记录,提交到仓库才会记录版本。再通过git中的commit就可以将文件提交到本地仓库。git:开源的,分布式的,简单快速高效的版本控制工具。将其中的.pub文件打开,文件内容就是生成的公钥。输入获取到的仓库中的SSH地址。

2022-09-27 19:58:51 272

原创 SpringWeb

5、将数据交给Handler处理器进行后端处理最终将数据返回给前端,如果后端方法的返回值类型为自定义类型后端可以将处理完后的数据转换为json的形式返回给前端,但是有两个前提:一个是需要导入转json的jar包,第二个是control类需要使用@RestController标签进行注解,标签中有RequestBody为ajax异步请求,将数据写入到响应体中;最后可能会忘记在自定义的对象类中生成Setter和Getter方法。4、将请求中的数据进行封装处理,将请求消息转换成一个对象,数据转换,数据格式化等。.

2022-08-18 17:53:07 637 2

原创 JWT概述

​ JWT是用户授权,而session是用户认证jwt无状态登陆session有状态登陆​。

2022-08-14 14:51:26 182

原创 Spring框架使用

​事务事务是由一个或若干个数据库操作所构成,在进行业务处理时一个业务可能会有多个对数据库的操作,这些操作可能会出现异常在执行过程中产生中断,为了确保用户对数据库数据的操作具有一致性,需要通过事务对这些操作进行管理,被事物进行管理的操作在执行后不会立即提交给数据库,而是等待被同一个事务管理的所有数据库操作执行完后,在确保所有的操作都不出异常的情况下,再进行事务的提交,如果这些操作中存在了异常情况,事务会进行回滚撤销之前已经执行的操作,这样就可以确保数据库在一次业务处理时数据库数据的一致性。...

2022-08-02 19:00:00 903

原创 Java语言的特征和HelloWorld书写

​我们将Java源代码写入一个以.java为后缀名的文件中,打开dos窗口,通过javacTest.java命令将Test的java文件进行编译,之后如果编译成功会在java文件对应的目录中生成Test.class字节码文件,再根据javaTest命令运行该字节码文件。​在运行Java文件时,会先运行Java文件中的main方法,所以我们将输出语句写在main方法中。源代码----->编译----->字节码文件----->JVM----->操作系统。JavaSEJava基础,Java标准版。...

2022-07-31 20:45:00 96

空空如也

空空如也

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

TA关注的人

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