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; } }