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

**问题:**前端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】
.

你可能感兴趣的:(幂等性)