/
Shamaeva2
/
coursework.local
Обзор
Документация
Войти
/
Shamaeva2
/
coursework.local
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/Http/Controllers/HomeController.php
146 строк
5 KB
Шамаева Виктория Сергеевна
изменение стартовой страницы
18 июн 2026, 10:37
18 июн 2026, 10:37
7d24afe
Код
Авторство
О чём код?
<?php namespace App\Http\Controllers; use App\Models\DutyPlace; use App\Models\Building; use App\Models\Classroom; use App\Models\User; use Illuminate\Http\Request; use Inertia\Inertia; use Inertia\Response; use Illuminate\Support\Facades\DB; class HomeController extends Controller { public function index(Request $request): Response { $user = $request->user(); $userRole = $user->role ?? 'guest'; // Статистика по зданиям $buildingsCount = Building::count(); $classroomsCount = Classroom::count(); $dutyPlacesCount = DutyPlace::count(); $usersCount = User::count(); // Статистика по местам дежурства $dutyPlacesByBuilding = DutyPlace::with('building') ->select('building_id', DB::raw('count(*) as total')) ->groupBy('building_id') ->get(); // Статистика по кабинетам (этажи) $classroomsByFloor = Classroom::select('floor', DB::raw('count(*) as total')) ->groupBy('floor') ->orderBy('floor') ->get(); // Статистика по крыльям $classroomsByWing = Classroom::select('wing', DB::raw('count(*) as total')) ->whereNotNull('wing') ->groupBy('wing') ->get(); // Последние добавленные места дежурства $recentDutyPlaces = DutyPlace::with('building') ->orderBy('created_at', 'desc') ->limit(5) ->get(); // Последние добавленные кабинеты $recentClassrooms = Classroom::with('building') ->orderBy('created_at', 'desc') ->limit(5) ->get(); // Данные для графиков $chartData = $this->getChartData(); return Inertia::render('Home', [ 'stats' => [ 'buildings_count' => $buildingsCount, 'classrooms_count' => $classroomsCount, 'duty_places_count' => $dutyPlacesCount, 'users_count' => $usersCount, ], 'dutyPlacesByBuilding' => $dutyPlacesByBuilding, 'classroomsByFloor' => $classroomsByFloor, 'classroomsByWing' => $classroomsByWing, 'recentDutyPlaces' => $recentDutyPlaces, 'recentClassrooms' => $recentClassrooms, 'userRole' => $userRole, 'isAdmin' => $userRole === 'admin', 'chartData' => $chartData, ]); } /** * Получить данные для графиков */ private function getChartData(): array { // Данные для круговой диаграммы - распределение мест дежурства по зданиям $dutyPlacesByBuilding = DutyPlace::with('building') ->select('building_id', DB::raw('count(*) as total')) ->groupBy('building_id') ->get() ->map(function ($item) { return [ 'name' => $item->building->name ?? 'Без здания', 'count' => $item->total, ]; }); // Данные для столбчатой диаграммы - кабинеты по этажам $classroomsByFloor = Classroom::select('floor', DB::raw('count(*) as total')) ->groupBy('floor') ->orderBy('floor') ->get() ->map(function ($item) { return [ 'floor' => $item->floor . ' этаж', 'count' => $item->total, ]; }); // Данные для линейного графика - динамика добавления кабинетов по месяцам $classroomsByMonth = Classroom::select( DB::raw('DATE_FORMAT(created_at, "%Y-%m") as month'), DB::raw('count(*) as total') ) ->where('created_at', '>=', now()->subMonths(6)) ->groupBy('month') ->orderBy('month') ->get() ->map(function ($item) { return [ 'month' => $item->month, 'count' => $item->total, ]; }); // Данные для круговой диаграммы - распределение кабинетов по крыльям $classroomsByWing = Classroom::select('wing', DB::raw('count(*) as total')) ->whereNotNull('wing') ->groupBy('wing') ->get() ->map(function ($item) { return [ 'name' => $item->wing, 'count' => $item->total, ]; }); return [ 'dutyPlacesByBuilding' => $dutyPlacesByBuilding, 'classroomsByFloor' => $classroomsByFloor, 'classroomsByMonth' => $classroomsByMonth, 'classroomsByWing' => $classroomsByWing, 'totalBuildings' => Building::count(), 'totalClassrooms' => Classroom::count(), 'totalDutyPlaces' => DutyPlace::count(), 'totalUsers' => User::count(), ]; } }