自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(1158)
  • 资源 (17)
  • 收藏
  • 关注

原创 第4部分 附录A 谈一谈网络编程学习经验

本文谈一谈我在学习网络编程方面的一些个人经验。“网络编程”这个术语的范围很广,本文指用Sockets API开发基于TCP/IP的网络应用程序,具体定义见§ A.1.5“网络编程的各种任务角色”。受限于本人的经历和经验,本附录的适应范围是:● x86-64 Linux服务端网络编程,直接或间接使用Sockets API。● 公司内网。不一定是局域网,但总体位于公司防火墙之内,环境可控。

2025-12-08 23:16:28 536

原创 第12章 C++经验谈(2)

我对C++的基本态度是“练从难处练,用从易处用”,因此本章有几节“负面”的内容。我坚信软件开发一定要时刻注意减少不必要的复杂度,一些花团锦簇的招式玩不好反倒会伤到自己。作为应用程序的开发者,对技术的运用要明智,不要为了解决难度系数为10的问题而去强攻难度系数为100的问题,这就本末倒置了。

2025-12-02 23:12:12 971

原创 第12章 C++经验谈(1)

我对C++的基本态度是“练从难处练,用从易处用”,因此本章有几节“负面”的内容。我坚信软件开发一定要时刻注意减少不必要的复杂度,一些花团锦簇的招式玩不好反倒会伤到自己。作为应用程序的开发者,对技术的运用要明智,不要为了解决难度系数为10的问题而去强攻难度系数为100的问题,这就本末倒置了。

2025-12-01 22:47:47 548

原创 第11章 反思 C++ 面向对象与虚函数(3)

C++的面向对象语言设施相比其他现代语言可算得上“简陋”,而且与语言的其他部分(better C、数据抽象、泛型)融合度较差(见电子工业出版社出版的《C++Primer(第4版)(评注版)》第15章)。在C++中进行面向对象编程会遇到其他语言中不存在的问题,其本质原因是C++ class是值语义,而非对象语义。本章主要介绍虚函数存在的问题和替代方法,iostream的用途与局限,值语义与数据抽象。

2025-11-30 23:30:07 825

原创 第11章 反思 C++ 面向对象与虚函数(2)

C++的面向对象语言设施相比其他现代语言可算得上“简陋”,而且与语言的其他部分(better C、数据抽象、泛型)融合度较差(见电子工业出版社出版的《C++Primer(第4版)(评注版)》第15章)。在C++中进行面向对象编程会遇到其他语言中不存在的问题,其本质原因是C++ class是值语义,而非对象语义。本章主要介绍虚函数存在的问题和替代方法,iostream的用途与局限,值语义与数据抽象。

2025-11-28 23:06:19 707

原创 第11章 反思 C++ 面向对象与虚函数(1)

C++的面向对象语言设施相比其他现代语言可算得上“简陋”,而且与语言的其他部分(better C、数据抽象、泛型)融合度较差(见电子工业出版社出版的《C++Primer(第4版)(评注版)》第15章)。在C++中进行面向对象编程会遇到其他语言中不存在的问题,其本质原因是C++ class是值语义,而非对象语义。本章主要介绍虚函数存在的问题和替代方法,iostream的用途与局限,值语义与数据抽象。

2025-11-27 23:38:11 762

原创 第10章 C++编译链接模型精要(2)

C++从C语言继承了一种古老的编译模型,引发了其他语言中根本不存在的一些编译方面的问题(比方说“一次定义原则(ODR))。理解这些问题有助于在实际开发中规避各种古怪的错误。本章主要介绍C语言的编译模型及其成因,C++的编译模型,C++链接(linking),工程项目中头文件的使用规则,工程项目中库文件的组织原则

2025-11-26 23:48:01 621

原创 第10章 C++编译链接模型精要(1)

C++从C语言继承了一种古老的编译模型,引发了其他语言中根本不存在的一些编译方面的问题(比方说“一次定义原则(ODR))。理解这些问题有助于在实际开发中规避各种古怪的错误。本章主要介绍C语言的编译模型及其成因,C++的编译模型,C++链接(linking),工程项目中头文件的使用规则,工程项目中库文件的组织原则

2025-11-21 23:35:41 796

原创 第9章 分布式系统工程实践(2)

本章谈的分布式系统是指运行在公司防火墙以内的信息基础设施(infrastruc-ture),用于对外(客户)提供联机信息服务,不是针对公司员工的办公自动化系统。服务器的硬件平台是多核Intel x86-64处理器、几十GB内存、千兆网互联、常规存储、运行Linux操作系统。系统的规模大约在几十台到几百台,可以位于一个机房,也可以位于全球的多个数据中心。只有两台机器的双机容错(热备)系统不是本章的讨论范围。服务程序是普通的Linux用户进程,进程之间通过TCP/IP通信。

2025-11-15 23:09:08 745

原创 第9章 分布式系统工程实践(1)

本章谈的分布式系统是指运行在公司防火墙以内的信息基础设施(infrastruc-ture),用于对外(客户)提供联机信息服务,不是针对公司员工的办公自动化系统。服务器的硬件平台是多核Intel x86-64处理器、几十GB内存、千兆网互联、常规存储、运行Linux操作系统。系统的规模大约在几十台到几百台,可以位于一个机房,也可以位于全球的多个数据中心。只有两台机器的双机容错(热备)系统不是本章的讨论范围。服务程序是普通的Linux用户进程,进程之间通过TCP/IP通信。

2025-11-14 23:50:07 612

原创 第8章 muduo网络库设计与实现(4)

本章从零开始逐步实现一个类似muduo的基于Reactor模式的C++网络库,大体反映了muduo网络相关部分的开发过程。本章大致分为三段,为了与代码匹配,本章的小节从0开始编号。注意本章呈现的代码与现在muduo的代码略有出入。

2025-11-13 23:27:55 922

原创 第8章 muduo网络库设计与实现(3)

本章从零开始逐步实现一个类似muduo的基于Reactor模式的C++网络库,大体反映了muduo网络相关部分的开发过程。本章大致分为三段,为了与代码匹配,本章的小节从0开始编号。注意本章呈现的代码与现在muduo的代码略有出入。

2025-11-12 23:56:54 766

原创 第8章 muduo网络库设计与实现(2)

本章从零开始逐步实现一个类似muduo的基于Reactor模式的C++网络库,大体反映了muduo网络相关部分的开发过程。本章大致分为三段,为了与代码匹配,本章的小节从0开始编号。注意本章呈现的代码与现在muduo的代码略有出入。

2025-11-11 23:25:27 1038

原创 第8章 muduo网络库设计与实现(1)

本章从零开始逐步实现一个类似muduo的基于Reactor模式的C++网络库,大体反映了muduo网络相关部分的开发过程。本章大致分为三段,为了与代码匹配,本章的小节从0开始编号。注意本章呈现的代码与现在muduo的代码略有出入。

2025-11-09 23:19:07 958

原创 第7章 muduo编程示例(11)

本章将介绍如何用muduo网络库完成常见的TCP网络编程任务。内容如下:1.[UNP]中的五个简单协议。2.文件传输,示范非阻塞TCP网络程序中如何完整地发送数据。3.Boost.Asio中的示例。4.muduo Buffer class的设计与使用。5.Protobuf编码解码器(codec)与消息分发器(dispatcher)。6.限制服务器的最大并发连接数。7.Java Netty中的示例。8.用于测试两台机器的往返延迟的roundtrip。9.用timing wheel踢掉空闲连接。等等。。。

2025-11-08 23:36:30 1024

原创 第7章 muduo编程示例(10)

本章将介绍如何用muduo网络库完成常见的TCP网络编程任务。内容如下:1.[UNP]中的五个简单协议。2.文件传输,示范非阻塞TCP网络程序中如何完整地发送数据。3.Boost.Asio中的示例。4.muduo Buffer class的设计与使用。5.Protobuf编码解码器(codec)与消息分发器(dispatcher)。6.限制服务器的最大并发连接数。7.Java Netty中的示例。8.用于测试两台机器的往返延迟的roundtrip。9.用timing wheel踢掉空闲连接。等等。。。

2025-11-07 23:13:06 825

原创 第7章 muduo编程示例(9)

本章将介绍如何用muduo网络库完成常见的TCP网络编程任务。内容如下:1.[UNP]中的五个简单协议。2.文件传输,示范非阻塞TCP网络程序中如何完整地发送数据。3.Boost.Asio中的示例。4.muduo Buffer clss的设计与使用。5.Protobuf编码解码器(codec)与消息分发器(dispatcher)。6.限制服务器的最大并发连接数。7.Java Netty中的示例。8.用于测试两台机器的往返延迟的roundtrip。9.用timing wheel踢掉空闲连接。等等。。。

2025-11-01 23:01:12 945

原创 第7章 muduo编程示例(8)

本章将介绍如何用muduo网络库完成常见的TCP网络编程任务。内容如下:1.[UNP]中的五个简单协议。2.文件传输,示范非阻塞TCP网络程序中如何完整地发送数据。3.Boost.Asio中的示例。4.muduo Buffer clss的设计与使用。5.Protobuf编码解码器(codec)与消息分发器(dispatcher)。6.限制服务器的最大并发连接数。7.Java Netty中的示例。8.用于测试两台机器的往返延迟的roundtrip。9.用timing wheel踢掉空闲连接。等等。。。

2025-10-31 23:23:38 595

原创 第7章 muduo编程示例(7)

本章将介绍如何用muduo网络库完成常见的TCP网络编程任务。内容如下:1.[UNP]中的五个简单协议。2.文件传输,示范非阻塞TCP网络程序中如何完整地发送数据。3.Boost.Asio中的示例。4.muduo Buffer class的设计与使用。5.Protobuf编码解码器(codec)与消息分发器(dispatcher)。6.限制服务器的最大并发连接数。7.Java Netty中的示例。8.用于测试两台机器的往返延迟的roundtrip。9.用timing wheel踢掉空闲连接。等等。。。

2025-10-30 23:34:49 620

原创 第7章 muduo编程示例(6)

本章将介绍如何用muduo网络库完成常见的TCP网络编程任务。内容如下:1.[UNP]中的五个简单协议。2.文件传输,示范非阻塞TCP网络程序中如何完整地发送数据。3.Boost.Asio中的示例。4.muduo Buffer class的设计与使用。5.Protobuf编码解码器(codec)与消息分发器(dispatcher)。6.限制服务器的最大并发连接数。7.Java Netty中的示例。8.用于测试两台机器的往返延迟的roundtrip。9.用timing wheel踢掉空闲连接。等等。。。

2025-10-26 23:36:36 939

原创 第7章 muduo编程示例(5)

本章将介绍如何用muduo网络库完成常见的TCP网络编程任务。内容如下:1.[UNP]中的五个简单协议。2.文件传输,示范非阻塞TCP网络程序中如何完整地发送数据。3.Boost.Asio中的示例。4.muduo Buffer class的设计与使用。5.Protobuf编码解码器(codec)与消息分发器(dispatcher)。6.限制服务器的最大并发连接数。7.Java Netty中的示例。8.用于测试两台机器的往返延迟的roundtrip。9.用timing wheel踢掉空闲连接。等等。。。

2025-10-25 23:31:39 1061

原创 第7章 muduo编程示例(4)

本章将介绍如何用muduo网络库完成常见的TCP网络编程任务。内容如下:1.[UNP]中的五个简单协议。2.文件传输,示范非阻塞TCP网络程序中如何完整地发送数据。3.Boost.Asio中的示例。4.muduo Buffer clss的设计与使用。5.Protobuf编码解码器(codec)与消息分发器(dispatcher)。6.限制服务器的最大并发连接数。7.Java Netty中的示例。8.用于测试两台机器的往返延迟的roundtrip。9.用timing wheel踢掉空闲连接。等等。。。

2025-10-24 23:45:16 997

原创 第7章 muduo编程示例(3)

本章将介绍如何用muduo网络库完成常见的TCP网络编程任务。内容如下:1.[UNP]中的五个简单协议。2.文件传输,示范非阻塞TCP网络程序中如何完整地发送数据。3.Boost.Asio中的示例。4.muduo Buffer class的设计与使用。5.Protobuf编码解码器(codec)与消息分发器(dispatcher)。6.限制服务器的最大并发连接数。7.Java Netty中的示例。8.用于测试两台机器的往返延迟的roundtrip。9.用timing wheel踢掉空闲连接。等等。。。

2025-10-20 23:31:07 798

原创 第7章 muduo编程示例(2)

本章将介绍如何用muduo网络库完成常见的TCP网络编程任务。内容如下:1.[UNP]中的五个简单协议。2.文件传输,示范非阻塞TCP网络程序中如何完整地发送数据。3.Boost.Asio中的示例。4.muduo Buffer class的设计与使用。5.Protobuf编码解码器(codec)与消息分发器(dispatcher)。6.限制服务器的最大并发连接数。7.Java Netty中的示例。8.用于测试两台机器的往返延迟的roundtrip。9.用timing wheel踢掉空闲连接。等等。。。

2025-10-19 23:12:30 768

原创 第7章 muduo编程示例(1)

本章将介绍如何用muduo网络库完成常见的TCP网络编程任务。内容如下:1.[UNP]中的五个简单协议。2.文件传输,示范非阻塞TCP网络程序中如何完整地发送数据。3.Boost.Asio中的示例。4.muduo Buffer class的设计与使用。5.Protobuf编码解码器(codec)与消息分发器(dispatcher)。6.限制服务器的最大并发连接数。7.Java Netty中的示例。8.用于测试两台机器的往返延迟的roundtrip。9.用timing wheel踢掉空闲连接。等等。。。

2025-10-16 23:48:34 1084

原创 第6章 muduo网络库简介(2)

2010年3月我写了一篇《学之者生,用之者死——ACE历史与简评》,其中提到“我心目中理想的网络库”的样子:● 线程安全,原生支持多核多线程。● 不考虑可移植性,不跨平台,只支持Linux,不支持Windows。● 主要支持x86-64,兼顾IA32。● 不支持UDP,只支持TCP。● 不支持IPv6,只支持IPv4。● 不考虑广域网应用,只考虑局域网。。。。在想清楚这些目标之后,我开始第三次尝试编写自己的C++网络库。与前两次不同,这次我一开始就想好了库的名字,叫muduo

2025-10-13 23:26:18 762

原创 第6章 muduo网络库简介(1)

2010年3月我写了一篇《学之者生,用之者死——ACE历史与简评》,其中提到“我心目中理想的网络库”的样子:● 线程安全,原生支持多核多线程。● 不考虑可移植性,不跨平台,只支持Linux,不支持Windows。● 主要支持x86-64,兼顾IA32。● 不支持UDP,只支持TCP。● 不支持IPv6,只支持IPv4。● 不考虑广域网应用,只考虑局域网。。。。在想清楚这些目标之后,我开始第三次尝试编写自己的C++网络库。与前两次不同,这次我一开始就想好了库的名字,叫muduo

2025-10-10 23:53:18 652

原创 第5章 高效的多线程日志

本章的“日志”是前一个意思,即文本的、供人阅读的日志,通常用于故障诊断和追踪(trace),也可用于性能分析。对于关键进程,日志通常要记录:1.收到的每条内部消息的id(还可以包括关键字段、长度、hash等);2.收到的每条外部消息的全文;3.发出的每条消息的全文,每条消息都有全局唯一的id;4.关键内部状态的变更,等等。每条日志都有时间戳,这样就能完整追踪分布式系统中一个事件的来龙去脉。也只有这样才能查清楚发生故障时究竟发生了什么,比如业务处理流程卡在了哪一步。

2025-10-09 23:16:54 1071

原创 第4章 C++多线程系统编程精要

学习多线程编程面临的最大的思维方式的转变有两点:● 当前线程可能随时会被切换出去,或者说被抢占(preempt)了。● 多线程程序中事件的发生顺序不再有全局统一的先后关系。当线程被切换回来继续执行下一条语句(指令)的时候,全局数据(包括当前进程在操作系统内核中的状态)可能已经被其他线程修改了。这些都会导致程序异常,本篇介绍c++多线程系统编程中的要点。

2025-10-08 23:36:31 686

原创 第3章 多线程服务器的适用场合与常用编程模型

本章主要讲我个人在多线程开发方面的一些粗浅经验。总结了一两种常用的线程模型,归纳了进程间通信与线程同步的最佳实践,以期用简单规范的方式开发功能正确、线程安全的多线程程序。本章假定读者已经有多线程编程的知识与经验(本书不是一篇入门教程)。文中的“多线程服务器”是指运行在Linux操作系统上的独占式网络应用程序。硬件平台为Intel x86-64系列的多核CPU,单路或双路SMP服务器(每台机器一共拥有四个核或八个核,十几GB内存),机器之间用千兆以太网连接。这大概是目前民用PC服务器的主流配置。

2025-10-07 23:09:33 1105

原创 第2章 线程同步精要

并发编程有两种基本模型,一种是message passing,另一种是shared memory。在分布式系统中,运行在多台机器上的多个进程的并行编程只有一种实用模型:message passing。在多线程编程中,message passing更容易保证程序的正确性,有的语言只提供这一种模型。不过在用C/C++编写多线程程序时,我们仍然需要了解底层的shared memory模型下的同步原语,以备不时之需。本章不是多线程教程,而是个人经验总结,分享一些C++多线程编程的经验.

2025-10-06 23:18:28 891

原创 VS2019如何获取C++标准库的版本

咱们在开发c++项目的过程中,经常是采用默认的c++标准库版本,有时一些新功能需要特定的标准库版,那些如何知道标准库的版以及设置标准库的版本呢?本篇记录在VS2019上查看和设置标准库的版本。

2025-10-05 23:28:10 210

原创 第1章 线程安全的对象生命期管理

编写线程安全的类不是难事,用同步原语(synchronization primitives)保护内部状态即可。但是对象的生与死不能由对象自身拥有的mutex(互斥器)来保护。如何避免对象析构时可能存在的race condition(竞态条件)是C++多线程编程面临的基本问题,可以借助Boost库中的shared_ptr和weak_ptr [注:在cpp11中这两个类已是标准库的一部分]完美解决。这也是实现线程安全的Observer模式的必备技术。

2025-10-04 23:52:45 629

原创 Linux多线程服务端编程:使用muduo C++网络库学习之环境配置(VS2019跨平台开发)

本篇记录《Linux多线程服务端编程:使用muduo C++网络库》在ubuntu1804系统上开发环境的配置,包括cmake的安装,boost库的安装与测试,muduo网络库的编译,安装与测试,以及用VS2019开发Linux程序的配置。

2025-10-02 23:00:46 1007

原创 Linux常用命令58——grep文本搜索命令

在使用Linux或macOS日常开发中,熟悉一些基本的命令有助于提高工作效率,本篇学习记录grep命令的基本使用。grep命令来自英文词组global search regular expression and print out the line的缩写,意思是用于全面搜索的正则表达式,并将结果输出。

2025-09-30 23:06:23 1400

原创 Linux常用命令57——scp

在使用Linux或macOS日常开发中,熟悉一些基本的命令有助于提高工作效率,本篇学习记录scp命令的基本使用。scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。它基于 SSH(Secure Shell)协议,确保数据传输的安全性。其实window上也有scp命令,也可以实现window与linux进行文件传输。

2025-09-29 23:02:49 620

原创 Linux常用命令56——man

在使用Linux或macOS日常开发中,熟悉一些基本的命令有助于提高工作效率,本篇学习记录man命令的基本使用。man命令来自英文单词manual的缩写,中文译为“帮助手册”,其功能是查看命令、配置文件及服务的帮助信息。

2025-09-28 23:08:26 1046

原创 Linux常用命令55——ln

在使用Linux或macOS日常开发中,熟悉一些基本的命令有助于提高工作效率, ln(英文全拼:link files)命令是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。本篇学习记录ln命令的基本使用。

2025-09-27 23:57:51 363

原创 Linux常用命令54——ldd

在使用Linux或macOS日常开发中,熟悉一些基本的命令有助于提高工作效率,ldd(List Dynamic Dependencies)是 Linux 系统中一个非常有用的命令行工具,用于显示程序或共享库所依赖的动态链接库。当你在 Linux 上运行一个程序时,系统需要加载该程序依赖的各种共享库(.so 文件),ldd 就是用来查看这些依赖关系的工具。本篇学习记录ldd命令的基本使用。

2025-09-26 23:26:20 383

原创 Linux常用命令53——file识别文件类型

在使用Linux或macOS日常开发中,熟悉一些基本的命令有助于提高工作效率,file命令的功能是识别文件类型,也可以用来辨别一些内容的编码格式。由于Linux系统并不是像Windows系统那样通过扩展名来定义文件类型的,因此用户无法直接通过文件名来进行区别。file命令可以通过分析文件头部信息中的标识信息来显示文件类型,使用很方‍便。本篇学习记录file命令的基本使用。

2025-09-25 23:16:46 375

computer-vision计算机视图算法opencv相关

本项目介绍opencv图像处理的插件算法,包括 如何对图像进行滤波❑ 如何进行图像变换❑ 对于颜色空间,如何进行颜色空间之间的相互转换,以及如何应用颜色映射❑ 图像阈值化❑ OpenCV中可用的绘图函数❑ 模板匹配以及如何使用模板匹配进行物体检测与计数

2024-03-03

QT界面纯代码与控件布局学习

本源码是关于QT界面设计的两种方式学习理解,一个是托控件布局,一种是纯代码实现界面布局

2023-08-06

QTreeView+自定义Model实现示例

QTreeView是用来显示树型结构的数据,比如目录组织,公司组织架构等,数据量小可以用Qt自带的Model实现,如果数据量大,则需要用自定义的Model实现,下面介绍自定义实现的方法。

2022-07-01

QTableView显示自定义CheckBox

QTableView显示自定义CheckBox, 开发环境macos 10.13.1 Qt 5.9.1

2018-08-26

QT读写注册表

本代码是注册表进行读写,先写注册表,再读取注册表的值,QT实现

2015-10-14

VC++ 6.0数据库系统开发实例导航源码

VC++6.0数据库系统开发实例导航的源代码 内容包括 第3章员工培训系统 第4章仓库管理系统 第5章人事管理系统 第6章考勤管理系统 第7章工资管理系统

2011-10-23

QTableView同时显示自定义Checkbox和文件图标

QTableView同时显示自定义Checkbox和文件图标,开发环境macos 10.13.1 Qt 5.9.1

2018-08-26

QT5.7代码行统计工具

用QT5.7实现的简单代码行统计工具

2017-06-20

QT托盘消息模拟QQ消息列表通知

QT实现托盘功能,采用model,View加自定义委托模拟QQ的消息列表通知

2021-01-09

C++ GUI Qt4编程第2版(中英文版)+源码

C++ GUI Qt4编程第2版(中文版)

2015-08-31

qt代码行统计

简单的代码行统计工具

2017-06-21

QtCallQtCustomDll.zip

本资源包含两个工程,一个是动态库项目即Qt创建动态库并添加动态库版本号的实现,另一个是QWidget工程调用QT创建的动态库

2021-10-14

SmtpClient-for-Qt

SMTP协议发送电子邮件,QT实现,QT5测试通过

2015-10-11

qt高级编程(中英文版)+源码

本资源包含 qt高级编程(中文版).pdf qt高级编程(英文版).pdf qt高级编程(源码)

2015-09-01

C++ Qt设计模式第2版(中英文版)+源码

本资源包含三个部分 C++ Qt设计模式第2版(中文版).pdf C++ Qt设计模式第2版(英文版).pdf C++ Qt设计模式第2版(源码)

2015-09-02

Qt中使用QQueue模拟消息队列

使用QQueue, QThread,QMutex,QWaitCondition模拟消息队列的任务处理,实现任务的同步处理

2021-01-14

计算机C二级上机试题(100套)

上传的这份计算机C二级上机试题有100套,里有所有的源代码和答案,是南开大学的。

2010-01-11

空空如也

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

TA关注的人

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