当前位置: 首页 > news >正文

提交保存,要做重复请求拦截,避免出现重复保存的问题

**问题:**前端ajax提交数据的时候,当频繁点击的时候,或者两个账号以相同数据创建的时候,会出现问题。

**处理办法:**前端拦截,防止重复提交数据,在上一次请求返回结果之后才允许提交第二次;后端和数据库也同意做拦截判断。

** 1. 前端拦截:**

结合 layer.confirm 可以屏蔽掉重复点击确认按钮产生重复请求的情况。

// 创建征地补差价协议
function createDisparityContract() {if ($('#areaId').val() == null || $('#areaId').val() == '') {layer.msg('请先选择区域');return;}var lock = false;layer.confirm("确认要创建土地补差价协议书吗?", {btn: ['确定', '取消']}, function () {if (!lock) {lock = true;$.ajax({type: 'POST',data: {areaId: $("#areaId").val()},async: false,url: prefix + '/saveDisparityContract',success: function (r) {if (r.code == 0) {reLoad();}layer.alert(r.msg);}});}});}

2. 后端+数据库拦截:

因为会设计协议表,数据表,关系表,而关系表的数据ID字段是唯一的,所以可以给数据ID字段添加唯一索引。后端的的逻辑加上事务管理,这样你无论如何也不可能生成相同的协议书了。

ALTER TABLE `biz_contract_offset` ADD unique(`offset_id`);
@Override
@Transactional
public void insertContractForAll(ContractDO contractDO, Long[] offsetIds) {OffsetDataDO offsetDataDO = offsetDataService.get(offsetIds[0]);contractDO.setAreaId(offsetDataDO.getAreaId());contractDO.setProjectId(offsetDataDO.getProjectId());Long rootAreaId = demolitionAreaService.getRootAreaId(contractDO.getAreaId());contractDO.setRootAreaId(rootAreaId);List<OffsetDataDO> offsetDataList = offsetDataService.getOffsetDataList(offsetIds);double price = this.calContractPrice(offsetDataList);double buildOfficePrice = this.calContractBuildOfficePrice(offsetDataList);contractDO.setPrice(price);contractDO.setBuildOfficePrice(buildOfficePrice);// 设置合同编号、序号this.setContractNo(contractDO, rootAreaId);contractDO.setCreateTime(new Date());this.save(contractDO);contractOffsetService.createContractOffset(contractDO.getId(), offsetIds);
}

.
感谢您的阅读,欢迎参观我的个人网站:小嗨词典【 https://www.happydict.cn】
.

http://www.lryc.cn/news/430950.html

相关文章:

  • 华为 HCIP-Datacom H12-821 题库 (3)
  • spring-boot 事件
  • 合碳智能 × Milvus:探索化学合成新境界——逆合成路线设计
  • 二分查找 | 二分模板 | 二分题目解析
  • uni-app应用更新(Android端)
  • JavaEE(2):前后端项目之间的交互
  • (已开源-CVPR 2024)YOLO-World: Real-Time Open-Vocabulary Object Detection
  • Spring6梳理4——SpringIoC容器
  • SpringBoot2:请求处理原理分析-FORM表单请求接口
  • Monkey日志ANR、CRASH、空指针异常及其他异常数据分析
  • Vue 3结合Element Plus中,实现一个级联选择器(Cascader)来展示省市区
  • 使用卫星仿真软件STK的一些应用和思考(星地链路、星间链路)
  • pytorch对不同的可调参数,分配不同的学习率
  • 零基础学习Python(八)—— time模块、request模块、数据分析和自动化办公相关模块、jieba模块、文件操作和os相关模块的简单介绍
  • 快速回顾-HTML5
  • 视频技术未来展望:EasyCVR如何引领汇聚融合平台新趋势
  • 7个流行的开源数据治理工具
  • js | XMLHttpRequest
  • 2024国赛数学建模A题思路模型代码
  • 使用SVD(奇异值分解)进行降维的奇妙之旅
  • 【C++ 第二十一章】特殊类的设计(学习思路)
  • Java设计模式【命令模式】-行为型
  • 【HarmonyOS】一键扫码功能
  • Spring Boot应用中集成与使用多数据源
  • 探索 JavaScript 中的 instanceof 关键字
  • Python爬虫02
  • HTTP/3
  • MySQL 字符串操作详解和案例示范
  • 全双工语音交互
  • nginx中如何设置gzip