Skip to content

数据导入功能

数据导入是后台管理系统的重要功能,用于批量处理和同步数据。CatchAdmin 专业版提供了完整的 Excel 数据导入解决方案,基于 Laravel-Excel 深度封装,提供简洁易用的导入器。只需几行代码即可实现完整的数据导入功能。以下通过用户批量导入示例进行说明。

TIP

本案例代码都写在了用户模块的 UserController 中

用户导入器

假设需要导入以下格式的 Excel 表格数据

php
// excel 格式如下
id 昵称 邮箱 密码
1 test tests@admin.com 123456
2 tests test@admin.com 123456

要实现 Excel 数据导入,需要创建自定义导入器类。CatchAdmin 专业版提供了简化的导入器实现方式,只需继承 Import 基础组件即可快速构建数据导入功能。实现示例如下

php
namespace Modules\User\Import;

use Catch\Support\Excel\Import;
use Illuminate\Support\Collection;
use Modules\User\Models\User as UserModel;

class User extends Import
{
    /**
     * Excel 数据处理方法
     * @param Collection $users Excel 表格数据集合
     */
    public function collection(Collection $users)
    {
        // Excel 数据已被转换为 Laravel Collection 对象
        // 每行数据为一个数组,可直接进行批量处理
        $users->each(function ($user) {
            // 创建用户模型实例
            $userModel = new UserModel();
            $userModel->username = $user[1]; // 昵称字段
            $userModel->email = $user[2];    // 邮箱字段
            $userModel->password = $user[3]; // 密码字段
            $userModel->save();              // 保存用户数据
        });
    }
}

完成导入器定义后,在控制器中创建数据导入接口。在 UserController 中添加导入方法

php
/**
 * 用户数据批量导入接口
 */
public function import(Request $request, \Modules\User\Import\User $import)
{
    // 获取上传的 Excel 文件
    $file = $request->file('file');

    // 执行数据导入处理
    return $import->import($file);
}

配置数据导入路由

php
// 用户批量导入路由
Route::post('user/import', [UserController::class, 'import']);

后端接口开发完成后,前端只需配置导入组件即可。使用 CatchTable 组件时,设置导入路由参数

vue
<!-- 配置数据导入URL -->
<catch-table importUrl="/user/import" />

这样就完成了完整的数据导入功能,实现了前后端的无缝对接。

如果不使用 CatchTable 组件,也可以直接使用 Import 组件

jsx
<!-- 独立导入组件 -->
<Import :action="/user/import" />

异步导入

对于大批量数据导入场景,建议使用异步导入避免请求超时。CatchAdmin 专业版支持异步导入任务,只需对导入器进行简单改造。修改 UserImport 导入器类

php
namespace Modules\User\Import;

use Catch\Contracts\AsyncTaskInterface;
use Catch\Support\Excel\Import;
use Illuminate\Support\Collection;
use Modules\System\Support\Traits\AsyncTaskDispatch;
use Modules\User\Models\User as UserModel;

// 实现异步任务接口,支持后台异步处理
class User extends Import implements AsyncTaskInterface
{
    // 引入异步任务调度 Trait
    use AsyncTaskDispatch;

    /**
     * 异步批量处理用户数据
     */
    public function collection(Collection $users)
    {
        $users->each(function ($user) {
            $userModel = new UserModel();
            $userModel->username = $user[1]; // 昵称字段
            $userModel->email = $user[2];    // 邮箱字段
            $userModel->password = $user[3]; // 密码字段
            $userModel->save();              // 保存到数据库
        });
    }
}

修改控制器中的 import 方法,启用异步导入模式

php
/**
 * 异步批量导入用户数据
 */
public function import(Request $request, \Modules\User\Import\User $import)
{
    // 启用异步模式进行数据导入
    return $import->async()->import($request->file('file'));
}

完成异步导入配置后,需要启动任务调度程序处理导入任务。在 app/Console/Kernel.php 中配置定时任务

TIP

异步导入与异步导出使用相同的任务调度机制

php
/**
 * 配置异步任务调度
 */
protected function schedule(Schedule $schedule): void
{
    // 每分钟执行一次异步任务处理
    $schedule->command('async:task')->everyMinute();
}

异步导入任务的执行状态、进度信息和处理结果,可在后台管理系统的系统管理/异步任务模块中实时监控和管理