Dcat Admin表格优化技巧:用ModalAction实现批量操作与行内弹窗的优雅方案

dcat admin自定义操作按钮 弹框显示表单、数据表格 dcat admin自定义按钮,弹框操作,注意事项 阅读详情

Dcat Admin表格交互优化:ModalAction批量操作与行内弹窗的工程实践

1. 后台管理系统交互优化的必要性

现代后台管理系统对用户体验的要求越来越高,尤其是数据密集型的业务场景。电商订单审核、批量数据导入等高频操作中,传统的页面跳转会打断用户工作流,降低操作效率。Dcat Admin作为流行的后台框架,提供了强大的弹窗交互能力,但实际开发中常遇到以下痛点:

  • 批量操作时选中项ID丢失问题
  • 行内操作弹窗重复代码过多
  • 异步加载逻辑不够直观
  • 表单与表格数据联动困难

针对这些问题,我们将深入探讨如何通过自定义ModalAction类优化交互流程。以下是一个典型的电商后台订单管理场景中的操作效率对比:

操作类型传统方式平均耗时弹窗优化后耗时效率提升
单订单审核8秒3秒62.5%
批量订单处理15秒5秒66.7%
数据导入20秒7秒65%

2. ModalAction核心机制解析

2.1 基础实现原理

Dcat Admin的弹窗交互基于Widgets\Modal组件,核心流程分为三个阶段:

  1. 按钮渲染阶段:在Grid的actions闭包中追加自定义Action
$grid->actions(function (Grid\Displayers\Actions $actions) {
    $actions->append(new AuditOrderAction());
});
  1. 模态框构建阶段:自定义Action类中创建Modal实例
class AuditOrderAction extends RowAction {
    public function render() {
        $modal = Modal::make()
            ->lg()
            ->title('订单审核')
            ->body(AuditForm::make()->payload(['id' => $this->getKey()]))
            ->button('<i class="fa fa-edit"></i> 审核');
        
        return $modal->render();
    }
}
  1. 内容加载阶段:通过LazyRenderable接口实现异步加载
class AuditForm extends Form implements LazyRenderable {
    public function handle(array $input) {
        // 表单处理逻辑
    }
    
    public function form() {
        $this->radio('status', '状态')->options([
            'approved' => '通过',
            'rejected' => '拒绝'
        ]);
    }
}

2.2 关键问题解决方案

批量操作ID丢失问题的根源在于懒加载时序。当使用LazyRenderable时,表单渲染晚于JS的onShown事件执行,导致无法获取选中行ID。解决方案有两种:

方案一:重写Modal的渲染逻辑

class BatchModal extends Modal {
    protected function getRenderableScript() {
        return <<<JS
        target.on('{$this->target}:load', function() {
            var ids = Dcat.grid.selected();
            Dcat.helpers.asyncRender('{$url}?ids='+ids, function(html) {
                body.html(html);
                {$this->loadScript}
            });
        });
        JS;
    }
}

方案二:使用静态表单+JS注入

$form = BatchForm::make();
return Modal::make()
    ->body($form)
    ->onShown(<<<JS
        var ids = {$this->getSelectedKeysScript()};
        $('#batch-ids').val(ids.join(','));
    JS);

3. 高级应用场景实现

3.1 电商订单批量审核

针对电商后台的典型场景,我们实现一个完整的批量审核方案:

class BatchAuditAction extends BatchAction {
    public function render() {
        $form = BatchAuditForm::make();
        
        return BatchModal::make($this)
            ->lg()
            ->title('批量审核订单')
            ->body($form)
            ->button('<i class="fa fa-check-circle"></i> 批量审核');
    }
}

class BatchAuditForm extends Form implements LazyRenderable {
    public function form() {
        $this->radio('status', '审核结果')->options([
            'approved' => '通过',
            'rejected' => '拒绝'
        ])->required();
        
        $this->textarea('reason', '备注');
        $this->hidden('ids')->attribute('id', 'batch-ids');
    }
    
    public function handle(array $input) {
        $ids = explode(',', $input['ids']);
        
        Order::whereIn('id', $ids)->update([
            'status' => $input['status'],
            'audit_reason' => $input['reason'] ?? null
        ]);
        
        return $this->response()->success('审核完成')->refresh();
    }
}

关键优化点:

  • 使用自定义BatchModal解决ID传递问题
  • 表单实现LazyRenderable保持轻量
  • 批量更新使用单条SQL提高效率

3.2 数据导入交互优化

数据导入是另一个高频场景,传统方案需要跳转页面,优化后的弹窗方案:

class ImportDataAction extends AbstractTool {
    public function render() {
        $form = ImportForm::make();
        
        return Modal::make()
            ->title('数据导入')
            ->body($form)
            ->button('<i class="fa fa-upload"></i> 导入数据');
    }
}

class ImportForm extends Form {
    public function form() {
        $this->file('file', 'Excel文件')
            ->accept('.xlsx,.xls')
            ->required();
            
        $this->checkbox('options', '导入选项')->options([
            'ignore_empty' => '跳过空行',
            'update_exist' => '更新已存在记录'
        ]);
    }
    
    public function handle(array $input) {
        $file = $input['file'];
        // 使用Laravel Excel处理导入
        Excel::import(new DataImport($input['options'] ?? []), $file);
        
        return $this->response()->success('导入成功')->refresh();
    }
}

4. 工程化最佳实践

4.1 性能优化方案

针对大规模数据场景,我们需要注意:

  1. 懒加载优化:
class LazyGrid extends LazyRenderable {
    public function grid() {
        return Grid::make(new OrderModel(), function(Grid $grid) {
            $grid->model()->whereIn('id', explode(',', $this->payload['ids']));
            $grid->disablePagination();
            $grid->disableActions();
            // 只查询必要字段
            $grid->column('id');
            $grid->column('order_no');
            $grid->column('amount');
        });
    }
}
  1. 批量操作分块处理:
public function handle(array $input) {
    $ids = array_chunk(explode(',', $input['ids']), 100);
    
    foreach ($ids as $chunk) {
        Order::whereIn('id', $chunk)->update([/*...*/]);
    }
}

4.2 组件化封装

为提高代码复用率,可以创建基础ModalAction类:

abstract class BaseModalAction extends RowAction {
    protected $modalSize = 'lg';
    protected $icon = '';
    
    abstract protected function formClass(): string;
    
    public function render() {
        $form = $this->formClass()::make()
            ->payload(['id' => $this->getKey()]);
            
        return Modal::make()
            ->{$this->modalSize}()
            ->title($this->title)
            ->body($form)
            ->button($this->renderButton());
    }
    
    protected function renderButton() {
        return $this->icon 
            ? "<i class=\"{$this->icon}\"></i> {$this->title}"
            : $this->title;
    }
}

// 使用示例
class AuditAction extends BaseModalAction {
    protected $title = '审核';
    protected $icon = 'fa fa-check';
    
    protected function formClass(): string {
        return AuditForm::class;
    }
}

5. 实战问题排查指南

开发过程中常见问题及解决方案:

  1. 弹窗内容不更新:
  • 确保每次渲染生成唯一的modalId
$modalId = 'modal-'.Str::random(8);
  1. 表单验证失败无提示:
  • 检查是否正确定义了handle方法
  • 确保返回了错误响应
return $this->response()->error('验证失败')->refresh();
  1. 批量操作性能瓶颈:
  • 使用DB事务保证数据一致性
  • 考虑队列异步处理
DB::transaction(function() use ($ids) {
    // 批量处理逻辑
});
  1. 动态表单元素失效:
  • 使用Dcat的JS工具函数重新初始化
Dcat.init('.select2', $modal);

6. 扩展思考与进阶技巧

6.1 状态管理优化

对于复杂交互场景,可以使用前端状态管理:

// 在onShown中初始化状态
->onShown(<<<JS
    window.orderState = {
        selectedIds: {$this->getSelectedKeysScript()},
        filters: Dcat.grid.getFilterParams('orders-grid')
    };
JS)

6.2 响应式布局适配

针对不同屏幕尺寸优化弹窗:

Modal::make()
    ->when(Admin::isMobile(), function($modal) {
        $modal->fullscreen();
    }, function($modal) {
        $modal->lg();
    });

6.3 操作日志集成

关键操作自动记录日志:

class AuditForm extends Form {
    public function handle(array $input) {
        // 业务逻辑...
        
        AdminLog::create([
            'user_id' => Admin::user()->id,
            'action' => 'batch_audit',
            'params' => $input
        ]);
    }
}
DCAT Admin进阶:自定义按钮与弹框表单的高效集成方案 本文详细介绍了在DCAT Admin中实现自定义操作按钮与弹框表单高效集成的进阶方案。通过三步核心流程——注入按钮、构建弹框、处理数据,并结合LazyRenderable接口实现异步加载,开发者可以轻松为数据表格添加如“贡献人详情”等复杂交互功能,提升后台管理系统的用户体验与开发效率。 阅读详情

相关推荐

Laravel-Dcat-layer 手写的弹窗样式

Dcat-admin框架下重新写的弹窗样式,实现设置固定最大高度弹窗滚动,实现更好的页面效果。

weixin_73269172的博客 821

Dcat Admin 批量操作/批量审批功能(弹窗)实现

功能:选择行,点击批量审批按钮,触发弹窗,输入审批意见,选择通过或退回,提交。如下图展示: 主要分三部分:1、添加批量审批按钮 2、弹窗及提交后的数据处理文件 3.动作文件 一、弹窗及提交后的数据处理文件 建立Batchspform.php文件,位置看命名空间 <?php namespace App\Admin\Forms; use Dcat\Admin\Traits\LazyWidget; use Dcat\Admin\Widgets\Form; use Dcat\Ad..

samee5的专栏 1万+

Dcat admin自定义行按钮确认框复制当前行数据

介绍 在列表单条数据添加操作按钮 1 创建action类生成DactGridRow类文件 # 创建action类 [root@bogon laravel5]# php artisan admin:action # 选择列表grid-row行操作 2 Which type of action would you like to make?: [0] default [1] grid-batch [2] grid-row [3] grid-tool [4] form-tool [5

wgchen 2714

Dcat Admin 2 列表中实现点击行执行操作

按照刚才的例子,实际上你表格的列有 勾选框、编号、姓名、性别、年龄、操作,因为。具体描述就是列表中的行点击后执行操作列表中的对应操作,如显示/编辑或自定义操作。在选择器中已经过滤,所以并不会触发脚本。按照这个判断逻辑,实际上是。为了方便我们控制部分列表中的行可点击,部分不可点击,我们创建一个。条说到了,Dcat Admin 中第一列是勾选框,所以。最后在你实际业务控制器中将原本继承的。如果需要跳到编辑,只需要将。方法,这里传递的是第一个。实现起来非常简单,首先在。即可实现行的点击操作。5. 按照官网文档,

Right! I'm Max Sky. 796

Dcat admin 列表页点击新增按钮开启弹窗创建表单

1 开启弹窗创建表单 $grid->enableDialogCreate(); // 设置弹窗宽高,默认值为 '700px', '670px' $grid->setDialogFormDimensions('50%', '50%'); 2 完整代码 <?php namespace App\Admin\Controllers; use App\Admin\Repositories\CommodityCategory; use Dcat\Admin\Form; use Dcat\Adm

wgchen 4338

Dcat-admin自定义页面干货

自定义页面控制器、接口、js、css、模板、放置目录及书写规则

Dcat Admin 全局修改行操作按钮样式(文字+图标)

默认的行操作显示方式为单个 ICON, 为了方便操作(避免误点), 可以自定义一个行操作类覆盖按钮样式。 参考方法一: 在 app\Admin 新建一个文件夹 Actions 新增文件 TextActions.php <?php namespace App\Admin\Actions; use Dcat\Admin\Grid\Displayers\Actions; class TextActions extends Actions { /** * @return st

zsysem的博客 2847

制造业重点关注的17个Agent智能体落地场景方案.pptx

制造业重点关注的17个Agent智能体落地场景方案.pptx

DcatAdmin表单怎么设置批量操作

本文介绍了使用DcatAdmin的batchActions方法实现订单管理页面批量操作功能的过程。针对订单数据和网址管理两个表格,分别实现了批量设置/取消"必选"状态和批量启用/禁用网址的功能。关键技术点包括:通过add方法定义操作名称和回调函数,使用whereIn查询选中记录并update更新字段,返回success消息并refresh刷新表格。文章特别强调了多表格场景下必须设置不同name以避免复选框冲突,并记录了开发中遇到的三个典型问题及其解决方案。最后总结了DcatAdmin批量

BrianGriffin的博客 451

【人工智能工程】完结JEV 决策大模型实战,让 AI 从会聊天到能决策

内容概要:本文介绍了JEV决策大模型的核心理念与工程实践,强调将其作为“快判断”层从通用大模型中剥离使用。JEV不生成文本,而是针对明确的状态和问题,输出结构化、带概率的决策结果,适用于高频、原子化的判断任务。文章详细阐述了JEV的工作机制、与通用大模型的本质区别、典型应用场景(如Agent工具路由)、questions的设计方法、能力边界以及兜底机制的重要性,并指出其在成本、延迟和输出确定性方面的优势。; 适合人群:具备一定AI工程实践经验的研发人员、系统架构师,尤其是正在构建Agent、自动化决策系统或优化大模型调用链的技术团队;; 使用场景及目标:①优化高频、轻量级判断任务(如工单分类、内容初筛、RAG相关性判定)的效率与成本;②实现主模型与决策模块的职责分离,提升系统整体稳定性与可维护性;③学习如何设计高质量的判断问题与概率校准机制; 阅读建议:此资源聚焦于决策模型的工程化落地,建议结合实际业务中的判断流程进行POC验证,重点关注questions设计、阈值校准与兜底策略的构建,避免盲目神化JEV的能力。

Canoe CAPL TCP通信避坑指南:从OnTcpConnect回调不触发到Socket句柄管理

本文详细解析了Canoe CAPL中TCP通信的常见问题与解决方案,包括OnTcpConnect回调不触发的三大原因、Socket句柄管理的内存泄漏风险、数据发送截断规则等。通过实战案例和代码示例,帮助开发者规避TCP通信中的典型陷阱,提升车载网络测试的稳定性和可靠性。

weixin_26976635的博客 358

Dcat Admin自定义操作避坑指南:从弹框表单到批量操作的完整流程

本文详细解析了在Dcat Admin中实现自定义操作按钮的完整流程与常见问题。重点介绍了从单行数据弹框表单到批量操作的三层架构设计、实现方法及避坑技巧,涵盖权限控制、性能优化等实战要点,帮助开发者高效构建后台管理系统。

oauth7security的博客 457

安卓无障碍服务保活实战:如何用AccessibilityService实现后台常驻(附完整代码)

本文深入解析如何利用Android无障碍服务(AccessibilityService)实现后台服务保活,涵盖多版本系统适配、前台服务集成、开机自启机制等关键技术。通过详细的Kotlin代码示例和合规性指导,帮助开发者构建稳定可靠的后台服务解决方案,同时避免因滥用无障碍服务导致的应用下架风险。

milk5的博客 1074

dcatadmin 批量修改弹窗及参数传递

功能描述:批量选择行,点击批量修改按钮,触发弹窗,修改内容,然后进行提交!如图: 批量修改: 分三部分完成 1、添加批量修改按钮 2、弹窗及提交后的数据处理文件 3、动作文件 1、弹窗及提交后的数据处理文件 建立BrandsFeiqiForm.php文件,位置看命名空间 <?php namespace App\Admin\Forms; use Dcat\Admin\Widgets\Form; use Dcat\Admin\Models\Administrator; use Dc

zsysem的博客 1958

绑定压力的计算方法

压强的公式为P=F/S,其中P为ACF要求的本压压强范围,S为受压面积,F为本压压头施加的力。绑定参数需要按线体按压头进行DOE确认,并使用DOE确认好的参数按压头重新绑定标识好送ACF厂商实测固化率、粒子变形的情况,避免绑定参数导致的异常,在绑定参数的设定过程中温度和时间可以使用仪器实测但绑定的压力则需要换算。工程上绑定压力换算的原则是:1、FPC属于柔性物料,柔性物料的受压面积按FPC绑定的受压面积=FPC绑定的长度。一、工程上FOG FPC本压压力换算(柔性材料以挤压的接触面积=受力面积)F=P。

weixin_53757859的博客 1534

OASIS协议标准文档的解读_第一部分

OASIS标准协议的文档的解读。完整原协议的中文翻译和解读。

洋葱的专栏 4904

sweetalert2弹窗--Dcat-Admin框架实战(十八)

sweetalert2弹窗--Dcat-Admin框架实战(十八) (更多博文,欢迎来我的博客学习交流https://blog.youkuaiyun.com/have_a_cat) sweetalert2真是太美了,单单看官方这张介绍就觉得好想学会它啊~ (上图摘自sweetalert2 官方文档https://github.com/sweetalert2/sweetalert2) 一、Dcat.confirm()函数 sweetalert2弹窗通过Dcat.confirm()函数实现 二、例子..

have_a_cat的博客 1836

stm32f407等芯片(HAL库)时钟频率修改(乱码)

其他片子及库文件未知、未验证,只是在使用stm32f407ZG配置串口打印的时候,出现乱码,就从以下几方面定位问题: 1. 确认串口GPIO相关配置; 2. 确认波特率等参数; 3. 确认时钟频率; 结果这次使用YH的串口打印程序在ZDYZ的开发板调试项目工程(有点另类...),做功能验证,就出现了以上问题,出于好奇开始调试,最终发现是时钟频率问题。 看到下图这个配置,因为ZDYZ开发板使用的是8MHz外部晶振(好像默认的是25MHz,如图2),所以他这里PLL_M是25,不是推荐值,感...

bulefire2009的博客 5517

laravel-admin 批量操作

1.可以去掉批量删除按钮 $grid-&gt;tools(function ($tools) { $tools-&gt;batch(function ($batch) { $batch-&gt;disableDelete(); }); }); 2.自定义批量按钮  (1)先定义操作类app/Admin/Extensions/Tools/ReleasePost...

zxdf123的博客 7129

使用Google Earth Engine下载JRC全球水体数据

通过Google Earth Engine平台和提供的源代码,研究人员和水资源管理者可以方便地获取和利用这一重要的水资源监测数据集,从而开展相关的研究和决策支持工作。要使用Google Earth Engine下载JRC全球水体数据,首先需要在Google Earth Engine平台上进行注册和登录。JRC全球水体数据是由欧洲联合研究中心开发的高分辨率全球水体分类数据集,覆盖了整个地球的陆地和水域。下载完成后,你可以使用各种遥感数据处理软件来打开和分析这些数据,以满足不同的研究和应用需求。

LrlDebug的博客 1159

快速入门必看!RT-DETR手把手训练自己的数据集去跑实验,基于 ultralytics 仓库源码改进,配置虚拟环境,准备数据集、训练、验证、推理测试 ,实现0到1的完整教学过程。

本文介绍了使用Ultralytics框架训练RT-DETR模型的全流程。首先需要创建Python 3.10虚拟环境,安装指定版本的PyTorch和相关依赖包。然后准备数据集,修改配置文件,并详细介绍训练、验证和推理三个核心步骤的代码实现。训练阶段使用RTDETR类加载模型配置,设置训练参数;验证阶段评估模型性能;推理阶段可对图片、视频等进行预测。文中还提供了清华大学镜像源加速下载,以及详细的参数配置说明,帮助用户快速搭建RT-DETR目标检测模型。

Ai缝合怪、助力小伙伴高效发论文 5565

Laravel-admin/Dcat admin自定义工具(清除站点缓存文件)

1,自定义工具 (1)打开app/Admin/bootstrap.php:追加一下代码 use Encore\Admin\Facades\Admin; Admin::navbar(function (\Encore\Admin\Widgets\Navbar $navbar) { $navbar->right(new \App\Admin\Extensions\Clear()); ...

qq_42468039的博客 1万+

HTML粉色爱心(完整代码)

HTML语言实现粉色爱心的完整代码。

AIGC 1118

laravel-admin 自定义action

laravel-admin extension 在我使用这个框架的时候,没有看到 modal 弹窗使用 自定义的html; composer require liaosp/laravel-admin-ext-rowaction 在 Action中改成继承这个类 use Liaosp\RowAction\Actions\RowAction; 使用: public function form($...

廖圣平 4227

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

dcat 批量操作弹窗及参数传递

创建表单 <?php namespace App\Admin\Form; use App\Models\Good; use Dcat\Admin\Traits\LazyWidget; use Dcat\Admin\Widgets\Form; class EditGoodsMatchForm extends Form { use LazyWidget; public function form() { $this->select('goods_.

廖圣平 2787

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: HFSS圆极化天线设计中辐射边界条件的优化选择与实践
下一篇: 泛微Ecology9实战:深入解析cus_formfield与人员信息自定义表的数据管理
Python
博客等级 码龄26年 1973粉丝 1567原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值