From 38666db71a9e8224ab5e7c0c70d1ae01e8fde23e Mon Sep 17 00:00:00 2001 From: CN-JS-HuiBai Date: Tue, 7 Apr 2026 18:13:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserOnlineDevicesController.php | 36 ++- .../resources/views/admin-index.blade.php | 281 ++++++++++++++---- plugins/UserOnlineDevices/routes/api.php | 12 +- plugins/UserOnlineDevices/routes/web.php | 1 - 4 files changed, 269 insertions(+), 61 deletions(-) diff --git a/plugins/UserOnlineDevices/Controllers/UserOnlineDevicesController.php b/plugins/UserOnlineDevices/Controllers/UserOnlineDevicesController.php index 7480606..6e6319f 100644 --- a/plugins/UserOnlineDevices/Controllers/UserOnlineDevicesController.php +++ b/plugins/UserOnlineDevices/Controllers/UserOnlineDevicesController.php @@ -18,9 +18,20 @@ class UserOnlineDevicesController extends PluginController } public function index(Request $request): View + { + $securePath = admin_setting('secure_path', admin_setting('frontend_admin_path', hash('crc32b', config('app.key')))); + + return view('UserOnlineDevices::admin-index', [ + 'apiEndpoint' => url('/api/v2/' . $securePath . '/user-online-devices/users'), + 'adminHomeUrl' => url('/' . $securePath), + 'defaultPageSize' => (int) $this->getConfig('default_page_size', 20), + ]); + } + + public function users(Request $request) { if ($error = $this->beforePluginAction()) { - abort($error[0], $error[1]); + return $this->fail($error); } $defaultPageSize = (int) $this->getConfig('default_page_size', 20); @@ -80,10 +91,18 @@ class UserOnlineDevicesController extends PluginController return (int) ($user->online_count_live ?? 0); }); - $securePath = admin_setting('secure_path', admin_setting('frontend_admin_path', hash('crc32b', config('app.key')))); - - return view('UserOnlineDevices::admin-index', [ - 'users' => $paginator, + return $this->success([ + 'list' => $paginator->getCollection()->map(function (User $user) { + return [ + 'id' => $user->id, + 'email' => $user->email, + 'subscription_name' => $user->subscription_name, + 'online_count' => (int) ($user->online_count_live ?? 0), + 'online_devices' => $user->online_devices ?? [], + 'last_online_text' => $user->last_online_text ?? '-', + 'created_text' => $user->created_text ?? '-', + ]; + })->values()->all(), 'filters' => [ 'keyword' => $keyword, 'per_page' => $pageSize, @@ -94,7 +113,12 @@ class UserOnlineDevicesController extends PluginController 'total_online_ips' => $totalOnlineIps, 'current_page' => $paginator->currentPage(), ], - 'adminHomeUrl' => url('/' . $securePath), + 'pagination' => [ + 'current' => $paginator->currentPage(), + 'last_page' => $paginator->lastPage(), + 'per_page' => $paginator->perPage(), + 'total' => $paginator->total(), + ], ]); } diff --git a/plugins/UserOnlineDevices/resources/views/admin-index.blade.php b/plugins/UserOnlineDevices/resources/views/admin-index.blade.php index 40680ea..fca3c72 100644 --- a/plugins/UserOnlineDevices/resources/views/admin-index.blade.php +++ b/plugins/UserOnlineDevices/resources/views/admin-index.blade.php @@ -274,44 +274,46 @@
Xboard Admin Plugin

All Users Online IP Monitor

- This plugin page is rendered on the server side for administrators. It reads live device state from Xboard nodes and shows each user's current online IP count and active IP list without relying on browser-stored admin tokens. + This page is for Xboard administrators. It reads the current admin token from Xboard browser storage, then loads live device state from Xboard nodes and shows each user's current online IP count and active IP list.
+ +
Users On Current Page
-
{{ $summary['page_users'] }}
+
0
Rows currently displayed after filtering
Users With Online IP
-
{{ $summary['users_with_online_ip'] }}
+
0
Users on this page whose live IP count is greater than zero
Total Online IP Count
-
{{ $summary['total_online_ips'] }}
+
0
Sum of all active IPs on the current page
Current Page
-
{{ $summary['current_page'] }}
-
Page {{ $users->currentPage() }} of {{ $users->lastPage() }}
+
1
+
Page 1 of 1
-
- - + - - Reset + + Back Admin -
+
@@ -327,55 +329,228 @@ Created - - @forelse ($users as $user) - - {{ $user->id }} - {{ $user->email }} - {{ $user->subscription_name }} - - - {{ $user->online_count_live ?? 0 }} - - - - @if (!empty($user->online_devices)) -
- @foreach ($user->online_devices as $ip) - {{ $ip }} - @endforeach -
- @else - No active IP - @endif - - {{ $user->last_online_text }} - {{ $user->created_text }} - - @empty - - -
No users found for the current filter.
- - - @endforelse - +
+ + diff --git a/plugins/UserOnlineDevices/routes/api.php b/plugins/UserOnlineDevices/routes/api.php index 45fa8e8..dc00fa3 100644 --- a/plugins/UserOnlineDevices/routes/api.php +++ b/plugins/UserOnlineDevices/routes/api.php @@ -1,3 +1,13 @@ 'api/v2/' . $securePath . '/user-online-devices', + 'middleware' => ['admin'], +], function () { + Route::get('/users', [UserOnlineDevicesController::class, 'users']); +}); diff --git a/plugins/UserOnlineDevices/routes/web.php b/plugins/UserOnlineDevices/routes/web.php index 50e1618..4ab96c2 100644 --- a/plugins/UserOnlineDevices/routes/web.php +++ b/plugins/UserOnlineDevices/routes/web.php @@ -7,7 +7,6 @@ $securePath = admin_setting('secure_path', admin_setting('frontend_admin_path', Route::group([ 'prefix' => $securePath, - 'middleware' => ['admin'], ], function () { Route::get('/user-online-devices', [UserOnlineDevicesController::class, 'index']); });