自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(77)
  • 资源 (3)
  • 收藏
  • 关注

原创 登录究竟有多少种花样?

大家好,我是小....小白不黑,现在的app以及任何一个系统,都离不开登录。其中最常见的估计就是密码登录,二维码登录,第三方账号登录以及单点登录了。现在,让我们来捋一捋,这些登录的背后,究竟是什么设计的。全篇无图,请谨慎阅读........

2024-08-31 19:55:15 720

原创 聊一聊Nginx中的反向代理

大家好,我是小白不黑,看完本篇文章,你可以了解到:1.什么是反向代理2.什么是正向代理3.什么是同源策略4.Nginx反向代理架构

2024-07-21 13:54:19 948

原创 啥?你没听过SpringBoot的FatJar?

SpringBoot是目前企业里最流行的框架之一,SpringBoot的部署方式多数采用jar包形式。通常,我们使用java -jar便可以直接运行jar文件。普通的jar只包含当前 jar的信息,当内部依赖第三方jar时,直接运行则会报错,但是,SpringBoot所打成的jar包,却可以直接部署运行。今日,小白不黑带大家来探讨一下---SpringBoot的启动原理-FatJar

2024-07-06 11:42:45 707

原创 Redis维护缓存的方案选择

但是实际上,删除缓存失败这个异常场景不在此范围讨论中(可以加入重试机制),因此,此方案数据一致性问题不大,但是可能导致穿透问题(缓存数据删除后,瞬间大量请求穿过缓存,直接打到数据库。更新数据库后再删一次缓存,是因为,有人通过查库拿到旧数据,设置值进了缓存(方案一数据不一致的情况),之所以要延时,是因为要保证,第二次删除的时机要在其他人写数据之后,否则白删。Redis中间件常常被用作缓存,而当使用了缓存的时候,缓存中数据的维护,往往是需要重点关注的,尤其是重点考虑的是数据一致性问题。

2023-11-18 12:54:53 855

原创 分布式服务与分布式框架

在这个维度去分析,dubbo便是一个分布式框架,当然,更准确地说,我认为dubbo只是一个RPC远程调用框架,通过dubbo,可以对其他服务发起远程调用,也就是具备了服务调用能力,因此,一般dubbo也会被看成是一个分布式框架。一般在技术搭配上,dubbo必然会搭配一个注册中心,如zookeeper。分布式副武其实就是根据某个粒度,将服务拆分,而分布式框架就是将这些服务协调,管理起来。分布式框架,我认为服务调用是他的基础能力,该能力是所有分布式框架的基础能力,其次是服务注册与发现。

2023-11-18 11:11:45 199

原创 关于如何学习一门新技术

如何快速学习一门新技术,一千个读者就有一千个哈利波特,对于我而言,针对我目前的基础能力而言,以下便是我快速学习一门新技术的方法论。对于一个开发人员来说,技术栈永远是在迭代更新的,不可能学完全部技术,只能通过自己的学习能力,不断跟上时代的脚步。因此,常常听到人说,一个程序员需要快速开发能力。1、先从网上看视频,这个过程中,我仅仅只是看,理解便可,不会真正上手任何代码或者做其他笔记。2、结合开发文档,在工作/实践中使用该技术进行业务开发,毕竟对于工作而言,都是以交付为目的(此过程当然少不了百度)

2023-11-18 11:02:08 146

原创 我的第三段实习总结

首先在该实习的过程中,所用到的开发资源,线上资源都是需要去申请,都是需要去拿approval的,或者申请后,由相关部门,团队来完成。不过总而言之,言而简之,我这次实习中,学到的开发流程,项目管理方面的知识比较多,至于开发技术........并没有学到什么......。在该公司学习到的基本都是一些软技能,软实力,比如沟通能力,文档能力等等,尤其是大大提升了我的英文文档的读写能力。另外,团队协作必要会涉及大量沟通,实习过程中,就经常经常经常会开线上会议,因此,沟通是非常重要的!不知不觉,我已经实习了大半年了。

2023-05-08 16:08:56 145 1

原创 关于系统中的域对象

想了解什么是域对象,我们不防来了解一下域。百度百科如是说:“域”是“或”的分化字,本义指一定疆界内的地方。通俗地解释就是地域,即表示一个范围。而域对象,即是在某个范围,某个层次内使用的一种对象,而该类型的对象,常常用作存储数据。简而言之,言而总之,对于这种域对象的设计,是完全服务面向对象的设计中SOLID原则的单一职责原则,即每一种对象只负责自己的事情。以上例子只是基于最简单的三层架构来讲述常见的域对象。在复杂的应用系统中,还会存在其他各种domain对象。最后:我是小白不黑,欢迎来加入社区分享技术!

2023-02-04 12:27:10 399

原创 我的第二段实习经历之实习沉淀

转眼间,便来到了实习的尾端。在这四个月的实习中,我的收益可不是一点点!我总结为三点:技术上的收获,思维上的收获以及经验上的收获

2022-10-25 19:44:56 709 1

原创 如何理解面向对象思维?

所谓面向对象,即是将现实中错综复杂的对象,抽丝剥茧,变成一个个最小的单元。要使用时,再通过封装组合的方式,组成一个个业务对象,从而映射出复杂的现实对象。比如DTO业务对象,映射出的是一个业务对象,但是DTO可能是由多个最小单元构成的,而这些最小单元,则可以存储在不同的数据库表里。

2022-10-25 19:06:24 1317 1

原创 通过多线程把大任务变成多个小任务并发处理的进一步总结

前面已经对通过线程池把大任务分成小任务并汇总小任务结果的逻辑进行了简单总结,现在对该场景进行进一步总结一:使用ThreadPoolExecutor方法1.把大任务分成多个可以让线程执行的小任务,并创建一个list容器,存储这些小任务2.以该list为入参,调用线程池的invokeAll()方法,并发执行这些小任务。该方法的返回值是存储了Future的list3.遍历返回结果,拿到每一个Future,通过future.get()方法就可以获得对应的线程结果,从而可以拿到所有线程的执行结果*

2022-05-08 11:37:57 964

原创 对于数据库锁的总结

一:按照锁的类型进行分类,则分为读锁与写锁,读锁与写锁有读读共享,读写互斥,写写互斥的原则。二:根据锁的粒度进行分类,则可以分为行级锁和表级锁(行锁中也有读锁和写锁)。行级锁是InnoDB特有的,MYISAM没有1.行锁:(1)记录锁:锁住单条记录(实则锁的是索引)。可以通过Lock in share mode获取行级读锁,通过for update 获取行级写锁。当该记录加锁后,就会根据该锁的原则来判断该数据是否可读,是否可写,如读读共享,读写互斥,读读互斥(2)间隙锁:锁住间隙,防止读的时

2022-05-08 10:39:16 500 1

原创 jdk动态代理中的Proxy类与中间层InvocationHandler的深入研究总结

一:jdk动态代理的逻辑介绍动态生成的代理类里面每一个方法的实现都是调用InvocationHandler的invoke方法,在invoke()方法中,有三个参数,分别是Object,Method以及args数组,三个参数都是代理类Proxy调用时传入的。第一个参数Proxy传入的是当前的this对象;第二个参数Proxy传入的是需要被执行的Method对象;第三个参数则是Method对象需要的参数。因此,代理类只需要拿到对应的Method对象及相应参数,就可以通过InvocationHandler的i

2022-04-27 17:01:48 1256 1

原创 对于mysql数据库日志文件的总结

一:mysql数据库中有三大日志文件,分别是redo log,undo log,以及binlog。那么这三大日志文件的作用是什么呢?二:三大日志文件的作用1.redo log(1)众所周知,数据库的数据一经改变,就不可逆转。也就是常说数据的持久性。但是了解数据库的都知道,每一次数据的修改,都不是直接修改到磁盘上的,而mysql会利用自己的缓存池buffer_pool,要需要修改时,先把硬盘上的数据页加载到内存的buffer_pool中(一个数据页默认是16kb),然后在buffer_pool中修

2022-04-27 15:55:50 1820 1

原创 对于HashMap的长度必须是2^n的总结

一:为什么HashMap的长度必须是2^n?首先,如果想要元素散列在一个长度之内,可以直接使用模运算,使用取余数的方法。但是如果想要提高计算机的运算效率,可以使用位运算。通过对 “长度”-1 进行与运算,一样可以达到散列的效果,从而把元素散列在固定长度之内。但是该“长度”必须要满足一个条件,而该条件就是我们的2^n。二:为什么符合2^n就可以达到散列效果?首先,我们需要了解2^n的二进制结构:最高位是1,其余为都是0,如2^3 = 1000;那么(2^n) - 1 实际就是1000-0001

2022-04-09 16:32:02 935 1

原创 对于hashCode()与equals()方法要一起重写的总结

一:众所周知,hashCode()方法与equals()方法必须要一起重写,那么为什么两者必须要同时重写呢?不同时重写不行吗?二:hashCode()方法与equals()方法的简单介绍。1.hashCode():该方法属于Object类,是由native关键字修饰的方法,也就是说,该方法是本地方法,是由底层非java语言实现的。该方法的实现实际是会根据对象的内存地址,返回一个int类型的数字。通过比对两个对象的hash码,就可以知道两者是否是同一个对象了。实际上在设计hash码时有几条规则

2022-04-09 01:10:39 793 1

原创 ThreadLocal原理总结

一:ThreadLocal是什么?ThreadLocal,即线程本地变量。一个共享变量存进该容器相当于在线程内部拷贝了一个副本。ThreadLocal里面的变量都是存在当前线程的。当操作ThreadLocal里面的变量时,实际操作的是存在自己线程的那个变量副本,该变量副本对于每一个线程都是独立的,从而实现了变量的隔离性,保证了线程安全。二:ThreadLocal保证线程变量隔离性的原理每一个Thread线程都会拥有自己的一个成员变量ThreadLocalMap,该变量默认为空(实际是Thre

2022-04-01 00:38:18 9566 10

原创 Spring与SpringBoot里的事务操作

一:Spring1.XML配置首先我们知道spring事务底层是通过aop实现的,所以Spring里的事务配置与aop配置基本一样(1)配置切面(advisor)切面有两个必要元素,分别是切入点表达式与通知<aop:config> <aop:advisor advice-ref="txadvice" point-ref="tx"/> //配置切面 </aop:config>(2)通过通知,指定哪些方法为事务方法以及设置事务属性(事务管理

2022-03-22 18:42:29 1408 1

原创 MySql数据库事务隔离级别底层实现原理总结

一:隔离级别众所周知,事务的隔离级别有四个等级,分别是读未提交(RU),读已提交(RC),可重复读(RR)与串行化(Serial),通过设置隔离级别,可以解决事务并发过程中导致的脏读,不可重复读与幻读。那么隔离级别解决这些问题的原理或逻辑是什么呢?二:隔离级别的底层实现首先需要说明一下mysql更新数据时的版本链设计。在操作一条数据时,mysql会在日志文件中生成一条对应的版本记录(即使事务未提交,也会生成记录)。该条记录除了含有当前的最新数据外,还会有trx_id与db_roll_pt

2022-03-21 14:19:33 4434 10

原创 对于享元模式与原型模式的总结

一:享元模式1.是什么享原模式可以理解是用来创建对象的一种策略,目的是为了节省空间,提高性能。典型的例子就是String类,基本实现逻辑就是把对象放进一个地方,需要创建对象时先来该地方查找,如果有相同的对象就直接引用,没有才去创建2.有什么用在开发中,可能会创建大量相同的对象,这些对象实际是重复的。因此可以在第一次创建对象时先存储起来,当需要的时候直接拿,可以节省大量的内存空间,从而提高性能二:原型模式1.是什么原型模式也可以理解为用来创建对象的一种策略,目的是为了获取与某对象运

2022-03-19 12:08:40 1072

原创 对于内部类的总结

一:内部类的意义1.通过内部类,可以访问创建它的外部类的所有数据,包括私有数据(继承关系是无法访问到私有数据的)2.内部类具有很好的封装性,不为同一包下的其他类所见3.通过匿名内部类,可以很方便地定义一个回调4.虽然类无法多继承,但是可以通过内部类再一次继承(从某种方面来说,实现了“多继承”)二:内部类的种类内部类有四种,分别是成员内部类,局部内部类,静态内部类以及匿名内部类1.成员内部类:定义在类内部,成员位置上的非静态类创建方式:外部类实例.new 内部类()p

2022-03-16 14:58:48 229 1

原创 对于java的参数传递的总结

一:参数传递的类型参数传递有两种,一种是值传递,一种是引用传递。值传递是直接传递值,也就是把实际参数的值复制一份,再传到方法中,而引用传递则是直接传递实际参数的引用地址(不复制副本)首先下个结论:java中都是值传递二:java中的方法参数类型1.基本数据类型:直接传递参数的值到方法的形参中(复制一份),无论在方法中如何修改该入参,原来的实际参数都不会改变2.引用类型:复制对象的参数引用,然后传给方法的形参,虽然传入的是对象的引用副本,但是该引用与实参引用指向的是同一个地址,所以在方

2022-03-16 09:51:09 1370 1

原创 如何获取线程池中的异常

1.若不需要处理返回值,则可以使用execute()方法来提交任务,当任务发生异常时,线程会抛出异常,同时我们也可以在run方法中捕获处理异常2.若需要返回值,需要使用submit()方法时(1)直接在run方法中捕获异常,包括未受检异常(2)利用Future对象的get()方法,对该方法捕获异常,因为线程中出现的异常会抛给get()方法,简单来说,就是线程中出现了异常,就相当于get()方法出现了异常(3)重写ThreadpoolExecutor的executor.afterExecute

2022-03-10 22:54:51 3230 1

原创 通过线程池把大任务分成小任务并汇总小任务结果的逻辑总结

一:在线程池的使用场景中,常常会碰到把一个大任务分成多个小任务然后汇总的情况,那么该如何处理这个问题呢?二:首先要明确的是创建线程任务可以通过实现Runnable接口与Callable接口,两种形式的主要区别是前者接口方法无返回值,而后者可以有返回值。1.如何得到Runable接口类型的线程任务的返回值:ExecutorService接口有两种执行任务的方式,分别是execute()与submit(),前者无返回值,后者有返回值。通过传递一个Runnable接口实现类即可返回一个Future接口

2022-03-10 13:54:24 972

原创 如何为堆内存分配空间

众所周知,java中的对象及数组是存储在堆空间的。当堆空间不够用时,会报出oom的异常错误,我们可以在jvm启动时通过配置来设置堆空间的大小-Xms:最小堆内存-Xmx:最大堆内存-Xmn:堆中新生代的内存-Xss:栈空间的内存知道了如何配置堆空间,那么如何监控jvm的内存空间呢?jdk中有自己的可视化界面:bin目录下有jvisualvm.exe,运行可以看到正在运行的java程序中的信息,包括jvm空间的大小,内存使用情况,对象实例以及线程情况等...

2022-03-09 22:39:29 556

原创 对于GC垃圾回收的总结

一:如何确定对象是否为垃圾对象1.主要原则就是看对象是否可达,而对象是否可达就是看对象是否被引用,java对象都有一个引用计数属性,每被引用一次,就+1,每被释放一次,就-1.2.对象引用类型(1)强引用:即使内存不够,溢出了,jvm也不会回收此类对象,当强引用对象之间的关联被切断时,才有可能被回收(如果方法内部进行引用,当方法执行完毕,就会退出方法栈,强引用一样会失效)Object obj = new Object();//强引用obj = null;//切断强引用与对象的联系

2022-03-09 22:33:16 468

原创 对于java类加载过程的总结

一:众所周知,我们平时编写的java源文件,需要被编译成class文件,然后交给jvm,jvm在自己的内存中运行。那么jvm是如何加载class到自己的内存的呢?通过类加载器ClassLoader二:类加载器有四种类型1.Bootstrap ClassLoaderBootstrap类加载器是用来加载java核心类库的,即%JRE_HOME%\lib下的jar包,包括rt.jar,resource.jar,charset.jar等,jvm一旦启动,就会默认去加载这些基础类到内存中,保证程序的正

2022-03-06 12:31:51 361 1

原创 对于数据库关键字的执行顺序的总结

一:常用关键字的作用1.select:字段筛选2.distinct:字段去重3.from 表查询4.join on 表连接5.where 数据筛选6.group by 数据分组7.having 数据聚合8.order by字段排序9.limit 字段分页二:执行顺序:1.从大到小原则:三大步骤:先处理表,再处理数据,最后处理字段2.从左到右原则:一个步骤可能包含几个关键字,按照语句顺序从左到右执行三:例子select distinct a.id fr

2022-03-05 11:32:38 1228

原创 对于迭代器的总结

一:为什么要有迭代器首先抛出一个问题:如果没有迭代器,想要遍历一个集合,如ArrayList我们可以怎么做?一般可以用一个for循环,调用get(i),那么如果是遍历LinedList呢?因此,迭代器的存在,就是为了解决遍历的问题,简单来讲就是提供一个统一的遍历方式。不同的集合可以有自己的迭代器实现,遍历集合就由依赖具体集合变成了依赖迭代器了。(迭代器是一个Iterator接口,这样一来,就变成了依赖抽象,即达到了解耦的目的)二:迭代器的设计1.迭代器是一个接口,接口方法有h...

2022-03-05 11:13:09 231

原创 数据库索引

一:什么是索引?所谓索引,就相当于目录。比如我们的新华字典,如果要找哪个字,一定会先找目录,通过目录再找到具体的目标。众所周知,数据库也是按页进行存储的。那么数据库一样可以通过类似新华字典一样设计,维护一个目录,而该目录,就是我们的数据库索引二:索引的分类1.hash索引hash索引的单条记录的查询效率是非常高的,通过hashmap可知,hash索引的时间复杂度是O(1),数据库引擎会为每一行记录计算几个hash值,然后数据库引擎会维护该hash码,但是因为值相近的两个数据,hash值也

2022-02-26 23:55:06 806 1

原创 对于数据库引擎的总结

一:概述什么是数据库引擎?MySQL提供了多种存储引擎,存储引擎一定程度上决定了表的能力。数据库引擎包括处理事务安全表的引擎和处理非事务安全表的的引擎。通俗点讲,所谓数据库引擎其实也就是存储数据到文件的技术。不同的技术有不同的存储机制,也就是平常所述的数据库引擎二:常用数据库引擎有哪些?1.InnoDB:提供行级锁与外键约束,目标是处理大数据容量(5.7以后的默认存储引擎)2.MyISAM:不提供行锁与外键约束,但是提供表锁,查询数据较快(曾经的默认引擎)3.MEMORY:所有数据都

2022-02-26 22:20:20 436

原创 对于设计模式之单例模式的总结

一:概述所谓单例模式,就是一个类只一个实例对象,该实例对象具有唯一性,外部访问到的对象都是同一对象实例二:实现思路1.构造函数私有化,确保外部通过new关键字无法创建新的实例对象2.要有一个全局变量供外部访问(可以是静态变量)3.要在本类创建出实例对象,确保有对象实例三:类型单例模式分为饿汉模式与懒汉模式:1.饿汉模式:饿了就要吃,即任何时候访问都要有对象准备好随时被访问,可以在类初始化的时候创建该对象;public class Singo{ priv...

2022-02-24 22:46:09 200

原创 对于设计模式之工厂模式的总结

一:简介工厂模式分为三种,分别是简单工厂模式,工厂方法模式,抽象工厂模式。二:类别1.简单工厂模式(静态工厂模式)在一个工厂内,创建所有类型的对象。该工厂模式有一个缺点,就是当工厂要增加一个对象时,需要改动工厂类,违反了开闭原则2.工厂方法模式(一个工厂生产一个对象)提供一个接口,具体的工厂实现该接口,一个工厂只负责生产一个具体的对象,当需要增加一个对象时,不需要改动工厂类,只需要扩展接口,增加一个工厂,由该工厂生产该对象即可。但是也有一个缺点,就是需要创建很多工厂,提高了开发成本

2022-02-24 22:14:56 320

原创 对于设计模式之适配器模式的总结

一:概念把一个类的接口变成客户端所期待的另一种接口,使原本接口不兼容的两个类,可以一起工作。一般逻辑是将自己不兼容的接口,包裹在一个类里面,而该类就是适配器。简单来说,就是将源角色的api通过适配器,适配为目标角色的api二:适配器模式角色 适配器模式的角色有三种,分别是源角色,适配器角色以及目标角色。正是适配器角色将源角色的api,适配为目标角色的api。三:java中适配器模式的实现(三种) 1.类适配器模式(适配器继承被适配的类)...

2022-02-11 22:28:00 1009

原创 关于抽象类与接口的总结

一: 抽象类里面的抽象方法需要被继承的子类实现;接口里面的接口方法需要被对应的实现类实现,那么抽象类与实现类有什么不用呢?难道它们是既生瑜何生亮的关系吗?其实不然 二:首先我们来了解一下抽象类1.抽象类实际上依然是一个类,也就是说,抽象类里面不仅可以有抽象方法,也可以有具有方法体的方法2.因此,当继承抽象类时,不仅可以对抽象类进行扩展,还可以继承抽象类里面的具体非抽象方法,而接口仅仅只是规范,只...

2022-01-25 14:19:55 559

原创 java中接口与父类的妙用(模板方法模式)

之前的博客中已经详细说明了接口,抽象类,普通类以及实例的作用了,该文章用现实中的例子来更好地了解这些关系,但是实际编码中,好处究竟在哪里呢?接口,继承父类等设计,都是为了面向抽象编程,之前的博客也有说明面向抽象编程有什么好处。其实无非就是解耦,而解耦的目的就是为了代码扩展性更强。在这里就举其他一些例子来更好地证明通过接口与父类来面向编程的好处一:回调接口在接触了java的web开发,或者其他编程语言开发,都会接触到“回调接口”。那么回调接口是如何实现的呢?其实原理很简单,就是利用了接口,通过面向

2022-01-22 01:48:59 1166

原创 线程的异常处理(多线程的异常处理)

一:众所周知,当程序运行出错时,会出现异常。但是溯源到线程本身,线程是如何处理异常的呢?二:首先我们知道,异常实际分为两种1.受检异常定义方法时,必须声明所有可能抛出的异常。在调用该方法时,必须手动捕获它的checked Exception,即受检异常。如IO异常,SQL异常等。因此:受检异常实际可以理解为需要被手动捕获的异常,如B方法中主动抛出了异常,若方法A中调用B方法,也需要手动捕获该受检异常2.非受检异常非受检异常,实际就是RuntimeException运行时异常,在定义方

2022-01-03 15:04:31 4681 1

原创 对数据库事务的总结

数据库事务的四个特性以及事务并发产生的问题及隔离级别

2022-01-01 18:07:57 780

原创 MyBatis框架中sql语句的执行过程

一:概述 主要思路:dom4j解析配置文件生成一个全局配置对象,利用jdk动态代理创建出接口的代理类,通过代理类完成crud的操作,从而间接完成接口方法中的crud操作(代理通过以接口方法名为id就可以拿到对应的sql语句,所以dao接口的接口方法其中一个作用就是代理类用来寻找对应的sql语句的)二:MyBatis使用的标准步骤 //通过流的方式加载mybatis配置文件InputStream in = Resource.getResourseAsStre...

2021-12-20 15:26:37 1989

原创 InvocationHandler实现类中的invoke方法为什么会被自动执行

一:首先需要明确的是动态代理中,InvocationHandler实现类并不是代理类,只是代理类与被代理类的一个中间类,这也是动态代理能够解耦的原因二:动态代理中的代理类是通过Proxy.newInstance方法,即反射生成代理类实例的,该代理类中有一个与被代理方法同名的成员方法,而该成员方法的实现实际就是调用了InvocationHandler实现类的invoke方法,即通过代理类实例调用该成员方法实际调用的是InvocationHandler实现类的invoke方法。而InvocationHa

2021-12-08 11:39:42 1344

基于BootStrap框架的前端菜单页面.rar

本文件只有基于bootstrap框架的jsp以及相应css,不包含bootstrap框架的内容,若想使用还需自己按照相应的路径结构引入bootstrap框架资源

2021-08-29

菜单表脚本menu.sql

菜单表sql脚本

2021-08-29

menubuilder-0.0.1-SNAPSHOT.jar

菜单树生成插件

2021-08-29

空空如也

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

TA关注的人

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