Fastadmin 新增批量操作功能

【说句废话】

高手关注的是解决方案,会根据项目选择合适的开发语言、框架、cms、等。只有程序员才会纠结于用了什么开发语言!正所谓:一切脱离应用场景谈解决方案的都是刷流氓!   就像大部分客户,认为:java 比 php 好,安全! 简直搞笑之极。

【背景】

 最近在做一个人力资源招聘管理系统,中间有个功能:批量给求职者发送短信,这就是本文要说的中间,直接上步骤:

  1. 列表增加按钮
     
     <a href="javascript:;" class="btn btn-info btn-multisendsms btn-disabled disabled {:$auth->check('lapplyredcord/multi_sendsms')?'':'hide'}"title="{:__('multi_sendsms')}" ><i class="fa fa-gavel"></i> {:__('multi_sendsms')}</a>
    

  2. js增加点击事件
     
    //批量发短信事件
                $(document).on('click', '.btn-multisendsms', function () {
                    var that = this;
                    var ids = Table.api.selectedids(table);
                    // 如果选中的行数超过25行,则不执行编辑操作
                    if (ids.length > 25) {
                        alert("警告:选取的文件数量超过了25!");
                        return;
                    }
                    var title = $(that).data('title') || $(that).attr("title") || __('Edit');
                    var data = $(that).data() || {};
                    delete data.title;
                    var selectedData = Table.api.selecteddata(table);
                    var url = $.fn.bootstrapTable.defaults.extend.multisendsms_url;
                    var editData = {
                        ids: ids,
                        selectedData: selectedData
                    };
                    url = Table.api.replaceurl(url, editData, table);
                    Fast.api.open(url, typeof title === 'function' ? title.call(table, editData) : title, data);
                });
     multisendsms_url:'applyredcord/multi_sendsms'
    下面一定要加,不然窗口提交后,不会关闭、刷新列表页

  3. 控制器增加
     
    public function multi_sendsms($ids = null){
            // 将传递的 $ids 参数转换为数组
            $idsArray = explode(',', $ids);
    
            // 获取选中的数据,可能是多条数据
            $rows = $this->model->whereIn('id', $idsArray)->select();
    
            // 检查是否有数据被选中
            if (!$rows) {
                $this->error(__('No Results were found'));
            }
    
            // 循环检查每条数据的权限
            foreach ($rows as $row) {
                $adminIds = $this->getDataLimitAdminIds();
                if (is_array($adminIds) && !in_array($row[$this->dataLimitField], $adminIds)) {
                    $this->error(__('You have no permission'));
                }
            }
    
            // 处理 POST 请求,即更新数据
            if ($this->request->isPost()) {
                $params = $this->request->post('row/a');
    
                // 数据验证
                // 这里需要根据实际情况进行验证,确保数据的有效性
    
                Db::startTrans();
                try {
    
                    // 批量更新数据
                    $determinedate = $params['determinedate'];
                    $smstpl_id = $params['smstpl_id'];
                    foreach ($rows as $row) {
                        // 更新数据
                        //$params['checktime']=time();
                     //   $row->allowField(true)->save($params);
                        $examdata = [
                            'title' => '',
                            'determinedate' => $determinedate,
                            'applyredcord_id' => $row->id,
                            'smstpl_id' => $smstpl_id,
                            'note' => '',
                            'status' => $params['status'],
                            'admin_id'=>$this->auth->id
                        ];
                     //   \app\admin\model\Examine::create($examdata);
                    }
                    
                    Db::commit();
                } catch (ValidateException | PDOException | Exception $e) {
                    Db::rollback();
                    $this->error($e->getMessage());
                }
    
                // 如果更新成功,返回成功响应
                $this->success();
            }
    
            // 渲染视图,并将选中的数据传递到视图中
            $this->view->assign('row', $rows[0]);
            return $this->view->fetch();
    
        }
  4. 增加模版文件
     
    <form id="multi_check-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
    
        <div class="form-group">
            <label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
            <div class="col-xs-12 col-sm-8">
                <div class="radio">
                    {foreach name="statusList" item="vo"}
                    <label for="row[status]-{$key}">
    
                        <input id="row[status]-{$key}" name="row[status]" type="radio" value="{$key}" {in name="key"  value="$row.status" }checked{/in} > {$vo}
                    </label>
                    {/foreach}
                </div>
            </div>
        </div>
        <div class="form-group">
            <label class="control-label col-xs-12 col-sm-2">{:__('邀约/面试时间')}:</label>
            <div class="col-xs-12 col-sm-8">
                <input id="c-determinedate" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[determinedate]" type="text" value="">
            </div>
        </div>
        <div class="form-group">
            <label class="control-label col-xs-12 col-sm-2">{:__('短信模板')}:</label>
            <div class="col-xs-12 col-sm-8">
                <input id="c-smstpl_id"  data-source="smstpl/index" class="form-control selectpage" name="row[smstpl_id]" type="text" value="">
            </div>
        </div>
        <div class="form-group layer-footer">
            <label class="control-label col-xs-12 col-sm-2"></label>
            <div class="col-xs-12 col-sm-8">
                <button type="submit" class="btn btn-primary btn-embossed ">{:__('OK')}</button>
                <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
            </div>
        </div>
    </form>

按照以上步骤,就可以达到目的,还是那句话,尊重技术、敬畏技术!每一个开发语言都有自己的特有优势!

技术改变生活,合作才能共赢........

### 实现批量插入数据功能FastAdmin 中实现批量插入数据的功能主要依赖于前端表单设计以及后端 API 的处理逻辑。通过构建合适的接口和页面交互,能够高效完成多条记录的同时创建。 #### 前端部分 为了支持批量添加,在前端界面通常采用表格形式让用户输入多个项目的详情。下面是一个简单的 HTML 表格模板用于收集待插入的信息: ```html <table id="batch-insert-table"> <thead> <tr> <th>字段A</th> <th>字段B</th> <!-- 更多列 --> <th></th> </tr> </thead> <tbody> <tr class="template-row" style="display:none;"> <td><input type="text" name="field_a[]"></td> <td><input type="text" name="field_b[]"></td> <!-- 对应更多列的输入框 --> <td><button onclick="$(this).closest('tr').remove()">删除</button></td> </tr> </tbody> <tfoot> <tr> <td colspan="3"><button id="add-new-row">新增一行</button></td> </tr> </tfoot> </table> <script> document.getElementById('add-new-row').addEventListener('click', function() { var templateRow = document.querySelector('.template-row'); var newRow = templateRow.cloneNode(true); newRow.style.display = ''; templateRow.parentNode.appendChild(newRow); }); </script> ``` 此段代码提供了一个可动态增减行数的表格结构[^1],允许用户根据实际需求调整要录入的数据量。 当点击保存按钮时,需将所有填写好的数据序列化并通过 AJAX 请求发送给服务器端进行存储操作。这一步骤涉及到 JavaScript 或 jQuery 来获取并整理表单项的内容。 #### 后端部分 假设使用 PHP 作为服务端语言,则接收 POST 数据的方法如下所示: ```php <?php // 获取POST过来的数据数组 $dataList = $_POST; foreach ($dataList['field_a'] as $index => $value) { // 构建每一条记录的对象 $record = [ 'field_a' => isset($dataList['field_a'][$index]) ? trim($dataList['field_a'][$index]) : '', 'field_b' => isset($dataList['field_b'][$index]) ? trim($dataList['field_b'][$index]) : '' // 添加其他必要的字段... ]; // 跳过空项 if (empty($record)) continue; // 执行数据库插入语句或其他业务逻辑 Db::name('your_table_name')->insert($record); } echo json_encode(['status'=>'success']); ?> ``` 上述脚本遍历接收到的每一组键值对,并依次执行插入命令直到全部处理完毕[^2]。注意这里的 `Db` 是假定框架自带的一个简化版 ORM 工具;对于不同环境可能需要替换为相应的方式访问数据库。 最后提醒一点关于安全性方面的问题:确保对接收参数做了充分验证与过滤,防止 SQL 注入攻击等风险发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿斌_bingyu709

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值