自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ❤️强烈推荐人工智能学习网站❤️

前些天,发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。强烈推荐人工智能学习网站。

2023-09-01 16:17:04 247 1

原创 TCP 连接的前世今生

前言大家好!我是盼盼!之前写了几篇关于算法和 linux 命令的文章,今天来学习下,网络协议相关的知识。不管你是客户端,还是服务端开发,网络协议这块都是要学习和了解的。工作和面试中,网络协议都会用到。虽然学习网络对编码没有实质的帮助,但对你处理一下网络连接问题,帮助大大的。下面来一起学习下,发车!缘起在世界上各地,各种各样的电脑,运行着各自不同的操作系统为大家服务。这些电脑,在表达同一种信息的时候,所使用的方法是千差万别。计算机使用者意识到,计算机只是单兵作战,并不会发挥太大

2021-06-10 19:32:07 1623 23

原创 经典Golang语法50问!

前言Golang 这门语言想必大家都不陌生,现在也比较火,学习的人也比较多。作为一款性能还算不错的语言,现在很多大厂的新项目都选择了Golang。这期针对大家的疑惑,总结了大厂系列Golang语法50问,供大家面试和学习用,下面看一下提纲。1.使用值为nil的slice、map会发生啥允许对值为 nil 的 slice 添加元素,但对值为 nil 的 map 添加元素,则会造成运行时 panic。//map错误示例funcmain(){varmmap...

2021-03-26 20:55:24 2715 154

原创 linux下调试core dump方式汇总,工作必备技能

调试,是开发流程中一个非常重要的环节。每个程序员都应,具备调试代码的能力,尤其对于从事 Linux 下的开发的读者。从事 linux 下后台开发,有时候会遇到程序突然崩溃的情况,也没有任何日志,这会让你不知所措。今天给大家介绍一个 core 文件,用这个文件,我们可以找出对应出错的代码行,感觉是不是很神奇。透着树荫看着朦胧的太阳,晒着日光浴,...

2021-03-07 09:43:20 2535 120

原创 栈和队列互相实现,一文弄懂它们的关系

专注后台开发相关技术,广度深度并存,干货情怀同在。微信搜索【晨梦思雨】关注这个不一样的程序员。前言栈和队列是比较基础的数据结构。无论在工作中,还是在面试中,栈和队列都用的比较多。在计算机的世界,你会看到队列和栈,无处不在。栈:一个先进后出的数据结构队列:一个先进先出的数据结构栈和队列这两种数据结构,同时也存在某种联系。用栈可以实现队列,用队列也可以实现栈。海边风景不错,欣赏一下风景,下面开始步入正题。学完这篇,咱们再接着看风景。两个栈实现一个队列...

2021-03-06 17:54:26 1822 61

原创 算法:多数元素,多种解法

专注后台开发相关技术,广度深度并存,干货情怀同在。微信搜索【晨梦思雨】关注这个不一样的程序员。前言:以前做数学题的时候,老师说:你们学习多种解题方法。遇到类似不同的问题,你都会了,这样能提高解题能力。如果你写出多种解法,面试官会对你刮目相看。下面一题,我们将用多种解法实现,是面试中常见的一题。题目:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指,在数组中出现次数,大于 n / 2 的元素。例子:int a[3] = {1, 2, 2} ,多数元素是 2 。你...

2021-02-17 15:20:12 6110 103

原创 进程知识点,只需这一篇

专注后台开发相关技术,广度深度并存,干货情怀同在。微信搜索【晨梦思雨】关注这个不一样的程序员。前言你的进程,为啥挂了?进程挂了,这个问题大家并不陌生。学完这篇,你会对进程有一定了解。后面碰到进程挂的情况,你很快能找到对应解决思路。进程在操作系统中,是一个很重要的概念。你熟悉操作系统,能避免一些坑,写出高质量的代码。windows界面设置真炫酷,不多说。下面用动画加文字的方式,给大家讲述。为什么需要进程通常程序不能并发执行,因为程序并发执行的结果,是不可再现的。为了使程序,..

2021-02-17 15:09:29 2264 77

原创 大厂动态规划面试汇总,提升内功

注:本文是BAT真题收录很值得大家花心思看完,看完会有收获。前言算法是面试大公司必考的项目,所以面试前准备好算法至关重要,今天整理的常见的动态规划题目,希望可以帮到大家。要想学习其他绝世武功,要先打好基础。算法属于内功,则更为重要。强盗抢劫题目:强盗抢劫一排房间,每个房间都有钱,不能抢劫两个相邻的房间,要求抢的钱最多。数组如:[2,7,9,3,1]思路:当输入房间数为0,1,2时,这个很好判断,当输入房间数字大于3时,就要用到动态规划了,方程是:dp[i]是当抢到第i个数时

2021-02-15 11:49:35 3752 50

原创 golang中的pprof支持

Go语言有一个非常棒的设计就是标准库里面带有代码的性能监控工具,在两个地方有包:net/http/pprofruntime/pprof其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来beego支持pprof目前beego框架新增了pprof,该特性默认是不开启的,如果你需要测试性能,查看相应的执行goroutine之类的信息,其实Go的默认包"net/http/pprof"已经具有该功能,如果按照Go默认的方式执行We

2021-02-13 16:24:29 1995 21

原创 golang多语言支持

beego中设置全局变量如下:Translation i18n.IL Lang string //设置语言包,zh、enLangPath string //设置语言包所在位置初始化多语言函数:func InitLang(){ beego.Translation:=i18n.NewLocale() beego.Translation.LoadPath(beego.LangPath) beego.Translation.SetLocale(

2021-02-13 16:23:45 3977 16

原创 golang用户认证

在开发Web应用过程中,用户认证是开发者经常遇到的问题,用户登录、注册、登出等操作,而一般认证也分为三个方面的认证HTTP Basic和 HTTP Digest认证 第三方集成认证:QQ、微博、豆瓣、OPENID、google、github、facebook和twitter等 自定义的用户登录、注册、登出,一般都是基于session、cookie认证beego目前没有针对这三种方式进行任何形式的集成,但是可以充分的利用第三方开源库来实现上面的三种方式的用户认证,不过后续beego会对前面两种认证逐

2021-02-13 16:23:03 2083 16

原创 golang表单及验证支持

在Web开发中对于这样的一个流程可能很眼熟:打开一个网页显示出表单。 用户填写并提交了表单。 如果用户提交了一些无效的信息,或者可能漏掉了一个必填项,表单将会连同用户的数据和错误问题的描述信息返回。 用户再次填写,继续上一步过程,直到提交了一个有效的表单。在接收端,脚本必须:检查用户递交的表单数据。 验证数据是否为正确的类型,合适的标准。例如,如果一个用户名被提交,它必须被验证是否只包含了允许的字符。它必须有一个最小长度,不能超过最大长度。用户名不能与已存在的他人用户名重复,甚至是一个保留

2021-02-13 16:22:24 1256 15

原创 golang中的Session支持

session集成beego中主要有以下的全局变量来控制session处理://related to session SessionOn bool // 是否开启session模块,默认不开启SessionProvider string // session后端提供处理模块,默认是sessionManager支持的memorySessionName string // 客户端保存的cookies的名称SessionGCMaxLifeti

2021-02-13 16:12:17 1237 9

原创 golang自定义路由器设计

HTTP路由组件负责将HTTP请求交到对应的函数处理(或者是一个struct的方法),如前面小节所描述的结构图,路由在框架中相当于一个事件处理器,而这个事件包括:用户请求的路径(path)(例如:/user/123,/article/123),当然还有查询串信息(例如?id=11) HTTP的请求方法(method)(GET、POST、PUT、DELETE、PATCH等)路由器就是根据用户请求的事件信息转发到相应的处理函数(控制层)。默认的路由实现func fooHandler(w htt

2021-02-10 07:17:28 1802 7

原创 golang备份和恢复

我们经常会遇到生产服务器的网络断了、硬盘坏了、操作系统崩溃、或者数据库不可用了等各种异常情况,所以维护人员需要对生产服务器上的应用和数据做好异地灾备,冷备热备的准备。在接下来的介绍中,讲解了如何备份应用、如何备份/恢复Mysql数据库和redis数据库。应用备份在大多数集群环境下,Web应用程序基本不需要备份,因为这个其实就是一个代码副本,我们在本地开发环境中,或者版本控制系统中已经保持这些代码。但是很多时候,一些开发的站点需要用户来上传文件,那么我们需要对这些用户上传的文件进行备份。目前其实有一种

2021-02-10 07:16:31 1438 5

原创 golang应用部署

程序开发完毕之后,我们现在要部署Web应用程序了,但是我们如何来部署这些应用程序呢?因为Go程序编译之后是一个可执行文件,编写过C程序的读者一定知道采用daemon就可以完美的实现程序后台持续运行,但是目前Go还无法完美的实现daemon,因此,针对Go的应用程序部署,我们可以利用第三方工具来管理,第三方的工具有很多,例如Supervisord、upstart、daemontools等,这小节我介绍目前自己系统中采用的工具Supervisord。daemon目前Go程序还不能实现daemon,详细的

2021-02-10 07:15:43 1296 6

原创 golang网站错误处理

我们的Web应用一旦上线之后,那么各种错误出现的概率都有,Web应用日常运行中可能出现多种错误,具体如下所示: 数据库错误:指与访问数据库服务器或数据相关的错误。例如,以下可能出现的一些数据库错误。 连接错误:这一类错误可能是数据库服务器网络断开、用户名密码不正确、或者数据库不存在。 查询错误:使用的SQL非法导致错误,这样子SQL错误如果程序经过严格的测试应该可以避免。 数据错误:数据库中的约束冲突,例如一个唯一字段中插入一条重复主键的值就会报错,但是如果你的应用程序在上线之前经过了严格

2021-02-10 07:14:44 881 3

原创 golang应用日志

seelog介绍seelog是用Go语言实现的一个日志系统,它提供了一些简单的函数来实现复杂的日志分配、过滤和格式化。主要有如下特性: XML的动态配置,可以不用重新编译程序而动态的加载配置信息 支持热更新,能够动态改变配置而不需要重启应用 支持多输出流,能够同时把日志输出到多种流中、例如文件流、网络流等 支持不同的日志输出 命令行输出 文件输出 缓存输出 支持log rotate SMTP邮件 上面只列举了部分特性,seelog是一个特别强大

2021-02-10 07:12:11 745 7

原创 Go怎么写测试用例

如何编写测试用例由于go test命令只能在一个相应的目录下执行所有文件,所以我们接下来新建一个项目目录gotest,这样我们所有的代码和测试代码都在这个目录下。接下来我们在该目录下面创建两个文件:gotest.go和gotest_test.gogotest.go:这个文件里面我们是创建了一个包,里面有一个函数实现了除法运算:package gotestimport ( "errors")func Division(a, b float64) (float64, error

2021-02-10 07:11:14 1207 9

原创 golang使用gdb

GDB调试简介GDB是FSF(自由软件基金会)发布的一个强大的类UNIX系统下的程序调试工具。使用GDB可以做如下事情:启动程序,可以按照开发者的自定义要求运行程序。 可让被调试的程序在开发者设定的调置的断点处停住。(断点可以是条件表达式) 当程序被停住时,可以检查此时程序中所发生的事。 动态的改变当前程序的执行环境。目前支持调试Go程序的GDB版本必须大于7.1。编译Go程序的时候需要注意以下几点传递参数-ldflags "-s",忽略debug的打印信息 传递-gcflags

2021-02-10 07:10:30 863 3

原创 golang错误处理

Go语言主要的设计准则是:简洁、明白,简洁是指语法和C类似,相当的简单,明白是指任何语句都是很明显的,不含有任何隐含的东西,在错误处理方案的设计中也贯彻了这一思想。我们知道在C语言里面是通过返回-1或者NULL之类的信息来表示错误,但是对于使用者来说,不查看相应的API说明文档,根本搞不清楚这个返回值究竟代表什么意思,比如:返回0是成功,还是失败,而Go定义了一个叫做error的类型,来显式表达错误。在使用时,通过把返回的error变量与nil的比较,来判定操作是否成功。例如os.Open函数在打开文件失败

2021-02-10 07:09:01 861 3

原创 golang国际化站点

管理多个本地包在开发一个应用的时候,首先我们要决定是只支持一种语言,还是多种语言,如果要支持多种语言,我们则需要制定一个组织结构,以方便将来更多语言的添加。在此我们设计如下:Locale有关的文件放置在config/locales下,假设你要支持中文和英文,那么你需要在这个文件夹下放置en.json和zh.json。大概的内容如下所示:# zh.json{"zh": { "submit": "提交", "create": "创建" }}#en.json{"

2021-02-10 07:08:15 933 2

原创 go web本地化资源

本地化文本消息本信息是编写Web应用中最常用到的,也是本地化资源中最多的信息,想要以适合本地语言的方式来显示文本信息,可行的一种方案是:建立需要的语言相应的map来维护一个key-value的关系,在输出之前按需从适合的map中去获取相应的文本,如下是一个简单的示例:package mainimport "fmt"var locales map[string]map[string]stringfunc main() { locales = make(map[string]map

2021-02-10 07:07:34 542 3

原创 golang设置默认地区

Locale是一组描述世界上某一特定区域文本格式和语言习惯的设置的集合。locale名通常由三个部分组成:第一部分,是一个强制性的,表示语言的缩写,例如"en"表示英文或"zh"表示中文。第二部分,跟在一个下划线之后,是一个可选的国家说明符,用于区分讲同一种语言的不同国家,例如"en_US"表示美国英语,而"en_UK"表示英国英语。最后一部分,跟在一个句点之后,是可选的字符集说明符,例如"zh_CN.gb2312"表示中国使用gb2312字符集。GO语言默认采用"UTF-8"编码集,所以我们实现i18

2021-02-10 07:06:31 805 5

原创 go防止多次递交表单

不知道你是否曾经看到过一个论坛或者博客,在一个帖子或者文章后面出现多条重复的记录,这些大多数是因为用户重复递交了留言的表单引起的。由于种种原因,用户经常会重复递交表单。通常这只是鼠标的误操作,如双击了递交按钮,也可能是为了编辑或者再次核对填写过的信息,点击了浏览器的后退按钮,然后又再次点击了递交按钮而不是浏览器的前进按钮。当然,也可能是故意的——比如,在某项在线调查或者博彩活动中重复投票。那我们如何有效的防止用户多次递交相同的表单呢?解决方案是在表单中添加一个带有唯一值的隐藏字段。在验证表单时,先检查带

2021-02-10 07:05:52 987 6

原创 golang加密和解密数据

base64加解密如果Web应用足够简单,数据的安全性没有那么严格的要求,那么可以采用一种比较简单的加解密方法是base64,这种方式实现起来比较简单,Go语言的base64包已经很好的支持了这个,请看下面的例子:package mainimport ( "encoding/base64" "fmt")func base64Encode(src []byte) []byte { return []byte(base64.StdEncoding.EncodeToSt

2021-02-10 07:05:08 1847

原创 golang存储密码

过去一段时间以来, 许多的网站遭遇用户密码数据泄露事件, 这其中包括顶级的互联网企业–Linkedin, 国内诸如CSDN,该事件横扫整个国内互联网,随后又爆出多玩游戏800万用户资料被泄露,另有传言人人网、开心网、天涯社区、世纪佳缘、百合网等社区都有可能成为黑客下一个目标。层出不穷的类似事件给用户的网上生活造成巨大的影响,人人自危,因为人们往往习惯在不同网站使用相同的密码,所以一家“暴库”,全部遭殃。那么我们作为一个Web应用开发者,在选择密码存储方案时, 容易掉入哪些陷阱, 以及如何避免这些陷阱?

2021-02-10 07:04:32 992 4

原创 golang避免SQL注入

QL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码。SQL注入实例很多Web开发者没有意识到SQL

2021-02-10 07:03:42 2482 3

原创 golang避免XSS攻击

随着互联网技术的发展,现在的Web应用都含有大量的动态内容以提高用户体验。所谓动态内容,就是应用程序能够根据用户环境和用户请求,输出相应的内容。动态站点会受到一种名为“跨站脚本攻击”(Cross Site Scripting, 安全专家们通常将其缩写成 XSS)的威胁,而静态站点则完全不受其影响。什么是XSSXSS攻击:跨站脚本攻击(Cross-Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。XSS

2021-02-10 07:02:49 1912 2

原创 golang确保输入过滤

过滤用户数据是Web应用安全的基础。它是验证数据合法性的过程。通过对所有的输入数据进行过滤,可以避免恶意数据在程序中被误信或误用。大多数Web应用的漏洞都是因为没有对用户输入的数据进行恰当过滤所引起的。我们介绍的过滤数据分成三个步骤:1、识别数据,搞清楚需要过滤的数据来自于哪里 2、过滤数据,弄明白我们需要什么样的数据 3、区分已过滤及被污染数据,如果存在攻击数据那么保证过滤之后可以让我们使用更安全的数据识别数据“识别数据”作为第一步是因为在你不知道“数据是什么,它来自于哪里”的前提下,你

2021-02-10 07:01:44 1906 2

原创 go预防CSRF攻击

CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。那么CSRF到底能够干嘛呢?你可以这样简单的理解:攻击者可以盗用你的登陆信息,以你的身份模拟发送各种请求。攻击者只要借助少许的社会工程学的诡计,例如通过QQ等聊天软件发送的链接(有些还伪装成短域名,用户无法分辨),攻击者就能迫使Web应用的用户去执行攻击者预设的操作。例如,当用户登录网络银行去查看其存款余额,在他没

2021-02-10 07:00:57 940 1

原创 go中的RPC

RPC(Remote Procedure Call Protocol)——远程过程调用协议,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。它假定某些传输协议的存在,如TCP或UDP,以便为通信程序之间携带信息数据。通过它可以使函数调用模式网络化。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。RPC工作原理运行时,一次客户机对服务器的RPC调用,其内部操作大致有如下十步:1.调用客户端句柄;执行传送参.

2021-02-09 11:18:48 1339 11

原创 go中的REST

RESTful,是目前最为流行的一种互联网软件架构。因为它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。本小节我们将来学习它到底是一种什么样的架构?以及在Go里面如何来实现它。什么是RESTREST(REpresentational State Transfer)这个概念,首次出现是在 2000年Roy Thomas Fielding(他是HTTP规范的主要编写者之一)的博士论文中,它指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful的。

2021-02-09 11:17:54 2689 6

原创 go中的WebSocket

WebSocket是HTML5的重要特性,它实现了基于浏览器的远程socket,它使浏览器和服务器可以进行全双工通信,许多浏览器(Firefox、Google Chrome和Safari)都已对此做了支持。在WebSocket出现之前,为了实现即时通信,采用的技术都是“轮询”,即在特定的时间间隔内,由浏览器对服务器发出HTTP Request,服务器在收到请求后,返回最新的数据给浏览器刷新,“轮询”使得浏览器需要对服务器不断发出请求,这样会占用大量带宽。WebSocket采用了一些特殊的报头,使得浏

2021-02-09 11:16:37 1881 3

原创 Go中的Socket编程

在很多底层网络应用开发者的眼里一切编程都是Socket,话虽然有点夸张,但却也几乎如此了,现在的网络编程几乎都是用Socket来编程。你想过这些情景么?我们每天打开浏览器浏览网页时,浏览器进程怎么和Web服务器进行通信的呢?当你用QQ聊天时,QQ进程怎么和服务器或者是你的好友所在的QQ进程进行通信的呢?当你打开PPstream观看视频时,PPstream进程如何与视频服务器进行通信的呢? 如此种种,都是靠Socket来进行通信的,以一斑窥全豹,可见Socket编程在现代编程中占据了多么重要的地位,这一节我们

2021-02-09 11:15:34 938 4

原创 go字符串处理

字符串在我们平常的Web开发中经常用到,包括用户的输入,数据库读取的数据等,我们经常需要对字符串进行分割、连接、转换等操作,本小节将通过Go标准库中的strings和strconv两个包中的函数来讲解如何进行有效快速的操作。字符串操作下面这些函数来自于strings包,这里介绍一些我平常经常用到的函数,更详细的请参考官方的文档。 func Contains(s, substr string) bool 字符串s中是否包含substr,返回bool值 fmt.Println(strin

2021-02-09 11:13:50 956 4

原创 go文件操作

在任何计算机设备中,文件是都是必须的对象,而在Web编程中,文件的操作一直是Web程序员经常遇到的问题,文件操作在Web应用中是必须的,非常有用的,我们经常遇到生成文件目录,文件(夹)编辑等操作,现在我把Go中的这些操作做一详细总结并实例示范如何使用。目录操作文件操作的大多数函数都是在os包里面,下面列举了几个目录操作的: func Mkdir(name string, perm FileMode) error 创建名称为name的目录,权限设置是perm,例如0777 func

2021-02-09 11:12:50 681 2

原创 go模板处理

你一定听说过一种叫做MVC的设计模式,Model处理数据,View展现结果,Controller控制用户的请求,至于View层的处理,在很多动态语言里面都是通过在静态HTML中插入动态语言生成的数据,例如JSP中通过插入,PHP中通过插入来实现的。Web应用反馈给客户端的信息中的大部分内容是静态的,不变的,而另外少部分是根据用户的请求来动态生成的,例如要显示用户的访问记录列表。用户之间只有记录数据是不同的,而列表的样式则是固定的,此时采用模板可以复用很多静态代码。Go模板使用在Go语言中,.

2021-02-09 11:12:17 725 1

原创 go正则处理

正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具。虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活。按照它的语法规则,随需构造出的匹配模式就能够从原始文本中筛选出几乎任何想你要得到的字符组合。如果你在Web开发中需要从一些文本数据源中获取数据,那么你只需要按照它的语法规则,随需构造出正确的模式字符串就能够从原数据源提取出有意义的文本信息。Go语言通过regexp标准包为正则表达式提供了官方支持,如果你已经使用过其他编程语言提供的正则相关功能,那么你应该对Go语言版本的不会太陌生,但是它们之

2021-02-09 11:09:10 990 2

原创 JSON处理

JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。尽管JSON是Javascript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是。JSON由于比XML更小、更快,更易解析,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域。目前我们看到很多的开放平台,基本上都是采用了JSON作为他们的数据交互的接口。既

2021-02-09 11:08:28 637 6

空空如也

空空如也

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

TA关注的人

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