本文主要是介绍提交保存,要做重复请求拦截,避免出现重复保存的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
**问题:**前端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】
.
这篇关于提交保存,要做重复请求拦截,避免出现重复保存的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!