From 783afe067785a088a79f79379598258ff43358c7 Mon Sep 17 00:00:00 2001 From: lkddi Date: Tue, 3 Mar 2026 15:07:36 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=EF=BC=9A=E8=BF=90=E7=BB=B4?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E8=BF=81=E7=A7=BB=E4=B8=BA=E7=8B=AC=E7=AB=8B?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E4=BE=A7=E8=BE=B9=E6=A0=8F=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E3=80=8C=E8=BF=90=E7=BB=B4=E5=B7=A5=E5=85=B7=E3=80=8D?= =?UTF-8?q?=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新建 OpsController,承接四项运维操作 - 新建 admin/ops/index.blade.php 独立页面(卡片式布局) - admin 路由改为 /admin/ops/* -> admin.ops.* - 侧边栏「AI 厂商配置」下方新增「🛠️ 运维工具」菜单入口 - SystemController 移除运维方法,职责回归纯参数配置 - system/edit 移除内嵌运维块,页面保持简洁 --- app/Http/Controllers/Admin/OpsController.php | 108 ++++++++++++++++ .../Controllers/Admin/SystemController.php | 78 +----------- resources/views/admin/layouts/app.blade.php | 4 + resources/views/admin/ops/index.blade.php | 117 ++++++++++++++++++ resources/views/admin/system/edit.blade.php | 80 ------------ routes/web.php | 9 +- 6 files changed, 235 insertions(+), 161 deletions(-) create mode 100644 app/Http/Controllers/Admin/OpsController.php create mode 100644 resources/views/admin/ops/index.blade.php diff --git a/app/Http/Controllers/Admin/OpsController.php b/app/Http/Controllers/Admin/OpsController.php new file mode 100644 index 0000000..ea8cb24 --- /dev/null +++ b/app/Http/Controllers/Admin/OpsController.php @@ -0,0 +1,108 @@ +route('admin.ops.index') + ->with('ops_success', '✅ 应用缓存已清除(config:clear + cache:clear)'); + } + + /** + * 清理路由缓存(route:clear) + */ + public function clearRoutes(): RedirectResponse + { + if (Auth::id() !== 1) { + abort(403, '无权限操作'); + } + + Artisan::call('route:clear'); + + return redirect()->route('admin.ops.index') + ->with('ops_success', '✅ 路由缓存已清除(route:clear)'); + } + + /** + * 清理视图缓存(view:clear) + */ + public function clearViews(): RedirectResponse + { + if (Auth::id() !== 1) { + abort(403, '无权限操作'); + } + + Artisan::call('view:clear'); + + return redirect()->route('admin.ops.index') + ->with('ops_success', '✅ 视图缓存已清除(view:clear)'); + } + + /** + * 清理所有房间 Redis 在线名单(清除幽灵在线脏数据) + */ + 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.ops.index') + ->with('ops_success', "✅ 已清理 {$cleaned} 个房间的在线名单(幽灵在线已清除)"); + } +} diff --git a/app/Http/Controllers/Admin/SystemController.php b/app/Http/Controllers/Admin/SystemController.php index 8484bb2..7986b95 100644 --- a/app/Http/Controllers/Admin/SystemController.php +++ b/app/Http/Controllers/Admin/SystemController.php @@ -3,7 +3,7 @@ /** * 文件功能:系统参数配置控制器 * (替代原版 VIEWSYS.ASP / SetSYS.ASP) - * 同时提供运维工具:缓存清理、路由清理、视图清理、房间在线名单清理 + * 运维工具已迁移至 OpsController * * @author ChatRoom Laravel * @@ -17,9 +17,6 @@ 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 @@ -68,77 +65,4 @@ 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/layouts/app.blade.php b/resources/views/admin/layouts/app.blade.php index 17cdbf5..7c133e7 100644 --- a/resources/views/admin/layouts/app.blade.php +++ b/resources/views/admin/layouts/app.blade.php @@ -103,6 +103,10 @@ class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.ai-providers.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}"> 🤖 AI 厂商配置 + + 🛠️ 运维工具 + 📋 开发日志 diff --git a/resources/views/admin/ops/index.blade.php b/resources/views/admin/ops/index.blade.php new file mode 100644 index 0000000..7dee6ee --- /dev/null +++ b/resources/views/admin/ops/index.blade.php @@ -0,0 +1,117 @@ +@extends('admin.layouts.app') + +@section('title', '运维工具') + +@section('content') +
+
+

🛠️ 运维工具

+

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

+
+ + {{-- 操作结果提示 --}} + @if (session('ops_success')) +
+ {{ session('ops_success') }} +
+ @endif + +
+
+ + {{-- 应用缓存清理 --}} +
+
+ 🗑️ +
+
应用缓存清理
+
config:clear + cache:clear
+
+
+

+ 清除 Laravel 配置和应用缓存。
+ 修改 .env 后、部署新版本后建议执行。 +

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

+ 清除路由缓存文件。
+ 部署后出现 404 路由错误时执行。 +

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

+ 清除已编译的 Blade 视图缓存。
+ 页面样式或内容更新后未生效时执行。 +

+
+ @csrf + +
+
+ + {{-- 房间在线名单清理 --}} +
+
+ 👻 +
+
清理幽灵在线名单
+
Redis room:*:users
+
+
+

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

+
+ @csrf + +
+
+ +
+
+
+@endsection diff --git a/resources/views/admin/system/edit.blade.php b/resources/views/admin/system/edit.blade.php index e872a4b..beaea31 100644 --- a/resources/views/admin/system/edit.blade.php +++ b/resources/views/admin/system/edit.blade.php @@ -11,17 +11,11 @@ - {{-- Flash 提示 --}} @if (session('success'))
✅ {{ session('success') }}
@endif - @if (session('ops_success')) -
- {{ session('ops_success') }} -
- @endif
@@ -53,78 +47,4 @@
- - {{-- 运维工具(仅 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 837e634..d285711 100644 --- a/routes/web.php +++ b/routes/web.php @@ -274,10 +274,11 @@ Route::middleware(['chat.auth', 'chat.has_position'])->prefix('admin')->name('ad 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('/ops', [\App\Http\Controllers\Admin\OpsController::class, 'index'])->name('ops.index'); + Route::post('/ops/clear-cache', [\App\Http\Controllers\Admin\OpsController::class, 'clearCache'])->name('ops.clear-cache'); + Route::post('/ops/clear-routes', [\App\Http\Controllers\Admin\OpsController::class, 'clearRoutes'])->name('ops.clear-routes'); + Route::post('/ops/clear-views', [\App\Http\Controllers\Admin\OpsController::class, 'clearViews'])->name('ops.clear-views'); + Route::post('/ops/clear-room-online', [\App\Http\Controllers\Admin\OpsController::class, 'clearRoomOnline'])->name('ops.clear-room-online'); // 房间管理(含新增/编辑/删除) Route::get('/rooms', [\App\Http\Controllers\Admin\RoomManagerController::class, 'index'])->name('rooms.index');