Appearance
ð Final Challenge: āļĢāļ°āļāļāļāļāļāļŦāđāļāļāļāļĢāļ°āļāļļāļĄ â
āļĒāļīāļāļāļĩāļāđāļ§āļĒāļāļĩāđāļāļļāļāđāļĢāļĩāļĒāļāļĢāļđāđāđāļāļ·āđāļāļŦāļēāđāļĨāļ°āļāļģ Workshop āļāļ·āđāļāļāļēāļāļāļĢāļāđāļĨāđāļ§! āļāļāļāļāļĩāđāļāļķāļāđāļ§āļĨāļēāļāļīāļŠāļđāļāļāđāļāļĩāļĄāļ·āļāļāđāļ§āļĒ "Final Project" āļāļĩāđāļāļļāļāļāđāļāļāļĨāļāļĄāļ·āļāļāļģāđāļāļ (āđāļāļĒāļāļđāļāļđāđāļĄāļ·āļāđāļŦāđāļāđāļāļĒāļāļĩāđāļŠāļļāļ)
āđāļāļāļĒāđ: āļŠāļĢāđāļēāļāļĢāļ°āļāļ "Meeting Room Booking" (āļāļāļāļŦāđāļāļāļāļĢāļ°āļāļļāļĄāļāļāļāđāļĨāļāđ)
ðŊ āļāļ§āļēāļĄāļāđāļāļāļāļēāļĢāļāļāļāļĢāļ°āļāļ (Requirements) â
1. Database Design (MySQL) â
āļāđāļāļāļĄāļĩāļāļēāļĢāļēāļāļāļĒāđāļēāļāļāđāļāļĒāļāļąāļāļāļĩāđ:
- users: āđāļāđāļāļāđāļāļĄāļđāļĨāļāļđāđāđāļāđāļāļēāļ (id, name, email)
- rooms: āđāļāđāļāļāđāļāļĄāļđāļĨāļŦāđāļāļāļāļĢāļ°āļāļļāļĄ (id, name, capacity, location)
- bookings: āđāļāđāļāļāđāļāļĄāļđāļĨāļāļēāļĢāļāļāļ (id, user_id, room_id, start_time, end_time, topic)
2. Backend API (Laravel) â
āļŠāļĢāđāļēāļ API Endpoints āļāļąāļāļāļĩāđ:
GET /api/rooms- āļāļđāļĢāļēāļĒāļāļēāļĢāļŦāđāļāļāļāļĢāļ°āļāļļāļĄāļāļąāđāļāļŦāļĄāļGET /api/bookings- āļāļđāļāļĢāļ°āļ§āļąāļāļīāļāļēāļĢāļāļāļāļāļąāđāļāļŦāļĄāļPOST /api/bookings- āļāļāļāļŦāđāļāļāļāļĢāļ°āļāļļāļĄ (āļāđāļāļāļĢāļ°āļāļļ user_id, room_id, āđāļ§āļĨāļē)DELETE /api/bookings/{id}- āļĒāļāđāļĨāļīāļāļāļēāļĢāļāļāļ
Challenge Ideas (Option āđāļŠāļĢāļīāļĄ)
- āļāđāļāļāļāļąāļāļāļēāļĢāļāļāļāļāđāļāļ (āļāđāļēāđāļ§āļĨāļēāļāļąāđāļāļŦāđāļāļāđāļĄāđāļ§āđāļēāļ āļŦāđāļēāļĄāđāļŦāđāļāļāļ)
- āļāđāļāļŦāļēāļŦāđāļāļāļ§āđāļēāļāļāļēāļĄāļāđāļ§āļāđāļ§āļĨāļēāļāļĩāđāļāļģāļŦāļāļ
3. Frontend (React) â
āļāļģāļŦāļāđāļēāđāļ§āđāļāļāļĒāđāļēāļāļāđāļāļĒ 2 āļŦāļāđāļē:
- Dashboard:
- āđāļŠāļāļāļĢāļēāļĒāļāļēāļĢāļŦāđāļāļāļāļĢāļ°āļāļļāļĄāļāļąāđāļāļŦāļĄāļ (Card)
- āđāļŠāļāļāļāļāļīāļāļīāļāļŦāļĢāļ·āļāļĢāļēāļĒāļāļēāļĢāļāļēāļĢāļāļāļāļ§āļąāļāļāļĩāđ
- Booking Form:
- āđāļĨāļ·āļāļāļŦāđāļāļ, āđāļĨāļ·āļāļāļāļđāđāļāļāļ (Dropdown), āđāļĨāļ·āļāļāđāļ§āļĨāļē
- āļāļāļāļļāđāļĄ "āļāļāļāļāļąāļāļāļĩ" āđāļĨāđāļ§āļŠāđāļāļāđāļāļĄāļđāļĨāđāļ Backend
ð āļāļąāđāļāļāļāļāļāļēāļĢāļāļģāļāļēāļāđāļāļ°āļāļģ â
- āļāļāļāđāļāļ Database: āļ§āļēāļ ER Diagram āđāļāļāļĢāļ°āļāļēāļĐāļāđāļāļ
- āļāļķāđāļāđāļāļĢāļ Laravel: āļŠāļĢāđāļēāļ Model, Migration, Controller, Route
- āļāļāļŠāļāļ API: āđāļāđ Postman āļĒāļīāļāļāļāļŠāļāļāļāļđāļ§āđāļēāļāļąāļāļāļķāļāļāđāļāļĄāļđāļĨāđāļāđāļāļĢāļīāļ
- āļāļķāđāļāđāļāļĢāļ React: āļŠāļĢāđāļēāļ Component āđāļĨāļ°āļāļąāļāļŦāļāđāļēāļāđāļ§āļĒ CSS Framework āļāļĩāđāļāļāļ
- āđāļāļ·āđāļāļĄāļāđāļ: āđāļāđ
fetchāļŦāļĢāļ·āļaxiosāļāļķāļāļāđāļāļĄāļđāļĨāļĄāļēāđāļŠāļāļ
ðĄ āđāļāđāđāļŦāđāļāļīāļāļāļķāļ (Hints) â
Migration āļŠāļģāļŦāļĢāļąāļ bookings:
php
$table->foreignId('user_id')->constrained();
$table->foreignId('room_id')->constrained();
$table->dateTime('start_time');
$table->dateTime('end_time');
$table->string('topic');Controller āļāļāļāļŦāđāļāļ:
php
public function store(Request $request) {
// āļāļĢāļ§āļāļŠāļāļāļ§āđāļēāļŦāđāļāļāļ§āđāļēāļāđāļŦāļĄ?
$exists = Booking::where('room_id', $request->room_id)
->where('start_time', '<', $request->end_time)
->where('end_time', '>', $request->start_time)
->exists();
if ($exists) {
return response()->json(['error' => 'āļŦāđāļāļāđāļĄāđāļ§āđāļēāļāđāļāļāđāļ§āļāđāļ§āļĨāļēāļāļĩāđ'], 422);
}
return Booking::create($request->all());
}āļāļāđāļŦāđāđāļāļāļāļĩāļāļąāļāļāļēāļĢāļāļģāđāļāļĢāđāļāļāļāđāļŠāđāļāļāđāļēāļĒāļāļĢāļąāļ! ð