diff --git a/app/Http/Controllers/Admin/DashboardController.php b/app/Http/Controllers/Admin/DashboardController.php new file mode 100644 index 0000000..2d5c6cf --- /dev/null +++ b/app/Http/Controllers/Admin/DashboardController.php @@ -0,0 +1,59 @@ +=', now()) + ->where('is_free', false) + ->distinct('user_id') + ->count('user_id'); + + $freeSubscribers = UserSubscriber::where('expired_at', '>=', now()) + ->where('is_free', true) + ->distinct('user_id') + ->count('user_id'); + + // 2. Fetch Recent Data (Limit to 5) + $recentSuggestions = Suggestion::with('user')->latest()->take(5)->get(); + $recentTickets = Ticket::with('user')->latest('updated_at')->take(5)->get(); + + // 3. Prepare Chart Data (Last 7 Days) + $chartDates = []; + $newUsersData = []; + $paidSubsData = []; + $freeSubsData = []; + + for ($i = 6; $i >= 0; $i--) { + $date = now()->subDays($i); + $chartDates[] = $date->format('Y-m-d'); // Example: "2023-10-25" + $dbDate = $date->format('Y-m-d'); + + // Line Chart Data: New Users + $newUsersData[] = User::whereDate('created_at', $dbDate)->count(); + + // Column Chart Data: Subscriptions + $paidSubsData[] = UserSubscriber::whereDate('created_at', $dbDate)->where('is_free', false)->count(); + $freeSubsData[] = UserSubscriber::whereDate('created_at', $dbDate)->where('is_free', true)->count(); + } + + return view('admin.dashboard.index', compact( + 'totalUsers', 'paidSubscribers', 'freeSubscribers', + 'recentSuggestions', 'recentTickets', + 'chartDates', 'newUsersData', 'paidSubsData', 'freeSubsData' + )); + } +} diff --git a/resources/views/admin/dashboard/index.blade.php b/resources/views/admin/dashboard/index.blade.php new file mode 100644 index 0000000..438c1a0 --- /dev/null +++ b/resources/views/admin/dashboard/index.blade.php @@ -0,0 +1,224 @@ +@extends('admin.layouts.app') +@section('content') + + +
کل کاربران
+اشتراکهای فعال (پولی)
+اشتراکهای فعال (رایگان)
+| کاربر | +موضوع | +وضعیت | +مشاهده | +
|---|---|---|---|
| {{ optional($ticket->user)->mobile ?? 'ناشناس' }} | +{{ Str::limit($ticket->subject, 30) }} | ++ @if($ticket->status === 'open' || $ticket->status === 'user_reply') + نیاز به پاسخ + @else + پاسخ داده شده + @endif + | +مشاهده | +
| تیکتی وجود ندارد | |||
| کاربر | +پیشنهاد | +تاریخ ثبت | +
|---|---|---|
| {{ optional($suggestion->user)->mobile ?? 'ناشناس' }} | +{{ Str::limit($suggestion->text, 40) }} | +{{ $suggestion->created_at->format('Y/m/d H:i') }} | +
| پیشنهادی وجود ندارد | ||