自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 搜索引擎的模块设计及结果展示

本文实现了一个基于Boost文档的搜索引擎系统,主要包括以下模块: 数据清洗模块(Parser) 遍历HTML文件,提取标题、内容和URL 使用控制字符\3作为分隔符保存清洗后的数据 索引构建模块(Index) 正排索引:文档ID映射到文档信息 倒排索引:关键词映射到文档列表 使用cppjieba进行中文分词 搜索模块(Searcher) 对查询词进行分词 检索倒排索引获取相关文档 按权重排序并返回JSON格式结果 HTTP服务模块 提供两种实现:基于cpp-httplib库和自实现版本 处理搜索请求并返回

2025-12-10 21:38:50 970 59

原创 搜索引擎的介绍及相关原理

本文介绍了Boost库站内搜索引擎的实现方案。开发环境采用Ubuntu22.04,技术栈包含C++11、Boost、Jsoncpp等。系统通过正排索引建立文档ID与内容的映射,经过分词处理后构建倒排索引(关键词到文档的映射)。搜索时先在倒排索引中查找关键词对应的文档ID,再通过正排索引获取具体内容,最终返回标题、描述和URL。该系统实现了类似百度等搜索引擎的核心功能,但专注于Boost库文档的站内搜索。

2025-11-28 20:22:16 919 43

原创 日志系统的日志器及性能测试

本文设计并实现了一个高性能日志系统,主要包括以下核心模块: 日志器类采用建造者模式构建,支持同步和异步两种输出方式 同步日志器直接输出日志,异步日志器使用双缓冲区技术提升性能 缓冲区类实现高效的内存管理,支持动态扩容和固定长度两种模式 异步工作器采用生产者-消费者模型,通过条件变量实现线程间通信 单例日志器管理类提供全局访问接口,支持多种日志输出目标 系统测试表明:异步日志器的性能显著优于同步方式,在4线程测试中,异步日志器每秒可处理约30万条日志(29.3MB/s),而同步方式仅能处理约3.5万条(3.4

2025-11-18 22:22:03 824 53

原创 日志消息的构建、输出及落地

本文介绍了日志系统的模块化设计实现,主要包括5个核心组件:1. 实用类(Util)提供基础功能接口,包括获取系统时间、文件路径和创建目录;2. 日志等级类(LogLevel)定义DEBUG到OFF六个等级及转换方法;3. 日志消息类(LogMessage)封装日志各项要素如时间、线程ID等;4. 格式化类(LogFormatter)支持自定义输出格式,解析模式字符串生成格式化对象;5. 日志落地类(LogSink)实现标准输出、文件输出和滚动文件三种输出方式,采用工厂模式创建。各组件均通过单元测试验证功能正

2025-11-08 21:33:53 1024 51

原创 日志系统的介绍及前置技术

本文介绍了一个日志系统的设计与实现,涵盖开发环境、核心技术及必要性。系统支持多级别日志、多种输出目标、同步/异步日志及多线程并发写入。核心技术包括类层次设计、C++11特性、双缓冲区和设计模式。重点讲解了单例模式(饿汉/懒汉)、工厂模式(简单/方法/抽象)和建造者模式的设计与实现,并对比了各种模式的适用场景。此外,还介绍了C/C++不定参数函数的实现方法,为日志系统的参数处理提供技术支持。完整代码见PreTech项目。

2025-11-01 20:08:53 942 66

原创 Linux网络的HTTPS

HTTPS加密机制通过结合对称和非对称加密技术保障数据传输安全。首先使用非对称加密(CA证书验证公钥)安全交换对称密钥,再通过更高效的对称加密传输数据。关键环节包括:1)服务器提供CA机构签名的数字证书,客户端验证证书真实性;2)客户端使用服务器公钥加密对称密钥传输;3)双方使用该对称密钥加密后续通信。这一过程有效防止中间人攻击,既解决了密钥分发难题,又保证了加密效率。数据摘要技术用于验证信息完整性,数字签名则确保身份认证,共同构建起HTTPS的安全基础。

2025-10-29 18:13:01 1334 50

原创 Linux网络的应用层协议HTTP

本文介绍了HTTP协议的基本概念和实现一个简单HTTP服务器的方法。主要内容包括:1. HTTP协议部分:详细讲解了HTTP请求/响应格式、URL结构、常用请求方法(GET/POST)、常见报头字段、状态码分类及含义(如200成功、404未找到等)。2. HelloHttp实现:通过C++代码构建了一个基础HTTP服务器,包含请求解析、响应生成、文件读取等功能模块,支持处理首页请求和404重定向。3. 关键技术点:包括TCP连接管理、HTTP报文序列化/反序列化、状态码处理等。该项目展示了HTTP协议的核心

2025-10-24 16:30:00 1452 64

原创 Linux网络的应用层自定义协议

本文介绍了基于TCP协议实现网络计算器(NetCal)的设计与实现,主要包括以下内容: 应用层协议设计:使用JSON格式序列化结构化数据,通过TCP传输计算请求和结果。采用"长度+\r\n+内容+\r\n"的报文格式解决TCP粘包问题。 核心组件实现: Socket封装:通过多态设计支持TCP/UDP扩展 Protocol处理:实现JSON序列化/反序列化和报文编解码 守护进程化:通过fork+setsid创建独立运行的后台进程 分层架构设计: 应用层:NetCal执行具体计算逻辑 表示

2025-10-16 23:35:50 954 40

原创 Linux的Socket编程之TCP

摘要:本文详细介绍了TCP编程的核心接口与实现方法,包括套接字创建、绑定、监听、连接、消息收发等关键步骤,并针对网络字节序转换进行了说明。第二部分通过CommandServer项目展示了具体应用:1)使用Common.hpp封装网络通用操作;2)Command.hpp实现命令执行功能;3)TcpServer框架支持多线程处理;4)完整实现客户端-服务器交互模型,支持远程命令执行与结果返回。文中特别强调了TCP连接管理、进程/线程处理策略以及网络数据转换的注意事项,为构建稳定网络服务提供了实用方案。

2025-10-08 15:20:35 1034 52

原创 Linux的Socket编程之UDP

本文介绍了UDP网络编程的关键接口与三个典型应用实现。主要内容包括:1)UDP编程接口详解,涵盖套接字创建、绑定、消息收发及网络字节序转换;2)EchoServer实现,展示基本的请求-响应模式;3)DictServer扩展,实现英汉词典翻译功能;4)ChatServer设计,采用线程池处理多客户端群聊消息。各案例均提供完整代码框架,涉及网络地址封装、日志记录、线程安全等关键技术点,体现了模块化设计思想。通过命令行参数配置服务器端口和IP,支持本地测试与网络通信两种模式。

2025-10-03 21:23:30 1886 60

原创 Linux的网络基础

本文介绍了计算机网络基础与Socket编程预备知识。首先阐述计算机网络的产生背景,从局域网到广域网的发展过程。重点讲解了TCP/IP五层模型及其核心协议,包括OSI七层模型对比。在网络通信部分,详细说明了局域网通信机制(MAC地址、端口号、以太网通信)和跨网络通信原理(IP地址、路由转发)。最后介绍了Socket编程的关键概念,包括TCP/UDP协议特性对比、网络字节序以及主要编程接口,为实际网络编程打下理论基础。

2025-09-26 18:11:26 1953 46

原创 Linux的线程池

本文介绍了Linux下日志系统和线程池的实现方案。日志系统采用策略模式,支持控制台和文件两种输出方式,提供DEBUG、INFO等5种日志级别,实现格式化输出和线程安全。线程池采用单例模式实现固定线程数量的管理,通过任务队列分配任务,支持线程同步和优雅退出。两种方案都运用了RAII思想管理资源,使用互斥锁保证线程安全,并提供了详细的代码实现和设计注意事项。日志系统可帮助开发者监控运行状态,线程池则优化了多线程任务处理性能。

2025-09-20 19:34:49 1413 53

原创 Linux的生产者消费者模型

本文介绍了Linux多线程编程中的生产者消费者模型,详细分析了基于阻塞队列和环形阻塞队列的两种实现方案。阻塞队列方案使用锁+条件变量实现线程同步,通过互斥锁保证线程安全,条件变量控制阻塞唤醒。环形队列方案则采用信号量机制,通过两个信号量分别控制生产者和消费者的同步操作。文章通过代码示例展示了两种实现的具体应用,并比较了它们的特性差异,指出环形队列在多块临界资源管理中的优势。最后通过一道面试题演示了信号量和锁+条件变量的不同实现方式,体现了多线程同步控制的编程技巧。

2025-09-15 19:59:03 1529 47

原创 Linux的多线程

本文介绍了多线程编程中的线程同步与线程安全机制,主要包括互斥锁、条件变量、POSIX信号量及其封装实现。重点分析了互斥锁的原理与应用,通过票务系统示例演示了如何避免共享资源竞争;详细讲解了条件变量的等待唤醒机制及其在生产者-消费者模型中的应用;系统阐述了信号量的P/V操作及其线程同步功能。同时剖析了死锁的四个必要条件及避免方法,并探讨了STL容器和智能指针的线程安全性问题,最后通过信号处理中的死锁案例说明了线程安全与可重入性的区别。

2025-09-13 20:22:23 1717 53

原创 Linux的线程概念与控制

首先Linux内核不区分"进程"和"线程",统一用task_struct管理。CPU处理的是一个个task_struct。进程1个或多个task_struct(PCB) +代码和数据线程(轻量级进程) =1个task_struct(PCB) (它通过指针共享了其所属进程的代码和数据我们之前讲的传统的进程是一个主线程。一个进程的多个task_struct(PCB),被认为是多个轻量级进程,主轻量级进程的id即lwp(light weight peocess)与进程的pid相同。

2025-08-24 16:55:02 1200 51

原创 Linux的进程信号

文章摘要:本文系统介绍了Linux信号机制,包括信号概念、产生方式(键盘、函数、系统命令等)、信号保存机制(pending和block位图)以及三种处理方式(默认、忽略和自定义捕捉)。详细讲解了signal()和sigaction()函数的使用,并探讨了操作系统运行原理(硬件/软中断、用户/内核态)。最后补充了可重入函数、volatile关键字和SIGCHLD信号处理三个实用知识点,帮助开发者更好地理解和运用信号机制进行进程控制。全文通过代码示例和原理分析,为Linux信号编程提供了全面指导。

2025-08-13 16:51:49 1769 59

原创 Linux的进程间通信

本文摘要:本文系统介绍了Linux系统中进程间通信(IPC)的两种主要方式:管道和SystemV共享内存。首先阐述了进程间通信的目的(数据传输、资源共享、事件通知、进程控制)和发展历程。重点分析了管道通信的四种情况、匿名管道和命名管道的实现原理及特性,并通过代码示例展示了基于匿名管道的进程池实现。随后详细讲解了SystemV共享内存机制,包括shmget()创建、shmat()/shmdt()挂接/分离、shmctl()控制等系统调用,以及内核中SystemVIPC资源的组织管理方式。全文采用C/C++实现

2025-08-07 21:29:33 1221 44

原创 Linux的库制作与原理

程序运行时,有了库的起始虚拟地址,我们要对加载到内存中的程序的库函数调用处进行地址修改,在内存中二次完成地址设置 (这个叫做。程序运行时,加载动态库,有了库的起始虚拟地址+方法偏移量(编译时获取),定位库中的方法。等等,修改的是代码区?不是说代码区在进程中是只读的吗?的,但是并不是这么简单的合并,也会涉及对库合并,此处不做过多追究。,表中每一项都是本运行模块要引用的一个全局变量或函数的地址。所以:虚拟地址机制,不光光OS要支持,链接器也要支持。:核心的虚拟地址分配者,写入ELF文件供OS加载。

2025-07-31 14:50:59 1962 43

原创 Linux的Ext系列文件系统

本文系统介绍了Linux文件系统的核心概念与工作机制。主要内容包括:1)磁盘物理结构(盘片、磁道、扇区)和逻辑寻址方式(CHS/LBA);2)文件系统核心概念(块、分区、inode);3)Ext2文件系统架构(DataBlocks、inodeTable、位图管理);4)目录结构与路径解析机制;5)软硬链接原理及区别。重点阐述了inode机制如何实现文件属性和内容的分离存储,以及通过目录项实现文件名到inode的映射关系。文章通过层次化的讲解,揭示了Linux文件系统从硬件抽象到逻辑组织的完整设计思路。

2025-07-17 16:42:33 1667 63

原创 Linux的基础I/O

本文系统介绍了Linux文件操作的核心概念,从基础认知到高级应用。首先阐释了文件的广义/狭义理解,指出Linux中一切皆文件的抽象理念。重点讲解了系统级文件I/O操作,包括open/read/write等系统调用接口,深入剖析文件描述符的分配规则与重定向机制(dup2)。文章揭示了"一切皆文件"的多态设计思想,通过统一的file_operations结构实现多样化设备操作。最后分析了缓冲区的关键作用,对比了用户级与内核级缓冲机制,并通过实验现象展示了缓冲区在不同场景下的行为差异。全文贯通

2025-07-11 20:37:57 1428 55

原创 自定义Shell命令行解释器

若先snprintf(oldPwd,sizeof(oldPwd),"OLDPWD=%s",cwdenv.c_str());那么,环境变量表中的OLDPWD就已经是CWD了,那么chdir(getOldPwd());这里就要了解一下:getenv(),getcwd(),putenv()了。(继承bash的,其实应该要从配置文件中获取,但比较麻烦)。(进程当前的工作路径,在/proc/pid/下可以看到),如果之前putenv(oldPwd),传的是指针,(如:cd,需要改变自己的路径),或。

2025-06-02 17:08:48 837 70

原创 Linux的进程控制

本文介绍了Linux进程管理的核心内容:1. 进程创建:通过fork系统调用创建子进程,父子进程共享代码但数据独立,采用写时拷贝机制提高效率。2. 进程退出:包括正常退出(返回退出码)和异常终止(收到信号),介绍了exit和_exit的区别。3. 进程等待:父进程通过wait/waitpid回收子进程资源,避免僵尸进程,详细解析了状态码的解读方法。4. 程序替换:exec系列函数的工作原理和使用方法,包括6种变体的区别(带p/e后缀表示PATH搜索和环境变量设置)。全文系统性地讲解了进程生命周期管理的关键技

2025-05-25 16:53:55 2221 56

原创 Linux的进程概念

冯诺依曼体系结构是现代计算机的基础,其核心包括输入输出设备、存储器、CPU等组件。输入设备如键盘、鼠标,输出设备如显示器,存储器即内存,CPU负责运算和控制。由于输入输出设备效率低,内存作为效率与成本的平衡点,成为程序运行的必要条件。操作系统负责管理软硬件资源,通过系统调用和驱动程序屏蔽底层细节,提供统一接口。Linux系统中,进程通过PCB(进程控制块)进行管理,进程状态包括运行、阻塞、挂起等,进程优先级通过PRI和NI值调整。进程虚拟地址空间和分页机制将虚拟地址映射到物理地址,保护内存并解耦进程与内存管

2025-05-18 22:13:39 2527 79

原创 Linux的基础开发工具

本文介绍了Linux开发环境中的常用工具链,包括:1)包管理器yum的使用与镜像源配置;2)vim编辑器的命令/底行模式操作及配置技巧;3)gcc/g++编译器的四个编译阶段(预处理/编译/汇编/链接)和动静态库区别;4)make/Makefile自动化构建工具的基本语法和变量使用;5)git版本控制的基本工作流;6)gdb/cgdb调试器的常用调试命令。文章以CentOS 7.9为基础,重点讲解了各工具的核心功能、典型用法和配置技巧,帮助开发者快速搭建高效的Linux开发环境。

2025-05-08 17:23:49 3414 79

原创 Linux的权限

但Lzc用户访问时,确定为所有者,就只看所有者对文件的权限了。,一般都要r(如:ls),w(修改),x(如:cd)。任何用户(root用户例外)不能进入其他用户的家目录。如:gcc后,会自动加x。一般只能在/home/用户名,自己家操作。如:Lzc用户有所有者和组用户的访问身份,时,目标组必须是该用户所属的组(否则需。,root可省略,切换到root用户,,root可省略,以root用户身份。,如:安装软件,需要root的权限。,即使自己是当前所有者)。,如:umask 002。(所有者,组,其他用户)

2025-04-27 16:12:29 3482 59

原创 Linux的基础指令

用于远程连接Linux服务器(本质是一个图形化工具,内部仍通过Shell与内核交互)。是用户个人文件的默认位置(路径为/home/用户名,root 用户是/root)。当然如果 >file,就是新建一个文件),把读取到的内容写入file。如:cat file | tail,显示file的后10行。:选项 -a -l,-l -a,-al,-la,都行。lesson1表示,当前在lesson1目录,,不再询问(root用户因权限过高,总是询问),包括文本,可执行程序,库,图片,视频等等。

2025-04-25 15:57:35 2713 58

原创 C++进阶——C++11_智能指针

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存,一般是忘记释放或者发生异常释放程序未能执行导致的。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害普通程序运行一会就结束了出现内存泄漏问题也不大,进程正常结束,页表的映射关系解除,物理内存也可以释放。长期运行的程序出现内存泄漏影响很大。

2025-04-15 18:10:33 1238 68

原创 C++进阶——异常

C++98中函数参数列表的后面接throw(),表示函数不抛异常,函数参数列表的后面接throw(类型1, 类型2...)表示可能会抛出多种类型的异常,可能会抛出的类型用逗号分割。,否则后面的5个资源就没释放,也资源泄漏了。如果是102号错误,这个异常不处理,出了catch子句,自动析构,再尝试发送。,这里由于异常就引发了资源泄漏,产生安全性的问题。,比如析构函数要释放10个资源,释放到第5个时抛出异常,则也。,前面申请了资源(内存、锁等),后面进行释放,但是。,(若没有移动构造,就调用拷贝构造)。

2025-04-13 15:42:18 858 50

原创 C++进阶——C++11_{ }初始化_lambda_包装器

C++11,基本实现了一切对象皆可初始化。

2025-04-12 10:10:46 1095 48

原创 C++进阶——C++11_右值引用和移动语义_可变参数模板_类的新功能

文章摘要:本文深入探讨了C++11引入的右值引用和移动语义机制,包括左值/右值概念、引用折叠规则、完美转发实现原理,以及可变参数模板的扩展应用。重点分析了移动构造和移动赋值的实现原理及其在STL容器emplace系列接口中的应用,通过对比传统拷贝语义与移动语义的性能差异,展示了如何利用这些特性优化资源管理。文章还介绍了类的新功能如默认移动操作、成员变量初始化、final/override等现代C++特性,并提供了详细的代码示例说明其使用场景和底层机制。

2025-04-10 12:24:04 916 46

原创 C++进阶——位图+布隆过滤器+海量数据处理

有一些场景下面,有。

2025-03-30 22:10:23 855 54

原创 C++进阶——封装哈希表实现unordered_map/set

与红黑树封装map/set基本相似,只是unordered_map/set是单向迭代器,模板多传一个HashFunc。

2025-03-29 12:03:06 1214 44

原创 C++进阶——哈希表的实现

乘法散列法对哈希表大小 M 是没有要求的,假设 M 为 1024,key 为 1234,A = 0.6180339887,A * key = 762.6539420558,取小数部分为 0.6539420558,M × ((A × key) % 1.0) = 0.6539420558 * 1024 = 669.6366651392,那么 h(1234) = 669。假设 P=17,M=6,a=3,b=4,则 h_34(8) = ((3 × 8 + 4) % 17) % 6 = 5。

2025-03-25 22:28:21 1180 42

原创 C++进阶——封装红黑树实现map和set

(整个子树已经访问完了,如果这个子树是外面的右子树,那么外面一层的子树也访问完了,直到子树是外面子树的左子树,左子树访问完了,访问中),就访问,2. 源码中的pair的<比较,比较了key和value,但是。MySet是为了兼容MyMap,所以也要实现。),相当于外层左边的子树访问完了,然后访问中。然后更新迭代器中的节点指针,返回*this。修改RBtree中的insert返回值为。,在右子树中进行,左中右,访问。1. 这里相比源码调整一下,当左为空,表示左访问完了,就是走右中左,基本相同。

2025-03-22 16:48:26 1277 33

原创 C++进阶——红黑树的实现

红黑树是一种自平衡的二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红色或黑色。通过对从根节点到叶子节点的路径上的节点颜色进行约束,红黑树确保没有一条路径会比其他路径长出两倍,因此它是近似平衡的。

2025-03-20 18:31:55 872 33

原创 C++进阶——AVL树的实现

AVL 树是一种自平衡二叉搜索树,满足以下性质:它是一棵空树,或者:它的左右子树都是 AVL 树。左右子树的高度差(平衡因子)的绝对值 <= 1。

2025-03-17 21:36:14 1190 19

原创 C++进阶——map和set的使用

1. set的声明如下,T就是set底层关键字key的类型。2.set默认要求key支持小于比较(升序),如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数。3. set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参 数。4. 一般情况下,我们都不需要传后两个模版参数。5.set底层是用红黑树实现,增删查效率是O(logN)。迭代器遍历走的是搜索树的中序,所以是有序。

2025-03-15 23:37:53 1174 4

原创 C++进阶——二叉树OJ题

本文总结了二叉树相关的7个经典算法问题及解法:1. 层序遍历(BFS)使用队列按层输出节点值;2. 最近公共祖先(LCA)两种解法:子树判断法和路径记录法;3. 二叉搜索树转双向链表通过中序遍历调整指针;4. 前序+中序序列重建二叉树利用前序定位根节点,中序分割左右子树;5-7. 三种非递归遍历(前序/中序/后序)均提供两种实现:统一标记法和优化栈操作法,其中后序遍历还通过反转前序结果实现。所有解法均给出C++代码实现,涵盖队列、栈、递归等核心数据结构应用。

2025-03-14 11:49:55 1213 1

原创 C++进阶——二叉搜索树

在我写BinarySearchTree的拷贝构造时,发现为什么,_root明明是私有的。这种设计是为了支持类的封装性和实现细节的隐藏,同时。例如:拷贝构造函数需要访问被拷贝对象的内部状态。赋值运算符需要访问右操作数的内部状态。比较运算符可能需要访问两个对象的内部状态。

2025-03-09 17:58:25 739 2

原创 C++进阶——多态

1. 必须是基类的指针 或引用调用虚函数,因为只有基类的指针或引用才能既指向基类对象又指向派生类对象。2.被调用的函数必须是虚函数,一般要完成虚函数重写/覆盖,因为重写或者覆盖了,基类和派生类之间才能有不同的函数,多态的不同形态效果才能达到。注意:派生类没有完成虚函数的重写,那么多态性仍然可以工作,但仅限于使用基类的实现。public:// show 函数没有被重写// 调用 Base::showreturn 0;

2025-03-07 12:25:32 895 4

stl30.tar.zip

stl30源码

2025-02-23

bahnschrift.ttf

俄罗斯方块的字体

2024-09-28

background1.bmp

俄罗斯方块的背景

2024-09-28

SDL2-ttf-2.22.0.zip

SDL2_ttf-2.22.0.zip

2024-09-15

SDL2-2.30.6.zip

SDL2-2.30.6.zip

2024-09-15

Python程序设计练习题突击

用于大学生期末突击,包过 这是我在Python考试前整理的,用于自己复习的资料,当时也是为前女友准备的 里面有些我对前女友说的话,就当个瓜吧 加油! 少年!

2024-07-03

Python程序设计知识点突击

用于大学生期末突击,包过 这是我在Python考试前整理的,用于自己复习的资料,当时也是为前女友准备的 里面有些我对前女友说的话,就当个瓜吧 加油! 少年!

2024-06-28

空空如也

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

TA关注的人

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