自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一个 技术“译”民 的『技术译站』,微信公众号:技术译站

翻译和分享一些 IT 技术文章, 微信公众号:技术译站

  • 博客(49)
  • 收藏
  • 关注

翻译 C# 9.0 正式发布了(C# 9.0 on the record)

翻译自 Mads Torgersen 2020年11月10日的博文《C# 9.0 on the record》 1,Mads Torgersen 是微软 C# 语言的首席设计师,也是微软 .NET 团队的项目群经理。C# 9.0 正式发布正式宣布:C# 9.0 发布了! 早在5月,我就写了一篇关于 C# 9.0 计划的博文 2,以下是该帖子的更新版本,以匹配我们最终实际交付的产品。对于 C# 的每一个新版本,我们都在努力让常见编码场景的实现变得更加清晰和简单,C# 9.0 也不例外。这次特别关注的.

2020-11-13 16:10:32 326

原创 .NET Worker Service 添加 Serilog 日志记录

前面我们了解了 .NET Worker Service 的入门知识1 和 如何优雅退出 Worker Service 2,今天我们接着介绍一下如何为 Worker Service 添加 Serilog 日志记录。在实际的生产环境中,应用程序中记录日志是非常宝贵的。在许多情况下,开发人员无法直接访问生产环境来调试问题。高质量的日志记录为解决线上问题提供了线索和依据。日志记录是将应用程序操作和状态记录到辅助接口的过程。.NET 日志记录框架.NET 中有很多默认的日志记录提供程序3,它们可以将日志输

2021-06-06 23:35:39 40

原创 .NET Worker Service 如何优雅退出

上一篇文章中我们了解了 .NET Worker Service 的入门知识1,今天我们接着介绍一下如何优雅地关闭和退出 Worker Service。Worker 类从上一篇文章中,我们已经知道了 Worker Service 模板为我们提供三个开箱即用的核心文件,其中 Worker 类是继承自抽象基类 BackgroundService 的,而 BackgroundService 实现了 IHostedService 接口。最终 Worker 类会被注册为托管服务,我们处理任务的核心代码就是写在 Wo

2021-05-18 13:58:57 12

翻译 .NET 中的 Worker Service 入门介绍

翻译自 Steve Gordon 2020年3月30日的文章 《WHAT ARE .NET WORKER SERVICES?》 1随着 .NET Core 3.0 的发布,ASP.NET 团队引入了一个新的 Worker Service 项目模板,该模板作为 .NET SDK 的一部分发布。在本文中,我将向您介绍这个新模板,以及使用它开发的一些实际的服务示例。译者注:请先完成以下准备工作,以便于您理解本文。1、下载并安装最新的 .NET SDK:https://dotnet.microso.

2021-05-10 00:45:53 13

翻译 一图看懂 ASP.NET Core 中的服务生命周期

翻译自 Waqas Anwar 2020年11月8日的文章 《ASP.NET Core Service Lifetimes (Infographic)》 1ASP.NET Core 支持依赖关系注入(DI)软件设计模式,该模式允许我们注册服务、控制如何实例化这些服务并将其注入到不同的组件中。一些服务可以在短周期内实例化,并且仅在特定的组件和请求中可用;一些实例仅被实例化一次,并在整个应用程序生命周期中可用。这就是 ASP.NET Core 中可用的服务生命周期,共三种,下面我们来分别介绍一下。Si.

2021-04-26 23:58:32 43

翻译 创建支持依赖注入、Serilog 日志和 AppSettings 的 .NET 5 控制台应用

翻译自 Mohamad Lawand 2021年3月24日的文章 《.NET 5 Console App with Dependency Injection, Serilog Logging, and AppSettings》 1在本文中,我们将构建一个 .NET 5 控制台应用程序,该应用程序支持依赖注入、日志记录和 appsettings 配置。你也可以在 YouTube 上观看完整的视频2,还可以在 GitHub 上下载源代码3。我们要用到的开发工具有:Visual Studio C.

2021-04-26 23:55:55 46

翻译 Asp.Net Core 5 REST API 使用 RefreshToken 刷新 JWT - Step by Step

翻译自 Mohamad Lawand 2021年1月25日的文章 《Refresh JWT with Refresh Tokens in Asp.Net Core 5 Rest API Step by Step》 1在本文中,我将向您演示如何在 Asp.Net Core REST API 中将 Refresh Token 添加到 JWT 身份验证。我们将覆盖的一些主题包含:Refresh Token、一些新的 Endpoints 功能和 JWT(JSON Web Token)。你也可以在 YouT.

2021-04-15 20:04:33 52

翻译 Asp.Net Core 5 REST API 使用 JWT 身份验证 - Step by Step

翻译自 Mohamad Lawand 2021年1月22日的文章 《Asp Net Core 5 Rest API Authentication with JWT Step by Step》在本文中,我将向您展示如何向我们的 Asp.Net Core REST API 添加 JWT 身份验证。我们将介绍的主题包含注册、登录功能以及如何使用 JWT (Json Web Tokens)和 Bearer 身份验证。你也可以在 YouTube 上观看完整的视频,还可以下载源代码。这是 API 开发系列.

2021-04-15 19:53:23 28

翻译 Asp.Net Core 5 REST API - Step by Step

翻译自 Mohamad Lawand 2021年1月19日的文章 《Asp.Net Core 5 Rest API Step by Step》 1在本文中,我们将创建一个简单的 Asp.Net Core REST API Todo 应用程序,在其中我们可以添加、编辑、删除和查看待办事项,并且将使用 SQLite 来存储数据。你也可以在 YouTube 上观看完整的视频2,还可以下载源代码3。这是 API 开发系列的第一部分,后面还有:Part 2:Asp.Net Core 5 REST A.

2021-04-12 19:35:38 24

翻译 JWT 介绍 - Step by Step

翻译自 Mohamad Lawand 2021年3月11日的文章 《Intro to JWT - Step by Step》 1在本文中,我将向您介绍 JWT2。我们今天要讲的内容包含:JWT 是什么我们应该在什么时候使用它JWT 与 Session Id 比较JWT 结构JWT 签名JWT 是什么JWT (JSON Web Token) 是一个开放标准3,它定义了一种以紧凑和自包含的方法,用于在双方之间安全地传输编码为 JSON 对象的信息。因此,简单来说,它是 JSON .

2021-03-31 16:14:14 19

翻译 在 .NET Core 5 中集成 Create React app

翻译自 Camilo Reyes 2021年2月22日的文章 《Integrate Create React app with .NET Core 5》 1Camilo Reyes 演示了如何将 Create React app 与 .NET Core 集成,以生成一个移除了几个依赖项的脚手架。Create React app 是社区中创建一个全新 React 项目的首选方式。该工具生成了基础的脚手架用于开始编写代码,并抽象出了许多具有挑战性的依赖项。webpack 和 Babel 之类的 Reac.

2021-03-27 17:54:25 34

翻译 C# 中的动态类型

翻译自 Camilo Reyes 2018年10月15日的文章 《Working with the Dynamic Type in C#》 1.NET 4 中引入了动态类型。动态对象使您可以处理诸如 JSON 文档之类的结构,这些结构的组成可能要到运行时才能知道。在本文中,Camilo Reyes 解释了如何使用动态类型。.NET 4.0 中引入的 dynamic 关键字为 C# 编程带来了一个范式转变。对于 C# 程序员来说,强类型系统之上的动态行为可能会让人感到不适 —— 当您在编译过程中失去类.

2021-03-16 18:54:31 12

翻译 在 .NET Core 中构建 REST API

翻译自 Camilo Reyes 2020年8月26日的文章 《Build a REST API in .NET Core》 1REST API 可以使用简单的动词(如 POST、PUT、PATCH 等)将大型解决方案背后的复杂性隐藏起来。在本文中,Camilo Reyes 解释了如何在 .NET Core 中创建 REST API。扩展大型复杂解决方案的一种方法是将它们分解为 REST 微服务。微服务开启了 API 背后的业务逻辑的可测试性和可重用性。因为 REST API 可以被多个客户端重用,.

2021-03-16 18:50:42 25

原创 C# 中的 null 包容运算符 “!” —— 概念、由来、用法和注意事项

在 2020 年的最后一天,博客园发起了一个开源项目:基于 .NET 的博客引擎 fluss,我抽空把源码下载下来看了下,发现在属性的定义中,有很多地方都用到了 null!,如下图所示:这是什么用法呢?之前没有在项目中用过,所以得空就研究了一下。以前,! 运算符用来表示 “否”,比如不等于 !=。在 C# 8.0 以后,! 运算符有了一个新意义—— null 包容运算符,用来控制类型的可空性。要了解 null 包容运算符,首先就要了解可为 null 的引用类型。可为 null 的引用类型C# 8.

2021-01-12 19:18:31 83

原创 如何禁用控制台窗口的关闭按钮?

这是一段古老的代码,也是我以前经常用到的代码。虽然现在和以后基本上都不会再用到它了,但是在特定的场景中,它很好用。使用场景有时候,我们需要编写一个具有一定处理逻辑的控制台程序,这比编写 Windows 服务要简单一些。但是,我们要防止不小心点击到控制台窗口右上角的关闭按钮而导致程序非正常退出。于是就有了如这篇文章标题所述的一个简单的需求。代码实现查找 Windows 窗口和禁用 Windows 窗口的按钮,需要用到 Windows API FindWindow 、GetSystemMenu 和 Re

2021-01-12 19:16:18 49

翻译 Windows Terminal 新手入门

翻译自 Kayla Cinnamon 2020年12月17日的文章《Getting Started with Windows Terminal》 1安装Windows Terminal(Windows 终端)有两个不同的版本:Windows Terminal2 和 Windows Terminal 预览版3。两个版本都可以从 Microsoft Store 和 GitHub 发布页4下载。必备条件不管要运行哪一个 Windows Terminal 版本,您的机器必须是 Windows 10 19.

2020-12-31 19:03:26 43

翻译 在 WSL Ubuntu 上使用 .NET 进行跨平台开发新手入门

翻译自 haydenb 2020年6月3日的文章《Getting started with cross-platform development using .NET on Ubuntu on WSL》 1.NET 是一个开源软件框架,用于在 Linux、Windows 和 macOS 上构建跨平台应用程序。WSL 上的 Ubuntu 2允许您同时为 Ubuntu 和 Windows 构建和测试应用程序。当我们把这些融合在一起时会发生什么呢?这篇博客将演示如何在 WSL 上安装 .NET 开发栈,并构.

2020-12-31 18:59:43 48

原创 C# 中 ConcurrentDictionary 一定线程安全吗?

根据 .NET 官方文档的定义:ConcurrentDictionary<TKey,TValue> Class 表示可由多个线程同时访问的线程安全的键/值对集合。这也是我们在并发任务中比较常用的一个类型,但它真的是绝对线程安全的吗?仔细阅读官方文档,我们会发现在文档的底部线程安全性小节里这样描述:ConcurrentDictionary<TKey,TValue> 的所有公共和受保护的成员都是线程安全的,可从多个线程并发使用。但是,通过一个由 ConcurrentDictiona

2020-12-22 18:06:14 90

翻译 如何在 Windows 10 上安装 WSL 2

翻译自 Joey Sneddon 2020年10月30日的文章《How to Install WSL 2 on Windows 10》 1如果您想在最新的 Windows 版本中尝试经过改进的 Windows 子系统 Linux 2 (即 WSL 2) 2,要怎么做呢?我们在本文中介绍了安装它所需要做的所有事情。WSL 2 是微软早在 2017 年推出的 WSL 的原始版本的重大升级。WSL 2 不仅仅是版本的升级。它更快、更通用,并且使用真正的 Linux 内核。未来的 Linux 内核更新甚至.

2020-12-15 19:24:45 89

原创 连接数从异常到 300 到 5(RDS MySQL 的一个大坑•后记)

在 《记 RDS MySQL 的一个大坑》 中,我提到遇到 User juxxxxxxxxxx already has more than ‘max_user_connections’ active connections…… 这样的错误,最终通过在循环中使用 Thread.Sleep,降低 CRUD 操作的频率,让连接数下降至不到原来的一半,从而解决了这个棘手的问题,有兴趣的朋友可以点击链接回顾一下。今天又看了一下添加 Thread.Sleep 后,程序运行时的 IOPS 和 连接数:运行结果:连接

2020-12-13 15:26:03 21

原创 连接数从异常到 300 到 5(记 RDS MySQL 的一个大坑)

花了一个下午的时间,终于把一个 RDS MySQL 的一个大坑填上了,解决方法令人匪夷所思!绝对会让各位看官感到大吃一惊,RDS MySQL 居然有这样 xx 的大坑!问题最近应业务的需求,加了一个定时统计的任务,其中的算法很简单,只是需要大量的 CRUD 操作。由于业务简单,且时效性要求不高,所以代码写起来若行云流水,一气呵成,本地测试一遍通过。没料想,当部署到线上测试的时候,却上演了现场翻车,真是让人大跌眼镜……看了一下错误日志,大致如下所示:ERROR [DAL.EvaluateDetai

2020-12-13 15:18:20 44

翻译 Docker 与 Podman 容器管理的比较

翻译自 Paul Ferrill 2020年9月1日的文章《Compare Docker vs. Podman for container management》 1Docker 和 Podman 在管理容器方面提供了类似的功能,但是 Docker 的安全漏洞可能使 Podman 对于某些管理员来说更具吸引力。目前 Docker 已经成为许多 IT 管理员们事实上的标准,并且在开发人员中占有很大的份额。 但是,Podman 由于具有以非特权用户身份运行且无需守护进程的能力,因此与基本的 Docke.

2020-12-04 18:20:02 211

翻译 Docker Vs Podman

翻译自 Chetansingh 2020年4月24日的博文《Docker Vs Podman》 1容器化的一场全新革命是从 Docker 开始的,Docker 的守护进程管理着所有的事情,并成为最受欢迎和广泛使用的容器管理系统之一。但是,请稍等!您真的会假设 Docker 是唯一有效的容器化方式而认为值得坚持去使用它吗?这篇博文将帮助您了解以下问题:为什么我们不使用 Docker? 为什么我们要使用 Docker? 没有别的选择了吗?其实,当您决定要开始使用一套新的工具进行容器管理时,Doc.

2020-12-01 11:59:22 364

原创 C# 中的本地函数

今天我们来聊一聊 C# 中的本地函数。本地函数是从 C# 7.0 开始引入,并在 C# 8.0 和 C# 9.0 中加以完善的。引入本地函数的原因我们来看一下微软 C# 语言首席设计师 Mads Torgersen 的一段话:Mads Torgersen:我们认为这个场景是有用的 —— 您需要一个辅助函数。 您仅能在单个函数中使用它,并且它可能使用包含在该函数作用域内的变量和类型参数。 另一方面,与 lambda 不同,您不需要将其作为第一类对象,因此您不必关心为它提供一个委托类型并分配一个实际的

2020-11-24 17:55:06 29

原创 C# 中的数字分隔符 _

编写 C# 代码时,我们时常会用到很大的数字,例如下面定义的变量:const long loops = 50000000000;您能快速读出这是多少吗?是不是还是会有很多人把光标定位到最后一位,然后按键盘上的向左键一个一个往上数:个、十、百、千、万、十万、百万、千万、亿、十亿、百亿、千亿……数字的这种写法,严重影响了它的可读性。所以人们才会发明了诸如千分位之类的写法,上面的数字用千分位可以写作 50,000,000,000,这样子是不是可读性就强多了?不过这是西方人的写法。如果按照我们中国人的习

2020-11-17 19:24:35 46

原创 C# 8: 可变结构体中的只读实例成员

在之前的文章中我们介绍了 C# 中的 只读结构体(readonly struct)1 和与其紧密相关的 in 参数2。今天我们来讨论一下从 C# 8 开始引入的一个特性:可变结构体中的只读实例成员(当结构体可变时,将不会改变结构体状态的实例成员声明为 readonly)。引入只读实例成员的原因简单来说,还是为了提升性能。我们已经知道了只读结构体(readonly struct)和 in 参数可以通过减少创建副本,来提高代码运行的性能。当我们创建只读结构体类型时,编译器强制所有成员都是只读的(即没有实

2020-11-13 16:04:34 17

原创 C# 中的 in 参数和性能分析

in 修饰符也是从 C# 7.2 开始引入的,它与我们上一篇中讨论的 《C# 中的只读结构体(readonly struct)》1 是紧密相关的。in 修饰符in 修饰符通过引用传递参数。 它让形参成为实参的别名,即对形参执行的任何操作都是对实参执行的。 它类似于 ref 或 out 关键字,不同之处在于 in 参数无法通过调用的方法进行修改。ref 修饰符,指定参数由引用传递,可以由调用方法读取或写入。out 修饰符,指定参数由引用传递,必须由调用方法写入。in 修饰符,指定参数由引用传递,可

2020-11-05 18:10:11 24

翻译 C# 中的只读结构体(readonly struct)

翻译自 John Demetriou 2018年4月8日 的文章 《C# 7.2 – Let’s Talk About Readonly Structs》1在本文中,我们来聊一聊从 C# 7.2 开始出现的一个特性 readonly struct。任一结构体都可以有公共属性、私有属性访问器等等。我们从以下结构体示例来开始讨论:public struct Person{ public string Name { get; set; } public string Surname .

2020-10-29 19:44:58 106

翻译 C# 8: 默认接口方法

翻译自 John Demetriou 2018年8月4日 的文章 《C# 8: Default Interface Methods》1,补充了一些内容C# 8 之前今天我们来聊一聊默认接口方法。听起来真的很奇怪,不是吗?接口仅用于定义契约。接口的实现类会拥有一组公共方法,不过实现类被赋予了以其自己的方式实现每个方法的自由。目前为止,如果我们还需要为这些方法中的一个或多个方法提供实现,我们将使用继承。如果我们希望这个类不是实现所有方法,而只是实现其中的一个子集,我们可以将这些方法和类本身抽象(abs.

2020-10-22 17:03:34 33

翻译 多重继承和菱形问题

多重继承的一个大问题就是菱形问题,由于菱形问题,Java 和 C# 都不允许多重继承。开篇之前,我假设每个人都知道在面向对象编程中继承是什么,以及它能提供什么好处。

2020-10-21 19:46:53 17

翻译 C# 中 System.Range 结构体

翻译自 John Demetriou 2020年4月6日 的文章 《C# 8 Is Introducing Ranges》我们之前讨论过的 C# 中的一个特性 System.Index 结构体1,与另一特性 System.Range 结构体 是携手并进的。在 C# 8.0 之前,没有访问集合中任意部分的范围或切片的语法。开发人员通常不得不执行一些自定义的切片操作,或者依靠诸如 array.Skip(5).Take(2); 的 LINQ 方法。现在 C# 添加了一个新的小特性,它可以帮助人们从一个大.

2020-10-15 19:36:45 34

翻译 C# 中 System.Index 结构体和 Hat 运算符(^)的全新用法

翻译自 John Demetriou 2019年2月17日 的文章 《C# 8 – Introducing Index Struct And A Brand New Usage For The Hat Operator》今天我们要讲的是 Hat 运算符(^)。目前为止,Hat 运算符(^)已经被用作布尔类型的异或运算符,以及字节、整型类型的按位异或运算符。在 C# 8 中,它有一个新的用法。这个运算符的新用法是自动创建 Index 结构体的实例。那什么是 Index 结构呢?这在 C# 8 中也有介.

2020-10-13 20:18:03 89

翻译 C# 中 Struct 和 Class 的区别总结

翻译自 Manju lata Yadav 2019年6月2日 的博文 《Difference Between Struct And Class In C#》,补充了一些内容和示例。结构体(struct)是类(class)的轻量级版本。结构体是值类型,可用于创建行为类似于内置类型的对象。比较结构体和类共享许多特性,但与类相比有以下局限性。结构体不能有默认构造函数(无参构造函数)或析构函数,构造函数中必须给所有字段赋值。public struct Coords{ public dou.

2020-09-24 20:30:22 41

原创 将微服务部署到 Azure Kubernetes 服务 (AKS) 实践

本文是对 《.NET Tutorial - Deploy a microservice to Azure》 的翻译和实践。入门级踩坑实践,k8s 大佬请回避,以免浪费您宝贵的时间。介绍本文的目的是:通过使用 DockerHub 和 Azure Kubernetes Service (AKS) 将之前 使用 .NET 和 Docker 构建的微服务 部署到微软 Azure 云上,来介绍微服务的基本部署过程。推送到 Docker HubDocker Hub 是世界上最大的容器镜像库和社区。许多产品,.

2020-09-17 00:24:03 367

翻译 编写第一个 .NET 微服务

介绍本文的目的是:通过创建一个返回列表的简单服务,并在 Docker 容器中运行该服务,让您熟悉使用 .NET 创建微服务的构建过程。安装 .NET SDK要开始构建 .NET 应用程序,首先下载并安装 .NET Core SDK(软件开发工具包)。根据操作系统的类型下载并安装对应版本的 .NET Core SDK v3.1:.NET SDK (64-位) 或 .NET SDK (32-位)全部 .NET SDK 下载页面(Download .NET SDKs for Visual Studi

2020-09-13 01:44:31 17

原创 使用 Visual Studio 2019 批量添加代码文件头

应用场景介绍在我们使用一些开源项目时,基本上都会在每个源代码文件的头部看到一段版权声明。一个项目或解决方案中源代码文件的个数少则几十,多则几千甚至更多,那么怎么才能给这么多文件方便地批量添加或者修改一致的文件头呢?在 2020 年 8 月 11 日 更新的 Visual Studio 2019 v16.7.1 版中,就加入了使用 EditorConfig 向现有文件、项目和解决方案添加文件头 这一功能。提到 EditorConfig, 那么:什么是 EditorConfig?EditorConfig

2020-09-05 09:31:25 351

翻译 欢迎来到 C# 9.0(Welcome to C# 9.0)

翻译自 Mads Torgersen 2020年5月20日的博文《Welcome to C# 9.0》,Mads Torgersen 是微软 C# 语言的首席设计师,也是微软 .NET 团队的项目群经理。C# 9.0 正在成形,我想和大家分享一下我们对下一版本语言中添加的一些主要特性的想法。对于 C# 的每一个新版本,我们都在努力让常见编码场景的实现变得更加清晰和简单,C# 9.0 也不例外。这次特别关注的是支持数据模型的简洁和不可变表示。

2020-08-30 01:51:58 268

翻译 .NET - Task.Run vs Task.Factory.StartNew

翻译自 Stephen Toub 2011年10月24日的博文《Task.Run vs Task.Factory.StartNew》,Stephen Toub 是微软并行计算平台团队的首席架构师。在 .NET 4 中,Task.Factory.StartNew 是安排新任务的首选方法。它有许多重载提供了高度可配置的机制,通过启用设置选项,可以传递任意状态、启用取消,甚至控制调度行为。所有这些功能的另一面是复杂性。您需要知道什么时候使用哪个重载、提供什么调度程序等等。另外,Task.Factory.St.

2020-08-25 20:07:38 87

翻译 Docker 基础知识 - 编排 - 在开发机上设置和使用 Kubernetes 环境

Kubernetes 提供了许多缩放、联网、保护和维护您的容器化应用程序的工具,这些工具超出了容器本身的能力。Kubernetes 中的所有容器都被安排为 pods,即共享一些资源的位于同一位置的容器组。此外,在实际的应用程序中,我们几乎从不创建单独的 pod;相反,我们的大部分工作负载被安排为部署(deployments),部署是由 Kubernetes 自动维护的可缩放的 pods 组。

2020-08-16 13:22:37 60

翻译 Docker 基础知识 - 在生产环境中运行您的应用 - 编排概述

容器化流程的可移植性和可再现性意味着我们有机会跨云和数据中心移动和缩放我们的容器化应用程序。容器有效地保证了这些应用程序在任何地方都以相同的方式运行,从而使我们能够快速、轻松地利用所有这些环境。此外,随着应用程序规模的扩大,我们需要一些工具来帮助自动化这些应用程序的维护,能够自动替换失败的容器,并在这些容器的生命周期中管理更新和配置的上线。管理、缩放和维护容器化应用程序的工具称为编排器,其中最常见的例子是 Kubernetes 和 Docker Swarm。这两种编排器的开发环境部署都由 Docker D

2020-08-09 15:12:22 51

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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