- 博客(167)
- 收藏
- 关注

原创 蚂蚁课堂视频笔记+笔记对应源码+思维导图下载地址
一、小猴子java学习视频教程笔记很久之前入门java时淘宝买的一套视频教程,感觉还可以,适合新手入门。下载地址: https://wws.lanzous.com/b01tyd9qd 密码:h85k二、蚂蚁课堂3期/4期/4期项目笔记部分内容过时,适合新手了解微服务基础笔记下载地址:https://wws.lanzous.com/b01tydajc密码:ezh3源码下载地址(用eclipse打开):链接:https://pan.baidu.com/s/1puJ499nOENVrI_qHSap
2021-03-17 21:43:04
2702
原创 精讲23种设计模式-008:基于策略模式重构if判断
008:基于策略模式重构if判断1 策略模式课程介绍2 策略模式基本介绍与应用场景3 策略模式类图结构分析4 基于工厂模式实现策略5 使用Spring容器实现策略6 基于Spring和数据库表实现策略7 策略模式实现动态开关1 策略模式课程介绍课程内容什么是策略模式策略模式的应用场景策略模式的实现方案有哪些?基于工厂模式实现策略模式基于数据库方式实现策略模式站在架构师角度,设计多行为策略模式框架2 策略模式基本介绍与应用场景策略模式基本概念解决多重if判断问题 有多个不同的策略,选
2022-10-18 19:47:37
902
原创 精讲23种设计模式-007:基于责任链模式构建网关权限链系统
007:基于责任链模式构建网关权限链系统1 基于责任链模式课程内容介绍2 责任链基本介绍3 责任链类图结构分析4 基于工厂模式实现责任链5 基于Set方式实现责任链模式6 基于数据库的方式实现责任链1 基于责任链模式课程内容介绍课程内容责任链设计模式基本概念责任链模式的应用场景基于工厂模式整合责任链基于数据库配置整合责任链2 责任链基本介绍责任链基本概念多个对象形成一个链,每个对象相互指向上一个和下一个对象。责任链应用场景过滤器审批 eg:请假流程(项目组长->项目经理-
2021-10-14 22:36:31
410
原创 精讲23种设计模式-006:深入研究单例底层实现原理
006:深入研究单例底层实现原理1 深入研究单例底层实现原理课程安排2 单例模式基本概念与优缺点3 手写单例模式4 使用反射机制破解单例&如何防御5 使用序列化破坏单例&如何防御6 序列化如何生成一个新的对象7 枚举是最安全的单例1 深入研究单例底层实现原理课程安排课程内容单例模式基本与设计思想概念单例模式的应用场景单例模式多种写法懒汉式为什么需要双重检验锁Java创建对象有哪些方式如何防止单例被反射、序列化破解反序列化创建对象底层实现原理2 单例模式基本概念与优缺点
2021-10-11 08:14:53
273
原创 精讲23种设计模式-005:基于观察者模式设计异步多渠道群发框架
005:基于观察者模式设计异步多渠道群发框架1 观察者模式课程内容的引入2 观察者模式介绍3 观察者模式类图结构的分析4 定义观察者模式的接口5 项目启动注册读观察者(自动注册)6 测试手写观察者模式7 使用Spring事件监听实现观察者1 观察者模式课程内容的引入课程内容观察者模式基本的observer概念观察者模式在实际开发中的应用场景如何基于观察者模式设计多渠道群发框架ApplicationListener事件监听原理2 观察者模式介绍观察者基本概念当一个对象发生改变的时候可以通
2021-10-05 19:15:33
283
原创 精讲23种设计模式-004:基于装饰模式设计多级缓存框架
004:基于装饰模式设计多级缓存框架1 基于装饰模式手写多级缓存框架演示2 一级与二级缓存基本的概念3 手写模拟一级与二级缓存基本概念4 装饰模式基本架构设计原理5 定义早期装饰模式一级缓存6 基于装饰模式重构设计多级缓存7 基于Aop拦截自定义缓存注解8 使用Aop回调形式传递目标方法&使用泛型接收目标方法类型1 基于装饰模式手写多级缓存框架演示课程内容如何理解多级缓存框架设计装饰模式与代理模式之间的区别装饰模式如何在Mybatis、IO流运用基于装饰设计多级缓存框架自定义缓存注解
2021-10-03 20:10:54
345
原创 精讲23种设计模式-003:站在SpringMVC源码角度分析@async失效之谜
003:站在SpringMVC源码角度分析@async失效之谜1 异步注解失效之谜源码分析课程安排2 简单回顾自定义注解实现方式3 构建Jdk动态代理实现拦截目标方法4 Jdk动态代理纯手写@async实现异步操作5 基于SpringAop手写@async实现异步操作6 @async异步注解失效之谜效果演示7 源码角度分析为什么加上@async注解会4048 @async注解失效之谜源码分析1 异步注解失效之谜源码分析课程安排课程内容基于Jdk动态代理纯手写@async实现异步操作基于Spring
2021-09-28 22:33:01
398
原创 精讲23种设计模式-002:CGLIB底层实现的原理
002:CGLIB底层实现的原理1 CGLIB动态代理课程内容安排2 CGLIB与JDK动态代理之间的区别3 使用CGLIB实现动态代理4 CGLIB代理生成的代理类源码分析5 Jdk与Cglib动态代理的区别6 模拟手写调用FastClass类7 FastClass机制底层源码解读1 CGLIB动态代理课程内容安排课程内容如何基于CGLIB实现动态代理CGLIB底层实现原理源码解读为什么CGLIB效率会比Jdk动态代理效率高CGLIB的FastClass机制实现的原理2 CGLIB与JD
2021-09-24 22:22:06
482
原创 精讲23种设计模式-001:纯手写Java动态代理模式
001:纯手写Java动态代理模式1 代理设计模式基本概念与应用场景2 实现静态代理两种方式3 静态代理与动态代理模式的区别4 基于JDK动态代理的使用5 为什么Jdk动态代理不能用子类接收6 JDK生成的代理类$Proxy源码分析7 手写JDK动态代理1 代理设计模式基本概念与应用场景课程内容代理模式为何是程序员必备技能静态代理与动态代理实现区别Jdk动态代理为何需要InvocationHandler接口CGLIB动态代理与Jdk动态代理区别10分钟完全纯手写一个Jdk动态代理代理设计
2021-09-23 07:00:27
728
1
原创 9. 几种Stream流优化实例
前几天入职新公司,这几天一直在看项目代码,发现有些地方写法略显古老,忍不住想用stream流优化一波,以下是3种优化事例(都是项目中的真实逻辑处理,以后遇到新的内容可能会补充)。方法一基本上都是原先的代码处理逻辑,方便理解。事例1:优化List<Map<Object, Object>>写法 老List中每个值都经过不同方法处理封装进一个map,每个元素封装成的map再组成一个List集合public class ListMapTest { public static vo
2021-09-18 18:41:58
389
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-024:基于shardingjdbc实现分表分库(完结撒花)
024:基于shardingjdbc实现分表分库1 数据库分表分库规则2 mycat实现分表分库原理3 shadingjdbc实现的原理4 项目如何整合shadingjdbc5 微服务如何实现服务追踪6 微服务服务追踪实现原理分析1 数据库分表分库规则今日课程任务订单表与会员表如何实现分表分库分表分库实现算法有哪些sharding-jdbc与MyCat实现分表分库的区别sharding-jdbc实现分表分库的源码分析分表分库后,如何实现联合查询微服务电商项目如何整合Zipkin实现服务追踪
2021-07-19 22:20:36
611
2
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-023:整合sentinel实现服务保护
023:整合sentinel实现服务保护1 基于sentinel实现服务保护效果演示2 为什么需要在网关服务中实现限流3 微服务网关中实现秒杀服务转发4 基于ratelimiter实现微服务限流5 ratelimit配置根据用户频率限流6 微服务网关中整合sentinel实现限流7 sentinel整合控制台实现界面管理8 微服务网关中如何使用sentinel注解版本1 基于sentinel实现服务保护效果演示今日课程任务微服务电商项目如何实现接口限流目前主流限流框架实现方案有哪些Api接口限流
2021-07-19 22:12:46
645
2
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-022:基于Redis实现秒杀抢购
022:基于Redis实现秒杀抢购1 微服务秒杀抢购实现方案2 秒杀抢购如何实现前端优化3 基于mysql行锁机制防止库存超卖4 基于乐观锁方式防止库存超卖5 基于Redis生成令牌桶方式实现秒杀6 提供生成令牌桶接口7 MQ异步消费如何获取消费结果8 MQ消费者如何保证幂等性问题1 微服务秒杀抢购实现方案今日课程任务大型电商秒杀抢购有哪些技术实现方案秒杀抢购如何防止库存超卖的问题秒杀抢购如何保证接口的安全性基于Redis令牌桶方式实现秒杀抢购基于lua脚本与java方式实现秒杀抢购区别基
2021-07-19 22:03:03
704
2
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-聚合支付平台-021:支付定时对账与订单30分钟有效期
021:支付定时对账与订单30分钟有效期1 聚合支付中如何实现对账2 用户支付了,异步回调产生接口延迟如何解决3 人工补偿实现订单状态最终一致性4 基于Redis订单超时30分钟超时设计5 Redis过期了,如何获取value值6 代码整合Redis过期key事件监听7 代码实现人工补偿订单状态1 聚合支付中如何实现对账今日课程任务支付宝没有及时的将支付结果通知给商户端,如何解决数据一致性问题如何实现解决商户端与支付宝两者间的分布式事务问题秒杀成功了,就是不支付,如何实现库存回滚基于Redis
2021-07-16 23:53:16
1069
2
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-聚合支付平台-020:基于seata解决分布式事务
020:基于seata解决分布事务1 支付服务与积分存在的分布式事务问题2 将积分代码拷贝到项目中3 单独开启一个线程调用积分接口4 支付宝如何防止用户重复支付问题5 简单回顾seata与lcn解决分布式事务原理6 构建seata服务端项目7 微服务项目整合Seata框架8 异步回调整合Seata实现分布式事务1 支付服务与积分存在的分布式事务问题今日课程任务支付项目如何用户防止用户重复支付使用feign客户端调用积分服务接口增加积分基于seata解决分布式事务难题seata解决分布式事务底层
2021-07-16 08:20:10
843
3
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-聚合支付平台-019:基于模板方法模式重构异步回调
019:基于模板方法模式重构异步回调1 基于策略+模板方法实现异步回调重构2 异步回调通知实现的原理3 支付宝官方demo异步回调代码的实现4 聚合支付项目如何采用模板+策略重构5 基于模板模式重构聚合支付平台6 异步回调重构验证签名代码7 基于策略模式id找到模板类8 异步回调更改订单状态的信息9 支付异步回调代码继续重构1 基于策略+模板方法实现异步回调重构今日课程任务第三方支付异步回调实现的原理基于模板+策略模式实现异步回调基于ThreadLocal传递参数信息内容采用多线程/MQ异步写
2021-07-16 08:11:07
7342
2
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-聚合支付平台-018:基于策略模式重构设计聚合支付平台
018:基于策略模式重构设计聚合支付平台1 简单回顾聚合支付整体架构流程2 分析预支付提交token参数原理分析3 支付接口提供生成预支付令牌接口4 基于策略模式分析聚合支付模块设计5 代码实现定义策略类实现聚合支付6 聚合支付整体代码联调测试1 简单回顾聚合支付整体架构流程今日课程任务如何保证参数安全传递到聚合支付平台基于预提交支付参数形式保证接口安全性如何设计提高聚合平台接口的扩展性基于策略模式重构设计聚合支付平台2 分析预支付提交token参数原理分析参考腾讯课堂报名点击“去付款
2021-07-15 00:03:10
830
3
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-聚合支付平台-017:对接第三方支付宝支付接口
017:对接第三方支付宝支付接口1 聚合支付平台架构课程内容安排2 聚合支付平台核心的设计思想3 支付宝官方Demo运行测试4 支付宝接口采用验证签名保证接口参数安全性5 支付宝接口同步回调(浏览器重定向)实现原理6 支付宝异步回调的实现原理7 深入理解支付宝公钥与私钥加密模式8 聚合支付数据库表结构设计1 聚合支付平台架构课程内容安排今日课程任务聚合支付平台架构设计思想对接第三方支付接口设计的思想支付同步回调与异步回调的区别支付宝沙箱支付环境用法的介绍如何理解对接支付宝RSA配置介绍如何
2021-07-13 22:33:23
1156
1
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-016:构建微服务电商项目智能报警系统替代elk分布式日志收集
016:构建微服务电商项目智能报警系统替代elk分布式日志收集1 微服务智能报警系统实现效果演示2 微服务智能报警系统设计原理3 分布式日志采集系统模块分析4 基于全局捕获异常将日志投递到MQ服务器端中5 定义MQ消费者将错误日志统一写入数据库db中6 定义微信消息推送错误日志模板接口7 分布式日志采集报警系统流程测试1 微服务智能报警系统实现效果演示今日课程任务构建企业级微服务智能报警系统产生背景微服务智能报警系统与elk的区别有那些智能报警系统整体架构实现原理构建Aop拦截系统错误日志写入
2021-07-13 22:26:43
563
2
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-商品服务-015:亿万级别商品详情页面实现动态优化
015:亿万级别商品详情页面实现动态优化1 亿万级别商品详情页面如何设计2 使用Nginx缓存商品详情页面3 使用FreeMarker生成静态化模板页面4 openresty+lua实现亿级别商品详情页面原理5 openresty的基本介绍6 openrety整合简单lua代码指令7 openresty整合lua模板引擎框架8 使用openresty发送Http请求获取数据1 亿万级别商品详情页面如何设计今日课程任务回顾商品详情页面静态化的好处基于FreeMarker实现生成商品详情静态页面将商
2021-07-13 00:57:21
782
1
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-商品服务-014:商品搜索服务基于Canal解决MySQL与ES数据一致性的问题
014:商品搜索服务基于Canal解决MySQL与ES数据一致性的问题1 canal解决ES与mysql数据的一致性问题2 简单回顾倒排索引底层的实现原理3 kibana与Elasticsearch的区别4 Elasticsearch的IK分词器介绍5 使用kibana创建商品索引6 canal解决mysql与es数据一致性问题原理7 canal客户端同步数据到ES中8 测试canal客户端同步数据到ES1 canal解决ES与mysql数据的一致性问题今日课程任务:简单回顾MySQL与Redis数
2021-07-13 00:39:33
764
1
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-构建会员服务-013:整合canal解决mysql与Redis数据一致性的问题
013:整合canal解决mysql与Redis数据一致性的问题1 MySQL如何与Redis解决数据同步问题2 canal解决数据同步的底层实现原理3 启动canalServer端4 快速构建zookeeper的运行的环境5 快速构建kafka的运行的环境6 canal整合kafka的配置说明7 微服务电商项目整合canal环境1 MySQL如何与Redis解决数据同步问题今日课程任务微服务电商项目如何解决Redis与Mysql数据一致性问题AlibabaCanal解决Redis、Mysql数据
2021-07-11 22:22:59
427
1
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-构建会员服务-012:Vue如何解决SSO单点登录问题
012:Vue如何解决SSO单点登录问题1 Vue如何实现SSO单点登录效果演示2 Vue项目如何实现快速部署3 什么是SSO单点登录系统4 Vue与Web开发实现SSO的区别5 XXL-SSO框架的基本介绍6 SSO基本的实现原理介绍7 sso如何实现不需要重复登录原理分析8 SSO退出的源码解读9 SSO源码解读课程总结1 Vue如何实现SSO单点登录效果演示今日课程任务如何基于Nginx部署Vue项目Vue项目如何解决跨域的问题Vue项目如何解决SSO的问题唯一登录与单点登录的区别SS
2021-07-11 22:15:29
924
1
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-构建会员服务-011:基于Vue快速整合会员服务接口
011:基于Vue快速整合会员服务接口1 构建前端Vue项目调用后端接口实现联合登录效果演示2 什么是微服务前后端分离开发的模式3 联合登录接口接口简单回顾4 前后端分离解决跨域的问题5 Vue项目中构建登录页面加载网络6 回调接口需要Web层实现中转的原理7 前端获取Url中的token参数实现传递8 Vue整合后端微服务接口实现联合登录演示9 微信联合登录生成二维码说明1 构建前端Vue项目调用后端接口实现联合登录效果演示今日课程任务如何快速理解前后端分离架构模式前后端分离架构模式还存在哪些缺
2021-06-08 16:54:28
720
3
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-构建会员服务-010:基于策略模式快速整合微信联合登录
010:基于策略模式快速整合微信联合登录1 整合微信联合登录效果演示2 微信联合登录获取用户信息原理3 生成微信oatuh2.0授权链接地址4 根据openid获取用户的基本信息5 基于策略模式快速整合微信联合登录6 vue整合微信联合登录的设计原理7 基于openidToken实现快速登录原理1 整合微信联合登录效果演示今日课程任务微信公众号开发授权联合登录的原理基于策略模式如何快速整合微信联合登录基于用户授权的令牌关联openId信息前后端分离架构模式可能会存在的问题2 微信联合登录获
2021-06-08 09:56:26
411
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-构建会员服务-009:基于策略设计构建联合登录平台
009:基于策略设计构建联合登录平台1 基于策略模式实现联合登录代码重构设计2 联合登录关联页面设计原理设计3 oath2.0协议基本原理设计思想4 获取用户的基本信息流程5 vue如何安全的获取用户的openid6 会员服务提供oath2.0授权链接7 基于策略模式实现联合登录的重构8 策略模式回调获取openId1 基于策略模式实现联合登录代码重构设计今日课程任务QQ、微信联合登录oauth2.0协议原理基于策略模式设计第三方联合登录模块Vue与服务器端如何保证openId传递的安全性整合
2021-05-28 20:34:30
647
2
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-构建会员服务-008:整合XXL-Job实现分片定时任务集群模式
008:整合XXL-Job实现分片定时任务集群模式1 高效实现分片定时任务集群原理2 动态分片集群执行任务实现原理3 定时任务集群如何保证幂等性问题4 分布式任务调度平台分片集群模式5 本地构建执行器项目注册到注册中心上6 分片集群分页算法原理分析7 动态实现执行器快速扩容与缩容8 分布式任务调度平台xxl-job一些疑问1 高效实现分片定时任务集群原理今日课程任务实现千万级定时消息推送平台定义活动推送消息模板XXL-Job实现分布式任务调度原理整合XXL-Job实现分布式定时任务XXL-J
2021-05-25 22:00:27
3484
4
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-构建会员服务-007:扫码关注&定义消息模版推送
007:扫码关注&定义消息模版推送1 扫码实现关注效果的演示2 扫码实现关注登录原理的分析3 微信生成临时二维码原理分析4 提供微信生成二维码链接地址5 微信客户端测试扫二维码回调接口测试6 回调接口中新增关联openid代码7 调用微信消息模版接口发送登录提醒8 登录接口调用微信接口发送登录提醒1 扫码实现关注效果的演示今日课程任务微服务接口扫码登录实现原理如何生成二维码链接与前端定时ajax刷新微信模板接口如何实现发送消息登录接口成功,实现发送微信消息模板推送2 扫码实现关注登
2021-05-22 18:19:29
679
5
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-构建会员服务-006:网关获取真实ip&唯一登陆&异步处理线程存在的问题
006:网关获取真实ip&唯一登陆&异步处理线程存在的问题1 上课内容基本的介绍2 微服务如何获取客户端真实ip地址3 基于nginx转发网关转发会员服务访问4 微服务网关、会员获取nginx设置的真实ip5 唯一登录的渠道配置设计6 实现唯一登录渠道的验证7 唯一登录业务逻辑的实现8 多线程异步处理操作队列满了如何处理1 上课内容基本的介绍今日课程任务微服务中如何获取真实的客户端ip会员登录如何实现唯一登录扫码关注登录的实现构建微信服务消息模板推送接口2 微服务如何获取客
2021-05-21 22:56:31
726
1
原创 基于Vue+SpringCloudAlibaba微服务电商项目实战-构建会员服务-005:令牌登陆&扫码关注&细分接口安全领域
1 会员、令牌登陆服务接口的演示今日课程任务如何细分rpc接口需要细分参数安全领域为什么要dto、do之间实现互转构建会员服务用户注册的接口构建会员服务令牌登录接口基于多线程的形式异步写入登录日志@Async注解的失效之谜分析基于令牌查询用户的信息实现用户脱敏2 为什么我们接口需要定义dto与do转换构建会员服务接口数据库表设计CREATE TABLE `meite_user` ( `USER_ID` int(12) NOT NULL AUTO_INCREMENT COMME
2021-05-21 22:37:03
1217
14
原创 7. 消息处理服务架构简化模型
背景:项目上正在使用的消息处理服务框架,对于多种消息来源和多种消息类型分类处理,整理一个简化版本。核心是注解类MessageHandlerType,标明消息的来源和操作类型。@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE})@Documented@Servicepublic @interface MessageHandlerType { String operateType(); String sour
2021-05-20 16:25:53
347
1
原创 5. 订单补推事故记录
背景:某次下游发版出现事故导致部分数据状态转换异常,消息通过kafka进行交互,部分异常数据需要补推数据,数据库中可根据异常状态查到外部订单号。紧急写了个任务发版,记录此次处理过程。首先生产发布一个接口,接收订单数据(一开始用List作为接收参数,因长度有限制改为JsonObject),查数据库字段拼装消息推送下游。@RestController@RequestMapping("/repush")@Slf4jpublic class RePushController { @Autowir
2021-05-20 16:20:43
295
2
原创 4. JSON转换相关
常用json转换User@Data@AllArgsConstructor@NoArgsConstructorpublic class User { private Integer id; private String name; private Integer age;}JsonConversionTest@Slf4jpublic class JsonConversionTest { public static void main(String[] a.
2021-05-20 16:17:45
103
原创 3. 分割逗号避免数组越界
业务场景:上游3个参数(可能为空),服务只用一个参数接入,调用下游接口又要3个参数独立使用。最开始的一版代码遇到数组越界问题Demo03@Slf4jpublic class Demo03 { public static String[] commaSplit(String commaStringCode) { String[] strings = new String[3]; // 原bug写法:new String[]{},报数组越界,后写死数组长度为3 i
2021-05-20 16:15:00
281
原创 2. 初始化array、list、map写法
Demo02@Data@Builder@AllArgsConstructor@NoArgsConstructorpublic class UserEntity { private Integer userAge; private String userName; private Integer userMobile; private String userId; private String userPassword; public UserEn
2021-05-20 16:11:09
186
原创 1. 集合数据分组处理
Demo01Data@Builder@AllArgsConstructor@NoArgsConstructorpublic class UserEntity { private Integer userAge; private String userName; private Integer userMobile; private String userId; private String userPassword; public UserEnt
2021-05-20 16:08:55
218
原创 蚂蚁课堂视频笔记思维导图-4期 七、Docker
在线地址:https://www.edrawsoft.cn/viewer/public/s/6e230007288462已完结!
2021-05-07 19:37:57
247
原创 蚂蚁课堂视频笔记思维导图-4期 六、数据库技术
在线地址:https://www.edrawsoft.cn/viewer/public/s/6e230007288462持续更新中…
2021-05-07 19:36:26
328
原创 蚂蚁课堂视频笔记思维导图-4期 五、分布式日志收集
在线地址:https://www.edrawsoft.cn/viewer/public/s/6e230007288462持续更新中…
2021-05-06 11:27:19
284
原创 蚂蚁课堂视频笔记思维导图-4期 四、微服务安全
在线地址:https://www.edrawsoft.cn/viewer/public/s/6e230007288462持续更新中…
2021-05-06 11:25:11
154
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人