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

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

**问题:**前端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.kler.cn/a/282750.html

相关文章:

  • Dubbo 3.2 源码导读
  • JavaScript 自动化软件:AutoX.js
  • spring boot整合https协议
  • 【代码审计】常见漏洞专项审计-业务逻辑漏洞审计
  • 为什么海外服务器IP会被封
  • 前端搭建低代码平台,微前端如何选型?
  • 数据结构与算法——深度优先搜索(DFS)和广度优先搜索(BFS)
  • j9、vue、uni-app、小程序的页面传参方式
  • css-functions-属性函数
  • 数盟IOS端可信ID
  • 【前缀和】--- 初阶题目赏析
  • 详解前端cookie知识
  • fastapi接口里日志重复写,用metaclass 单例模式解决了
  • 使用python创建kafka的topic
  • 2010年
  • golang 多版本管理工具
  • 聊聊负电压芯片
  • web尝试---信箱
  • 揭秘!浮毛会进肺是不是智商税?必备浮毛空气净化器使用体验分享
  • 基于STM32开发的智能农业监测与控制系统
  • C++系列-STL容器之deque
  • Spring Boot中处理JSON日期格式
  • npm安装问题
  • 开发笔记-幂等性
  • Git中pull和fetch的区别
  • 友元成员函数怎么用?