自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

XAVI的博客

Android小学生

  • 博客(159)
  • 资源 (3)
  • 收藏
  • 关注

原创 Android开发利器之Data Binding Compiler V2,databind和livedata的结合 (2)
原力计划

Data Binding Compiler V2我们要说的主角就是,Data Binding Compiler V2 。什么是Data Binding Compiler呢?Data Binding Compiler是Data Binding的编译器,它的主要作用就是编译出我们在使用Data Binding时需要使用的辅助代码。例如:ActivityxxxBinding格式的类文件就是由Dat...

2020-04-20 17:01:00 4854 2

原创 Android Studio3.6.1设置Gradle Offline Mode的方法

Android Studio3.6.1设置Gradle Offline Mode的方法Android Studio 3.6正式版已经发布https://android-developers.googleblog.com/2020/02/android-studio-36.html增加了新功能的同时,对原有功能有一些调整。例如 3.5 我们可以这样设置Gradle的Offline:3.6 ...

2020-04-04 15:03:36 6472 1

原创 OkHttp 源码解析(一)设计模式层面

分析原因最近被问到okhttp 在性能上面 和 HttpUrlConnection ,volley 等框架有什么优势,回答不上来,其实之前看过 okhttp源码,一知半解,也没有做记录,现在知道后悔了OkHttp 使用方式OkHttp官网地址:http://square.github.io/okhttp/OkHttp GitHub地址:https://github.com/square/o...

2020-02-21 10:19:52 4896 4

原创 Android measureSpec 怎么通过位运算 把两个值 放到一个int变量中

都知道 measureSpec 分为 mode 和sizemode 占2位,size占30位,组成一个 32位 的int 类型两个值 放到一个int 变量中的愿意是 view 会频繁测量 ,这样可以节省 内存空间mode 有三种/** * Measure specification mode: The parent has not imposed any constraint * on the child. It can be whatever size it w

2020-10-29 22:38:14 136

原创 kotlin 学习笔记之 在 Kotlin 中调用 Java 代码(一)

Kotlin 在设计时就考虑了 Java 互操作性。可以从 Kotlin 中自然地调用现存的 Java 代码,并且在 Java 代码中也可以很顺利地调用 Kotlin 代码。在本节中我们会介绍从 Kotlin 中调用 Java 代码的一些细节。几乎所有 Java 代码都可以使用而没有任何问题:import java.util.*fun demo(source: List<Int>) { val list = ArrayList<Int>() // “for”-

2020-10-24 17:37:04 184 1

原创 使用 adb命令 写出抓取log 的小工具

ADB简介:ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。安卓调试桥 (Android Debug Bridge, adb),是一种可以用来操作手机设备或模拟器的命令行工具。它存在于 sdk/platform-tools 目录下。虽然现在 Android Studio 已经将大部分 ADB 命令以图形化的形式实现了,但是了解一下还是有必要的。是Android 开发必备小技能Android studi

2020-10-22 19:29:13 242

原创 kotlin 学习笔记之 函数的使用(一)

函数函数声明Kotlin 中的函数使用 fun 关键字声明:fun double(x: Int): Int { return 2 * x}函数用法调用函数使用传统的方法:val result = double(2)调用成员函数使用点表示法:Stream().read() // 创建类 Stream 实例并调用 read()参数函数参数使用 Pascal 表示法定义,即 name: type。参数用逗号隔开。 每个参数必须有显式类型:fun powerOf(number:

2020-10-21 14:39:56 147

原创 kotlin 学习笔记之 密封类

密封类用来表示受限的类继承结构:当一个值为有限几种的类型、而不能有任何其他类型时。在某种意义上,他们是枚举类的扩展:枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封类的一个子类可以有可包含状态的多个实例。要声明一个密封类,需要在类名前面添加 sealed 修饰符。虽然密封类也可以有子类,但是所有子类都必须在与密封类自身相同的文件中声明。(在 Kotlin 1.1 之前, 该规则更加严格:子类必须嵌套在密封类声明的内部)。sealed class Exprdata class Const

2020-10-21 10:27:31 166

原创 kotlin 学习笔记之 嵌套类与内部类

嵌套类与内部类类可以嵌套在其他类中:class Outer { private val bar: Int = 1 class Nested { fun foo() = 2 }}val demo = Outer.Nested().foo() // == 2内部类标记为 inner 的嵌套类能够访问其外部类的成员。内部类会带有一个对外部类的对象的引用:class Outer { private val bar: Int = 1 inner

2020-10-21 10:12:53 157 1

原创 kotlin 学习笔记之 函数式(SAM)接口

函数式(SAM)接口只有一个抽象方法的接口称为函数式接口或 SAM(单一抽象方法)接口。函数式接口可以有多个非抽象成员,但只能有一个抽象成员。可以用 fun 修饰符在 Kotlin 中声明一个函数式接口。fun interface KRunnable { fun invoke()}SAM 转换对于函数式接口,可以通过 lambda 表达式实现 SAM 转换,从而使代码更简洁、更有可读性。使用 lambda 表达式可以替代手动创建实现函数式接口的类。 通过 SAM 转换, Kotlin

2020-10-21 09:47:26 284

原创 kotlin 学习笔记之 作用域函数

作用域函数Kotlin 标准库包含几个函数,它们的唯一目的是在对象的上下文中执行代码块。当对一个对象调用这样的函数并提供一个 lambda 表达式时,它会形成一个临时作用域。在此作用域中,可以访问该对象而无需其名称。这些函数称为作用域函数。共有以下五种:let、run、with、apply 以及 also。这些函数基本上做了同样的事情:在一个对象上执行一个代码块。不同的是这个对象在块中如何使用,以及整个表达式的结果是什么。下面是作用域函数的典型用法:data class Person(var nam

2020-09-15 10:16:27 330

原创 kotlin 学习笔记之 This 表达式

This 表达式为了表示当前的 接收者 我们使用 this 表达式:在类的成员中,this 指的是该类的当前对象。在扩展函数或者带有接收者的函数字面值中, this 表示在点左侧传递的 接收者 参数。如果 this 没有限定符,它指的是最内层的包含它的作用域。要引用其他作用域中的 this,请使用 标签限定符:限定的 this要访问来自外部作用域的this(一个类 或者扩展函数, 或者带标签的带有接收者的函数字面值)我们使用this@label,其中 @label 是一个代指 this 来源

2020-09-10 17:54:05 335

原创 kotlin 学习笔记之 解构声明

解构声明结构应该是参考 es6 的特性吧有时把一个对象 解构 成很多变量会很方便,例如:val (name, age) = person这种语法称为 解构声明 。一个解构声明同时创建多个变量。 我们已经声明了两个新变量: name 和 age,并且可以独立使用它们:println(name)println(age)一个解构声明会被编译成以下代码:val name = person.component1()val age = person.component2()其中的 compon

2020-09-10 11:44:17 341

原创 kotlin 学习笔记之 集合-写操作

集合写操作可变集合支持更改集合内容的操作,例如添加或删除元素。 在此页面上,我们将描述实现 MutableCollection 的所有写操作。 有关 List 与 Map 可用的更多特定操作,请分别参见 List 相关操作与 Map 相关操作。添加元素要将单个元素添加到列表或集合,请使用 add() 函数。指定的对象将添加到集合的末尾。val numbers = mutableListOf(1, 2, 3, 4)numbers.add(5)println(numbers)addAll() 将

2020-08-27 18:06:04 281

原创 kotlin 学习笔记之 集合-取单个元素

取单个元素Kotlin 集合提供了一套从集合中检索单个元素的函数。 此页面描述的函数适用于 list 和 set。正如 list 的定义所言,list 是有序集合。 因此,list 中的每个元素都有其位置可供你引用。 除了此页面上描述的函数外,list 还提供了更广泛的一套方法去按索引检索和搜索元素。 有关更多详细信息,请参见 List 相关操作。反过来,从定义来看,set 并不是有序集合。 但是,Kotlin 中的 Set 按某些顺序存储元素。 这些可以是插入顺序(在 LinkedHashSet 中

2020-08-26 15:21:16 374

原创 java 怎么使用 设计模式对业务进行解耦(一)

最近非常头疼 ,到新公司碰到了 非常没有经验的产品,感觉产品经理和说相声一样,门槛很低,进了门才发现 楼梯在门里面,一层比一层难爬我是做Android开发的,目前还是使用java 作为开发语言,所以以java为例,归纳一下我的java 使用经验移动端的社交分享功能大家应该都用过,有一些公司早就 提供了免费的社交分享集成SDK,比如友盟,shareSdk为什么 已经有了 集成好的sdk 还会头疼呢,因为产品在 一个简单的分享功能上强行制造了 非常多逻辑分支,思维导图如下(还是我 为了抽象代码自己画的,产

2020-07-29 17:31:16 1323 1

原创 kotlin 学习之 委托

委托属性有一些常见的属性类型,虽然我们可以在每次需要的时候手动实现它们, 但是如果能够为大家把他们只实现一次并放入一个库会更好。例如包括:延迟属性(lazy properties): 其值只在首次访问时计算;可观察属性(observable properties): 监听器会收到有关此属性变更的通知;把多个属性储存在一个映射(map)中,而不是每个存在单独的字段中。为了涵盖这些(以及其他)情况,Kotlin 支持 委托属性:class Example { var p: String

2020-07-23 14:02:11 2242

原创 kotlin 学习笔记之 内联类

内联类内联类仅在 Kotlin 1.3 之后版本可用,目前还是实验性的。关于详情请参见下文有时候,业务逻辑需要围绕某种类型创建包装器。然而,由于额外的堆内存分配问题,它会引入运行时的性能开销。此外,如果被包装的类型是原生类型,性能的损失是很糟糕的,因为原生类型通常在运行时就进行了大量优化,然而他们的包装器却没有得到任何特殊的处理。为了解决这类问题,Kotlin 引入了一种被称为 内联类 的特殊类,它通过在类的前面定义一个 inline 修饰符来声明:inline class Password(v

2020-07-23 10:13:39 2501

原创 kotlin 学习笔记之 类型别名

类型别名类型别名为现有类型提供替代名称。 如果类型名称太长,你可以另外引入较短的名称,并使用新的名称替代原类型名。它有助于缩短较长的泛型类型。 例如,通常缩减集合类型是很有吸引力的:typealias NodeSet = Set<Network.Node>​typealias FileTable<K> = MutableMap<K, MutableList<File>>你可以为函数类型提供另外的别名:typealias MyHandler =

2020-07-22 09:49:27 2577

原创 kotlin 学习笔记之 对象表达式与对象声明

对象表达式与对象声明有时候,我们需要创建一个对某个类做了轻微改动的类的对象,而不用为之显式声明新的子类。 Kotlin 用对象表达式和对象声明处理这种情况。对象表达式要创建一个继承自某个(或某些)类型的匿名类的对象,我们会这么写:window.addMouseListener(object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { /*……*/ } override fun mouseEntered(

2020-07-21 22:01:34 2713

原创 kotlin 学习笔记之 枚举类

枚举类枚举类的最基本的用法是实现类型安全的枚举:enum class Direction { NORTH, SOUTH, WEST, EAST}每个枚举常量都是一个对象。枚举常量用逗号分隔。初始化因为每一个枚举都是枚举类的实例,所以他们可以是这样初始化过的:enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF)}匿名类枚举常量

2020-07-21 21:10:13 2723

原创 Effective-Java 第三版中文版 84. 不要依赖线程调度器

84. 不要依赖线程调度器当许多线程可以运行时,线程调度器决定哪些线程可以运行以及运行多长时间。任何合理的操作系统都会尝试公平地做出这个决定,但是策略可能会有所不同。因此,编写良好的程序不应该依赖于此策略的细节。任何依赖线程调度器来保证正确性或性能的程序都可能是不可移植的。编写健壮、响应快、可移植程序的最佳方法是确保可运行线程的平均数量不显著大于处理器的数量。这使得线程调度器几乎没有选择:它只运行可运行线程,直到它们不再可运行为止。即使在完全不同的线程调度策略下,程序的行为也没有太大的变化。注意,可运行

2020-07-20 10:34:32 2688

原创 Effective-Java 第三版中文版 83. 明智审慎的使用延迟初始化

83. 明智审慎的使用延迟初始化延迟初始化是延迟字段的初始化,直到需要它的值。如果不需要该值,则不会初始化字段。这种技术既适用于静态字段,也适用于实例字段。虽然延迟初始化主要是一种优化,但是它也可以用于破坏类中的有害循环和实例初始化 [Bloch05, Puzzle 51]。与大多数优化一样,延迟初始化的最佳建议是「除非需要,否则不要这样做」(详见第 67 条)。延迟初始化是一把双刃剑。它降低了初始化类或创建实例的成本,代价是增加了访问延迟初始化字段的成本。根据这些字段中最终需要初始化的部分、初始化它们

2020-07-20 10:33:41 2679

原创 Windows下Jmeter压测端口占用问题

转载 李亚飞 大佬的文章:https://www.lyafei.com/前言今天测试和我分别压测了HTTP接口,他使用的是测试专用的8核16G压测服务器,所装系统是Windows,我使用的是开发机2核4G,运行环境是 CentOS,走内网压测不存在网络瓶颈,使用相同的测试计划,我压测出来的结果并发数是他的3倍,并且他的测试结果伴有1.7%错误,查看错误发现并不是接口返回,而是Jmeter报出来的。查了一波资料,发现 Windows 环境下的端口循环回收需要消耗2~4分钟。由此猜测可能是由于 Wind.

2020-07-15 20:40:00 4004

原创 Effective-Java 第三版中文版 文档应包含线程安全属性

82. 文档应包含线程安全属性类在其方法并发使用时的行为是其与客户端约定的重要组成部分。如果你没有记录类在这一方面的行为,那么它的用户将被迫做出假设。如果这些假设是错误的,生成的程序可能缺少足够的同步(详见 78 条)或过度的同步(详见 79 条)。无论哪种情况,都可能导致严重的错误。你可能听说过,可以通过在方法的文档中查找 synchronized 修饰符来判断方法是否线程安全。这个观点有好些方面是错误的。在正常操作中,Javadoc 的输出中没有包含同步修饰符,这是有原因的。方法声明中 synchr

2020-07-15 20:35:24 3458

原创 Effective-Java 第三版中文版 81. 并发工具优于 wait 和 notify

81. 并发工具优于 wait 和 notify本书第 1 版中专门用了一个条目来说明如何正确地使用 wait 和 notify ( Bloch01,详见第 50 条) 。它提出的建议仍然有效,并且在本条目的最后也对此做了概述,但是这条建议现在远远没有之前那么重要了。这是因为几乎没有理由再使用 wait 和 notify 了。自从 Java 5 发行版本开始, Java 平台就提供了更高级的并发工具,它们可以完成以前必须在 wait 和 notify 上手写代码来完成的各项工作。 既然正确地使用 wait

2020-07-15 20:34:37 3432

转载 Piwik在代理后端获取真实IP

转载 李亚飞 大佬的文章:https://www.lyafei.com/运维前几天把piwik切换到了Nginx后端,并且服务器加了HA 代理分发,piwik主机仅负责收集数据,包括数据库读写分离,但今天看了下数据发现所有来源IP都是代理IP,因为要对接大数据组,所以抓取丢给kafka的用户ip也都是代理ip,被大数据组骚扰了两天,今天就排查了下问题。首先是服务器location / { proxy_pass http://xxxx_piwik; proxy_set_.

2020-07-09 11:29:57 4519

转载 Konga管理GUI操作

转载 李亚飞 大佬的文章:https://www.lyafei.com/Konga管理GUI简介安装之前简单介绍安装了 Konga,并且进行了账号注册和设置连接,这篇就详细讲述下 Konga 的一些页面信息和使用操作。附上:Kong 官网:https://konghq.com/Kong GitHub地址:https://github.com/kong/kongkonga GitHub地址:https://github.com/pantsel/kongaKonga操作Dashboard.

2020-07-08 10:56:32 4860

转载 Kong网关工作原理及核心概念

转载 李亚飞 大佬的文章:https://www.lyafei.com/Kong网关简介安装之前简单介绍安装了 Kong,这篇就是深入 Kong 详细讲述下它的一些工作原理、核心概念。附上:Kong 官网:https://konghq.com/Kong GitHub地址:https://github.com/kong/kongKong的工作原理Kong默认开放的端口接收客户端流量的端口,proxy 部分:8000 —— http 端口:8443 —— https 端口adm.

2020-07-08 10:32:56 5320

转载 Konga管理GUI简介安装

转载 李亚飞 大佬的文章:https://www.lyafei.com/Kong网关简介安装前文介绍了 Kong 以及如何安装,Kong 虽然很强大,但是在管理方式上比较单一只能通过 API 请求来管理,那么有没有一个GUI 界面的管理工具呢?这里就要说到 Kong 的管理 GUI Konga。Why Konga?当前 Kong 的社区版是没有 dashboard 的,但是付费的企业版是有带的,并且还有一些企业版才能使用的插件以及升级后的企业版插件。所以对于使用社区版的用户而言,排除自己去撸一个.

2020-07-08 10:24:59 4881

转载 Kong网关简介安装

转载 李亚飞 大佬的文章:https://www.lyafei.com/背景我们有批设备卖给了海外的服务商,老外请了第三方检测机构,检测设备与我们系统的安全性,结果找到了近 40+ 的安全漏洞,有很大一部分的安全漏洞提炼出来,其实可以统一解决掉,因为涉及服务和安卓组件太多,如果一个一个修改,不管是时间还是人力投入都很巨大,那快速并且改动最小的方法就是从网关上解决这些问题。网关是微服务中不可或缺的一部分,它承载了所有请求流量入口,参数验证拦截,用户权限验证等,但是除了 JAVA 的 spring c.

2020-07-08 10:15:45 4690

转载 超实用压力测试工具-ab工具

转载 李亚飞 大佬的文章:https://www.lyafei.com/前言在学习ab工具之前,我们需了解几个关于压力测试的概念 。吞吐率(Requests per second)概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。计算公式:总请求数 / 处理完成这些请求数所花费的时间,即Request per second = Complete requests / Time.

2020-07-07 11:18:03 4817

转载 Kong网关插件使用

转载 李亚飞 大佬的文章:https://www.lyafei.com/授权验证在接口请求中权限验证是一个恒久不变的话题,Kong 自带了6种加密方式先创建一个 Basic Auth,直接确认即可此时页面访问 http://dev.lyafei.com:8000/dev 会弹出登录框,让你输入用户名密码,若取消则会返回{“message”:“Unauthorized”},若输入用户名和密码后确认会返回 {“message”:“Invalid authentication credential.

2020-07-06 10:50:14 4768

转载 谈Kong网关插件

转载 李亚飞 大佬的文章:https://www.lyafei.com/今天的一个重点就是要加强对 Kong API Gateway 网关的研究,对于 Kong 网关之前写过两篇文章,今天重点谈下 Kong 网关的插件支持能力。从上面图可以看到,Kong 网关是基于 OpenResty 应用服务器,OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web.

2020-07-06 10:08:52 4915

转载 CentOS下php安装mcrypt扩展

转载 李亚飞 大佬的文章:https://www.lyafei.com/安装mcrypt先确认你的php和pecl版本[root@lyafei ~]# php -vPHP 7.2.26 (cli) (built: Dec 31 2019 17:01:19) ( NTS )Copyright (c) 1997-2018 The PHP GroupZend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies[root@lyafei .

2020-07-06 09:59:51 4805

转载 Kong插件开发向导

转载 李亚飞 大佬的文章:https://www.lyafei.com/简介前面洋洋洒洒写了那么多文章,Kong搭建、Konga搭建、Kong插件开发工具包、Lua算法实现等等,就为了这篇Kong插件开发铺垫,在进一步讨论之前,有必要再简要阐述下 Kong 是如何构建的,特别是它如何与 Nginx 集成,以及它与 Lua 脚本之间的关系。使用 lua-nginx-module 模块可以在 Nginx 中启用 Lua 脚本功能,Kong 与 OpenResty 一起发布,OpenResty 中已经包.

2020-07-04 10:29:18 4865

转载 Kafka consumer频繁reblance

转载 李亚飞 大佬的文章:https://www.lyafei.com/其实文章名可以叫 记一次线上 Kafka 问题排查,但觉得稀松平常,弄些术词显得硬核点,hhh,言归正传,线上一个 Go 服务是一组 Kafka 的消费者,在运行了很多天之后,Kafka 数据突然积压了,查看 Kafka 服务正常,查看 Go 服务也运行正常,进到 Go 服务容器内部查看日志,发现消费者的 Go 服务频繁 rebalance 并且大概率返回失败。因为我们所使用的 Kafka 分配的分区为3,所以 Go 服务 一个 .

2020-07-04 10:07:11 5225

转载 浅谈Laravel5框架的优化

浅谈Laravel5框架的优化转载 李亚飞 大佬的文章:https://www.lyafei.com/archives/14/前言Laravel是一个功能强大的框架,组件很多,代码也很庞大,它的易用方便是牺牲了性能的,即便如此它仍然是一个优秀的框架,性能一直是 Laravel 框架为人诟病的一个点,所以调优 Laravel 程序算是一个必学的技能。接下来分享一些开发的最佳实践,还有调优技巧,大家有别的建议也欢迎留言讨论。1. 配置信息缓存使用以下 Artisan 自带命令,把 config

2020-07-03 15:58:13 4796

转载 Kong的Url重写(rewrite)自定义插件

转载 李亚飞 大佬的文章:https://www.lyafei.com/archives/299/Kong的Url重写(rewrite)自定义插件昨天写了个地址重写的 Kong 自定义插件,跟大家分享下,话不多说,上代码schema.luareturn { no_consumer = true, fields = { regex = { type = "string" }, replacement = { type = "string" }, .

2020-07-03 15:40:44 5289

转载 Kong的日志记录(log)自定义插件

Kong的日志记录(log)自定义插件前天写了一个日志记录的插件,是将接口请求和返回的一些相关内容,以指定的数据格式写入到文件,方便大数据使用 Filebeat 读取,并显示在 ELK,话不多说上代码。schema.lualocal typedefs = require "kong.db.schema.typedefs"return { name = "file-log", fields = { { protocols = typedefs.protocols_http },

2020-07-03 11:55:32 5653

车载 加油app 智慧加油项目

车载 加油app,Android 系统 车载app, 智慧加油项目

2020-07-06

oushang-market.zip

车载flutter 开发,应用市场app,使用flutter 技术开发,车载app 应用市场,一种 尝试

2020-07-06

PickView-sun.zip

DatePickerPopWin pickerPopWin = new DatePickerPopWin.Builder(MainActivity.this, new DatePickerPopWin.OnDatePickedListener() { @Override public void onDatePickCompleted(int year, int month, int day, String dateDesc) { Toast.makeText(MainActivity.this, dateDesc, Toast.LENGTH_SHORT).show(); } }).textConfirm("CONFIRM") //text of confirm button .textCancel("CANCEL") //text of cancel button .btnTextSize(16) // button text size .viewTextSize(25) // pick view text size .colorCancel(Color.parseColor("#999999")) //color of cancel button .colorConfirm(Color.parseColor("#009900"))//color of confirm button .minYear(1990) //min year in loop .maxYear(2550) // max year in loop .showDayMonthYear(true) // shows like dd mm yyyy (default is false) .dateChose("2013-11-11") // date chose when init popwindow .build();

2020-05-28

空空如也

空空如也

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

TA关注的人 TA的粉丝

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