From 7eac2e3f9d7d0907c3960e12d68494f0431447f1 Mon Sep 17 00:00:00 2001 From: panliang <1163816051@qq.com> Date: Mon, 17 Oct 2022 17:15:30 +0800 Subject: [PATCH] user import --- assets/users.xlsx | Bin 0 -> 9757 bytes src/Action/GridImportUser.php | 21 ++++++++ src/Form/ImportForm.php | 77 ++++++++++++++++++++++++++++++ src/Http/Admin/UserController.php | 7 +++ src/Models/User.php | 2 +- 5 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 assets/users.xlsx create mode 100644 src/Action/GridImportUser.php create mode 100644 src/Form/ImportForm.php diff --git a/assets/users.xlsx b/assets/users.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..77862eefde91b900844f85e6392e4bf73e04bf13 GIT binary patch literal 9757 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 literal 0 HcmV?d00001 diff --git a/src/Action/GridImportUser.php b/src/Action/GridImportUser.php new file mode 100644 index 0000000..410af9c --- /dev/null +++ b/src/Action/GridImportUser.php @@ -0,0 +1,21 @@ +lg() + ->body(ImportForm::make()) + ->title($this->title) + ->button(''); + } +} diff --git a/src/Form/ImportForm.php b/src/Form/ImportForm.php new file mode 100644 index 0000000..e779a70 --- /dev/null +++ b/src/Form/ImportForm.php @@ -0,0 +1,77 @@ + false, 'submit' => true, 'back' => false]; + + public function handle(array $input) + { + $disk = Storage::disk('public'); + + Excel::import($disk->path($input['file']))->headings(false)->first()->chunk(500, fn(SheetCollection $collection) => $this->mapGoods($collection->toArray())); + + return $this->response()->success('导入成功')->refresh(); + } + + public function form() + { + $this->file('file')->autoUpload()->uniqueName()->move('user/import')->accept('xlsx,xls')->disk('public'); + } + + protected function mapGoods($rows) + { + array_shift($rows); + foreach ($rows as $row) { + $index = 0; + $username = data_get($row, $index); + $name = data_get($row, ++$index); + $avatar = data_get($row, ++$index); + $gender = data_get($row, ++$index); + $phone = data_get($row, ++$index); + $invitePhone = data_get($row, ++$index); + $createdAt = data_get($row, ++$index); + + if (!$username) { + throw new \Exception('用户名必填'); + } + if (!$phone) { + throw new \Exception('手机号必填'); + } + + $attributes = ['username' => $username]; + if ($name) { + $attributes['name'] = $name; + } + if ($avatar) { + $attributes['avatar'] = $avatar; + } + if ($gender) { + $attributes['gender'] = $gender; + } + if ($gender) { + $attributes['gender'] = $gender; + } + if ($createdAt) { + $attributes['created_at'] = $createdAt; + } + if ($invitePhone) { + $inviter = User::where('phone', $invitePhone)->first(); + if (!$inviter) { + throw new \Exception('邀请人不存在'); + } + $attributes['inviter_id'] = $inviter->id; + $attributes['inviter_path'] = $inviter->inviter_path . $inviter->id . '-'; + } + + User::updateOrCreate(['phone' => $phone], $attributes); + } + } +} diff --git a/src/Http/Admin/UserController.php b/src/Http/Admin/UserController.php index bf3da99..965157b 100644 --- a/src/Http/Admin/UserController.php +++ b/src/Http/Admin/UserController.php @@ -18,6 +18,7 @@ use Illuminate\Http\Request; use Illuminate\Validation\Rule; use Peidikeji\User\Models\User; use Illuminate\Support\Str; +use Peidikeji\User\Action\GridImportUser; use Peidikeji\User\Action\ShowBalance; use Peidikeji\User\Action\ShowPassword; @@ -86,6 +87,12 @@ class UserController extends AdminController } })->date()->width(3); }); + + $grid->tools(function (Grid\Tools $tools) use ($user) { + if ($user->can('dcat.admin.users.import')) { + $tools->append(new GridImportUser()); + } + }); }); } diff --git a/src/Models/User.php b/src/Models/User.php index 2388ea8..1652592 100644 --- a/src/Models/User.php +++ b/src/Models/User.php @@ -17,7 +17,7 @@ class User extends Authenticatable use HasDateTimeFormatter; use Filterable; - protected $fillable = ['username', 'password', 'avatar', 'balance', 'invite_code', 'inviter_id', 'inviter_path', 'name', 'gender', 'phone']; + protected $fillable = ['username', 'password', 'avatar', 'balance', 'invite_code', 'inviter_id', 'inviter_path', 'name', 'gender', 'phone', 'created_at']; protected static function booted() {