批量审批功能的前端form表单ajax提交多文件多数据

实现的功能:

勾选需要批量修改的信息,点击批量审批按钮,弹出一个用boostrap框架做的模态框,显示出勾选内容的信息,并且填写了内容,上传了多文件之后,通过ajax发送数据。

第一步:先获取选中项该行中需要的数据

    //选中项的信息取出来
        $(‘.checkone:checked‘).each(function () {
            flow_id += $(this).val() + ‘,‘;
            var name = $(this).parents(‘tr‘).find(‘.name‘).text().trim();//获取名字
            var Appro_Theme = $(this).parents(‘tr‘).find(‘.Appro_Theme‘).text().trim();//获取主题
            var Appro_ID = $(this).parents(‘tr‘).find(‘.Appro_ID‘).text().trim();//获取流水号
            var infoItem = {};
            infoItem.name = name;//存入对象
            infoItem.theme = Appro_Theme;
            infoItem.apid = Appro_ID;
            info.push(infoItem);//info是定义的全局变量
        });
        console.log(info,"选择框的值");//取出来就是重复名字

因为我先在弹出框显示的内容是这样,看图:

所以我需要对数据进行构造一下,才好循环渲染在我的这个弹出框里面

第二步:重构数据

    // 获取选中的信息显示在弹出窗口中( 一 二)
        // 一: 重组数据结构,去重
        var nameArr = []
        for (let i = 0; i < info.length; i++) {
            nameArr.push(info[i].name)
        }
        var setarr = Array.from(new Set(nameArr))
        newInfo = []; //全局info
        for (var i = 0; i < setarr.length; i++) {
            var t = { name: setarr[i] }
            t.thems = [];
            t.appid = [];
            for (var j = 0; j < info.length; j++) {
                if (info[j].name == setarr[i]) {
                    t.thems.push(info[j].theme);
                    t.appid.push(info[j].apid);
                }
            }
            newInfo.push(t)
        }
        console.log(newInfo,"组出来的结果")

展开thems主题看一下,是不是对应的数据

好的,满足我想要渲染的需求,接下来就是弹出框的显示

第三步:弹出框内容显示

首先看一下,我想实现的页面效果,有点丑,先不管那么多。

因为可能有很多主题,也有很多人,弹出框的高宽固定大小,并且设置overflow-y:auto;就会出现滚动条。可以继续往下拉

弹出框代码实现:

html部分

    <!--审批-->
    <div id="approvalBUI" style="display:none; cursor: default; ">
        <div class="modal-content">
            <div class="modal-header">申请表信息</div>
            <div class="modal-body">
                <div class="bootbox-body">
                    <form id="fromGroup" class="form-inline"></form>
                </div>
                <div class="modal-footer">
                    <button onclick="return batchflow();" data-bb-handler="delete" type="button" class="btn btn-sm btn-danger">
                        保存
                    </button>
                    <button id="close2" data-bb-handler="close" type="button" class="btn btn-sm">
                        取消
                    </button>
                </div>
            </div>
        </div>

js部分:

        //二: 弹出框渲染
        var formtext = ‘‘;
        Array.from(newInfo).forEach(item => {
            var ulist = ‘‘;  // 主题内容展示
            Array.from(item.thems).forEach(text => {
                ulist = ulist + `<li>${text}</li>`
            });
            formtext = formtext + `
            <div class="list marginB-10">
                            <div class="boldtext">申请人:
                                <span class="modal_name">${item.name}</span>
                            </div><ul class="theme">`+ ulist + `</ul>
                            <div class="option-uoload marginB-10">
                                <div class="option-label">
                                    <select name="State" class="form-control optionstate">
                                        <option value="2">同意</option>
                                        <option value="3">驳回</option>
                                    </select>
                                </div>
                            </div>
                            <div class="boldtext">审批理由</div>
                            <textarea class="form-control formdes" placeholder="理由填写" name="opinion"></textarea>

                            <div class="boldtext marginB-10">操作</div>
                            <fieldset class="upload-fieldset marginB-10">
                                <div class="upload-wrap">
                                    <input type="file" name="fujian[0]">
                                    <a class="addPerson" class="btn-add">+</a>
                                    <input type="button" value="重置" class="reset">
                                </div>
                                <div class="shangchuandiv"></div>
                            </fieldset>
                            <hr>
                        </div>
        `
        });

        $(‘#fromGroup‘).html(formtext);

第四步:获取信息,通过fromdata添加数据,ajax发送请求

接下来,就是点击弹出框的保存按钮了,这个地方,我要得到的数据有申请人、申请人的几个主题、理由、几个文件、审核状态,通通传过去。先贴代码:

    // 弹出框点击保存事件
    function batchflow() {
        //newinfo是全局变量,保存了用户信息 在这个对象上又添加了操作状态、申请理由、数量文件
        $(‘.list‘).each(function(index){
            var state  = $(this).find(‘.optionstate‘).val(); //操作状态:同意/驳回
            var des = $(this).find(‘.formdes‘).val();  //申请理由
            fiels =$(this).find(‘.upload-fieldset‘).find(‘:file‘);//文件
            newInfo[index].files=[];
            fiels.each(function(){
                newInfo[index].files.push($(this)["0"].files);
            })
            newInfo[index].state=state;
            newInfo[index].des=des;
        });
        // console.log(newInfo,"最终点击按钮保存数据");
        newInfo.forEach(index=>{
            var data = new FormData();
            data.append(‘name‘,index.name);
            data.append(‘thems‘,index.thems);
            data.append(‘state‘,index.state);
            data.append(‘appid‘,index.appid);
            data.append(‘des‘,index.des);            //data.append(‘files‘,index.files);
            for(let i = 0;i<index.files.length;i++){
                data.append("files"+i,index.files[i]["0"]);
            }
            // console.log(data);
            $.ajax({
                url:"{:url(‘Approval/batchflow‘)}",
                type:‘post‘,
                data:data,
                processData:false,//不处理数据
                contentType: false,
                success:function(msg){
                    console.log(msg);
                }
            })
        });
    }

一开始,我是用  data.append(‘files‘,index.files);     发现,传过去,并没有用,他会把files识别成 [object FileList][object FileList]

所有的数据,我是采用json对象来存储的,所以,formdata加入了files的时候,是加入了一个files对象数组,所以对于多个文件。

解决思路是:先传一个文件,并且,先弄一个文件来试试看,能不能传成功,如果行了,再进行多个文件的遍历。貌似不能append一个对象数组,所以采取遍历的方式来一个一个文件append进去。

所以上面的代码就是这样来的:

上传文件测试一下

点击保存

我展开第一个看一下文件是否加进去,以及其他的等等都加进去没有,看到可以了,文件也存起来了。

在控制台看一下,看发过去的参数是怎样的。

问题一:我没有想上面一样 data.append("files"+i,index.files[i]["0"]);  字符串拼接跟上 下标i,去掉试一下,后台会受到怎么样的数据

上传文件试一下

在这儿看preview结果可见下图

在这个地放看header

会发现,同名files会显示最后一个文件。

这个到时候看后台需要什么样的数据了吧

全部代码:

/*     点击批量审批按钮     */
    function flowstate() {
        var flow_id = "";
        //选中项的信息取出来
        $(‘.checkone:checked‘).each(function () {
            flow_id += $(this).val() + ‘,‘;
            var name = $(this).parents(‘tr‘).find(‘.name‘).text().trim();//获取名字
            var Appro_Theme = $(this).parents(‘tr‘).find(‘.Appro_Theme‘).text().trim();//获取主题
            var Appro_ID = $(this).parents(‘tr‘).find(‘.Appro_ID‘).text().trim();//获取流水号
            var infoItem = {};
            infoItem.name = name;//存入对象
            infoItem.theme = Appro_Theme;
            infoItem.apid = Appro_ID;
            info.push(infoItem);
        });
        console.log(info,"选择框的值");//取出来就是重复名字
      // 获取选中的信息显示在弹出窗口中( 一 二)
        // 一: 重组数据结构,去重
        var nameArr = []
        for (let i = 0; i < info.length; i++) {
            nameArr.push(info[i].name)
        }
        var setarr = Array.from(new Set(nameArr))
        newInfo = []; //全局info
        for (var i = 0; i < setarr.length; i++) {
            var t = { name: setarr[i] }
            t.thems = [];
            t.appid = [];
            for (var j = 0; j < info.length; j++) {
                if (info[j].name == setarr[i]) {
                    t.thems.push(info[j].theme);
                    t.appid.push(info[j].apid);
                }
            }
            newInfo.push(t)
        }
        console.log(newInfo,"组出来的结果")

        //二: 弹出框渲染
        var formtext = ‘‘;
        Array.from(newInfo).forEach(item => {
            var ulist = ‘‘;  // 主题内容展示
            Array.from(item.thems).forEach(text => {
                ulist = ulist + `<li>${text}</li>`
            });
            formtext = formtext + `
            <div class="list marginB-10">
                            <div class="boldtext">申请人:
                                <span class="modal_name">${item.name}</span>
                            </div><ul class="theme">`+ ulist + `</ul>
                            <div class="option-uoload marginB-10">
                                <div class="option-label">
                                    <select name="State" class="form-control optionstate">
                                        <option value="2">同意</option>
                                        <option value="3">驳回</option>
                                    </select>
                                </div>
                            </div>
                            <div class="boldtext">审批理由</div>
                            <textarea class="form-control formdes" placeholder="理由填写" name="opinion"></textarea>

                            <div class="boldtext marginB-10">操作</div>
                            <fieldset class="upload-fieldset marginB-10">
                                <div class="upload-wrap">
                                    <input type="file" name="fujian[0]">
                                    <a class="addPerson" class="btn-add">+</a>
                                    <input type="button" value="重置" class="reset">
                                </div>
                                <div class="shangchuandiv"></div>
                            </fieldset>
                            <hr>
                        </div>
        `
        });

        $(‘#fromGroup‘).html(formtext);
    }
    // 弹出框点击保存事件
    function batchflow() {
        //newinfo是全局变量,保存了用户信息 在这个对象上又添加了操作状态、申请理由、数量文件
        $(‘.list‘).each(function(index){
            var state  = $(this).find(‘.optionstate‘).val(); //操作状态:同意/驳回
            var des = $(this).find(‘.formdes‘).val();  //申请理由
            fiels =$(this).find(‘.upload-fieldset‘).find(‘:file‘);//文件
            newInfo[index].files=[];
            fiels.each(function(){
                newInfo[index].files.push($(this)["0"].files);
            })
            newInfo[index].state=state;
            newInfo[index].des=des;
        });
        console.log(newInfo,"最终点击按钮保存数据");
        newInfo.forEach(index=>{
            var data = new FormData();
            data.append(‘name‘,index.name);
            data.append(‘thems‘,index.thems);
            data.append(‘state‘,index.state);
            data.append(‘appid‘,index.appid);
            data.append(‘des‘,index.des);
            data.append(‘dd‘,index.files);
            for(let i = 0;i<index.files.length;i++){
                data.append("files"+i,index.files[i]["0"]);
            }
            console.log(data);
            $.ajax({
                url:"{:url(‘Approval/batchflow‘)}",
                type:‘post‘,
                data:data,
                processData:false,//不处理数据
                contentType: false,
                success:function(msg){
                    console.log(msg);
                }
            })
        });
    }

原文地址:https://www.cnblogs.com/feng-xl/p/9125455.html

时间: 2024-10-27 18:26:26

批量审批功能的前端form表单ajax提交多文件多数据的相关文章

form表单submit提交内容,跟ajax异步提交form表单的区别,

因为开发一个小细节,本来是上传文件,填写文件名进行ajax提交,但是没有获取到文件的绝对地址, 所以使用了form表单提交文件,然后又觉得form表单+ajax提交联系起来比较好,不用改动太多代码. 区别: Form表单提交:一般都会进行页面跳转: Ajax异步提交:可以不进行页面跳转: Form表单提交 <body> <div id="forms”> <form id="form1" action="/users/login"

使用ajax方法实现form表单的提交

转http://www.cnblogs.com/han-1034683568/p/7199168.html 写在前面的话 在使用form表单的时候,一旦点击提交触发submit事件,一般会使得页面跳转,页面间的跳转等行为的控制权往往在后端,后端会控制页面的跳转及数据传递,但是在某些时候不希望页面跳转,或者说想要将控制权放在前端,通过js来操作页面的跳转或者数据变化. 一般这种异步的操作,我们都会想到ajax方式,因此在实现了功能后就整理了这篇文章,通过ajax方法实现form表单的提交并进行后续

JavaScript 创建一个 form 表单并提交

<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <input onclick="MakeForm()" type="button" class="btn grey"

form表单的提交方式

开发中表单提交是很常见的,表单的提交方式也多种方式. 1.使用submit按钮提交表单  <input type="submit"/> <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>form表单提交方式</title> </head> <body>

JavaWeb学习总结(十一):Session解决form表单重复提交

在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提交的常见应用场景 有如下的form.jsp页面 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <!DOCTYPE HTML>

Form表单Ajax系列化提交数据

页面上有一个商品的颜色尺码二维输入框,输入完毕之后需要把数据进行提交,点击立即购买则进行页面的跳转,通过form表单将数据提交到后台,而点击添加到购物车的话,则会通过ajax进行数据的提交,页面不进行跳转.前台样式: 下面是form表单: <form id="cartForm" action="${ctx}/cart/save" method="post"> <div class="product-page-optio

按Enter键后Form表单自动提交的问题

怪事年年有,今年特别多. 话说,最近项目中遇到一件怪事,当我鼠标focus在文本框中,轻轻敲了下回车键,尼玛页面突然刷新了,当时把宝宝给吓得. 接下来就是一番苦逼的烧脑和蛋疼~ 一.被表象所迷惑 突然出现这种情况,脑海中第一反应是,keydown事件是不是出问题了,然后找啊找啊找啊,然后没有然后. 在把input元素上的所有事件移除掉后,我自信的按了一下enter键.艾玛,又刷新了.心里那个苦哎. 二.列出所有可能 一阵捣鼓之后,脑海中列出了所有按下enter键后的改变,url改变,多了一个问号

php 解决和避免form表单重复提交的方法

在提交表单的时候,可能遇到网速等导致页面突然加载变慢,用户重复地点击提交按钮,将在数据库产生多条数据,导致不可控情况. 比如下面的情况就会导致表单重复提交: 点击提交按钮两次. 点击刷新按钮. 使用浏览器后退按钮重复之前的操作,导致重复提交表单. 使用浏览器历史记录重复提交表单. 浏览器重复的HTTP请求. 网页被恶意刷新. 下面是几种解决的方法: 一:利用js设置按钮点击后变成灰色 $(document).ready(function(){ $(input:submit).click(){ s

form表单回车提交问题

最近发现在form里的一个input敲击回车键时会提交form表单.查了资料,发现会出现这个情况的原因是浏览器帮我们做了处理.这里总结几条规则: 1. 如果表单里有一个type="submit"的按钮,回车键生效. 2. 如果表单里只有一个type="text"的input,回车键生效. 3. 如果按钮不是用input,而是用button,并且没有加type,IE下默认为type=button,FX默认为type=submit 4. 其他表单元素如textarea.