自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 在K8S集群中,如何正确选择工作节点资源大小?

那么,在集群中是使用少量大节点还是许多小节点?这取决于情况。反正,什么是小的,什么是大的?这取决于您在集群中部署的工作负载。例如,如果您的应用程序需要10GB内存,那么运行一个具有16GB内存的实例等于“运行一个较小的节点”。对于只需要64MB内存的应用程序来说,相同的实例可能被认为是“大的”,因为您可以容纳多个这样的实例。那么,对于具有不同资源需求的混合工作负载呢?在Kubernetes中,没有规定所有节点必须具有相同的大小。您完全可以在集群中使用不同大小的节点混合。

2023-08-27 02:24:46 771

原创 实战:Docker+Jenkins+Gitee构建CICD流水线

持续集成和持续交付一直是当下流行的开发运维方式,CICD省去了大量的运维时间,也能够提高开发者代码集成规范。开发者在开发完需求功能后可以直接提交到gitee,然后jenkins直接进行代码编译和一体化流水线部署。通过流水线部署可以极大的提高devops效率,也是企业信息自动化的一种体现。

2023-08-27 01:29:30 718

原创 实战:ELK环境部署并采集springboot项目日志

相信作为一个资深的搬砖人,在处理问题的时候免不了查看应用系统日志,且可以根据这个日志日志精准、快速的解决实际的问题。一般情况下我们的系统日志都放置在包的运行目录下面,非常不便于查看和分类。那么。今天我们就引入ELK的日志处理架构来解决它。

2023-08-26 21:13:23 426 2

原创 实战:Springboot集成Sentinel实现流量控制、熔断降级、负载保护

01前言前面的文章我们学习了Hystrix并和springboot项目进行了集成,实现服务的熔断降级、隔离措施。但是Hystrix对流量的控制不是很好,仅仅信号量也只能对指定的接口进行限流,至于保护机制Hystrix也只是达到指标进行熔断。那么,有没有一种中间件可以在兼容熔断降级的同时精准实现流量控制和负载保护呢?回答是当然有的,就是我们今天的主角Spring Cloud Alibaba Sentinel。02知识积累。

2023-08-26 21:05:03 217

原创 详解Spring自定义消息格式转换器及底层源码分析

在配置消息转换器时,指明了当前这个消息转换器能够接收的内容类型,也就是客户端请求时需要设定Content-Type为application/fm。AbstractMessageConverterMethodArgumentResolver的如下方法:​​​​​​​关于write的相关方法和read差不多,也就是判断能否write,然后调用对应的writeInternal方法。因为上一步已经得到了解析器。继续就会进入到read方法,真正读取处理消息内容的代码了。进行入选中的方法,这个方法最终会进入父类。

2023-08-26 20:54:49 290

原创 Redis从理论到实战:使用Redis实现商铺查询缓存(逐步分析缓存更新策略)

缓存就是数据交换的缓冲区,是存贮数据的临时地方,一般读写性能较高。我们可以在很多地方做缓存,比如浏览器缓存、应用层缓存、数据库缓存等等。

2023-08-26 20:45:19 33

原创 Redis从理论到实战:用Redis解决缓存穿透、缓存击穿问题(提供解决方案)

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。2、解决方案常见的解决方案有两种:互斥锁和逻辑过期。互斥锁:当线程1查询缓存未命中时,会获取一个互斥锁,然后查询数据库并重建缓存数据;在此期间,如果线程2查询缓存也未命中,并不会成功获取互斥锁(因为线程1正在使用),线程2会休眠并重试,直到线程1写入缓存释放锁;线程2缓存命中。

2023-08-26 20:29:04 55

原创 在懒加载场景中,如何判断一个元素在视口内?

静态资源缓存是其中的一种常见方式,它允许浏览器在首次加载资源后将其存储在本地,以便将来再次访问时可以直接从本地获取资源,而无需再次从服务器下载。在开发中,合理配置这些缓存机制可以显著提升网页加载速度,但也需要注意,如果不正确地配置缓存策略,可能会导致用户看到过期或错误的资源。因此,理解浏览器缓存的原理和不同的缓存机制,根据实际情况进行配置,是十分重要的。字段来实现,浏览器在下次请求时会将这些值发送到服务器,服务器判断资源是否发生变化,返回 304 Not Modified 或新的资源。

2023-08-26 20:25:39 84

原创 在虚拟机中centos的安装步骤说明!

1. 下载 CentOS ISO 镜像:访问 CentOS 官方网站(https://www.centos.org/)并下载适合你的计算机架构的最新版本的 CentOS ISO 镜像文件。6. 安装位置:选择你要安装 CentOS 的磁盘分区。13. 登录系统:在重启后,你可以使用之前设置的 root 用户名和密码登录到 CentOS 操作系统。3. 安装 CentOS:将之前下载的 CentOS ISO 镜像文件挂载到虚拟机上,并启动虚拟机。5. 选择安装语言:选择你希望在 CentOS 中使用的语言。

2023-08-26 20:15:22 138

原创 web安全,系统网络安全,安全漏洞扫描等安全技术的详细说明以及分类?

漏洞扫描器(Vulnerability Scanner):自动化工具,对系统和应用程序进行扫描,检测已知的漏洞和安全配置问题。- 网络扫描器(Network Scanner):扫描网络上的主机和服务,识别开放的端口和服务版本,评估潜在的风险。- 输入验证和数据过滤:确保用户输入的数据被正确地验证和过滤,以防止恶意代码注入和跨站脚本(XSS)攻击等漏洞。- 安全配置和管理:确保Web服务器、数据库和其他相关组件的安全配置,及时修补漏洞和更新软件。- 数据备份和恢复:定期备份关键数据,并确保可以及时恢复。

2023-08-26 20:13:27 170

原创 电脑维修常遇到等等相关问题及解决方法?

这些只是一些常见的电脑维修问题及解决方法,具体的问题和解决方案可能因情况而异。如果遇到复杂的问题,建议寻求专业的计算机维修人员的帮助。- 对于显示器或键盘鼠标问题,检查连接线是否插好,尝试更换设备。- 检查电脑是否有硬件故障,如电源供应问题、内存故障等。- 对于内存问题,可以重新插拔内存条或更换故障的内存条。- 检查网线是否正确连接,或尝试使用其他网线进行连接。- 检查路由器或网络交换机的设置,确保网络配置正确。- 检查电脑内部的电源线和数据线是否连接牢固。- 检查电脑是否有过热问题,清理散热器和风扇。

2023-08-26 20:08:28 34

原创 java中运行时异常与编译时异常?

与编译时异常不同,运行时异常通常是由开发者的错误、逻辑问题或运行环境的异常造成的,例如数组越界、空指针引用等。无论是编译时异常还是运行时异常,都属于Java中的异常体系,通过正确处理异常可以提高代码的稳定性和可靠性。编译时异常是指在Java代码中可能出现的异常情况,编译器在编译代码时强制要求对这些异常进行处理或声明抛出。在Java中,异常分为两种类型:运行时异常(Runtime Exceptions)和编译时异常(Checked Exceptions)。- 如果不处理这些异常,程序会抛出异常并终止运行。

2023-08-26 20:05:21 413

原创 sql语言之子查询语句

子查询是指在一个SQL查询语句中嵌套另一个完整的查询语句,以获取更精确或相关的数据。在编写子查询时,建议参考数据库系统的文档和使用指南,以确保正确和高效地使用子查询。需要注意的是,使用子查询时应考虑查询的性能和效率。上述示例中,子查询嵌套在WHERE子句中,用于在table1中选取满足条件的数据,其中条件是检查table2的某一列。上述示例中,子查询被嵌套在FROM子句中,作为一个临时表(或视图)使用,供外层查询使用。上述示例中,子查询嵌套在HAVING子句中,用于与外层查询的聚合函数结果进行比较。

2023-08-24 22:03:23 2194

原创 数据库的数据迁移与备份?

请注意,上述只是一些常见的方法和最佳实践,具体的数据迁移和备份过程可能因数据库类型、规模和业务需求而有所不同。3. 自动化备份任务:使用数据库管理工具或专门的备份工具,设置自动化备份任务,按照事先规定的策略进行备份操作。5. 验证和测试:验证目标数据库中的数据与源数据库中的数据是否匹配,并进行必要的测试和验证,确保迁移成功。4. 导入数据到目标数据库:使用目标数据库的工具或命令行界面,将中间文件中的数据导入到目标数据库中。- 数据库迁移和备份过程中,应确保源数据库和目标数据库之间的版本兼容性和架构一致性。

2023-08-24 22:01:50 217

原创 spring boot的项目启动方式有几种及详解?

1. 使用 IDE 运行:在集成开发环境(IDE)中,可以直接运行 Spring Boot 项目的主类(通常带有 `public static void main` 方法)。2. 使用 Maven 或 Gradle 插件运行:Spring Boot 提供了 Maven 和 Gradle 插件,可以直接使用这些插件来启动应用程序。3. 打包为可执行的 JAR/WAR 文件并运行:Spring Boot 可以将应用程序打包为可执行的 JAR(或可部署的 WAR)文件,并通过 Java 命令来运行。

2023-08-24 22:00:51 803

原创 spring boot中提供了一些监听方法,现在我需要在系统启动前完成一些操作。用什么方法实现或者注解?

2. `CommandLineRunner`:如果你想在 Spring Boot 应用程序启动时执行一些操作,可以实现 `CommandLineRunner` 接口。你可以使用 `@Order` 注解或实现 `Ordered` 接口来指定执行顺序。在实现 `ApplicationRunner` 或 `CommandLineRunner` 接口的类上添加 `@Component` 注解,将其声明为 Spring Bean,并在应用程序启动时自动装配和执行。// 在应用程序启动时执行需要的操作。

2023-08-24 21:57:33 51

原创 springboot的启动流程

2. 创建ApplicationContext:`SpringApplication` 会根据主配置类创建一个 `ApplicationContext` 对象,该对象是 Spring 的核心容器,负责管理和组织应用程序中的各个组件。1. 加载主配置类:Spring Boot 使用 `main` 方法作为应用程序的入口,在该方法中,会创建一个 `SpringApplication` 对象,并指定主配置类。3. 执行自动配置:Spring Boot 会根据类路径上的依赖和配置,自动配置应用程序中的各个组件。

2023-08-24 21:56:31 129

原创 springboot的自动配置原理

3. Spring Boot 配置属性:Spring Boot 使用一套命名约定的配置属性来控制自动配置的行为。总的来说,Spring Boot 的自动配置是通过条件化装配、Starter 模块、配置属性和自动装配类等机制实现的。可以通过实现自定义的配置类、条件注解和配置属性等方式,来覆盖或扩展自动配置的行为。Spring Boot 的自动配置是其核心特性之一,它通过约定大于配置的原则,根据项目的依赖和配置来自动化配置应用程序的各个组件。

2023-08-24 21:55:36 135

原创 在虚拟机中centos的安装步骤

1. 下载 CentOS ISO 镜像:访问 CentOS 官方网站(https://www.centos.org/)并下载适合你的计算机架构的最新版本的 CentOS ISO 镜像文件。6. 安装位置:选择你要安装 CentOS 的磁盘分区。13. 登录系统:在重启后,你可以使用之前设置的 root 用户名和密码登录到 CentOS 操作系统。3. 安装 CentOS:将之前下载的 CentOS ISO 镜像文件挂载到虚拟机上,并启动虚拟机。5. 选择安装语言:选择你希望在 CentOS 中使用的语言。

2023-08-24 21:54:19 344

原创 Oracle与MySQL的主键自增方式

Oracle使用序列(Sequence)来生成唯一的自增值,并通过触发器(Trigger)将生成的序列值插入到主键字段中。总结而言,MySQL使用AUTO_INCREMENT属性来实现主键自增,而Oracle使用序列和触发器的组合来实现主键自增。这样,每当插入一条新记录时,Oracle会自动调用序列获取下一个值,并将其插入到id字段中。然后,在创建表时,使用序列生成主键的默认值,并通过触发器将序列值插入到主键字段中。Oracle和MySQL都支持使用主键自增方式,但它们在实现上有一些不同。

2023-08-24 21:52:40 147

原创 sql注入相关问题及解决方式?

SQL注入是一种常见的网络安全漏洞,它利用了未正确过滤或转义用户数据的漏洞,攻击者可以通过恶意构造的输入,将SQL命令注入到应用程序的数据库查询中,从而执行未经授权的操作。在开发和部署应用程序时,加强对SQL注入漏洞的意识并采取相应的防护措施是至关重要的,以保护应用程序和用户数据的安全。1. 数据泄露:攻击者可以通过注入恶意的SQL语句来查询、修改或删除数据库中的数据,导致敏感信息泄露。2. 数据篡改:攻击者可以通过注入恶意的SQL语句来修改数据库中的数据,破坏数据的完整性。

2023-08-24 21:51:15 238

原创 重启网络服务的命令?

重启网络适配器:`netsh interface set interface "适配器名称" admin=disable && netsh interface set interface "适配器名称" admin=enable`- 重启网络连接:`netsh interface set "连接名称" admin=disable && netsh interface set "连接名称" admin=enable`请注意,在执行这些命令之前,请确保你具有管理员权限,并谨慎操作以避免不必要的问题。

2023-08-24 21:50:19 2604

原创 两层楼的公司如何开始搭建网络的步骤详解?

需要注意的是,搭建网络是一个复杂的过程,建议寻求专业的网络工程师或IT服务提供商的帮助。他们可以根据公司的具体需求和情况提供更详细的指导和支持,确保网络的稳定性和安全性。- 了解公司的网络需求,包括用户数量、设备数、数据传输量等。- 配置网络设备,包括设置IP地址、VLAN、路由等。- 确定网络的覆盖范围,包括楼层、办公室、会议室等。- 确定每个楼层的网络设备位置,如交换机、路由器等。- 连接网络设备,确保设备之间的通信正常。- 安装网络设备,包括交换机、路由器等。- 调试网络配置,解决可能出现的问题。

2023-08-23 03:31:23 162

原创 电脑硬件出现故障如何去修理?

自行更换硬件部件:如果你有相关的经验和技能,并且有相应的工具和部件,可以尝试自行更换硬件设备。- 委托给专业维修服务:如果你没有必要的技能或对修理不太自信,你可以将电脑交给专业的维修服务中心,由他们来诊断和修理。请注意,如果你没有合适的技能和经验,且在保修期外,强烈建议寻求专业的帮助或咨询。- 如果电脑还在保修期内,可以联系制造商或售后服务提供商,咨询修理或更换部件的政策和流程。- 尝试重新启动电脑,有时一次简单的重启可以解决问题。- 定期维护和清洁硬件设备,避免灰尘和过热问题。

2023-08-23 03:30:19 157

原创 电脑的硬件组成部分以及它们的维护方法?

电脑的硬件组成部分主要包括以下几个方面:中央处理器(CPU)、内存(RAM)、硬盘(HDD、SSD)、显卡(GPU)、主板、电源、显示器、键盘、鼠标等。- 避免静电:在操作主板之前,确保自己的身体带有静电电荷,使用防静电手带或接地装置。- 定期清洁:使用压缩空气或细软刷子清除进风口和散热片上的灰尘,保持散热效果良好。- 不过度使用:避免长时间高强度运行,给CPU提供适当的休息时间,防止过热和损坏。- 整理文件:定期清理无用的文件和程序,整理硬盘空间,以提高性能。

2023-08-23 03:29:14 64

原创 it网络构建及设备系统配置以及IT安全策略实施如何实现?

另外,强大的IT团队或专业的IT服务提供商通常能够提供更详细的指导和支持,帮助组织实现安全的网络构建、设备系统配置和IT安全策略的实施。IT网络构建、设备系统配置和IT安全策略的实施是一个综合性的过程,需要考虑多个方面和步骤。- 防火墙和入侵检测系统:配置防火墙和入侵检测系统,限制未经授权的访问和监测潜在的攻击。- 操作系统安装和配置:在选定的硬件上安装和配置操作系统,包括网络设置、服务配置等。- 数据备份和恢复策略:制定合适的数据备份和恢复策略,确保数据的安全性和可靠性。

2023-08-23 03:27:57 123

原创 MySQL的临时表以及视图与存储过程、触发器等功能概念详细解释说明以及它们的使用方法举例?

它们都是功能强大的数据库工具,具体的使用和应用方式会受到具体需求和数据库设计的影响。- 使用方法:可以使用`CREATE TEMPORARY TABLE`语句创建临时表。临时表的使用方式与普通表类似,可以进行数据插入、更新、查询等操作。MySQL的临时表、视图、存储过程和触发器是常用的数据库功能,它们可以帮助我们更有效地管理和操作数据库。- 概念:视图是从数据库中的一个或多个表导出的虚拟表。- 概念:触发器是与数据库表相关联的一段代码,它在表上的特定操作(如插入、更新、删除)发生时自动执行。

2023-08-23 03:26:49 199

原创 防火墙以及路由器和交换机的安装,调试以及维护工作的详细说明方法?

具体的操作步骤可能因设备型号和供应商而有所不同,建议您参考相关设备的官方文档和指南,同时建议在部署和配置网络设备时,遵循网络安全最佳实践,并定期进行安全审查和更新。5. SNMP和日志设置:配置Simple Network Management Protocol(SNMP)和日志功能,以便监测和分析路由器的性能和状态。6. 监控和故障排除:使用交换机提供的命令和工具监控端口状态、流量和性能,诊断和解决故障。5. 定期审计:定期审查防火墙规则和配置,识别和纠正潜在的安全漏洞和配置错误。

2023-08-23 03:25:34 896

原创 nginx原理和部署方式详解?

2. 配置:Nginx的主要配置文件是`nginx.conf`。4. 静态文件服务:默认情况下,Nginx会将静态文件放在`/var/www/html/`目录下,您可以将需要提供的文件放在该目录下,并通过访问服务器IP或域名访问这些静态文件。请注意,以上仅为Nginx的基本部署方式的说明,Nginx还有更多的高级功能和配置选项,您可以参考官方文档或其他资源深入学习和使用Nginx。3. 静态文件服务:Nginx能够高效地提供静态文件的服务,可以缓存文件并直接返回给客户端,降低了对后端应用服务器的压力。

2023-08-23 03:24:03 43

原创 k8s是什么以及它的原理和如何去使用它?

7. 监控和日志:使用 Kubernetes 提供的监控和日志技术,例如 Prometheus 和 Elasticsearch,来收集和分析应用程序的性能数据和日志信息。6. 服务发现和负载均衡:Kubernetes 提供了内置的服务发现和负载均衡机制,可以方便地管理应用程序的访问。5. 控制器:Kubernetes 通过控制器来确保系统的状态符合预期,自动进行容器的自愈、伸缩和扩展。3. Worker节点:集群中的工作节点,用于运行应用程序的容器。

2023-08-23 03:23:14 99

原创 软连接和硬连接的区别详解?

与硬连接不同,软连接并不直接指向文件的物理数据块,而是指向文件的路径。总结来说,硬连接是多个文件名指向同一个文件的不同入口,而软连接是一个指向文件或目录路径的快捷方式。硬连接只能链接到同一个文件系统中的文件,而软连接可以链接到不同文件系统中的文件。2. 删除原始文件对硬连接没有影响,因为硬连接实际上是指向文件数据块的入口。3. 硬连接可以通过多个文件名访问同一个文件,而软连接只能通过软连接的路径访问原始文件。1. 硬连接只能链接到同一个文件系统中的文件,而软连接可以链接到不同文件系统中的文件。

2023-08-23 03:21:13 1587

原创 计算机之服务器的分类?

常见的应用服务器包括Java应用服务器如Tomcat和Jboss、微软的.NET应用服务器、Node.js服务器等。此外,还有一些特定功能的服务器,如视频流媒体服务器、FTP服务器、代理服务器等,根据不同的需求和应用场景选择适合的服务器类型是很重要的。服务器的硬件配置和性能也需要根据实际需求来确定。1. Web服务器:用于提供网页和网站服务,常见的Web服务器软件包括Apache、Nginx和Microsoft IIS等。6. 游戏服务器:用于提供在线游戏的服务器,支持玩家之间的相互交互和游戏数据的处理。

2023-08-23 03:18:40 309

原创 Linux运维工程师的注意事项?

2.第二个例子是关于文件同步的,大家都知道rsync同步很快,可它删除文件的速度大大超过 rm -rf,在rsync中有一个命令是,以某目录为准同步某文件(如果第一个目录是空的,结果可想而知)源目录(有数据的)就会被删除,当初我就是因为误操作,以及缺乏测试,就目录写反了,关键是没有备份数据...生产环境数据被删了-----备份的重要性。13.系统运行监控---->大公司一般有专业24小时监控运维.系统运行监控一般包括硬件占用率,常见的有,内存,硬盘,CPU,网卡,OS包括登录监控,系统关键文件监控。

2023-07-08 17:59:09 81

原创 微服务注册中心如何选型?这几个维度告诉你!

微服务的注册中心目前主流的有以下四种:ZookeeperEurekaConsulKubernetes那么实际开发中到底如何选择呢?这是一个值得深入研究的事情,别着急,今天陈某就带大家深入了解一下这四类注册中心以及如何选型的问题。这几款开源产品都已经考虑如何搭建高可用集群,这个地方有些差别而已;

2023-07-06 18:42:38 46

原创 如何防止支付掉单?

这篇文章介绍了一个让用户炸毛,让客服恼火,让开发挠头的问题——掉单,包括为什么会掉单,怎么防止掉单。其中内部掉单,发生的概率相对较少,掉单最主要的原因还是所谓的外部掉单。外部掉单解决的关键点是主动查询定时任务查询和延时消息查询,前者简单一些,后者功能上更加出色。[1]. 支付掉单异常最全解决方案[2]. 解决支付掉单问题。

2023-07-06 18:40:22 56

原创 5种常用加密算法!

大家平时的工作中,可能也在很多地方用到了加密、解密,比如:用户的密码不能明文存储,要存储加密后的密文用户的银行卡号、身份证号之类的敏感数据,需要加密传输还有一些重要接口,比如支付,客户端要对请求生成一个签名,服务端要对签名进行验证……非常安全那么上面提到的这些能力,我们都可以利用哪些加密算法来实现呢?咱们接着往下看。这一期就给大家简单盘点了一下最常用的5种加密算法。其实,论到加密解密算法的应用,有一个东西,可以说是应用到了极致,它是什么呢?——HTTPShttps工作流程详图。

2023-06-30 04:28:41 100

原创 一个注解,搞定 SpringBoot 操作日志

此组件解决的问题是:「谁」在「什么时间」对「什么」做了「什么事」本组件目前针对 Spring-boot 做了 Autoconfig,如果是 SpringMVC,也可自己在 xml 初始化 bean基本使用。

2023-06-29 17:33:20 216

原创 Spring Boot 实现定时任务动态管理,太爽了!

一、功能说明SpringBoot的定时任务的加强工具,实现对SpringBoot原生的定时任务进行动态管理,完全兼容原生@Scheduled注解,无需对原本的定时任务进行修改。

2023-06-29 17:29:46 298

原创 SpringBoot 中的多线程事务处理太繁琐?一个自定义注解直接搞定!

我们开发的时候常常会遇到多线程事务的问题。以为添加了注解就行了,其实你加了注解之后会发现事务失效。原因:数据库连接spring是放在threadLocal里面,多线程场景下,拿到的数据库连接是不一样的,即是属于不同事务。本文是基于springboot的@Async注解开启多线程,,并通过自定义注解和AOP实现的多线程事务,避免繁琐的手动提交/回滚事务 (CV即用、参数齐全、无需配置)本文是使用了两个注解共同作用实现的,主线程当做协调者,各子线程作为参与者/**

2023-06-29 17:23:55 416 1

原创 和外部系统如何对接?Spring Boot 项目调用外部接口的 3 种方式

SpringBoot不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。

2023-06-29 17:20:24 815

空空如也

空空如也

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

TA关注的人

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