From c8efe5c942eb5679fc1d2396006141f9a74bd698 Mon Sep 17 00:00:00 2001
From: marco370 <48531002-marco370@users.noreply.replit.com>
Date: Mon, 16 Feb 2026 11:29:12 +0000
Subject: [PATCH] Improve ML stats display and add database fallback Add
backend logic for ML stats to use database when unavailable and update
frontend to show offline status.
Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 7a657272-55ba-4a79-9a2e-f1ed9bc7a528
Replit-Commit-Checkpoint-Type: intermediate_checkpoint
Replit-Commit-Event-Id: b69b4d7d-5491-401d-a003-d99b33ae655d
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/449cf7c4-c97a-45ae-8234-e5c5b8d6a84f/7a657272-55ba-4a79-9a2e-f1ed9bc7a528/MmMtYN7
---
client/src/pages/Training.tsx | 65 ++++++++++++----
replit.md | 2 +-
server/routes.ts | 140 ++++++++++++++++++++++------------
3 files changed, 140 insertions(+), 67 deletions(-)
diff --git a/client/src/pages/Training.tsx b/client/src/pages/Training.tsx
index 6571118..94e1a58 100644
--- a/client/src/pages/Training.tsx
+++ b/client/src/pages/Training.tsx
@@ -33,10 +33,13 @@ import { Input } from "@/components/ui/input";
import { Checkbox } from "@/components/ui/checkbox";
interface MLStatsResponse {
+ source?: string;
+ ml_backend_status?: string;
logs?: { total: number; last_hour: number };
- detections?: { total: number; blocked: number };
+ detections?: { total: number; blocked: number; critical?: number; unique_ips?: number };
routers?: { active: number };
latest_training?: any;
+ logs_24h?: number;
}
const trainFormSchema = z.object({
@@ -147,21 +150,43 @@ export default function TrainingPage() {
+ {/* ML Backend Status Warning */}
+ {mlStats?.ml_backend_status === "offline" && (
+
+
+
+
+
ML Backend Python offline
+
+ Le statistiche mostrate provengono dal database. Training e detection manuali non sono disponibili fino al riavvio del servizio.
+
+
+
+
+ )}
+
{/* ML Stats */}
{mlStats && (
- Log Totali
+
+ {mlStats.source === "database_fallback" ? "Log Ultime 24h" : "Log Totali"}
+
- {mlStats.logs?.total?.toLocaleString() || 0}
+ {(mlStats.source === "database_fallback"
+ ? mlStats.logs_24h
+ : mlStats.logs?.total
+ )?.toLocaleString() || 0}
-
- Ultima ora: {mlStats.logs?.last_hour?.toLocaleString() || 0}
-
+ {mlStats.source !== "database_fallback" && (
+
+ Ultima ora: {mlStats.logs?.last_hour?.toLocaleString() || 0}
+
+ )}
@@ -172,22 +197,30 @@ export default function TrainingPage() {
- {mlStats.detections?.total || 0}
+ {mlStats.detections?.total?.toLocaleString() || 0}
- Bloccati: {mlStats.detections?.blocked || 0}
+ Bloccati: {mlStats.detections?.blocked?.toLocaleString() || 0}
+ {mlStats.detections?.critical !== undefined && (
+ | Critici: {mlStats.detections.critical.toLocaleString()}
+ )}
- Router Attivi
+
+ {mlStats.source === "database_fallback" ? "IP Unici" : "Router Attivi"}
+
- {mlStats.routers?.active || 0}
+ {(mlStats.source === "database_fallback"
+ ? mlStats.detections?.unique_ips
+ : mlStats.routers?.active
+ )?.toLocaleString() || 0}
@@ -214,9 +247,9 @@ export default function TrainingPage() {