主题
导入
导入在后台管理中也算是比较常见的功能。CatchAdmin
也自带导入的功能,基于 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
{
// 导入器有一个 collection 方法,方法参数就是 excel 内容
// 一行就是一个数组
public function collection(Collection $users)
{
// excel 的内容已经在底层变成了 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)
{
// $request->file('file') 获取导入的 excel 文件
// 一行代码即可实现导入
return $import->import($request->file('file'));
}
再来设置导入路由
php
Route::post('user/import', [UserController::class, 'import']);
这样后端就完成了,再来看看前端,如果你是使用的 CatchTable
的话,那么只需要设置对应的导入路由即可
vue
// 设置 importUrl 即可
<catch-table importUrl="/user/import" />
这样就完成了导入功能,是不是很简单呢?
如果你不是使用 catchtable
的话,也可以自行调用 import
组件
jsx
<Import :action="/user/import" />
异步
同样的,导入也支持异步导入,只需要稍微改造一下,首先到 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;
// 还需要继承 AsyncTaskInterface
class User extends Import implements AsyncTaskInterface
{
// 添加 trait
use AsyncTaskDispatch;
public function collection(Collection $users)
{
// TODO: Implement collection() method.
$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)
{
// 添加 async 异步方法即可
return $import->async()->import($request->file('file'));
}
这样任务就变成了异步任务。既然是异步任务,那么肯定需要执行。找到 app/Console/Kernel.php
, 添加下面的任务即可
TIP
这里和导出异步任务一样
php
protected function schedule(Schedule $schedule): void
{
$schedule->command('async:task')->everyMinute();
}
任务的情况和具体信息,都可以在后台管理中的系统管理/异步任务
列表中进行查看