modelName = Admin::adminUserModel(); } public function getEditData($id): Model|\Illuminate\Database\Eloquent\Collection|Builder|array|null { $adminUser = parent::getEditData($id)->makeHidden('password'); $adminUser->load('roles'); return $adminUser; } public function store($data): bool { if ($this->checkUsernameUnique($data['username'])) { admin_abort(__('admin.admin_user.username_already_exists')); } if (! data_get($data, 'password')) { admin_abort(__('admin.required', ['attribute' => __('admin.password')])); } if (array_key_exists('confirm_password', $data)) { if ($data['password'] !== $data['confirm_password']) { admin_abort(__('admin.admin_user.password_confirmation')); } unset($data['confirm_password']); } if (Hash::needsRehash($data['password'])) { $data['password'] = Hash::make($data['password']); } $model = $this->getModel(); $user = $model::create(Arr::except($data, ['roles'])); if (isset($data['roles'])) { $user->roles()->attach($data['roles']); } return true; } public function update($primaryKey, $data): bool { if (isset($data['username']) && $this->checkUsernameUnique($data['username'], $primaryKey)) { admin_abort(__('admin.admin_user.username_already_exists')); } if (isset($data['password']) && Hash::needsRehash($data['password'])) { $data['password'] = Hash::make($data['password']); } $user = $this->query()->whereKey($primaryKey)->firstOrFail(); foreach (['username', 'password', 'name', 'avatar', 'lock'] as $attribute) { if (array_key_exists($attribute, $data)) { $user->{$attribute} = $data[$attribute]; } } if ($user->isDirty('lock') && $user->lock != 1) { $user->error_num = 0; $user->last_error_at = null; } $user->save(); if (isset($data['roles'])) { $roles = Arr::pull($data, 'roles'); $user->roles()->detach(); $user->roles()->attach(Arr::has($roles, '0.id') ? Arr::pluck($roles, 'id') : $roles); } return true; } public function checkUsernameUnique($username, $id = 0): bool { return $this->query() ->where('username', $username) ->when($id, fn ($query) => $query->where('id', '<>', $id)) ->exists(); } public function updateUserSetting($primaryKey, $data): bool { $this->passwordHandler($data, $primaryKey); return parent::update($primaryKey, $data); } public function passwordHandler(&$data, $id = null) { $password = Arr::get($data, 'password'); if ($password) { if ($password !== Arr::get($data, 'confirm_password')) { admin_abort(__('admin.admin_user.password_confirmation')); } if (strlen($password) < 6) { admin_abort('密码长度至少6个字符'); } if ($id) { if (! Arr::get($data, 'old_password')) { admin_abort(__('admin.admin_user.old_password_required')); } $oldPassword = $this->query()->where('id', $id)->value('password'); if (! Hash::check($data['old_password'], $oldPassword)) { admin_abort(__('admin.admin_user.old_password_error')); } } $data['password'] = bcrypt($password); unset($data['confirm_password']); unset($data['old_password']); } } public function list() { $keyword = request()->keyword; $query = $this ->query() ->with('roles') ->select(['id', 'name', 'username', 'avatar', 'created_at', 'lock']) ->when($keyword, function ($query) use ($keyword) { $query->where('username', 'like', "%{$keyword}%")->orWhere('name', 'like', "%{$keyword}%"); }); $this->sortable($query); $items = (clone $query)->paginate(request()->input('perPage', 20))->items(); $total = (clone $query)->count(); return compact('items', 'total'); } }