自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

翔云

Just try, don't shy.

  • 博客(720)
  • 资源 (15)
  • 收藏
  • 关注

原创 MySQL error 是哪里来的

目录1.MySQL error分类2.测试3.参考在使用MySQL的过程,有时会遇到MySQL 报错信息,例如,权限报错:Error 1045: Access denied for user 'root'@'10.3.18.88' (using password: YES)连接报错:Error 2013: Lost connection to MySQL server during query无法识别的MySQL server报错:Error 2005: Unknown MySQL ser

2021-11-28 15:37:31 803

原创 使用mysqldump 导出数据时的常用选项

目录文章目录--single-transaction--set-gtid-purged=OFF不加 --set-gtid-purged=OFF加上 --set-gtid-purged=OFF其他常用选项参考前面两篇博客MySQL导入导出数据库、mysqldump 如何导出表的部分数据已经介绍了mysqldump的基本用法。本文主要介绍在使用mysqldump时常用的选项。–single-transaction该选项保证数据导出的一致性:--single-transaction 这里的

2021-10-30 23:01:27 1757

原创 MySQL 批量insert 、单条insert

目录准备数据表单条insert批量insert本文简单介绍在MySQL中insert数据方法。准备数据表CREATE TABLE `test5` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, `age` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0:yes, -1:no', PRIMARY KEY (`id`), UNIQUE KEY `name_UN

2021-10-30 20:20:28 3209

原创 分享一个 电子书下载网站 支持 ebook pdf azw3 epub mobi

今天经同事介绍,发现一个非常实用的免费的电子书下载网站:zlib。上面的书籍资源比较丰富,随机搜了几本书,还都有。格式上,有PDF,azw3, epub, mobi等。非常棒,推荐给大家。可以下载kindle 支持的格式,然后推送到kindle上,非常方便。666...

2021-10-30 20:00:10 5947

原创 基准压测工具sysbench

目录1.安装1.1 直接使用二进制安装包1.2 通过源码编译安装2.MySQL压测2.1 准备数据2.2 执行测试2.3 清理数据3.参考什么是sysbench?sysbench是一款基于LuaJIT的多线程基准测试工具,它最常用于数据库基准测试,但也可用于创建不涉及数据库服务器的任意复杂工作负载。主要功能包括:oltp_*.lua: OLTP类数据库压测工具集fileio: 文件系统级基准测试cpu: CPU基准测试memory: 内存访问基准测试threads:线程调度基准测试mu

2021-09-12 22:51:47 510

原创 MySQL 高可用 MySQL High Availability 示例代码下载

《MySQL 高可用 MySQL High Availability》 本书使用的示例代码可以 这里下载。博主下载后,上传到CSDN了,方便大家使用。代码目录截图:CSDN 下载地址mysql-replicant-python.zip

2021-08-29 17:31:27 238

原创 stop slave后,正在执行的事务是完成了还是回滚了rollback

目录1.关于stop slave后,事务执行结果2.观察事务回滚2.1.设置从库的事务隔离级别2.2.启动SQL thread2.3.停止复制,查看事务执行情况1.关于stop slave后,事务执行结果如果从库上SQL线程正在应用relay log,或者说正在执行一个事务,此时如果stop slave,那么这个事务执行结果会是什么,完成还是未完成?由于事务的原子性,可以这么说,事务要么执行完成,要么回滚。先说结论,事务执行结果有两种:执行完成未执行完成(事务回滚)那什么情况执行完成,什么

2021-08-15 22:40:59 331

原创 stop slave 卡住模拟--大事务场景

目录1.主库数据准备2.从库停止复制stop slave,只开启io thread3.在主库上执行大事务4.开启复制start slave sql_thread,等待2s,接着stop slave上一篇文章stop slave卡住,初步介绍了stop slave的问题现象以及一些原因。本文介演示遇到大事务时,从库stop slave会卡住。MySQL测试集群:一主一从。主库、从库执行操作如下。1.主库数据准备首先,新建表CREATE TABLE `apple_test` ( `id` in

2021-08-07 23:06:56 476

原创 大事务big or long transaction模拟

目录创建表插入大量数据,模拟大事务所谓大事务,是指执行过程比较长的事务。例如,执行超过5s,10s,1min。。。。一个事务可以有多个event,也可以只有一个event。本文主要介绍如何模拟一个有多个event的大事务。创建表建表sqlCREATE TABLE `apple_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` int(11) NOT NULL DEFAULT '0' COMMENT 'a', `b` int(11)

2021-08-07 22:12:08 463

原创 Orchestrator中 errant 的判断

在主从复制中,会在主库上写入数据,接着从库复制主库写入的数据。如果直接在从库上写入数据,从库中数据就会与主库不一致,出现 errant。errant 问题,主从数据不一致,需要及时发现和治理。如何判断 是否出现errant 呢?看起来比较简单,就是判断 从库 gtid 是否比主库gtid多,如果是,则判定为errant。但会有一种场景,如果先获取主库gtid,再获取从库gtid,由于这两个操作之间有时间差,从库会从主库复制数据,就会出现 从库的gtid 比主库的gtid多,出现误判。调整获取主库

2021-06-13 22:56:04 612

原创 golang 中时间差的计算

操作系统提供两种时钟:“wall clock” 墙上时钟 和 “monotonic clock” 单调时钟,wall clock 会受到时钟同步的影响,用于显示时间。monotonic clock 用于计量时间,例如 时间大小比较,时间差计算。不会时钟重置的影响。例如,下面代码中,计算耗时,耗时一直是正的,20ms。即使 wall clock 被重置。start := time.Now()... operation that takes 20 milliseconds ...t := time

2021-06-05 22:42:27 4548

原创 如何阅读MySQL源码

目录1.下载MySQL源码2.IDE的使用2.1 安装 C/C++ 插件。2.2 打开代码为了更加准确的理解MySQL原理,很多时间需要查看文档和阅读源码。如果文档中,描述模糊,就需要查看代码进行确认。本文简单介绍下,在Mac OS 环境下,如何高效的阅读MySQL源码。1.下载MySQL源码在github上找到release列表,选择需要下载的版本。本文这里下载的是5.7.26。下载后,解压缩。2.IDE的使用IDE的使用,可以极大提高阅读效率。网上,有的也推荐用vim等等,需要繁琐的配

2021-06-05 15:20:14 3314

原创 go 单元测试go-sqlmock

目录文章目录1.安装2.举例3.参考在数据库应用开发过程中,会在数据库上执行各种 SQL 语句。在做单元测试的时候,一般不会与实际数据库交互,这时就需要mock 数据库操作。即在不建立真实连接的情况下,模拟 sql driver 中的各种操作。本文介绍golang中 mock sql 操作的 库 go-sqlmock。1.安装go get github.com/DATA-DOG/go-sqlmock2.举例介绍下github上的例子:代码中,执行有两个操作 update和insert

2021-03-28 23:33:48 3973

原创 go 单元测试 gomonkey

单元测试中,经常需要mock。例如,一个函数中,需要调用网络连接函数建立连接。做单元测试时,这个建立连接的函数就可以mock一下,而不真正去尝试建立连接。gomonkey 就是这样的工具库。mock 有时也称为“打桩”。例如,mock一个函数,可以说,为一个函数打桩。本文主要介绍使用gomonkey进行mock。1.安装$ go get github.com/agiledragon/gomonkey2.使用方法2.1 mock一个函数下面例子中,调用链是:Compute()–>

2021-03-27 23:49:26 10990 3

原创 模拟磁盘满情况下MySQL表现

目录创建大文件写入数据查看错误日志参考本文主要模拟磁盘满的情况下,MySQL服务的表现。模拟磁盘满的故障,可以通过创建大文件来进行。创建大文件可通过三个进行: truncate、dd、fallocate。本文使用dd命令创建大文件。创建大文件/bin/dd if=/dev/zero of=/tmp/dd_big_file bs=1G count=360/bin/dd: writing `/tmp/dd_big_file': No space left on device186+0 reco

2021-03-20 16:59:16 341 2

原创 mysql insert into, insert ignore into, insert into on duplicate key update

目录insert intoinsert ignore intoinsert into on duplicate update不存在记录时insert ignore into on duplicate update不存在记录时几个sql的执行情况汇总如下表:指令已存在不存在insert报错插入insert ignore忽略插入insert into on duplicate key update更新插入insert ignoreinto on dupli

2021-02-28 23:10:25 460

原创 Cannot modify session.sql_log_bin inside a transaction

目录问题解决方案参考问题当主库上数据的某些变更,不希望复制到从库上时,经常会将sql_log_bin关闭,使更新操作不记录bin log。例如,在一个连接会话开始的时候,关闭sql_log_bin,接下来,这个连接上执行的更新操作都不记录bing log。为了保证,关闭sql_log_bin和更新操作,是在同一个连接上,我们会想到使用事务transaction。但在使用事务过程中,遇到如下报错:Error 1694: Cannot modify @@session.sql_log_bin ins

2021-02-28 16:23:04 1208

原创 数据库事务transaction

目录1.什么是事务?2.golang中对事务的支持开启事务执行更新操作提交回滚例子3.参考1.什么是事务?数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。–百度百科例如,转账就是一个事务,它由两个操作组成:将款项从第一个账户划出。将款项存入第二个账户。这两个操作要不全部成功,要不全部不成功。如果第一个操作成功了,而第二个操作失败了,

2021-02-28 14:47:26 729

原创 golang 中map的并发安全

目录1.加锁的map2.使用sync.Map3.参考golang 自带的map不是并发安全的,并发读写会报错:fatal error: concurrent map read and map write一般的解决方式是加锁,控制互斥。1.加锁的map如下代码所示:package mainimport ( "fmt" "sync" "time")type Map struct { m map[int]int sync.RWMutex}fun

2021-02-27 16:26:19 1194 1

原创 golang slice的判空 和 并发安全

目录文章目录如何判断slice是否为空slice的并发如何判断slice是否为空判断slice是否为空,不能与nil进行比较做判断,因为slice有可能已初始化。而是应该使用len计算长度。例如package mainimport ( "fmt")func main() { var slice1 []int slice2 := []int{} fmt.Println("slice1 == nil:", slice1 == nil) fmt

2021-02-27 15:24:33 2087

原创 golang 中奇怪的空切片

本文中介绍一个奇怪现象,一个空列表(或切片),却可以打印出列表中的内容。以下代码中,在一个json字符串中,定义一个列表,列表中有一个空字符串。接着,将json字符串解析到结构体中,最后,打印结构体中的字符串列表。package mainimport ( "fmt" "encoding/json")type Host struct { IPList []string}func main() { b := []byte(`{"IPList": [""]

2021-02-11 21:48:29 513

原创 关于 MySQL sql_log_bin

当前会话 是否记录 bin log默认值onSET sql_log_bin = {OFF|ON}关闭,主库服务器上的改动不记录bin log,可以不复制到从库全局的sql_log_bin是只读的,不能修改。如果是基于GTID复制,当关闭sql_log_bin后,任何修改,不会有GTID,也不会记录到bin log。下面做下测试:首先查看log file, log pos, 以及 gtid set:>show master status;+------------------+---

2021-02-09 19:24:32 3921 4

原创 MySQL read_only 与 super_read_only 之间的关系

read_only 表示是否允许普通用户写入。如果为on,表示禁止普通用户写入。super_read_only 表示是否禁止超级用户写入,包括普通用户,即针对所有用户。默认关闭。如果打开 super_read_only,则read_only会自动打开。如果关闭 read_only,则 super_read_only 会自动关闭。下面做下测试。super_read_only = 0, read_only=0查看当前值:>select @@super_read_only, @@read_o

2021-02-08 23:14:08 4423

原创 2020年度总结

目录工作读书生活展望用一百分总结这一年,可以给自己打90分。工作这一年从头到尾,工作节奏都很快。需求列表的长度持续增加。经常加班,身体都感觉有点吃不消。年初,突如其来的疫情,只能在家远程办公。每天下来,除了做饭时间,几乎都是坐在办公桌前,一刻不停的看着电脑、敲着键盘。由于家里的座椅条件不理想,几周下来,腰椎开始疼痛。上半年,首先是报表的开发。从需求沟通,到数据表设计,再到后端开发,最后与前端联调。这其中的每个环节对我来说都是挑战。一方面,工作量大,例如数据表有十几个,后端API有二十几个,

2021-01-24 13:47:08 290

原创 golang 单元测试覆盖率

目录单元测试覆盖率示例代码执行单元测试查看具体的测试覆盖情况参考单元测试是代码质量的重要保证,测试覆盖率是关键的衡量指标。在golang 中,通过go test 进行单元测试,并可以分析覆盖率。单元测试覆盖率示例代码首先看下示例代码。新建目录utils,目录有以下文件 lltotal 16-rw-r--r-- 1 lanyang staff 132B 12 31 21:09 add_hint.go-rw-r--r-- 1 lanyang staff 360B 12 31

2021-01-02 22:26:41 3422 1

原创 go 单元测试—只执行指定的单元测试函数

本文介绍go单元测试中,如何执行指定的单元测试函数。首先看下示例代码。新建目录utils,目录有以下文件 lltotal 16-rw-r--r-- 1 lanyang staff 132B 12 31 21:09 add_hint.go-rw-r--r-- 1 lanyang staff 360B 12 31 21:09 add_hint_test.goadd_hint.go 文件内容如下:package utilsfunc AddPrefix(s string) st

2020-12-31 21:44:21 5097 1

原创 mysql general log使用介绍

目录文章目录1.修改变量2.修改配置文件general log 是MySQL 日志的一种,它会记录MySQL执行的每条SQL,非常详细。但对MySQL性能有影响,为了性能考虑,一般general log不会开启,除非排查问题。开启general log有两种方式。1.修改变量这种方式,修改后,会立即生效。重启mysql服务后,会失效。如果需要永久生效,需要修改配置文件,见第二种方式。查看当前状态>show variables like 'general%';+-----------

2020-12-05 21:27:45 1206

原创 是否可以根据GTID 选出日志最新的实例

目录关于 gtid_executed关于purged GTID日志最新的判断首先看下,GTID 是什么。GTID(global transaction identifier),是全局事务标识,它具有唯一性,一个事务对应一个GTID。一个GTID在一个服务器上只执行一次。GTID表示方式:server_uuid:sequence number。例如,2a264578-f8ec-11ea-bce4-0a580a301853:23前面是server_uuid,后面是一个序列号。server_uu

2020-11-28 23:16:50 183

原创 python踩坑现场,看起来一样的两个字符串,却不相等

踩坑现场是这样的:首先定义两个字符串变量,在代码拷贝粘贴过程中,又重新定义其他的中间变量,在其中一个变量的赋值表达值后面误加了一个",",结果问题就来了。。。类似如下过程:>>> a = "123">>> s1 = a>>> s2 = a,>>> s1 == s2False>>> s1'123'>>> s2('123',)s2的定义中,s2=a,此时s2已经是一个元组,而不是

2020-11-22 10:24:47 2271

原创 sql case when的使用

目录例子1例子2例子3最近在sql使用中,发现 case when 的功能相当强大。可以根据现有字段定义新的字段,可以对新字段进行排序等等。下面简单举例说明。用来测试的数据表内容如下:mysql> select * from test_student;+----+------+-----+--------+-------+| id | name | age | sex | score |+----+------+-----+--------+-------+| 19 | Joh

2020-11-15 20:57:27 503

原创 golang 匿名结构体成员,具名结构体成员,继承,组合

目录文章目录1.匿名结构体成员---继承例子1例子22.具名结构体成员--组合例子1例子23 参考本文将介绍继承、组合这些复用概念在golang中是如何体现的。在golang中,通过匿名结构体成员,可以访问匿名结构体中定义的的方法,就是所谓的实继承。通过具名结构体成员,也可以访问该结构体中定义的方法,这就是所谓的组合。1.匿名结构体成员—继承例子1结构体A1中包含匿名结构体A。定义A1的变量a1,通过a1访问A的方法。package mainimport ( "fmt")

2020-11-07 23:02:19 1655 1

原创 golang go-sql-driver/mysql基本原理

目录1.驱动注册2.打开一个database3.查询4.参考上篇文章关于golang database_sql 包讲述了 database/sql 的整体设计框架。本文简要介绍go-sql-driver的调用关系,是如何与database/sql关联起来的,包括从驱动注册到具体查询,每个步骤的底层调用。我们查询MySQL的大体代码demo如下:package mainimport ( "database/sql" "log" _ "github.co

2020-11-01 22:59:51 1649

原创 raft协议中的日志安全性

目录1.日志安全性问题2.选举限制3.当前term的日志提交4.上个term的日志提交5.参考1.日志安全性问题日志安全性是指,新选出的leader必须包含所有已提交的日志项,已经提交的日志不能因为leader变化被覆盖。在raft日志复制过程中,follower为了保持与leader一致性,follower的日志可能会被覆盖。raft是如何保证日志安全性的?raft有以下几点规则:leader只能日志追加日志,不能覆盖日志。只有leader的日志项才能被提交,follower不能接收写请

2020-10-25 22:07:02 763

原创 go get 安装 go.etcd.io etcd clientv3 报错

目录问题解决办法问题直接使用go get -u go.etcd.io/etcd/clientv3安装 go etcd clientv3会遇到如下问题:go get -u go.etcd.io/etcd/clientv3# go.etcd.io/etcd/clientv3/balancer/pickerworkspace/go_projects/src/go.etcd.io/etcd/clientv3/balancer/picker/err.go:25:9: cannot use &er

2020-10-18 13:13:32 3008 1

原创 go etcd client 简明教程

etcd是分布式强一致KV存储系统。关于etcd的介绍和使用,可以查阅上篇文章etcd入门。本文主要介绍在golang中是如何使用etcd的。安装packageetcd 官方提供了golang语言的client package go.etcd.io/etcd/clientv3。这里介绍的v3版本的使用。下载已经发布版本的source code。例如,v3.4.13 ,下载地址v3.4.13。下载后,解压到$GOPATH目录下:tar zvxf etcd-3.4.13.tar.gz -C /h

2020-10-18 13:05:03 2154 1

原创 etcd 分布式集群搭建和使用

目录1.多节点服务集群搭建启动节点1启动节点2启动节点32.使用查看节点信息集群状态键值对 读写3.参考上篇文章etcd 入门 中已经介绍了etcd基本功能,单节点服务的安装和使用。本文将介绍etcd 分布式多节点的安装、配置和使用。由于资源限制,本文以单机多节点服务为例进行阐述。在实际应用场景中,为了高可用和容灾,是需要多机器安装的。1.多节点服务集群搭建默认情况下,端口2379用于提供HTTP API服务,端口2380用于节点间通信。在单机情况下,多节点服务需要使用不同端口。三节点集群信

2020-10-11 16:03:12 1585 1

原创 etcd 入门

目录1.基本功能2.安装与配置解压缩启动etcd服务3.使用查看版本号查看集群成员信息查看集群健康状态键值对写入和读取前缀匹配查找删除租约观察者watch4.参考etcd 是一个开源的、分布式的键值对数据存储系统。etcd应用场景包括服务发现、配置中心(共享配置),以及分布式锁等。etcd 基于 go 语言实现,内部采用raft协议作为一致性算法。类似项目有zookeeper 和 consul。etcd数据模型是一个持久的、多版本并发控制模型。对于旧的数据,它会压缩存储区,丢弃最旧的版本。在应

2020-10-10 22:52:57 687 2

原创 MySQL半同步复制实践

1.主从复制原理在MySQL主从复制中,大体上有三个线程,master端有一个dump 线程,slave端有两个线程,i/o 线程和sql线程。当有数据写入后,master 端的dump线程将bin log发送到slave端的io线程,i/o线程接收后,将其存放在本地的relay log中。sql线程读取relay log,接着重复 event,更新数据。主从复制有三种方式:异步复制同步复制半同步复制其中,同步复制中,master执行一个事务后,要求所有的slave都执行完成后,才会返回

2020-10-07 23:13:29 215

原创 stop slave卡住

在MySQL主从架构集群中,如果主库发生故障,需要立刻提升一个从库为新主库。在这个过程中,有一个操作是在从库上执行stop slave停止复制的操作,一般情况下,会非常顺利。但也有特殊情况下,会遇到stop slave被卡住的问题。这样,给故障恢复过程造成了一定的困扰。本文模拟一种stop slave被卡住的情况。MySQL版本: 5.7.27-log1.模拟过程首先准备一个主从集群,具体过程参见MySQL主从集群搭建。1.1.主库数据准备mysql> create database

2020-09-26 23:37:01 1916

原创 ERROR 1193 (HY000): Unknown system variable ‘rpl_semi_sync_master_enabled‘

问题设置半同步复制变量时报错mysql> set global rpl_semi_sync_master_enabled = 0;ERROR 1193 (HY000): Unknown system variable 'rpl_semi_sync_master_enabled'或者mysql> set global rpl_semi_sync_slave_enabled = 0;ERROR 1193 (HY000): Unknown system variable 'rpl_sem

2020-09-20 21:02:46 2041

mysql-replicant-python.zip

书中使用的示例代码下载

2021-08-29

git post-update

服务器代码库工作区不更新问题解决,具体问题描述请参看 http://blog.csdn.net/lanyang123456/article/details/76378229

2017-07-30

Spreadsheet-ParseXLSX-0.16.tar.gz

该包用于解决无法找到Spreadsheet-ParseXLSX的问题,具体安装方法可参考http://blog.csdn.net/lanyang123456/article/details/41519501

2014-11-26

U盘安装XP_Win7系统指南

本文档主要讲述了如何使用U盘进行系统的安装。并针对安装系统过程遇到的问题进行了解答。希望给有需要的人一点帮助。

2014-07-12

Linux下的C++标准库

Linux下的std C++ 标准库 下载后,解压,将文件拷贝到/lib或者/usr/lib目录下,可以解决提示libstdc++。so找不到的问题

2013-06-04

sqlite嵌入式编程实例

本资源给出了linux+ARM 环境下SQLite数据库嵌入式编程实例。 详细内容请参考 Linux下SQLite数据库移植与编程 . http://blog.csdn.net/lanyang123456/article/details/7680670

2012-06-20

Linux下sqlite3编程实例

本文件给出了sqlite编程实例源码及其执行结果。其中,源码实例中包括了最常用的一些API,非常适合对于初学者学习使用。 有关SQLite安装与编程请参考下面的帖子 Linux下SQLite数据库安装操作与编程 . http://blog.csdn.net/lanyang123456/article/details/7680532

2012-06-20

Linux RS485 通信代码

本资源给出了Linux下进行RS485通信的实例代码

2012-03-20

rt5370驱动

腾达 无线USB网卡 型号:W311M 芯片类型:rt5370 该驱动是linux下针对rt5370 rt2800等芯片的驱动,可以通过交叉编译移植到嵌入式开发板。

2012-03-20

Linux系统下dhcp源码

提供Linux系统下DHCP源码下载 dhcp-3.1.1.tar.gz

2012-03-16

ndiswrapper 最新版本下载 ndiswrapper-1.57.tar.gz

ndiswrapper是Linux用于安装无线网卡驱动的一款软件。 ndiswrapper调用Windows下的驱动为Linux系统所用。

2012-03-07

Linux下使用USB转串口获取GPS数据

本文档,就linux系统下如何使用GPS设备(USB插口)读取GPS数据做了比较详细的阐述。主要介绍了如何使用USB转串口驱动,以及如何打开ttyyUSB0,如何读取数据等等。

2012-03-01

深入理解linux内核 第三版 Daniel P. Bovet &Marco Cesati 勘误

深入理解Linux内核 第三版是经典的linux内核分析的圣经,里面分析透彻,解析明了。 书中有些错误影响阅读,经过多方收集,特列出。

2011-03-07

考研数学公式大全 最全面的

最全面的公式集合,一个很好的参考工具,涵盖高数 概率论 线性代数

2009-05-23

空空如也

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

TA关注的人

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