From adb9f157e68a4cb602884ff1d9980a26d46b56b8 Mon Sep 17 00:00:00 2001 From: lkddi Date: Tue, 3 Mar 2026 15:00:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9A=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E9=85=8D=E7=BD=AE=E9=A1=B5=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E3=80=8C=E8=BF=90=E7=BB=B4=E5=B7=A5=E5=85=B7=E3=80=8D=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=EF=BC=88=E4=BB=85=20id=3D1=20=E5=8F=AF=E8=A7=81?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 应用缓存清理:config:clear + cache:clear - 路由缓存清理:route:clear - 视图缓存清理:view:clear - 幽灵在线清理:扫描并清空所有房间 Redis 在线名单 所有操作均有确认弹窗,执行结果 Flash 提示反馈。 后端 abort(403) 双重校验,非超管无法访问接口。 --- .../Controllers/Admin/SystemController.php | 79 ++++++++++++++++- resources/views/admin/system/edit.blade.php | 86 +++++++++++++++++++ routes/web.php | 6 ++ 3 files changed, 170 insertions(+), 1 deletion(-) 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')) +
+ ✅ {{ session('success') }} +
+ @endif + @if (session('ops_success')) +
+ {{ session('ops_success') }} +
+ @endif +
@csrf @@ -41,4 +53,78 @@
+ + {{-- 运维工具(仅 id=1 超管可见) --}} + @if (auth()->id() === 1) +
+
+

🛠️ 运维工具

+

仅站长可见。操作不可撤销,请确认后执行。

+
+
+
+ + {{-- 应用缓存清理 --}} +
+
🗑️ 应用缓存清理
+

执行 config:clear + + cache:clear,修改 .env 后需执行。

+
+ @csrf + +
+
+ + {{-- 路由缓存清理 --}} +
+
🗺️ 路由缓存清理
+

执行 route:clear,修改路由后若出现 404 时执行。

+
+ @csrf + +
+
+ + {{-- 视图缓存清理 --}} +
+
🖼️ 视图缓存清理
+

执行 view:clear,页面样式/内容不更新时执行。

+
+ @csrf + +
+
+ + {{-- 房间在线名单清理 --}} +
+
👻 清理幽灵在线名单
+

清空所有房间 Redis 在线记录,解决人数虚高问题。
执行后在线用户需重新进房才能出现在名单。

+
+ @csrf + +
+
+ +
+
+
+ @endif @endsection diff --git a/routes/web.php b/routes/web.php index 2bb1366..837e634 100644 --- a/routes/web.php +++ b/routes/web.php @@ -273,6 +273,12 @@ Route::middleware(['chat.auth', 'chat.has_position'])->prefix('admin')->name('ad Route::get('/system', [\App\Http\Controllers\Admin\SystemController::class, 'edit'])->name('system.edit'); Route::put('/system', [\App\Http\Controllers\Admin\SystemController::class, 'update'])->name('system.update'); + // 运维工具(仅 id=1 超管可用) + Route::post('/system/ops/clear-cache', [\App\Http\Controllers\Admin\SystemController::class, 'clearCache'])->name('system.ops.clear-cache'); + Route::post('/system/ops/clear-routes', [\App\Http\Controllers\Admin\SystemController::class, 'clearRoutes'])->name('system.ops.clear-routes'); + Route::post('/system/ops/clear-views', [\App\Http\Controllers\Admin\SystemController::class, 'clearViews'])->name('system.ops.clear-views'); + Route::post('/system/ops/clear-room-online', [\App\Http\Controllers\Admin\SystemController::class, 'clearRoomOnline'])->name('system.ops.clear-room-online'); + // 房间管理(含新增/编辑/删除) Route::get('/rooms', [\App\Http\Controllers\Admin\RoomManagerController::class, 'index'])->name('rooms.index'); Route::post('/rooms', [\App\Http\Controllers\Admin\RoomManagerController::class, 'store'])->name('rooms.store');