自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

吉他程序员的博客

我们有一支程序员的乐队,欢迎加入

  • 博客(185)
  • 资源 (11)
  • 收藏
  • 关注

原创 python 破解 抖店 滑块 + 获取加密数据

滑块是最 爬虫很头疼的问题。今天我们就要落地解决这个问题!!!效果展示这是我爬的 抖店后台订单数据(只是爬到数据,并没有提供给商业!!!):滑块破解效果视频:破解滑块效果视频我只讲关键思路,不会将整个工程发出来,海涵!!!!适用滑块场景能有条件下载到滑块背景 和 滑块 (截图也行)滑块背景滑块核心思想步骤下载滑块,滑块背景图,存储到本地。 图像识别滑块到背景缺口的横向距离(关键)。 根据距离算出移动的轨迹数组。 Ac...

2021-08-06 10:04:52 107

原创 抖店 订单,罗盘 导出教程

今天推荐一款自我开发的程序,可以一键导出指定店铺的订单数据。导出格式内容如下:程序优点:可以支持加密 用户,地址信息 导出。自动导出,无需人为操作。方便自定义导出字段。支持订单状态的筛选。可找我定制其它功能,导出罗盘数据等。需要程序的加我。 qq: 657455400 wx:hadluo...

2021-10-18 11:09:10 19

原创 抖店 加密信息破解 数据爬取 程序 使用文档

项目结构程序会爬取抖店加密如下数据:下面我将介绍使用方法1. 安装火狐1.1 找我获取火狐安装程序, 注意自己下载的火狐是不行的。1.2 断网,安装上述火狐程序。注意,一定要先断网然后再点安装!!!!!1.3 配置火狐不更新勾选不更新查看自己的火狐版本然后把关于的界面截图发我2. 修改配置信息注意格式: key: + 空格 + value (中间的空格不能掉)order_status表示要爬取指定状态订单的数据phone当前要爬取店铺机号。save抓取

2021-10-15 13:01:27 36

原创 Java 聚合支付 实战 XorPay

请看效果支付项目成果视频效果很简单:用户输入手机号登录。登录成功,也注册成功,然后请求支付二维码。用户扫码付款,然后后端接收支付回调,更改用户已支付。用户点击按钮刷新页面,发现已支付,查看商品文章。本文章以 XorPay的native支付 作为案例讲解, 如果你需要对接别的支付,也可以联系我!!!申请XorPay保管好你的aid 和 app secret 这是支付接口的凭证登录,注册模块实现创建用户表:CREATE TABLE `t_user` ( `id` int uns

2021-09-27 10:30:35 26

原创 新手 搭建技术博客网站

本文可以让你了解到:整个网站搭建到上线的流程。搭建网站的成本。网站域名,备案等细节。搜索引擎如何可以搜到你的网站。一. 我的博客网站展示Java架构师修炼网站内容还在完善中,下面是我的文章数据库:都是我一篇一篇写的,写的过程中技术也得到了质的提升!!!!这是我的网站一些备案的信息:Google浏览器可以搜到我的文章:二. 网站搭建成本1) 时间成本(在我的指导下) :网站搭建 2天备案+审核 30天左右2) 金钱成本:服务器: 74元一年 (腾讯云服务器首年)域名:

2021-09-13 17:55:52 19

原创 Java 日活跃百万消息量 热词提取 实战

注意本文是线上实战,已经应用到公司线上,并不是自己测试。量级:每天500W消息。需求每天500W 聊天消息,将聊天消息先分词,然后汇总提取出热词(出现次数最多的词)然后进行排序展示。线上效果图:展示对应热词名称和历史触发次数。原始消息数据量展示图:由于数据量巨大,每天有近500w数据,所以存储到ES ,然后按照每天建立索引。实现思路(温馨提示: 请耐心阅读)第一种方案:每天零点,起一个定时器,分页查询当天ES数据,直到查完今天数据为止。然后分页去处理消息.

2021-06-01 11:59:03 67

原创 企业级 Redis + Lua 分布式 高并发限流 实战

提醒注意本文不是个人测试,而是已经应用在线上,自定义限流组件代码。可以在线上推广使用。无需惧怕量级。采用了计数器+滑动窗口配合实现, 借鉴了著名的 Sentinel 滑动窗口思想:需求描述按照 每小时,每分钟,每秒 维度 进行分布式限流。效果展示首先来看下压测jmeter配置:每秒200个线程访问限流接口,无限循环下去。后台设置的接口限流条件为: 5次/每秒 ,代码:观察后台输出情况:这里我抽查了几个, 发现每秒确实是 5次成功拿锁。 证明我们的.

2021-05-31 14:33:47 62 2

原创 Java 高效大文件 读取&写入(一亿行)

写文件需求:写入1亿行,7位以内的随机的数字。首先看成果图,代表没骗大家!!!!!这个是最终生成的文件,有770多MB 。下面用glogg打开预览:程序打印耗时7149ms + 923 ms = 8072ms ,也就是8秒,写入1个亿数据到文件!!!!(还可以参数调优)思想利用nio高效写文件,先写入20个小文件,最后合并,每个小文件开一个线程。代码:public static void main(String[] args) throws Clone.

2021-05-19 10:42:44 202 1

原创 Eclipse开发go环境搭建

Windows平台下载完成后,直接双击安装即可默认情况下,.msi文件会安装在 C:\Go 目录下。可以将 C:\Go\bin 目录添加到环境变量 PATH 中,方便调用命令。Go 里面有两个非常重要的环境变量 GOROOT 和 GOPATH 。GOROOT 是 安装 go 的路径;GOPATH 是我们自定义的工作空间。GOPATH 可以是一个目录的列表,在 windows 环境变量中设置的时候,多个目录可以使用分号(;)分隔,在 Linux 环境变量中可以使用冒号(:)分隔。

2021-03-16 22:41:49 73

原创 Canal 详解 Mysql与Redis数据同步 解决方案

要保证数据库和redis强一致性是不可能的,肯定有少许时间的不一致。canal是阿里的一套组件,用来监听mysql master发送的类似binary log的数据,然后让消息费去消费。Canal 简单原理canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议 mysql master收到dump请求,开始推送binary log给slave(也就是canal) canal解析binary log对象(原始为byte流)Ca

2021-03-12 09:27:45 78

原创 Jedis 连接池 详解

一. JedisPool的几个重要参数介绍1. maxTotal控制连接池里面最多构建多少个Jedis实例。请看下面代码public static void main(String[] args) { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(2); JedisPool pool = new JedisPool(config,"172.29.2.10",7000); while(true) {

2021-03-12 09:27:10 113 1

原创 HashedWheelTimer 源码解析

此文是接着上文续讲的,建议看下上文在看此文。Redisson 延时队列 原理 详解​githubs.xyzHashedWheelTimer 简介Redisson延时队列里面用到了HashedWheelTimer 作为延时任务触发机制。HashedWheelTimer 属于netty-common项目下的工具。HashedWheelTimer本质是一种类似延迟任务队列的实现,适用于对时效性不高的,可快速执行的,大量这样的“小”任务,能够做到高性能,低消耗。Demo用法HashedWh

2021-03-12 09:26:35 95

原创 Redisson 延时队列 原理 详解

花了一天研究了下Redisson 的延时队列,RBlockingQueue ,RDelayedQueue 。 网上没一个说清楚的,而且都是说轮询redis的zset,都是错误的! 让我来纠正,如果我有错的也可指出。Demo用法public static void main(String[] args) throws InterruptedException, UnsupportedEncodingException { Config config = new Config(); config.

2021-03-12 09:25:48 1028

原创 Redis原理(4) Cluster 详解

先看一张图,大致触摸下Redis ClusterRedis Cluster要求至少需要3个master才能组成一个集群,同时每个master至少需要有一个slave节点。各个节点之间保持TCP通信。当master发生了宕机, Redis Cluster自动会将对应的slave节点提拔为master,来重新对外提供服务。Redis Cluster 功能 :负载均衡,故障切换,主从复制。负载均衡先说下槽,集群中每个redis实例都负责接管一部分槽,总槽数为:16384(2^14),如果有..

2021-03-11 17:42:10 347

原创 Redis原理(4)持久化 - AOF 篇

一. AOF简介AOF( append only file )持久化以独立日志的方式记录每次写命令,并在 Redis 重启时在重新执行 AOF 文件中的命令以达到恢复数据的目的。AOF 的主要作用是解决数据持久化的实时性。二. AOF相关配置# 是否开启AOF,默认关闭(no)appendonly yes# 指定 AOF 文件名appendfilename appendonly.aof# Redis支持三种不同的刷写模式:# appendfsync always #每次收到.

2021-03-11 17:41:38 44 1

原创 Redis原理(3) 持久化 RDB

一. RDB 简介Redis的RDB是用来将redis内存数据持久化到磁盘的一种机制,以此来防止redis数据全量丢失。二. RDB 相关配置# 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化) save "" 关闭RDB功能save 900 1 save 300 10 save 60 10000 # 如果持久化出错,主进程是否停止写入stop-writes-on-bgsave-error yes#是否压缩 ,建议不开启,压缩也会消耗cpu,磁盘的

2021-03-11 17:40:59 23

原创 Redis原理(2)内存优化细节

每一片条凋零的落叶,每一个残破的鸟窝,每一寸苍白的头发.... 都是为了生命的延续。本文就是接着上文的延续:Redis 内存全面详解​githubs.xyz一. 从编码上来优化内存几种redis数据编码介绍(不全介绍)1. embstr172.29.2.12:7000> set a 11111111222222333331212222233333333332333333OK172.29.2.12:7000> OBJECT encoding a"embstr"上

2021-03-11 17:40:01 39

原创 Redis原理(1) 内存全面详解

一. 我们怎么观察线上Redis内存我们如果在我们的redis.conf配置文件里面配置:# 最大内存设置,100Mmaxmemory 104857600查看redis内存信息 (info Memory)172.29.2.11:7002> info Memory# Memoryused_memory:2598042used_memory_human:2.48Mused_memory_rss:3002368used_memory_rss_human:2.86Mmaxm

2021-03-11 17:39:20 116

原创 Redis集群监控 (Granafa Prometheus Exporter 实战)

一. 写在前面的话本文是实战,来监控上篇文章我们搭建的Redis集群。我是花了2天才搞定,就因为granafa的版本问题。读者搭建时一定要用我指定的版本,否则你会尝到绝望的果实,看到血淋淋的键盘。二. Redis集群监控的三大利器redis exporter Prometheus granafaredis exporter 负责采集redis指标数据,通过 http 暴露给 Prometheus 拉取,然后通过granafa 将这些指标绘图展示数据。功能结构图不知道盗的哪里的.

2021-03-11 17:38:40 159 1

原创 Redis集群 实战 搭建

写给前面的话本文是自己亲自搭建成功过,3主3从Redis Cluster模式集群。 搭建过程有较多坑,本人在过程中心力憔悴,但好在最后成功了,读者也要有耐心。一. 资源准备准备三台机器(能连外网,能相互ping通),每台机器安装2个redis进程172.29.2.10 172.29.2.11 172.29.2.12分别安装依赖包,关闭防火墙[root@localhost src]# systemctl disable firewalld[root@localhost src]#.

2021-03-11 17:38:04 22

原创 纯Java代码实现 企业微信&钉钉 机器人群+告警

作为一名合格的架构师,如果没有一套及时的监控工具,那怎么能够让业务程序媛安心 ????先展示下钉钉告警预警图:在展示下企业微信告警预警图:钉钉告警准备建立告警群 。找到告警的钉钉群 , 点击右上角的群设置:点击智能群助手:点击添加群机器人点击添加机器人选择自定义 然后点击添加输入信息点击完成 ,这里选择 自定义关键词,就选择公司简称。 当告警内容包含这个关键词时,才会真正发出告警消息。 这里要注意下!!!!会得到一个Webhoo..

2021-03-11 17:35:05 290

原创 SpringBoot+Mybatis 整合多数据源 (druid)

作为一个合格的架构师,今天这篇文章算是划水,但是又是不得不会的。我的项目是SpringBoot+Mybatis通用Mapper + 多数据源(druid),如果连基本Mybatis都没整合的,请先见我这篇文章:SpringCloud+Nacos+Mybatis+Redis+Kafka 微服务整套框架环境搭建​githubs.xyz准备两个数据源spring: datasource: type: com.alibaba.druid.pool.DruidDataSource.

2021-03-11 16:33:08 54 2

原创 Elasticsearch6 封装成 sql 语句 便捷查询

作为一个架构师,必须要提供出对业务程序员便捷的工具。由于ES6 原生查询起来特别麻烦,于是封装了一个 Esql工具,只需要提供sql查询语句就可以查到ES里面的数据。Esql目前不支持两种(如有需要可以留言叫我开发):不支持group by。 不支持 where in条件。比如有这样一个sqlselect * FROM idx_group_send_message where merchantId = '12361' and createT..

2021-03-11 10:26:14 145 1

原创 JVM - 组成结构

JVM 整体组成可分为以下四个部分:类加载器(ClassLoader) 运行时数据区(Runtime Data Area) 执行引擎(Execution Engine) 本地库接口(Native Interface)JVM组成如图所示:程序在执行之前先要把java代码转换成字节码(class文件),jvm首先需要把字节码通过一定的方式类加载器(ClassLoader)把文件加载到内存中运行时数据区(Runtime Data Area),而字节码文件是jvm的一套指令集规范,并不能直接交个

2021-03-08 22:12:00 18

原创 JVM - 类加载器(ClassLoader) 原理 详解

ClassLoader的作用就是将class文件加载到jvm虚拟机中去,JVM就可以正确运行了。但是,jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载。JVM自带有三个类加载器Bootstrap ClassLoader最顶层的加载类,主要加载核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。另外需要注意的是可以通过启动jvm时指定-Xbootclasspath和路径来改变Bootstrap C

2021-03-08 22:11:15 111

原创 JVM - 运行时数据区 内存结构 详解

Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。其中一些数据区域是在Java虚拟机启动时创建的,只有在Java虚拟机退出时才会销毁。其他数据区域是每个线程。每个线程的数据区域在线程创建时创建,在线程退出时销毁。关于运行时数据区可以用以下图形来表示:下面我们一一来解析这几个区方法区方法区用于存储已被虚拟机加载的类信息、常量、静态变量、动态生成的类等元数据。是各个线程共享的内存区域。我们通过ClassLoader加载的Class对象是存放在堆区的,不是方法区。永久代(持久代)

2021-03-08 22:10:28 43

原创 try catch 底层原理

有这样一段程序public class Main { public static void main(String[] args) { new Main().call(); } public int call() { try { int a = 1 / 0; } catch (Exception e) { System.err.println("exception"); return 0; } finally { return 4; } }}程

2021-03-08 22:09:25 202

原创 JVM - JDK8 堆+垃圾收集器 综合剖析

来张图大致感受下堆的结构:堆 与 栈JVM里的“堆”(heap)特指用于存放Java对象的内存区域(new创建的对象和数组),是用于管理动态生命周期的内存区域,堆的回收是由垃圾收集器来统一管理(不需要程序代码显示调用回收)。 堆被同一个JVM实例中的所有Java线程共享。栈用于存放指向堆对象地址的引用。程序访问堆是通过栈里的引用来访问的。如果堆的对象没有任何栈引用所指向,堆对象就有可能会被垃圾收集器回收掉。 栈引用的回收完全被JVM掌控,没有栈引用指向另一个栈引用的,方法执行开始就对应开辟一

2021-03-08 22:08:13 35

原创 JDK7 线上永久代内存溢出

今天线上爆出了 java.lang.OutOfMemoryError: PermGen space当时吓尿了,怎么突然报永久代内存溢出,临时先加大了永久代内存,将启动参数改为:-XX:PermSize=128m为 -XX:PermSize=256m启动异常消失。留了一台机器jvm参数为之前的,来观察问题。用 jstat命令查看发现惊人一幕不得了永久代占了99.07%了,后来想到这个版本 加了个扫描包下class的工具,但是不确定是这个引起的。于是 在启动参数上加了 -ver

2021-03-08 22:06:50 50

原创 如何优雅的扫描指定包下的所有class

如果你是框架代码编写者,或者要学习如何编写框架,那么获取指定包下所有class对象这个操作时必不可少的。下面我来讲解下过程。比如我们要扫描com.hadluo包下的A.class和B.class :思路:递归找出环境变量下指定包(com.hadluo)下面的所有以.class结尾的文件(也有可能是jar)。 截取文件: F:..../com/hadluo 之前的不要,然后去掉.class文件后缀,结果:com/hadluo/A , com/hadluo/B 。 将上面结果变成com...

2021-03-08 22:05:09 171

原创 如何改变Bean的行为? BeanPostProcessor+动态代理 实践

提出问题业务service实现代码未知异常后,如何报警?如何知道报错时的参数?微服务的service层实现 有可能 会抛出未知异常(写代码时考虑不周全), 但是程序只会打出错误堆栈,很难定位问题,如果也打印了当时的参数就容易定位了。还有就是未知异常后,需要主动通知到告警群。实践我们新建一个 exception.jar , 让业务服务依赖我们这个jar,就自动完成上述功能。需要用到的技术:BeanPostProcessor + 动态代理。动态代理底层 请见我这篇文章:Java 动态代理 Proxy

2021-03-08 22:01:46 84 2

原创 不指定扫描包 框架第三方Jar包的Bean如何注入Spring (微服务监控实例)

提出需求要写一个微服务监控组件,来监控所有业务微服务是否健康。但是 不能侵入微服务的代码(实际上业务开发人员也不会在代码层面加你的监控组件),作为架构师的你,如何完成这一功能 ?实践流程新建一个monitor.jar(监控组件第三方jar) 。我们使用oshi进行linux机器的cpu,内存监控。引入maven:<dependency> <groupId>com.github.oshi</groupId> <artifactId>oshi-core

2021-03-08 21:57:16 328

原创 SpringCloud+Nacos+Mybatis+Redis+Kafka 微服务整套框架环境搭建

作为一个架构师,首先项目框架必须是要会搭建的。今天就来介绍线上的框架搭建,注意不是学习。用到的技术maven构建整合springboot+mybatis+redis+kafka整合springcloud+nacos搭建步骤uc-parent工程新建一个 uc-parent(uc可以是自己公司的简称) maven 聚合父工程,用来统一jar包版本管理。里面就一个pom文件:pom.xml​注意修改下repository标签,改成自己的仓库地址失效了的话可以联系我,工程结构图:or

2021-03-08 21:50:59 524 3

原创 Java集合:(二) LinkedList源码解析(JDK8)

LinkedList 底层是双向链表,它的增删只需要移动指针即可,故时间效率较高。不需要批量扩容,也不需要预留空间,所以空间效率比ArrayList高。缺点就是需要随机访问元素时,时间效率很低,虽然底层在根据下标查询Node的时候,会根据index判断目标Node在前半段还是后半段,然后决定是顺序还是逆序查询,以提升时间效率。不过随着n的增大,总体时间效率依然很低。源码分析成员变量transient int size = 0; // 当前元素个数transient Node<E>

2021-02-25 21:06:19 23

原创 Java集合:(一) ArrayList源码解析(JDK8)

ArrayList概述ArrayList 是一个动态数组,它是线程不安全的,允许元素为null。底层数据结构依然是数组,它是占据一块连续的内存空间(容量就是数组的length),所以它也有数组的缺点,空间效率不高。由于数组的内存连续,可以根据下标以O1的时间读写(改查)元素,因此时间效率很高。当集合中的元素超出这个容量,便会进行扩容操作。扩容操作也是ArrayList 的一个性能消耗比较大的地方,所以若我们可以提前预知数据的规模,应该通过public ArrayList(int initialCapac

2021-02-25 21:00:37 28

原创 Javassist 文档

本文属于摘抄的文档,如有侵权请联系,删除!!!Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。它可以用来检查、”动态”修改以及创建 Java类。其功能与jdk自带的反射功能类似,但比反射功能更强大。我靠Javassist实现的一个仿照JDK Proxy动态代理的demo,建议

2021-02-25 20:54:57 21

原创 自己实现Java 动态代理 Proxy

jdk Proxy的源码解析在下面这篇文章。建议看完在看今天的自己实现,否则可能会看不懂。Java 动态代理 Proxy源码详解开始动手InvocationHandler接口,替换jdk的。package debug_jdk8;import java.lang.reflect.Method;public interface InvocationHandler { public Object invoke(Object proxy, Method method, Object[] args

2021-02-25 20:51:30 38

原创 Java 动态代理 Proxy源码详解

代理简介?我们知道nginx可以实现正向,反向代理。比如我们想请求服务中一个tomcat,一般就是直接访问机器的ip,如果是代理的话,就是先访问中间代理层(nginx),然后nignx跳转到我们的tomcat机器。代理模式也是如此,也有一个Proxy层,通过Proxy层来真正访问我们的类接口。为什么要有代理?我们先看nginx实现的代理,他可以事先为我们做很多ip黑名单过滤,负载均衡,权限,甚至我们还可以到代理层改变我们http接口信息。java的Proxy也是如此,可以在访问真正类的时候做一些前置和

2021-02-25 20:35:47 124

原创 hashCode 原理

网上一般都说hashCode 就是对象的内存地址,但是你想下垃圾回收时(复制算法,整理算法)都要发生对象移动,都要改变对象的内存地址。但hashCode又不能变化,那么该值一定是被保存在对象的某个地方了。hashcode就是保存在对象头里面的,但是如果hashcode是内存地址的话,那么就有可能会重复到之前回收对象的地址。对象头详解见此文章synchronized 原理 锁升级 详解苍天可见,hashcode绝对不是简简单单的内存地址。hashcode的6种生成策略可以通过在JVM启动参数中添加

2021-02-25 20:26:56 111

原创 TransmittableThreadLocal 源码分析

一. TransmittableThreadLocal 简介传统的jdk的ThreadLocal只能解决线程或者父,子线程之间的数据传递。 而 TransmittableThreadLocal 是为了解决 线程池里面的线程之间传递ThreadLocal。二. 实例带入public static void main(String[] args) throws Exception { ThreadLocal<String> THREAD_LOCAL = new Transmit

2021-02-25 20:19:59 66

动态注册dubbo提供者接口

在dubbo服务运行过程中,上传正确的java代码文件,自动编译生成class并注册到dubbo zk 中,可以正常dubbo invoke来调用。整个过程服务不用重启。我写了个框架并命名为D-Unit。

2019-09-26

自定实现Dubbo Invoker

自己仿dubbo Invoker实现,思想跟dubbo实现一致。。。。。。。。。。。

2018-04-27

仿Dubbo的ExtensionLoader

仿Dubbo的ExtensionLoader maven工程....

2018-04-24

netty-0.0.1.jar

基于netty4的类似websocket用法封装

2017-06-06

自己手动实现dubbo源码

里面有三个mavaen工程具体看博客介绍.................................

2017-12-21

自定实现dubbo服务导出

包括spring自定义标签,dubbo何如利用spring bean生命周期实现查找和赋值

2018-05-02

HadLuo-Mybatis3.rar

简单易懂的mybatis源码,请修改db.properties信息在运行。

2020-04-22

jd-gui-0.3.6.exe

反编译class的神器

2017-01-04

scala编写的dubbo自动化部署工具

自动用scala写的dubbo服务自动化部署工具,工程是eclipse编写的

2018-01-09

Dubbo传输层实现

仿dubbo的传输层实现,基于netty4.........................................

2018-05-09

sacla编写的dubbo自动化部署工具

sacla编写的dubbo自动化部署工具,项目是eclipse编写的

2018-01-09

空空如也

空空如也

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

TA关注的人 TA的粉丝

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