@extends('layouts.superadmin') @section('title','رادار سقراط — محاولات الدخول الفاشلة') @section('content') @php $riskBadge = function($level){ return match($level){ 'high' => 'bg-rose-500/10 text-rose-200 border-rose-400/25', 'medium' => 'bg-amber-500/10 text-amber-200 border-amber-400/25', default => 'bg-emerald-500/10 text-emerald-200 border-emerald-400/25', }; }; $statusBadge = function($status){ return match($status){ 'blocked' => 'bg-rose-500/10 text-rose-200 border-rose-400/25', 'whitelisted' => 'bg-cyan-500/10 text-cyan-200 border-cyan-400/25', 'reviewed' => 'bg-amber-500/10 text-amber-200 border-amber-400/25', default => 'bg-white/5 text-white/80 border-white/15', }; }; $viewTableUrl = request()->fullUrlWithQuery(['view'=>'table']); $viewCardsUrl = request()->fullUrlWithQuery(['view'=>'cards']); $viewGridUrl = request()->fullUrlWithQuery(['view'=>'grid']); @endphp
{{-- HERO --}}
سقراط • رادار محاولات الدخول الفاشلة • SuperAdmin

رادار محاولات الدخول

هنا ترى محاولات الدخول الفاشلة ضمن الفترة المحددة — لكن مجمّعة يوميًا (كل سطر = يوم + هدف + IP) مع IP الحقيقي (Cloudflare)، معلومات الجهاز، اسم المتصفح الحقيقي، وتصنيف خطر ملحمي يساعدك تمسك “الذيب” من أول أثر.

إجمالي المحاولات: {{ number_format($summary['total_attempts'] ?? 0) }} IPs صالحة: {{ number_format($summary['unique_ips'] ?? 0) }} High‑Risk IPs: {{ number_format($summary['high_risk_ips'] ?? 0) }} محظور: {{ number_format($summary['blocked'] ?? 0) }}
{{-- FILTER --}}
فلترة الرادار
بحث • خطر • حالة
{{-- View Mode --}}
{{-- FLASH --}} @if(session('success'))
{{ session('success') }}
@endif {{-- STATS CARDS --}}
إجمالي المحاولات
{{ number_format($summary['total_attempts'] ?? 0) }}
IPs صالحة
{{ number_format($summary['unique_ips'] ?? 0) }}
High‑Risk IPs
{{ number_format($summary['high_risk_ips'] ?? 0) }}
Targets (Login)
{{ number_format($summary['unique_targets'] ?? 0) }}
{{-- TOP REASONS + TOP IPS --}}

أعلى الأسباب

لمحة سريعة: لماذا يفشلون؟

@forelse($topReasons as $tr) {{ $reasons[$tr->reason] ?? $tr->reason }} ({{ number_format($tr->cnt) }}) @empty
@endforelse

أعلى IPs

الأكثر ضغطًا خلال الفترة.

@forelse($topIps as $ip)
{{ $ip->ip_address }}
محاولات: {{ number_format($ip->ip_attempts) }} • Targets: {{ number_format($ip->ip_targets) }}
@empty
@endforelse
{{-- LIST --}} @if($viewMode === 'table')

سجل المحاولات (مجمّع يوميًا)

كل سطر = يوم + هدف + IP… وكل يوم قصة.

النتائج: {{ number_format($rows->total()) }}
@forelse($rows as $r) @php $rowDay = data_get($r,'day'); $firstAt = data_get($r,'first_at') ?? data_get($r,'created_at'); $lastAt = data_get($r,'last_at') ?? data_get($r,'created_at'); $attemptsInDay = (int) (data_get($r,'attempts_in_day') ?? 1); $reviewId = data_get($r,'last_id') ?? data_get($r,'id'); // مهم للفورم $ipDisplay = data_get($r,'ip_display'); @endphp {{-- DAY + RANGE --}} {{-- TARGET --}} {{-- IP --}} {{-- DEVICE --}} {{-- REASON --}} {{-- ATTEMPTS --}} {{-- RISK --}} {{-- ADMIN STATUS --}} {{-- DETAILS --}} @empty @endforelse
اليوم الهدف IP الجهاز السبب محاولات Risk الإدارة تفاصيل
{{ $rowDay ? \Carbon\Carbon::parse($rowDay)->format('Y-m-d') : (\Carbon\Carbon::parse($firstAt)->format('Y-m-d')) }}
@if($firstAt && $lastAt) من {{ \Carbon\Carbon::parse($firstAt)->format('H:i') }} إلى {{ \Carbon\Carbon::parse($lastAt)->format('H:i') }} @else — @endif
{{ data_get($r,'user_name') ?: data_get($r,'login_value') }}
{{ data_get($r,'user_email') ?: (data_get($r,'login_field').' : '.data_get($r,'login_value')) }}
@if($attemptsInDay > 1)
محاولات هذا الهدف اليوم: {{ $attemptsInDay }}
@endif
{{ $ipDisplay ?: '—' }}
{{ data_get($r,'ip_country') ?: '—' }}
{{ data_get($r,'device_type') ?: '—' }}
{{ data_get($r,'browser') ?: '—' }} • {{ data_get($r,'os') ?: '—' }}
{{ $reasons[data_get($r,'reason')] ?? data_get($r,'reason') }}
{{ $attemptsInDay }}
IP اليوم: {{ (int) data_get($r,'ip_attempts',0) }} • Targets: {{ (int) data_get($r,'ip_targets',0) }} • Users: {{ (int) data_get($r,'ip_users',0) }}
{{ strtoupper((string) data_get($r,'risk_level','low')) }} {{ $statuses[data_get($r,'admin_status')] ?? data_get($r,'admin_status') }} @if(data_get($r,'admin_note'))
{{ data_get($r,'admin_note') }}
@endif
تفاصيل
UA: {{ data_get($r,'user_agent_short') ?: '—' }}
IP Real: {{ data_get($r,'ip_real') ?: '—' }}
Pseudo v4: {{ data_get($r,'ip_pseudo_v4') ?: '—' }}
محاولات هذا الهدف اليوم: {{ $attemptsInDay }}
Remaining: {{ data_get($r,'remaining_attempts') ?? '—' }}
الفترة: @if($firstAt && $lastAt) {{ \Carbon\Carbon::parse($firstAt)->format('Y-m-d H:i:s') }} → {{ \Carbon\Carbon::parse($lastAt)->format('Y-m-d H:i:s') }} @else — @endif
{{-- Admin form --}} @if($reviewId)
@csrf
@else
ملاحظة: هذا الصف “مجمّع يوميًا”، ولم يتم تمرير last_id من الكنترولر لتفعيل حفظ واجب المدير.
@endif
لا يوجد محاولات ضمن هذه الفترة.
{{ $rows->links() }}
@else {{-- Cards / Grid --}} @php $cols = $viewMode === 'grid' ? 'lg:grid-cols-3' : 'lg:grid-cols-2'; @endphp

{{ $viewMode === 'grid' ? 'عرض شبكي فاخر (مجمّع يوميًا)' : 'عرض كروت فاخر (مجمّع يوميًا)' }}

نفس البيانات… بس بحضور بصري أقوى.

النتائج: {{ number_format($rows->total()) }}
@forelse($rows as $r) @php $rowDay = data_get($r,'day'); $firstAt = data_get($r,'first_at') ?? data_get($r,'created_at'); $lastAt = data_get($r,'last_at') ?? data_get($r,'created_at'); $attemptsInDay = (int) (data_get($r,'attempts_in_day') ?? 1); $reviewId = data_get($r,'last_id') ?? data_get($r,'id'); @endphp
{{ data_get($r,'user_name') ?: data_get($r,'login_value') }}
{{ data_get($r,'user_email') ?: (data_get($r,'login_field') . ': ' . data_get($r,'login_value')) }}
IP
{{ data_get($r,'ip_display') ?: '—' }}
Device
{{ data_get($r,'device_type') ?: '—' }}
Browser/OS
{{ data_get($r,'browser') ?: '—' }} • {{ data_get($r,'os') ?: '—' }}
Attempts (Day)
{{ $attemptsInDay }}
IP اليوم: {{ (int) data_get($r,'ip_attempts',0) }}
{{ strtoupper((string) data_get($r,'risk_level','low')) }} {{ $statuses[data_get($r,'admin_status')] ?? data_get($r,'admin_status') }}
{{ $rowDay ? \Carbon\Carbon::parse($rowDay)->format('Y-m-d') : (\Carbon\Carbon::parse($firstAt)->format('Y-m-d')) }} @if($firstAt && $lastAt) • {{ \Carbon\Carbon::parse($firstAt)->format('H:i') }}-{{ \Carbon\Carbon::parse($lastAt)->format('H:i') }} @endif {{ $reasons[data_get($r,'reason')] ?? data_get($r,'reason') }}
واجب المدير
UA: {{ data_get($r,'user_agent_short') ?: '—' }}
@if($reviewId)
@csrf
@else
لم يتم تمرير last_id من الكنترولر لتفعيل الحفظ.
@endif
@empty
لا يوجد محاولات ضمن هذه الفترة.
@endforelse
{{ $rows->links() }}
@endif
@endsection