提交保存,要做重复请求拦截,避免出现重复保存的问题
**问题:**前端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】
.