From d4cabb23b7a7868b56fc68b2be627bf36906a906 Mon Sep 17 00:00:00 2001 From: "m.zargarov" <m.zargarov@framework.team> Date: Mon, 24 Jun 2024 00:51:05 +0400 Subject: [PATCH] Fix --- app/Http/Controllers/GradeController.php | 12 +++- app/Http/Controllers/LessonController.php | 5 +- app/Http/Middleware/TeacherAction.php | 4 +- app/Policies/LessonPolicy.php | 6 +- app/Policies/StudentPolicy.php | 8 +-- app/Services/FileService.php | 20 +++++++ app/Services/GradeService.php | 23 ++++++++ app/Services/LessonService.php | 23 ++++++++ resources/views/grade-lesson/form.blade.php | 4 +- resources/views/grade-lesson/index.blade.php | 4 +- resources/views/grades/index.blade.php | 35 ++++++++---- .../views/grades/list-students.blade.php | 56 +++++++++++++++++++ resources/views/grades/show.blade.php | 32 ++++++----- resources/views/layouts/navigation.blade.php | 4 +- resources/views/students/index.blade.php | 42 +++++++++----- routes/web.php | 1 + 16 files changed, 220 insertions(+), 59 deletions(-) create mode 100644 app/Services/GradeService.php create mode 100644 app/Services/LessonService.php create mode 100644 resources/views/grades/list-students.blade.php diff --git a/app/Http/Controllers/GradeController.php b/app/Http/Controllers/GradeController.php index 13f4f72..542e934 100644 --- a/app/Http/Controllers/GradeController.php +++ b/app/Http/Controllers/GradeController.php @@ -4,6 +4,8 @@ namespace App\Http\Controllers; use App\Http\Requests\GradePostRequest; use App\Models\Grade; +use App\Services\FileService; +use App\Services\GradeService; use Illuminate\Http\RedirectResponse; use Illuminate\View\View; @@ -12,14 +14,14 @@ class GradeController extends Controller /** * Display a listing of the resource. */ - public function index(): View + public function index(GradeService $service): View { if(request()->user()->cannot('viewAny', Grade::class)) { abort(403); } return view('grades.index', [ - 'grades' => Grade::filter()->paginate(5)->withQueryString(), + 'grades' => $service->getGrades(), ]); } @@ -96,9 +98,13 @@ class GradeController extends Controller if(request()->user()->cannot('delete', Grade::class)) { abort(403); } - $grade->delete(); return redirect()->route('grades.index'); } + + public function listStudents(Grade $grade, FileService $fileService) + { + return $fileService->exportStudents($grade); + } } diff --git a/app/Http/Controllers/LessonController.php b/app/Http/Controllers/LessonController.php index 3d109c3..0591b6a 100644 --- a/app/Http/Controllers/LessonController.php +++ b/app/Http/Controllers/LessonController.php @@ -7,6 +7,7 @@ use App\Enums\TypeLesson; use App\Http\Requests\LessonPostRequest; use App\Models\Grade; use App\Models\Lesson; +use App\Services\LessonService; use Illuminate\Http\RedirectResponse; use Illuminate\View\View; @@ -22,14 +23,14 @@ class LessonController extends Controller /** * Display a listing of the resource. */ - public function index(Grade $grade): View + public function index(Grade $grade, LessonService $service): View { if(request()->user()->cannot('viewAny', $grade)) { abort(403); } return view('grade-lesson.index', [ - 'lessons' => $grade->lessons()->filter()->get(), + 'lessons' => $service->getLessons($grade), 'grade' => $grade, 'subjects' => $grade->subjects, ]); diff --git a/app/Http/Middleware/TeacherAction.php b/app/Http/Middleware/TeacherAction.php index d3581cf..eb62975 100644 --- a/app/Http/Middleware/TeacherAction.php +++ b/app/Http/Middleware/TeacherAction.php @@ -2,7 +2,7 @@ namespace App\Http\Middleware; -use App\Models\Student; +use App\Models\Teacher; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -17,7 +17,7 @@ class TeacherAction */ public function handle(Request $request, Closure $next): Response { - if (Auth::user()->userable_type != Student::class) { + if (Auth::user()->userable_type != Teacher::class) { abort(403); } diff --git a/app/Policies/LessonPolicy.php b/app/Policies/LessonPolicy.php index 14d8503..75d12a7 100644 --- a/app/Policies/LessonPolicy.php +++ b/app/Policies/LessonPolicy.php @@ -31,7 +31,7 @@ class LessonPolicy */ public function create(User $user): bool { - return $user->userable_type == Admin::class; + return $user->userable_type != Student::class; } /** @@ -39,7 +39,7 @@ class LessonPolicy */ public function update(User $user, Lesson $lesson): bool { - return $user->userable_type == Admin::class; + return $user->userable_type != Student::class; } /** @@ -47,6 +47,6 @@ class LessonPolicy */ public function delete(User $user, Lesson $lesson): bool { - return $user->userable_type == Admin::class; + return $user->userable_type != Student::class; } } diff --git a/app/Policies/StudentPolicy.php b/app/Policies/StudentPolicy.php index c0f2155..f5a70c9 100644 --- a/app/Policies/StudentPolicy.php +++ b/app/Policies/StudentPolicy.php @@ -21,7 +21,7 @@ class StudentPolicy */ public function view(User $user, Student $student): bool { - return $user->userable_type != Student::class; + return $user->userable_type == Admin::class; } /** @@ -29,7 +29,7 @@ class StudentPolicy */ public function create(User $user): bool { - return $user->userable_type != Admin::class; + return $user->userable_type == Admin::class; } /** @@ -37,7 +37,7 @@ class StudentPolicy */ public function update(User $user, Student $student): bool { - return $user->userable_type != Admin::class; + return $user->userable_type == Admin::class; } /** @@ -45,7 +45,7 @@ class StudentPolicy */ public function delete(User $user, Student $student): bool { - return $user->userable_type != Admin::class; + return $user->userable_type == Admin::class; } public function debts(User $user): bool diff --git a/app/Services/FileService.php b/app/Services/FileService.php index 46bd75d..beaa2d0 100644 --- a/app/Services/FileService.php +++ b/app/Services/FileService.php @@ -2,6 +2,7 @@ namespace App\Services; +use App\Models\Grade; use Barryvdh\DomPDF\Facade\Pdf; use Illuminate\Support\Facades\Auth; @@ -24,4 +25,23 @@ class FileService return Pdf::loadView('subjects.pdf', ['subjects' => $listSubjects])->download('Предметы.pdf'); } + + public function exportStudents(Grade $grade) + { + $excellentStudents = $this->getMinScore($grade, 5); + $goodStudents = $this->getMinScore($grade, 4); + + return Pdf::loadView('grades.list-students', [ + 'excellentStudents' => $excellentStudents, + 'goodStudents' => $goodStudents, + ])->download('Студенты.pdf'); + } + + public function getMinScore(Grade $grade, $minScore) + { + return $grade->students->filter(function ($student) use ($minScore) { + return $student->lessons->min('pivot.score') == $minScore; + }); + } + } diff --git a/app/Services/GradeService.php b/app/Services/GradeService.php new file mode 100644 index 0000000..78d969f --- /dev/null +++ b/app/Services/GradeService.php @@ -0,0 +1,23 @@ +<?php + +namespace App\Services; + +use App\Models\Grade; +use App\Models\Teacher; +use Illuminate\Support\Facades\Auth; + +class GradeService +{ + public function getGrades() + { + if (Auth::user()->userable_type == Teacher::class) { + return Grade::join('grade_teacher', 'grade_teacher.grade_id', '=', 'grades.id') + ->where('grade_teacher.teacher_id', Auth::user()->userable_id) + ->filter() + ->paginate(5) + ->withQueryString(); + } + + return Grade::filter()->paginate(5)->withQueryString(); + } +} diff --git a/app/Services/LessonService.php b/app/Services/LessonService.php new file mode 100644 index 0000000..940faa5 --- /dev/null +++ b/app/Services/LessonService.php @@ -0,0 +1,23 @@ +<?php + +namespace App\Services; + +use App\Models\Grade; +use App\Models\Teacher; +use Illuminate\Support\Facades\Auth; + +class LessonService +{ + public function getLessons(Grade $grade) + { + if (Auth::user()->userable_type == Teacher::class) { + return $grade + ->lessons() + ->where('teacher_id', Auth::user()->userable_id) + ->filter() + ->get(); + } + + return $grade->lessons()->filter()->get(); + } +} diff --git a/resources/views/grade-lesson/form.blade.php b/resources/views/grade-lesson/form.blade.php index 73d4340..55261b4 100644 --- a/resources/views/grade-lesson/form.blade.php +++ b/resources/views/grade-lesson/form.blade.php @@ -14,7 +14,7 @@ <select id="type" name="type" class="form-select" required> <option value="">Выберите тип деятельности</option> @foreach($types as $type) - <option value="{{ $type }}" {{ isset($lesson) && $lesson->type == $type ? 'selected' : old('type') }}> + <option value="{{ $type }}" {{ isset($lesson) && $lesson->type == $type->value ? 'selected' : old('type') }}> {{ $type }} </option> @endforeach @@ -36,7 +36,7 @@ <textarea class="form-control" id="description" name="description" rows="5" >{{ isset($lesson) ? $lesson->description : old('description') }}</textarea> </div> <div class="mb-3"> - <label for="lesson_date" class="form-label">Дата рождения:</label> + <label for="lesson_date" class="form-label">Дата занятия:</label> <input type="date" id="lesson_date" name="lesson_date" class="form-control" value="{{ isset($lesson) ? $lesson->lesson_date : old('lesson_date') }}" required> </div> <input type="hidden" name="grade_id" value="{{ $grade->id }}"> diff --git a/resources/views/grade-lesson/index.blade.php b/resources/views/grade-lesson/index.blade.php index bddb287..a34964b 100644 --- a/resources/views/grade-lesson/index.blade.php +++ b/resources/views/grade-lesson/index.blade.php @@ -1,4 +1,4 @@ -`@extends('layouts.application') +@extends('layouts.application') @section('content') <div class="container col-md-5"> @@ -53,5 +53,3 @@ </div> </div> @endsection - -` diff --git a/resources/views/grades/index.blade.php b/resources/views/grades/index.blade.php index 23861b6..26d7fde 100644 --- a/resources/views/grades/index.blade.php +++ b/resources/views/grades/index.blade.php @@ -43,17 +43,26 @@ </td> <td> <div> - <a href="{{ route('grades.edit', $grade) }}" class="btn btn-warning">Редактировать</a> + <a href="{{ route('list-students', $grade) }}" class="btn btn-info">Списки учеников</a> </div> </td> - <td> - <form action="{{ route('grades.destroy', $grade) }}" method="POST" - style="display: inline-block;"> - @csrf - @method('DELETE') - <button type="submit" class="btn btn-danger">Удалить</button> - </form> - </td> + @can('update', $grade) + <td> + <div> + <a href="{{ route('grades.edit', $grade) }}" class="btn btn-warning">Редактировать</a> + </div> + </td> + @endcan + @can('delete', $grade) + <td> + <form action="{{ route('grades.destroy', $grade) }}" method="POST" + style="display: inline-block;"> + @csrf + @method('DELETE') + <button type="submit" class="btn btn-danger">Удалить</button> + </form> + </td> + @endcan </tr> @endforeach </tbody> @@ -62,9 +71,11 @@ <p>Классы отсутствуют</p> @endif </div> - <div class="card-footer"> - <a href="{{ route('grades.create') }}" class="btn btn-success">Добавить</a> - </div> + @can('create', \App\Models\Grade::class) + <div class="card-footer"> + <a href="{{ route('grades.create') }}" class="btn btn-success">Добавить</a> + </div> + @endcan <div class="card-footer">{{ $grades->links() }}</div> </div> </div> diff --git a/resources/views/grades/list-students.blade.php b/resources/views/grades/list-students.blade.php new file mode 100644 index 0000000..782020b --- /dev/null +++ b/resources/views/grades/list-students.blade.php @@ -0,0 +1,56 @@ +<!doctype html> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> + <style> + * { font-family: DejaVu Sans !important; } + table { + width: 100%; + border-collapse: collapse; + } + table, th, td { + border: 1px solid black; + } + th, td { + padding: 8px; + text-align: left; + } + th { + background-color: #f2f2f2; + } + </style> + <title>Списки студентов</title> +</head> +<body> +<h3>Список отличников</h3> +<table> + <thead> + <tr> + <th>ФИО</th> + </tr> + </thead> + <tbody> + @foreach($excellentStudents as $student) + <tr> + <td>{{ $student->fio }}</td> + </tr> + @endforeach + </tbody> +</table> +<h3>Список хорошистов</h3> +<table> + <thead> + <tr> + <th>ФИО</th> + </tr> + </thead> + <tbody> + @foreach($goodStudents as $student) + <tr> + <td>{{ $student->fio }}</td> + </tr> + @endforeach + </tbody> +</table> +</body> +</html> diff --git a/resources/views/grades/show.blade.php b/resources/views/grades/show.blade.php index dc25c85..03b66c5 100644 --- a/resources/views/grades/show.blade.php +++ b/resources/views/grades/show.blade.php @@ -10,9 +10,11 @@ <h5><strong>Название: </strong>{{ $grade->name }}</h5> </div> </div> - <div class="card-footer"> - <a href="{{ route('grades.edit', $grade) }}" class="btn btn-primary">Редактировать</a> - </div> + @can('update', $grade) + <div class="card-footer"> + <a href="{{ route('grades.edit', $grade) }}" class="btn btn-primary">Редактировать</a> + </div> + @endcan </div> <div class="card mt-4"> <div class="card-header"> @@ -38,13 +40,15 @@ <a href="{{ route('grades.subjects.journal', [$grade, $subject]) }}" class="btn btn-primary">Журнал</a> </div> </td> - <td> - <form action="{{ route('grades.subjects.destroy', [$grade, $subject]) }}" method="POST" style="display: inline-block;"> - @csrf - @method('DELETE') - <button type="submit" class="btn btn-danger">Удалить</button> - </form> - </td> + @can('delete', $grade) + <td> + <form action="{{ route('grades.subjects.destroy', [$grade, $subject]) }}" method="POST" style="display: inline-block;"> + @csrf + @method('DELETE') + <button type="submit" class="btn btn-danger">Удалить</button> + </form> + </td> + @endcan </tr> @endforeach </tbody> @@ -53,9 +57,11 @@ <p>У класса отсутствуют предметы</p> @endif </div> - <div class="card-footer"> - <a href="{{ route('grades.subjects.create', $grade) }}" class="btn btn-success">Добавить</a> - </div> + @can('create', \App\Models\Grade::class) + <div class="card-footer"> + <a href="{{ route('grades.subjects.create', $grade) }}" class="btn btn-success">Добавить</a> + </div> + @endcan </div> </div> </div> diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php index 18921fb..ad46c39 100644 --- a/resources/views/layouts/navigation.blade.php +++ b/resources/views/layouts/navigation.blade.php @@ -28,7 +28,7 @@ @can('viewAny', \App\Models\Student::class) <div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex"> <x-nav-link :href="route('students.index')" :active="request()->routeIs('students.index')"> - {{ __('Студенты') }} + {{ __('Ученики') }} </x-nav-link> </div> @endcan @@ -113,7 +113,7 @@ @can('viewAny', \App\Models\Student::class) <x-responsive-nav-link :href="route('students.index')" :active="request()->routeIs('students.index')"> - {{ __('Студенты') }} + {{ __('Ученики') }} </x-responsive-nav-link> @endcan diff --git a/resources/views/students/index.blade.php b/resources/views/students/index.blade.php index 73d5d60..e529fb3 100644 --- a/resources/views/students/index.blade.php +++ b/resources/views/students/index.blade.php @@ -24,6 +24,7 @@ <table class="table table-striped"> <thead> <th>ФИО</th> + <th>Класс</th> <th> </th> </thead> <tbody> @@ -31,21 +32,34 @@ <tr> <td class="table-text"> <div> - <a href="{{ route('students.show', $student) }}" class="btn btn-block col-8">{{ $student->fio }}</a> + @can('view', $student) + <a href="{{ route('students.show', $student) }}" class="btn btn-block col-8">{{ $student->fio }}</a> + @else + {{ $student->fio }} + @endcan </div> </td> - <td> + <td class="table-text"> <div> - <a href="{{ route('students.edit', $student) }}" class="btn btn-warning">Редактировать</a> + {{ $student->grade->name }} </div> </td> - <td> - <form action="{{ route('students.destroy', $student) }}" method="POST" style="display: inline-block;"> - @csrf - @method('DELETE') - <button type="submit" class="btn btn-danger">Удалить</button> - </form> - </td> + @can('update', $student) + <td> + <div> + <a href="{{ route('students.edit', $student) }}" class="btn btn-warning">Редактировать</a> + </div> + </td> + @endcan + @can('delete', $student) + <td> + <form action="{{ route('students.destroy', $student) }}" method="POST" style="display: inline-block;"> + @csrf + @method('DELETE') + <button type="submit" class="btn btn-danger">Удалить</button> + </form> + </td> + @endcan </tr> @endforeach </tbody> @@ -54,9 +68,11 @@ <p>Ученики остутствуют</p> @endif </div> - <div class="card-footer"> - <a href="{{ route('students.create') }}" class="btn btn-success">Добавить</a> - </div> + @can('create', \App\Models\Student::class) + <div class="card-footer"> + <a href="{{ route('students.create') }}" class="btn btn-success">Добавить</a> + </div> + @endcan <div class="card-footer">{{ $students->links() }}</div> </div> </div> diff --git a/routes/web.php b/routes/web.php index 65d291c..bf44d83 100644 --- a/routes/web.php +++ b/routes/web.php @@ -46,6 +46,7 @@ Route::middleware('auth')->group(function () { Route::get('lessons/{lesson}/scores', [ScoreController::class, 'show'])->name('lessons.scores.show'); Route::put('lessons/{lesson}/scores', [ScoreController::class, 'update'])->name('lessons.scores.update'); Route::get('grades/{grade}/subjects/{subject}/journal', [GradeSubjectController::class, 'journal'])->name('grades.subjects.journal'); + Route::get('grades/{grade}/list-students', [GradeController::class, 'listStudents'])->name('list-students'); }); Route::middleware([StudentAction::class])->group(function () {