自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 收藏
  • 关注

原创 个人博客系统-测试用例+自动化测试

使用selenium4 + Junit5单元测试框架,来进行简单的自动化测试。1. 准备工作(2)创建公共类创建common包,存放公共类。首先创建CommonDriver类来获取驱动。如果代码中使用到了的操作以及使用了实现数据来源时,也可以在创建公共类。方便使用。2. 注册页面后续使用Juit中的进行执行,所以关闭驱动的方法可以单独一个类。使用注解执行。3. 登录页面4. 列表页面5. 写博客页面6. 草稿箱页面7. 文章详情页面。

2023-09-05 16:55:01 659 1

原创 性能测试—— 基础概念

带宽、运营商......,例如王者右上角提示当前网速,绿色就说明是好的,网速较差的时候就会显示红色460,我们就可以知道是网络的原因导致卡顿,而不会怪游戏本身。加入有一款软件,占用的CPU资源比较高,那么说它的性能就稍微差一些。也和电脑的资源有关:运行内存、内存/磁盘容量、CPU的占用的情况......验证系统在一定压力下验证系统的运行时间,直到系统性能出现“拐点”。验证系统再连续运行的情况下,查看系统的各项指标是否存在异常。:一起向服务器发送带有压力或者对服务有影响的操作的用户的数量。

2023-06-01 20:50:08 639 1

原创 JVM (基础概念、类加载过程、垃圾回收算法)

常量池中,每个常量都有一个编号,最开始的时候,这个敞亮的引用,也就是a,对应的是这个常量的编号(符号引用),并不是“abcd”。标记过程和标记清除过程差不多,只是在标记完后,不立马进行清除,而是将存活对象都向一端移动,将存活对象移动到一端连续的空间,最后清理掉端外剩余的内存。指无用对象(不再使用的对象)持续占有着内存,或者无用对象的内存得不到及时的释放,从而造成内存空间的浪费。的时候,会将Endn中存活的对象放到一个未使用的Survivor中,并把当前的End和正在使用的Survivor清理掉。

2023-05-29 14:26:27 1004

原创 网络原理——基础概念(端口号、分层、封装和复用)、各层协议(TCP/IP协议)(详细图解)

因此更好的方法就是,把一个大的复杂的协议,拆分成多个小的更简单的协议,每个协议仅仅只负责它那部分的工作。因为分层的原因,所以每层只看得懂它负责的数据,而我们在实际传输时(在网线中),是整个数据进行传输的。网络通信的时候,本质上传输的是 光信号 和 电信号,通过光信号 的 频率(高频率 和 低频率)电信号 的 电平(高电平 和 低电平)来表示 0 和 1。协议是 网络协议 的简称,本质上就是 “约定”(发出来的数据是啥样的格式,接收方按照对应的格式来进行解析)。要想进行有效的通信,就需要明确通信协议。

2023-05-22 21:11:55 1555

原创 自动化测试 selenium

自动化测试能够代替一小部分的手工测试,提高测试的效率。比如在回归测试时,当软件的版本不断跟新,而以前的每一个旧的版本仍然需要进行测试,如果是手工测试的话,效率会大大降低,所以我们需要借助自动化测试来进行回归测试。类似汽车的驱动一样,汽车有两轮驱动、四轮驱动,可以让那个汽车跑起来。这里的驱动是指打开浏览器。因为要使用自动化测试,人工测试要打开浏览器,自动化测试里就使用驱动来打开浏览器。我们可以通过代码来让驱动打开浏览器。

2023-05-22 21:00:53 1222

原创 测试用例+自动化测试 —— 博客系统

使用selenium4 + Junit5单元测试框架,来进行简单的自动化测试。(1)使用了注解,避免生成过多的对象,造成资源和时间的浪费。(2)通过static修饰静态变量,全局只创建了一次驱动对象,避免重复创造驱动对象造成时间的浪费。(3)使用参数化,保持用例的简介,提高了代码的可读性。(4)使用测试套件,一次执行所有我们想要运行的自动化用例。(5)使用等待(隐式等待+强制等待),提高自动化指令的稳定性,降低自动化出现误报的概率。(6)使用屏幕截图,方便问题的追溯和解决。

2023-05-22 09:21:34 894

原创 Junit 单元测试框架(简单使用)

Junit 是一个开源的Java语言的单元测试框架。如果说要实现一个灯泡,那么selenium 就是灯泡,而Juniit就是电源。

2023-05-14 18:25:37 1261

原创 测试的分类(按测试对象、是否查看代码、开发阶段、实施组织...... + 思维导图总结)

目录一、测试的分类1. 按测试对象划分2. 按照是否查看代码划分3. 按照开发阶段划分4. 按照测试实施组织划分5. 按照是否运行划分6. 按照是否手工划分7. 按照地域划分二、总结(1)界面测试 简称UI测试。包括页面上的按钮、文字、图片等的尺寸、颜色、形状、整体适配度、清晰度等等是否符合文档要求,以及是否合理美观。(2)可靠性测试 可靠性 = 正常运行时间/(正常运行时间 + 非正常运行时间)* 100% 可靠性指标一般要求达到4个或5个“9”,即99.99%或

2023-05-12 17:52:36 621

原创 设计测试用例(万能思路 + 六种设计用例方法)(详细 + 图解 + 实例)

水杯:装水、喝水...注册场景:注册 + 登录想象日常使用中的注册场景有哪些功能。等价类是分块/分区的概念。将需求的输入划分若干个等价类,从等价类中选出一个测试用例,如果这个测试用例通过,则认为这整个等价类就通过。(因果图法)通过输入条件和输出动作之间的关系,设定判定表,再根据判定表编写测试用例。通过构造正交表编写测试用例。

2023-05-11 17:35:16 9714

原创 测试 —— 基础概念、开发模型、测试模型、BUG的描述

软件测试就是验证软件产品特性是否满足用户需求。需求是满足用户期望或正式规定文档(合同、标准、规范)所具有的条件和权能,包含用户需求和软件需求。甲方提出的需求,但当没有甲方时,比如一个软件微信等,用户需求就是客户端用户使用的需求(这个软件要完成的任务),一般都比较简陋。是开发人员要实现的功能,比较详细。一般要将用户需求转为软件需求(转换的过程还要进行市场分析和可行性分析),然后又开发人员实现。(1)当软件需求文档(规格说明)是存在的并且正确的情况下,程序与文档(规格说明)之间的不匹配是错误的;

2023-05-10 19:27:13 738

原创 博客系统 —— Servlet 实现(前后端分离)(详细+整体代码+效果图)

在前端代码中,要想构造一个请求获取博客详情,就得知道当前用户点击的博客的ID,而这个ID 已经包含在当前的 blog_detail.html 页面的 url 里了。在进入博客列表页/博客详情页的时候,先检查一下用户的登录状态,如果用户当前已经是登录状态,才能继续使用。(直接在前端代码中修改)服务器上:用户点击删除按钮,就发送一个 HTTP 请求,让服务器删除指定的博客,服务器收到请求后,就将该博客从数据库中删除。在页面加载的时候,让页面通过 ajax 访问服务器,获取到数据库中的博客数据,并且填到页面中。

2023-05-09 15:25:31 2210 1

原创 上传文件 —— Servlet

上传文件也是一个常见的需求,在Servlet中也提供了支持。上传文件的时候,在前端需要用到form 表单,在 form 表单中需要使用到特殊的类型:form-data。此时提交文件的时候,浏览器就会把文件内容以 form-data 的格式构造到 HTTP 请求中,服务器就可以通过 getPart 来获取了。一个 HTTP 请求,可以一次性提交多个文件。每个文件都称为一个,每个 Part 都有一个(身份标识),服务器代码中就可以根据 name 找到对应的 Part。

2023-05-06 16:31:43 1739

原创 Cookie和Session的API、登录页面

创建会话,会创建一个 HttpSession 对象,并且生成一个 session(是一个很长的数字,通常用十六进制来表示,能够保证唯一性), 接下来就会把这个 session 作为 key,把这个 HttpSession 对象作为 value ,把这个键值对给保存到 服务器内存 的一个 “ 哈希表 ” 这样的结构中。首先先获取到请求中 cookie 里面的 session 字段(相当于会话的身份标识),判定这个 session 是否在当前服务器上存在,如果不存在,则进入创建会话逻辑。以下介绍几个核心方法。

2023-05-06 15:43:34 791

原创 实现服务器版本---表白墙(Servlet)

结合Servlet API ,实现一个服务器版本表白墙。实现的这个表白墙,就通过服务器来保存这里的消息数据,进而做到 “持久化” 存储。创建 MessageServlet类,继承自 HttpServlet,重写 doPost方法 以及 doGet方法。(因为在约定接口时,接口一规定传来的请求时 POST请求,接口儿规定传来的请求时 GET请求)

2023-05-05 20:45:58 535

原创 Servlet基础(创建、运行原理、API)

Servlet是一种实现动态页面的技术,是一组 Tomcat 提供给程序员的API (Tomcat 的 HTTP服务器给 Java 提供的一组 API),帮助程序员简单高效的开发一个 web app。

2023-05-05 14:53:16 960

原创 Http协议—请求的构造

(有时候页面跳转要加载出一个全新的页面,尤其是会有非常复杂的页面)而 ajax 能够让页面不去整个全部加载,而是只加载其中需要变化的某个小部分。但是浏览器不确定服务器啥时候才有响应,于是就先不管了,浏览器里就继续执行其他代码(该干啥干啥),等到服务器的相应回来了之后,再由浏览器通知咱们对应的 js 低吗,以回调函数的方式来处理响应。我在前台这里看一下,发现饭还没好,我就出去逛一圈,过一会再来前台这里看一眼,发现饭还没好,我再出去玩一会。我直接啥都不管了,就找个位置坐下(玩手机....),该干啥干啥。

2023-04-23 16:47:29 446

原创 (详细)HTTP协议(应用层重点协议)

空行的作用:因为在请求和响应中的报头部分,其内容里的键值对的数量是不固定的。而HTTP协议又是基于TCP协议来实现的,TCP协议是面向字节流的。因此这个空行就相当于 “报头的结束标记” 或者 “报头和正文之间的分隔符”,来解决 “粘包问题”。1.首行(方法,URL,版本号)2.请求头(header),是若干个键值对,每个键值对占一行,键和值之间使用 冒号空格 来分割3.空行,相当于请求头的结束标记4.正文(body),里面的格式取决于请求头中的 Content-Type(1)

2023-04-19 16:57:04 856

原创 《抄送列表》:过滤次要文件,优先处理重要文件

一、题目题目:抄送列表NowCoder每天要处理许多邮件,但他并不是在收件人列表中,有时候只是被抄送。他认为这些抄送的邮件重要性比自己在收件人列表里的邮件低,因此他要过滤掉这些次要的邮件,优先处理重要的邮件。现在给你一串抄送列表,请你判断目标用户是否在抄送列表中。输入有多组数据,每组数据有两行。第一行抄送列表,姓名之间用一个逗号隔开。如果姓名中包含空格或逗号,则姓名包含在双引号里。总长度不超过512个字符。第二行只包含一个姓名,是待查找的用户的名字(姓名要完全匹配)。长度不超过16个字符。

2023-04-16 11:22:56 179

原创 《年会抽奖》:无人获奖的概率

今年公司年会的奖品特别给力,但获奖的规矩却很奇葩:1. 首先,所有人员都将一张写有自己名字的字条放入抽奖箱中;2. 待所有字条加入完毕,每人从箱中取一个字条;3. 如果抽到的字条上写的就是自己的名字,那么“恭喜你,中奖了!现在告诉你参加晚会的人数,请你计算有多少概率会出现无人获奖?输入包含多组数据,每组数据包含一个正整数n(2≤n≤20)。对应每一组数据,以“xx.xx%”的格式输出发生无人获奖的概率。250.00%

2023-04-15 15:29:40 438

原创 《养兔子》:第N天会得到多少兔子

一只成熟的兔子每天能产下一胎兔子。每只小兔子的成熟期是一天。某人领养了一只小兔子,请问第N天以后,他将会得到多少只兔子。测试数据包括多组,每组一行,为整数n(1≤n≤90)。对应输出第n天有几只兔子(假设没有兔子死亡现象)。示例11212。

2023-04-14 13:25:15 66

原创 《收件人列表》:生成相应的收件人列表

NowCoder每天要给许多客户写电子邮件。正如你所知,如果一封邮件中包含多个收件人,收件人姓名之间会用一个逗号和空格隔开;如果收件人姓名也包含空格或逗号,则姓名需要用双引号包含。现在给你一组收件人姓名,请你帮他生成相应的收件人列表。输入包含多组数据。每组数据的第一行是一个整数n (1≤n≤128),表示后面有n个姓名。紧接着n行,每一行包含一个收件人的姓名。姓名长度不超过16个字符。对应每一组输入,输出一行收件人列表。

2023-04-14 13:17:56 408

原创 《客似云来》:时间范围内卖出多少份早餐

NowCoder开了一家早餐店,这家店的客人都有个奇怪的癖好:他们只要来这家店吃过一次早餐,就会每天都过来;并且,所有人在这家店吃了两天早餐后,接下来每天都会带一位新朋友一起来品尝。于是,这家店的客人从最初一个人发展成浩浩荡荡成百上千人:1、1、2、3、5……现在,NowCoder想请你帮忙统计一下,某一段时间范围那他总共卖出多少份早餐(假设每位客人只吃一份早餐)。测试数据包括多组。

2023-04-13 20:51:53 80

原创 《剪花布条》:从花布条中尽可能剪出几块小饰条

要判断 s 中有几个 t ,从前向后判断,每遇到一个 t,结果值就+1。然后再将 t 从 s 中全部切除(也包含前面的不是 t 的,因为不是 t,所以和我们的结果值就无关了,就可以切掉)。每组数据包含两个字符串s,t,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对应每组输入,输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就输出0,每个结果占一行。

2023-04-13 20:15:13 509

原创 《菲波那契凤尾》:菲波那契数列,返回最后6位

返回有格式要求,即如果斐波那锲数 的位数小于 6 位,就直接返回;如果超过了6 位,就返回最后 6 位。我们可以在初始化斐波那锲数列数组的时候就进行相应的处理,即 % 1000000。因此使用 printf 格式化输出。%d :正常输出十进制数。%Yd:十进制数,输出 Y 位。如果本身大于 Y 位,正常输出。%XYd:十进制数,输出 Y 位,不足 Y 位就补 X。如果本身大于 Y 位,正常输出。%d:十进制数正常输出。%2d:十进制数,输出 2 位。如果本身大于 2 位,正常输出。

2023-04-13 14:48:31 526

原创 《淘宝网店》:计算总收益

每组数据包含两个日期from和to (2000-01-01 ≤ from ≤ to ≤ 2999-12-31)。收益 = 2001年剩余之后的收益 + [2002,2021]全部收益 + 2022年有的收益。假设是 2001-4-5 到 2001-8-18 的收益。对应每一组数据,输出在给定的日期范围(包含开始和结束日期)内能赚多少钱。最主要的是计算两个日期之间的月份数以及判断素数的问题。to年有的收益,就是当前年月日之前的收益。的问题:闰年的2月份会多一天,所以多挣两块钱。在同一个年中,计算收益。

2023-04-12 21:33:42 866

原创 《分解因数》:质因数分解

所谓因子分解,就是把给定的正整数a,分解成若干个素数的乘积,即 a = a1 × a2 × a3 × ... × an,并且 1 < a1 ≤ a2 ≤ a3 ≤ ... ≤ an。传入的参数有两个:分隔符(要以什么符号进行拼接)、需要拼接的字符串的数组/集合...这里使用List。因为最后输出有格式要求,所以我们用 printf 格式化输出,每个输出的后面都不一样,所以用字符串进行后面的显示。对应每组数据,以“a = a1 * a2 * a3...”的形式输出因式分解后的结果。1、题目要求的输入输出。

2023-04-12 17:04:15 631 3

原创 (详细)《美国节日》:某月的第几个星期几

找到下个月的1日的星期数。题目中找5月的最后一个星期一,因此我们找到该年的 6月1日是星期几,然后将6月1日看做 5月32日。题目分析:1、给定年月日,如何知道这一天是星期几?(1)先要知道给定的年月日,距离基准值(0000-12-31)的天数天数:(y-1) + (y-1)/4 - (y-1)/100 + (y-1)/400 + 最后一年的天数最后一年的天数:经过的完整的月的天数 + d + (闰年?1:0)

2023-04-12 16:24:08 882

原创 《因子个数》:输出每个正整数的因子个数

大致思路是一直循环找因子,由题目可以知道,因子要从 2 开始判断。先判断 i 是否能被 n 整除,如果能的话,就一直除,并且更新 n 的值,因为还要判断除了当前的 i 还有哪些因子可以和 该i 相乘得到 n。例如36=2*2*3*3,即包含2和3两个因子。NowCoder最近在研究因子个数的分布规律,现在给出一系列正整数,他希望你开发一个程序输出每个正整数的因子个数。如果直接找因子的循环从 2 ~ n 的话,会不通过,显示超时。因此我们要对循环条件进行优化。对应每个整数,输出其因子个数,每个结果占一行。

2023-04-10 19:44:28 470

原创 最难的问题:把发送来的消息破译出来、并提供给你的将军

消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:消息原文中的每个字母A 都分别替换成字母F),其他字符不 变,并且消息原文的所有字母都是大写的。密码中的字母与原文中的字母对应关系如下。密码字母:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z。密码字母:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z。输入包括多组数据,每组数据一行,为收到的密文。

2023-04-10 16:23:33 394

原创 IP协议(网络层重点协议)

(有些包里面的IP地址,可能是永远也到不了的,像这样的包,不能让其在网络上无休止的转发,这样会占用太多硬件资源)因为这里最大的问题就是 IPv4和IPv6是不兼容的,对于一个设备来说,支持IPv4和IPv6需要两个截然不同的机制,而现有的大量的网络设备(路由器...)很可能都是只支持IPv4,不支持IPv6的。内网IP 只是在当前局域网中时唯一的,在不同的局域网里,可以有相同的 内网IP 的设备。现实生活中,运营商的路由器就会在这里修改IP数据报,从内网发出带有这样功能的路由器设备,也叫做 NAT设备。

2023-04-09 19:00:35 475

原创 TCP协议、UDP协议(传输层重点协议)

此时收到了 500K 的数据,如果立刻应答,返回的窗口就是 500K,但是处理端处理接收端缓冲区的速度很快,一下子就把 500K 的数据从缓冲区中取走处理了,此时接收端缓冲区的剩余大小变成了 1M,说明可以接收的数据就不止 500K 了。接收端认为连接还在,一旦接收端有写入操作,就能发现连接已经不在了,就会进行 reset。当 我的麦克风 有问题时,我问“老师你能听见我说话吗”就等不到回应了,如果又说了“老师能听到吗”后,还是没有回应,我就知道了这次通信失败了(不具备可靠传输的条件了),于是我就放弃了。

2023-04-07 18:06:03 3319

原创 Map 和 Set、搜索树(二叉排序树)、哈希表(哈希桶)(详细)

大致思路方法和上面类似,最主要的区别在于 put 方法 和 get 方法中,元素的处理方面。因此这里只写了二者不同的地方,负载因子和扩容都是一样的。1. 找到 key 的存放下标之前因为 key 是int类型,可以直接使用函数进行计算得到散列地址,但是我们这里的 key 是个泛型。就以自定义类 person 举例,并不能直接通过计算得到散列地址,因此我们要通过在person类中重写 hashCode方法来获得一个 hash 数值,然后再进行散列函数的计算得到散列地址。

2023-03-23 22:06:20 534

原创 多线程案例—— 线程池

线程池就是提前创建好了一批线程,放到一个池子中,当有任务来的时候,就从池子中去取出一个线程(就不用从系统这边申请了),去执行这个任务,执行完后又放回到池子中。而把创建好的线程放在池子里,因为这个池子就是用用户态实现的,因此把线程放到池子 / 从池子中取出线程,都是用纯粹的用户态代码实现的,不涉及内核态。因此,自己实现的线程池类中,其构造方法要进行线程的创建,以及有一个方法能将任务注册到 任务队列 中,以便让线程来执行。),执行拒绝策略(招临时员工后,也干不完,就拒绝,不接任务了)(公司内一个员工也没有)

2023-03-19 15:55:23 314

原创 多线程案例——定时器

定时器类似一个闹钟,经过指定的时间后执行要求的代码。1.描述一个任务: Runnable +time2.使用优先级队列来组织若干个任务:PriorityBlockingQueue3. 实现 schedule方法来将任务放入优先级队列中4.创建一个线程,用这个扫描线程不断获取队列的队首元素,并且判断时间是否到达5.注意:①让 MyTimerTask支持比较;②解决线程的忙等问题

2023-03-18 23:40:47 346

原创 多线程案例——阻塞队列

阻塞队列同样是一个符合先进先出的队列,相比于普通队列,阻塞队列还有其他的功能:基于上述特点的阻塞队列,我们就可以实现“(处理多线程问题的一个典型方式)生产者消费者模型:通过一个容器(阻塞队列),来解决生产者消费者之间的强耦合问题。(生产者生产商品,消费者购买商品)。

2023-03-17 18:53:47 832

原创 多线程案例——单例模式(饿汉模式和懒汉模式)

单例模式是设计模式之一,单例模式要求代码中的某个类,只能有一个实例,不能有多个。这种单例模式在开发中非常常见,例如 JDBC 中的 DataSource 这样的对象等等。和饿汉的单例模式是比较着急的去进行创建实例。懒汉的单例模式是不太着急的去创建实例,只是在用的时候才真正创建。

2023-03-14 21:03:15 511

原创 多线程——多线程安全(synchronized和volatile)、wait和notify

假设 count = 0,使用线程一和线程二同时对 count++,预期结果是 count = 2,但是如果是上述情况的话,线程一拿走 0 到他的寄存器进行计算得 1,还没将 1 返回到内存中,线程二就像 内存 中 count 的值 0 拿到了他的寄存器中,然后再进行计算得 1,最后两个线程将其寄存器的值返回到内存中 的 count,结果是 1。当一个线程还没有释放锁,然后又尝试获取锁时,会出现如下情况:第一次获取锁成功,第二次获取锁时,锁还没有被释放,则该线程就会一直处于阻塞状态,直到锁被释放。

2023-03-14 11:59:14 510 3

原创 线程的状态、状态之间的相互转换

一、线程的状态。

2023-03-13 19:35:19 476

原创 线程的创建、线程的基础方法(详细)

当进程中有多个线程时,此时每个线程都有一个PCB(在Linux 中,进程和线程也没有明显区分,线程被称为轻量级进程),一个进程就对应了一组 PCB。也可能会出现如下情况,因为这里用到了多线程,t1 线程和 t2 线程是并发运行的,所以谁先输出是不确定的。多个线程之间的调度顺序是不确定的,有时需要控制线程的执行顺序,要控制线程之间的顺序,其中一种方法就是线程等待。在如下代码中,调用 join 方法的线程是 main 线程,是针对 t 线程对象调用的,此时就是。join 操作默认情况下,是死等,不合理。

2023-03-13 15:31:07 1373

原创 七大排序(Java)

目录一、插入排序1. 直接插入排序2. 希尔排序二、选择排序1. 直接选择排序 2. 堆排序 三、交换排序1. 冒泡排序 2. 快速排序四、归并排序五、总结 抓一张牌,在有序的牌中,找到合适的位置并且插入。 代码:2. 希尔排序 插入排序的升级版本,即进行大量的分组插排。代码:二、选择排序1. 直接选择排序 找到无序区间中最小的元素的下标,然后将该元素放到无序区间的开始(有序区间的最后)。代码: 2. 堆排序 选择排序的升级版本。将无序区间维护成一个大堆(因

2023-02-27 19:21:28 461

空空如也

空空如也

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

TA关注的人

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