我正在尝试创建一个功能,以方便生成考试时间表。我的课程和讲师表工作正常,但生成时间表的功能似乎不起作用。系统应该生成 pdf 格式的时间表,以便打印或下载。我尝试使用 dd() 进行调试,但没有任何效果。
这是刀片文件的内容
@extends('layouts.guest')
@include('user.sidebar')
<main class="main-content position-relative max-height-vh-100 h-100 mt-1 border-radius-lg">
@include('user.topmenu')
@if(Session::has('success'))
<div class="alert alert-success">
{{ Session::get('success') }}
</div>
@endif
@yield('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">Generate Timetable</div>
<div class="card-body">
<form action="{{ route('generate.timetable') }}" method="POST">
@csrf
@method('POST')
<div class="form-group">
<label for="start">Select Exams Start Date:</label>
<input type="date" name="start" class="form-control @error('start') is-invalid @enderror">
@error('start')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="form-group">
<label for="end">Select Exams End Date:</label>
<input type="date" name="end"
class="form-control @error('end') is-invalid @enderror">
@error('end')
<div
class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div
class="form-group">
<label for="venues">Exam Venues (separated by comma):</label>
<input type="text" name="venues" class="form-control @error('venues.*') is-invalid @enderror" data-role="tagsinput">
@error('venues.*')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="form-group">
<label for="timestart">Select Exams Start Time:</label>
<input type="time" name="timestart" class="form-control @error('timestart') is-invalid @enderror" >
@error('timestart')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="form-group">
<label for="timeend">Select Exams End Time:</label>
<input type="time" name="timeend" class="form-control @error('timeend') is-invalid @enderror">
@error('timeend')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<button type="submit" class="btn btn-primary">Generate Timetable</button>
</form>
</div>
</div>
</div>
</div>
</div>
</main>
现在这是处理它的控制器
<?php
namespace App\Http\Controllers;
use App\Models\Course;
use App\Models\User;
use App\Models\Faculty;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Session;
use PDF;
class FacultyController extends Controller
{
public function index()
{
return view('user.timetable');
}
public function generateTimetable(Request $request)
{
$request->validate([
'start' => 'required|date',
'end' => 'required|date|after:start',
'venues' => 'required|array',
'venues.*' => 'required|string',
'timestart' => 'required|date_format:H:i',
'timeend' => 'required|date_format:H:i|after:timestart',
]);
// Get the selected deadline for exams
$startDate = $request->input('start');
$endDate = $request->input('end');
$venues = $request->input('venues');
$deadline = $endDate; // Use the end date as the deadline
// Get the authenticated user
$user = auth()->user();
// Fetch all courses related to the authenticated user
$courses = Course::where('user_id', $user->id)->get();
// Generate timetable data
$timetable = [];
foreach ($courses as $course) {
// Fetch the two attached lecturers for the course
$lecturers = $course->lecturers()->take(2)->get();
// Fetch a random third lecturer from other users
$thirdLecturer = User::whereNotNull('lecturers')
->whereNotIn('id', $lecturers->pluck('id'))
->inRandomOrder()
->first();
// Attach the third lecturer to the course
$lecturers[] = $thirdLecturer;
// Generate exam date within the selected deadline
$examDate = $this->generateExamDate($startDate, $endDate);
// Generate exam time between the selected start and end time
$examTime = $this->generateExamTime($request->input('timestart'), $request->input('timeend'));
// Generate a venue for the exam
$venue = $request->input('venues')[array_rand($venues)];
// Create a timetable entry for the course
$timetableItem = [
'time' => $examTime,
'course_name' => $course->name,
'course_code' => $course->code,
'invigilators' => $lecturers->pluck('name')->implode(', '),
'venue' => $venue,
'date' => $examDate,
];
$timetable[] = $timetableItem;
}
// Store timetable data in session
Session::put('timetable', $timetable);
// Redirect to timetable-preview page
return redirect()->route('timetable-preview');
}
public function timetablePreview()
{
// Retrieve timetable data from the session
$timetable = session('timetable');
return view('user.timetable-preview', compact('timetable'));
}
private function generateExamDate($startDate, $endDate)
{
$startTimestamp = strtotime($startDate);
$endTimestamp = strtotime($endDate);
// Calculate the number of days between the start and end date
$days = ($endTimestamp - $startTimestamp) / (60 * 60 * 24);
// Generate a random date within the selected start and end date
$date = date('Y-m-d', strtotime("+$days days", $startTimestamp));
// Ensure the generated date falls on a weekday (Monday to Friday)
while (date('N', strtotime($date)) >= 6) {
$date = date('Y-m-d', strtotime("+1 day", strtotime($date)));
}
return $date;
}
private function generateExamTime($startTime, $endTime)
{
// Generate a random time between the given start and end time
$startTimestamp = strtotime($startTime);
$endTimestamp = strtotime($endTime);
$timestamp = rand($startTimestamp, $endTimestamp);
$time = date('H:i', $timestamp);
return $time;
}
}
这是路线
Route::post('generatetimetable', [FacultyController::class, 'generateTimetable'])->name('generate.timetable');
Route::get('/timetable-preview', [FacultyController::class, 'timetablePreview'])->name('timetable-preview');
为了防止页面重新加载,在函数结束时,您必须返回文件而不是路线名称
return redirect()->route('timetable-preview');