@extends('admin.layouts.app')
@section('title', 'Analitik')
@section('page-title', 'Kullanıcı Analitikleri')
@push('styles')
@endpush
@section('content')
{{-- Period seçici --}}
Dönem:
@foreach(['today'=>'Bugün','7d'=>'7 Gün','30d'=>'30 Gün','90d'=>'90 Gün'] as $key=>$lbl)
{{ $lbl }}
@endforeach
Canlı — Son güncelleme: {{ now()->format('H:i') }}
{{-- Özet kartlar --}}
{{ number_format($totalViews) }}
Sayfa Görüntüleme
@if($period === '7d' || $period === 'today')
{{ abs($viewsDelta) }}% dünden
@endif
{{ number_format($uniqueVisitors) }}
Tekil Ziyaretçi
@php
$wh = floor($watchSeconds / 3600);
$wm = floor(($watchSeconds % 3600) / 60);
@endphp
{{ $wh > 0 ? $wh.'s' : $wm.'d' }}
Toplam İzleme Süresi
{{ number_format($watchSeconds/3600, 1) }} saat
{{ number_format($aiTotal) }}
AI Sorgusu
{{ number_format($newUsers) }}
Yeni Kayıt
{{-- Görüntüleme trendi + Cihaz dağılımı --}}
Görüntüleme ve İzleme Trendi
Görüntüleme
İzleme (saat)
Cihaz Dağılımı
@php $deviceTotal = $deviceStats->sum(); @endphp
@foreach(['mobile'=>['bi-phone','var(--accent)'],'desktop'=>['bi-laptop','var(--success)'],'tablet'=>['bi-tablet','#79c0ff']] as $dv=>[$ico,$col])
@if(($cnt=$deviceStats[$dv]??0) > 0)
{{ ucfirst($dv) }}
{{ number_format($cnt) }}
@endif
@endforeach
{{-- Top anime + AI sorgular --}}
En Çok İzlenen 10 Anime
@if($topAnimes->count())
@php $maxV = $topAnimes->max('views') ?: 1; @endphp
@foreach($topAnimes as $i => $a)
{{ $i+1 }}
{{ $a['title'] }}
{{ number_format($a['views']) }}
@endforeach
@else
Bu dönemde veri yok
@endif
AI Sorgu Türleri
@php
$aiLabels = ['chat'=>'Sohbet','recommend'=>'Öneri','search'=>'Arama','episode_info'=>'Bölüm Analiz','similar'=>'Benzer'];
$aiColors = ['chat'=>'var(--accent)','recommend'=>'#a371f7','search'=>'var(--success)','episode_info'=>'#f0883e','similar'=>'#79c0ff'];
$aiTotalQ = $aiByType->sum();
@endphp
@foreach($aiByType->sortDesc() as $type => $cnt)
{{ $aiLabels[$type]??$type }}
{{ number_format($cnt) }}
{{ $aiTotalQ>0?round($cnt/$aiTotalQ*100):0 }}%
@endforeach
@if($aiByType->isEmpty())
Bu dönemde AI sorgusu yok
@endif
{{-- Saatlik dağılım --}}
Bugünkü Saatlik Görüntüleme Dağılımı
{{-- Top bölümler + Coğrafi --}}
En Çok İzlenen Bölümler (İzleme Süresi)
@if($topEpisodes->count())
| Anime | Bölüm | Oynatma | Süre | Ort. % |
@foreach($topEpisodes as $ep)
| {{ $ep['anime'] }} |
{{ $ep['label'] }} |
{{ number_format($ep['plays']) }} |
{{ $ep['hours'] }} s |
@php $pct=$ep['avg_pct']??0; @endphp
%{{ $pct }}
|
@endforeach
@else
Bu dönemde izleme verisi yok
@endif
Coğrafi Dağılım (Şehir)
@if($geoStats->count())
@php $maxGeo = $geoStats->max('cnt') ?: 1; @endphp
@foreach($geoStats as $g)
{{ $g->city }}
· {{ $g->country }}
{{ $g->cnt }}
@endforeach
@else
Coğrafi veri yok (IP geolocation bekliyor)
@endif
{{-- En aktif kullanıcılar + AI top sorular --}}
En Aktif Kullanıcılar
@if($activeUsers->count())
| # | Kullanıcı | Görüntüleme | Aktif Gün |
@foreach($activeUsers as $i => $au)
| {{ $i+1 }} |
{{ $au['user']->name }}
{{ $au['user']->email }}
|
{{ number_format($au['views']) }} |
{{ $au['days'] }} gün |
@endforeach
@else
Bu dönemde giriş yapan kullanıcı yok
@endif
Popüler AI Soruları (Sohbet)
@if($aiTopQuestions->count())
@foreach($aiTopQuestions as $q)
{{ $q->query_text }}
{{ $q->cnt }} kez soruldu
@endforeach
@else
Bu dönemde chat sorusu yok
@endif
@if($aiTopUsers->count())
AI'ı En Çok Kullananlar
@foreach($aiTopUsers as $au)
{{ $au['name'] }}
{{ $au['cnt'] }} sorgu
@endforeach
@endif
{{-- Sayfa türleri + Tarayıcılar --}}
Sayfa Türü Dağılımı
@php
$ptLabels = ['home'=>'Ana Sayfa','anime'=>'Anime Detay','player'=>'Video Player','search'=>'Arama','ai'=>'AI Hub','genre'=>'Tür','other'=>'Diğer'];
$ptColors = ['home'=>'#79c0ff','anime'=>'var(--success)','player'=>'#a371f7','search'=>'#f0883e','ai'=>'var(--accent)','genre'=>'#ffa657','other'=>'#6e7681'];
$ptTotal = $pageTypeStats->sum();
@endphp
@foreach($pageTypeStats->sortDesc() as $pt => $cnt)
{{ $ptLabels[$pt]??$pt }}
{{ number_format($cnt) }}
@endforeach
Tarayıcı Dağılımı
@php $brTotal = $browserStats->sum(); @endphp
@foreach($browserStats->sortDesc()->take(6) as $br => $cnt)
{{ $br ?: 'Diğer' }}
{{ number_format($cnt) }}
{{ $brTotal>0?round($cnt/$brTotal*100):0 }}%
@endforeach
{{-- Trafik Kaynakları --}}
Trafik Kaynakları (Referrer)
@php
$refTotal = $referrerStats->sum() + $directTraffic;
$allSources = collect(['Direkt / Boş' => $directTraffic])->merge($referrerStats)->sortDesc();
$srcColors = ['Direkt / Boş'=>'var(--text2)'];
$palette = ['var(--accent)','var(--success)','#79c0ff','#f0883e','#a371f7','#ffa657','#58a6ff','#7ee787','#ff7bc6','#d2a8ff','#ffa198','#56d364'];
$pi = 0;
foreach($referrerStats->keys() as $k) { $srcColors[$k] = $palette[$pi % count($palette)]; $pi++; }
@endphp
@if($allSources->sum() > 0)
@foreach($allSources->take(12) as $src => $cnt)
@if($src === 'Direkt / Boş')
{{ $src }}
@else
{{ $src }}
@endif
{{ number_format($cnt) }}
{{ $refTotal>0?round($cnt/$refTotal*100):0 }}%
@endforeach
@else
Bu dönemde referrer verisi yok
@endif
Kaynak Dağılımı
Toplam kayıtlı trafik: {{ number_format($refTotal) }}
Direkt: {{ $refTotal>0?round($directTraffic/$refTotal*100):0 }}% · Referral: {{ $refTotal>0?round($referrerStats->sum()/$refTotal*100):0 }}%
{{-- Son aktiviteler (canlı akış) --}}
Son Sayfa Görüntülemeleri
| Zaman | Kullanıcı | Sayfa Türü | URL | Şehir | Cihaz |
@forelse($recentViews as $rv)
| {{ $rv->created_at->diffForHumans() }} |
@if($rv->user)
{{ $rv->user->name }}
@else
Misafir
@endif
|
{{ $rv->page_type }} |
{{ $rv->url }} |
{{ $rv->city ?: '—' }} |
|
@empty
| Bu dönemde görüntüleme yok |
@endforelse
{{-- ── BOT TRAFİK PANELİ ─────────────────────────────────────────────────── --}}
🤖 Bot & Güvenlik
Son dönem
{{-- Bot özet kartları --}}
{{ number_format($botViews) }}
Bot İsteği
{{ number_format($humanViews) }}
İnsan İsteği
{{ $botRatio ?? 0 }}%
Bot Oranı
{{ $blockedIps->count() }}
Engelli IP
{{-- En çok vuran botlar --}}
Top Bot IP'leri
| IP | İstek | Durum | |
@forelse($botTopIps as $b)
{{ $b->ip }} |
{{ number_format($b->cnt) }} |
{{ $b->action }}
|
|
@empty
| Bot logu yok |
@endforelse
{{-- Bot türleri --}}
Bot Türleri
| Bot | İstek | Durum |
@forelse($botByName as $b)
| {{ $b->bot_name ?: '—' }} |
{{ number_format($b->cnt) }} |
{{ $b->action }}
|
@empty
| Kayıt yok |
@endforelse
{{-- Manuel IP Engelleme --}}
{{-- Engelli IP listesi --}}
@if($blockedIps->count())
Aktif Engeller
| IP | Sebep | Tür | Bitiş | |
@foreach($blockedIps as $bi)
{{ $bi->ip }} |
{{ $bi->reason ?: '—' }} |
{{ $bi->auto_blocked ? 'Otomatik' : 'Manuel' }} |
{{ $bi->expires_at ? \Carbon\Carbon::parse($bi->expires_at)->diffForHumans() : 'Kalıcı' }} |
|
@endforeach
@endif
{{-- ── OTURUM DETAYLARI ────────────────────────────────────────────────────── --}}
📊 Oturum Analizi
Ort. Süre: {{ gmdate('i:s', $avgSessionTime) }}
Ort. Sayfa: {{ $avgPages }}
| IP | Ülke | Cihaz | Tarayıcı |
Sayfalar | Süre | Kaynak | Bot? | Başlangıç |
@forelse($sessions as $s)
{{ $s->ip }} |
{{ $s->country ?: '—' }} |
|
{{ $s->browser ?: '—' }} |
{{ $s->pages_visited }} |
{{ gmdate('i:s', $s->total_seconds) }} |
{{ $s->referrer ? parse_url($s->referrer, PHP_URL_HOST) : 'Direkt' }} |
@if($s->is_bot)
{{ $s->bot_type }}
@else
İnsan
@endif
|
{{ \Carbon\Carbon::parse($s->started_at)->diffForHumans() }} |
@empty
| Oturum kaydı yok |
@endforelse
@endsection
@push('scripts')
@endpush