- 博客(57)
- 收藏
- 关注
原创 双重检验锁方式实现单例模式
正常步骤是1->2->3,但是JVM具有指令重排序的特性,在单线程下是不会存在问题的,但是在多线程下,会导致一个线程拿到还没有进行初始化的实例,例如线程1执行了1->3,然后线程二获取这个实例,发现不为空,拿到但是结果是没有初始化的。根据输出以及当前创建的对象,我们可以看到他创建了不同的对象,所以,为了解决这个方法,我们在创建对象的时候使用。其实这种实现方式也不是完美的,因为Java中那可是存在反射的,他就可以破坏对象的单例!你写的代码------------------>JIT优化之后的代码。
2024-05-06 22:08:40
749
1
原创 Elasticsearch常用查询语法及RestClient操作
Es官方提供了各种不用语言的客户端,用来操作Es,这些客户端的本质就是组装DSL语句,通过http请求发送给Es,从而简化操作es基础篇不熟悉参考一下博客:ElasticSearch入门篇-CSDN博客Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;解释:查询索引库为hotel索引库,查询字段为all,值为北京,过滤brand为如家的文档,得分方式为默认,乘10.至此,es基础查询完结,了解更多,可查看官方文档!:必须不匹配,不参与算分,类似“非。
2024-04-21 17:03:05
2045
原创 RestClient操作Elasticsearch(Java)
Es官方提供了各种不用语言的客户端,用来操作Es,这些客户端的本质就是组装DSL语句,通过http请求发送给Es,从而简化操作es基础篇不熟悉参考一下博客:ElasticSearch入门篇-CSDN博客Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
2024-04-18 15:43:25
1115
1
原创 ElasticSearch入门篇
Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单个开源的分布式搜索引擎,可以用来实现搜索,日志统计,分析,系统监控等多种功能。
2024-04-14 20:30:09
962
原创 RabbbitMQ基本使用及其五种工作模型
什么是同步通讯呢?举个例子,你认识了一个小姐姐,聊的很火热,于是你们慢慢开始打电话,视频聊天,这种方式就成为同步通讯,那什么是一部通讯呢,同样的,你认识了多个小姐姐,你和他们进行文字聊天,这时候你一个人可以和多个人聊天,这就是异步通讯。我们之前进行服务间调用时使用的RestTemplaste,Feign就是
2024-04-12 22:04:24
667
1
原创 Docker
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,可以大大减少编写代码和在生产环境中运行代码之间的延迟。
2024-04-10 21:16:37
1123
2
原创 Http客户端Feign
RestTemplate存在的问题这是一段使用RestTemplate来发起远程调用的代码,存在以下问题1,代码可读性差,编程体验不统一(其实还好)2,复杂的url难以维护,修改起来十分麻烦3,总结起来就是不够优雅Http客户端Feign那莫如何书写一个优雅的远程调用的代码呢??Feign登场了,他是一个声明式的http客户端他的主旨是使得编写 java http 客户端更容易。为了贯彻这个理念,采用了通过处理注解来自动生成请求的方式(官方称呼为声明式、模板化)。通过声明式 ht
2024-04-09 22:43:56
421
原创 Nacos配置管理
复杂的业务对应大量的配置项,对集群部署的应用配置进行修改时需要修改每个节点上的应用配置,在这种背景下,中心化的配置服务即配置中心应运而生。但是项目如何知道nacos的地址等信息呢,不知道地址就无法读取nacos的配置信息,那就需要读取配置文件,但是我先要读nacos你却让我读万配置文件在都nacos这就尴尬了,于是我们需要一个优先级高于application.yml文件的配置文件,也就是bootstrap.yml。在单体应用中,配置管理可能不是什么大的事情,通常会以配置文件的方式。
2024-04-09 20:20:30
1203
原创 Nacos注册中心
Nacos:( Dynamic Naming and Configuration Service)是阿里巴巴旗下的,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 致力于发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理。帮助开发者更敏捷和容易地构建、交付和管理微服务平台。Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。什么是 Nacos。
2024-04-08 22:50:47
1182
原创 微服务初始及Eureka注册中心
Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的开发便利性简化了分布式系统的开发,比如服务发现、服务网关、服务路由、链路追踪等。Spring Cloud 并不重复造轮子,而是将市面上开发得比较好的模块集成进去,进行封装,从而减少了各模块的开发成本。换句话说:Spring Cloud 提供了构建分布式系统所需的“全家桶”
2024-04-08 12:07:30
769
原创 考研||考公||就业||其他?-------愿不再犹豫
大三下了,现在已经开学一个多月了,在上个学期的时候陆陆续续吧周围有的行动早的人已经开始准备考研了,当然这只是下小部分人吧,也有一部分人是寒假可能就开始了,更多的则是开学的时候,我的直观感受是图书馆多了许多考研的同学,我认识的,气氛一下子紧张起来了,三月份的时候周围人开始复习高数,准备考研,也有的准备考公,可能开始稍微晚一点,也有的准备找工作吧,无论干什么,大家都忙起来了,拿我寝室来说,玩原神的,打王者的,睡懒觉的都慢慢变了,晚上回到寝室,人少了,一问?感觉一下子,大家都变了。一句话,就现在开始!
2024-04-07 17:27:09
584
原创 头歌-信息安全技术-2023
任务描述本关任务:编写一个能实现移位密码的小程序,对输入的明文字符串进行移位加密后打印输出。相关知识移位加密是密码学中一种非常经典、也是很重要的加密方法,学好移位加密对后面其他加密方法的学习有着至关重要的作用。为了完成本关任务,你需要掌握:1.数论中的模运算;2.定义模 m 上的运算;3.移位密码体制。模运算知识补充假设a和b均为整数,m是一正整数。若m整除b−a,则可将其表示为:a≡b(mod m)该式读作“a与b模m同余”,正整数m称为模数。下面给出计算一组数据中符合指定
2024-03-24 15:31:09
1040
1
原创 部署SpringBoot项目
4,上述命令项目启动之后一旦关闭ssh项目就会自动终止,于是我们可以使用下列启动命令确保项目已知在后台运行。tips :注意这里可能点击面板地址之后无响应,原因是因为没有放心买哪般对应的端口,在云服务器上放行对应的端口即可。1,数据库单独安装在另一台服务器上,只需要修改IP地址即可。这里我使用腾讯云,推荐Centos8/Centos7.6。安装完之后会得到面板地址以及用户名密码等信息,登录宝塔面板即可。3,将SpringBoot项目打包运行。上床jar包制定好目录,以及启动时设置的参数。
2024-03-07 21:49:52
462
原创 SpringBoot-基础篇03
之前搭建了整个开发环境实现了登录注册,springBoot整合mybatis完成增删改查,今天完成分页查询,使用阿里云oss存储照片等资源,后期会尝试自己搭建分布式文件系统来实现。
2024-02-05 23:23:10
1829
原创 SpringBoot-基础篇02
上次使用springBoot搭建整个项目框架,实现登录逻辑,今天使用springBoot整合mybatis实现增删改查,关于项目搭建,可以查看上一篇博客:SpringBoot-基础篇-CSDN博客废话不多说,直接开始。
2024-01-21 23:22:51
1033
原创 SpringBoot-基础篇
用于捕获全局异常,返回给用户,实现方法,在类上添加@RestControlAdvice注解在方法上添加@ExceptionHandler(Exception.class),指定拦截所有异常/*** 定义全局异常处理器*/@ExceptionHandler(Exception.class)//表示拦截所有异常//判断当前异常信息是否存在,如果存在,打印,不存在返回操作失败e.getMessage():"操作失败!");
2024-01-17 22:33:16
1076
2
原创 代码随想录-Day59~60完结撒花
个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1。一刷结束,一周之后开启二刷,持续进步,加油冲冲冲!求在该柱状图中,能够勾勒出来的矩形的最大面积。整体思路:还是单调栈的思路,不多赘述了。最大的矩形为图中红色区域,面积为 10。
2023-12-11 21:09:29
56
原创 代码随想录-Day54~58-动态规划|编辑距离-
情况二:两个字符不相等,不相等我们需要执行插入,删除,或者替换,删除一个字符有可能操作的是word1也有可能是word2,所以此时的 dp[i][j]有可能是dp[i][j-1]也有可能是dp[i-1][j],并且删除字符之后操作数需要加1,其实插入也是变相的删除,所以合并为一个。之后需要讨论替换的状态,明确替换之后操作数加一,并且替换之后两个字符相等,也就是达到状态dp[i-1][j-1]如此 递推公式就确定了,之后初始化的时候根据含义第一行第一列依旧和字符数量相等。天,下一个更高温度出现在几天后。
2023-12-10 21:55:27
43
原创 Mybatis-plus-核心篇
因为存在一种场景,简单的单表查询语句无法满足需求,例如给id为1,2,3的用户的年龄加2,这时候书写sql语句应该是如果我们直接拼接SQL会导致业务层代码和mapper层代码缠上耦合,如果全部书写sql会非常繁琐,我们希望得到的一种解决方案就是,使用mp提供的便捷的条件封装,加上我们自定义在mapper的sql合并拼装成一条sql语句,进而简化开发并且遵守开发规范,这时候就需要使用自定义sql。@Mapper。
2023-12-09 21:18:57
64
原创 Mybatis-Plus-入门篇
mybatisplus的简单使用,快速入门,在主键,需要使用@TableId指定java类中字段为主键,并且需要制定type,也就是主键类型,自增,随机,或者自行输入,也就是IdType这个枚举类的三种类型,一般是自增也就是 @TableId(type=IdType.AUTO)也就是说这个注解相当于在所有的Mapper层假如了注解,所以不需要额外加入,当然加入了也不会冲突 ,不加mapper注解在使用@Autowired注解自动注入的时候虽然会报错,但是执行是没有问题的,ok,故障鉴定完毕!
2023-12-09 09:59:05
72
原创 代码随想录-Day51~53-补动态规划-字序列问题-718. 最长重复子数组||1143. 最长公共子序列||1035. 不相交的线||53. 最大子数组和
解题思路:使用二位dp数组分别表示两个数组,dp[i][j]代表以第i-1和j-1结尾的字符数组的最长公共子序列的长度为dp[i][j],明白了这个,推导dp[i][j]则需要数组A【i-1】等于数组B【j-1】的时候对dp数组进行加1操作,这样推倒的dp数组内部就存放的是最长重复子数组的长度吗,注意是连续的。解题思路1:贪心算法,贪心的思路就是从头开始累加,一旦累加一个数字之后当前子数组的和小于0,清空当前子数组和,重新累加,最后总比较出累加得到的最大值就是子数组的最大长度。、长度最长的子数组的长度。
2023-12-05 20:58:31
46
原创 代码随想录-Day50-补动态规划-买卖股票-309. 买卖股票的最佳时机含冷冻期||714. 买卖股票的最佳时机含手续费||子序列问题-300. 最长递增子序列||674. 最长连续递增序列
解题思路:相对来说还是比较简单的,使用两种状态就可以解决,一种是买入,一种是卖出,只不过在卖出的时候加上一个手续费用即可,状态转移方程还是根据买与不买的两种状态进行推导,求解出最大值。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。解题思路:可以理解大致的递推公式思路,但是代码实现之后并不是很能理解,之后再看。,并返回该序列的长度。
2023-12-04 21:56:12
50
原创 代码随想录-Day48~49-动态规划-打家劫舍 | ,||,|||,买卖股票 |,||
解题思路:对于每一间房屋有两种状态头还是不偷 ,第i间房屋头取得最大金额可以有i-1个房屋和i-2个房屋推导出来。第i个房屋有梁总状态,偷和不偷,如果偷,s说明他的前一个没有偷偷,它的最大金额等于dp[i-2]+这建房子头取得,如果不偷,说明前哪一个投过了,最大金额就是dp[i-1]你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,设计一个算法来计算你所能获取的最大利润。给定一个代表每个房屋存放金额的非负整数数组,计算你。
2023-11-28 22:24:43
23
原创 代码随想录-Day45~46-动态规划-完全背包LetCode322. 零钱兑换 ||279. 完全平方数||139. 单词拆分
解题思路:一个完全背包类题目,硬币就是物品,可以被使用很多次,背包大小就是amount,这道题求解的是硬币组合为总金额,显然是一道这类题目,所以需要先遍历物品,在遍历背包,需要注意的是求转满背包的最小硬币个数,所以递推公式需要变化。解题思路:其实和上一道题目一直,也是一个完全背包类的题目,求得也是装满背包的最少数量,只不过物品换成了完全平方数而已。4,确定遍历顺序,说过了组合问题,完全背包,先遍历背包,后遍历物品,并且物品从前往后。不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
2023-11-26 18:22:19
454
原创 代码随想录-Day42-动态规划-LetCode518. 零钱兑换 II||LCR 104. 组合总和 Ⅳ
这道题是一个完全背包问题,所谓完全背包就是物品可以取无限次,而01背包每个物品只能取一次,完全背包在便利的时候背包和物品的顺序便利的时候是有讲究的,在01背包的时候一维dp数组便利的顺序是先遍历背包后遍历物品,然后背包便利的顺序是从后往前遍历,防止物品被重复使用,对于完全背包来说沃品可以随便使用,于是我们需要调整物品的重量,从前往后遍历背包,这样就可以保证物品可以被重复使用。数组中的数字可以在一次排列中出现任意次,但是顺序不同的序列被视作不同的组合。请你计算并返回可以凑成总金额的硬币组合数。
2023-11-23 22:41:42
42
原创 代码随想录-Day41-动态规划-LetCode1049. 最后一块石头的重量 II||494. 目标和||416. 分割等和子集
这个题目转换为01背包其实也求得是背包装满之后多能达到的最大价值,也就是字符串的最大个数,只不过是背包从以为变成了二维,也就是1和0两个容量。这道题的核心思路就是求解装满这个01背包存在多少种方法,其实不是很理解递推公式,后续再看。解题思路:题目要求是将石头分成两拨进行粉碎,最终粉碎的结果是第一波减去第二波的差值。使用01背包转换过来背包的容量就是,石头总重量的一半。求解的就是装满这个背包的最大重量。,然后串联起所有整数,可以构造一个。的最大子集的长度,该子集中。有一堆石头,用整数数组。
2023-11-22 21:14:09
22
原创 代码随想录-Day39~40-动态规划-LetCode343. 整数拆分||96. 不同的二叉搜索树||416. 分割等和子集
By 三条直线围墙!2,确定递推公式, dp[i] 可以从 1 到 j 进行遍历遍历过程中 dp[i] 的最大值就可以是。则有dp[3]= dp[0]*dp[2]+dp[1]*dp[1]+dp[2]*dp[0]由此得出递推公式dp[i]=max(j*(i-j),j*dp[i-j],dp[i])dp[2]=1即可,dp[0]和dp[1]做拆分没有意义,我们的循环直接从3开始。1,dp数组含义dp[i]代表数字 i 拆分之后的最大乘积为 dp[i]j*(i-j) 可以理解为拆分为两个数字想乘。
2023-11-21 22:00:57
58
原创 代码随想录-Day38-贪心算法-LetCode62. 不同路径||63. 不同路径 II
start->finish的不同路径,类似于爬楼梯,例如dp[i][j]代表的是到达这个格子可以使用的路径数量,dp[i][j]=dp[i][j-1]+dp[i-1][j],同事需要注意机器人智只能向右或者向下,所以第一行和第一列只能有一种路径,可以单独处理,完整代码如下。跟上一个类似,只不过需要考虑障碍区,以及特殊情况,开始的位置以及到达的位置不能是存在障碍,如果遇到障碍则使得dp[i][j]=0。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。网格中的障碍物和空位置分别用。
2023-11-18 20:02:27
639
原创 代码随想录-Day37-贪心算法-LetCode509. 斐波那契数||70. 爬楼梯||746. 使用最小花费爬楼梯
1,dp数组含义:dp[i]代表从i-1或者i-2上到 i 所需要花费的体力,例如dp[1]=0,dp[1]=0代表站在第0阶不需要耗费体力,因为题目固定可以从0或者1开始,例如dp[3]=3代表从1级或者2阶台阶上到3级台阶需要耗费的最小体力。2,递推公式dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])2,状态转移方程也就是递推公式,dp[i]=dp[i-2]+dp[i-1] 注意 i 大于等于2。5,最后一步一般用来打印dp数组debug,这里不做赘述。
2023-11-17 18:04:47
67
原创 代码随想录-Day36-贪心算法-LetCode738. 单调递增的数字||452. 用最少数量的箭引爆气球||435. 无重叠区间||56. 合并区间
贪心算法结束,总的来说感觉并没有递归和回溯那么困难,但是也有不晓得难度,主要是那个弯能不能转过来,能不能想到那个贪心的思路,还有一点代码技巧,总结起来就是,要么简单到死,要么难道爆炸,所以贪心类的题目还是要多刷,掌握思路。贪心思路:贪心思路,尽量让叶子结点的父节点装上摄像头,可以保证摄像头覆盖尽可能多的结点,所以我们对于二叉树可以采取后序遍历的方式,让根节点知道叶子结点的状态,进而做出判断,那么子结点有哪几种状态囊?//如果左右孩子有一个有摄像头,则根节点一定谁有覆盖状态。1:有摄像头,必然覆盖。
2023-11-16 22:26:18
55
原创 代码随想录-Day34~35-贪心算法-LetCode1860. 柠檬水找零||452. 用最少数量的箭引爆气球||435. 无重叠区间||56. 合并区间
例如上述字符串,假如从第一个遍历,第一个是a,那么你需要保证a只能出现在一个片段中,直白得奖就是除了划分含有a的区间之外其他区间不能右a,也就是区间长度要达到a出现的最远位置,也及时这个题目中的8,同理继续便利到b,不也是一样的道理,只不过他比a小,于是我们取a,循环往复即可。贪心思路:感觉也不算是贪心,就是常识,由于顾客只会支付 5元,10元,20元三种,于是我们可以分别用 five,ten来统计五元和十元的数量,然后根据用户的给钱成功找零即可。一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区。
2023-11-15 21:06:59
43
原创 代码随想录-Day33-贪心算法-LetCode1005. K 次取反后最大化的数组和||134. 加油站||135. 分发糖果
贪心策略,获得的油和消耗的油只差为整数,并且尽可能多的从获取这种差为正数的加油站开始,实现方式,定义两个和,一个记录总和,用于最终判断,另一个记录便利过程中的局部和,如果局部和小于0说明从开始节点到当前节点,无论从哪一个出发,最终都会没油,所以不需要进行类加了,直接跟新开始节点即可。将数组排序,先将所有的负数翻转,如果此时还存在k这时候根据贪心策略,再次将数组排序,将最小的进行翻转即可。采用两次的贪心步骤,先给每一个孩子一颗糖,在分两次判断积分高低,保证局部最优,进而得到全局最优。表示每个孩子的评分。
2023-11-13 23:03:31
18
原创 代码随想录-Day32-贪心算法-LetCode122. 买卖股票的最佳时机 II||55. 跳跃游戏||45. 跳跃游戏 II
对于这道题一定是可达的,求解最小的跳跃步骤,于是我们需要对每一步的落点进行分析,贪心的策略是,尽可能每一次跳跃所选择的都是最大的覆盖值,进而跳跃完成之后所得到的就是最小的跳跃步骤,因为每一步跳的最远,所以最后一定跳的最远。对于这个题目,求解的是可不可以跳到,于是我们不去考虑具体的每一跳落点在哪里,只考虑每一条的最大跳跃长度,也就是覆盖范围是多少,在循环之中不断更新最大的覆盖范围,当覆盖范围可以覆盖整数组的时候说明可以达到。例如第三天利润为:p[2]-p[1]+p[1]-p[0],也就是p[2]-p[0]。
2023-11-12 17:58:28
52
原创 代码随想录-Day31-贪心算法-LetCode53. 最大子数组和||455. 分发饼干||376. 摆动序列
要将n个不同的饼干分发给s个孩子,并且饼干的大小不一样,孩子的胃口也不一样,根据贪心的策略,我们首先将孩子的胃口和饼干的大小进行排序,将小的饼干分发给胃口西小孩子,由此不断重复,就会尽可能保证多的孩子分配到适合胃口的饼干。本题所说的摆动序列的最长子序列的长度就是在整个数组之中出现峰值算作一个长度,如果出现连续的坡度,只记录为一个,如下图,打❌的地方就不需要记录。那么可能有人会疑惑,找到的局部最优解就一定就是全局的最优解吗,可以说,不一定,我的理解是在90%的情况之下,你的常识应该是对的。
2023-11-10 17:33:02
53
原创 代码随想录-Day29-LetCode补上之前做a
回溯法本质就是穷尽,效率可想而知,但是既然效率如此之低,为什么还要使用它呢?因为存在问题能通过暴力求解出来就很不错了,不存在更高效的解法,只能暴力穷举。一般来说传递的参数都是原始数组以及判断开始的索引。回溯是递归的副产品,只要有递归机会有回溯。组合问题:N个数字里面找寻k个数字的组合。· 切割问题:切割一个字符串的所有可能。排列问题:N个数按照一定规则全排列.子集问题:一个集合的子集。棋盘问题:N皇后等等。明天开始书写每个题目的博客,跑了四公里有点累,睡觉。
2023-11-08 22:31:36
26
原创 代码随想录-Day20-LetCode|530. 二叉搜索树的最小绝对差|617. 合并二叉树|700. 二叉搜索树中的搜索|98. 验证二叉搜索树
2,使用中序遍历的方式首先遍历左子树,之后判断如果pre指针不为空,说明cur已经指向前一个结点,如果此时,pre为空。则count=1,这时候就只有一个数,如果pre和cur值相等,将counet数量加一,相当于众数多了一位,否则,count数重新置为一,判断结束之后,如果当前count等于maxvalue将结果加入结果集之中,后续如果出现更大的maxvalue清空结果集重新加入,2,从底层开始遍历,设置一个pre指针初始化为空,cur为当前节点。1,无返回值,结果存储在res集合之中,传入根节点。
2023-10-31 22:51:15
34
1
原创 代码随想录-Day20-LetCode|654. 最大二叉树|617. 合并二叉树|700. 二叉搜索树中的搜索|98. 验证二叉搜索树
如果当前有一个节点证明是根节点,此时需要返回一个节点等待被上一个节点的左子树或者右子树承接。3,两个树都不为空,合并节点值,将其给左树,因为我们不需要重新构建一个树,所以只需要改变左树即可,之后合并左子树和右子树,最后返回左树。3,定义一个节点用来接受递归函数的额返回值,如果目标值大于根节点,递归搜索右子树,反之搜索左子树,最终返回结果节点即可。思路:根据二叉搜索树的特性使用前序遍历二叉树,获得遍历之后的结果数组,如果后续值小于 等于前面的值,说明不是二叉搜索树,直接结束即可。2,如果左树为空,返回左树。
2023-10-30 23:20:10
52
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人