diff --git a/app/Http/Controllers/Admin/SystemController.php b/app/Http/Controllers/Admin/SystemController.php index 8f75230..8484bb2 100644 --- a/app/Http/Controllers/Admin/SystemController.php +++ b/app/Http/Controllers/Admin/SystemController.php @@ -3,10 +3,11 @@ /** * 文件功能:系统参数配置控制器 * (替代原版 VIEWSYS.ASP / SetSYS.ASP) + * 同时提供运维工具:缓存清理、路由清理、视图清理、房间在线名单清理 * * @author ChatRoom Laravel * - * @version 1.0.0 + * @version 1.1.0 */ namespace App\Http\Controllers\Admin; @@ -16,6 +17,9 @@ use App\Models\SysParam; use App\Services\ChatStateService; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Artisan; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Redis; use Illuminate\View\View; class SystemController extends Controller @@ -64,4 +68,77 @@ class SystemController extends Controller 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} 个房间的在线名单(幽灵在线已清除)"); + } } diff --git a/resources/views/admin/system/edit.blade.php b/resources/views/admin/system/edit.blade.php index fc5427c..e872a4b 100644 --- a/resources/views/admin/system/edit.blade.php +++ b/resources/views/admin/system/edit.blade.php @@ -11,6 +11,18 @@ + {{-- Flash 提示 --}} + @if (session('success')) +
仅站长可见。操作不可撤销,请确认后执行。
+执行 config:clear +
+ cache:clear,修改 .env 后需执行。
执行 route:clear,修改路由后若出现 404 时执行。
执行 view:clear,页面样式/内容不更新时执行。
清空所有房间 Redis 在线记录,解决人数虚高问题。
执行后在线用户需重新进房才能出现在名单。