editableSystemAliases(); // 通用系统页仅加载白名单字段,避免站长专属配置被普通高管查看。 $systemParams = SysParam::query() ->whereIn('alias', $editableAliases) ->orderBy('id') ->get(['alias', 'body', 'guidetxt']); $params = $systemParams->pluck('body', 'alias')->all(); $descriptions = $systemParams->pluck('guidetxt', 'alias')->all(); return view('admin.system.edit', compact('params', 'descriptions')); } /** * 更新全局参数,并刷新全站 Cache 缓存 */ public function update(Request $request): RedirectResponse { // 只接受通用系统页白名单内的字段,忽略任何伪造提交的敏感键。 $data = $request->only($this->editableSystemAliases()); if (array_key_exists('maxlevel', $data)) { $normalizedMaxLevel = max(1, (int) $data['maxlevel']); // 管理员级别始终跟随最高等级 + 1,避免两个配置页出现口径漂移。 $data['maxlevel'] = (string) $normalizedMaxLevel; $data['superlevel'] = (string) ($normalizedMaxLevel + 1); } foreach ($data as $alias => $body) { $normalizedBody = (string) $body; SysParam::updateOrCreate( ['alias' => $alias], ['body' => $normalizedBody] ); // 仅对白名单字段同步缓存,杜绝越权请求覆盖站长专属配置。 $this->chatState->setSysParam($alias, $normalizedBody); // 同时清除 Sysparam 模型的内部缓存 SysParam::clearCache($alias); } return redirect()->route('admin.system.edit')->with('success', '系统参数已成功更新并生效!'); } /** * 获取通用系统页允许维护的参数别名白名单 * * @return array */ private function editableSystemAliases(): array { return SysParam::query() ->orderBy('id') ->pluck('alias') ->filter(fn (string $alias): bool => ! $this->isSensitiveAlias($alias) && ! $this->isDedicatedAlias($alias)) ->values() ->all(); } /** * 判断参数是否属于站长专属敏感配置 */ private function isSensitiveAlias(string $alias): bool { if (Str::startsWith($alias, ['smtp_', 'vip_payment_', 'wechat_bot_', 'chatbot_'])) { return true; } return Str::endsWith($alias, ['_password', '_secret', '_token', '_key']); } /** * 判断参数是否已经迁移到独立配置页。 */ private function isDedicatedAlias(string $alias): bool { return in_array($alias, [ 'levelexp', 'level_warn', 'level_mute', 'level_kick', 'level_announcement', 'level_ban', 'level_banip', 'level_freeze', ], true); } }