自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 策略模式-

策略模式 | 菜鸟教程

2023-10-09 17:23:17 210

转载 nginx

Nginx 配置详解 | 菜鸟教程

2023-10-09 14:39:25 206

原创 多线程问题合集

它可以自动管理任务的拆分、调度和结果合并,简化了并行任务的编写过程,并发挥多核处理器的潜力,提高了程序的性能和效率。自旋锁(Spin Lock)是一种基于忙等待的锁机制,它不会使线程进入阻塞状态,而是在获取锁时反复检查锁的状态,直到成功获取锁或达到一定的等待次数。线程同步是一种多线程编程的技术,用于控制多个线程对共享资源的访问,以避免竞争条件和数据不一致性的问题。- 自旋锁适用于短时间的争用情况,当锁的持有者很快就会释放锁时,自旋等待可以避免线程进入阻塞状态,从而减少线程上下文切换的开销。

2023-07-17 13:53:02 733

原创 redis启动以及使用

上述命令将"John"、"Alice"和"Bob"的分数存储在有序集合"scores"中,并按照分数从低到高进行排序。您可以从Redis官方网站(https://redis.io)下载适用于您操作系统的安装包,并按照官方提供的安装指南进行安装。4. 检查Redis是否正在运行:Redis启动后,您可以在终端窗口中看到一些输出信息,其中包括Redis的版本号、端口号和绑定地址等信息。5. 测试Redis连接:要确保Redis服务器正在运行并且可以正常连接,您可以在另一个终端窗口中打开Redis客户端。

2023-06-06 13:25:32 5539

原创 Nginx 附使用例子

配置反向代理和负载均衡:在Nginx配置文件中,您可以指定后端服务器的地址和端口,并使用相关的配置指令设置负载均衡算法(如轮询、IP哈希等)。通过将Nginx配置为反向代理服务器,所有的客户端请求都将首先发送到Nginx,然后由Nginx将请求转发到后端的服务器。- 安全性和可扩展性:Nginx支持SSL和TLS协议,可以实现加密通信,同时支持通过模块进行功能扩展,提供灵活的配置和扩展选项。- 反向代理:Nginx可以作为反向代理服务器,将客户端的请求转发到后端的多个服务器,以提供负载均衡和高可用性。

2023-06-06 13:21:52 442

原创 Elasticsearch(ES)

这只是一个基本的示例,实际应用中可能涉及更多的设置和参数,例如分页、排序、高亮显示匹配的部分等。2. 复杂查询:Elasticsearch提供了灵活且强大的查询语言,可以执行复杂的搜索操作,包括全文搜索、模糊搜索、精确匹配、范围查询和聚合分析等。当使用Elasticsearch搜索文章中特定字符时,可以通过创建一个包含文章内容的索引,并使用相关的查询来查找包含特定字符的文章。注意:上述示例是一个简单的查询,您可以根据具体需求使用更复杂的查询,例如使用布尔查询、设置搜索条件等来进一步筛选结果。

2023-06-05 22:53:44 1266

原创 别人的tx后台开发面经

综上所述,InnoDB索引的底层结构是基于B+树的多路平衡查找树,它提供了高效的索引存储和查询功能,支持主键索引、唯一索引、普通索引、辅助索引和聚簇索引。一旦接受到客户端的连接请求,服务器会创建一个新的Socket对象,与客户端建立连接,并进行数据的交互。1. 分段锁:ConcurrentHashMap内部采用了分段锁(Segment)的机制,将整个哈希表分成多个小的段(Segment),每个段维护自己的一部分桶(Bucket),不同的段可以被不同的线程同时访问,从而提高并发度。

2023-06-02 13:33:25 140

原创 AQS(AbstractQueuedSynchronizer)抽象队列同步机制

AQS 是并发包中很多同步类(如 ReentrantLock、CountDownLatch、Semaphore 等)的基础,它通过内部的等待队列和状态管理机制实现了线程的阻塞、唤醒和同步。AQS 内部维护了一个等待队列,用于存储等待获取同步状态的线程,队列中的线程按照先进先出的顺序进行阻塞和唤醒。在并发编程中,AQS 是一个重要的基础工具,它简化了同步器的实现,并提供了高效且线程安全的同步机制。6. `tryAcquire(int arg)`:尝试获取同步状态,成功返回 true,失败返回 false。

2023-06-01 21:11:47 433

原创 HashMap的扩容(扩容成红黑树之后再次扩容)

扩容操作会创建一个更大容量的HashMap,并将红黑树的节点重新分配到新的位置上,保持红黑树的结构不变。扩容操作会创建一个新的更大容量的数组,然后将原数组中的元素重新计算哈希值,分配到新数组的对应位置上。红黑树的目的是为了在长度较长的链表中提供更高效的操作,因此在发生扩容时,仍然会维持红黑树的结构。2. 扩容操作会创建一个更大容量的HashMap,并将原HashMap中的元素重新计算哈希值,分配到新HashMap的对应位置上。3. 在扩容的过程中,红黑树的结构会被保持不变,只是将节点重新分配到新的位置上。

2023-06-01 21:09:37 1315 1

原创 Spring中的循环依赖

具体来说,当Spring容器检测到循环依赖时,会先创建所有Bean的实例,但并不进行属性注入,而是将尚未注入属性的Bean标记为"early-stage"状态。当所有的Bean都创建完成后,Spring容器再回过头来解决循环依赖,将缓存中的Bean注入到相应的属性中。然而,如果循环依赖的Bean之间都使用了"单例"的作用域(默认情况下),那么这种方式无法解决循环依赖,会抛出`BeanCurrentlyInCreationException`异常。

2023-06-01 21:05:34 72

原创 负载均衡(加权随机法)

总体而言,这段代码使用带有权重的随机数生成算法从给定的服务器列表中按照权重随机选择一个服务器,实现了加权负载均衡的功能。中,并根据权重的数量重复添加。例如,如果某服务器的权重为2,则将其添加两次到。,其中key为服务器的IP地址,value为服务器的权重。方法来模拟负载均衡过程。打印出随机选择的服务器IP地址。方法是主要的负载均衡方法。在该方法中,首先创建了一个。中随机选择一个位置,然后返回对应的服务器IP地址。中的key(即服务器的IP地址)添加到。在静态代码块中,定义了一个。来存储服务器的信息。

2023-05-31 23:42:01 220

原创 一道面试线程coding题

【代码】一道面试线程coding题。

2023-05-30 17:30:31 81

原创 Java Web编写示例

以上示例展示了一个简单的Java Web应用的代码结构,包括控制层的UserController、服务层的UserService和数据访问层的UserDao,以及对应的实现类和实体类。通过注解实现依赖注入,实现了各个层次之间的协调和交互,完成了数据的展示和操作功能。Java Web应用程序的编写过程通常涉及多个层次,包括控制层(Controller)、服务层(Service)、数据访问层(DAO)和实体层(Entity)。下面我将详细描述每个层次的作用和编写过程。

2023-05-30 14:00:04 1676

原创 若依中用到了Springboot的什么方法

4. **数据访问(Data Access)**:若依框架使用Spring的数据访问技术,如Spring Data JPA或MyBatis,来简化数据库操作。1. **依赖注入(Dependency Injection)**:若依框架使用Spring的依赖注入机制来管理Bean之间的依赖关系,通过`@Autowired`注解进行自动装配。3. **事务管理(Transaction Management)**:若依框架使用Spring事务管理机制,通过`@Transactional`注解来管理数据库事务。

2023-05-25 10:25:37 508

原创 Https三个随机数

需要注意的是,缺少任意一个随机数都会影响握手过程,因为它们都是握手过程中必要的组成部分。综上所述,HTTPS握手过程中使用3个随机数的目的是为了确保通信的唯一性和安全性,保护数据的机密性和完整性。如果在HTTPS握手过程中缺少了任意一个随机数(Client Random、Server Random或Pre-Master Secret),将会对安全性和握手过程产生影响。此外,还有一个Pre-Master Secret(预主密钥)的随机数,它是由客户端生成,并通过公钥加密后发送给服务器。

2023-05-24 13:19:22 1884 1

原创 linux两种方法完成用户空间到内核空间的转移

2.中断: 中断是一种硬件或软件事件,它会打断正在执行的程序,将控制权转移到内核空间的中断处理程序(interrupt handler)。系统调用: 系统调用是用户空间程序与内核之间进行通信的一种机制。无论是系统调用还是中断,它们都提供了一种机制,使用户空间程序能够与内核进行交互和执行特权操作。在Linux中,有两种常见的方法可用于用户空间到内核空间的转移:系统调用(system call)和中断(interrupt)。函数是系统调用,它们使用户空间程序能够与内核进行文件操作。在上面的示例中,我们注册了。

2023-05-24 10:38:42 431

原创 Spring Boot的启动方法

4. 使用Spring Boot Maven插件或Gradle插件启动:Spring Boot提供了Maven插件和Gradle插件,使得启动应用程序更加方便。2. 使用Maven或Gradle命令行启动:如果你使用Maven或Gradle作为构建工具,可以使用命令行启动Spring Boot应用程序。然后,可以使用Java命令来运行应用程序,例如:`java -jar your-application.jar`。- 使用Maven插件:`mvn spring-boot:run`

2023-05-21 22:02:41 1395

原创 AOP的例子(日志

这样,即使在多个类和方法中都需要记录日志,我们也可以在不修改原始对象的情况下,通过将LoggingAspect切面应用到目标对象上来实现日志记录。通过使用AOP,我们创建了一个名为LoggingAspect的切面,并定义了一个切入点createUserOperation(),它匹配UserService接口的createUser()方法。在运行时,当调用UserServiceImpl的createUser()方法时,LoggingAspect切面会在方法执行之前和之后拦截并执行相关的逻辑,输出日志信息。

2023-05-19 20:37:27 168

原创 声明式事务管理带例子

在上述配置中,"com.example.*"表示需要进行事务管理的包路径,"transferMoney"和"updateAccount"表示需要进行事务管理的方法名,"propagation"和"isolation"是事务的传播行为和隔离级别。它与底层的数据源进行交互,确保事务的一致性和持久性。5. 事务通知:在目标方法执行前后,AOP拦截器会调用事务通知,根据配置的事务属性和事务管理器来控制事务的行为。- 简化事务管理:通过配置事务属性,可以灵活地定义事务的行为,而不需要手动控制事务的开始、提交或回滚。

2023-05-19 20:32:16 133

原创 spring JDBC API 中存在哪些类以及功能

1.JdbcTemplate: JdbcTemplate是Spring提供的最基本的JDBC模板类,它简化了JDBC的使用,封装了常见的JDBC操作,如查询、更新和批处理等。NamedParameterJdbcTemplate: NamedParameterJdbcTemplate是对JdbcTemplate的扩展,它支持使用命名参数代替传统的问号占位符进行参数绑定。具体选择哪个类取决于你的需求和Spring版本的使用。它简化了插入操作的构造和执行过程,不需要编写繁琐的SQL语句和参数绑定。

2023-05-19 20:20:54 312

原创 @RequestMapping 注解的示例

标记了一个方法,它会处理对 "/example/hello" 路径的 GET 请求。当用户访问 "/example/hello" 路径时,该方法将被调用,返回字符串 "hello"。注解的作用是将请求的 URL 映射到具体的处理方法上。通过使用不同的路径、HTTP 方法和其他参数,可以将不同的请求映射到不同的方法中,实现对请求的处理和响应。也就是说,该控制器中的所有方法都会映射到 "/example" 路径下。注解可以帮助开发者轻松管理和处理各种类型的请求,使代码结构清晰,并提供灵活的请求路由和处理逻辑。

2023-05-18 21:16:08 115

原创 构造器依赖注入和setter依赖注入的例子

无论是构造器依赖注入还是Setter依赖注入,它们都实现了依赖的解耦,使得类的使用方不需要关心具体的依赖对象如何创建和设置,而是通过注入的方式使用它们。构造器依赖注入和Setter依赖注入是两种常见的依赖注入(Dependency Injection)的方式,它们用于将依赖对象注入到一个类中,以解耦组件之间的依赖关系。2.Setter依赖注入: Setter依赖注入是通过类的Setter方法将依赖对象注入到类中的方式。在这种方式下,依赖对象通常通过Setter方法来设置。通过Setter方法注入的方式,

2023-05-16 17:33:14 222

原创 Spring的依赖注入

Spring的依赖注入(Dependency Injection,简称DI)是一种设计模式,用于解耦组件之间的依赖关系。它通过将依赖对象的创建和管理交给外部容器来实现,而不是由组件自己创建和管理依赖对象。依赖注入的主要思想是:组件不应该主动获取或创建它所依赖的对象,而是通过外部容器在运行时将依赖对象注入到组件中。这样,组件只需要关注自身的功能实现,而不需要关心如何获取依赖对象或依赖对象的创建和销毁。通过这些声明,Spring容器可以自动识别并创建所需的对象,并将依赖注入到。接口的实现对象作为依赖。

2023-05-16 17:17:16 77

原创 AOP和IOC

在Spring框架中,IOC是通过将对象的创建、组装和管理交由容器实现的,通过配置文件或注解来描述对象之间的依赖关系和容器的行为。提高系统的灵活性,通过容器来管理对象的创建和生命周期,可以在运行时动态地更改对象之间的依赖关系和配置信息,从而实现系统的灵活性和可配置性。提高系统的可测试性,通过将对象的创建和依赖关系交由容器管理,可以方便地进行单元测试和集成测试,从而提高系统的可测试性和可靠性。提高代码复用性和可维护性,将系统的业务逻辑和非业务逻辑分离开来,降低代码的耦合度,避免代码的重复编写和维护。

2023-05-11 16:58:22 1309 1

原创 响应码及分类

响应码(Response Code)是指在HTTP协议中,服务器向客户端返回的响应状态码,用来表示服务器处理请求的结果是否成功或出现了错误。响应码由三位数字组成,第一位数字定义了响应的类别,后两位数字没有分类的作用。根据不同的响应码,客户端可以做出相应的处理,比如重新发送请求、重定向、提示用户等等。304 Not Modified:缓存未更新,客户端的缓存资源是最新的,服务器告诉客户端可以使用本地缓存。502 Bad Gateway:错误的网关,作为代理或网关的服务器从上游服务器接收到的响应无效。

2023-05-11 16:48:45 4790

原创 java中分布式锁

(1)使用 SETNX 命令尝试给指定的键(即锁的名称)设置一个值,如果设置成功,则表示当前节点获得锁,可以执行业务逻辑。(4)如果当前节点不是最小的子节点,则监听前一个子节点(即序号小于当前节点的最大节点)的删除事件。(3)如果当前节点获得锁后,执行完业务逻辑,需要释放锁,则使用 DEL 命令删除指定的键即可。(6)如果当前节点获得锁后,执行完业务逻辑,需要释放锁,则删除自己创建的临时子节点即可。(3)获取父节点下所有子节点,如果当前节点是最小的子节点,则表示当前节点获得锁。

2023-05-11 13:53:41 345

原创 如何理解redis memorycache value值大小不同

而在 Memcached 中,value 值大小默认为 1MB,最大值可以配置到 128MB,这是因为 Memcached 的数据结构仅支持存储字符串类型数据。需要注意的是,当使用 Redis 或 Memcached 进行缓存时,应该合理设置 value 值的大小,以避免缓存空间浪费或者缓存效果不佳的情况。在 Redis 中,value 值大小可以达到 512MB,这是因为 Redis 的数据结构支持更多的数据类型,例如字符串、哈希、列表、集合、有序集合等。

2023-05-11 13:53:28 287

原创 一道面试mysql题目

需要注意的是,如果有多个学生平均成绩相同且都是最高分,则上述查询语句只返回其中一个学生的信息。如果需要查找所有平均成绩最高的学生,可以使用。需要注意的是,如果有多个学生平均成绩相同且都是最高分,则上述查询语句只返回其中一个学生的信息。如果需要查找所有平均成绩最高的学生,可以使用。函数来计算所有平均成绩的最大值,并返回该最大值所对应的学生 ID 和平均成绩。有这样一个表 存放这个学生id 三门成绩的id和学生成绩 共三列 想要查询三门成绩平均最高的学生该如何写mysql语句。子句来找到平均成绩最高的学生。

2023-05-11 13:52:08 116

原创 spring mvc运行流程和组件

浏览器发送请求 -> DispatcherServlet 接收请求 -> HandlerMapping 查找处理器 -> HandlerAdapter 调用处理器 -> Controller 处理请求并返回 ModelAndView 对象 -> ViewResolver 查找视图 -> View 渲染视图并返回响应 -> 浏览器接收响应并渲染页面。总之,Spring MVC 提供了一种非常灵活的、基于组件的方式来构建 Web 应用程序,开发人员可以根据自己的需要选择和配置适当的组件来实现所需的功能。

2023-05-11 13:45:35 154

原创 一级、二级缓存和脏数据

CPU 中的高速缓存是比内存更快的存储器,因此使用一级缓存可以加快程序的执行速度。一级缓存是针对 CPU 指令缓存的,而不是对数据的缓存。当 CPU 执行指令时,如果需要访问内存中的数据,会首先在一级缓存中查找,如果找到了数据,就会直接使用一级缓存中的数据,从而避免了访问内存的延迟。Java 中的二级缓存是指位于内存中的缓存。在使用二级缓存时,如果在更新数据之后没有及时将数据写回到数据库中,就会导致脏数据的出现。一级缓存指的是位于 CPU 内部的高速缓存,而二级缓存指的是位于内存中的缓存。

2023-05-11 13:36:52 645

原创 进程间、线程间的通信方式

当一个进程需要访问共享资源时,它会尝试获取信号量,如果信号量的值大于0,则进程可以访问共享资源,然后信号量的值减1;当一个线程需要访问共享资源时,它会尝试获取信号量,如果信号量的值大于0,则线程可以访问共享资源,然后信号量的值减1;信号(Signal):信号是一种异步的通信方式,进程之间可以通过发送信号来进行通信,例如,进程可以通过发送 SIGTERM 信号来请求另一个进程终止。线程是进程中的执行单位,同一进程中的多个线程共享进程的资源,但是线程之间需要通信以实现协作和协调。

2023-05-09 19:57:46 400

原创 http与https、https通信过程(公钥私钥)

HTTPS使用公钥加密和私钥解密的方式来保护数据的传输过程,确保通信的机密性和完整性。HTTP(Hypertext Transfer Protocol)和HTTPS(Hypertext Transfer Protocol Secure)是用于在客户端和服务器之间传输数据的两种不同的协议。此外,HTTPS还使用数字证书来验证服务器的身份,确保客户端与预期的服务器进行通信,防止中间人攻击。总结起来,HTTPS相对于HTTP提供了更高的安全性,通过加密和身份验证确保通信的机密性、完整性和真实性。

2023-05-04 11:28:55 346 1

原创 引用计数器无法解决循环引用的问题。原理是什么?如何解决?

总结起来,引用计数器无法解决循环引用的问题,因为循环引用导致对象的引用计数永远不会变为零。为了解决循环引用,需要使用可达性分析算法,通过判断对象是否与GC Roots可达来决定对象的存活状态,从而解决循环引用导致的问题。在Java中,垃圾回收器使用可达性分析算法,从一组称为"GC Roots"的根对象开始遍历,查找所有可达的对象,并将不可达的对象标记为垃圾,最后将其回收。在上述示例中,如果没有其他引用指向对象A和对象B,即使它们相互引用,它们也会被判定为不可达,从而可以被垃圾回收。

2023-05-04 11:10:28 1156

转载 线程池 参数 八股...

在线程池中,同一个线程可以从阻塞队列中不断获取新任务来执行,其核心原理在于线程池对 Thread 进行了封装,并不是每次执行任务都会调用 Thread.start() 来创建新线程,而是让每个线程去执行一个“循环任务”,在这个“循环任务”中不停的检查是否有任务需要被执行,如果有则直接执行,也就是调用任务中的 run 方法,将 run 方法当成一个普通的方法执行,通过这种方式将只使用固定的线程就将所有任务的 run 方法串联起来。当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理。

2023-05-04 11:10:27 151

原创 线程如何实现乐观锁

数据库的乐观锁需要自己实现,在表里面添加一个 version 字段,每次修改成功值加 1,这样每次修改的时候先对比一下,自己拥有的 version 和数据库现在的 version 是否一致,如果不一致就不修改,这样就实现了乐观锁。乐观锁的关键在于比较版本号,如果在执行更新操作之前发现版本号不一致,就意味着数据已被其他线程修改,需要根据具体情况进行相应的处理。悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个 数据就会阻止,直到这个锁被释放。

2023-05-04 11:10:14 161

原创 双亲委派的好处

双亲委派模型:如果一个类加载器收到了类加载的请求,它首先不会自己去加载这个类,而是把这个请求 委派给父类加载器去完成,每一层的类加载器都是如此,这样所有的加载请求都会被传送到顶层的启动类 加载器中,只有当父加载无法完成加载请求(它的搜索范围中没找到所需的类)时,子加载器才会尝试去加载类。总的来说,双亲委派模型通过避免重复加载、防止核心类库被篡改、隔离不同的类加载环境、支持类加载器的替换和扩展,以及保证类加载顺序和一致性,提供了类加载的安全性、可靠性和灵活性。然后,加载任务被委托给扩展类加载器。

2023-05-03 22:05:16 484

原创 Redis中的ZSet

ZSet(有序集合)是 Redis 数据库提供的一种数据结构,它是一种有序的字符串集合,每个成员都关联着一个浮点数类型的分值(score),用于进行成员之间的排序。ZSet 的特点是能够保持成员的插入顺序和根据分值范围或成员获取数据,同时还支持快速的插入、删除和更新操作。总之,ZSet 是 Redis 提供的一种有序集合数据结构,通过成员和分值的关联,实现了排序、范围查询和快速的插入、删除和更新操作。成员排序:ZSet 内部按照成员的分值进行排序,并且成员之间的排序是唯一的。排名是基于分值从小到大排序的。

2023-05-03 21:54:32 555

原创 B+树以及应用

B+树是一种常见的平衡树数据结构,用于在磁盘上存储和管理大量的有序数据。总的来说,B+树适用于需要高效的数据访问和范围查询的场景,尤其是在磁盘存储和数据库系统中。它能够有效地组织和管理大量的有序数据,并提供快速的插入、删除和查找操作,是一种重要的数据结构和索引技术。总的来说,B+树在磁盘存储和数据库系统中具有广泛的应用,它适合存储大量的有序数据,并提供高效的插入、删除和范围查询操作。在缓存中存储热门数据的B+树节点,可以帮助快速定位和访问最常用的数据块,提高缓存的命中率。

2023-05-03 21:53:36 633

原创 若依使用的框架和技术

高度集成的开发环境:若依框架集成了许多常用的开发工具和技术,如 Shiro 安全框架、Swagger API 文档、Quartz 定时任务等,提供了开箱即用的功能。它在项目开发中集成了多个框架和技术,提供了丰富的功能和可扩展性。总之,若依框架通过提供代码生成器、模块化设计和集成常用工具等特点,旨在提高开发效率、降低开发成本,并提供灵活的可定制性。快速开发:若依框架提供了丰富的代码生成器和开发模板,可以快速生成项目的基础代码和通用功能模块,极大地提高了开发效率。

2023-05-03 15:18:52 8838 1

原创 MyBatis的分页方式

基于插件的分页和分页插件可以简化分页逻辑的编写,提供更加便捷的分页操作。逻辑分页是一种在内存中对查询结果进行分页的技术,它适用于数据量较小的情况或者查询结果已经完全加载到内存中的情况。与基于数据库的分页不同,逻辑分页是在查询结果集上进行操作,而不是在数据库层面进行限制。根据实际情况和需求,选择适合的分页方式是很重要的。查询全部数据: 首先,执行一个不带分页限制的查询,将所有符合条件的数据加载到内存中。提取分页数据: 使用计算得到的开始索引和结束索引,从完整的查询结果集中提取分页所需的数据。

2023-05-03 15:04:28 269

空空如也

空空如也

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

TA关注的人

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