- 博客(88)
- 收藏
- 关注
原创 Objective-C 自定义渐变色Slider
系统提供UISlider,但在开发过程中经常需要自定义,本次需求内容是实现一个拥有渐变色的滑动条,且渐变色随着手指touch的位置不同改变区域,类似如下。实现渐变效果,但是发现手指滑动的快时会有不跟手的情况。
2024-07-12 16:44:31 3732
原创 Web自动化测试——常见问题篇
所谓的自动化测试就是使用自动化工具来编写和执行测试用例,执行自动化测试套件,验证程序功能,就不需要人工的参与。自动化测试工具可以访问测试数据,控制测试的执行并将实际结果与预期结果进行比较,从而能够生成被测系统详细的测试报告。
2023-02-16 15:32:43 906 3
原创 Web自动化测试——Junit5篇
如果给定的断言通过, 测试会继续执行到下一行的代码, 如果断言失败, 对应的用例测试会立即停止或者生成错误信息( 一般打印错误信息即可) ,但是不要影响其他的用例执行。参数化是用例编写过程中非常常见的,比如在百度搜索框中输入文本,然后点击“百度一下"按钮,这样简单的操作,如果没有进行参数化,那么就会导致输入的文本的不同而写大量的类似代码,非常的不方便。这里的类型是需要在原生类型的基础上添加s的,比如 strings,ints,doubles,floats,booleans,chars…
2023-02-14 16:10:35 2198 7
原创 Web自动化测试——selenium篇(二)
文件上传的操作一般先要点击上传按钮,然后在系统中选择需要上传的文件,点击打开进行上传操作,但是 selenium 没有办法进行上传操作,所以我们可以选择使用 sendKeys() 来进行文件的上传,参数就是要上传的文件的路径+文件名称。可以使用 driver.get(“窗口链接”),也可以通过获取到新窗口的句柄(selenium对每个标签页都赋予的唯一标识),从而进行跳转活动。为了找到错误原因,除了可以查看错误日志,还可以使用错误截图,将发生错误时浏览器的状态截图下来。弹窗分普通弹窗、确认弹窗、提示弹窗。
2023-02-13 20:59:12 1046
原创 Web自动化测试——selenium篇(一)
与之相比,显示等待的优点就是针对某个元素进行等待,不需要等到所有元素都渲染好,目标元素出现就可以结束了,进一步提高测试效率,但是写法相较于前两种来说更为复杂。在元素定位失败的原因中有提到过,代码的执行速度比页面渲染的速度快,如果目标元素还没渲染出来,代码就已经执行到了,就会导致找不到目标元素,所以等待的操作是非常有必要的。click 和 submit 都可以操作按钮,不同的是,click 可以点击页面中的任何元素,但可以 click 的地方不一定可以 submit ,所以。
2023-02-12 20:19:25 1658 1
原创 海量数据小内存!只出现两次的数以及中位数怎么找
单纯的将这些无符号整数放到 HashMap 中,大概率是会爆内存的,我们可以选择将这些无符号整数分流到很多个小文件中,然后使用 HashMap 对小文件中的数出现的频率进行统计,将只出现过两次的数保存到结果文件中。那么分流的方法就是,遍历这 40 亿个无符号整数,给他们都调用一个 Hash 函数,将结果模上小文件数,就可以实现将这些数均匀的分散的分流到小文件中。根据之前的文章,我们可以知道,位图中的一个位是可以表示数有没有出现过的,比如出现过就标记为 1,始终没有出现过就一直都是 0。
2022-12-20 17:06:22 566 14
原创 海量数据小内存!从未出现过的数在哪里
一共只有 20 个字节,那么申请的 int 类型的数组最多有 4 个元素(必须是 2 的某次方),如果将提供的 9 个数分别除以 4 来确定每个数应该存在哪个范围,从而数组对应的位置值加一,比如 9,除以 4 就是 2,那么数组第 2 个值加一。比如一共有 9 个数(5,8,14,0,10,2,9,4,3),这 9 个数都在 [0,15] 这个范围内,那么至少有一个数在范围内但是不在提供的 9 个数中,只提供 20 个字节的内存,请找出一个没有出现过的数。来表示对应的元素是否存在的。
2022-12-19 17:51:55 480 3
原创 关于树形dp问题的解决
从二叉树的某个节点 X 触发,可以向上走,也可以像下走,但是途经的节点不可重复经过,到达另一个节点 Y 时路径上的节点个数被认为是节点 X 到节点 Y 的距离(包含节点 X、Y),那么二叉树任何两个节点之间都会有距离,求整个树上的最大距离。求得该子树是否为平衡二叉树后,需要求得该子树的高度,其高度就是左右子树高度的最大值加一,为 root 节点的父节点提供信息(如果此时的 root 节点并不是题目提供的树的头结点的话)派对的快乐值就是参加派对的员工的快乐值的累加。
2022-12-17 16:34:04 598 2
原创 滑动窗口的最大值【滑动窗口问题】
接下来滑动窗口就要向右开始滑动了,L 和 R 都要向右开始移动一格,下标 0 过期了,如果队首是下标 0,那就该出队列了,如果不是,那无事发生。此时,2 下标的对应的值 5,比 1 下标对应的值 3 大,因此下标 1 从队尾弹出,下标 0 也是如此,遵守这样的规定,依次遍历。终于,R >= size - 1,表示窗口正式形成了,此时队首的下标对应的元素就是当前窗口的最大值,添加到返回列表当中。,双端队列,顾名思义,就是一个队列,并且在该队列中元素可以从队尾添加删除获取,也可以从队头添加删除获取。
2022-12-16 16:14:31 992 4
原创 最长回文子串问题(Manacher算法)
如上图的字符串 str,"cabbac"是一个回文串,字符串长度为偶数,关于一条虚轴对称,"abbacabba"也是一个回文串,字符串长度为奇数,关于字符 ‘c’ 对称。,因为特殊字符相当于是一个虚轴的存在,辅助功能,不管算哪个位置的回文子串,特殊字符只可能和特殊字符进行比对,所以不会对原来的字符比对有影响,自然也不会影响到最后的结果。不难想到,求回文子串,我们会让每个字符以其为中心,向两边扩散,如果字符两端的字符相等并且没有超过字符串长度限制就扩,条件不成立了就表示求出了以该字符为中心的回文子串。
2022-12-15 21:38:04 723 3
原创 字符串匹配问题(KMP算法)
首先分析匹配过程(KMP 方法),在整个匹配过程中,str1 中的 x 变量是不会回退的(str1 不动),而 str2 中的 y 变量在匹配失败时是会向左回退的(相当于将 str2 向右推),直到在滑动的过程中匹配成功,循环结束,或者滑到最右,仍然匹配失败,循环结束。发现 x 位置和 y 位置上的字符仍然不一样,这个时候的已匹配前缀为 “a”,该字符串的最长前缀(后缀)可匹配子串不存在了,长度为 0,那么将 y 移动到 str2 的 0 下标上,x 位置和 y 位置的字符继续进行比较。
2022-12-13 11:31:56 584 7
原创 字符串匹配算法(BF&RK)
例如 “abbc”,“abb” 的哈希值是 5(旧的哈希值),下一个要计算哈希值的字符串是 “bbc”,实际上就是在原来的字符串中减掉字符 ‘a’,加上字符 ‘c’,所以新的哈希值就是 7(5 - 1 + 3)3)str2 向后移动一格,对应到的 str1 的字符串 "abb"的 hashcode 为 5,相等,进行精确比较,“abb”.equals(“abb”),返回 true,匹配成功,返回 2。如果 str1 的长度为 N,str2 的长度为 M,那么最坏情况下,时间复杂度为。
2022-12-12 16:39:33 821 5
原创 【图】深度优先遍历 & 广度优先遍历
以此类推,我们将遍历与顶点 2、3、4相邻的未遍历过的顶点,将其添加到队列中。4)以此类推,接下来就会出栈顶点 9、8、1,回溯到顶点 0,走顶点 3这条支路,直到遍历完所有的顶点。的过程,深度搜索,走到尽头再不断回退找其他可行的支路,遍历的方式有点像二叉树的前中后序遍历。的过程,一层一层的由内而外扩张,遍历的方式有点像二叉树的层序遍历(自上而下)4)最后,将遍历与顶点 8、10、5、6相邻的未遍历过的顶点,依次出队入队。2)弹出顶点 0 ,将其附近的顶点1、2、3、4依次遍历放入队列中。
2022-12-10 09:11:16 1639 8
原创 【图】认识与表达
地图上有很多的建筑,每个建筑之间有着四通八达的道路连接着,如果想要使用数据结构来表示建筑和建筑之间的道路,就应该选择图。树是由节点构成的,存在一对多的关系,并且节点之间有着父节点、子节点的划分。图是比树结构更加复杂的数据结构树里面的节点放在图中指的是顶点,是图中最基本的单元,存在着多对多的关系,顶点之间都是平等的,没有父顶点、子顶点这样的说法连接各个顶点的是边,对于带权图来说,边并不是一样的,有各自的权重,就像是城市之间的道路有各自的长短一样。并且边是存在方向的,对于有向图来说,顶点A能够到达顶点B,但是顶
2022-12-07 19:55:54 460 5
原创 N皇后问题详解
此时的 pos 值有 5 个 1,代表只有这 5 列还可以放皇后,通过 pos & (~pos + 1) 就可以求的最右侧的 1的权值(lastOneIndex),将皇后放到此处,pos 减去权值,直到 pos 为 0 说明 5 个放皇后的地方都尝试过了,累加摆放数。在第 i 行寻找放皇后的位置时,将会依次从第 0 列尝试到第 n-1 列,尝试着将皇后放在坐标 (i,j)上,如果 set1 中没有包含 j,set2 中没有包含 i+j,set3 中没有包含 i-j,皇后放置成功。
2022-12-01 10:22:27 5198 6
原创 如何对测试进行划分(一)
对于 WEB 来说,不同的浏览器,不同的版本,已经使用浏览器的电脑的品牌和型号。遇见这样的问题,如果毫无章法的想到什么说什么,最后非常有可能遗漏很多的测试用例,并且说的测试用例还可能重复或者不确定之前是否说过这条测试用例。对于一个软件来说,安装和卸载是非常重要的,如果软件都没有办法进行成功的安装和卸载,那该软件就是非常失败的。即 U I 测试,界面是用户和软件进行交互的桥梁,界面设计的好坏,决定了用户对软件的第一印象。可靠性使得是软件正常运行的能力,软件正常运行的时间和总体运行的时间的百分比。
2022-11-28 20:13:24 325 4
原创 快速掌握 MyBatis 框架(二)
快速掌握 MyBatis 框架(一)1.2 实体类1.3 MyBatisX 插件在写 MyBatis 代码的时候有一个非常好用的插件——。选择 File->Settings ,然后进行如下操作进行插件的安装该插件可以实现接口代码和对应的 XML 文件中的代码的跳转而且写好一个 接口方法后可以在对应的 XML 文件中自动生成代码(出现红下划线,Alt+Enter,选择第一个选项),当然,这样的方式生成的标签不一定是我们想要的为了查看写好的 SQL ,可以在配置文件中进行配置,如此,在控制台就可以查
2022-06-28 12:04:43 880 19
原创 快速掌握 MyBatis 框架(一)
,去除了 JDBC 代码的繁琐操作过程,通过使用简单的 XML或注解、接口、映射原始类型操作数据库。简单来说,。,这种模式解决了面向对象与关系的数据库存在互不匹配的现象的技术。它是连接数据库的桥梁,只要提供了持久化类与表的映射关系,该框架在运行的时候就能够参照映射文件的信息,将对象持久化到数据库中。简单来说,。当接收到前端发送过来的请求,后端往往需要通过程序去访问数据库,然后获取到数据返回给前端。所以说,对于后端程序员来说,程序主要由以及这两大部分组成,缺一不可。在之前的时候,我们可能已经学习过 JDBC
2022-06-26 11:44:01 937 21
原创 Spring MVC框架看这篇就够了
Spring MVC 全称 “Spring Web MVC” 是一个构建的原始 ,从一开始就包含在 Spring 框架中Web 框架在之前学习 Servlet 的时候就已经接触到 Web 。所谓的 Web 框架,就是当用户输入一个 URL 地址后,将 URL 地址和程序进行映射,然后通过程序获取到用户的请求,经过请求的处理后,服务器发送的响应能够返回到客户端,将结果展示给用户Servlet API有关 Servlet API 的介绍文章MVC 含义MVC 是一种软件工程中的一种软件架构模式,将软件系统分成了
2022-06-23 17:19:39 1352 23
原创 Spring Boot 中的日志
除此之外,日志还有其他作用:在此之前也许会经常使用 System.out.println 来作为日志打印信息,看程序运行到何处出现了问题,但是该方法所包含的信息太少,没有办法将信息持久化,没有办法控制日志等级从而进行信息的过滤…通过本节将介绍真正的高效日志的输出与存储日志等级的划分方便了程序员对信息的筛选trace 和 debug 这两种日志一般使用来记录系统运行状态,通过该日志,我们可以查看操纵的每一步执行的详细过程info 这种日志用来记录系统正常运行状态,比如系统初始化,请求成功执行…warn 这种日
2022-06-21 11:58:56 3142 24
原创 Spring Boot 配置文件
配置文件的作用就是比如启动一个项目,默认情况下 Tomcat 会占用 8080 端口,但是有些时候会因为 8080 端口已经被占用了,导致启动项目失败,解决办法要么是先查到占用端口的进程,然后从任务管理器中关闭进程,要么就是就重新设置端口号,然而一般的重置端口号的过程并不方便。但是在配置文件中只要写一句 server.port=XXXX,启动项目,就可以发现端口号已经被改成 XXXX ,方便的很还有、等信息、等等Spring Boot 常用的配置文件的格式有两种:这两种配置文件的格式是可以同时存在于一个项目
2022-06-19 15:51:18 800 18
原创 初识 Spring Boot
如果说 Spring 的诞生就是为了简化 Java 程序的开发的,那么 。它不仅继承了 Spring 框架原有的优秀的特性,而且还通过简化配置来进一步简化 Spring 应用的整个搭建和开发过程。它还通过继承大量的框架使得依赖包的版本冲突、引用的不稳定性得到了解决,要知道在此之前的 Servlet 和 Spring 想要引入依赖,都需要去中央仓库下选择适配的版本的依赖进行引入。创建完第一个Spring Boot 项目后,我们就能深切地感受到上面写的有关于 Spring Boot 的介绍的含义。作为学生党,
2022-06-17 12:02:47 668 17
原创 Bean的作用域和生命周期
在之前学习Java基础的时候,有接触到这样的概念。一个变量并不一定在任何区域都是有效的,限定这个变量的可用性的代码范围就是该变量的作用域。但是在这里 Bean 的作用域的概念和以前所认为的作用域有所不同。接下来,将会举一个案例来讲讲什么是作用域,什么是行为模式案例概要:创建一个共有的 Bean ,使用者A和使用者B都对该 Bean 进行了使用使用者A在进行使用的时候,创建一个新的变量接收注入进来的 Bean,进行修改,将修改后的结果进行返回;使用者B 直接将注入进来的 Bean 进行返回,不进行任何操作代码
2022-06-15 12:20:21 814 24
原创 Spring 存与取的优化
通过之前的Spring初识这一节,从初始者的角度实现Spring的存与取,但是所需要的步骤是比较多的,比较臃肿,冗余指路——>初识 Spring 容器因此需要学习更加简单的Bean对象的存与取。在Spring中想要更加简单的存储和读取对象的核心就是。在之后的学习中,注解将会给写代码带来极大的便利。想要将 Bean对象更加简单的存储到 Spring 中,就是在 Spring 的配置文件(就是名字是自己起的 xml 配置文件)中设置组件 Component 的代码如上(建议使用时)在之前的较为复杂的存储 B
2022-06-13 20:35:21 631 17
原创 测试用例的编写
就是,包含(用例编号,测试概述,重要性,优先级,操作方式,前置条件…)众所周知,测试人员需要进行需求的分析,需要进行验证需求的和,保证。然后再从需求中提取出测试项,将测试项进行细细划分,提取出一个个测试点,编写成测试用例否则需求都存在问题,就没有进行测试的必要想要将测试对象的所有相关功能都进行测试,可以将页面,,一一去分析每一个测试点,确保没有遗漏(1)从界面开始进行测试就是对测试对象的外观进行测试,被测试的对象必须要符合 U I 设计稿的要求(2) 验证软件的具体功能测试软件的功能,需要有整体思维,不能光
2022-06-11 19:50:29 4955 12
原创 <测试>基础知识面试考点
(代码版本信息)开发人员需要获取对应版本的代码来重现BUG,版本的标识有利于统计和分析每一个版本的质量Web系统:APP:描述问题重现的最短步骤以用户的角度描述程序应有的行为是怎样的,可以的话写明需求的来源等以下对BUG级别的描述只是典型情况,实际中的BUG级别的划分需看公司的定义严重阻碍到测试人员的工作,系统无法正常运行,出现崩溃,操作死锁,死循环,黑屏,导致数据库数据丢失,数据库连接错误等(遇到这类情况应立即中止当前版本的测试)系统能运行,但是不稳定,继续运行下去会造成严重损失,重要的功能没有实现,或者
2022-06-08 20:52:21 454 27
原创 <测试>概念知识面试考点
文章目录一、软件测试是什么二、软件测试和软件开发的区别三、软件测试和软件开发中的调试有什么区别四、软件测试和软件测试开发有什么区别五、优秀的软件测试人员应有的素质(为啥选择软件测试)六、什么是需求七、测试用例是什么八、什么是BUG九、开发模型(五个)(1)瀑布模型(2)螺旋模型(3)增量、迭代(4)敏捷模型十、测试模型(V&W)(1)V模型(2)W模型一、软件测试是什么测试人员验证软件的功能是否满足用户的需求验证功能是否能够正常运行补充:用户包括使用软件的人、出资的甲方(购买软件的人)
2022-05-08 15:38:07 3074 33
原创 初识 Spring 容器
文章目录一、Spring 的定义和核心功能1.1 loC 容器1.2 DI二、Spring 的创建和使用2.1 创建一个 Spring 项目2.2 存储 Bean 对象2.3 获取并使用 Bean 对象2.4 程序结果2.5 补充2.5.1 ApplicationContext 和 BeanFactory 的区别2.5.2 getBean 方法的更多用法2.6 小结一、Spring 的定义和核心功能定义:Spring 是包含了众多工具方法的 loC 容器核心功能:将对象存入到 Spring 容器
2022-04-27 21:07:18 985 32
原创 面试题:垃圾回收机制(GC)
一、垃圾回收对象JVM运行时的数据区包括程序计数器、栈、堆、方法区、本地方法栈其中程序计数器、栈和本地方法栈是和线程绑定在一起的,当创建了线程,就会申请内存,当线程结束的时候,想关的内存就会被销毁。方法区主要是类对象,类加载的时候就会申请这里的内存,“类卸载”操作实际上是很少会涉及到的。因此,垃圾回收机制主要回收的对象就是堆,并且垃圾回收释放内存,实际上是在以对象为单位进行释放,因为内存的申请是以对象为单位进行申请的,当整个对象的内存都不在使用时,即没有引用指向这个对象时,就可以将其进行释放二、垃圾
2022-04-23 20:33:57 2150 38
原创 synchronized 特性与使用
文章目录一、特性1.1 互斥性(不可中断性)1.2 保证内存可见性1.3 禁止指令重排序1.4 可重入锁二、面试题:死锁2.1 一个线程,一把锁2.2 两个线程,两把锁2.3 N个线程,M把锁2.4 死锁产生条件:2.5 破解死锁三、synchronized 使用方法3.1 直接加到普通方法3.2 修饰静态方法3.3 修饰代码块一、特性1.1 互斥性(不可中断性)当进入 synchronized 修饰的代码块时,就相当于拿到了锁,叫加锁当退出 synchronized 修饰的代码块时,就相当于释
2022-04-16 12:38:43 1345 33
原创 线程安全问题分析
文章目录一、抢占式执行二、两个线程修改同一变量三、原子性四、内存可见性五、指令重排序多线程可以实现并发编程,从而提升效率。但由于多线程的调度的随机性,导致程序出现错误,这就叫做“线程不安全”。如果在多线程的条件下,程序运行的结果和单线程条件下运行的结果是一致的,那么该线程就是安全的。那么,多线程在哪些情况下会不安全呢?有如何解决这样的不安全问题呢?一、抢占式执行出现线程安全问题的根本问题就是线程的抢占式执行抢占式执行意思就是,当某个线程正在执行,在就绪队列中有一个更高优先级的任务出现了,当前任务就
2022-04-14 15:12:54 1969 22
原创 Thread 类及常用的方法
文章目录一、Thread 的常见构造方法二、Thread 的常见属性三、创建线程四、中断线程五、线程等待六、获取线程引用七、线程休眠八、线程状态一、Thread 的常见构造方法方法说明Thread()创建线程对象Thread(Runnable target)使用 Runnable 对象创建线程对象Thread(String name)创建线程对象并命名Thread(Runnable target,String name)使用 Runnable 对象创建线程对
2022-04-10 14:29:57 3134 31
原创 线程介绍与创建
文章目录一、线程的出现二、进程与线程的概念三、创建线程四、面试题:run方法和 start 方法五、多线程并发编程的优势为什么要使用并发编程呢?并发编程可以提高多核 CPU 的使用效率。提升访问 I/O 时的 CPU 的利用率,让等待 I/O 的时间能够做一些其他的工作。比如,当某一个进程要在网上下载一些东西的时候,就会处于阻塞状态,使用并发编程, CPU 就不会再给该进程分配时间,其他的进程可以不熟任何影响的获取到 CPU 的时间多进程编程虽然可以实现并发编程,但是 CPU 是以
2022-04-08 12:59:30 2786 23
原创 操作系统中的进程
文章目录一、操作系统的基本定位二、操作系统中的进程2.1 进程管理2.2 进程属性2.3 并行和并发2.4 进程的独立性2.5 进程间通信操作系统是计算机中最重要的软件,常见的操作系统有 Windows ,Linux ,iOS,Android等等一、操作系统的基本定位基本功能 :管理计算机中的各种硬件设备给计算机上的各种软件资源提供稳定的运行环境在计算机中操作系统处于的位置如下图:比如,写一个简单的 Java 代码 System.out.println(“hello world”);
2022-04-06 18:43:30 2571 27
原创 如何在云服务器上部署程序
文章目录步骤一、安装JDK步骤二、安装 Tomcat步骤三、安装MySQL步骤四、部署程序最近写好了一个新的入门项目——博客系统,想要让别人也能访问到我写的网站,最便利的方法就是,买一个云服务器,云服务器有一个唯一的外网IP,接下来就来详细介绍一下,如何将程序部署到云服务器上步骤一、安装JDK通过 yum 包管理器进行安装,yum 的作用相当于手机上的应用商店yum 主要的操作:yum list | grep [软件包关键字] 功能:查看软件包列表yum install [软件包名
2022-04-04 12:28:26 7459 27
原创 Linux 必会的高频操作
文章目录一、ls权限二、cd三、pwd四、touch五、catXshell无法显示汉字六、mkdir七、rm八、mv九、cp十、less十一、vim十二、date十三、ps十四、netstat十五、man本博客中将使用 Xshell 这个终端工具来进行 Linux 的相关操作连接上云服务器后,看见这样的提示便算连接成功,接下来就在此处来进行相关操作的练习Linux的命令操作大部分都是小写英文单词常用快捷键:ctrl + l :清屏ctrl + insert:复制shift + insert:
2022-04-02 10:57:48 6131 40
原创 刷题集:美国节日
文章目录一、题目介绍二、思路概况三、详细过程四、代码书写牛客链接:美国节日一、题目介绍和中国的节日不同,美国的节假日通常是选择某个月的第几个星期几这种形式,因此每一年的放假日期都不相同。具体规则如下:1月1日:元旦1月的第三个星期一:马丁·路德·金纪念日2月的第三个星期一:总统节5月的最后一个星期一:阵亡将士纪念日7月4日:美国国庆9月的第一个星期一:劳动节11月的第四个星期四:感恩节12月25日:圣诞节现在给出一个年份,请你帮忙生成当年节日的日期。输入描述:输入包含多组数
2022-03-31 14:25:47 925 18
原创 模板引擎认识
文章目录一、服务器渲染VS客户端渲染二、服务器版简易猜数字游戏2.1 无模板引擎2.2 模板引擎应用(猜数字)三、Thymeleaf 模板语法一、服务器渲染VS客户端渲染服务器生成动态页面有两种方式:服务器渲染和客户端渲染服务器渲染特点:服务器会向客户端返回一个完整的 html 页面html 中的一些会动态变化的数据通过“模板引擎”的方式进行动态替换优点:前后端交互的次数少,一次 HTTP请求/响应就可以获取到一个完整的 html 文件,效率高缺点:前后端代码无法充分
2022-03-28 12:56:59 1493 22
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人