自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(134)
  • 资源 (11)
  • 收藏
  • 关注

原创 Idea 快捷键使用方式总结

IntelliJ IDEA快捷键说明IntelliJ IDEA 的便捷操作性,快捷键的功劳占了一大半,对于各个快捷键组合请认真对待。IntelliJ IDEA 本身的设计思维是提倡键盘优先于鼠标的,所以各种快捷键组合层出不穷,对于快捷键设置也有各种支持,对于其他 IDE 的快捷键组合也有预设模板进行支持。Ctrl快捷键介绍Ctrl + F在当前文件进行文本查找 (必备)Ctrl + R在当前文件进行文本替换 (必备)Ctrl + Z撤销 (必备)Ctrl

2021-01-15 13:37:09 241

转载 自定义链表,队列,栈

链表实现在我们数据结构中,单链表非常重要。它里面的数据元素是以结点为单位,每个结点是由数据元素的数据和下一个结点的地址组成,在java集合框架里面LinkedList、HashMap(数组加链表)等等的底层都是用链表实现的。下面是单链表的几个特点:数据元素在内存中存放的地址是不连续的:单链表的结点里面还定义一个结点,它里面保存着下一个结点的内存地址,在实例化对象的时候,jvm会开辟不同内存空间,并且是不连续的。添加效率高:添加一个元素时,先找到插入位置的前一个,只需要将1,2个元素的连接断开,将

2021-01-13 13:20:59 203

原创 排序算法 - 快速排序

简介快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序

2021-01-12 13:15:02 230

原创 排序算法 - 冒泡排序

简介冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。作为最简单的排序算法之一,冒泡排序给我的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该

2021-01-10 10:43:16 123

原创 Eclipse 注释模板

好的注释可以增加代码的可读性,因此代码注释就非常重要了,下面为个人常用的一份eclipse模板设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元素模板如下:文件(Files)注释标签:/** * @Title: ${file_name} * @Package ${package_name} * @Description: ${todo} *

2021-01-05 21:47:32 243

原创 读懂Mysql执行计划

Explain 信息查看MySQL版本只需要在SQL语句前加上explain关键字就可以查看执行计划,执行计划包括以下信息:id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、Extra,总共12个字段信息。然后创建三个表:CREATE TABLE `tb_student` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varcha

2021-01-05 17:56:37 101

转载 JVM 内存分析工具 MAT 的深度讲解与实践——进阶篇

1. 前言本文详细讲解 MAT 众多内存分析工具功能,这些功能组合使用异常强大,熟练使用几乎可以解决所有的堆内存离线分析的问题。我们将功能划分为4类:内存分布详情、对象间依赖、对象状态详情、按条件检索。每大类有多个功能点,本文会逐一讲解各功能的场景及用法。此外,添加了原创或引用案例加强理解和掌握。注:在该系列开篇文章《JVM 内存分析工具 MAT 的深度讲解与实践——入门篇》中介绍了 MAT 的使用场景及安装方法,不熟悉 MAT 的读者建议先阅读上文并安装,本文案例很容易在本地实践。另外,上文中产品介绍

2021-01-04 21:34:28 1924

转载 JVM 内存分析工具 MAT 的深度讲解与实践——入门篇

1. MAT 工具简介MAT(全名:Memory Analyzer Tool),是一款快速便捷且功能强大丰富的 JVM 堆内存离线分析工具。其通过展现 JVM 异常时所记录的运行时堆转储快照(Heap dump)状态(正常运行时也可以做堆转储分析),帮助定位内存泄漏问题或优化大内存消耗逻辑。1.1 MAT 使用场景及主要解决问题场景一:内存溢出,JVM堆区或方法区放不下存活及待申请的对象。如:高峰期系统出现 OOM(Out of Memory)异常,需定位内存瓶颈点来指导优化。场景二:内存泄漏,不会

2021-01-04 17:22:14 733

原创 多线程 - 父线程向子线程传值方案探讨

1 . ThreadLocal测试代码:public class TestThreadLocal { public static ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main(String[] args) { //设置线程变量 threadLocal.set("hello world"); Thread thread = new

2021-01-04 13:38:24 453

原创 多线程 - ThreadLocal分析

ThreadLocal 简单介绍及源码分析简单介绍ThreadLocal 是一个线程的本地变量,也就意味着这个变量是线程独有的,是不能与其他线程共享的,这样就可以避免资源竞争带来的多线程的问题,这种解决多线程的安全问题和lock(这里的lock 指通过synchronized 或者Lock 等实现的锁) 是有本质的区别的:lock 的资源是多个线程共享的,所以访问的时候需要加锁。ThreadLocal 是每个线程都有一个副本,是不需要加锁的。lock 是通过时间换空间的做法。ThreadLoc

2021-01-04 10:18:42 154

原创 多线程 EagerThreadPool(dubbo)程池的实现

EagerThreadPool 种线程池的实现任务处理优先线程池ThreadPoolExecutor普通线程执行器。当线程池核心线程达到阈值时新任务放入队列。当队列已满开启新线程处理。当前线程数达到最大线程数时执行拒绝策略。EagerThreadPoolExecutor自定义线程执行器。当线程池核心线程达到阈值时,新任务不会放入队列而是开启新线程进行处理(要求当前线程数没有超过最大线程数)。当前线程数达到最大线程数时任务放入队列。队列已满执行拒绝策略源码如下:public class EagerT

2021-01-03 12:36:12 505

原创 多线程 JDK线程池详解

线程池详解JDK类图Executor , ExecutorService , Executors 区别ExecutorExecutorServiceExecutor 是 Java 线程池的核心接口,用来并发执行提交的任务ExecutorService 是 Executor 接口的扩展,提供了异步执行和关闭线程池的方法提供execute()方法用来提交任务提供submit()方法用来提交任务execute()方法无返回值submit()方法返回Future对象,可用来获取

2020-12-31 16:17:03 274

原创 Java对象的内存布局

一个对象在内存中究竟是怎样进行布局的,如何依据代码去确定对象占据的大小,本文将进行粗略地探讨。对象在内存中的布局,主要有3个组成部分,包括对象头,实例数据与对齐填充。确定对象的大小,也是从这3个组成部分的入手对象的内存布局对象头其中对象头中又包括Mark Word与Klass Word。当该对象是一个数组时,对象头还会增加一块区域,用来保存数组的长度。以64位系统为例,对象头存储内容如下图所示|---------------------------------------------------

2020-12-28 14:52:24 160 1

原创 JVM 为什么元空间替换永久代

背景:首先需要明确的是,以下我们讨论的HotSpot虚拟机,其他类型的虚拟机,例如JRockit与J9等,压根就没有永久代的概念。因此,下面所说的“虚拟机”都是HotSpot版本的。要想理解这种变化的原因,需要先理解方法区、永久代与元空间的概念与之间的关系。方法区与永久代,元空间之间的关系方法区是一种规范,不同的虚拟机厂商可以基于规范做出不同的实现,永久代和元空间就是出于不同jdk版本的实现。说白了,方法区就像是一个接口,永久代与元空间分别是两个不同的实现类而已。只不过永久代是这个接口最初的实现类

2020-12-27 23:38:37 242

转载 Linux主机15条安全基线检查

分享一个Linux主机安全基线脚本,仅供参考基线检查内容:[1] 账号策略检查[2] 登录超时检查[3] 特权用户检查[4] 空登录口令用户检查[5] sudo权限用户检查[6] 用户缺省权限检查[7] 系统关键目录权限检查[8] ssh配置检查[9] 系统ping服务检查[10] 系统telnet服务检查[11] 远程连接的安全性配置检查[12] 异常隐含文件检查[13] syslog登录事件检查[14] 日志审核功能检查[15] 系统core dump状态检查安全基线检

2020-12-27 22:19:56 2372

转载 管理端批量SSH免密

分享一个批量ssh免密脚本,仅供参考需求管理端有多台服务器,维护几百台服务器的时候需配置ssh免密,但密码很多特殊字符,如果用expect是很难处理的,故python脚本实现环境准备1、安装fabricpython3环境pip install fabric2、准备管理端和节点密码文件(文件名分别为master.txt和node.txt)格式为:IP 端口 账号 密码批量ssh免密脚本import argparseimport collectionsimport subproces

2020-12-27 22:16:23 234

原创 maven动态统一修改版本号几种方式

背景开发环境和测试环境共用一个nexus私服仓库,导致开发环境的API包和测试环境的API包发生了覆盖现象。因此比较好的解决方案是项目自动化构建时,项目的版本号能跟着环境变更。比如是开发环境,则项目的API包版本就形如1.0-dev,如果是测试环境,则项目的API版本就形如1.0-test案例Demo演示项目层级方案一:mvn -Denv.project.version=1.0-envenv.project.version为自定参数变量,env为dev或者test1、在maven项目的父级po

2020-12-27 22:03:55 4658

原创 Linux系统巡检脚本

一个Linux系统巡检脚本demo#!/bin/sh"echo "#######################################「OS系统信息」##########################################"OS_TYPE=`uname`OS_Number=`dmidecode -t system |grep 'Serial Number'|awk '{print $3}'|awk -F, '{print $1}'`OS_VERSION=`cat /etc/r

2020-12-27 21:33:53 254 1

原创 获取linux内存、cpu、磁盘IO等信息

分享一个shell脚本,用来获取linux系统CPU、内存、磁盘IO等信息#!/bin/bash# 获取要监控的本地服务器IP地址IP=`ifconfig | grep inet | grep -vE 'inet6|127.0.0.1' | awk '{print $2}'`echo "IP地址:"$IP # 获取cpu总核数cpu_num=`grep -c "model name" /proc/cpuinfo`echo "cpu总核数:"$cpu_num # 1、获取CPU利用率##

2020-12-27 21:18:03 173

转载 Linux使用sar进行性能分析

sar简介sar(System Activity Reporter, 系统活动情况报告): 是用于监控Linux系统各个性能的优秀工具,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。sar命令常用格式sar [ options ] [ [ ] ]sar -h 显示:-A:所有报告的总和-b:显示I/O和传递速率的统计信息-B:显示换页状态-d:输出每一块磁盘的使用信息-e:设置显示报告的结束时间-f:从制定的文件读

2020-12-25 12:45:59 272 1

原创 一个TCP连接到底可以发多少个HTTP请求

1 .现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开?在 HTTP/1.0 中,一个服务器在发送完一个 HTTP 响应后,会断开 TCP 链接。但是这样每次请求都会重新建立和断开 TCP 连接,代价过大。所以虽然标准中没有设定,某些服务器对 Connection: keep-alive 的 Header 进行了支持。意思是说,完成这个 HTTP 请求之后,不要断开 HTTP 请求使用的 TCP 连接。这样的好处是连接可以被重新使用,之后发送 HTTP

2020-12-23 13:53:58 321

原创 Kafka,RocketMq,RabbitMq等消息中间件特性对比

消息中间件对比图

2020-12-21 16:55:23 90

原创 Tomcat 工作原理

1

2020-12-21 14:35:38 497

原创 ELK安装配置

简介:ELK是(Elasticsearch、Logstash、Kibana)三个软件的集合简称。那么这三个软件分别扮演着一个什么样的角色呢?1)Elasticsearch:搜索引擎,主要任务是将日志索引并进行存储。2)Logstash:通俗来讲就是一个中间者,负责将日志进行收集、过滤并转发,转发给谁呢?在没有特殊配置的情况下转发给Elasticsearch进行处理。3)Kibana:可视化展示工具,我们通过web界面可以查看到它将es的数据很美观的展示给客户。开始部署:一、安装jdk1.8下载好

2020-12-20 20:00:23 177 1

原创 基于MYSQL数据库实现自动创建分区

概述Mysql不能自动创建分区,需要使用mysql event事件的方式自动创建分区,今天主要分享一下在MYSQL数据库应如何实现自动创建分区。1、准备测试表及数据CREATE TABLE `t1` ( `id` bigint(20) NOT NULL COMMENT 'id', `insert_user` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'Insert User', `insert

2020-12-20 17:57:35 682 2

原创 Kafka设计原理,为什么Kafka性能高,如何保证Kafka不丢消息

分布式消息中间件作用:解耦(同步调用是一种强依赖,而异步调用是一种弱依赖);削峰填谷;降低响应时间;提升吞吐量(Kafka 的吞吐量是MySQL 吞吐量的30-40倍,并且Kafka的扩展性远高于MySQL);Kafka 的设计原理Kafka 是一个分布式消息中间件,但是它并不符合JMS 规范,即使消息已经被消费,也不会被马上删除,当消息保留一定时间后,会被批量删除。在Kafka 中,消息被持久化到磁盘上,因此Kafka 堆积消息的能力非常强大。Kafka 依赖于 Zookeeper

2020-12-20 17:55:33 201 1

原创 服务器日志清理脚本

日志清理脚本默认清理/var/log下的日志,默认保留14天。#!/bin/bash#################################################################### copyright by hwb# DATE:2020-11-03# 用途:清理过期日志文件####################################################################传参log_path="/var/log

2020-12-19 14:34:24 408 1

原创 私有yum仓库搭建及定时同步阿里云yum源到本地教程

概述由于网络限制,部分服务器不给阿里源访问权限了,那就只能搭建一下集团的私有yum仓库了同步阿里云所有yum资源要30G+ 空间资源一、共享yum源YUM是“Yellow dog Updater, Modified”的缩写,是一个软件包管理器,YUM从指定的地方(相关网站的rpm包地址或本地的rpm路径)自动下载RPM包并且安装,能够很好的解决依赖关系问题。yum源就相当是一个目录项,当我们使用yum机制安装软件时,若需要安装依赖软件,则yum机制就会根据在yum源中定义好的路径查找依赖软件,并

2020-12-19 14:28:46 1202 1

原创 mybatis-plus如何自动填充字段创建时间和修改时间

根据阿里巴巴开发手册,表必备三个字段:id,create_time, update_time,针对创建时间和修改时间我们有两种方式可以去生成——数据库层面和代码层面1 . 数据库层面:CREATE TABLE `stu` ('id' int NOT NULL AUTO_INCREMENT,'createTime' timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间','moditiyTime' timestamp DEFAULT CURRENT_TI

2020-12-19 14:16:58 2036 1

原创 Mysql 自动备份脚本

MySQL自动备份脚本模板#!/bin/bash################################## copyright by hwb# DATE:2020-12-03# 用途:MYSQL备份模板##################################定义db_host=localhostdb_port=3306db_name=mysql_prod db_user=rootdb_pwd=passwordbackup_path="/data/backup

2020-12-19 14:09:33 239 1

原创 Centos7系统下安装Docker引擎

一、安装docker前关闭防火墙(个人习惯)关闭防火墙和selinux命令如下:关闭防火墙:systemctl disable firewalldsystemctl stop firewalld关闭selinux命令:sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config(永久关闭需reboot)setenforce 0(临时关闭)二、yum源配置安装container-selinux依赖包:wget

2020-12-19 14:02:17 103 1

原创 超实用的脚本-同步时间、修改网卡及主机名、IP及密码

vmware虚拟机 每次将模板克隆为虚拟机后,都需要手动需修改主机名、IP地址、网卡名称、用户名密码修改(满足复杂度要求)以及时间同步等,故抽闲时间写了一个自动修改的脚本,此脚本适用于centos6和redhat6版本,要想其他版本也能跑,可自行做个简单的修改即可(基本都大同小异)#!/bin/bash############################################ALOM ##############################by ALOM 20201206#####

2020-12-19 13:10:16 314 1

原创 记一次生产线系统磁盘扩容的步骤——超详细的lvm步骤

背景说明:监控告警触发系统磁盘空间不足,需尽快扩容详细的过程:请向下看:一、登陆系统查看,发现有两个目录需扩容,其中一个确实已经100%了,如下图所示首先考虑通过vg剩余的空间来扩容,我们来查看vg02组的大小,这里有两个vg组,需要注意的是,我们需要扩容的两个分区它属于vg02组,而不是vg00,所以生产线上一定要注意,不要搞混淆哦,如下图所示:发现vg02没有可用的分配空间了~~ 那这个时候怎么办呢?只能通过新加一块硬盘来添加到现有的vg02组里进行给上面两个。整个扩容顺序:1.创建新的

2020-12-19 13:06:25 309 1

原创 一键自动部署Nginx代理

在工作中,我们经常需要手动去部署一些代理服务器,如nginx或者tomcat等,只有这些先决条件的环境搭建好之后才能部署应用war包等等,今天就给大家分享一个一键自动部署Nginx代理的脚本,适用于Redhat和Centos6或者7以上的系统。执行自动安装配置脚本,稍等片刻,显示已安装成功,配置文件自检成功,如下图所示:通过netstat -lnpt|grep 80或 ss-tnl命令可以看到nginx的监听端口已经起来了,当然端口可自行定义,如下图所示:通过浏览器输入nginx服务器的ip地址即

2020-12-19 12:54:55 409 1

原创 一键自动部署Redis的任意版本

**脚本用法:**chmod 755 redis-install.sh && sh redis-install.sh 4.0.10 (后面跟的是你需要的版本号,需要什么版本就写什么版本),我这里安装的4.0.10具体脚本内容如下展示:#! /usr/bin/bash##redis任何版本全程自动化源码编译安装##用法: sh redis-install.sh 4.0.10 (后面跟的是你需要的版本号,需要什么版本就写什么版本),我这里安装的4.0.10version=$1usag

2020-12-19 12:47:05 161 2

原创 一键自动部署Mysql的任意版本

脚本用法:chmod 755 install-mysql.sh && sh install-mysql.sh 5.7.22 (后面跟的是你需要的版本号,需要什么版本就写什么版本),我这里安装的5.7.22#!/bin/sh# mysql 任何版本全程自动化源码编译安装# 用法:sh -x install-mysql.sh 5.7.22 后面跟的是你需要的版本号,需要什么版本就写什么版本!version=$1usage(){ echo "usage: $0 version"}i

2020-12-19 12:40:57 158 1

转载 缓存与数据库双写一致性的解决方案

传统企业中为了解决高并发大流量的问题,通常使用缓存+数据库的方式来支撑高QPS的访问,虽然能解决读QPS的问题,但是同时也引入了新的问题,例如:缓存与数据库的数据不一致的情况;本博文参考网上相关的博文,详细的整理下缓存数据库数据一致性的问题,并且给出基于Java的代码解决方案关于缓存数据库数据一致性的解决方案,网上有很多,但是大都是偏向理论的,且大多数使用分布式锁来实现的,分布式锁也是一种解决方式,但是无疑增加了代码逻辑的复杂性,本博文主要是使用JVM自带的缓存队列+线程池来解决数据一致性的问题,并.

2020-12-12 19:00:44 711 1

原创 配置阿里云yum源并启动nginx服务

1.查看yum源仓库ls/etc/yum.repos.d/2.查看CentOs-Base.repo文件3.配置yum源https://opsx.alibaba.com/mirror找到这个网站,然后找到centos7执行下载阿里云yum源wget-O/etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyun.com/repo/Centos-7.repoyumcleanall清空yum软件源yummakecache...

2020-12-07 19:11:10 673

转载 Linux open file与 fs-max

概要:linux系统默认open files数目为1024, 有时应用程序会报Too many open files的错误,是因为open files 数目不够。这就需要修改ulimit和file-max。特别是提供大量静态文件访问的web服务器,缓存服务器(如squid), 更要注意这个问题。网上的教程,都只是简单说明要如何设置ulimit和file-max, 但这两者之间的关系差别,并没有仔细说明。说明:1. file-max的含义。man proc,可得到file-max的描述:/pro

2020-12-07 14:42:45 1291

转载 JVM 关于对象分配在堆、栈、TLAB的理解

引言  我们知道,一般在java程序中,new的对象是分配在堆空间中的,但是实际的情况是,大部分的new对象会进入堆空间中,而并非是全部的对象,还有另外两个地方可以存储new的对象,我们称之为栈上分配以及TLAB栈上分配为什么需要栈上分配?  在我们的应用程序中,其实有很多的对象的作用域都不会逃逸出方法外,也就是说该对象的生命周期会随着方法的调用开始而开始,方法的调用结束而结束,对于这种对象,是不是该考虑将对象不在分配在堆空间中呢?  因为一旦分配在堆空间中,当方法调用结束,没有了引用指

2020-11-30 14:22:33 516 2

beanshell-获取id.jmx

Jemeter 压力测试时,需要动态获取序号或者流水号,此时可以通过beanshell 生成序号,请求报文中可以获取变量,生成需要的序列号

2020-06-17

useful-scripts-release-2.x.zip

用于快速排查Java的CPU性能问题(top us值过高),自动查出运行的Java进程中消耗CPU多的线程,并打印出其线程栈,从而确定导致性能问题的方法调用

2020-06-11

LINUX与UNIX SHELL编程指南.zip

linux shell 脚本编程快速入门手册,系统介绍了linux 系统常用模块操作命令,文件安全与权限,使用find和xargs,后台执行命令,后台执行命令,shell输入与输出,命令执行顺序等

2020-04-01

oracle优化.zip

本文介绍了,如何查看Oracle sql执行计划,以及如何分析执行计划并进行调优

2019-08-22

系统架构师v4&&深入理解Mysql.zip

系统架构师教程第四版,主要用于架构师资格考试。深入理解myql ,系统的讲解的mysql 系统组成以及工作原理

2019-08-18

db2驱动jar包(支持jdk 1.8)

场景:升级jdk到1.8,可能会报错 Origination unknown: [10228][11541][3.62.56] 在装入驱动程序时发生了安全性异常。 ERRORCODE=4223, SQLSTATE=null,此时可以尝试升级db2 jdbc驱动解决 ibm 官网db2地址:http://www-01.ibm.com/support/docview.wss?uid=swg21363866

2019-04-29

oracle 优化文档资料

包括常见oracle sql编写方法,oracle 优化方案............................

2018-07-01

nginx 安装配置详解

此文档包含 了nginx 安装步骤,模块说明,配置详解,使用场景

2018-06-19

svn 管理工具(web版)

web版 svn管理工具,可以进行svn库管理,svn用户权限权限分配,资源权限分配

2018-06-09

JavaScript 学习脚本

JavaScript 学习脚本,包含JavaScript基础,JavaScript设计模式等

2018-06-02

简易java运维工具

java小工具,可以用shell相关命令,实现远程服务器运维

2018-06-02

空空如也

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

TA关注的人

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