自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux零基础入门

Linux系统采用树形目录结构,所有内容以文件形式管理。文件类型包括普通文件(-)、目录(d)、链接(l)、设备文件(b/c)、管道(p)和套接字(s)。系统目录结构包含/bin(基础命令)、/etc(配置文件)、/home(用户目录)等关键路径。常用命令包括:mkdir创建目录,ls查看内容,cd切换目录,pwd显示路径,du/df查看空间使用。文件操作命令有touch创建文件,rm删除,mv移动/重命名,cp复制文件。这些基础命令和概念是Linux系统管理的入门必备知识。

2026-01-03 21:14:03 703

原创 初识Kafuka

Kafka是一个由Linkedin开发的分布式消息流平台,具有高吞吐、低延迟、高伸缩性等特点。它采用发布订阅模式,支持多分区、多副本,基于Zookeeper实现集群管理。Kafka的核心概念包括消息、主题、分区、生产者和消费者等。其系统架构包含Producer、Broker集群、Consumer Group和Zookeeper集群四个主要组件。Kafka通过顺序读写、零拷贝、消息压缩和分批发送等技术实现高性能。它广泛应用于活动跟踪、消息传递、日志记录、流式处理等场景,支持点对点和发布订阅两种消息队列模式。安

2026-01-03 20:50:58 874

原创 如何使用SpringAI编写自己的Manus

本文介绍了如何使用SpringAI构建智能体(AI Agent),涵盖核心概念与关键技术。智能体是以大模型为核心,具备记忆、知识库和工具调用能力的自主系统,能感知环境、规划任务并执行多步推理。文章详细解析了智能体的三大关键技术:CoT思维链(分步推理)、Agent Loop(自主执行循环)和ReAct模式(推理-行动-观察循环)。此外,还阐述了实现智能体所需的支持系统,包括大模型、记忆系统、知识库和工具调用。最后介绍了SpringAI框架的特性,该框架通过统一API简化了AI功能集成,支持主流模型供应商和向

2026-01-01 21:36:27 885

原创 商务数据分析与可视化

本文介绍了商务数据分析与可视化的核心概念和方法。主要内容包括:1) 格式塔视觉原理及其六大原则(相似、临近、连续、闭合、图形背景、连接);2) 数据分析基础概念,如混淆矩阵评价指标(准确度、精确度、召回率、F1值)、方差与偏差分析;3) Gartner分析价值模型和数据分析流程;4) 关联规则分析中的支持度、置信度、提升度计算方法;5) 回归分析类型及评价指标(判定系数、均方误差)。文章系统梳理了从数据可视化原理到各类分析方法的理论基础和应用要点。

2025-11-22 19:15:19 841

原创 幂等性:锦上添花VS生死存亡

本文探讨了分布式系统中接口幂等性的重要性及其实现策略。幂等性可防止重复操作导致的数据混乱和资损,是构建可靠系统的关键。文章分析了7种实现方法:1)悲观锁通过数据库锁机制确保强一致性;2)乐观锁利用版本号实现高并发更新;3)唯一索引防止数据重复插入;4)Token机制验证请求唯一性;5)状态机约束业务逻辑;6)分布式锁协调跨服务操作;7)消息队列去重保证消息处理唯一性。每种方法均结合实际用例说明其适用场景和优缺点,为架构师提供全面的技术选型参考。

2025-11-20 20:45:57 607

原创 Redis常见面试题

本文详解Redis常见面试题,包括缓存穿透、击穿、雪崩等问题及解决方案。缓存穿透指查询不存在数据导致频繁访问数据库,可通过缓存空数据或布隆过滤器解决。布隆过滤器通过哈希映射拦截无效请求,保护数据库。缓存击穿指热点key过期时大量请求压垮数据库,可使用互斥锁或逻辑过期方案。互斥锁确保只有一个请求访问数据库,其他请求等待缓存更新;逻辑过期则通过标记时间戳和异步重建缓存,避免数据库并发冲击。

2025-11-07 23:12:17 1001

原创 Rabbitmq基础篇

本文介绍了RabbitMQ的基础知识及其应用场景。主要内容包括:消息队列的同步与异步通信方式对比,RabbitMQ在异步调用、系统解耦和流量削峰三大核心作用,以及常见消息队列技术选型对比。文章详细说明了RabbitMQ在Ubuntu24.x系统上的安装配置步骤,包括Erlang环境安装、RabbitMQ服务部署、Web管理插件启用及用户权限设置。最后通过SpringBoot3.5x示例代码,展示了RabbitMQ的基本使用方式,包括队列声明、交换机配置及消息绑定关系建立。全文为初学者提供了RabbitMQ从

2025-11-01 15:58:42 867

原创 向量数据库与RAG

本文介绍了Agent开发中的向量技术及其应用。向量作为语义表示方法,可将非结构化数据转换为高维数值向量,实现语义相似性计算。向量数据库专门存储和管理向量嵌入,支持高效相似性搜索、海量数据处理和实时交互。重点讲解了PostgreSQL+PGVector方案,PostgreSQL作为功能强大的开源数据库,配合PGVector扩展可实现向量存储和查询。PGVector提供向量数据类型、多种相似性度量、HNSW和IVFFlat索引等功能,与PostgreSQL特性无缝集成。该方案为Agent开发提供了高效的向量存储

2025-10-19 22:47:04 436

原创 耄大厨——AI厨师智能体(3-工具调用)

摘要 本文介绍了在Spring AI框架中实现工具调用的方法,以增强AI应用的能力。主要内容包括:工具调用的概念与原理(AI通过外部工具完成特定任务),Spring AI中基于Methods模式定义工具的简便方式,以及如何将工具绑定到ChatClient进行调用。文章还给出了文件操作工具的开发实例,包括读取和写入文件功能,并约定将文件存储在隔离的/tmp目录中。通过工具调用,AI不再局限于对话,可以执行联网搜索、终端操作等任务,成为真正的智能体。

2025-10-12 15:15:48 1087

原创 耄大厨——AI厨师智能体(2-RAG知识库)

RAG(检索增强生成)技术通过结合信息检索与大语言模型生成能力,有效提升AI回答的准确性和时效性。其核心流程包括:1)文档收集与切割预处理;2)文本向量转换与存储;3)基于相似度的检索过滤;4)检索结果与用户查询的智能融合生成。SpringAI框架为RAG实现提供完整支持,开发者可通过ETL流程(文档读取、转换、存储)快速构建本地知识库应用,如示例中的智能厨师问答系统。该技术既解决大模型的幻觉问题,又能保持知识实时更新,是当前AI应用开发的重要方向。

2025-10-11 22:36:59 1217 4

原创 跨平台向量库:Linux & Windows 上一条龙部署 PostgreSQL 向量扩展

跨平台PostgreSQL向量存储实战指南 本文详细介绍如何在Linux/Windows系统部署PostgreSQL并集成pgvector扩展,实现高效向量存储与检索。通过Ubuntu 24.04和Windows 11双平台实测,提供完整安装流程:从PostgreSQL基础配置、远程连接设置,到pgvector扩展的编译安装。特别针对Windows平台需要Visual Studio编译的痛点给出解决方案,最终实现通过SQL直接操作高维向量数据,为推荐系统、语义搜索等AI应用提供基础设施支持。文中包含详细命令

2025-10-11 18:48:38 673

原创 耄大厨——AI厨师智能体(1-AI模型接入)

本文介绍了如何将AI模型接入Spring Boot项目。首先推荐使用JDK21,整合了Hutool工具库和Knife4j接口文档工具。然后通过引入SpringAI依赖,配置阿里大模型API密钥,实现AI功能集成。重点展示了AI多轮对话的实现,包括初始化ChatClient对象、设置系统提示词、基于内存的对话记忆管理,以及对话方法的编写。最后提供了单元测试示例,验证多轮对话功能。该项目为开发AI应用提供了完整的技术方案。

2025-10-07 14:02:14 1160

原创 设计模式详解——创建型

设计模式摘要:创建型模式 创建型设计模式包含5种核心模式,重点介绍单例、工厂和抽象工厂模式。单例模式确保全局唯一实例,通过私有构造、静态变量和访问点实现,分为饿汉式(类加载时创建)和懒汉式(首次调用创建)。工厂方法模式将对象创建延迟到子类,通过抽象工厂接口实现解耦和扩展性。抽象工厂模式则提供创建相关产品族的接口,适用于多平台UI、数据库适配等场景。这些模式共同解决了对象创建过程中的资源管理、解耦和灵活性等问题,是构建可维护系统的关键设计方法。

2025-09-15 19:13:23 758

原创 用户中心项目实战(springboot+vue快速开发管理系统)

本文介绍了企业级管理系统开发的全流程与技术选型方案。项目采用前后端分离架构,前端使用Vue+Ant Design Pro组件库,后端基于SpringBoot+MyBatis-Plus技术栈搭建。详细展示了从需求分析(用户管理功能)、技术选型到后端初始化的完整过程,包括SpringBoot项目创建、数据库设计(MySQL表结构)、MyBatis-Plus和Knife4j接口文档集成等关键步骤。文档提供了详细的配置代码和截图说明,涵盖数据库连接配置、依赖管理、接口文档生成等企业开发必备环节,帮助开发者快速掌握管

2025-07-19 13:50:50 1229

原创 什么是RAG?RAG的主要流程是什么?(下)

接上回,本文将继续介绍Rag的有关知识,什么自查询?为什么在RAG中需要自查询?如何进行RAG调优后的效果评估?请给出真实应用场景中采用的效果评估标准与方法自查询:通过“解析 + 过滤”实现精确条件检索(如限定时间、作者)。示例:用户查询“2025年鸭鸭的用户报告” → 拆解为语义关键词(用户报告)+ 元数据(作者=鸭鸭,时间=2025)→ 结构化查询。查询扩展:通过“生成 + 合并”提升语义覆盖(如同义词扩展)。示例。

2025-07-17 15:56:52 1131

原创 如何用git提交代码进行协作开发

代码提交规范指南 在企业协作开发中,规范的代码提交流程至关重要。本文介绍了完整的Git操作规范: 分支命名:严格区分功能分支(feature/xxx)、修复分支(bugfix/xxx)和发布分支(release/xxx),禁止直接提交到master分支。 Commit规范:每个commit保持单一功能修改,采用"类型:描述"格式(如feat:支持新功能),确保信息清晰准确。 PR/MR流程:创建合并请求时,标题简明扼要,复杂修改需补充说明,经团队审核后合并,并及时同步主分支代码。 这些规

2025-07-16 22:34:27 753

原创 什么是RAG?RAG的主要流程是什么?(上)

RAG(检索增强生成)是一种结合信息检索与生成模型的技术,通过外部知识库增强AI回答的准确性。其核心流程包括:1)检索阶段,利用向量化技术从知识库中匹配相关内容;2)生成阶段,将检索结果作为上下文输入大模型生成最终回答。为提高检索质量,RAG引入Rerank(重排序)环节,对初步检索结果进行精排。数据预处理是优化RAG的关键,需进行多源数据整合、清洗降噪、文本分块和元数据标注等操作,确保检索内容精准有效。该技术解决了传统生成模型知识滞后和内部文档处理的问题,无需重新训练模型即可动态更新知识库。

2025-07-14 18:15:54 877

原创 详解HashMap

摘要: HashMap是基于哈希表的键值对存储结构,采用数组+链表/红黑树解决哈希冲突。JDK1.8引入红黑树优化,当链表长度≥8时转为红黑树(查找效率O(logn)),节点数≤6时退化回链表。关键优化包括:改进哈希函数(高位扰动)、尾插法避免多线程环状链表、扩容时元素迁移策略优化。性能优化建议:合理设置初始容量(减少扩容)、调整负载因子(默认0.75)、确保键的hashCode()分布均匀。线程安全场景推荐ConcurrentHashMap,需有序访问时可选用LinkedHashMap或TreeMap。注

2025-07-13 14:51:34 764

原创 TCP协议的三次握手与四次挥手分别指什么?

TCP协议的三次握手与四次挥手是建立和终止可靠连接的关键机制。三次握手(SYN→SYN-ACK→ACK)用于同步序列号并防止历史错误连接。四次挥手(FIN→ACK→FIN→ACK)确保双方安全关闭连接,其中ACK和FIN可能合并为三次挥手。这些机制保障了TCP传输的可靠性和数据完整性。

2025-07-12 17:02:35 588

原创 SpringBoot常用注解

以上便是SpringBoot中一些常用的注解,它们能极大地简化开发流程。

2025-07-02 22:04:56 854

原创 SpringBoot控制反转

控制反转(IoC)是Spring Boot的核心特性,通过依赖注入(DI)实现对象解耦。传统开发中对象自行管理依赖,导致代码耦合度高;IoC将对象创建和依赖管理交给Spring容器,通过构造器注入(推荐)、Setter注入或字段注入实现。IoC容器(ApplicationContext)管理Bean的生命周期,提供自动装配、统一配置等优势,显著提升代码可维护性和可测试性。关键注解包括@Component、@Autowired等。IoC是Spring生态的基础,支持自动配置、AOP等核心功能。

2025-07-02 21:58:47 1095

原创 springboot切面编程

SpringBoot的AOP(面向切面编程)是一种将横切关注点(如日志、权限等)与核心业务逻辑分离的技术。文章首先解释了AOP的核心概念,包括切面、连接点、通知等,然后通过一个权限校验的代码示例展示其实际应用。示例中自定义了@AuthCheck注解和AuthInterceptor切面类,实现了方法级权限拦截。AOP的优势在于关注点分离、声明式编程和通过动态代理实现功能增强,避免了代码重复,提高了系统的可维护性和扩展性。典型应用场景包括日志记录、事务管理、权限控制等。

2025-07-02 21:44:59 936 1

原创 在项目中如何巧妙使用缓存

本文介绍了缓存技术在提升系统性能中的应用,重点对比了Redis分布式缓存和Caffeine本地缓存的特点与适用场景。分布式缓存适合需要共享、高可用的数据,而本地缓存更适合高频低延迟的单机应用。文章详细阐述了缓存设计三要素(key、value、过期时间)的实现方案,并提出了多级缓存架构,通过结合本地缓存的高性能和分布式缓存的可靠性,实现最优的系统性能提升。在实际项目中,应根据数据访问频率、一致性要求等因素选择合适的缓存策略。

2025-06-28 22:38:56 862

原创 @Autowired 和 @Resource 有什么区别?

文章详细对比了Spring中@Autowired和@Resource两个依赖注入注解的五大区别:1)来源不同(@Autowired来自Spring,@Resource来自JSR-250);2)查找顺序不同(@Autowired按类型,@Resource先按名称后按类型);3)支持参数不同(@Autowired有required参数,@Resource有name/type参数);4)使用方法不同(@Autowired可用在字段/setter/构造方法,@Resource主要用于字段/setter);5)

2025-06-26 22:51:48 681

原创 决策树算法

决策树是一种树形结构的分类模型,通过递归划分特征空间实现分类或回归。其核心包括特征选择(信息增益、基尼指数等)、树生成和剪枝(预剪枝/后剪枝)三个要素。常见算法有ID3、C4.5和CART,分别适用于不同任务类型。决策树具有解释性强、无需特征预处理等优点,但也存在易过拟合、对数据敏感等不足。实际应用中可通过Scikit-learn等工具实现,需合理设置参数如最大深度、最小样本数等以平衡模型复杂度与泛化能力。

2025-05-31 13:05:12 1054

原创 Flink

摘要: Apache Flink是分布式开源流处理框架,支持实时/批量计算,源于Stratosphere项目,现为Apache顶级项目。其核心优势包括批流一体、精确状态管理、低延迟高吞吐,广泛应用于事件驱动型应用(如反欺诈)、流式分析(如实时监控)和数据流水线(如持续ETL)。相比传统架构,Flink通过本地状态访问和流式处理提升性能,技术栈涵盖SQL/API、机器学习及多种部署模式。体系采用Master-Slave架构(JobManager/TaskManager),支持YARN/Kubernetes等集

2025-05-29 10:25:00 1585

原创 小议流计算

流计算是一种处理实时动态数据的技术,适用于数据快速持续到达的场景。与传统批量计算不同,流计算强调低延迟和实时性,支持TB/PB级数据规模。其处理流程包括数据实时采集、实时计算和实时查询服务,能主动推送结果而非被动查询。流计算广泛应用于互联网、物联网等领域,如实时推荐、监控等。典型框架包括Storm、Spark Streaming和Structured Streaming,其中Spark Streaming通过微批处理实现流计算,而Structured Streaming则提供更统一的批流一体API。

2025-05-29 10:11:11 730

原创 Spark

Spark是由加州伯克利大学AMP实验室于2009年开发的大数据并行计算框架,基于内存计算,适用于低延迟的数据分析应用。其主要特点包括运行速度快、易用性、通用性和多样化的运行模式。Spark支持多种编程语言,如Scala、Java、Python和R,并提供了完整的技术栈,涵盖SQL查询、流式计算、机器学习和图算法等。与Hadoop相比,Spark在计算模式、执行效率、任务调度机制和适用场景上具有显著优势,尤其在迭代计算和实时分析方面表现突出。Spark生态系统通过统一技术栈解决了传统大数据处理方案的碎片化问

2025-05-21 11:16:15 1450

原创 朴素贝叶斯

基于此假设,在计算给定类别下特征出现的联合概率时,可将其转化为各个特征条件概率的乘积,大幅降低计算复杂度。例如在文本分类里,正常情况下词语间存在语义关联、语法搭配等关系,但朴素贝叶斯假设每个词的出现都不依赖于其他词,从而简化模型,使其在很多场景下仍能有效工作。贝叶斯方法的特点是结合先验概率和后验概率,即避免了只使用先验概率的主观偏见,也避免了单独使用样本信息的过拟合现象。虽然这个简化方式在一定程度上降低了贝叶斯分类算法的分类效果,但是在实际的应用场景中,极大地简化了贝叶斯方法的复杂性。上的概率分布是什么?

2025-05-18 18:59:11 921

原创 数据仓库Hive

数据仓库、数据湖和湖仓一体是现代数据管理中的核心概念。数据仓库是面向主题、集成、稳定且反映历史变化的数据集合,主要用于支持管理决策,其结构包括数据源、数据存储、OLAP服务器和前端工具。数据仓库与数据库的主要区别在于前者专注于分析和大数据处理,而后者擅长事务处理。数据湖则是一种存储原始数据的系统,能够容纳结构化、半结构化和非结构化数据,适合数据科学家和开发人员进行探索性分析和机器学习。数据湖与数据仓库的区别在于数据湖存储所有类型的数据,而数据仓库仅存储结构化数据。湖仓一体是一种新型架构,结合了数据仓库的高性

2025-05-11 19:27:17 1433

原创 快速上手SpringBoot开发指南

SpringBoot通过约定优于配置的理念,大大简化了Spring应用的开发流程。自动配置:减少手动配置的工作量起步依赖:简化依赖管理嵌入式服务器:无需部署到外部服务器注解驱动:减少XML配置,提高开发效率通过本文介绍的项目结构和注解使用,可以快速上手SpringBoot开发,构建出高效、可维护的Web应用。

2025-05-07 21:39:57 1212

原创 Hadoop架构再探讨

多个名称节点各自分管一部分目录,使得一个集群可以扩展到更多节点,不再像HDFS1.0中那样由于内存的限制制约文件存储数目。• FsImage:文件系统元数据的完整快照(如文件路径、块列表),存储在磁盘,启动时加载到内存。多个名称节点管理不同的数据,且同时对外提供服务,将为用户提供更高的读写吞吐率。(3)良好的隔离性。• 统一资源调度:在单个集群上部署 YARN,由 YARN 统一管理资源(CPU、内存等)。需要注意的,HDFSFederation并不能解决单点故障问题,也就是说,每。

2025-05-06 23:23:47 1373

原创 会话_过滤器_监听器

cookie是一种客户端会话技术,cookie由服务端产生,它是服务器存放在浏览器的一小份数据,浏览器以后每次访问该服务器的时候都会将这小份数据携带到服务器去。服务端创建cookie,将cookie放入响应对象中,Tomcat容器将cookie转化为set-cookie响应头,响应给客户端客户端在收到cookie的响应头时,在下次请求该服务的资源时,会以cookie请求头的形式携带之前收到的Cookiecookie是一种键值对格式的数据,从tomcat8.5开始可以保存中文,但是不推荐。

2025-04-28 10:42:08 841

原创 Servlet

Servlet (server applet) 是运行在服务端(tomcat)的Java小程序,是sun公司提供一套定义动态资源规范;从代码层面上来讲Servlet就是一个接口用来接收、处理客户端请求、响应给浏览器的动态资源。在整个Web应用中,Servlet主要负责接收处理请求、协同调度功能以及响应数据。我们可以把Servlet称为Web应用中的控制器不是所有的JAVA类都能用于处理客户端请求,能处理客户端请求并做出响应的一套技术标准就是Servlet。

2025-04-27 18:43:57 1166

原创 梯度下降算法

梯度下降作为优化领域的基石算法,其变种形式已广泛应用于深度学习。根据具体问题调整算法参数选择适合的优化器变种诊断和解决训练过程中的问题未来可以探索:• 二阶优化方法(如牛顿法)• 分布式梯度下降• 量子优化算法通过本文的系统讲解,读者不仅能掌握梯度下降的数学原理,还能获得实际工程应用的完整解决方案。理解这个基础算法,将为您打开深度学习与优化算法的大门。

2025-04-13 13:50:38 1142

原创 关于哈希冲突的讨论

哈希冲突(Hash Collision)是指不同的输入(key)通过哈希函数计算后得到了相同的哈希值。比如哈希表中有两个键key1和key2hashkey1hashkey2hashkey1hashkey2key1≠key2key1key2这种情况会导致哈希表或哈希算法中出现重复的存储位置或计算结果。哈希冲突是哈希算法的数学必然结果。实际应用中,开发者选择通过开放寻址法或链地址法等方式解决冲突,而不是追求无冲突的哈希算法,本质是对。

2025-04-11 23:11:14 736

原创 Map Reduce

对比维度传统并行计算框架MapReduce集群架构/容错性共享式(共享内存/存储),容错性差非共享式,容错性好硬件/价格/扩展刀片服务器、高速网、SAN,价格贵,扩展性差普通PC机,便宜,扩展性好编程/学习难度what-how(需关注实现细节),难度高what(仅需关注逻辑),简单适用场景实时、细粒度计算、计算密集型任务批处理、非实时、数据密集型任务MapReduce将复杂的、运行于大规模集群上的并行计算过程高度地抽象到了两个函数:Map和Reduce。这样做有什么好处呢?

2025-04-09 15:23:32 1001

原创 JSP技术原理

JSP(Java Server Pages)是一种动态网页开发技术,它是由Sun Microsystems公司倡导、许多公司参与一起建立的一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的技术标准。<%!%>:声明成员变量和方法,需谨慎处理线程安全。<% %>:用于局部变量和逻辑代码,线程安全。<%= %>:输出表达式结果,不可包含语句。Tag文件和Tag标记是JSP中实现自定义标签的核心机制。

2025-04-08 11:14:31 869

原创 NoSQL数据库

最初表示反SQL”运动,现在表示关系和非关系型数据库各有优缺点用新型的非关系数据库取代关系数据库彼此都无法互相取代。通常,NoSQL数据库具有以下几个特点:(1)灵活的可扩展性(2)灵活的数据模型(3)与云计算紧密融合。

2025-04-06 19:34:52 1319

原创 分布式数据库HBase

HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌BigTable的开源实现,主要用来存储非结构化和半结构化的松散数据·HBase的目标是处理非常庞大的表,可以通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表。对比项BigTableHBase文件存储系统GFSHDFS海量数据处理MapReduce协同服务管理ChubbyZookeeperHBase是一个稀疏、多维度、排序的映射表,这张表的索引是行键、列族、列限定符和时间戳。

2025-04-06 19:06:55 1330

空空如也

空空如也

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

TA关注的人

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