From 8d4a789e0051607ee9025f613db15396e1b2d7fc Mon Sep 17 00:00:00 2001 From: mirivlad Date: Tue, 14 Apr 2026 00:38:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(dashboard):=20=D0=B1=D0=B5=D1=81=D1=88?= =?UTF-8?q?=D0=BE=D0=B2=D0=BD=D0=BE=D0=B5=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=B1=D0=B5=D0=B7=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=86=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлен API endpoint /api/dashboard/stats - Реализована замена location.reload() на fetch() каждые 30 секунд - Добавлены ID к элементам метрик для точечного обновления - Убрано мерцание страницы при обновлении --- public/index.php | 3 ++ src/Controllers/DashboardController.php | 39 +++++++++++++++++++++++++ templates/dashboard.twig | 14 ++++----- 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/public/index.php b/public/index.php index 42fc4e6..2e304dd 100755 --- a/public/index.php +++ b/public/index.php @@ -141,6 +141,9 @@ $dashboardGroup = $app->group('', function ($group) use ($twig) { return $twig->render($response, 'dashboard.twig', $templateData); }); })->add($csrfMiddleware)->add(AuthMiddleware::class); +n// API для дашборда + = new DashboardController(); +->get('/api/dashboard/stats', [, 'getDashboardData']); // Create controllers BEFORE routes $groupController = new GroupController($twig); diff --git a/src/Controllers/DashboardController.php b/src/Controllers/DashboardController.php index 66b1621..14d1784 100755 --- a/src/Controllers/DashboardController.php +++ b/src/Controllers/DashboardController.php @@ -42,4 +42,43 @@ class DashboardController return $this->twig->render($response, 'dashboard.twig', $templateData); } + + public function getDashboardData(Request $request, Response $response, $args) + { + $servers = $this->serverModel->getServersWithStatus(); + + $result = []; + foreach ($servers as $server) { + $serverData = [ + 'id' => $server['id'], + 'status' => $server['status'], + 'updated_at' => $server['last_metrics_at'] ? date('d.m.Y H:i:s', strtotime($server['last_metrics_at'])) : 'Нет данных', + 'metrics' => [] + ]; + + if (isset($server['latest_metrics']['cpu_load'])) { + $serverData['metrics']['cpu_load'] = [ + 'value' => $server['latest_metrics']['cpu_load']['value'], + 'unit' => $server['latest_metrics']['cpu_load']['unit'] ?? '%' + ]; + } + if (isset($server['latest_metrics']['ram_used'])) { + $serverData['metrics']['ram_used'] = [ + 'value' => $server['latest_metrics']['ram_used']['value'], + 'unit' => $server['latest_metrics']['ram_used']['unit'] ?? '%' + ]; + } + $diskMetric = $server['latest_metrics']['disk_used_root'] ?? $server['latest_metrics']['disk_used'] ?? null; + if ($diskMetric) { + $serverData['metrics']['disk'] = [ + 'value' => $diskMetric['value'], + 'unit' => $diskMetric['unit'] ?? '%' + ]; + } + $result[] = $serverData; + } + + $response->getBody()->write(json_encode($result)); + return $response->withHeader('Content-Type', 'application/json'); + } } diff --git a/templates/dashboard.twig b/templates/dashboard.twig index 233acf3..5351c3c 100755 --- a/templates/dashboard.twig +++ b/templates/dashboard.twig @@ -107,7 +107,7 @@
CPU - {{ server.latest_metrics['cpu_load'].value }}{{ server.latest_metrics['cpu_load'].unit }} + {{ server.latest_metrics['cpu_load'].value }}{{ server.latest_metrics['cpu_load'].unit }}
{% set cpu_t = server.thresholds['cpu_load']|default(null) %} {% if cpu_t and server.latest_metrics['cpu_load'].value >= cpu_t.critical %} @@ -123,7 +123,7 @@ {% endif %}
@@ -133,7 +133,7 @@
RAM - {{ server.latest_metrics['ram_used'].value }}{{ server.latest_metrics['ram_used'].unit }} + {{ server.latest_metrics['ram_used'].value }}{{ server.latest_metrics['ram_used'].unit }}
{% set ram_t = server.thresholds['ram_used']|default(null) %} {% if ram_t and server.latest_metrics['ram_used'].value >= ram_t.critical %} @@ -149,7 +149,7 @@ {% endif %}
@@ -160,7 +160,7 @@
Диск (/) - {{ diskMetric.value }}{{ diskMetric.unit|default('%') }} + {{ diskMetric.value }}{{ diskMetric.unit|default('%') }}
{% set disk_t = server.thresholds['disk_used_root'] is defined ? server.thresholds['disk_used_root'] : null %} {% if disk_t and diskMetric.value >= disk_t.critical %} @@ -176,7 +176,7 @@ {% endif %}
@@ -196,7 +196,7 @@
{% if server.last_metrics_at %} - Обновлено: {{ server.last_metrics_at|date('d.m.Y H:i:s') }} + Обновлено: {{ server.last_metrics_at|date('d.m.Y H:i:s') }} {% else %} Метрики не получены {% endif %}