- 博客(211)
- 收藏
- 关注
原创 Grafana使用双Y坐标轴详解
最近在给公司做Grafana的监控图表,在一个显示错误数的面板这卡住了。想在一个面板同时显示RPC调用的成功次数和失败次数,不过因为失败次数和成功的次数远不在一个数量级,所以想着分两个Y轴来表示,左边显示成功次数,右边显示错误数。尝试了好久终于成功,这里记录下方法。文章目录操作环境实际操作两个查询数据允许双Y轴给右Y轴配置数据操作环境Grafana v7.1.0-beta2实际操作实际操作之前先来看看最终效果图,这里绿线显示的是rpc成功次数,黄线显示的是失败次数,并且从legend可以看出使
2021-03-18 21:40:14 12765 2
原创 mac快捷键大全(持续更新中)
快捷键作用ctrl+左/右左右切换屏幕cmd+shift+=放大字体cmd+shift+-缩小字体fn+向上向上翻页fn+向下向下翻页ctrl+tabchrome向后切tabctrl+shift+tabchrome向前切tabcmd+数字chrome切到特定位置tab...
2021-02-28 17:33:29 1011
原创 ntpd建立本地时间服务器供所有本地linux服务器使用
最近在本地搭建了一套prometheus+grafana的监控系统,因为整个监控系统是基于时序数据(time series data)的,prometheus根据服务器时间统一保存为utc格式,然后grafana显示的时候会根据浏览器时间进行时区转换,所以时间同步就显得尤其重要。这一节我们看看如何将本地一台服务器变为时间同步服务器供本地所有其他设备用来同步时间。文章目录NTP操作环境时间同步服务器持续同步其他NTPNTP,Network Time Protocol,1985年创立,一个久经时间考验的时
2021-02-25 16:54:15 2851
原创 docker多种创建volume操作详解
volume用于将容器内的数据在本地进行持久化,这一节我们以redis为例用实际操作来看看几种创建volume的方式。文章目录操作环境原始镜像声明volume创建volume指定容器目录不指定宿主机目录指定容器目录指定宿主机目录总结操作环境Centos 7.9.2009Docker version 20.10.2, build 2291f61原始镜像直接下载最新的redis镜像docker pull redis[root@testmachine fuhanxiao]# docker i
2021-01-27 20:19:00 8704
原创 Redis从入门到精通(16)redis的删除策略详解
redis的数据都是保存在内存中,但是内存大小是有限的,所以这一节来看看redis中过期数据的删除,以及内存占用满以后新数据的插入问题。文章目录过期数据数据删除策略定时删除惰性删除定期删除逐出算法过期数据在内存中有专门的一块区域用来记录key的地址和过期时间,暂且叫做过期时间表。如果key有过期时间就会被放进这个表。不过一个key过期了,redis为了提升性能,并不会马上将这个过期的key从内存删除,毕竟删除key也是会消耗cpu影响整体性能的。一方面是删除key节约内存,另一方面是保留key节约c
2021-01-22 12:58:49 291
原创 Redis从入门到精通(15)redis的事务和锁详解
Mysql的事务和锁相信大家都很熟悉,其实redis也是有的,只是因为redis的事务比较鸡肋很少被人谈起,至于为什么鸡肋下面我们就会见到。同时redis的分布式锁还是非常值得我们了解一下的。文章目录什么是事务事务基本操作错误处理锁分布式锁死锁什么是事务和Mysql一样,redis中的事务也是一组用关键字作为边界的有序排列的命令,用来将命令进行打包执行。但是redis的事务并没有mysql事务那么多优秀的特性,例如原子性,隔离性等等。事务基本操作下面这个表格是和事务相关的一些操作命令命令
2021-01-20 18:42:58 265
原创 【Prometheus 01】搭建本地测试环境
学习Prometheus+Grafana,这一节我们首先在本地搭建一套测试环境文章目录测试环境规划单台虚拟机初始化复制多台虚拟机测试环境规划我使用的是Mac,计划使用VMwareFusion创建3台Centos7的虚拟机组成集群,其中3台机器的规划如下HostnameIp功能prometheus.test172.16.141.20/24Prometheusgrafana.test172.16.141.21/24Grafanaagent.test172.16
2021-01-11 18:20:24 527
原创 Mac上利用iterm2多屏同时操作多个ssh终端
今天在本地的Mac上搭了一个集群用于测试Prometheus相关的东西,因为涉及到多台机器,有很多的操作都是重复的,如果能够敲一遍命令然后在多个ssh终端上同时执行,就可以省下很多功夫。Google了一下发现iterm2这个工具可以做到,这里记录下。文章目录iterm2分屏多屏同时输入补充iterm2iterm2是一款Mac终端的升级工具,在原始终端的基础上还增加了一些新功能,例如我现在最需要的多终端同时执行。直接去官网下载安装即可使用。iterm2中利用profile来定义一个页签,如下打开「P
2021-01-11 16:53:21 6473
原创 Linux通过环境变量限制用户能执行的命令
最近公司有个场景,需要限制用户登陆以后可以执行的命令,从而提高系统的安全性。本身bash已经有了一个受限制的版本叫做rbash,我们在这个基础上还可以通过环境变量的方式对用户做进一步的限制。文章目录受限制的shell用户登录流程使用自定义profile文件验证后续受限制的shell正常情况下用useradd xx去创建用户的时候给用户配置的shell都是bash,这个可以通过查看文件/etc/passwd或者是通过命令echo $SHELL进行确认。查看bash命令的man页面会发现bash还有一个
2021-01-10 19:37:50 4096 2
原创 Mac的VMwareFusion安装VMware Tools解决不能复制粘贴的问题
在VMwareFusion中新安装完Centos虚拟机,结果发现虚拟机不能和宿主机互相复制粘贴,非常不方便,这篇文章来记录下解决的过程。文章目录问题表现解决步骤问题表现VMwareFusion中的虚拟机不能和宿主机之间进行复制粘贴,尝试了键盘快捷键、鼠标右键,都不可以。只能在虚拟机内进行复制粘贴。网上的评论都说安装VMware Tools可以解决,但是我这边的安装按钮是灰色的解决步骤再次Google之后发现可以进行手动安装,下面记录下过程。首先在「应用程序」中找到「Vmware Fusion
2021-01-08 13:08:54 9412 10
原创 Macbook利用VMwareFusion安装Centos7
最近换了工作,工作电脑改为了Mac。Macbook和Windows不同的是其不能再用VMware Workstation运行虚拟机了,而改为了专门的VMware Fusion。这一篇以Centos7为例来梳理下怎么在Mac上运行虚拟机。文章目录安装VMware Fusion安装虚拟机权限问题安装VMware FusionFusion比较好的地方是官方有免费的个人版本供下载使用,如下图所示注册完以后会给你的邮箱发送一个下载链接,以及对应的key,傻瓜式安装即可。安装虚拟机安装虚拟机的方式都是大同
2021-01-06 21:33:16 522
原创 【每日力扣Leetcode】1114-按序打印(多解法来深入理解python中的锁和阻塞)
力扣题库1114,在单例模式的前提下,使得类中的3个方法按照指定顺序执行。题目链接点这里。文章目录题目描述解题思路初始答案改进答案一改进答案二改进答案三注意事项题目描述我们提供了一个类:public class Foo { public void first() { print("first"); } public void second() { print("second"); } public void third() { print("third"); }}三个不同的线程将
2020-11-20 15:35:45 636 1
原创 记一次机房断电办公室网络瘫痪的恢复经过
今早同事告诉我办公室所有Wifi的SSID都消失了,然后有线网络也访问不了,整个公司网络完全瘫痪,简直是吓尿了。好在最后查明原因并成功将网络恢复,这里记录一下整个过程,并整理一下改进方案。文章目录发现故障初步定位详细排查运营商的猫和出口IP解决问题断电恢复ESXI虚拟机总结后续改进发现故障故障表现为办公室Wifi的SSID全部消失,有线网络也无法使用,整个网络瘫痪。初步定位虽然心里很慌,但是处理事情还是要有条不紊,先从时间维度和空间维度来对问题进行初步定位。时间上,昨天下班还好好的,今天突然这样
2020-10-28 15:34:05 3929
原创 python的时间操作模块datetime和time使用详解
python中有两个和时间相关的模块time和datetime,我自己在使用的时候经常搞混。这一篇就来记录下这两个模块常见的一些功能。文章目录time模块和datetime模块时间的表示time模块操作datetime模块操作Mysql存储time模块和datetime模块time是python的内建模块,用与和时间相关的一些操作;datetime模块是第三方模块,为了方便操作,将和date与time相关的一些操作进行了封装。所以本质上来讲,能用datetime来操作的都能用time来实现,通过后面
2020-10-24 12:39:23 1672
原创 python中的位运算和集合运算妙用实例
python中有一些运算符不是经常会用到,例如&还有|,但是这些运算符在很多场合却能显示奇效。这篇文章让我们一起来看看python中的位运算和集合运算,然后看看实际应用中两个非常巧妙的使用场景。文章目录位运算集合运算实际应用位运算集合运算位运算位运算只适用于整数,将对应的二进制数逐位进行计算,其规则如下符号含义&与运算,都为1返回1,否则返回0|或运算,都为0返回0,否则返回1^异或运算,不同为1,相同为0~取反,1变0,0变1&l
2020-10-22 17:45:31 1651 2
原创 python的单例模式及多线程加锁实现详解
单例模式算是最常见的设计模式了,也是面试中的高频测试点。这一篇就来总结下如何在python中实现单例模式。文章目录单例模式对象创建过程代码实现多线程import模块来实现单例模式总结单例模式所谓单例模式,就是针对某一个类,不管实例化多少次,实例出来的对象都是同一个。之所以需要用到单例模式,有两个主要原因。其一是在程序开发中很多对象用于全局的记录,这些对象不管在程序的哪个地方被调用都应该是指向同一个,例如日志对象。其二是因为对象的创建和销毁都是耗费资源的,如果对象的创建次数减少,势必能提高程序的整体运
2020-10-16 19:25:27 4820 5
原创 python多进程和多线程看这一篇就够了
脑海中关于进程和线程的概念一直很模糊,什么时候该用多进程,什么时候该用多线程总是搞不清楚。同时python因为历史遗留问题存在GIL全局锁,就让人更加困惑。这一篇就完整整理一下python中进程和线程的概念和实现。文章目录进程和线程GIL锁多进程 vs 多线程代码实现多进程进程池进程间通讯多线程线程池异步线程间通讯总结进程和线程进程(process)和线程(thread)的区别应该算是个老生常谈的话题。这里引用知乎用户的一个高赞回答来深入浅出的解释一下看了一遍排在前面的答案,类似”进程是资源分配的
2020-10-10 22:08:35 27200 20
原创 python中的反射及在动态导入中的使用详解
这篇博客记录下python中关于反射的知识点,同时结合实例看看其在动态导入中的应用。什么是反射反射(Reflect)是指面向对象编程中通过字符串动态获取对象的类型、属性和方法等信息。反射使用场景想象下面的场景,我们编写了几十个插件供业务程序来使用,而具体业务中使用哪些插件是由配置文件来控制的,或者由用户输入的。不管是配置文件还是用户输入,都是采用字符串形式来表示插件名,我们需要检查字符串代表的插件名是否存在,如果存在需要获取对应的插件对象并调用。文字表述不太直观,看如下的一个项目在plugin
2020-10-07 12:24:51 730 4
原创 python利用Decimal处理浮点数计算的精度问题
之前在学习Django中ORM的时候,一直不明白怎么有一个数据类型叫Decimal。直到最近在一个项目中遇到了小数点计算的问题,发现要解决小数计算的精度问题,还真得用到这个Decimal不可。文章目录问题描述解决办法四舍五入Decimal问题描述浮点数在内存中存储的时候因为存储机制的原因,天然存在精度丢失的现象,具体原因这里不赘述了,感兴趣的朋友可以参考另一篇博客《浮点型数据精度丢失实例详解》。a=2.2a*3Out[16]: 6.6000000000000005本来期望的结果是6.6,结果
2020-09-17 18:39:02 1986 3
原创 JQuery对象获取各类节点操作详解
在前面的《JQuery的选择器和过滤器汇总》中我总结了JQ中直接获取元素的几种方式,但是在很多时候,都是某个元素的事件响应中,需要对另一个元素进行操作。这个时候除了使用id或者class这种定死的方式,还可以在事件响应的元素上做相对的查询。这一篇我们就来总结一下。文章目录操作环境父级元素子级元素兄弟元素操作环境h5内容如下<div id="container"> <div id="box1"><span id="span1"></span>&l
2020-09-15 00:23:39 687
原创 【每日力扣Leetcode】144+94+145-利用迭代返回二叉树的前序中序和后续遍历
力扣题库144+94+145,利用迭代返回二叉树的前中后序遍历。题目链接分别是144-前序,94-中序,145-后序文章目录题目描述解题思路初始答案前序遍历中序遍历后序遍历改进答案注意事项题目描述题目都是一句话,主要就是突出使用迭代的方法,而不是我们常用的递归。解题思路只要是能用递归解决的问题都是可以用迭代来解决的。递归说白了就是隐性地声明了一个栈(stack),同一个函数,前面还未处理完的先依次压进栈里面,一直到最后递归退出,开始从后往前回溯的时候,就是函数依次出栈的时候了。将递归转换为迭
2020-09-14 16:32:00 176
原创 JQuery利用find查找子元素并修改其样式和属性
最近做项目遇到一个根据ajax结果自动更新form表单内元素的需求,涉及到JQuery关于子元素的一些操作,特意记录一下。文章目录测试环境子元素查找修改元素样式和属性测试环境html如下<div id="container"> <div id="box1"><span id="span1"></span></div> <div id="box2"><span id="span2"></span&
2020-09-08 12:31:33 9356 1
原创 【每日力扣Leetcode】13-罗马数字转整数
力扣题库13,罗马数字转整数。题目链接点这里。文章目录题目描述解题思路初始答案改进答案注意事项题目描述罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12
2020-09-03 21:26:00 249
原创 【每日力扣Leetcode】14-查找字符串数组中的最长公共前缀
力扣题库14,查找字符串数组中的最长公共前缀。题目链接点这里。文章目录题目描述解题思路初始答案改进答案注意事项题目描述编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例 1:输入: [“flower”,“flow”,“flight”]输出: “fl”示例 2:输入: [“dog”,“racecar”,“car”]输出: “”解释: 输入不存在公共前缀。说明:所有输入只包含小写字母 a-z 。解题思路一看这道题就会涉及到遍历操作。做了几道
2020-09-03 20:59:46 693
原创 利用scrapy爬取京东移动端的图片素材和商品信息
有一个练习项目需要一些带分类信息的商品测试图片,从现有的电商网站爬取是个不错的选择。刚好最近又在练习scrapy的使用,这一篇记录一下用scrapy爬取京东的图片素材并保存商品信息的思路。文中代码共享在我的Github中JDcrawler项目。文章目录爬取目标动态加载和跨域请求思路分析获取子分类信息获取具体商品信息scrapy配置代码实现item部分spider部分pipeline部分结果展示后续改进总结爬取目标为什么选择京东?因为我需要的图片是手机版尺寸,而刚好京东支持手机网页打开的适配。如下,
2020-09-02 17:25:58 2056
原创 python3实现KMP算法进行字符串匹配图文详解
最近遇到一个字符串内查找指定子字符串出现位置的算法问题,最后虽然用暴力匹配法解决了问题,但是时间效率非常差。看到网上说可以用KMP模式匹配算法进行优化,搜了很多资料才基本弄懂,这里记录一下自己的理解和实现代码。本文并没有重复造轮子,是基于结尾处两篇大神的参考文章的一些自我理解。大神的文章深入浅出通俗易懂,建议先行食用。文章目录实现效果暴力匹配的缺点KMP算法原理代码实现next数组部分字符串匹配部分注意事项参考实现效果实现的效果类似于python中字符串的find方法m='this is a gr
2020-09-02 11:24:54 1234
原创 【每日力扣Leetcode】109-将有序链表转换为二叉搜索树
力扣题库109,将有序链表转换为二叉搜索树。题目链接点这里。文章目录题目描述解题思路初始答案改进答案注意事项题目描述给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3
2020-08-31 16:55:53 269
原创 【每日力扣Leetcode】108-将有序数组转换为二叉搜索树
力扣题库108,将有序数组转换为二叉搜索树。题目链接点这里。文章目录题目描述解题思路初始答案改进答案注意事项题目描述将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -1
2020-08-31 15:43:38 240
原创 爬虫Xpath语法详解
xpath是定位dom元素非常直观的方法之一,在爬虫中的使用尤其常见。文章目录绝对路径和xpath浏览器自带的xpath工具xpath语法常用符号定位元素多重定位多条件组合获取属性或文字xpath在爬虫中的使用绝对路径和xpath关于html的dom树这里就不赘述了,相信根节点,子节点,兄弟节点这些概念大家也都听的很多。在一棵dom树里面,想定位某个元素有绝对路径和xpath的区分。如下图所示,选择了一个img标签以后点击右键,可以选择是复制xpath还是完整的路径如果是绝对路径结果是这样的/
2020-08-29 19:36:59 7271 2
原创 【每日力扣Leetcode】459-判断一个字符串是否由子字符串重复组成
力扣题库459,判断一个字符串是否由子字符串重复组成。题目链接点这里。文章目录题目描述解题思路初始答案改进答案注意事项题目描述给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。示例 1:输入: “abab”输出: True解释: 可由子字符串 “ab” 重复两次构成。示例 2:输入: “aba”输出: False示例 3:输入: “abcabcabcabc”输出: True解释: 可由子字符串 “abc”
2020-08-25 17:25:47 2490
原创 【每日力扣Leetcode】111-计算一个二叉树的最小深度
力扣题库111,计算一个二叉树的最小深度。题目链接点这里。文章目录题目描述解题思路初始答案改进答案注意事项题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最小深度 2.解题思路本题思路比较简单,利用DFS,迭代从下至上深度依次加1即可。要注意的
2020-08-22 08:01:07 275
原创 网址url中的百分号是什么编码以及如何用python实现url编码
相信大家在玩爬虫的时候,经常需要自己去批量构建url,但是有的时候网站中作为参考的同类型url却包含一串百分号的乱码,让我们自己在构建的时候无从下手。这一篇博客就来一起看看这些百分号到底是什么东西。文章目录问题描述为什么要编码?python的编码操作总结问题描述今天在爬虫的时候,需要构建的一个url需要附加搜索内容,例如爬取搜索内容为“零食 京东超市”的url,如果原样输出应该是https://so.m.jd.com/ware/search.action?keyword=零食 京东超市但是实际的
2020-08-20 17:58:36 4630 2
原创 【每日力扣Leetcode】110-判断一个二叉树是不是平衡二叉树
力扣题库110,判断一个二叉树是不是平衡二叉树。题目链接点这里。文章目录题目描述解题思路初始答案改进答案注意事项题目描述给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,
2020-08-18 23:31:18 339
原创 英文版Windows10系统显示中文乱码问题解决
因为我的Win10系统是英文的,所以一些汉化的软件打开会显示乱码,包括cmd里面也无法敲中文。本来还以为是系统的原因,结果其实Windows将语言的兼容性做的挺好的,这一篇来记录一下在英文系统里面显示中文乱码的解决办法。操作步骤Control Panel - Clock and Region - RegionAdministrative - Change system locale选择简体中文之后需要重启电脑,搞定!我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csd
2020-08-17 18:26:50 7356
原创 利用Chrome自带debug程序解决Bootstrap下拉框JS不生效问题
今天想从Bootstrap中拷贝一段代码到自己的项目中,结果发现原封不动的官方代码,拷贝到自己本地就是不能用,记录下解决办法。文章目录问题现象问题原因解决办法问题现象官方的下拉框代码如下<div class="dropdown"> <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true"
2020-08-15 16:45:45 621
原创 两种JS模拟进度条周期更新进度的方式
记录下两种进度条周期更新的实现方式,脱离具体场景,这里用随机数来表示每次的变化值。文章目录H5进度条周期更新进度实际使用场景H5进度条在H5中实现一个进度条非常方便,直接用<progress>标签即可<progress style="width: 20%; height: 30px"></progress>在没有配置value属性的情况下,进度条属于等待阶段,会有自带的动画效果。例如下面就是Chrome中的效果,蓝色的一小段回来回摆动想要显示进度,需要设置
2020-08-15 11:19:33 2269
原创 python中可迭代对象,迭代器和生成器实例详解
这几天在弄scrapy爬虫的时候,发现scrapy将爬取的网页用for循环去对每一小块进行处理,但是为了尽量少占用内存,在循环体内采用的是yield代替的return,从而通过生成器的方式实现了异步非阻塞的流水作业,边爬取边解析。这一篇就从原理来说一说python中必须要掌握但是又不太好区分的三个概念:可迭代对象,迭代器和生成器。文章目录生成器生成器函数生成器表达式迭代器可迭代对象实例演示总结生成器既然提到了生成器和yield,就先从它开始说起。不一次性生成全部结果,而是根据某种算法在需要的时候再推算
2020-08-10 01:49:23 344
原创 javascript面向对象(三):class语法详解
在本系列的前两篇《javascript面向对象(一):object基础以及构造函数详解》和《javascript面向对象(二):prototype以及继承详解》中,我们已经对JS中面向对象的基础知识了解的八九不离十了,但是其实都是为了给本系列的最后一篇做铺垫。这一篇就让我们一起学习class语法,对前面的知识进行一次升华。文章目录class语法匿名classGetter/Setter类属性this丢失class的继承重写方法重写构造函数静态属性和方法私有和受保护的属性及方法instanceofMixin
2020-08-06 15:17:26 1653
原创 Javascript中this指向丢失原因及解决办法详解
大家都知道JS中的this关键字通常出现在函数或者方法中,用来指向调用该函数或者方法的对象。但是在很多时候this的指向却并不总是如我们所愿,这一篇文章就一起来看看到底该如何判断this所指向的对象,同时在this指向丢失情况下如何恢复。文章目录this指向丢失多重调用以及箭头函数this指向丢失解决办法bind传递函数参数总结this指向丢失相信有过面向对象编程经验的朋友对于this的使用不会陌生,来看两个例子function Student(name){ this.name=name;
2020-08-04 23:54:50 4491 2
原创 javascript面向对象(二):prototype以及继承详解
在上一篇博客《javascript面向对象(一):object基础以及构造函数详解》中我们了解了各种在js中创建object对象的方法。但是在面向对象语言中,很少会从零创建一个对象,更多的是在现有模板的基础上进行继承和修改。这一节我们就来看看js中obejct对象的继承。文章目录简单继承this关键字for循环构造函数的继承内建prototype对简单继承的改进总结简单继承在js中,object对象有一个隐藏属性叫[[Prototype]],要么为null或者指向另一个object对象。如果其指向另一
2020-08-01 13:56:24 529
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人