主题
数据导入功能
数据导入是后台管理系统的重要功能,用于批量处理和同步数据。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();
}
异步导入任务的执行状态、进度信息和处理结果,可在后台管理系统的系统管理/异步任务
模块中实时监控和管理