90 lines
3.2 KiB
PHP
90 lines
3.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\SystemSettings;
|
|
|
|
use App\Models\Auth\User;
|
|
use App\Models\Auth\UserAccessGroup;
|
|
use App\Utilities\SystemAccess;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Routing\Controller;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Validation\Rule;
|
|
|
|
class UserGroups extends Controller
|
|
{
|
|
public function __construct()
|
|
{
|
|
$this->middleware(function ($request, $next) {
|
|
abort_unless(SystemAccess::isSuperAdmin(), 403);
|
|
return $next($request);
|
|
});
|
|
}
|
|
|
|
public function index()
|
|
{
|
|
return view('system_settings.groups.index', ['groups' => UserAccessGroup::forCompany()->withCount('users')->orderBy('name')->get()]);
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
return $this->form();
|
|
}
|
|
|
|
public function edit(int $group)
|
|
{
|
|
return $this->form(UserAccessGroup::forCompany()->findOrFail($group));
|
|
}
|
|
|
|
private function form(?UserAccessGroup $group = null)
|
|
{
|
|
return view('system_settings.groups.form', ['group' => $group, 'members' => $this->members(), 'selected' => $group?->users()->pluck('users.id')->all() ?? []]);
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$group = new UserAccessGroup;
|
|
$group->company_id = company_id();
|
|
$group->page_permissions = [];
|
|
return $this->save($request, $group);
|
|
}
|
|
|
|
public function update(Request $request, int $group)
|
|
{
|
|
return $this->save($request, UserAccessGroup::forCompany()->findOrFail($group));
|
|
}
|
|
|
|
private function save(Request $request, UserAccessGroup $group)
|
|
{
|
|
$data = $request->validate([
|
|
'name' => ['required', 'string', 'max:80', Rule::unique('user_access_groups', 'name')->where('company_id', company_id())->ignore($group->id)],
|
|
'members' => ['nullable', 'array'],
|
|
'members.*' => ['integer', 'distinct', Rule::in($this->members()->pluck('id')->all())],
|
|
], [], ['name' => '分组名称', 'members' => '成员', 'members.*' => '成员']);
|
|
DB::transaction(function () use ($group, $data) {
|
|
$group->name = $data['name'];
|
|
$group->save();
|
|
$group->users()->sync($data['members'] ?? []);
|
|
});
|
|
flash('分组与成员已保存。页面权限在权限管理中设置。')->success();
|
|
return redirect()->route('system-settings.groups.index');
|
|
}
|
|
|
|
public function destroy(int $group)
|
|
{
|
|
$group = UserAccessGroup::forCompany()->findOrFail($group);
|
|
if ($group->users()->exists()) {
|
|
return back()->withErrors(['group' => '请先移出分组成员,再删除空分组。移出最后一个分组的用户将恢复角色或系统默认权限。']);
|
|
}
|
|
$group->delete();
|
|
flash('空分组已删除。')->success();
|
|
return redirect()->route('system-settings.groups.index');
|
|
}
|
|
|
|
private function members()
|
|
{
|
|
return User::whereHas('companies', fn ($query) => $query->where('companies.id', company_id()))
|
|
->whereHas('roles', fn ($query) => $query->whereIn('name', ['admin', 'user']))
|
|
->whereDoesntHave('roles', fn ($query) => $query->where('name', 'super_admin'))->orderBy('name')->get();
|
|
}
|
|
}
|