Вот общий план, как можно реализовать компонент бронирования в ДСТ Мед:
Backend1. Модель бронирования:
class Booking extends Model {
protected $fillable = ['doctor_id', 'user_id', 'status', 'appointment_time'];
public function doctor() {
return $this->belongsTo(Doctor::class);
}
public function user() {
return $this->belongsTo(User::class);
}
}
1. Контроллер бронирования:
class BookingController extends Controller {
public function create(Request $request) {
$booking = Booking::create([
'doctor_id' => $request->doctor_id,
'user_id' => $request->user_id,
'status' => 'pending',
'appointment_time' => $request->appointment_time,
]);
return response()->json($booking);
}
public function updateStatus(Request $request, $id) {
$booking = Booking::find($id);
$booking->status = $request->status;
$booking->save();
return response()->json($booking);
}
public function index() {
$bookings = Booking::with('doctor', 'user')->get();
return response()->json($bookings);
}
}
1. Маршруты:
Route::post('/bookings', [BookingController::class, 'create']);
Route::put('/bookings/{id}/status', [BookingController::class, 'updateStatus']);
Route::get('/bookings', [BookingController::class, 'index']);
Frontend1. Форма бронирования:
<form id="bookingForm">
<input type="hidden" name="doctor_id" value="{{ doctor.id }}">
<input type="hidden" name="user_id" value="{{ user.id }}">
<input type="datetime-local" name="appointment_time" required>
<button type="submit">Забронировать</button>
</form>
<script>
document.getElementById('bookingForm').addEventListener('submit', function(e) {
e.preventDefault();
const formData = new FormData(this);
fetch('/bookings', {
method: 'POST',
body: formData
}).then(response => response.json())
.then(data => {
alert('Бронирование успешно создано!');
});
});
</script>
1. Админка для управления бронированиями:
<table id="bookingsTable">
<thead>
<tr>
<th>Врач</th>
<th>Пациент</th>
<th>Время</th>
<th>Статус</th>
<th>Действия</th>
</tr>
</thead>
<tbody>
<!-- Здесь будут строки с бронированиями -->
</tbody>
</table>
<script>
function loadBookings() {
fetch('/bookings')
.then(response => response.json())
.then(data => {
const tableBody = document.querySelector('#bookingsTable tbody');
tableBody.innerHTML = '';
data.forEach(booking => {
const row = document.createElement('tr');
row.innerHTML = `
<td>${booking.doctor.name}</td>
<td>${booking.user.name}</td>
<td>${booking.appointment_time}</td>
<td>${booking.status}</td>
<td>
<select onchange="updateStatus(${booking.id}, this.value)">
<option value="pending" ${booking.status === 'pending' ? 'selected' : ''}>В ожидании</option>
<option value="accepted" ${booking.status === 'accepted' ? 'selected' : ''}>Принято</option>
<option value="rejected" ${booking.status === 'rejected' ? 'selected' : ''}>Отказано</option>
</select>
</td>
`;
tableBody.appendChild(row);
});
});
}
function updateStatus(id, status) {
fetch(`/bookings/${id}/status`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ status })
}).then(response => response.json())
.then(data => {
alert('Статус обновлен!');
loadBookings();
});
}
loadBookings();
</script>
База данных1. Миграция для таблицы бронирований:
Schema::create('bookings', function (Blueprint $table) {
$table->id();
$table->foreignId('doctor_id')->constrained();
$table->foreignId('user_id')->constrained();
$table->string('status');
$table->timestamp('appointment_time');
$table->timestamps();
});
Этот пример демонстрирует базовую реализацию компонента бронирования. Вы можете адаптировать его под вашу конкретную архитектуру и требования.