Website đặt sân cầu lông với giao diện màu vàng nhạt và xanh lá đặc trưng của cầu lông, responsive trên mọi thiết bị.
- Java Spring Boot 4.0.1 với Java 21
- PostgreSQL - Database
- Spring Security + JWT - Authentication
- Spring Mail - Gửi email thông báo
- JPA/Hibernate - ORM
- VueJS 3 với Composition API
- Vue Router - Routing
- Pinia - State management
- Axios - HTTP client
- Vite - Build tool
# MacOS với Homebrew
brew install postgresql@16
brew services start postgresql@16
# Tạo database
psql postgres
CREATE DATABASE badminton_booking;
\qChạy script trong file badminton_booking_database_design.txt để tạo bảng:
psql -U postgres -d badminton_booking -f badminton_booking_database_design.txtSửa file src/main/resources/application.yaml:
- Đổi username/password PostgreSQL nếu cần
- Cấu hình email (Gmail):
- Bật 2-Step Verification trong Google Account
- Tạo App Password tại: https://myaccount.google.com/apppasswords
- Cập nhật
spring.mail.usernamevàspring.mail.password
# Cài dependencies và chạy
./mvnw clean install
./mvnw spring-boot:runBackend sẽ chạy tại: http://localhost:8080
cd frontend
npm install
npm run devFrontend sẽ chạy tại: http://localhost:5173
Admin:
- Email:
admin@badminton.com - Password:
Admin@123
- ✅ Đăng ký, đăng nhập
- ✅ Xem danh sách sân
- ✅ Đặt sân qua lịch tuần (giống Google Calendar)
- ✅ Xem lịch đặt của mình
- ✅ Cập nhật thông tin tài khoản
- ✅ Đổi mật khẩu
- ✅ Xem danh sách đơn đặt sân chờ xác nhận
- ✅ Duyệt/Từ chối đơn đặt sân
- ✅ Nhận thông báo email khi có đơn mới
- ✅ Gửi email xác nhận cho khách hàng
- 🎨 Màu sắc: Vàng nhạt (#FFD700, #FFF8DC) và Xanh lá (#32CD32, #228B22)
- 📱 Responsive: Hoạt động tốt trên desktop, tablet và mobile
- 📅 Lịch đặt sân: Giao diện lịch tuần với time slots từ 6h-22h
- ✨ Hiệu ứng: Smooth transitions, hover effects
- roles - Vai trò (ADMIN, USER)
- users - Người dùng
- courts - Sân cầu lông (2 sân)
- bookings - Đơn đặt sân
- notifications - Thông báo
PENDING- Chờ xác nhậnAPPROVED- Đã xác nhậnREJECTED- Bị từ chối
POST /api/auth/register- Đăng kýPOST /api/auth/login- Đăng nhậpGET /api/auth/me- Thông tin user hiện tạiPUT /api/auth/profile- Cập nhật thông tinPUT /api/auth/change-password- Đổi mật khẩu
GET /api/courts/list- Danh sách sân (public)GET /api/courts/{id}- Chi tiết sân
POST /api/bookings- Tạo đơn đặt sânGET /api/bookings/weekly?startDate&endDate- Lịch tuầnGET /api/bookings/court/{courtId}/weekly?startDate&endDate- Lịch tuần theo sânGET /api/bookings/my-bookings- Đơn của tôi
GET /api/admin/bookings/pending- Đơn chờ xác nhậnPUT /api/admin/bookings/{id}/approve- Duyệt đơnPUT /api/admin/bookings/{id}/reject- Từ chối đơn
GET /api/notifications- Danh sách thông báoGET /api/notifications/unread- Thông báo chưa đọcPUT /api/notifications/{id}/read- Đánh dấu đã đọcPUT /api/notifications/read-all- Đánh dấu tất cả đã đọc
- Email: Để tính năng email hoạt động, cần cấu hình Gmail App Password
- Database: Constraint
no_overlap_bookingngăn đặt trùng giờ cùng sân - JWT: Token có hiệu lực 24 giờ
- CORS: Đã cấu hình cho phép frontend chạy trên port 5173
# Kiểm tra PostgreSQL đang chạy
brew services list
# Kiểm tra connection
psql -U postgres -d badminton_booking- Kiểm tra đã bật 2-Step Verification
- Tạo App Password mới
- Cập nhật đúng email và app password trong application.yaml
- Kiểm tra backend đang chạy tại port 8080
- Kiểm tra CORS trong SecurityConfig
Có thể mở rộng thêm:
- Thanh toán online
- WebSocket cho real-time notifications
- Admin quản lý sân, giá cả
- Thống kê, báo cáo
- Mobile app với React Native/Flutter