自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

若鱼的专栏

JAVA开发

  • 博客(250)
  • 资源 (50)
  • 问答 (1)
  • 收藏
  • 关注

原创 那些年,我们写过的低级BUG,警钟长鸣

看下这段代码有哪些问题:public static MultiPriceInfo getMultiPriceInfo(List<MultiPriceInfo> multiPriceInfos, String code) { if(CollectionUtils.isEmpty(multiPriceInfos)){ return null; } for(MultiPriceInfo priceInfo : multiPric

2020-10-29 14:43:10 948 1

原创 JPA/Hibernate中一对一关联时不持有外键方的属性延迟加载为什么不生效?

也查出来,虽然我们这里配置了延迟加载。,但是实际查询的时候,还是把。现在有一个需求,要根据。

2026-04-10 19:49:20 55

原创 SpringBoot如何对三方JAR包中的类做JSR-303参数校验?

这个方法需要接收分页参数,但是分页参数是在一个公共的DTO中定义的,并且没有添加参数校验相关的注解,在不修改源码的情况下,如何对这个类做参数校验呢?完整的源码下载请关注公众号“

2026-04-08 17:49:49 52

原创 Spring的@Cacheable在@PostConstruct中调用为啥会不生效?

这不就是面试官喜欢问的Spring Bean的生命周期吗?测试代码下载请关注公众号“爪哇优太儿”回复“Cache。

2026-04-02 09:04:47 258

原创 什么是JPA/Hibernate的N+1查询问题?如何解决?

N+1 查询 是 Hibernate 中因懒加载 + 循环访问关联属性导致的大量低效 SQL。通过 预抓取(join fetch / EntityGraph 即可解决。在开发中建议开启 SQL 日志,发现循环查询时及时优化。完整的源码下载请关注公众号“爪哇优太儿”发送消息JPA。

2026-03-31 13:19:12 63

原创 SpringBoot4+Kafka4 - 生产环境故障 - 消费者执行时间太长导致消息无限循环投递

在我们的场景中,单个消费者的处理时间会比较长,恰好最近因为某些操作导致消息数量忽然增加,导致一次poll()出来的消息数量比较多,在5分钟以内没有处理完所有的消息,然后发生了rebalance,导致无限循环。大概的意思是consumer处理poll()出来的消息时间太长导致超时了,然后消费者被认为是挂掉了,发生了rebalance,然后消息重新投递了回来。因为定时扫库的任务中有动态开关,第一时间就把开关关掉了。按道理说,就不应该再有消息发出来,但是consumer还在不停的消费消息,那么这些消息是哪来的?

2026-03-24 09:07:51 317 1

原创 SpringBoot4.0集成Kafka4-消费者如何提交偏移量Offset

比如我们想改成@Bean此时,每隔5秒消息就会重新投递过来一次。更多文章请关注公众号“爪哇优太儿”

2026-03-10 14:02:08 370

原创 SpringBoot4.0集成Kafka4-生产者重试

这种类型的错误需要首先刷新元数据,然后才能知道是否可重试,发生这种类型的错误以后,producer首先会去重试获取元数据,如果元数据一直获取失败就会一直不停的重试获取元数据。可重试错误是指那些由于系统临时状态导致、在重试后有可能会成功的错误。生产者发送消息可能会遇到3种不同类型的错误:可重试错误、不可重试错误、刷新元数据后再重试的错误。Kafka认为简单的重试并不会导致消息发送成功,比如: Topic不存在或名称非法导致的。只有可重试类型的错误才支持重试设置,对于其他类型的错误重试设置无效。

2026-03-04 09:02:34 355

原创 SpringBoot4.0集成Kafka4-收发POJO消息

我们要实现的效果是,发送消息的时候,直接发送。中的案例使用的是starte内置的。对象,接收消息的时候直接接收。完整的源码下载请关注公众号“类型,那能不能直接收发。,收发消息的类型都是。

2026-02-11 17:34:55 214

原创 SpringBoot4.0集成Kafka4快速入门

kafka的管理工具有很多,比如:Kafka UI、Kafdrop等,这里我们选择Kafka UI,它是一个SpringBoot的应用,易用且功能全面。,只需要设置broker的地址和消费者所属的组即可进行消息的收发,显然比之前的老版本更简单了。新版的kafka不再依赖zookeeper。的key和value的序列化器。

2026-02-09 08:53:19 677 1

原创 SpringBoot4.0新特性-Observability让生产环境更易于观测

用来提供可观测性支持,而无需借助Actuator。它的核心优势在于原生支持OTLP协议,虽然其内部使用 Micrometer,但所有数据都通过 OTLP 协议导出至任何兼容的后端系统。应用的可观测性是指从应用外部来观察运行中系统的内部状态的能力,它由三大支柱构成:日志记录。SpringBoot应用使用OTLP协议上传指标、链路、日志数据给。SpringBoot4.0提供了全新的。更多细节请关注公众号“爪哇优太儿”。对外提供统一的UI展示。

2026-02-06 13:10:33 283

原创 SpringBoot4.0新特性-Null-safety消灭空指针

该机制的核心目标就是通过在编译时进行静态代码检查,防止运行时抛出空指针异常。SpringBoot4.0默认集成JSpecify框架,支持使用JSpecify注解来声明API、字段及相关类型的可空性。大多数情况下,我们一般默认这些参数、返回、字段、类型都是非空的,因此只需要明确的说明可空即可,因此我们还可以在包级别统一设置默认的可空性,这个可以借助。我们想要在编译期就能表达:入参不允许为null,返回允许为null,该如何来做呢?具体来说可以有两种方式,显式设置和隐式统一设置。此时,就可以删除代码中的。

2026-02-04 12:53:00 291

原创 SpringBoot4.0要不要开启虚拟线程?

【代码】SpringBoot4.0要不要开启虚拟线程?

2026-01-28 08:52:08 90

原创 SpringBoot4.0新特性-Resilience之并发限制

我们讲了失败重试,本篇我们继续来看另一个新特性 -并发限制,简单的说,它可以限制方法的并发访问数。

2026-01-27 09:15:13 474

原创 JDK25的虚拟线程还存在Pinning问题吗?

JDK21引入了虚拟线程,但是很多场景都会导致平台线程被虚拟线程Pin住从而导致虚拟线程无法卸载,连最常用的。都会Pin住底层的平台线程,这大大的降低了虚拟线程的可用性。问题是,现在都JDK25了,的Pinned问题还存在吗?

2026-01-27 09:10:34 62

原创 SpringBoot4.0新特性-BeanRegistrar

它是以编程方式根据条件动态做Bean的注入,并且可以一次注入多个Bean。Spring 7.0引入了一种新的更方便更灵活的注册Bean的方式-现在想实现:如果是生产环境就启用。测试不同的输出情况。

2026-01-26 09:54:10 60

原创 SpringBoot4.0新特性-Resilience之失败重试

从Spring7.0版本开始,Spring Framework核心模块已经集成了常用Resilience相关功能,主要包括了对方法调用的失败重试支持以及并发控制支持。SpringBoot 4.0默认的Spring的版本就是Spring 7.0, 因此SpringBoot 4.0自然也就具有了这些特性。本文先来学习下失败重试,下一篇再来学习并发控制。

2026-01-23 09:16:38 135

原创 SpringBoot4.0新特性-声明式HTTP远程调用客户端进阶篇

单个客户端超时配置的优先级更高,超时客户端会抛出。

2026-01-22 09:05:00 313

原创 SpringBoot4.0新特性-声明式HTTP远程调用客户端基础篇

对应于,说明这个是Rest客户端, url可以设置服务的地址,当然base-url部分也可以用其他方式来指定,稍后会说明:对应GetMapping,说明这个是GET请求,聪明的你一定可以想到还会有对应的等。:就是路径参数,传参这一部分跟Controller的传参是一模一样的。

2026-01-21 09:10:41 614 1

原创 SpringBoot4.0新特性-API版本管理进阶篇

前一篇文章中我们介绍了在SpringBoot4.0中API版本管理的基本用法,但是有时候我们的项目中可能会有这样的需求,比如:对于老的1.0版本走一个老的接口,对于1.1及以上的版本走新的接口,这样的需求又该如何来实现呢?如果有多个接口都能满足请求的版本号,这个时候系统应该如何选择呢?

2026-01-20 09:14:35 201

原创 SpringBoot4.0新特性-API版本管理基础篇

API 版本管理是后端开发中一个棘手但又无法回避的问题,尤其是在移动端开发中更为明显。现在,SpringBoot4.0 为 SpringMVC 和 WebFlux 提供了原生的 API 版本控制支持。媒体类型版本控制:通过媒体类型来指定版本策略,比如:Accept: application/json;查询参数版本控制:通过查询参数指定版本,比如/api/orders?URI版本控制:在URL路径中添加版本,比如/api/v1/orders。请求头版本控制:通过自定义请求头来指定版本。

2026-01-16 14:11:02 177

原创 Jackson Mixin 详解

Mixin 是 Jackson 提供的一种机制,允许你在不修改原始类源码的情况下,为其添加或覆盖 Jackson 注解。它通过"混入"的方式,将注解逻辑与实体类定义分离。核心概念分离关注点:序列化规则与领域模型分离无侵入式:不需要修改原始类,适用于第三方库的类运行时绑定:在 ObjectMapper 级别配置,不影响类本身。

2025-11-26 14:09:52 484

原创 Slf4j打印异常堆栈的正确姿势

Slf4j打印日志的时候,如果最后一个参数是 Throwable 时可省略占位符。Logback、Log4j2、JUL 绑定都遵循此规则。

2025-10-16 13:51:35 266

原创 spring-kafka的消息拦截器RecordInterceptor

KafkaClients提供了可以在消费消息之前对消息进行拦截,Spring-Kafka对消费拦截器做了增强,新提供了一个与之类似的,我们还是以传递TraceId来看下具体的使用方法。

2025-09-16 16:16:05 428

原创 spring-kafka的消息过滤器RecordFilterStrategy

运行机制:Spring Kafka的监听器容器(如ConcurrentMessageListenerContainer)poll()到消息以后,为每条消息创建一个ConsumerRecord并封装成Message,在调用@KafkaListener的方法之前,容器会先检查是否配置了RecordFilterStrategy,RecordFilterStrategy 的 filter 方法被调用,如果返回true,就不会调用listener。Offset的提交与消息的处理结果(包括被过滤) 是同步的。

2025-09-16 11:40:03 1008

原创 Kafka如何配置生产者拦截器和消费者拦截器

生产者拦截器:在消息序列化和分区之前(onSend)以及确认之后(onAcknowledgement)调用。消费者拦截器:在消息反序列化之后、返回给用户之前(onConsume)以及提交偏移量之后(onCommit)调用。

2025-09-13 14:58:13 621

原创 Spring Boot如何配置Liveness和Readiness探针

当我们采用Kubernetes作为编排平台时,每个Pod节点上的kubelet都负责维持该节点内Pod的健康状态。例如,某些应用程序在启动后可能需要短暂准备时间才能开始接收请求。kubelet可以确保只有当应用准备就绪时才会向其转发流量。此外,如果Pod的主进程因任何意外原因崩溃,kubelet将自动重启容器。为履行这些职责,Kubernetes提供了两种健康检查机制:存活探针(liveness probes)和就绪探针(readiness probes)。

2025-08-20 16:25:47 819

原创 JDK的Stream API使用详解

把流中的元素收集到一个容器中去,比如:List、Set、Map、StringBuilder、StringJoiner等。primitiveStream.mapToObj(IntFunction) 转化成其他类型的流。stream.mapToInt(ToIntFunction)其他类型的流转化成基本类型流。注意:流只能遍历一次,就跟水从水管中流过一样,不能重复再从头遍历。primitiveStream.boxed() 转化成包装类型流。不利用已有的对象,而是利用某些规则去生成流中的元素。

2025-07-12 18:03:31 1088

原创 JDK的Closure闭包详解

闭包是指一个函数(或方法)能够访问并记住其词法作用域(lexical scope)中的变量,即使该函数在其原始作用域之外执行。可以捕获外部作用域的变量保持这些变量的生命周期即使外部方法执行完毕,闭包仍可访问这些变量。

2025-07-10 20:38:54 662

原创 JDK中Lambda表达式的内部运行原理解析

从字节码中我们可以看到,java编译器在编译这个源代码的时候,自动帮我们生成了一个 private static的名字叫lambda$main$0,参数是String.class返回是Integer.class的一个方法,方法中干的事情就是跟lambda表达式是一样的,调用String.length()方法,返回Integer的长度。lambda表达式实际上也是普通的类中的方法的调用,只不过,这个类是运行时动态生成的,方法是编译器在编译期动态生成的。首先,我们来下一个简单的lambda表达式的demo。

2025-07-06 19:01:03 345

原创 经典数据库查询问题-行转列

【代码】经典数据库查询问题-行转列。

2025-06-25 17:07:30 219

原创 openapi-generator-maven-plugin自动生成HTTP远程调用客户端

Java开发中调用http接口的时候,有很多可选的技术方案,比如:HttpURLConnection、RestTemplate、WebClient、Feign、Retrofit、Okhttp等,今天我们来看一个更优的技术方案OpenAPI Generator(http://openapi-generator.tech/)

2025-06-22 14:58:23 1413

原创 SpringBoot实现简单的API代理服务器

提供一个API代理服务,前端访问的时候,添加统一的前缀比如/api进入代理服务的ApiController,ApiController需要识别出来这个请求要访问的是哪一个后端服务,在SpringCloud中我们可以借助Nacos来做,现在只能手动做配置,把服务名追加到url中。当ApiController收到请求的时候,首先从url中解析出来服务名,然后根据服务名查询配置文件找到实际的后端要访问的服务地址,拼接上url中剩余部分作为实际要转发的url,转发请求,返回响应。得到真正要访问的url是。

2025-05-15 10:23:47 767

原创 SpringBoot配置项名与Java属性名的映射规则

来自properties、yml、system property的属性,不管是snake_case还是kebab-case风格,最终都是转化成camelCase。来自OS环境变量的属性,仅支持UPPER_SNAKE转camelCase。

2025-04-27 11:04:43 527

原创 Cannot find module @rollup/rollup-win32-x64-msvc

【代码】Cannot find module ‘@rollup/rollup-win32-x64-msvc‘

2025-03-20 11:26:22 1329

原创 gradlew在gitlab ci没可执行权限-permission denied

644没有执行权限。显然,gradlew没有可执行权限。

2025-03-19 17:11:51 350

原创 mapstruct入门

只需要在接口上添加@Mapper注解即可,mapstruct会创建一个具有相同方法的实现类,并自动生成所有的setter和getter.@Mapper.builder().build();

2025-01-27 11:05:50 579

原创 Mockito快速入门

SpringBootTest注解来加载整个Spring应用上下文, @MockBean@SpyBean注解用于在Spring应用上下文中注入一个模拟的Bean,它将在测试开始时自动添加到Spring应用上下文中。除了 mock()/@Mock,还可使用 spy()/@Spy,两者区别是 spy 是部分mock,如果不打桩,则执行的是真实的方法。@Mock 是 Mockito 中用的最多的注解,我们用它来创建并注入mock对象,而不用手动调用 Mockito.mock 方法。也可以使用 @Mock 注解。

2025-01-23 13:50:38 1298

原创 SpringBoot集成Kafka和avro和Schema注册表

【代码】SpringBoot集成Kafka和avro序列化。

2024-11-30 15:50:52 738

原创 gRPC-集成Springboot

服务端首先添加相关依赖:添加相关的配置服务端service代码:客户端添加依赖添加配置客户端调用:完整的源码下载:https://github.com/xjs1919/learning-demo/tree/master/grpc-demo

2024-11-04 16:37:04 613 1

前面部分可以编辑后面部分不可编辑的EditText

有一个需求是这样的,页面上有一个输入框,供用户输入手机号码,如果通讯录里面存在这个号码,会自动把名字追加到号码后面。这个需求变态的地方在于,假如用一个EditText+TextView,那么不好控制二者之间的距离,就算是做了各种适配,但是用户可以设置系统的字体,仍然显示很难看!没办法,之好在一个EditText里面来实现号码部分可编辑,名字是自动追加上的。

2014-02-25

Android-部分可编辑的EditText

有一个需求是这样的,页面上有一个输入框,供用户输入手机号码,如果通讯录里面存在这个号码,会自动把名字追加到号码后面。这个需求变态的地方在于,假如用一个EditText+TextView,那么不好控制二者之间的距离,就算是做了各种适配,但是用户可以设置系统的字体,仍然显示很难看!没办法,之好在一个EditText里面来实现号码部分可编辑,名字是自动追加上的。

2014-02-20

SharedPreferences帮助类

(1)用单例注册表模式来管理所有的SharedPreferences文件 (2)支持批量写入 (3)支持按版本号写入key (4)对key的写入是异步,提高效率 原理请参考:http://blog.csdn.net/goldenfish1919/article/details/17629541

2013-12-31

Android自定义组件-MultiTextView(更新)

可以在一个固定宽度的区域显示多个不定长度的字符串,类似于淘宝上商品详情的尺码和颜色分类那种。

2013-12-25

Android-从页面右侧滑出通讯录

点击从页面右侧滑出通讯录 /*主要参考: * * 1. Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音 * http://blog.csdn.net/xiaanming/article/details/12684155 * 2. Android 带清除功能的输入框控件ClearEditText,仿IOS的输入框 * http://blog.csdn.net/xiaanming/article/details/11066685 * 3. Android系统联系人全特效实现(上),分组导航和挤压动画 * http://blog.csdn.net/guolin_blog/article/details/9033553 */

2014-02-22

ListView后台更新报错:java.lang.IllegalStateException

java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2131230720, class android.widget.ListView) with Adapter(class com.example.listviewdemo.UserListAdapter)]

2013-12-13

Android的ExpandableListView+CheckBox全选

ExpandableListView的group和child里面都含有CheckBox框,二者联动。

2013-11-22

Android-用ListView模仿ExpandableListView

ListView的adapter有一个getItemViewType()和getViewTypeCount()这么两个方法,挺好用的,主要是用来练习这两个方法的。

2014-08-01

Android-Popupwindow和Dialog做弹出窗口

(1)Popupwindow在显示之前一定要设置宽高,Dialog无此限制。 (2)Popupwindow默认不会响应物理键盘的back,除非显示设置了popup.setFocusable(true);而在点击back的时候,Dialog会消失。 (3)Popupwindow不会给页面其他的部分添加蒙层,而Dialog会。 (4)Popupwindow没有标题,Dialog默认有标题,可以通过dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);取消标题 (5)二者显示的时候都要设置Gravity。如果不设置,Dialog默认是Gravity.CENTER。 (6)二者都有默认的背景,都可以通过setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。

2014-05-04

Android-异步图片加载器

在ListView中加载图片是非常常见的场景,图片的加载要满足下面的几个要求: (1)不管图片是位于网络还是本地,加载都不应该是同步的,而是应该异步去加载,比如用AsyncTask。 (2)为了避免重复下载图片和页面展示的速度,一般要做缓存,比如最常见的LruCache。 (3)为了提高Listview的性能,我们一般会用holder来重用Listview的item。 因为item会重用,所以当图片下载时间很长的情况下,就会引起页面上图片显示错乱!本文的图片加载器可以避免这个问题

2014-05-09

Android-网络通信框架Volley使用详解

1.发送get 2.发送post 3.获取图片 4.发送https 5.获取cookie 6.上传cookie 7.自定义request 8.设置超时

2014-03-12

Android-maven配置multidex打包

工程大了以后,不可避免就会出现方法数目超出65536的限制,很幸运的是新的android提供了多dex打包的方式可以解决这个问题。本资源就是演示如何用android-maven-plugin打多dex包。

2014-12-18

Android-根据EditText内容的变化,自动追加TextView

根据EditText内容的变化,自动追加TextView,可以不用适配二者之间的间距

2014-02-27

Android-拍照、打开本地相册

(1)调用系统的拍照功能 (2)调用系统的相册 (3)获取文件的绝对路径

2014-03-13

如何让TextView的人民币符号是¥(下面是两道杠)而不是一道杠

如何让TextView的人民币符号是¥(下面是两道杠)而不是一道杠

2013-12-18

Android录音与播放

android中 (1)使用MediaRecorder做录音 (2)使用MediaPlayer播放录音

2014-04-29

launch mode 测试demo

android支持4中launch mode,本例就是想看下他们之间的区别。

2014-11-03

自动购票2014-01-11版

(1)不支持验证码自动识别 (2)不支持一次顶多个票

2014-01-11

android自定义组件-刮刮卡

刮刮卡,引用在:http://gundumw100.iteye.com/blog/1932020

2013-12-13

Android自定义组件-MultiTextView

可以在一个固定宽度的区域显示多个不定长度的字符串,类似于淘宝上商品详情的尺码和颜色分类那种。

2013-12-11

Oracle11gR2 CentOS7 静默安装

Oracle11gR2 CentOS7 静默安装,开机自启动,等等

2017-08-15

Redis4基于CentOS6集群搭建

Redis4基于CentOS6集群搭建,3主3从,文档是安装在同一台机器上,实际可以安装在不同的机器,启动集群的时候指定ip地址就可以。

2017-09-07

全国行政区划2022年版

全国行政区划2022年版

2022-08-31

maven+spring+mybatis配置

1.非web环境下spring如何与mybatis集成 2.maven如何打可以直接运行的jar包 3.maven如何用profile动态打包jdbc.properties 4.maven如何把mybatis的mapper.xml一起打包到jar中

2015-12-17

Android-对ListView的Adapter的一种简单封装

对ListView的Adapter的一种简单封装,详细:http://blog.csdn.net/goldenfish1919/article/details/47039985

2015-07-24

Android-加速传感器或者OrientationEventListener做横竖屏切换

在播放视频的时候,可能要做横竖屏的切换,但是,用户可以设置自己的手机关掉屏幕旋转,这个时候就需要想其他的办法了,比如:加速传感器或者OrientationEventListener。

2015-08-13

记录应用的接口访问信息

基于SpringBoot,实现记录应用的接口访问信息,包括接口的访问次数、正常调用次数、异常调用次数、接口的平均访问时间、最大访问时间、最小访问时间。

2017-09-26

gitlab安装-配置-运维-使用详细说明

gitlab安装-配置-运维-使用详细说明

2017-07-21

apache安装并配置HTTPS

apache源码安装并配置HTTPS,首先要安装apr、apr_util、pcre、openssl,资源中包含了所需的所有的源码和安装文档。

2017-10-11

Spring Boot集成MyBatis与分页插件

Spring Boot集成MyBatis与分页插件

2016-06-18

navicat for mysql解压版

navicat for mysql解压版

2017-08-03

Axure8.0破解版+chrome插件

Axure8.0破解版+chrome插件

2017-07-03

Apache CXF + Spring3 + REST + JSON配置

Apache CXF配置REST服务,集成到Spring当中。

2015-09-01

Android-自定义显示价格的PriceView

如何用onDraw和onMeasure自定义view

2015-03-18

Android日期时间选择控件

android的DatePicker与TimePicker都受android系统版本的影响,展示风格非常不统一,而且不能同时选择日期与时间。这个控件就能做到。

2015-08-12

dubbo调用的例子

dubbo-interface dubbo-provider dubbo-consumer

2016-09-25

Nginx安装配置

nginx源码安装和配置,集成cache-purge、https,希望参考:《实战Nginx:取代Apache的高性能Web服务器》《Nginx教程从入门到精通》《HTTPS权威指南 在服务器和Web应用上部署SSL&TLS;和PKI》

2017-10-13

省市区名称与代码的SQL

省市区的mysql,可以直接导入数据库。省市区的mysql,可以直接导入数据库。

2017-11-09

jd反编译工具

jd-gui反编译,jdeclipse插件

2017-08-03

EmEditor Pro15.1.5x64解压版

EmEditor Pro15.1.5x64解压版

2017-08-03

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

TA关注的人

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