自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Python 协程:并发编程的轻量级利器

协程是轻量级、高效的并发编程方案。借助 asyncio 库,能便捷定义、运行和调度协程,并发执行多个异步任务,在处理 I/O 密集型任务时可提升程序性能。掌握协程编程技巧,利于开发高效、响应快的 Python 应用程序,在网络服务、数据处理等含大量异步操作的场景中很有用。

2024-12-22 14:26:29 875

原创 初识AI(介绍AI中出现的不同名词)

他解决了前面RNN不擅长处理长序列的问题,词之间距离越远,前面的词对后面的词影响越低。他会学习语句里所有词之间的关系,他并不只关注输入和距离自己进的词,而是关注输入中所有的值,至于这个权重是通过学习得到的。**递归神经网络(RNN)**是一类用于处理序列数据的神经网络,它通过循环连接保存前一时刻的状态信息,从而捕捉数据中的时间依赖性。例如,客户分群、图像聚类。:可以处理序列数据,记住之前的输入信息,适合处理时间序列、文本等序列性数据。:RNN的计算依赖于上一个时间步的状态,计算复杂度较高,训练时间较长。

2024-09-13 15:45:18 641

原创 消息队列:Kafka吞吐量为什么比RocketMQ大

mmap返回的值可以让应用层获取到消息内容,可以进行一些逻辑处理,但sendfile返回的只是已经传输的字节数,具体发送了什么内容,内容层无法得知。而RocketMQ的一些功能需要具体了解到发送了什么消息才能实现(二次投递)。而Kafka主要追求吞吐量,也就不需要这些独特的功能,所以选择sendfile()文件,以达到更高的吞吐量。所以不同消息队列都有自己的特征,并不是说Kafka的架构就比RocketMQ比好,而是他们各自的选择。

2024-08-05 22:25:25 1361 1

原创 计网:http/1.1、http/2和http/3的改变和优化

所以http/1.1从原本的短连接改为了长连接,由请求头中的Connection字段来指定连接类型,当它的值为Keep-Alive时就为长连接。开启了 HTTP Keep-Alive 机制后, 连接就不会中断,而是保持连接。当客户端发送另一个请求时,它会使用同一个连接,一直持续到客户端或服务器端提出断开连接。当然如果某个 HTTP 长连接超过一定时间没有任何数据交互,服务端就会主动断开这个连接

2024-08-04 18:41:11 1254

原创 计网:从输入URL到网页显示期间发生了什么

在上一层中我们通过IP路由转发,可以进行路由转发,进行远程定位,但点到点中的数据发送就需要MAC层的帮助了,当数据进入到一个网络内,此时数据包中只有目的地址的IP,但传输数据需要对方发MAC地址,此时我们就需要一个协议:ARP协议。当数据经过层层关卡,到达服务端后,会从协议栈自底向上逐渐拆解相对应层的协议头,最终给服务端真正的请求数据,并对其进行相应,然后通过自上向底对相应数据进行包装,最终有传输到客户端,客户端把返回回来的页面进行渲染,展示给用户。在TCP协议中,源端口号和目标端口号是必不可少的。

2024-08-04 10:51:10 747

原创 ES:聚合查询语法

这个查询将返回"amount"字段的平均值。在聚合查询中,"size"参数设置为0,表示不需要返回文档本身,只需要聚合结果。下面的这个只是一个简单的查询,是单值分析。Percentiles聚合可以了解数据的分布情况,从小到大排序,可以显示自己想知道的第百分之几的值。可以更好的了解数据的离散程度和异常值。"_source" :[ ...需要返回的字段数组... ],"size" : 10, // 分页大小,一次返回多少数据。"from" : 0, // 返回搜索结果的开始位置。用于获取匹配度最高的几个文档。

2024-05-09 20:06:55 1467

原创 ES:基础查询语法(简单易懂)

query子句:类似于mysql中的where语句,用于定义搜索条件,如等值查询、模糊查询、范围查询等(重点)aggs字句:用于对搜索结果进行各种统计和分组。类似于mysql中的group by。例如可以计算某一字段不同值各自出现的次数,或者根据某个字段的值进行分组。sort子句:这个就非常显而易见了,是对查询出来的结果进行根据某一规则进行排序。from和size:这两个是配合使用的,是用来分页的。from定义的是展示的第一条数据的处于结果集的位置(也就是下标),size表示此次展示多大的结果集。这个

2024-05-06 16:55:03 4080 1

原创 初识ES(ES的基本概念、倒排索引、索引和文档的CRUD)

倒排索引中有两个非常重要的概念:文档(Document):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。如:小米发布会开始。可以分词为:小米,发布会,发布,开始这几个词条。

2024-04-07 11:24:22 1238

原创 计网:HTTPS协议详解

通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密 Certificate Signature 内容,得到一个 Hash 值 H2;接下来,客户端与服务器进入加密通信,就完全是使用普通的 HTTP 协议,只不过用「会话秘钥」加密内容。客户端收到服务器的回应之后,首先通过浏览器或者操作系统中的 CA 公钥,确认服务器的数字证书的真实性。上面第一项的随机数是整个握手阶段的第三个随机数,会发给服务端,所以这个随机数客户端和服务端都是一样的。

2024-03-07 17:49:49 1017

原创 MySQL:索引的优化方法

当字段是类似于男/女这种的就没必要创建索引了,因为这样查询索引还是会查询到很多数据,没有给我们提升什么效率,而且MySQL 还有一个查询优化器,查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。当字段经常更新时也最好不要建立索引,因为随着数据的更新,为了维护B+树的有序性,B+树也要进行更新调整,经常性的更新太浪费数据库性能了。如果经常再查询语句中经常用不到的字段也不要创建索引了,反而浪费。数据库数据少的时候也不用创建

2024-03-02 11:23:13 1186

原创 MySQL:一行记录如何

所以在设计数据库表的时候,通常都是建议将字段设置为 NOT NULL,这样可以至少节省 1 字节的空间(NULL 值列表至少占用 1 字节空间)。【举例】以上面表举例:第一条记录:但是 InnoDB 是用整数字节的二进制位来表示 NULL 值列表的,现在不足 8 位,所以要在高位补 0,最终用二进制来表示:第二条记录:第三条记录 phone 列 和 age 列是 NULL 值,所以,对于第三条数据,NULL 值列表用十六进制表示是 0x06。

2024-03-01 09:32:30 1117

原创 MySQL:索引有哪些(清晰明了)

2.1聚簇索引:主键索引的 B+Tree 的叶子节点存放的是实际数据,所有完整的用户记录都存放在主键索引的 B+Tree 的叶子节点里,当通过聚簇索引查询的时候,不需要回表,因为这个索引中存储了这张表中所有数据。聚簇索引的创建:如果有主键,默认会使用主键作为聚簇索引的索引键(key);如果没有主键,就选择第一个不包含 NULL 值的唯一列作为聚簇索引的索引键(key);在上面两个都没有的情况下,InnoDB 将自动生成一个隐式自增 id 列作为聚簇索引的索引

2024-02-29 21:51:38 2563

原创 力扣区间题:合并区间、插入区间

这个有两种解法,一种就是直接将这个要插入的区间加入数组,让合并区间的算法走一遍,就可以了。我们可以将区间按照左端点升序排列,然后遍历区间进行合并操作。遍历结束,如果新区间还没有被加入,那么将新区间加入到答案中。

2024-02-29 20:32:28 518

原创 MySQL:数据库中有哪些锁

表锁是一种粗粒度的锁,它会锁定整个表,除了会限制别的线程的读写外,也会限制本线程接下来的读写操作。表锁适用于特定的场景,但通常不推荐使用,因为它会影响并发性能。2.2意向锁意向锁是一种表级锁,用于指示其他事务是否已经持有了行级锁或表级锁。意向锁不会阻塞其他事务,只是作为一种标记。什么时候加意向锁:在获取行级锁之前,在获取表级锁之前都需要先加上意向锁。意向锁的存在表示其他事务可能已经在该表上加了表锁/行级锁,因此事务在获取表级锁/行锁之前需要先检查意向锁。意向锁的目的是为了快速

2024-02-29 16:35:25 1547

原创 MySQL:快照读和当前读

在读取数据时直接读取数据库中的最新版本,即读取的是已经提交的事务所修改的数据。当前读操作会获取共享锁,阻塞其他事务对该数据的写操作,以保证读取到的数据是最新的。这对于需要读取最新数据的场景非常重要,例如查询实时数据或进行数据分析。SELECT … LOCK IN SHARE MODE (共享读锁):使用共享读锁时,其他事务可以同时读取相同的数据,但不能修改它。适用于需要读取数据的场景,但不希望其他事务修改该数据。SELECT … FOR UPDATE:使用排他锁时,其他事务无法同时读取或修改

2024-02-29 14:16:40 2467 1

原创 浅谈加密算法(对称加密、非对称加密、混合加密、数字签名、哈希函数)

对称加密只有,直接使用这一个密钥对信息进行加密或解密。这样子就使得对称加密解密十分高效,计算量也相较于非对称加密小很多,适合有大量数据的场合。密钥只有一个且他一定不能泄漏。由此分发密钥,讲这个密钥传递给客户端是一件很有挑战性的事情。所以相较于,对称加密的安全性低一些,因为再传递过程中密钥可能被他人获取。

2024-02-21 21:43:53 1400

原创 Java线程池知识点总结

上面的代码我们设置最大线程数量为6,而阻塞队列可以排三个,说明当同时有超过9个任务需要执行,第10个线程就会执行拒绝策略,我设置的策略为丢弃任务,并抛出异常RejectedExecutionException。下面有结果就可以证明我们的猜测。74行恰好是我们放入线程池中第10个任务,所以第74行抛出了RejectedExecutionException异常。

2024-02-21 14:42:59 1069

原创 Redis:常用数据类型及其应用场景

String类型的应用场景:常规计数:因为 Redis 处理命令是单线程,所以执行命令的过程是原子的。因此 String 数据类型适合计数场景,比如计算访问次数、点赞、转发、库存数量等等。分布式锁:SET 命令有个 NX 参数可以实现key不存在才插入,可以用它来实现分布式锁:如果 key 不存在,则显示插入成功,可以用来表示加锁成功;如果 key 存在,则会显示插入失败,可以用来表示加锁失败。

2024-02-18 17:24:21 1331

原创 MySQL:MVCC原理详解

MySQL是允许多用户同时操作数据库的,那么就会出现多个事务的并发场景。的问题。而解决这些问题所用到的方法就是:MVCC 多版本并发控制。而这个MVCC的实现是基于read view是一个数据库的内部快照,它记录了数据库在的数据信息。read view用于实现事务的隔离性,即在并发事务中,一个事务能看到哪些数据,以及哪些数据对其他事务不可见。read view的和事务的隔离级别有关,例如,在隔离级别下,read view会在生成,而在隔离级别下,read view会在执行时生成。

2024-01-29 13:04:01 1086 1

原创 MySQL:三大日志(binlog、redolog、undolog)

binlog的主要作用是用于数据复制,再数据库主从架构中,主数据库接受更新请求,而从数据库接收查询请求。这样再加锁时主数据再收写到锁封锁时,从数据库也还能接收查询请求。而保证主从数据库数据一致性用到的就是Binlog日志。它记录了修改主数据库所有修改数据的操作,从数据库只需要按照这个日志就能实现数据复制了。

2024-01-28 18:14:43 1251

原创 MySQL:事务隔离级别详解

脏读:当事务A对一个数据进行修改,但这个操作还未提交,但此时事务B就已经读取到了这个修改后的数据,并依据这个修改后的数据进行接下来的操作。这就是脏读。不可重复读:当事务A读取数据,然后对这个数据进行操作,然后再操作期间事务B对这个数据进行了修改,则等事务A再次读取这个数据时,和一开始读取到的值并不一样,这就是不可重复读。幻读:幻读和不可重复读有点类似,幻读是事务A对表中所有属“猪”的人删掉,而此时事务B对表中查入一条属“猪”的人的数据,并进行提交,此时事务A就会以为出现幻觉了,没有进行删除操作。

2024-01-27 20:14:50 696

原创 MySQL:数据库索引详解

索引是一种用于快速查询和检索数据的数据结构。常见的索引结构有: B 树, B+树和 Hash。索引的作用就相当于目录的作用。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。可以大大加快 数据的检索速度(大大减少的检索的数据量), 这也是创建索引的最主要的原因。毕竟大部分系统的读请求总是大于写请求的。 另外,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

2024-01-27 10:42:38 1077

原创 Java并发编程:synchronized锁升级过程

锁的状态有四种,级别从高到低分别为:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,这个锁的状态会随着并发激烈情况逐渐升级,锁的状态升级但不能降级。引入这些状态时为了减少获得锁和释放锁带来的性能消耗。经过研究表明,大多数情况下,锁不仅不存在多线程竞争,而且大多数都是由同一个线程多次获得,这种情况下如果没有线程和线程A竞争锁,但线程A每次获取锁都要修改对象头,指向线程A,那么太过消耗资源。而偏向锁所做的就是再对象头和栈帧中的锁记录中存锁偏向的线程ID,等以后该线程进入和退出同步块是都不需要进行CAS操作进

2024-01-22 17:12:42 900

原创 JVM:Java类加载机制

就是将 java的字节码文件(.Class)文件加载到内存当中,然后在方法区当中根据这个文件构建这个类的类模型,这个类包含了从字节码文件中解析出来的常量池、类方法、等信息。初始化阶段是类加载的最后一个步骤,再之前的加载阶段中处理加载阶段可以用用户子自定义类加载器的方式参与,其他时候都是由JVM自己主导控制的,到了初始化阶段才正式的使用我们自己写的java代码了,再这个阶段有一个执行类构造器方法需要我们去了解:()方法,这个给方法并不是我们编写的,而是javac编译器自动生成的。

2024-01-20 16:39:14 1845

原创 排序算法:快速排序、堆排序

为什么要j(右)游标必需先动?因为j停下来后i(左)可能会直接碰到j,此时j可直接与left交换, 因为j所指的一定比left小。如果i先动,j还没找到比base小的值, 就因碰到i停下,此时如果j所指比base大交换后就出错了。我选取的是第一个元素作为base,如果是最后一个则反过来。

2024-01-19 17:57:48 576

原创 JVM:垃圾收集器(7种)

CMS(Concurrent Mark Sweep)收集器是以获取最短回收停顿时间的为目标的收集器。注重服务的响应速度,希望系统停顿时间尽可能短,以给用户更好的交互体验。这个收集器是基于标记清除算法实现的。用于老年代的收集。收集过程有四个阶段:1、初始标记 2、并发标记 3、重新标记 4、并发清除四个阶段中初始标记和重新标记仍需要暂停所有的用户线程(Stop The World),但为什么说这个收集器也暂停了所有的线程,为什么还能做到停顿时间

2024-01-19 15:15:46 3129

原创 JVM:垃圾回收机制(GC)

标记的不要回收的对象,但我们要操作的是不需要回收的对象,此时我们所需要的时间就会少很多。通过 一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”,如果某个对象到GC Roots间没有任何引用链相连, 或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。先把需要清除的对象进行标记,再标记完成后,统一回收掉所有被标记的对象,也可反过来,标记存活的对象,统一回收所有未被标记的对象。

2024-01-18 20:36:51 1468

原创 利用工具JStack排查:死锁问题和CPU100%问题

无论是再面试过程中还是再实际项目开发当中我们都有可能遇到这两个问题。我之前有同学面试这两个问题都有问道过。哈哈哈。所以我绝对把他们了解下并利用博客记录。 JStack可以显示Java应用程序中每个线程的堆栈跟踪,帮助开发人员诊断线程相关的问题,比如死锁和性能问题。通过使用JStack,开发人员可以查看线程的状态、锁定信息以及线程调用堆栈,从而更好地理解应用程序的运行状况。命令介绍:jstack -F [-m] [-l] :这个命令会在Java进程响应时生成线程转储。-m选项会同时显示

2023-12-11 18:14:33 3332

原创 操作系统:读者写者问题

开始来了一些读者读数据,它们全部进入读者队列,此时来了一个写者,执行 P(flag) 操作,使得后续到来的读者都阻塞在 flag 上,不能进入读者队列,这会使得读者队列逐渐为空,即 rCount 减为 0。上面的这种实现,是读者优先的策略,因为只要有读者正在读的状态,后来的读者都可以直接进入,如果读者持续不断进入,则写者就无法得到运行。对比方案一的读者优先策略,可以发现,读者优先中只要后续有读者到达,读者就可以进入读者队列, 而写者必须等待,直到没有读者到达。,此时写者才可以进入临界区执行写操作。

2023-12-10 21:12:41 1126

原创 Java多线程万字详解(基础概念、多线程实现方式、锁、消费者机制、线程池)

锁的使用的场景:因为线程执行时是具有随机性的,并不是把线程中的方法全部跑完才换下一个线程,而是无论线程跑到任何位置都有可能结束,运行下一个线程。此时就会倒是数据安全问题。 线程池主要核心原理:创建一个池子,池子当中是空的,提交任务时,池子会创建新的线程对象,任务执行完毕,线程会归还给池子,下次再次提交任务时,不需要创建新的线程,直接复用已有的线程即可。如果提交任务时,池子中没有空闲线程,也无法创建新的线程,队伍就会排队等待。

2023-12-06 14:35:18 986

原创 操作系统:进程调度算法(FCFS、SJF、HRRN、RR、HPF、MFQ)

​时间片轮转调度算法(RR):这的基本思想是将CPU的时间分割成若干个小的时间段,称为时间片,将这个时间片分给每一个进程,在这段时间内这个进程会在CPU中执行在这个法 中有两种情况程序会让出CPU:当时间片用完了之后这个进程的程序还没有执行完毕,则会让出CPU重新进入就绪队列等待被选中,CPU会继续从就绪队列中选择下一个进程执行。当时间片还没用完,程序发生阻塞或者执行完毕,也会立即让出CPU。在这个算法中时间片的大小很重要,要是太小则会导致CPU上下文切换频繁,浪费资

2023-12-04 12:04:03 2131

原创 Linux内存回收:LRU算法

linux操作系统再内存不足时会使用Swap机制,将一些不经常使用的匿名内存页放到磁盘当中,等下次需要时再读取到内存当中,而这个LRU算法就是用来选择把哪些不常使用的匿名内存页放到磁盘当中的。:最近最少使用。其原理就是:当内存不足时,淘汰系统中最少使用的内存,这样对系统性能的损耗是最小的。为了实现LRU算法,内核维护了两个和。活跃内存页链表。也就是说进程会经常访问这个链表中的内存页,所以进行内存淘汰时,不应该淘汰这个链表中的内存页。不活跃内存页链表。

2023-11-28 16:53:04 709

原创 Linux中的内存回收:Swap机制(图文并茂)

Swap机制是什么 :Swap机制是一种利用磁盘空间来扩展内存的方法。当系统的物理内存不足时,可以把一些不常用的内存数据写入到磁盘上的Swap分区,从而释放出更多的内存给其他需要的进程。当这些内存数据再次被访问时,系统会把它们从磁盘读回到内存中,这个过程称为换入(swap in)。相反,把内存数据写入到磁盘的过程称为换出(swap out),应用程序实际可以使用的内存空间将远远超过系统的物理内存。Swap 就是把一块磁盘空间或者本地文件,当成内存来使用。

2023-11-28 15:48:43 1889

原创 HashMap详解(扩容机制、底层结构、适用场景)

1.7:数组+链表 (由于是链表长度长了。查询效率不高。所以在设计初衷1.7的hash算法更复杂。数据也更散列)1.8:数组+链表+红黑树(JDK8中即使用了单向链表,也使用了双向链表,双向链表主要是为了红黑树相关链表操作方便,应该在插入,扩容,链表转红黑树,红黑树转链表的过程中都要操作链表),HashMap的扩容是通过调用resize()方法实现的。java1.8+在扩容时,不需要重新计算元素的hash进行元素迁移。而是用原先位置key的hash值与旧数组的长度(oldCap)进行"与"操作。

2023-11-27 13:23:23 2711

原创 Netty实现websocket且实现url传参的两种方式(源码分析)

通过源码我们可以看出如果checkStartWith设为false的话,则必须url和websocketPath相等,否则会返回false。如果设置为true的话则只需要websocketPath是具体的url的前缀就行。当最后返回false时,连接就无法建立。我们看源码这是一个处理类WebSocketServerProtocolHandshakeHandler,这是WebSocketServerProtocolHandler这个处理类再创建的时候给加pipelien()

2023-11-24 10:58:55 3602 2

原创 VUE项目部署过程中遇到的错误:POST http://124.60.×××.××:9090/test/login 405 (Not Allowed)

后面我查了些,nginx部署确实不支持post访问静态资源,而此时我们进行nginx转发后他会默认使用GET请求。但主要原因还是我们没有重新编写我们的路由策略。我当初报了这个405错误,再网上查了半天,他们都说什么是nginx部署不支持post访问静态资源。我再vue中有使用devServer:{ proxy:{} }进行路由转发。中生效,当你将vue部署后就走不到这个配置当中,也就是说这里的路由转发并。所以我们需要在nginx转发里自己再写一份转发策略。

2023-11-23 13:55:39 868

原创 Docker部署Vue+Springboot项目

因为我们需要将这个jar包打成镜像放在docker上运行,那么我们需要一个配置文件用于镜像的运行。图片中的Dockerfile就是这个配置文件,要注意这个两个文件要放在同一目录下。那么现在就开始来编写配置文件。要在classRom目录下执行这条语句,注意最后还有一个“.”,这个点表示的是当前目目录,表示使用当前目录下的Dockerfile文件进行镜像的构建一个名字为classroom-realtime-feedback的镜像。

2023-11-23 13:38:03 2177

原创 课程设计:C++实现哈夫曼编码

//1:先计算每个字符的权重//2:构建哈夫曼树//3:得出每个字符的哈夫曼编码。//4:根据哈夫曼编码转化为字符

2023-11-20 14:27:27 374

原创 cookie 和 session的区别(简单易懂)

Cookie是访问某些网站以后在本地存储的一些网站相关的信息,下次再访问的时候减少一些步骤。浏览器端第一次发送请求到服务器端,服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端,浏览器端再次访问服务器端时会携带服务器端创建的Cookie,服务器端通过Cookie中携带的数据区分不同的用户我们登录某一个网站时需要输入用户名及密码,如果用户名和密码保存为cookie,则下次我们登录该网站的时候就不需要再输入用户密码了。

2023-11-20 14:18:29 428

原创 io多路复用:select、poll和epoll

首先我们需要使用epoll_create方法在内核当中创建epoll对象。再epoll对象中有一个红黑树。这个红黑树的作用就相当于fds(文件描述符集合)。再这颗树上存着要检测的socket文件。再之前的select/poll中是没有再内核中专门创建存放fds的空间的,导致每次调用都要将fds拷贝一遍到内核当中。而此时epoll使用红黑树将fds一直存在内核当中,不再需要每次进行拷贝,当需要增加新的带检测的socket时直接调用epoll_ctl进行添加就行,时间复杂度为(logn)。

2023-11-19 20:02:57 446

空空如也

空空如也

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

TA关注的人

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