自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

z55947810的博客

自学的小渣渣

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

原创 从一种统一接口的封装方式到SpringMVC调用链的梳理

我们知道 DispatcherServlet 是实现了 Servlet 接口的,而 Servlet 对请求的处理是从 service 方法开始的,所以我找到了 FrameworkServlet(DispatcherServlet 的父类) 的 service 方法。接口封装一般是必不可少的,平常遇到的封装方式可能是下面这种,创建一个类ResponseResult,然后返回数据的时候统一返回ResponseResult类型的对象。最后总结出他的调用链大概是这样的。

2023-02-20 08:59:27 185 1

原创 HashMap源码解析二

所以关键的地方就在于 **(newCap - 1)**新增的1的位置,和hash值与之对应位置上的数做位于运算,该位置的值是否等于1,等于1就位置改变,等于0就放在原位置。这两个**(newCap - 1)**的区别在于,扩容后新增加的1是倒数第六个位置,刚好hash值的倒数第六个值也是1,所以发生了位置改变。其他两次都是因为扩容后,(newCap - 1)新增加的1的位置,hash值与之对应的位置上确实0,所以没有发生位置改变。后面的 (h >>> 16) 这步操作是将 h 的高16位移动到了低16位。

2022-11-24 18:20:14 277

原创 HashMap源码解析一

HashMap 的源码,基本上面试都被问烂了,我记得我大三暑假开始找实习,过半公司都会问到这玩意。java1.7和1.8的 HashMap 数据结构,1.7是数据+链表,1.8多了一个红黑树。默认的加载因子是 0.75。当链表长度大于等于8,数组长度大于等于64时,链表会树化;当树的元素小于等于6的时候,又会退变成链表。HashMap 的容量都是 2 的整数倍。链表的插入方法, 1.7的时候是头插法,1.8变成了尾插法。可能还会讲一下1.8的扩容机制。

2022-11-23 16:51:43 323

原创 Mysql优化-经验分享

帮助MYSQL高效快速获取数据的一种数据结构对数据库表中的一列或多列值进行排序说明:以空间换取时间维护索引结构。

2022-11-22 17:19:15 357

原创 Method breakpoints may dramatically slow down debugging(项目debug启动不起来)

原因:mapper层有方法打了断点。

2022-11-02 09:04:36 139

原创 ArrayList源码解析二

当我们可预知要保存的元素的多少时,要在构造ArrayList实例时,就指定其容量,以避免数组扩容的发生。最后终于确定 newCapacity 的值后,就调用 Arrays.copyOf() 去扩容,这个方法的底层是 native 方法,就不细究了。数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的1.5倍。是用来记录操作次数的,一般在我们的增加和修改的方法里面使用,是一种线程安全机制,具体的作用这里不细讲。,就告诉我们,扩容不是直接就能扩的,得把溢出的情况排除。

2022-10-10 18:16:23 266

原创 ArrayList源码中的MAX_ARRAY_SIZE

如果有了 MAX_ARRAY_SIZE 的话,那么这些(Some VMs)会在 数组长度为 Integer.MAX_VALUE - 8 的时候,再增加元素才会报错,其他VM会正常的扩容到 nteger.MAX_VALUE。很多人看到 MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8 这句代码,就说 Arraylist 的最大容量是 Integer.MAX_VALUE - 8 ,这是不对的。思索了很久,再结合源码的注释,我开始想是不是兄弟们把这个问题想复杂了啊。

2022-10-10 18:13:06 738

原创 ArrayList源码解析一

一问到ArrayList,我们会简单的想到他的一些性质:动态数组(自动扩容);允许任何元素插入(包括null);初始化容量为10等等。下面我们试着解析一下源码,探索一下 Java 是怎么实现 ArrayList 的。因为会按功能去解析,所以下方类的顺序和源码中的不一定一致。可以看出 ArrayList 本质上是一个 object 类型的数组。object是所有类型的父类的,所以能插入任意元素也不足为奇了。size 就是获取ArrayList的大小(包含的元素数量),没什么讲的。DEFAULT_CAPA

2022-07-14 17:54:38 248

原创 Java并发线程基础知识

目录线程状态及转换新建(New)运行(Runnable)阻塞(Blocked)无限期等待(Waiting)有限期等待(Timed Waiting)死亡(Terminated)Thread的state枚举类源码线程创建方式继承 Thread 类实现 Runnable 接口实现 Callable 接口一些线程机制Executor线程池的好处线程池核心类ThreadPoolExecutor主要参数主要的四种创建方法Daemonsleep()线程互斥同步synchronizedReentrantLocksynchr

2022-05-27 09:30:37 131

原创 php基础语法

目录1、标记2、数据类型基本数据类型Boolean(布尔型)String(字符型)Integer(整形)Float(浮点型)复合数据类型Array(数组)Object(对象)特殊数据类型NULLResource(资源)3、变量声明变量变量的命名规则4、变量作用域局部变量与局部作用域全局变量与全局作用域5、变量赋值直接赋值拷贝赋值引用赋值6、可变变量7、预定义变量8、静态变量9、global与$GLOBALS:在函数内访问全局变量10、注释单行注释多行注释11、常量define定义常量constant定义常量

2022-05-26 17:00:24 318

原创 Java并发理论基础知识

目录什么是程序什么是进程什么是线程为什么需要多线程线程不安全示例并发三要素可见性:CPU缓存引起原子性:分时复用引起有序性:重排序引起线程数设多少最合适Java是怎么解决并发问题的:JMM(Java内存模型)Happens-Before 规则什么是程序程序是指令、数据及其组织形式的描述,进程是程序的实体。程序是操作系统可执行的文件,也就是说操作系统找到可执行的文件,并把这些文件加载到内存中。什么是进程进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基

2022-05-17 16:08:14 292

原创 23种设计模式模式介绍及目录

目录一、什么是设计模式二、设计模式的类型1、创建型模式2、结构型模式3、行为型模式三、设计模式之间的关系四、设计模式的六种原则1、开闭原则(Open Close Principle)2、里氏代换原则(Liskov Substitution Principle)3、依赖倒转原则(Dependence Inversion Principle)4、接口隔离原则(Interface Segregation Principle)5、迪米特法则,又称最少知道原则(Demeter Principle)6、合成复用原则(C

2022-04-29 15:54:09 156

原创 Visitor 访问者模式

定义在访问者模式中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。如果学过数据结构就很容易理解访问者,遍历就是访问的一种形式,读取到想要查看的内容然后对其进行处理就叫做访问。优缺点优点:符合单一职责原则。优秀的扩展性。灵活性。缺点:具体元素对访问者公布细节,违反了迪米特原则。具体元素变更比较困难。违反了依赖倒置原则,依赖了具体类,没有依赖抽象

2022-04-29 15:31:38 189

原创 Chain of Responsibility 责任链模式

定义责任链模式为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。优缺点优点:降低耦合度。它将请求的发送者和接收者解耦。简化了对象。使得对象不需要知道链的结构。增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。增加新的请求处理类很方便。缺点:不能保证请求一定被接收。系统性

2022-04-29 15:07:42 142

原创 State 状态模式

定义在状态模式中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。优缺点优点:封装了转换规则。枚举可能的状态,在枚举状态之前需要确定状态种类。将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

2022-04-28 17:55:56 98

原创 Interpreter 解释器模式

定义解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。无论高级语言的程序是怎么样编写的,编译器的代码是不用修改的,而解释器模式就是想做一个建立在Java和我们自定义语言之间的编译器。优缺点优点:可扩展性比较好,灵活。增加了新的解释表达式的方式。易于实现简单文法。缺点:可利用场景比较少。对于复杂的文法比较难维护。解释器模式会引起类膨胀。解释器模式采用递归调用方

2022-04-28 17:42:51 345

原创 Memento 备忘录模式

定义备忘录模式保存一个对象的某个状态,以便在适当的时候恢复对象。优缺点优点:给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。实现了信息的封装,使得用户不需要关心状态的保存细节。缺点: 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。实现Memento/** * Memento */public class Memento { private String state;

2022-04-27 17:45:37 273

原创 Observer 观察者模式

定义观察者模式主要使用于对象间存在一对多关系时。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。优缺点优点:观察者和被观察者是抽象耦合的。建立一套触发机制 。缺点: 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目

2022-04-27 17:25:54 207

原创 Iterator 迭代器模式

定义迭代器模式是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。有人可能非常的奇怪,因为我们完全可以使用一个for循环来完成这样的操作,又何必大费周章的来一个迭代器来遍历呢? 因为for循环耦合度太高了,迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。优缺点优点:它支持以不同的方式遍历一个聚合对象。迭代器简化了聚合类。在同一

2022-04-27 16:43:18 523

原创 Command 命令模式

定义命令模式是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。命令模式使请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。优缺点优点:降低了系统耦合度。可拓展性强,新的命令可以很容易添加到系统中去。缺点:使用命令模式可能会导致某些系统有过多的具体命令类。组成received:接收者对象。Command:命令对象。invo

2022-04-27 16:13:45 938

原创 Template 模板方法

定义在模板模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。简单说,就是定义一个操作的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构就可以重新定义该算法的某些步骤。优缺点优点:封装不变部分,扩展可变部分。提取公共代码,便于维护。行为由父类控制,子类实现。缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大 。实现模板方法可以做

2022-04-27 15:35:19 413

原创 Flyweight 享元模式

定义享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。我们Java中的String常量池、数据库连接池、缓冲池等池技术都是享元模式的应用,所以说享元模式是池技术的重要实现方式。优缺点优点:大大减少对象的创建,降低系统的内存,使效率提高。缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态不应该随着内部状态的变化而变化,否则会造成系统的混乱。结构抽象享元角色: 产品

2022-04-26 18:02:00 675

原创 Composite 组合模式

定义组合模式又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。优缺点优点:高层模块调用简单。节点自由增加。缺点:使得设计更加复杂,客户端需要花更多时间理清类之间的层次关系。结构抽象构件(Component):定义了访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等 。容器构件(Composite):抽象构件的具体实现类。

2022-04-26 17:32:32 338

原创 Adapter 适配器模式

定义适配器模式是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。我们给手机充电时,电源线头头就叫电源适配器,作用就是把220V电压转换成手机充电时使用的电压,所以适配器很好理解。优缺点优点:可以让任何两个没有关联的类一起运行。提高了类的复用。增加了类的透明度。灵活性好缺点:过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被

2022-04-25 17:51:36 435 1

原创 Bridge 桥接模式

定义桥接模式是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。桥接模式基于类的最小设计原则,通过使用封装、聚合、继承等行为让不同的类承担不同的职责。优缺点优点:抽象和现实的分离优秀的拓展性实现细节对客户透明缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求

2022-04-25 16:41:49 513

原创 使用 System.currentTimeMillis() 代替 new Date().getTime() 获取时间戳

平常我们想要获取一个时间戳,一般是这样写的:new Date().getTime() / 1000现在大家不妨可以改成这样:System.currentTimeMillis() / 1000PS:/ 1000 的原因是因为 new Date().getTime() 和 System.currentTimeMillis() 返回的是一个13位数字,单位是毫秒。除1000能让单位变为秒。根据平常使用习惯,使用new Date()来获取当前时间,可以获取与当前时间有关的各方面信息,例如获取小时,分钟

2022-04-25 14:24:28 1994

原创 Proxy 代理模式

定义代理模式中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。优缺点优点:被代理类可以更加专注于主要功能的实现,在一定程度上降低了系统的耦合度。代理类可以提供额外的功能 。缺点:实现代理模式需要额外的工作,有些代理模式的实现非常复杂 。使用场景在访问对象时附加一些操作。控制对原始对象的访问,比如过滤器。实现分为静态代理和动态代理。静态代理在使用静态代理时,需要定义接口或者父类,被代理对象与代

2022-04-24 17:46:03 311

原创 Prototype 原型模式

定义原型模式是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。原型模式的实现主要是利用sun公司提供的克隆机制来实现的,在Object这个类中有一个clone方法,这个方法是用protected

2022-04-24 16:49:35 795

原创 Builder 建造者模式

定义建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。组成抽象建造者(Builder):可以是接口或者抽象类。在该接口中一般声明两类方法,一类方法是buildPatX(),他们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。具体建造者(ConcreteBuilder)指挥者(Dire

2022-04-18 18:17:40 435

原创 Decorator 装饰器模式

定义Decorator装饰器会动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。组成抽象构件(Component):核心,是一个接口或抽象类。具体构件(ConcreteComponent):Component的具体实现,需要被装饰的构建。装饰者(Decorator):继承或者实现Component,在它的属性里面有一个变量指向Component抽象构件。具体装饰者(ConcreteDecorator):可以把具体构件装饰成新的东西。优缺点优点:装饰类和被装

2022-04-18 01:17:42 184

原创 Mediator 中介模式

定义仲裁者模式又称为调停者模式或中介者模式,主要是仲裁和中介的作用,帮助其它类之间进行通信,降低多个对象和类之间的通信复杂性。在仲裁者模式之中,我们要明确两个概念,那就是仲裁者(Mediator)和组员(Colleague),不管组员有什么事情,都会向仲裁者汇报,仲裁者会根据全局的实际情况向其他Colleague作出指示,共同完成一定的逻辑功能。组成仲裁者接口具体的仲裁者组员抽象类具体的组员示例我们以房屋出租为例,房东通过中介将房子租给租客,直接从中介处拿到租金;租客通过中介找到房东进

2022-04-16 23:59:48 381 1

原创 Facade外观模式

定义外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用,子系统并不知道门面的存在,并且子系统也完全不相关,都是单独的存在。我们都知道类与类之间的耦合越低,那么可复用性就越好,如果两个类不必彼此通信,那么就不要让这两个类发生直接的相互关系,如果需要调用里面的方法,可以通过第三者来转发调用。外观模式非常好的诠释了这段话。实现门面类public class Facade { //被委托的对象 SubSystem

2022-04-16 21:35:30 212

原创 FactoryMethod工厂方法AbstractFactory抽象工厂

目录定义工厂模式分类不使用设计模式简单工厂模式工厂方法模式抽象工厂模式定义工厂模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,也就是说工厂方法模式让实例化推迟到子类。工厂模式在创建对象时,不会对客户端暴露对象的创建逻辑,而是通过使用共同的接口来创建对象,非常符合“开闭原则”。简单理解:任何可以产生对象的方法或类,都可以称之为工厂。工厂模式分类简单工厂模式工厂方法模式抽象工厂模式他们分别能解决的问题:由一个工厂来定制任意的实体有多个工厂来定制实体,每个工厂都能定制自

2022-04-16 17:02:49 506

原创 Strategy策略模式

作用策略模式其实很简单,就是针对不同的场景,做出不同的处理策略。将一系列行为封装起来,被封装起来的行为具有独立性外部不可改变其特性。遵循了开闭原则,不需要改动旧代码,更方便维护。使用方式为了方便大家真正体会策略模式的好处,这里给出一系列的变换过程,方便大家对比。实体类:@Data@AllArgsConstructor@NoArgsConstructorpublic static class Apple { private String color; private int

2022-04-16 02:13:57 586 1

原创 Singleton单例模式

目录概述代码实现1、饿汉式2、懒汉式3、使用synchronized的懒加载4、双重检测机制5、静态内部类6、枚举概述单例模式(Singleton Pattern)可以保证系统内存中,使用单例模式的类只有一个对象实例。代码实现具体实现一般为:构造方法设为私有,只能通过某个方法得到实例。1、饿汉式在类加载到内存时,就实例化了一个单例对象,jvm保证线程安全。无参构造方法用 private 修饰,防止被 new 实例化。提供 public 方法 getInstance(),让调用方获取唯一的对象

2022-04-15 17:42:56 538

原创 [Java] a = a + b 与 a += b 的区别

众所周知,在java中 a = a + b在大多数情况下都是可以替换为 a += b 的,那么这两种写法有什么区别呢?如果两个整型相加,如 byte、short 或者 int,首先会将它们提升到 int 类型,然后在执行加法操作。+= 会隐式的将加操作的结果类型强制转换为持有结果的类型。而 a + b 不会。举例:byte a = 127;byte b = 127;b = a + b; // error : cannot convert from int to byteb += a; // o

2022-03-28 00:09:48 437

原创 jvm基础理论知识整理

类的加载类的加载是指将类的class文件中的二进制数据读入到内存中,并将其放在运行时数据区的方法区内,然后在堆中创建一个class对象,这个class对象就是类加载的最终产品。类加载过程加载-》校验-》准备-》解析-》初始化-》使用-》卸载加载,通过IO读入字节码文件;执行校验、准备、解析步骤;初始化,对类的静态变量初始化为指定的值,以及执行静态代码块;使用;卸载;类加载器种类启动类加载器:加载支撑JVM运行的位于JRE的lib目录下的核心类库。拓展类加载器:加载支撑JVM运行的

2022-03-18 13:55:08 597

原创 前端遇到的一些小问题

1、输入框缓存一些浏览器会自动记录你在输入框里输入的值,但是如果你有个选择日期的输入框,那么这个缓存会遮挡你的日期选择器,可以使用下面的属性。$("").attr("autocomplete", "off");2、ie浏览器下拉框,选项字段过长无妨完全显示选项// 适配ie,使下拉框宽度能自动拓宽$("").css("width", "auto");3、ie浏览器字体不清晰问题// 适配ie,使下拉框字体清晰$("").css("animation-name", "none");4、

2022-03-15 15:20:04 1290

原创 [Oracle] 对于小于1的数不显示小数点前的0

最近遇到个小需求,就是前端输入一个公式,然后使用Oracle进行运算(这样公式可以Oracle的函数)。SELECT ${formula} FROM DUAL但是出现一个问题,就是运算结果小于1的时候,Oracle输出的值会去掉小数点前的0。比如计算结果为"0.01",那他就输出 “.01”。通过百度,找到方法加上了0。SELECT to_char(${formula},'fm999999990.999999999') FROM DUAL但是这种方法对于整数又非常不友好,会在整数的后面加上一

2022-03-15 10:05:22 2315 2

原创 lock和synchronized区别

1、作用lock 和 synchronized 都是 Java 中去用来解决线程安全问题的一个工具。2、来源sychronized 是 Java 中的一个关键字。lock 是 JUC 包里面提供的一个接口,这个接口有很多实现类,其中就包括我们最常用的 ReentrantLock(可重入锁)。3、锁的力度sychronized 可以通过两种方式去控制锁的力度:把 sychronized 关键字修饰在方法层面。修饰在代码块上。锁对象的不同:锁对象为静态对象或者是class对象,那这个锁

2022-03-13 20:30:54 3217

空空如也

空空如也

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

TA关注的人

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