自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Java Bean】实体类与XML之间的互相转换

最近有个需求,需要把 bean对象 转成 xml 文件,然后 xml 文件 转成对象 ( 生成 与 解析 ),废话不多说,直接上代码1. 注解// 1. 定义xml中的根属性@XmlRootElement(name="student") // 2. 需要解析什么访问权限的javaBean字段 == 如果是私有字段,类上必须加上此注解@XmlAccessorType(XmlAccessType.FIELD) // 3. 使用什么标签名包裹该类的全部属性@XmlRootElemen

2022-05-24 14:41:54 4313 1

原创 解决MultipartFile文件上传中文文件名乱码的问题

问题描述最近在项目中做文件上传的功能,在本地开发测试调用服务的上传文件成功,可是发布测试环境,上传中文名字的文件,文件名就会出现乱码,最终导致上传失败,如果上传英文名字的文件,上传正常。解决过程首先是对后台接收到的文件名称进行utf-8的编码处理,但是依然没有解决。直到后面看到某位大神给出的解决办法,使用zuul servlet去上传文件,而不是默认的springmvc。使用zuul servlet只需要再请求url前面加上“/zuul”即可,问题得以解决。...

2022-05-16 21:56:12 4634

原创 Spring 异步线程池用法总结

spring异步线程池的接口类,其实质是Java.util.concurrent.ExecutorSpring已经实现的异常线程池:1. SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程2. SyncTaskExecutor:这个类没有实现异步调用,只是一个同步操作。只适用于不需要多线程的地方3. ConcurrentTaskExecutor:Executor的适配类,不推荐使用。如果ThreadPoolTaskExecutor...

2021-08-24 22:31:22 1053

原创 Gson数据传输

在一次对接第三方系统数据的时候,双方采用的是Gson格式的数据传输,觉得挺有意思,现在记录一下json是一种数据格式,便于数据传输、存储、交换。gson是一种组件库,可以把java对象数据转换成json数据格式。public class TTson{ public static Gson buildGson(){ GsonBuilder builder = new GsonBuilder().serializeNulls(); r..

2021-08-18 23:03:54 189

原创 【记录】分片长传的实现

公司要求上传5g大的文件,之前采取设置后台文件上传时间,后面觉得此方案不行,故采取分片上传的方案来实现(前端可用webUploader插件):一. 先分片上传 /** * 分片上传 * * @param fileName 文件名称 * @param chunkNumber 当前片数 * @param file 文件 * @return */ public void uploadFile(HttpServletRequest request, Str

2021-08-16 22:43:57 85

原创 Spring默认定时@Scheduled不支持L、W、C关键字的解决办法

近日采用Spring默认定时@Scheduled,定时任务配置@Scheduled(cron = “0 15 10 L * ?”) 每个月的最后一天10:15”执行定时任务的时候,它在初始化Spring上下文时出现了错误: Caused by: java.lang.IllegalStateException: Encountered invalid @Scheduled method 'execute': For input string: "L" 查其原因是Spring默认..

2021-08-05 23:30:34 1892

原创 获取指定年的所有月份最后一天日期集合

java中取得当月最后一天的四种方法 第一种,使用Calendar的roll方法,在限制某个日期字段不改变的形式下,改变其他日期字段的值。 第二种,使用Calendar的getActualMaximum方法,获得指定日期字段的最大值。 第三种,使用Calendar的set和add方法,从下个月的第一天计算得到当前月的最后一天。 第四种,循环使用Calendar的add方法,加到本月的最后一天。一开始获取采用的是calendar来获取,但是发现Calendar的日期是从0到11来计算.

2021-08-05 23:16:20 665

原创 【踩坑记录】PageHelper分页后,对list操作会导致分页无效

public PageInfo<User> getTest(int pageNum, int pageSize) { //获取第pageNum页,pageSize条内容,默认查询总数count PageHelper.startPage(pageNum,pageSize); //紧跟着的第一个select方法会被分页 List<User> userList= dao.getUserList(); //获取分页信息 P.

2021-08-03 23:13:04 421

原创 【记录】树型数据结构的分页

近日工作中遇到了后台自行组装的数据格式,某导说要进行分页,只能进行如下操作,弊端啥数据量大的情况下第一次加载会有点慢。。。List<User> userList = dao.selecUserList(userDto);int cp =userDto.getPageNum();int ps =userDto.getPageSize();int totaCount = userList.size();int totalPage = (totaCount -1) /u...

2021-08-03 22:49:23 1275

原创 Jasypt加解密

今天在项目中用到Jasypt进行加密解密,在日常开发中为了数据安全,我们都会对数据库密码进行一系列的加密,Jasypt是一个通用的加解密库,它加密所需的salt(盐),以此做一次记录加解密流程如下:1.pom.xml引入坐标2.配置文件#加密的密钥jasypt.encryptor.password= test#数据配置项spring.datasource.username= userspring.datasource.password= ENC(密文)3.这里附上自己写的jasypt.

2021-06-28 23:04:06 1673 1

原创 Java8新特性Optional的踩坑日记

众所周知,Java8增加了新的特性Optional,避免了日常开发中再取属性的时候出现NPE错误,也就是大家所熟知的空指针异常NullPointException,用来代替判空操作,主要就是代替繁琐的 xxx!=null 写法,简化代码。例如:return Optional.ofNullable(school).map(School::getAdress).ofElse(null);用来代替:if(school != null){return school.getAdress();}els.

2021-04-19 22:54:59 617

原创 JDK自带注解的个人总结

Why is Annotation?什么是注解?注解(Annotation)也叫做元数据,是一种代码级别的说明。它是JDK1.5以后版本引入的一个特性,它可以声明在类/方法/参数/变量/包等前面,用来对这些元素进行说明,注释。注解的分类1.按照运行机制1.1 源码注解:注解只在源码中存在,编译成class文件就不存在了1.2 编译时注解:注解在源码和class文件中都会存在,例如JDK自带注解1.3 运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解2.按照来源2.1 来自JDK自.

2020-12-28 11:04:54 343

原创 你的系统都有哪些稳定性的保障手段?

今天被面试官问到,你们的系统都有哪些稳定性的保障手段,当时回想了一下,说出了高可用集群,负载均衡,限流削峰,事务回滚一致性,数据库容灾,备用方案,缓存落地与持久化,灰度发布,数据库主从复制,读写分离等,回来后总结了一下这方面的知识,希望大家互相学习一.数据库方面衡量一个数据库的吞吐量我们可以看从这两方面看:内在因素:• 确定数据库是MySql还是Oracle,不同数据库的搜索引擎和隔离级别都是有差异的。• CPU是几核?现在的数据库都充分运用了多核CPU的并行处理能力。• 内存多大?数据库的.

2020-11-19 15:41:47 2889 1

原创 高并发下如何生成唯一订单号

公司做项目的时候,遇到个项目需求:如何在高并发的场景下生成唯一的订单号。方案一:如果没有并发,订单号只在一个线程内产生,那么由于程序是顺序执行的,不同订单的生成时间戳正常不同,因此用时间戳+随机数(或自增数)就可以区分各个订单。如果存在并发,且订单号是由一个进程中的多个线程产生的,那么只要把线程ID添加到序列号中就可以保证订单号唯一。如果存在并发,且订单号是由同一台主机中的多个进程产生的,那么只要把进程ID添加到序列号中就可以保证订单号唯一。如果存在并发,且订单号是由不同台主机产生的,那么MAC

2020-09-29 15:01:25 2477

原创 Redis和MongoDB的区别和使用场景

前言MongoDB是高性能、无模式的文档型数据库,支持二级索引,非常适合文档化格式的存储和查询。MongoDB的官方定位是通用数据库,确实和MySQL有些像,现在也是很流行,但它还是有事务、join等短板,在事务、复杂查询应用下无法取代关系型数据库;Redis是内存型Key/Value系统,读写性能非常好,支持操作原子性,很适合用来做高速缓存。就Redis和mongoDB来说,大家一般称为Redis缓存、MongoDB数据库,这也是有道理的。Redis主要把数据存储在内存中,其“缓存”的性质远远大

2020-09-27 18:04:58 2029 1

原创 【MongoDB】MongoDB系列工具安装及配置

前言本文主要讲了MongoDB,以及MongoDB Compass图形化工具,和NoSQLBooster客户端工具的安装与配置。本地MongoDB(windows)安装与配置首先我们访问MongoDB的官方网页上的下载页面,点击Community Server(因为是自己用所以安装了社区版本的,如果是企业的话就选择Enterprise Server企业版)到下载tab,如图:2. 本次我们需要安装的是windows版本,所以默认选择windows的tab页,选择适当的版本,点击下方的下载按钮,

2020-09-25 17:45:06 363

原创 【MongoDB】MongoDB简介

前言说起MongoDB,那就不得不说起NoSQL(Not Only SQL)数据库了,意为“不仅仅是SQL”,指的是非关系型数据库。传统关系型数据库中的表都是存储一些结构化的数据,每条记录的字段组成都是一样,即使不是每条记录都需要所有的字段,但数据库会为每条记录分配所有的字段。而非关系型数据库以键值对(key-value)存储,它的结构不固定,每一条记录可以有不一样的键,每条记录可以根据自己的需要增加一些自己的键值对,这样就不会局限于固定的机构,可以减少一些时间和空间的开销,因此大多数情况下效率和性能都

2020-09-25 15:51:40 230

原创 【HashMap】HashMap系列

前言谈起HashMap我们就不得不提及哈希表了,哈希(Hash)实际上是个人名,由于他提出哈希算法的概念,所以就以他的名字命名了。哈希表(hash table)也叫做散列表,是一种非常高效,复杂度为O(1)的数据结构,我们日常工作中常见的数据结构(数组。线性链表,二叉树,哈希表)等,哈希表不考虑哈希冲突的情况下,处理数据在哈希表中进行添加,删除,查找等操作效率是非常高的,应用场景非常丰富,很多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表。一. 什么是哈希表我们都知道

2020-09-24 18:11:26 175

原创 【Redis】Redis的过期策略和内存淘汰策略

前言Redis作为一个缓存系统,它的内存空间也是有限的,需要定期清理无效数据,这就需要主键失效和淘汰策略。Redis的过期策略我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。过期策略通常有以下三种:定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即对key进行清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处

2020-09-22 17:35:13 316

原创 【Redis】聊聊缓存穿透,缓存击穿,缓存雪崩的那些事儿

前言在我们日常的开发中,都是用数据库来进行数据的存储,大多数的系统任务中通常不会出现高并发的场景,所以看起来是没有什么问题,当涉及大数据量的需求,比如商城商品抢购的情景,或者是主页访问量较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读写速度比较慢的问题而存在严重的性能弊端。一瞬间千千万万的请求到来,需要系统在极短的时间内完成成千上万的读写操作,这时候很容易导致数据库系统瘫痪,服务宕机等严重问题。此时Redis就很好的解决了这个问题,缓存只是为了缓解数据库的压力而添加的一层保护层,当从缓存

2020-09-21 18:17:24 132

原创 【Redis】去他大爷的选择困难症?还在纠结Redis两种持久化机制哪个好吗??

前言Redis是一个基于内存的数据库,数据是保存在内存中的,我们都知道,从数据库中读取数据是需要经过磁盘IO的,这样就导致它的速度远不及内存中读取来的快,虽然内存中读取数据响应速度提升了,但是伴随着的是数据容易发生丢失。Redis为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Append Only File)一、Redis的数据持久化流程既然Redis的数据可以保存在磁盘上,那么这个流程是什么样子的呢?(1)客户端向服务端发送写操作(数据在客户端的内存中)。(

2020-09-21 11:25:56 1232 1

原创 【Redis】关于Redis的那些操作命令

一、Redis简介Redis是一个开源的、基于内存的数据结构存储器,可以用作数据库、缓存和消息中间件。读写速度高,性能极高,适用性非常的广。因此也被广泛应用在中大型的项目中,可以在某些特定应用场景下替代传统数据库,可以巧妙地实现一些特定的功能:session共享、购物车等待。二、Redis服务器安装和启动◆ 安装命令关于redis在linux服务器上的安装非常简单,这边以ubuntu为例,执行下面命令就能过安装成功◆ 服务器端的启动命令◆ 停用◆ 重启三、基本操作命令◆ 进入

2020-09-18 16:33:05 251

原创 【插件锦集】你在撸代码的时候,会用到这些吗?

前言Eclipse/IDEA提供了一个可扩展插件的开发系统,这使得它们在运行系统之上可以实现各种功能。在我们日常开发中,合理的利用一些插件,可以大大提升我们的开发效率。以下只是本人在日常工作中的一些总结和常用插件的整理,希望能帮助到大家~一、LombokLombok是一个可以通过简单的注解形式来帮助我们简化消除一些臃肿JAVA代码的工具,通过使用对应的注解,可以在编译代码的时候生成对应的方法,使我们的代码看起来更加的整洁简练。比如实体类中的getter,setter之类的一系列方法。1.Lo

2020-09-17 18:20:46 601

原创 【框架篇】MyBatis-Plus的使用入门

前言: 众所周知,Mybatis在持久层框架中还是比较火的,一般的项目都是基于ssm。虽然Mybatis可以直接在xml中通过编写SQL语句来操作数据,非常的灵活,但是也带来了很多麻烦,所有的操作都要通过SQL语句进行,这就意味着要写大量的文件,很不方便。这时候MyBatis-Plus就很好的解决了这个问题。一、MyBatis-Plus简介MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。(这段话是

2020-09-16 17:30:43 935

原创 关于session的那些事儿

什么是Session?**Session是服务器为每个访问这个服务器的客户端用户创建的一个容器。**这个容器中存储的数据能够在多个request之间实现共享。而且,这个容器只属于当前这个用户,有一个唯一的id。Session技术就是在服务端存取会话的数据session的特点每个session有id,存取key-value数据有存活时间每个Session的JESSIONID不同,使每个浏览器访问自己的数据不受他人影响session图解Session如何存取数据?获取SessionHtt

2020-09-15 20:09:05 433 1

原创 【垃圾回收】关于GC系列的日常总结

一.GC是什么?为什么要有GC?GC是垃圾收集的意思,它的全称叫做garbage colector(清洁工),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操作方法。二.JAVA垃圾回收机制是什么?在 Java 中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在 JVM 中,有一个垃圾回收线程,它是低优先级

2020-09-15 16:04:01 334

原创 【Java8】Map骚操作,你都懂了吗

总所周知,Java8最大的特性就说更多的面向函数,比如引入了Lambda等,可以更好的进行函数式编程。1.merge()merge()可以这么理解:它将新的值赋值到key(如果不存在)或更新给定的key值对应的value。源码如下: default V merge(K key,V value,BiFunction<? super V, ? super V, ? extends V> remappingFunction){ Object.requireNonNull(remappingFu

2020-08-20 20:47:59 432

原创 Eclipse如何自动生成实体类,xml和dao

1.先生成一个generatorConfig.xml文件内容是:数据库驱动包,数据库账号密码,表名称 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-gene

2020-08-14 11:29:12 882

原创 【线程池】项目中用到的ThreadPoolTaskExecutor线程池

当并发或者异步操作,都会用到ThreadPoolTaskExecutor,项目中用到的线程池是ThreadPoolTaskExecutor,这个类是spring包下的,是spring为我们提供的线程池类,这里重点讲解Spring线程池ThreadPoolTaskExecutor配置及详情ThreadPoolTaskExecutor配置,可以使用基于xml配置的方式创建,在spring.xml配置即可 <!-- spring thread pool executor -->

2020-08-08 16:22:02 886

原创 【数据库】震惊!!MySQL的数据库引擎竟然是这样

老生常谈的数据库引擎到底是Who?MySQL中的数据采用各种不同的技术存储在文件(或者内存)中。每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,我们能够获得额外的速度或者功能,从而改善喝提高应用的整体功能。当我们理解了引擎这个概念,就会知道提供各种不同引擎给你选择,然后用你选出来的引擎去处理sql语句MYSQL常用的四个数据库引擎:(1) ISAM:ISAM是一个定义明确的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的

2020-07-29 15:43:35 1835 1

原创 【数据库】Oracle和Mysql的事务隔离级别对比

简单介绍:事务的 四个特征(ACID)事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。1 、原子性。事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做2 、一致性。事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完

2020-07-27 11:57:08 1821

原创 【性能篇】关于Java性能调优你了解吗

关于Java性能调优分为两方面的优化,一方面是针对Java虚拟机内存的调优,一方面是数据库DB的调优。今天我们主要讲解Java虚拟机内存的调优,在实际开发中,几乎不可能通过单纯的调优来达到消除GC的目的,我们所做的内存调优只是尽可能的去减少内存消耗,进一步减少因为内存不足而影响Java程序性能。就如同我们手机内存一样,当内存不够的时候,用起来程序就特别的不顺畅导致用户体验极差,我们所能做的就是及时清理内存~养成良好的编码习惯能很大程度提高性能问题,以下是本人这几年的开发总结:1.尽量缓存经常使用的对象

2020-07-23 16:41:24 765

原创 【技术篇】日常网站App的用户登录,你懂了吗

今日秋高气爽,闲来无事,特此总结了一下以前做的userLogin功能,希望能给大家带来分享,如有不同的idea,欢迎下方留盐~~~接下来以163邮箱为例,对各位用户大大的Login做一个简单的思路介绍:一.在用户输入userName和passWord之后,首先我们拿到用户的passWord(密码)加 KEY(加密方法的密钥)得到加密后的用户passWord。在这里,我们可以根据自己的需要选择不同的加密方式(DES/MD5皆可)二.使用userName去user_info表查询该userInfo是.

2020-07-01 11:29:31 17524 1

原创 【基础篇】揭开String、StringBuilder以及StringBuffer的神秘面纱

String这个类是Java中使用的最频繁的类之一,据本仔的不完全统计,这个类每月的使用量可饶地球…呃,三四五六圈,今天刚好用到了这个类,就简单的做个总结吧,让我们一起走进科学,探索神秘的String、StringBuilder以及StringBuffer的三兄弟一、认识并了解String想要熟悉一个类,最好的办法就是动动你的小手,点击查看这个类的实现源代码,String类的实现在\jdk1.6.0_14\src\java\lang\String.java 文件中。public final c.

2020-06-30 23:23:50 295

原创 【技术篇】往事不堪回首,如何避免代码中大量if-else

前言:if-else代码是每一个程序员最容易写出的代码,同时也是最容易被写烂的代码,稍不注意,就产生一堆难以维护和逻辑混乱的代码。非常容易产生Bug~有句话讲得好“程序员最喜欢自己if-esle,但是不喜欢别人大量的if-else”,虽然 if-else 是必须的,但滥用 if-else 会对代码的可读性、可维护性造成很大伤害,给人一种非常lowB的感觉,接下来就让我们走近科学,探索背后的问题~~在日常回首自己写的代码,写if-else不外乎两种场景:异常逻辑处理和不同状态处理。两者最主要的区别是:异

2020-06-21 23:12:12 645 3

原创 【踩坑日记】那些年Spring声明式事务不回滚的离奇事件

最近在做一个项目的时候,写着写着到最后自测的时候发现存在事务不回滚的情况,检查数据库时还是有发现数据不一致的情况,当时我手里的西瓜刀就不冷静了,明明大家都是用的注解@Transactional,凭什么我的腰间盘就这么突出???后面想想肯定是事务没起作用,出现异常的时候事务没有回滚。在项目中配置的时候我采用的是声明式事务,个人觉得优点:使用方便,一次配置就可以了;缺点:事务的粒度比较大,只能到方法级别在我的不懈…嗯?百度之下,后面找到事务不回滚的原因有以下两点:一.try…catch异常Sprin.

2020-06-15 16:56:55 919 5

原创 【Lambda表达式】让你的代码逼范十足~~

【关于Lambda表达式】Lambda表达式是 JDK8的新特性,可以取代大部分的匿名内部类,写出更优雅简洁的Java代码,我在日常撸代码的时候常用的地方是集合的遍历和其他集合操作中,极大的优化了代码结构,总之一句话就是少写代码,可以提高我们的编程思维,话不多说,上Demo~~~Lambda表达式提供了一些方便的list操作的方法,主要覆盖分组、过滤、求和、最值、排序、去重先准备个实体类import java.util.Date;public class XianYu { //姓名 pr

2020-06-10 16:10:50 1821 5

原创 【框架篇】Mybatis的内置方法,撸代码更快捷~~

一、insert ========> 新增话不多说,直接上DemoPeople people= new People();people.setId("001");people.setAge("18");people.setName("xianYu");peopleDAO.insert (people);相当于:insert into people(id, age, name) values (‘001’, ‘18’, ‘xianYu’);一、updateByPrimaryKey===

2020-06-09 18:22:43 1267 2

原创 【基础篇】关于Java异常机制,看这篇就够了!!

Java常见异常架构图:一、异常分类1、Throwable:可抛出的,是异常的顶层父类,其他的异常或者错误都是Throwable的子类类型,只有是Throwable的体系类型,才可以使用异常的处理机制。2、Error:错误,是Throwable的子类,用于描述那些无法捕获和处理的错误情况,属于非常严重的错误,程序会停止运行。例如StackOverflowError3、Exception:异常,是Throwable的子类,用于描述那些可以捕获和处理的不正常情况,属于不太严重的错误。例如NullPoi

2020-06-05 20:40:08 856 2

原创 【基础篇】Eclipse中SVN的基本应用

## 以下是我在日常开发中经常用到的,希望能帮助到你们~~一、检出:Eclipse中选择从SVN检出项目,输入远程服务器的项目地址,拉取完整项目代码二、提交:是用本地文件覆盖远程服务器上面的文件,只有提交会导致服务器上发生变化三、更新:只是把服务器上最新版本下载到客户端,规则如下:1、如果你本地的某个文件没有修改过,而服务器上的这个文件别人已经提交过新版本,那么会用服务器上最新的文件覆盖你本地的文件;2、如果你本地的某个文件你修改过了还没有提交,服务器端的这个文件还没被别人改过,那么对你本地的

2020-06-04 18:09:05 1255 4

空空如也

空空如也

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

TA关注的人

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