当前位置: 首页 > 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】
.

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue3图片找不到用一个其他图片代替
  • 跳跃游戏 II
  • Sinc Function介绍
  • C++:引用
  • 【Python报错已解决】`TypeError: an integer is required (got type bytes)`
  • 原码 补码 反码
  • 常用开发工具配置笔记
  • 保存大量数据用sqllite还是indexdb
  • 黑屏环境下,如何利用OBD部署OceanBase企业版集群
  • H264编码原理(二)帧内预测
  • 多场景建模: STAR(Star Topology Adaptive Recommender)
  • uniapp scroll-view滚动触底加载 height高度自适应
  • MySQL中的锁详解
  • SLAM ORB-SLAM2(29)PnP估计姿态
  • C++ | Leetcode C++题解之第375题猜数字大小II
  • 网络传输文件的问题
  • 11111111
  • es6(二):字符串的扩展
  • gops —— Go 程序诊断分析工具
  • java2019面试题北京
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • leetcode46 Permutation 排列组合
  • MobX
  • PHP那些事儿
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • SpingCloudBus整合RabbitMQ
  • Spring核心 Bean的高级装配
  • vue 配置sass、scss全局变量
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • windows下使用nginx调试简介
  • 笨办法学C 练习34:动态数组
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 前嗅ForeSpider采集配置界面介绍
  • 使用agvtool更改app version/build
  • 首页查询功能的一次实现过程
  • 王永庆:技术创新改变教育未来
  • 为视图添加丝滑的水波纹
  • 我有几个粽子,和一个故事
  • 译自由幺半群
  • k8s使用glusterfs实现动态持久化存储
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # 飞书APP集成平台-数字化落地
  • #《AI中文版》V3 第 1 章 概述
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • (16)Reactor的测试——响应式Spring的道法术器
  • (Python) SOAP Web Service (HTTP POST)
  • (二)fiber的基本认识
  • (三)mysql_MYSQL(三)
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)认识微服务
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .net 提取注释生成API文档 帮助文档
  • .NetCore发布到IIS