- 博客(104)
- 收藏
- 关注
原创 python实用系列:按顺序重命名文件
这个代码理解也很简单,就是实用os模块,获取到目标路径下面的所有文件,然后通过i这个自变量来进行文件的顺序从命名;当我同时解压两个文件之后,我发现有一些文件名重复需要我选择是否覆盖,覆盖的话就会丢失一部分文件,跳过的话文件名会显得很杂乱,因为系统给他们表的号都是后面加了一个小括号的很不统一,这样看起来就舒服多了,如果后面还有文件添加的话,只需要运行一下这个程序就可以了;好了,今天分享就到这,点个关注不迷路。
2024-05-24 23:22:53
314
原创 vue3将通用组件注册成全局组件
最主要的就是要知道如何写这个install函数,其实这个直接写在main文件里面也是一样的,只不过这里将它模块化分开了,更便于后期维护和管理;那我为什么不化简一下,或者说我就做一些封装,写一些逻辑函数,最好的就是将他们都升级为全局组件,来看看我是怎么做的。然后通过install这个函数将这些组件按照插件的注册当时升级成全局组件就可以了;咋们直接用就可以了,直接写元素都是一样的效果;这样就可以全局拿到这几个通用组件了。
2023-08-26 15:37:20
447
原创 学习bootstrap怎么样?
想必学习前端的都知道这个响应式框架,之前我接触这个框架的时候是在学习前段页面设计的进阶教程是接触的,那个时候要做那种登陆注册界面,里面的输入框很让人头疼有时候电脑的宽度不一样或者是写了一个精美的网页然后放到手机上的时候就变了模样;都是因为没做响应式导致的,因为写的是固定宽高,这个问题却在bootstrap里面解决的很好,这就是bootstrap最大的优势,于是我就硬着头皮学起了bootstrap;因为bootstrap是依赖于jquery执行的,所以在写代码的时候要引入jquery.js和bootstrap
2023-02-01 18:07:20
859
1
原创 web前端进阶<7>:3d图像翻转效果
这几天又闲着无聊,自己学的东西又有一点不牢固了,需要写一个小程序来巩固一下,相信大家也时有同感吧!那么这一期就给大家带来一个炫酷的相册3d翻转效果,如果搭上炫酷的文字和动画那肯定是高端、霸气上档次的:前面我也给大家制作过一个很常见的3d旋转相册:(168条消息) web前端进阶:<2>转换的补充、动画和小案例_编程学渣ズ的博客-CSDN博客_前端动画小案例https://blog.csdn.net/aiwanchengxu/article/details/124586701这个小案例是网上非常常见的一个小
2022-12-05 20:26:30
1888
原创 vue学习笔记:还不会上传文件,10分钟教会你使用input file上传文件
但是有一个问题,他的文件名是无法按照文件的真实名字命名的,只有一个file名字,不过这怎么可能倒各位呢?这里我的方法是使用两个请求,另一个请求里就是专门做了一个重命名文件的操作,这里就这样配置是没有问题的,注意这里的路径不一定是各位服务器上的结构,按照自己的结构写;当然我这里还有一些是用来获取MP3文件里面的详细信息的,比如作者、时长等,这里发了两个请求,可以看到两个then,一个是用发给后端来存放数据的,数据存储成功之后就发送第二个请求,将歌曲信息更新并且存入数据库;
2022-12-01 21:42:37
4331
2
原创 Android进阶:6、使用okhttp下载图片
这时候直接创建他的字节流然后转化成bitmap对象设置到imageview组件上就可以实现图片的展示了,当然如果不是发送很多请求的话也可以直接发送get请求不用封装,这里是一样的效果的,到时候拿到数据体的字节流就可以转化为bitmap对象了;同样的,发送请求只能在子线程,而更新界面需要发送消息,这里就是what=3的时候的消息,于是将这个通过网络数据构建成的bitmap设置到组件上面;无论是哪一张图片,这里是样例,也可以是其他的照片,可以使用同样的方式来显示到组件上;
2022-11-24 22:39:20
1598
原创 Android进阶:5、发送post请求、json数据格式以及okhttp框架的使用
设置完成了请求头之后就可以将数据写入到缓存,也就是获取conn的输出流,然后write我们拼接好的数据,刷新关闭流就可以了;然后让项目同步下载一下就可以使用gson这个工具了;又是通过字符串的方式来传递的,所以在网络通讯中有很大的用途;我们先要将请求方式设置为POST,然。1、发送post请求。2、Json数据格式。
2022-11-19 21:39:40
6550
原创 Linux基础教程:10、进程通讯(管道通讯)
父子之间通讯是共用一个管道,管道的两端只能进行读写操作中的一种,因此父子通讯时应该关闭父子进程中的一个文件描述符,比如在父进程中写操作,在子进程中读操作时,我们就应该使用close函数关闭父进程中的读端和子进程的写端;这样就可以通过向管道中读写数据来实现进程之间的通讯;要注意几个点,管道是需要在进程创建之前在再创建的,如果在进程之后创建管道的话顺序就乱了,管道将不会生效,而且这个半双工过程,也就说我们一次只能通信一次,要么是a向b发信息,要么就是b向a,不能ab同时,所以我这里就拿父子进程来讲解;
2022-11-19 19:22:52
433
原创 Linux基础教程:9、linux进程管理(2)
这里我们使用了一个操作,就是在创建了子进程之后,我们让其休眠2秒,之后父进程就会退出,它退出之后子进程就成了一个孤儿进程,结果就是子进程一直在运行,没有回收,而我们可以从窗口中看到没有显示原来的那个操作界面;原本会一直执行下去的父进程随着僵尸进程的产生随之就是退出了,是因为wait函数的调用,在产生了僵尸进程时候进行了处理然后打印了2099的编号,然后在没有了僵尸进程时候就执行了exit(0);原本执行的子进程到这行代码之后就跳到sy文件里面执行了,而且子进程在这个函数之后的代码都不会再执行了;
2022-11-19 19:15:31
903
原创 Linux基础教程:8、linux的进程管理(1)
这里的pid_t应该是头文件里面的宏定义,相当于int;当我们执行fork这个函数之后,就会创建一个和本线程一模一样的子线程,而且是直接执行的,所以我们要注意这个函数的使用,fork也是有返回值,这个反回值可以使0、1 、-1,分别表示的子线程、父线程、创建线程失败;不管加不加-,反正u配合起来的意思就是静态的打印当前运行的进程,为什么是静态有什么是静态,因为它不会动,我们也是可以用肉眼看出来的,这个就是一串不会动的数字,然而我们可以很容易的从这个数据中发现他们是一个表格,表头上是各种各样的进程的参数;
2022-11-11 15:38:53
252
原创 Linux基础教程:7、文件i/o操作补充
上一期我们介绍了文件的读取(read)、写入(write)和关闭(close),这一期我们在扩充几个函数:1、lseek函数这个函数跟我们的鼠标光标息息相关,他可以设置光标的起始位置,那就意味着这个函数可以决定文件复制的起始位置和写入的起始位置,同样的你可以使用man 2 lseek来查看这个函数的具体信息,这里我们就不详细说明了,我们就直接将几个重要的点提一下:这个函数的第一个参数是文件描述符,也就是前面讲到的open的返回值,代表我们要移动光标的文件,第二个参数是移动的长度,如果是负数就是往前,正
2022-11-03 11:36:45
195
原创 Android进阶:4、发送一个get网络请求
安卓也是具有网络编程这一板块的,我们先从线程通讯说起,因为安卓自4.0之后就有一个特性,就是主线程不可以发送网络请求,而子线程不可以更新界面,所以我们想要学会网络编程,必须先掌握线程之间的通讯;
2022-11-01 10:00:27
2185
原创 Linux基础教程: 6、 shell入门和文件io基本操作
linux也常常使用脚本语言,也就是shell,具有变量的无特定类型的特点,我们可以不写数据类型就可以进行定义和赋值,他的语句具有镜像的特点,比如if需要以fi结尾,case 要以esac结尾;那我们来走进shell的世界探索一番脚本语言的语法:shell定义变量也是和C语言一样需要遵循规则的,比如一些不可以用作变量名的字符:标点符号、纯数字、关键字;变量名 = 值$变量名C语言里面如果我们想要引用变量的时候直接写变量名叫就可以了,但是在shell中我们必须要加上$才行;
2022-11-01 09:42:24
389
原创 Linux基础教程:5、shell入门前的准备
同样,举一反三,我们如果是ll命令也好,其他具有输出功能的命令也好,都是将结果输出到后面的文件中;这里实现的就是将cat出来的内容作为grep的抓取对象,可以很明显的看到这里输入了一条带有init的记录,其实就是/etc/passwd中的一条记录;这个语句是有判断能力的,只有前面一条语句执行成功之后才会执行后面的,可以看到我们执行ll成功之后还会执行ls,但是执行s失败之后就不会再执行ls了;输入文件的标号是0,也就是0代表着标准输入,默认的是键盘,在命令执行的时候读取输入文件的数据;
2022-10-27 11:40:35
402
原创 Linux基础教程: 4、用户组和用户的创建
第一个是组名,第二个是密码位,第三个是组id;在Linux系统中有三大用户,分别是超级用户、普通用户和系统用户,他们拥有者各自的权限和各自的组,而在用户组中,有又基本组和附加组,一个用户只有一个基本组,但是可以从属于多个附加组,这一节,我们来学习如何创建一个用户和如何更改该用户的分组;他们其实是一串8进制数,也就是每三个没一组,rwx分别对应的数值是421,所以以后我们遇到对应的权限的数字需要知道这个文件拥有的是那些权限,可读对应的是4 ,可写是2,可执行为1;,也就是我们之前创建用户时自动创建的文件夹;
2022-10-27 11:02:04
18747
2
原创 Android进阶 3、商品列表展示案例(2)
这里大家可能会有点不懂,为什么查询到的数据要放到accountlist中去,然后让页面显示,因为啊,我们accountlist只是一个中间容器,适配器中的数据全部是来自于这个容器的,我们搜索数据放到这里面去当然是为了让用户看到啊,毕竟我们设置适配器的数据源就是accountlist,删除还是比较好做的,毕竟之前也做过这个,而且没有布局,就是弹出一个对话框,然后两个选项按钮就可以了,没有啥可说的,就是我们都是根据的传过来的实体类account获取到对应的数据进行操作的;布局也简单,一个线性两个编辑框就搞定;
2022-10-21 15:15:54
1450
原创 Linux基础教程:3、gdb调试工具的使用
如果想要一个程序可以让我们调试,我们需要让这个程序具备调试的信息,如果让编译文件具有调试信息呢?1)、b 行号 : 在行号前面打一个断点(这个行号就是使用l 命令看到的行号);这里可以看到我们打的所有断点的信息,包括编号为2的条件断点1 == 4;条件断点也是非常常用的,我们的以设置在变量满足某种情况的时候打个断点;7、display:可以再调试的时候使用,自动打印当前位置的变量值。可以看到这个编译出来的文件还是比较大的,因为里面存在调试信息;4)、step : 往下执行,一步一步执行,会进入函数;
2022-10-20 11:17:32
315
原创 Linux基础教程:2、基本命令、权限和使用vi编辑器
那好,上一篇我们只讲了如何在自己的计算机上搭建好linux环境以及xshell软件的安装和使用,这一期我们就开始入门一下linux系统以及linux环境下面如何编写一个C语言程序;:显示当前操作路径;:切换到目标文件夹;:这个就表示显示当前目录下所有文件的详细信息;:这是常见的复制文件的命令,当然我们是可以将路径添加上去的,就表明需要复制文件到想要的路径下面;:当然,你们也可以不用加i,那么删除的时候就不会征求你的同意了,所以要慎用;如果是删除文件的话可以不用加选项条件,如果是文件夹的话就需要了;
2022-10-18 10:53:08
1281
1
原创 Android 进阶 2、商品列表展示案例(1)
主要就是要理解这一部分,我们使用了viewholder对象,这个对象在自定义适配器中非常常用,他的作用就是快速设置组件的值,然后提高程序的运行效率,这里定义这个对象的方式也很简单,就是class里面写几个属性就可以了,但是要注意这个属性是个布局文件的组件一一对应的,然后在getview函数里面就可以通过视图对象将布局文件的组件对象设置到viewholder中,在将数据列表中的数据传递到viewholder中,总的来说和实体类的作用类似;这里出现了一个新的声明变量的东西。
2022-10-14 11:32:43
1790
1
原创 Android 进阶 1、sqlite数据库
在这个位置我们可以打开cmd,然后输入sqlite3,就可以执行一个命令行的数据库操作器,要注意的是他的一些命令是不一样的,跟其他的数据库比较起来,他创建或者打开数据库使用的是.open,在每一个关于数据库命令下面,都需要在前面加上一个点号,而在每一个sql命令下面都需要在后面加上一个分号;这个子类需要创建数据库和继承父类的构造方法,首先需要写一个构造方法,将上下文传进去,super一下父类的构造方法,然后就是接口方法oncreate,在里面执行创建数据表的sql命令;
2022-10-03 19:54:20
3688
原创 Linux系统基础教程:1、xshell进行远程操控
嗯,还有的就是我们的虚拟机vm ware,网上有很多资源,大家自行下载,他是需要激活的,大家安装之后随便搜一搜就一大堆,所以我就不详细讲解了;可以看到我这里就是192.168.175.1,别问我是怎么知道的,因为标注了是vmware network。咱先不说他的界面,就拿他的命令来说,那真是让人眼花缭乱,头皮发麻,那我们为什么还要使用他呢?输入ifconfig,可以看到你inet是192.168.175.128;那么好,恭喜你已经打开了被操控的入口,那么就可以实现了吗?
2022-09-10 13:00:50
731
原创 web前端进阶:<6>一个自我简介的小程序
回顾一下上一期我们讲的内容,讲了3d的一个小案例和动画的基本操作,我们要实现3d效果必须要打开透视和3d空间,一般会配合定位一起使用,而且定位和3d空间的属性一般放在一起,而透视可以加载body上;还有一点就是这个过渡效果可能有些基础不是很好的小伙伴有点问题哈,这里我也简单分析一下,就是通过鼠标悬停,我们先让图片铺满这个大盒子,然后当鼠标放上去的时候我们再将它改小就可以了,最好设置一下overflow为hidden,这样溢出取得文字就看不到了。后面还会有很多好玩的小程序或只是哦,大家觉得不错就关注一波吧~
2022-09-08 19:02:00
670
原创 vue学习笔记,购物车清单制作
大家想不想知道vue的判断语句是怎么样的呢?直接加载标签的属性后面一个v-if一个v-else就可以了,当然后面的就是一个Boolean值了,来我们接着往下讲这就是声明式编程,大家要习惯,其实还挺好用的,我们的判断语句直接v-if="表达式或者值"加载标签的属性后面就可以,非常的方便,不过如果是判断那种很多数据分类的类型,大家还是直接使用计算属性的好,更加规范;......
2022-07-26 18:04:45
540
原创 vue的学习笔记(1):v-on的使用
vue是一个前段框架,也是比较有名的,它是写在.js文件里面,我们有三种引入vue框架的方式,第一种是通过cdn,也就是网页上面的资源,第二个就是自己下载一个vue的.js文件引入,第三个就是npm了,没有学过的小伙伴们可以去看我的专栏了解一下什么是npm这个东西;这里父类和子类都有单击监听事件,那么当我们点击自雷的时候会触发两次监听事件,因为浏览器并不知道这个事件源是哪一个,那么就会向上去寻找事件处理,这种情况叫做事件冒泡,vue只是使用了一个简简单单的stop修饰就解决了这个问题;...
2022-07-20 21:48:06
344
原创 kotlin基础教程:<10> 内部类和嵌套类、数据类
上一期我们认识了一下类的继承和创建,kotlin的继承和Java不一样,它是使用:实例化一个父类的方式,而且默认状况下类不支持继承,我们需要给父类添加一个open修饰;这一期我们来讲一个小点,就是内部类和嵌套类,顾名思义,就是一个类在另一个类里面的两种情况,那么是那两种呢?其实就是一种通过inner关键字修饰的类叫内部类,没有关键字修饰的就是嵌套类,内部类是内外想通的,但是嵌套类却无法内外互相访问:可以看到我们的两种类,只是一个有inner修饰的区别;再看看它们的访问,我可以直接实例一个外部类然
2022-07-02 09:40:02
504
原创 kotlin基础教程:<9> 类的继承、匿名创建和伴生对象
上一期我们讲到了加载类的顺序和延时初始化,使用lateinit关键字来注明一个需要延时初始化的成员,那么我们在用到他的时候初始化就可以了,声明就不需要赋值,一般是在使用的时候再调用该成员的初始化方法,然后在使用该成员,这是手动的,我们也学习了自动的,就是程序会自己判断该成员是否初始化,如果有就不做处理,没有就调用初始化;类加载的顺序就是先从主构造开始,然后是一气呵成的参数,在就按照我们写代码的顺序初始化类成员和init代码,其实inti和其他的成员应该是同步的;那么这一期我们来讲一下如何继承类,匿名创建和伴
2022-06-29 11:08:15
383
原创 kotlin基础教程:<8>类的延时成员变量、初始化代码块和陷阱
之前我们讲到了类,怎么常见类,实例化类,类构造函数拥有两种,一种是主要构造函数,另一种是次要构造函数,次构造函数为了方便管理都需要调用一下主构造函数;那么这一期我们来讲成员变量的延时;我们用到的一个关键字叫lateinit,它是用来延时实例化一个成员变量的时间用的,一般会延时到使用时实例化,当然还有一种是饿汉式:by lazy的组合使用来实现自动化的延时成员变量的实例化时;而且对于kotlin来说不想Java的代码对顺序那么灵活,一旦代码位置错了,就可能出现空指针:1、加载类时的执行顺序当我们调用次构造函数
2022-06-27 21:25:42
732
原创 kotlin基础教程:<7>类和field
和Java一样,kotlin也是具有类这个概念的,想到类,就会想到构造方法,毕竟一个类要想获取数据,构造方式是一个很重要的知识点,kotlin的构造方法有两类,一个是主构造,一个是次构造,而field只是一个字段,等价于成员变量的值;上一期我们介绍了一下map集合,用来存放键值对,通过运算符重载的方式可以实现数据增删操作,通过foreach,增强for可以遍历集合;那么这一期就到了类的学习,内容较多,分期讲:1、kotlin和Java的类创建不太一样,kotlin的成员是自带有Java中的getset的,而
2022-06-26 22:50:19
791
原创 kotlin基础教程:<6>map集合
之前我们学习了常用的集合和数组,它们创建的方式、如何获取元素以及遍历的方式,一般来说创建数据结构都可以使用kotlin的类型推导来简化代码:获取的话可以使用[]的方式等等,遍历就可以想到增强for和foreach,当然不同的数据结构具有不同的遍历特点,需要我们注意区分;之前我们学习了list集合和array数组,还有一个常用的结合叫做map集合,跟前面两者不同,它用来存储键值对,相信学过编程相关的都是到这个结构,安卓里面常用它来存储用户名和头像;那么这一期我们就来看一看kotlin是如何创建map以及
2022-06-25 21:19:36
1840
原创 kotlin基础教程:<5>集合与数组
上一期我们讲了内置函数的使用,其重点就在于内置函数的it和this,哪一些具有this,哪一些具有it,还有就是返回值,是对象本身还是最后一行;我们在对计算机上的文件进行操作试,可能会一直通过一个对象来点出函数调用,这样的话很繁琐,而这些内置函数的一个链式调用就很好的解决了这个问题,因为都是有返回值的,而且返回的还是对象本身,比如apply函数;那么这一期就开始我们会常用的的数据存储这一块,集合和数组,我们就做一个简单介绍然后代码演示,虽然语言简单,但是代码都是很清晰的,大家会用就可以,毕竟学过一门编程语言
2022-06-24 21:39:27
836
原创 kotlin基础教程:<4>内置函数的使用
上期我们学了函数的一些高级用法和字符串的基础操作,还记得什么是函数的函数吗?我们说匿名函数就是lambda表达式,然后我们将lambda函数当成一个参数传给kotlin的参数,那么就是一个函数的函数,就像是C语言里面的函数指针,然后是字符串的length,replace替换操作,其实就是我们手动替换了一些字符,增加阅读难度。那么这一期我们接着聊函数,不过今天我要带来的可以是一般的函数,他们都是匿名却又各不相同,它们叫内置函数,需要注意的函数有两个,一个是返回值类型是否变化,一个是it或者this,名称不一样
2022-06-23 22:47:48
325
原创 kotlin基础教程:<3>函数的高级用法和字符串的基础操作
大家都知道函数的功能强大,在Java,有构造函数,静态函数,自定义的函数,自带的函数,反正很多函数,上一期我们讲解了一下Java以及kotlin函数的一个格式,kotlin的函数是由作用域,fun关键字,函数名,参数列表,返回值和函数体组成的,是有明显的逻辑的输入输出函数;那么这一期,我们来讲一讲函数的一些高级用法,比如函数的函数(lambda作为参数),返回值为lambda的函数,相信大家对lambda 表达式不陌生了:也就是这个函数的第三个参数,就是我们上一期讲到的匿名函数,使用:或者等号创建的那
2022-06-22 21:57:59
667
原创 kotlin基础教程:<2> 函数入门
上一期我们讲到了定义变量的方式,val定义,然后是变量名,类型是放在后面的,使用:隔开:var是可以变的,val是不可以变的,const就是编译时常量,kotlin还有一个推断机制,可以通过等号后面的内容来推断出这个变量的类型,所以我们可以看到第二条语句是没有指明它的数据类型的;注意,kotlin里面的数据类型首字母大写,而且每条语句的后面是不需要加分号的;那么这一期我们来讲解一下函数,这是每一门编程语言里面都有的,实现我们功能的代码,以前学习Java的时候我们的函数还记得怎么写的吗?1、先写函
2022-06-21 13:48:16
173
原创 kotlin基础教程:<1> 变量与字符串模板
大家好,这里是kotlin的学习沃土,我将以简洁的方式和对比的手法向大家讲解kotlin的学习,我们利用我们有的Java基础来进行学习,当然,没有该基础的同学可以试着用自己的方式理解;这一期我们先从变量入手,再次之前,我们先来体验一下:大家打开我们的idea,然后创建一个工程,注意选择的是kotlin语言,然后在里面的src->main创建自己的kotlin文件就可以了,这里我们用来学习时候先这样创吧: 这里面的变量和Java里面的不一样,但是却可以通过反编译来将这里的变量转为Java里面的的基本变量:
2022-06-20 15:43:27
786
原创 Android:<21>高级组件:ExpandableListView和RecyclerlistView
这个一个高级的组件expandlistview和。。。。
2022-06-06 20:50:14
767
原创 cc2530:<6>ZigBee无线聊天室实现
上一期我们讲了一下实现无线聊天的简要步骤,我们运用之前实现的收发数据的效果加上无线控灯的运用就可以达到聊天的效果,就是ZigBee和串口的结合使用,那么我们怎么实现的呢?先创建一个函数来设置我们想要使用的名称,在函数里面我们通过串口询问的方式得到用户想要设置的名称://3.3 设置名字void setName(void){ Delay(5000); UartSend("请输入名字:",15); while(1) { //控制其一个一个发以便于判断
2022-05-30 13:25:24
604
原创 Android:<19>ListView的运用
在我们日常收发短信的时候常常会看到一个效果,就是我们在QQ、微信的聊天过程成,记录会一直发下去然后我们往下滑或者往上滑会一直有数据刷出来,这个呢其实就可以用到我们的listview,在讲这个高级组件之前,我们先复习一下上一期的内容,上一期我们讲了gridview,这是我们安卓的应用界面常用的一个布局,使用的是simpleadpter适配器将我们的list<Map<String,object>>数据加载到界面上,我们将一些数据存储到这个列表里面,可以使用循环遍历,然后使用: .
2022-05-25 22:02:00
378
原创 Android:<18> 时间对话框和GridView
上一期我们讲了创建动画,我们通过创建布局文件,然后里面写animation-list表示帧动画,写rotate写旋转动画,大家有没有去试一试呢?真的是比较有趣;好了,那么这一期我呢给大家带来了一个任何手机都有的一个功能,就是设置日期和时间,其实在安卓里面,我们可以通过时间日期对话框做到更改时间的效果:我们就是通过对话框设置时间然后更改文本框中的内容,废话不多说,我们直接开始吧;1、创建好布局,最好给组件都设置好id,我们后面的代码用到:<?xml version="1.0".
2022-05-20 19:10:48
455
原创 Android:<17>进度条和动画
上一期我们讲解了一下进度条对话框,通过代码实现的,还记得吗?progressDialog = new ProgressDialog(this);progressDialog.setTitle("登录");progressDialog.setMessage("正在登陆");progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);progressDialog.setCancelable(false);progressDialog
2022-05-19 20:15:57
863
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人