151 lines
6.2 KiB
PHP
151 lines
6.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\SystemSettings;
|
|
|
|
use App\Models\Auth\User;
|
|
use App\Models\Auth\UserAccessGroup;
|
|
use App\Utilities\BusinessNavigation;
|
|
use App\Utilities\SidebarPermissions;
|
|
use App\Utilities\SystemAccess;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Routing\Controller;
|
|
use Illuminate\Validation\Rule;
|
|
|
|
class Sidebar extends Controller
|
|
{
|
|
public function __construct()
|
|
{
|
|
$this->middleware(function ($request, $next) {
|
|
abort_unless(SystemAccess::canOpenSettings(), 403);
|
|
|
|
return $next($request);
|
|
});
|
|
}
|
|
|
|
public function index()
|
|
{
|
|
return view('system_settings.sidebar.index');
|
|
}
|
|
|
|
public function edit(Request $request)
|
|
{
|
|
$subjects = $this->subjects();
|
|
$subject = $request->string('subject')->toString() ?: array_key_first($subjects);
|
|
|
|
abort_unless(isset($subjects[$subject]), 404);
|
|
|
|
$settings = SidebarPermissions::settings();
|
|
$configured = in_array($subject, $settings['configured'] ?? [], true);
|
|
$selected = $configured
|
|
? SidebarPermissions::normalizeAllowedKeys((array) ($settings['subjects'][$subject] ?? []))
|
|
: SidebarPermissions::allKeys();
|
|
$source = $configured ? '当前使用单独配置。' : '未单独配置,使用系统默认完整页面。';
|
|
$canInherit = str_starts_with($subject, 'user_');
|
|
if (str_starts_with($subject, 'group_')) {
|
|
$group = UserAccessGroup::forCompany()->findOrFail(substr($subject, 6));
|
|
$selected = SidebarPermissions::normalizeAllowedKeys($group->page_permissions ?? []);
|
|
$configured = true;
|
|
$source = '分组权限与用户的其他分组权限合并;用户例外配置优先。新分组默认没有页面权限。';
|
|
} elseif ($canInherit && ! $configured) {
|
|
$target = User::findOrFail(substr($subject, 5));
|
|
$selected = SidebarPermissions::allowedKeys($target) ?? SidebarPermissions::allKeys();
|
|
$groups = UserAccessGroup::forUser($target);
|
|
$source = $groups->isNotEmpty() ? '正在继承分组:' . $groups->pluck('name')->implode('、') : '正在继承角色或系统默认权限。';
|
|
}
|
|
|
|
return view('system_settings.sidebar.edit', [
|
|
'navigation' => BusinessNavigation::all(),
|
|
'subjects' => $subjects,
|
|
'subject' => $subject,
|
|
'configured' => $configured,
|
|
'selected' => $selected,
|
|
'source' => $source,
|
|
'canInherit' => $canInherit,
|
|
]);
|
|
}
|
|
|
|
public function update(Request $request)
|
|
{
|
|
$subjects = $this->subjects();
|
|
$subject = $request->input('subject');
|
|
|
|
$request->validate([
|
|
'subject' => ['required', Rule::in(array_keys($subjects))],
|
|
'permissions' => ['nullable', 'array'],
|
|
'permissions.*' => ['string', Rule::in(SidebarPermissions::allKeys())],
|
|
'mode' => ['nullable', Rule::in(['custom', 'inherit'])],
|
|
]);
|
|
|
|
if ($request->input('mode') === 'inherit' && ! str_starts_with($subject, 'user_')) {
|
|
return back()->withErrors(['mode' => '只有用户例外配置可以恢复继承。']);
|
|
}
|
|
if (str_starts_with($subject, 'group_')) {
|
|
UserAccessGroup::forCompany()->findOrFail(substr($subject, 6))->update([
|
|
'page_permissions' => array_values(array_unique((array) $request->input('permissions', []))),
|
|
]);
|
|
flash('分组页面权限已更新,成员将在下次访问时使用新权限。')->success();
|
|
return redirect()->route('system-settings.sidebar.edit', ['subject' => $subject]);
|
|
}
|
|
|
|
$settings = SidebarPermissions::settings();
|
|
$settings['configured'] = array_values(array_unique(array_merge(
|
|
(array) ($settings['configured'] ?? []),
|
|
[$subject]
|
|
)));
|
|
$settings['subjects'][$subject] = array_values(array_unique((array) $request->input('permissions', [])));
|
|
if ($request->input('mode') === 'inherit') {
|
|
$settings['configured'] = array_values(array_diff($settings['configured'], [$subject]));
|
|
unset($settings['subjects'][$subject]);
|
|
}
|
|
|
|
setting()->set('system.sidebar_permissions', json_encode($settings, JSON_UNESCAPED_UNICODE));
|
|
setting()->save();
|
|
|
|
flash('保存成功,侧边栏权限已更新。')->success();
|
|
|
|
return redirect()->route('system-settings.sidebar.edit', ['subject' => $subject]);
|
|
}
|
|
|
|
private function subjects(): array
|
|
{
|
|
$labels = SystemAccess::roleLabels();
|
|
|
|
if (SystemAccess::isSuperAdmin()) {
|
|
$subjects = [
|
|
'role_admin' => '用户类型:' . $labels[SystemAccess::ADMIN],
|
|
'role_user' => '用户类型:' . $labels[SystemAccess::USER],
|
|
];
|
|
|
|
$users = User::query()
|
|
->whereHas('companies', fn ($company) => $company->where('companies.id', company_id()))
|
|
->whereHas('roles', fn ($roles) => $roles->whereIn('roles.name', [SystemAccess::SUPER_ADMIN, SystemAccess::ADMIN, SystemAccess::USER]))
|
|
->with('roles')
|
|
->orderBy('name')
|
|
->get();
|
|
} else {
|
|
$subjects = ['role_user' => '用户类型:' . $labels[SystemAccess::USER]];
|
|
$users = User::query()
|
|
->whereHas('companies', fn ($company) => $company->where('companies.id', company_id()))
|
|
->whereHas('roles', fn ($roles) => $roles->where('roles.name', SystemAccess::USER))
|
|
->orderBy('name')
|
|
->get();
|
|
}
|
|
|
|
foreach ($users as $managedUser) {
|
|
$role = SystemAccess::roleName($managedUser);
|
|
if ($role === SystemAccess::SUPER_ADMIN) {
|
|
continue;
|
|
}
|
|
$subjects['user_' . $managedUser->id] = '指定用户:' . $managedUser->name . ' - ' . ($labels[$role] ?? $role);
|
|
}
|
|
|
|
if (SystemAccess::isSuperAdmin()) {
|
|
foreach (UserAccessGroup::forCompany()->orderBy('name')->get() as $group) {
|
|
$subjects['group_' . $group->id] = '分组:' . $group->name;
|
|
}
|
|
}
|
|
|
|
return $subjects;
|
|
}
|
|
}
|