Speed up dashboard load time

This commit is contained in:
Julian Prieber 2024-12-13 20:02:14 +01:00
parent 3019efef0d
commit ab8a660195
4 changed files with 291 additions and 210 deletions

View File

@ -34,22 +34,14 @@ class AdminController extends Controller
//Statistics of the number of clicks and links
public function index()
{
$userId = Auth::user()->id;
$littlelink_name = Auth::user()->littlelink_name;
return view('panel/index');
}
$links = Link::where('user_id', $userId)->count();
$clicks = Link::where('user_id', $userId)->sum('click_number');
$userNumber = User::count();
$siteLinks = Link::count();
$siteClicks = Link::sum('click_number');
$lastMonthCount = User::where('created_at', '>=', Carbon::now()->subDays(30))->count();
$lastWeekCount = User::where('created_at', '>=', Carbon::now()->subDays(7))->count();
$last24HrsCount = User::where('created_at', '>=', Carbon::now()->subHours(24))->count();
$updatedLast30DaysCount = User::where('updated_at', '>=', Carbon::now()->subDays(30))->count();
$updatedLast7DaysCount = User::where('updated_at', '>=', Carbon::now()->subDays(7))->count();
$updatedLast24HrsCount = User::where('updated_at', '>=', Carbon::now()->subHours(24))->count();
public function stats()
{
$user = Auth::user();
$userId = $user->id;
$littlelink_name = $user->littlelink_name;
$topLinks = Link::where('user_id', $userId)
->whereNotNull('link')
@ -58,34 +50,62 @@ class AdminController extends Controller
->take(5)
->get();
$pageStats = [
'visitors' => [
'all' => visits('App\Models\User', $littlelink_name)->count(),
'day' => visits('App\Models\User', $littlelink_name)->period('day')->count(),
'week' => visits('App\Models\User', $littlelink_name)->period('week')->count(),
'month' => visits('App\Models\User', $littlelink_name)->period('month')->count(),
'year' => visits('App\Models\User', $littlelink_name)->period('year')->count(),
],
'os' => visits('App\Models\User', $littlelink_name)->operatingSystems(),
'referers' => visits('App\Models\User', $littlelink_name)->refs(),
'countries' => visits('App\Models\User', $littlelink_name)->countries(),
];
// Combine queries for user-specific data
$userLinksData = Link::where('user_id', $userId)
->selectRaw('COUNT(*) as links, SUM(click_number) as clicks')
->first();
return view('panel/index', [
'lastMonthCount' => $lastMonthCount,
'lastWeekCount' => $lastWeekCount,
'last24HrsCount' => $last24HrsCount,
'updatedLast30DaysCount' => $updatedLast30DaysCount,
'updatedLast7DaysCount' => $updatedLast7DaysCount,
'updatedLast24HrsCount' => $updatedLast24HrsCount,
'toplinks' => $topLinks,
'links' => $links,
'clicks' => $clicks,
'pageStats' => $pageStats,
'littlelink_name' => $littlelink_name,
'siteLinks' => $siteLinks,
'siteClicks' => $siteClicks,
'userNumber' => $userNumber
if ($user->role == 'admin') {
// Combine queries for site-wide data
$siteLinksData = Link::selectRaw('COUNT(*) as siteLinks, SUM(click_number) as siteClicks')
->first();
// Combine queries for user counts
$userCounts = User::selectRaw('COUNT(*) as userNumber,
SUM(CASE WHEN created_at >= ? THEN 1 ELSE 0 END) as lastMonthCount,
SUM(CASE WHEN created_at >= ? THEN 1 ELSE 0 END) as lastWeekCount,
SUM(CASE WHEN created_at >= ? THEN 1 ELSE 0 END) as last24HrsCount,
SUM(CASE WHEN updated_at >= ? THEN 1 ELSE 0 END) as updatedLast30DaysCount,
SUM(CASE WHEN updated_at >= ? THEN 1 ELSE 0 END) as updatedLast7DaysCount,
SUM(CASE WHEN updated_at >= ? THEN 1 ELSE 0 END) as updatedLast24HrsCount', [
Carbon::now()->subDays(30),
Carbon::now()->subDays(7),
Carbon::now()->subHours(24),
Carbon::now()->subDays(30),
Carbon::now()->subDays(7),
Carbon::now()->subHours(24)
])->first();
$pageStats = [
'visitors' => [
'all' => visits('App\Models\User', $littlelink_name)->count(),
'day' => visits('App\Models\User', $littlelink_name)->period('day')->count(),
'week' => visits('App\Models\User', $littlelink_name)->period('week')->count(),
'month' => visits('App\Models\User', $littlelink_name)->period('month')->count(),
'year' => visits('App\Models\User', $littlelink_name)->period('year')->count(),
],
'os' => visits('App\Models\User', $littlelink_name)->operatingSystems(),
'referers' => visits('App\Models\User', $littlelink_name)->refs(),
'countries' => visits('App\Models\User', $littlelink_name)->countries(),
];
}
return view('studio/index', [
'links' => $userLinksData->links ?? null,
'clicks' => $userLinksData->clicks ?? null,
'userNumber' => $userCounts->userNumber ?? null,
'siteLinks' => $siteLinksData->siteLinks ?? null,
'siteClicks' => $siteLinksData->siteClicks ?? null,
'lastMonthCount' => $userCounts->lastMonthCount ?? null,
'lastWeekCount' => $userCounts->lastWeekCount ?? null,
'last24HrsCount' => $userCounts->last24HrsCount ?? null,
'updatedLast30DaysCount' => $userCounts->updatedLast30DaysCount ?? null,
'updatedLast7DaysCount' => $userCounts->updatedLast7DaysCount ?? null,
'updatedLast24HrsCount' => $userCounts->updatedLast24HrsCount ?? null,
'toplinks' => $topLinks ?? [],
'pageStats' => $pageStats ?? null,
]);
}

View File

@ -2,178 +2,52 @@
@section('content')
<div class="conatiner-fluid content-inner mt-n5 py-0">
<div class="row">
<div id="site-stats" class="conatiner-fluid content-inner mt-n5 py-0">
<div class="row">
<div class="col-lg-12">
<div class="card rounded">
<div class="card-body">
<div class="row">
<div class="col-sm-12">
<div class="col-lg-12">
<div class="card rounded">
<div class="card-body">
<div class="row">
<div class="col-sm-12">
<h3 class="mb-4"><i class="bi bi-menu-up"></i> {{__('messages.Dashboard')}}</h3>
<h3 class="mb-4"><i class="bi bi-menu-up"></i> {{ __('messages.Dashboard') }}</h3>
<section class="mb-3 text-center p-4 w-full">
<div class=" d-flex">
<div class='p-2 h6'><i class="bi bi-link"></i> {{__('messages.Total Links:')}} <span class='text-primary'>{{ $links }} </span></div>
<div class='p-2 h6'><i class="bi bi-eye"></i> {{__('messages.Link Clicks:')}} <span class='text-primary'>{{ $clicks }}</span></div>
</div>
<div class='text-center w-100'>
<a href="{{ url('/studio/links') }}">{{__('messages.View/Edit Links')}}</a>
</div>
<div class='w-100 text-left'>
<h6><i class="bi bi-sort-up"></i> {{__('messages.Top Links:')}}</h6>
@php $i = 0; @endphp
<div class="bd-example" >
<ol class="list-group list-group-numbered" style="text-align: left;">
@if($toplinks == "[]")
<div class="container">
<div class="row justify-content-center mt-3">
<div class="col-6 text-center">
<p class="p-2">{{__('messages.You havent added any links yet')}}</p>
</div>
</div>
</div>
@else
@foreach($toplinks as $link)
@php $linkName = str_replace('default ','',$link->name) @endphp
@php $i++; @endphp
@if($link->name !== "phone" && $link->name !== 'heading' && $link->button_id !== 96)
<li class="list-group-item d-flex justify-content-between align-items-start">
<div class="ms-2 me-auto text-truncate">
<div class="fw-bold text-truncate">{{ $link->title }}</div>
{{ $link->link }}
</div>
<span class="badge bg-primary rounded-pill p-2">{{ $link->click_number }} - {{__('messages.clicks')}}</span>
</li>
@endif
@endforeach
@endif
</ol>
</div>
</section>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-12">
<div class="card rounded">
<div class="card-body">
<div class="row">
<div class="col-sm-12">
@if(auth()->user()->role == 'admin' && !config('linkstack.single_user_mode'))
<!-- Section: Design Block -->
<section class="mb-3 text-gray-800 text-center p-4 w-full">
<div class='font-weight-bold text-left h3'>{{__('messages.Site statistics:')}}</div><br>
<div class="d-flex flex-wrap justify-content-around">
<div class="p-2">
<h3 class="text-primary"><strong><i class="bi bi-share-fill"> {{ $siteLinks }} </i></strong></h3>
<span class="text-muted">{{__('messages.Total links')}}</span>
</div>
<div class="p-2">
<h3 class="text-primary"><strong><i class="bi bi-eye-fill"> {{ $siteClicks }} </i></strong></h3>
<span class="text-muted">{{__('messages.Total clicks')}}</span>
</div>
<div class="p-2">
<h3 class="text-primary"><strong><i class="bi bi bi-person-fill"> {{ $userNumber }}</i></strong></h3>
<span class="text-muted">{{__('messages.Total users')}}</span>
</div>
</div>
</section>
<section class="mb-3 text-center p-4 w-full">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</section>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-12">
<div class="card rounded">
<div class="card-body">
<div class="row">
<div class="col-sm-12">
@push('sidebar-stylesheets')
<script src="{{ asset('assets/js/jquery.min.js') }}"></script>
@endpush
@push('sidebar-scripts')
<script>
$(document).ready(function() {
async function fetchAndReplaceContent() {
try {
const response = await $.ajax({
url: "{{ url('dashboard/site-stats') }}",
method: 'GET',
dataType: 'html'
});
$('#site-stats').fadeOut(0, function() {
$('#site-stats').html(response).fadeIn(400);
});
} catch (error) {
console.error('Error fetching content:', error);
}
}
<!-- Section: Design Block -->
<section class="mb-3 text-gray-800 text-center p-4 w-full">
<div class='font-weight-bold text-left h3'>{{__('messages.Registrations:')}}</div><br>
<div class="d-flex flex-wrap justify-content-around">
<div class="p-2">
<h3 class="text-primary"><strong> {{ $lastMonthCount }} </i></strong></h3>
<span class="text-muted">{{__('messages.Last 30 days')}}</span>
</div>
<div class="p-2">
<h3 class="text-primary"><strong> {{ $lastWeekCount }} </i></strong></h3>
<span class="text-muted">{{__('messages.Last 7 days')}}</span>
</div>
<div class="p-2">
<h3 class="text-primary"><strong> {{ $last24HrsCount }}</i></strong></h3>
<span class="text-muted">{{__('messages.Last 24 hours')}}</span>
</div>
</div>
</section>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-12">
<div class="card rounded">
<div class="card-body">
<div class="row">
<div class="col-sm-12">
<!-- Section: Design Block -->
<section class="mb-3 text-gray-800 text-center p-4 w-full">
<div class='font-weight-bold text-left h3'>{{__('messages.Active users:')}}</div><br>
<div class="d-flex flex-wrap justify-content-around">
<div class="p-2">
<h3 class="text-primary"><strong> {{ $updatedLast30DaysCount }} </i></strong></h3>
<span class="text-muted">{{__('messages.Last 30 days')}}</span>
</div>
<div class="p-2">
<h3 class="text-primary"><strong> {{ $updatedLast7DaysCount }} </i></strong></h3>
<span class="text-muted">{{__('messages.Last 7 days')}}</span>
</div>
<div class="p-2">
<h3 class="text-primary"><strong> {{ $updatedLast24HrsCount }}</i></strong></h3>
<span class="text-muted">{{__('messages.Last 24 hours')}}</span>
</div>
</div>
</section>
</div>
</div>
</div>
</div>
</div>
@endif
</div>
</div>
@endsection
fetchAndReplaceContent();
});
</script>
@endpush
@endsection

View File

@ -0,0 +1,186 @@
<div class="row">
<div class="col-lg-12">
<div class="card rounded">
<div class="card-body">
<div class="row">
<div class="col-sm-12">
<h3 class="mb-4"><i class="bi bi-menu-up"></i> {{ __('messages.Dashboard') }}</h3>
<section class="mb-3 text-center p-4 w-full">
<div class=" d-flex">
<div class='p-2 h6'><i class="bi bi-link"></i> {{ __('messages.Total Links:') }} <span
class='text-primary'>{{ $links }} </span></div>
<div class='p-2 h6'><i class="bi bi-eye"></i> {{ __('messages.Link Clicks:') }} <span
class='text-primary'>{{ $clicks }}</span></div>
</div>
<div class='text-center w-100'>
<a href="{{ url('/studio/links') }}">{{ __('messages.View/Edit Links') }}</a>
</div>
<div class='w-100 text-left'>
<h6><i class="bi bi-sort-up"></i> {{ __('messages.Top Links:') }}</h6>
@php $i = 0; @endphp
<div class="bd-example">
<ol class="list-group list-group-numbered" style="text-align: left;">
@if ($toplinks == '[]')
<div class="container">
<div class="row justify-content-center mt-3">
<div class="col-6 text-center">
<p class="p-2">
{{ __('messages.You havent added any links yet') }}</p>
</div>
</div>
</div>
@else
@foreach ($toplinks as $link)
@php $linkName = str_replace('default ','',$link->name) @endphp
@php $i++; @endphp
@if ($link->name !== 'phone' && $link->name !== 'heading' && $link->button_id !== 96)
<li
class="list-group-item d-flex justify-content-between align-items-start">
<div class="ms-2 me-auto text-truncate">
<div class="fw-bold text-truncate">{{ $link->title }}</div>
{{ $link->link }}
</div>
<span
class="badge bg-primary rounded-pill p-2">{{ $link->click_number }}
- {{ __('messages.clicks') }}</span>
</li>
@endif
@endforeach
@endif
</ol>
</div>
</section>
</div>
</div>
</div>
</div>
</div>
@if (auth()->user()->role == 'admin' && !config('linkstack.single_user_mode'))
<div class="col-lg-12">
<div class="card rounded">
<div class="card-body">
<div class="row">
<div class="col-sm-12">
<!-- Section: Design Block -->
<section class="mb-3 text-gray-800 text-center p-4 w-full">
<div class='font-weight-bold text-left h3'>{{ __('messages.Site statistics:') }}</div>
<br>
<div class="d-flex flex-wrap justify-content-around">
<div class="p-2">
<h3 class="text-primary"><strong><i class="bi bi-share-fill">
{{ $siteLinks }} </i></strong></h3>
<span class="text-muted">{{ __('messages.Total links') }}</span>
</div>
<div class="p-2">
<h3 class="text-primary"><strong><i class="bi bi-eye-fill"> {{ $siteClicks }}
</i></strong></h3>
<span class="text-muted">{{ __('messages.Total clicks') }}</span>
</div>
<div class="p-2">
<h3 class="text-primary"><strong><i class="bi bi bi-person-fill">
{{ $userNumber }}</i></strong></h3>
<span class="text-muted">{{ __('messages.Total users') }}</span>
</div>
</div>
</section>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-12">
<div class="card rounded">
<div class="card-body">
<div class="row">
<div class="col-sm-12">
<!-- Section: Design Block -->
<section class="mb-3 text-gray-800 text-center p-4 w-full">
<div class='font-weight-bold text-left h3'>{{ __('messages.Registrations:') }}</div>
<br>
<div class="d-flex flex-wrap justify-content-around">
<div class="p-2">
<h3 class="text-primary"><strong> {{ $lastMonthCount }} </i></strong></h3>
<span class="text-muted">{{ __('messages.Last 30 days') }}</span>
</div>
<div class="p-2">
<h3 class="text-primary"><strong> {{ $lastWeekCount }} </i></strong></h3>
<span class="text-muted">{{ __('messages.Last 7 days') }}</span>
</div>
<div class="p-2">
<h3 class="text-primary"><strong> {{ $last24HrsCount }}</i></strong></h3>
<span class="text-muted">{{ __('messages.Last 24 hours') }}</span>
</div>
</div>
</section>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-12">
<div class="card rounded">
<div class="card-body">
<div class="row">
<div class="col-sm-12">
<!-- Section: Design Block -->
<section class="mb-3 text-gray-800 text-center p-4 w-full">
<div class='font-weight-bold text-left h3'>{{ __('messages.Active users:') }}</div><br>
<div class="d-flex flex-wrap justify-content-around">
<div class="p-2">
<h3 class="text-primary"><strong> {{ $updatedLast30DaysCount }} </i></strong>
</h3>
<span class="text-muted">{{ __('messages.Last 30 days') }}</span>
</div>
<div class="p-2">
<h3 class="text-primary"><strong> {{ $updatedLast7DaysCount }} </i></strong>
</h3>
<span class="text-muted">{{ __('messages.Last 7 days') }}</span>
</div>
<div class="p-2">
<h3 class="text-primary"><strong> {{ $updatedLast24HrsCount }}</i></strong>
</h3>
<span class="text-muted">{{ __('messages.Last 24 hours') }}</span>
</div>
</div>
</section>
</div>
</div>
</div>
</div>
</div>
@endif
</div>

View File

@ -99,6 +99,7 @@ Route::group([
if(env('FORCE_ROUTE_HTTPS') == 'true'){URL::forceScheme('https');}
if(isset($_COOKIE['LinkCount'])){if($_COOKIE['LinkCount'] == '20'){$LinkPage = 'showLinks20';}elseif($_COOKIE['LinkCount'] == '30'){$LinkPage = 'showLinks30';}elseif($_COOKIE['LinkCount'] == 'all'){$LinkPage = 'showLinksAll';} else {$LinkPage = 'showLinks';}} else {$LinkPage = 'showLinks';} //Shows correct link number
Route::get('/dashboard', [AdminController::class, 'index'])->name('panelIndex');
Route::get('/dashboard/site-stats', [AdminController::class, 'stats']);
Route::get('/studio/index', function(){return redirect(url('dashboard'));});
Route::get('/studio/add-link', [UserController::class, 'AddUpdateLink'])->name('showButtons');
Route::post('/studio/edit-link', [UserController::class, 'saveLink'])->name('addLink');