where('alias', 'not like', 'smtp_%') ->get()->pluck('body', 'alias')->toArray(); // 为后台界面准备的文案对照 (可动态化或硬编码) $descriptions = SysParam::whereNotIn('alias', ['chatbot_enabled']) ->where('alias', 'not like', 'smtp_%') ->get()->pluck('guidetxt', 'alias')->toArray(); return view('admin.system.edit', compact('params', 'descriptions')); } /** * 更新全局参数,并刷新全站 Cache 缓存 */ public function update(Request $request): RedirectResponse { $data = $request->except(['_token', '_method']); foreach ($data as $alias => $body) { SysParam::updateOrCreate( ['alias' => $alias], ['body' => $body] ); // 写入 Cache 保证极速读取 $this->chatState->setSysParam($alias, $body); // 同时清除 Sysparam 模型的内部缓存 SysParam::clearCache($alias); } return redirect()->route('admin.system.edit')->with('success', '系统参数已成功更新并生效!'); } /** * 运维工具:清理应用缓存(config + cache + application) * 仅 id=1 超管可用 */ public function clearCache(): RedirectResponse { if (Auth::id() !== 1) { abort(403, '无权限操作'); } Artisan::call('config:clear'); Artisan::call('cache:clear'); return redirect()->route('admin.system.edit')->with('ops_success', '✅ 应用缓存已清除(config:clear + cache:clear)'); } /** * 运维工具:清理路由缓存 * 仅 id=1 超管可用 */ public function clearRoutes(): RedirectResponse { if (Auth::id() !== 1) { abort(403, '无权限操作'); } Artisan::call('route:clear'); return redirect()->route('admin.system.edit')->with('ops_success', '✅ 路由缓存已清除(route:clear)'); } /** * 运维工具:清理视图缓存 * 仅 id=1 超管可用 */ public function clearViews(): RedirectResponse { if (Auth::id() !== 1) { abort(403, '无权限操作'); } Artisan::call('view:clear'); return redirect()->route('admin.system.edit')->with('ops_success', '✅ 视图缓存已清除(view:clear)'); } /** * 运维工具:清理所有房间 Redis 在线名单(清除幽灵在线脏数据) * 仅 id=1 超管可用 */ public function clearRoomOnline(): RedirectResponse { if (Auth::id() !== 1) { abort(403, '无权限操作'); } $prefix = config('database.redis.options.prefix', ''); $cursor = '0'; $cleaned = 0; do { [$cursor, $keys] = Redis::scan($cursor, ['match' => $prefix.'room:*:users', 'count' => 100]); foreach ($keys ?? [] as $fullKey) { // 去掉前缀,还原为 Laravel Facade 使用的短 Key $shortKey = $prefix ? substr($fullKey, strlen($prefix)) : $fullKey; Redis::del($shortKey); $cleaned++; } } while ($cursor !== '0'); return redirect()->route('admin.system.edit')->with('ops_success', "✅ 已清理 {$cleaned} 个房间的在线名单(幽灵在线已清除)"); } }