diff --git a/package.json b/package.json index d4442d5..e4f5c7e 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "dependencies": { "@tailwindcss/vite": "^4.3.0", "axios": "^1.17.0", + "lucide-react": "^1.18.0", "react": "^19.2.6", "react-dom": "^19.2.6", "react-icons": "^5.6.0", diff --git a/src/pages/home.page.tsx b/src/pages/home.page.tsx index 90ab78e..1d253de 100644 --- a/src/pages/home.page.tsx +++ b/src/pages/home.page.tsx @@ -1,47 +1,538 @@ import { ThemeToggle } from "@/modules/theme-changer/ui/Theme.toggle"; import { useNavigate } from "react-router-dom"; import { useAuth } from "@/modules/auth/hooks/useAuth"; +import { authService } from "@/modules/auth/api/auth.service"; +import { + Shield, + Users, + Bot, + Settings, + Activity, + LogOut, + ChevronRight, + Zap, + Lock, + Cloud, + TrendingUp, + Bell, + Server, + Sparkles, + AlertCircle, + CheckCircle, + Clock, +} from "lucide-react"; export const HomePage = () => { const navigate = useNavigate(); const { logout } = useAuth(); + const organization = authService.getCurrentOrganization(); + const authStorage = localStorage.getItem("auth-storage"); + const user = authStorage ? JSON.parse(authStorage).state?.user : null; + + const stats = [ + { label: "Активные агенты", value: "12", change: "+2", icon: Server }, + { label: "Заблокировано IP", value: "1,284", change: "+128", icon: Shield }, + { label: "Активных правил", value: "47", change: "+5", icon: Lock }, + { + label: "Атак предотвращено", + value: "3,721", + change: "+342", + icon: TrendingUp, + }, + ]; + + const recentActivities = [ + { + id: 1, + type: "attack", + message: "Обнаружена brute-force атака с IP 192.168.1.45", + time: "2 минуты назад", + severity: "high", + }, + { + id: 2, + type: "rule", + message: "Новое правило фильтрации добавлено администратором", + time: "15 минут назад", + severity: "info", + }, + { + id: 3, + type: "agent", + message: "Агент на сервере web-01 успешно обновлен", + time: "1 час назад", + severity: "success", + }, + { + id: 4, + type: "ai", + message: "AI предложил новые правила для обнаружения ботов", + time: "3 часа назад", + severity: "info", + }, + ]; + + const quickActions = [ + { + name: "IPS Агенты", + icon: Server, + path: "/agents", + description: "Управление агентами", + color: "#6366f1", + }, + { + name: "Правила", + icon: Shield, + path: "/rules", + description: "Правила фильтрации", + color: "#22c55e", + }, + { + name: "AI Аналитика", + icon: Bot, + path: "/ai-analytics", + description: "Анализ логов", + color: "#8b5cf6", + }, + { + name: "Команда", + icon: Users, + path: "/organization", + description: "Управление доступом", + color: "#f59e0b", + }, + ]; + + const getSeverityStyles = (severity: string) => { + switch (severity) { + case "high": + return { + bg: "#ef444410", + border: "#ef4444", + icon: AlertCircle, + text: "#ef4444", + }; + case "success": + return { + bg: "#22c55e10", + border: "#22c55e", + icon: CheckCircle, + text: "#22c55e", + }; + default: + return { + bg: "#6366f110", + border: "#6366f1", + icon: Sparkles, + text: "#6366f1", + }; + } + }; return (
-
- -
- - -
-
+ {/* Header */} +
+
+
+ {/* Logo */} +
+
+ +
+
+

+ IPS Manager +

+ {organization && ( +

+ {organization.name} +

+ )} +
+
-
-

- Добро пожаловать в IPS Manager -

-
+ {/* Right section */} +
+ + +
+
+ {user?.first_name?.[0]} + {user?.last_name?.[0]} +
+
+

+ {user?.first_name} {user?.last_name} +

+

+ Администратор +

+
+
+ +
+
+
+
+ +
+ {/* Welcome Section */} +
+
+
+
+

+ Добро пожаловать, {user?.first_name || "Администратор"}! +

+

+ Система IPS мониторинга и защиты +

+
+ + + Все системы работают стабильно + +
+
+
+ +
+
+
+
+ + {/* Stats Grid */} +
+ {stats.map((stat, index) => { + const Icon = stat.icon; + return ( +
+
+
+ +
+ + {stat.change} + +
+

+ {stat.value} +

+

+ {stat.label} +

+
+ ); + })} +
+ +
+ {/* Quick Actions */} +
+
+

+ Быстрый доступ +

+
+ {quickActions.map((action, index) => { + const Icon = action.icon; + return ( + + ); + })} +
+
+
+ + {/* Recent Activity */} +
+
+

+ Последние события +

+ +
+
+ {recentActivities.map((activity) => { + const severityStyles = getSeverityStyles(activity.severity); + const Icon = severityStyles.icon; + return ( +
+
+
+ +
+
+

+ {activity.message} +

+
+ +

+ {activity.time} +

+
+
+
+
+ ); + })} +
+ +
+
+ + {/* AI Insights */} +
+
+
+
+ +
+
+

+ AI Аналитика +

+

+ Новые предложения на основе анализа логов +

+
+
+ +
+
+
+

+ 🔍 Обнаружена аномалия +

+

+ Повышенная активность с IP-адресов из диапазона 185.xxx.xx.xx +

+
+
+

+ 💡 Предложено правил +

+

+ AI предлагает 3 новых правила для блокировки бот-сканеров +

+
+
+

+ ⚡ Оптимизация +

+

+ Рекомендуется обновить 5 существующих правил для повышения + эффективности +

+
+
+
+
); }; diff --git a/yarn.lock b/yarn.lock index 408b0ad..3106b18 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1284,6 +1284,11 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lucide-react@^1.18.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-1.18.0.tgz#d1b8754d9c427061261c6a6a0b7fa6ecda36c84f" + integrity sha512-LZDb7H/0YfM+RJncD0hDQRCAu+vSGODqpe35TuVI8EuXaRjkczbsx7p8dY4J87F/MUSj6bpYqeI8nw8qXaAdmA== + magic-string@^0.30.21: version "0.30.21" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91"