middleware(function ($request, $next) { abort_unless(SystemAccess::canOpenSettings(), 403); return $next($request); }); } public function index() { $users = $this->queryForActor()->with('roles')->orderBy('id')->get(); $groupNamesByUser = []; foreach (UserAccessGroup::forCompany()->with('users')->get() as $group) { foreach ($group->users as $member) { $groupNamesByUser[$member->id][] = $group->name; } } return view('system_settings.users.index', [ 'users' => $users, 'roleLabels' => SystemAccess::roleLabels(), 'groupNamesByUser' => $groupNamesByUser, ]); } public function create() { return view('system_settings.users.form', [ 'managedUser' => null, 'roles' => SystemAccess::assignableRoles(), ]); } public function store(Request $request) { $data = $this->validateUser($request); $role = Role::where('name', $data['role'])->firstOrFail(); DB::transaction(function () use ($data, $role) { $created = User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => $data['password'], 'locale' => 'zh-CN', 'enabled' => (bool) ($data['enabled'] ?? false), 'landing_page' => 'dashboard', 'created_by' => user()->id, 'created_from' => 'system_settings', ]); $created->roles()->attach($role->id); $created->companies()->attach(company_id()); }); flash('用户已新增。')->success(); return redirect()->route('system-settings.users.index'); } public function edit(int $id) { $managedUser = $this->findManagedUser($id); abort_unless(SystemAccess::canManageUser(user(), $managedUser), 403); return view('system_settings.users.form', [ 'managedUser' => $managedUser, 'roles' => SystemAccess::assignableRoles(), ]); } public function update(int $id, Request $request) { $managedUser = $this->findManagedUser($id); abort_unless(SystemAccess::canManageUser(user(), $managedUser), 403); $data = $this->validateUser($request, $managedUser); $role = Role::where('name', $data['role'])->firstOrFail(); if ( SystemAccess::isSuperAdmin($managedUser) && $managedUser->enabled && ($data['role'] !== SystemAccess::SUPER_ADMIN || ! ($data['enabled'] ?? false)) && $this->superAdminCount() <= 1 ) { return back()->withErrors([ $data['role'] !== SystemAccess::SUPER_ADMIN ? 'role' : 'enabled' => '系统至少需要保留一名启用的主管理员。', ])->withInput(); } if ($managedUser->id === user()->id && ! ($data['enabled'] ?? false)) { return back()->withErrors(['enabled' => '不能停用当前登录账号。'])->withInput(); } DB::transaction(function () use ($managedUser, $data, $role) { $attributes = [ 'name' => $data['name'], 'email' => $data['email'], 'enabled' => (bool) ($data['enabled'] ?? false), ]; if (! empty($data['password'])) { $attributes['password'] = $data['password']; } $managedUser->update($attributes); $managedUser->syncRoles([$role->id]); }); $managedUser->flushCache(); flash('用户已修改。')->success(); return redirect()->route('system-settings.users.index'); } public function destroy(int $id) { $managedUser = $this->findManagedUser($id); abort_if($managedUser->id === user()->id, 422, '不能删除当前登录账号。'); abort_unless(SystemAccess::canManageUser(user(), $managedUser), 403); if (SystemAccess::isSuperAdmin($managedUser) && $managedUser->enabled && $this->superAdminCount() <= 1) { return back()->withErrors(['user' => '系统至少需要保留一名启用的主管理员。']); } $managedUser->delete(); flash('用户已删除。')->success(); return redirect()->route('system-settings.users.index'); } private function queryForActor() { $query = User::query()->whereHas('companies', function ($company) { $company->where('companies.id', company_id()); }); return $query; } private function findManagedUser(int $id): User { return $this->queryForActor()->with('roles')->findOrFail($id); } private function validateUser(Request $request, ?User $managedUser = null): array { $assignable = array_keys(SystemAccess::assignableRoles()); return $request->validate([ 'name' => ['required', 'string', 'max:191'], 'email' => [ 'required', 'email', 'max:191', Rule::unique('users', 'email')->ignore($managedUser?->id)->whereNull('deleted_at'), ], 'role' => ['required', Rule::in($assignable)], 'password' => [$managedUser ? 'nullable' : 'required', 'string', 'min:8', 'confirmed'], 'enabled' => ['nullable', 'boolean'], ]); } private function superAdminCount(): int { return User::query() ->where('enabled', true) ->whereHas('roles', fn ($roles) => $roles->where('roles.name', SystemAccess::SUPER_ADMIN)) ->count(); } }