From aad799d29f92fefe54a59f330c1c267c71f93c99 Mon Sep 17 00:00:00 2001 From: "m.razaghi" Date: Mon, 3 Aug 2026 17:26:15 +0330 Subject: [PATCH] Updated dashboard --- .../Controllers/Admin/DashboardController.php | 59 +++++ .../views/admin/dashboard/index.blade.php | 224 ++++++++++++++++++ routes/web.php | 4 + 3 files changed, 287 insertions(+) create mode 100644 app/Http/Controllers/Admin/DashboardController.php create mode 100644 resources/views/admin/dashboard/index.blade.php 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') + + +
+
+
+
+
+
+

کل کاربران

+

{{ number_format($totalUsers) }}

+
+
+ +
+
+
+
+
+ +
+
+
+
+
+

اشتراک‌های فعال (پولی)

+

{{ number_format($paidSubscribers) }}

+
+
+ +
+
+
+
+
+ +
+
+
+
+
+

اشتراک‌های فعال (رایگان)

+

{{ number_format($freeSubscribers) }}

+
+
+ +
+
+
+
+
+
+ + +
+ +
+
+
+

ثبت‌نام کاربران جدید (۷ روز گذشته)

+
+
+
+
+ + +
+
+
+

اشتراک‌های ثبت شده (۷ روز گذشته)

+
+
+
+
+
+ + +
+ +
+
+
+

آخرین تیکت‌ها

+
+ + + + + + + + + + + @forelse($recentTickets as $ticket) + + + + + + + @empty + + @endforelse + +
کاربرموضوعوضعیتمشاهده
{{ optional($ticket->user)->mobile ?? 'ناشناس' }}{{ Str::limit($ticket->subject, 30) }} + @if($ticket->status === 'open' || $ticket->status === 'user_reply') + نیاز به پاسخ + @else + پاسخ داده شده + @endif + مشاهده
تیکتی وجود ندارد
+
+
+
+
+ + +
+
+
+

آخرین پیشنهادات

+
+ + + + + + + + + + @forelse($recentSuggestions as $suggestion) + + + + + + @empty + + @endforelse + +
کاربرپیشنهادتاریخ ثبت
{{ optional($suggestion->user)->mobile ?? 'ناشناس' }}{{ Str::limit($suggestion->text, 40) }}{{ $suggestion->created_at->format('Y/m/d H:i') }}
پیشنهادی وجود ندارد
+
+
+
+
+
+ +@endsection + +@section('scripts') + + +@endsection diff --git a/routes/web.php b/routes/web.php index 2f6fbb0..67bfbf1 100644 --- a/routes/web.php +++ b/routes/web.php @@ -30,6 +30,7 @@ use App\Http\Controllers\Admin\VolumController; use App\Http\Controllers\api\PayController; use Illuminate\Support\Facades\Route; use App\Http\Controllers\Admin\TicketController; +use App\Http\Controllers\Admin\DashboardController; Route::get('payment/callback', [PayController::class, 'callback']); Route::middleware(['auth', config('jetstream.auth_session')])->group(function () { @@ -65,4 +66,7 @@ Route::middleware(['auth', config('jetstream.auth_session')])->group(function () Route::get('tickets/{ticket}', [TicketController::class, 'show'])->name('tickets.show'); Route::post('tickets/{ticket}/reply', [TicketController::class, 'reply'])->name('tickets.reply'); Route::post('tickets/{ticket}/close', [TicketController::class, 'close'])->name('tickets.close'); + + + Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard'); });