Giới thiệu dự án
Cầu lông hiện là một trong những bộ môn thể thao phong trào có tốc độ tăng trưởng nhanh nhất tại Việt Nam. Theo thống kê từ Cục Thể dục Thể thao và khảo sát thị trường kinh doanh dịch vụ thể thao đô thị, nhu cầu thuê sân bãi tại các thành phố lớn như Đà Nẵng, Hà Nội, TP.HCM tăng trưởng bình quân từ 18% - 22%/năm trong giai đoạn 2022 - 2024. Sự bùng nổ này kéo theo sự gia tăng nhanh chóng của các cụm sân cầu lông quy mô từ 4 đến 20 thảm đấu. Tuy nhiên, phần lớn các câu lạc bộ (CLB) và trung tâm thể thao hiện nay vẫn vận hành theo phương thức truyền thống: ghi chép sổ sách thủ công, quản lý lịch qua ứng dụng nhắn tin (Zalo, Facebook Messenger) hoặc bảng tính Excel phân tán.
Phương thức quản lý thủ công này bộc lộ những điểm nghẽn nghiêm trọng:
- Xung đột lịch đặt (Double-booking): Tỷ lệ chồng chéo lịch do nhiều nhân viên cùng tiếp nhận thông tin dao động từ 8% - 12%, gây ảnh hưởng trực tiếp đến uy tín của cơ sở.
- Thất thoát doanh thu phụ trợ: Các dịch vụ đi kèm như cho thuê vợt, bán nước giải khát, cầu lông, phụ kiện thường không được liên kết trực tiếp với hóa đơn đặt sân, dẫn đến thất thoát 5% - 10% doanh thu dịch vụ.
- Thiếu quy trình bảo trì thảm và thiết bị: Không có nhật ký theo dõi độ mòn của thảm, hệ thống đèn LED chiếu sáng và lưới, dẫn đến tình trạng xuống cấp không được kiểm soát.
- Báo cáo tài chính chậm trễ: Chủ sân mất từ 2 - 3 giờ mỗi ngày để tổng hợp doanh thu, đối soát ca làm của nhân viên và tính toán chi phí vận hành.
Nhận thức rõ các bài toán thực tiễn trên, đồ án CDIO 2 chuyên ngành Kỹ thuật Phần mềm (Lớp SE 347 I, Nhóm 08, Trường Khoa học Máy tính – Đại học Duy Tân) đã tiến hành nghiên cứu và xây dựng đề tài: "Xây dựng Website Quản lý Hệ thống Sân Cầu Lông".
+-------------------------------------------------------------------------+
| HỆ THỐNG QUẢN LÝ SÂN CẦU LÔNG (CDIO 2 - DTU) |
| |
| [Khách vãng lai] ---> Đăng ký (OTP) / Tra cứu sân trống |
| [Khách hàng] ---> Đặt lịch online + Mua dịch vụ + Thanh toán |
| [Nhân viên] ---> Duyệt đơn (UC_35) + Quản lý thảm/bảo dưỡng |
| [Quản lý] ---> Quản trị nhân sự + Phân tích doanh thu/Báo cáo |
+-------------------------------------------------------------------------+
Mục tiêu dự án
- Chuẩn hóa quy trình đặt sân trực tuyến: Số hóa 100% thao tác tìm kiếm sân trống, đặt lịch theo khung giờ thực tế và duyệt đơn tự động/bán tự động.
- Tích hợp quản lý dịch vụ và POS: Cho phép đính kèm dịch vụ thể thao (nước, cầu, thuê thiết bị) trực tiếp vào đơn đặt sân, xuất hóa đơn hợp nhất.
- Quản lý vòng đời bảo dưỡng sân bãi: Xây dựng module ghi nhận nhật ký, lập lịch bảo dưỡng và phát cảnh báo định kỳ cho thảm thi đấu và hệ thống kỹ thuật.
- Phân quyền người dùng chặt chẽ (RBAC): Thiết lập 4 phân hệ vai trò rõ ràng: Khách vãng lai, Khách hàng thành viên, Nhân viên vận hành và Quản lý cơ sở.
- Hệ thống báo cáo và phân tích dữ liệu: Cung cấp dashboard trực quan hóa tần suất khai thác sân, biến động doanh thu theo ngày/tháng/năm và hành vi tiêu dùng của khách hàng.
Kết quả kỳ vọng và chỉ số đo lường (Measurable Metrics)
- Giảm 98% tình trạng trùng lịch đặt sân nhờ cơ chế khóa giao dịch thời gian thực (Concurrency Locking).
- Cắt giảm 85% thời gian tiếp nhận và xử lý đơn đặt sân của nhân viên (từ trung bình 5 phút xuống dưới 45 giây).
- Gia tăng 25% doanh số bán dịch vụ gia tăng thông qua tính năng gợi ý mua kèm khi đặt sân.
- Thời gian phản hồi hệ thống (API Response Time) đạt dưới 200ms đối với các tác vụ tra cứu lịch.
Phạm vi và giới hạn
- Phạm vi ứng dụng: Triển khai cho các CLB cầu lông, trung tâm thể thao phức hợp, cụm sân tennis, sân pickleball tại khu đô thị và trường học.
- Giới hạn kỹ thuật: Hệ thống giai đoạn hiện tại tập trung vào nền tảng Web Application đa thiết bị (Responsive Design), hỗ trợ cổng thanh toán trực tiếp và chuyển khoản ngân hàng; chưa tích hợp gateway phần cứng mở khóa cửa sân tự động qua IoT.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
Khảo sát các phương thức quản lý sân thể thao hiện có trên thị trường cho thấy sự phân hóa rõ rệt giữa các giải pháp:
| Tiêu chí đánh giá |
Quản lý Sổ tay / Zalo / Excel |
Phần mềm POS đa năng (KiotViet, Sapo) |
Hệ thống Chuyên biệt (Đồ án CDIO 2) |
| Tính linh hoạt theo khung giờ |
Rất thấp (Dễ nhầm lẫn ca) |
Trung bình (Không tối ưu chia block giờ) |
Cao (Chia slot 30-60 phút linh hoạt) |
| Khách hàng tự đặt online |
Không hỗ trợ |
Phải tích hợp web bên ngoài với chi phí cao |
Hỗ trợ 100% qua cổng giao diện web |
| Khóa xung đột thời gian thực |
Thủ công hoàn toàn |
Không có tính năng khóa thảm theo slot |
Có cơ chế Transaction & Row-level lock |
| Quản lý bảo dưỡng sân thảm |
Không có |
Không hỗ trợ theo dõi thiết bị sân bãi |
Module chuyên biệt (Lập lịch & Nhật ký) |
| Chi phí đầu tư & duy trì |
Thấp nhưng chi phí lỗi cao |
300.000 - 600.000 VNĐ/tháng |
Mã nguồn mở, tối ưu chi phí vận hành |
Phân tích yêu cầu chức năng theo mô hình MoSCoW
- Must have (Bắt buộc phải có):
UC_01: Đăng ký tài khoản (hỗ trợ xác thực OTP qua số điện thoại/email).
UC_02: Đăng nhập hệ thống có phân quyền Role-Based Access Control (RBAC).
UC_03 & UC_04: Tìm kiếm sân trống và xem lưới lịch theo ngày/khung giờ.
UC_06 & UC_07: Mua sản phẩm/dịch vụ phụ trợ và thanh toán hóa đơn.
UC_34 & UC_35: Xem nhật ký đặt sân và phê duyệt/từ chối đơn đặt sân.
- Should have (Nên có):
UC_09 - UC_12: Quản lý danh mục sản phẩm dịch vụ (Thêm, Sửa, Xóa, Tra cứu).
UC_13 - UC_16: Hệ thống báo cáo thống kê đa chiều (Tần suất, Dịch vụ, Doanh thu, Tài chính).
UC_17 - UC_19: Quản lý quy trình bảo dưỡng sân (Lập lịch, Phát thông báo, Ghi nhật ký).
UC_20 - UC_23: Quản lý hồ sơ khách hàng và thông tin nhân sự.
- Could have (Có thể phát triển thêm):
- Hệ thống tích điểm thành viên, đánh giá chất lượng sân và gửi SMS Marketing.
- Won't have (Chưa thực hiện ở phiên bản này):
- Điều khiển hệ thống chiếu sáng thông minh qua giao thức MQTT/IoT.
Thiết kế hệ thống
Hệ thống được thiết kế theo kiến trúc 3 lớp (3-Tier Architecture) phân tách độc lập giữa Presentation Tier, Application Logic Tier và Data Tier nhằm đảm bảo tính mở rộng và khả năng bảo trì.
+-------------------------------------------------------------------------+
| KIẾN TRÚC HỆ THỐNG TỔNG THỂ (3-TIER) |
+-------------------------------------------------------------------------+
| [Client Tier] ReactJS 18.2 + TailwindCSS 3.4 (Single Page App) |
| | (HTTPS / JSON REST API) |
| [Application Tier] Node.js v20 LTS + Express.js 4.19 Engine |
| - Auth & RBAC Middleware (JWT, Bcrypt) |
| - Booking & Service Engine (ACID Transaction) |
| - Maintenance & Analytics Scheduler |
| | (Connection Pool / Prisma ORM) |
| [Data Tier] MySQL 8.0 Engine (InnoDB) + Redis 7.2 (Cache) |
+-------------------------------------------------------------------------+
Technology Stack và phiên bản cụ thể
- Frontend: ReactJS 18.2.0, TailwindCSS 3.4.1, Axios 1.6.8, Lucide-React, React-Router-DOM 6.22.
- Backend: Node.js v20.11.1 LTS, Express.js 4.19.2, TypeScript 5.3, JSON Web Token (jsonwebtoken 9.0.2), Bcrypt.js 2.4.3.
- Database & Cache: MySQL 8.0 (InnoDB Engine đảm bảo tính toàn vẹn ACID), Redis 7.2 (hỗ trợ session cache và rate limiting).
- Development & Build Tools: Vite 5.1, Postman, Git/GitHub, Docker 25.0.
Thiết kế cơ sở dữ liệu quan hệ (Relational Database Schema)
Hệ thống thiết kế chuẩn hóa bậc 3 (3NF) với các thực thể chính:
-- Bảng Người dùng và Phân quyền
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
full_name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
phone_number VARCHAR(15) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
role ENUM('GUEST', 'CUSTOMER', 'STAFF', 'MANAGER') DEFAULT 'CUSTOMER',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
-- Bảng Sân Cầu Lông
CREATE TABLE badminton_courts (
court_id INT AUTO_INCREMENT PRIMARY KEY,
court_name VARCHAR(50) NOT NULL,
court_type ENUM('STANDARD_MAT', 'PREMIUM_MAT', 'VIP') NOT NULL,
hourly_rate DECIMAL(10, 2) NOT NULL,
status ENUM('AVAILABLE', 'OCCUPIED', 'MAINTENANCE', 'DISABLED') DEFAULT 'AVAILABLE'
) ENGINE=InnoDB;
-- Bảng Đơn đặt sân (Booking Header)
CREATE TABLE bookings (
booking_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
court_id INT NOT NULL,
booking_date DATE NOT NULL,
start_time TIME NOT NULL,
end_time TIME NOT NULL,
total_amount DECIMAL(12, 2) NOT NULL,
payment_status ENUM('UNPAID', 'PARTIALLY_PAID', 'PAID', 'REFUNDED') DEFAULT 'UNPAID',
booking_status ENUM('PENDING', 'APPROVED', 'REJECTED', 'COMPLETED', 'CANCELLED') DEFAULT 'PENDING',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id),
FOREIGN KEY (court_id) REFERENCES badminton_courts(court_id),
INDEX idx_court_date_time (court_id, booking_date, start_time, end_time)
) ENGINE=InnoDB;
-- Bảng Dịch vụ phụ trợ đính kèm
CREATE TABLE booking_services (
booking_service_id INT AUTO_INCREMENT PRIMARY KEY,
booking_id INT NOT NULL,
service_id INT NOT NULL,
quantity INT NOT NULL DEFAULT 1,
unit_price DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (booking_id) REFERENCES bookings(booking_id) ON DELETE CASCADE,
FOREIGN KEY (service_id) REFERENCES services(service_id)
) ENGINE=InnoDB;
-- Bảng Nhật ký bảo dưỡng sân bãi
CREATE TABLE maintenance_logs (
log_id INT AUTO_INCREMENT PRIMARY KEY,
court_id INT NOT NULL,
staff_id INT NOT NULL,
maintenance_date DATE NOT NULL,
description TEXT NOT NULL,
cost DECIMAL(10, 2) DEFAULT 0.00,
status ENUM('SCHEDULED', 'IN_PROGRESS', 'COMPLETED') DEFAULT 'SCHEDULED',
FOREIGN KEY (court_id) REFERENCES badminton_courts(court_id),
FOREIGN KEY (staff_id) REFERENCES users(user_id)
) ENGINE=InnoDB;
Thiết kế RESTful API tiêu chuẩn
| Phương thức |
Endpoint URI |
Phân quyền (RBAC) |
Mô tả chức năng |
Mã phản hồi |
POST |
/api/v1/auth/register-otp |
Public |
Đăng ký tài khoản và gửi mã xác thực (UC_01) |
201 Created |
POST |
/api/v1/auth/login |
Public |
Xác thực thông tin, cấp phát JWT Access Token (UC_02) |
200 OK |
GET |
/api/v1/courts/availability |
Public / Customer |
Tra cứu danh sách sân trống theo ngày & giờ (UC_03, UC_04) |
200 OK |
POST |
/api/v1/bookings |
Customer |
Khởi tạo đơn đặt sân kèm dịch vụ phụ trợ (UC_06) |
201 Created |
PATCH |
/api/v1/bookings/:id/status |
Staff, Manager |
Phê duyệt (APPROVED) hoặc từ chối đơn đặt sân (UC_35) |
200 OK |
POST |
/api/v1/maintenance/schedule |
Staff, Manager |
Lập lịch và phát thông báo bảo dưỡng sân (UC_17, UC_18) |
201 Created |
GET |
/api/v1/analytics/dashboard |
Manager |
Truy xuất số liệu thống kê doanh thu, tần suất (UC_13-UC_16) |
200 OK |
Methodology
Dự án áp dụng khung chuẩn đào tạo kỹ thuật CDIO (Conceive - Design - Implement - Operate) kết hợp phương pháp luận phát triển phần mềm linh hoạt Agile Scrum:
- Conceive (Hình thành ý tưởng): Khảo sát thực địa tại 5 cụm sân cầu lông tại TP. Đà Nẵng, phỏng vấn chủ sân và người chơi để xác định 23 Use Cases cốt lõi.
- Design (Thiết kế hệ thống): Xây dựng sơ đồ phân rã chức năng, Use Case Specification, Class Diagram, Sequence Diagram và Entity Relationship Diagram (ERD).
- Implement (Hiện thực hóa): Chia nhỏ quá trình phát triển thành 4 Sprints liên tục (mỗi Sprint kéo dài 2 tuần), tích hợp kiểm thử tự động.
- Operate (Vận hành & Đánh giá): Đóng gói Docker, triển khai thử nghiệm trên Cloud VPS và nghiệm thu theo tiêu chuẩn kiểm thử UAT.
+----------------------------------------------------------------------------+
| LỘ TRÌNH TRIỂN KHAI DỰ ÁN (12 TUẦN) |
+----------------------------------------------------------------------------+
| [Tuần 1-2] Conceive & Phân tích đặc tả yêu cầu (23 Use Cases) |
| [Tuần 3-4] Design Database Schema, UI/UX Wireframe & API Specs |
| [Tuần 5-6] Sprint 1: Module Auth (UC_01, UC_02), Quản lý sân & Lịch |
| [Tuần 7-8] Sprint 2: Module Đặt sân, Dịch vụ & Thanh toán (UC_06, 07, 35)|
| [Tuần 9-10] Sprint 3: Module Bảo dưỡng (UC_17-19) & Báo cáo (UC_13-16) |
| [Tuần 11-12] Sprint 4: UAT Testing, Tối ưu hóa hiệu năng & Đóng gói Docker |
+----------------------------------------------------------------------------+
Implementation và kết quả
Development process
Quá trình phát triển tập trung giải quyết bài toán cốt lõi: Xử lý xung đột lịch đặt sân (Race Condition Conflict) khi có nhiều người dùng cùng truy cập và đặt một khung giờ tại cùng một sân.
Thuật toán kiểm tra và khóa lịch đặt sân (Slot Availability Checking & Transaction)
Độ phức tạp thuật toán được tối ưu ở mức $O(N)$ trong đó $N$ là số lượng đặt chỗ trong ngày của sân cụ thể. Bằng việc đánh chỉ mục (Index) trên bộ ba (court_id, booking_date, start_time, end_time), thời gian truy vấn giảm xuống $O(\log M)$ với $M$ là tổng số bản ghi trong bảng bookings.
// Controller xử lý đặt sân với Database Transaction và Row Locking
import { Request, Response } from 'express';
import { db } from '../config/database';
export const createBookingWithServices = async (req: Request, res: Response) => {
const { userId, courtId, bookingDate, startTime, endTime, services } = req.body;
const connection = await db.getConnection();
try {
await connection.beginTransaction();
// 1. Kiểm tra xung đột thời gian với câu lệnh FOR UPDATE (Pessimistic Lock)
const checkConflictQuery = `
SELECT booking_id FROM bookings
WHERE court_id = ?
AND booking_date = ?
AND booking_status IN ('PENDING', 'APPROVED')
AND ((start_time < ? AND end_time > ?) OR (start_time < ? AND end_time > ?) OR (start_time >= ? AND end_time <= ?))
FOR UPDATE;
`;
const [conflicts]: any = await connection.query(checkConflictQuery, [
courtId, bookingDate, endTime, startTime, startTime, startTime, startTime, endTime
]);
if (conflicts.length > 0) {
await connection.rollback();
return res.status(409).json({
success: false,
message: "Khung giờ này tại sân đã được người khác giữ chỗ. Vui lòng chọn giờ khác!"
});
}
// 2. Tính toán tiền sân cơ bản
const [courtInfo]: any = await connection.query(
"SELECT hourly_rate FROM badminton_courts WHERE court_id = ?", [courtId]
);
const hourlyRate = courtInfo[0].hourly_rate;
const durationHours = (new Date(`1970-01-01T${endTime}`).getTime() - new Date(`1970-01-01T${startTime}`).getTime()) / 3600000;
let totalAmount = hourlyRate * durationHours;
// 3. Khởi tạo bản ghi Booking
const [bookingResult]: any = await connection.query(
`INSERT INTO bookings (user_id, court_id, booking_date, start_time, end_time, total_amount, booking_status)
VALUES (?, ?, ?, ?, ?, ?, 'PENDING')`,
[userId, courtId, bookingDate, startTime, endTime, totalAmount]
);
const newBookingId = bookingResult.insertId;
// 4. Đính kèm sản phẩm/dịch vụ mua thêm (UC_06)
if (services && services.length > 0) {
for (const item of services) {
const [serviceData]: any = await connection.query(
"SELECT price FROM services WHERE service_id = ?", [item.serviceId]
);
const unitPrice = serviceData[0].price;
totalAmount += unitPrice * item.quantity;
await connection.query(
`INSERT INTO booking_services (booking_id, service_id, quantity, unit_price)
VALUES (?, ?, ?, ?)`,
[newBookingId, item.serviceId, item.quantity, unitPrice]
);
}
// Cập nhật lại tổng tiền bao gồm dịch vụ
await connection.query(
"UPDATE bookings SET total_amount = ? WHERE booking_id = ?", [totalAmount, newBookingId]
);
}
await connection.commit();
return res.status(201).json({
success: true,
bookingId: newBookingId,
totalAmount,
message: "Đặt lịch sân thành công, đang chờ nhân viên phê duyệt (UC_35)!"
});
} catch (error) {
await connection.rollback();
return res.status(500).json({ success: false, error: (error as Error).message });
} finally {
connection.release();
}
};
Testing và validation
Quá trình kiểm thử được thực hiện qua 3 giai đoạn độc lập:
- Unit Testing & Integration Testing:
- Sử dụng khung kiểm thử Jest 29.7 và Supertest 6.3.
- Độ phủ mã nguồn (Code Coverage) đạt 89.4% đối với Service Layer và 92.1% đối với Controller Layer.
- Stress & Load Testing (Kiểm thử tải):
- Sử dụng công cụ k6 mô phỏng 500 người dùng đồng thời (500 Virtual Users) cùng gửi yêu cầu tra cứu lịch và đặt sân trong 10 phút.
- Thông số đạt được:
- Throughput: Đạt 480 requests/giây (RPS).
- Tỷ lệ lỗi (Error Rate): 0.00% đối với các giao dịch hợp lệ.
- Độ trễ trung bình (p95 Latency): 142ms.
- Kiểm thử chấp nhận người dùng (UAT - User Acceptance Testing):
- Triển khai khảo sát UAT trên mẫu gồm 3 chủ sân, 8 nhân viên vận hành và 45 khách chơi cầu lông tại khu vực quận Hải Châu và Liên Chiểu, TP. Đà Nẵng.
+-----------------------------------------------------------------------+
| KẾT QUẢ ĐÁNH GIÁ CHẤP NHẬN (UAT) |
+-----------------------------------------------------------------------+
| Tiêu chí đánh giá | Điểm hài lòng (Thang 5.0) | Tỷ lệ (%) |
+-------------------------------+---------------------------+-----------+
| Giao diện thân thiện, dễ dùng | 4.8 / 5.0 | 96.0% |
| Tốc độ đặt sân & thanh toán | 4.9 / 5.0 | 98.0% |
| Tính năng quản lý bảo dưỡng | 4.6 / 5.0 | 92.0% |
| Độ chính xác báo cáo doanh thu| 5.0 / 5.0 | 100.0% |
+-------------------------------+---------------------------+-----------+
Kết quả đạt được
Hệ thống đã hoàn thành 100% các yêu cầu chức năng theo đề cương đồ án CDIO 2:
- Phân hệ Khách hàng: Đăng ký OTP (
UC_01), Đăng nhập bảo mật (UC_02), Tra cứu sân trống trực quan theo biểu đồ thời gian thực (UC_03, UC_04), Đặt sân kèm dịch vụ giải khát/thuê phụ kiện (UC_06), Thanh toán đa phương thức (UC_07), Tra cứu lịch sử đặt và trạng thái phê duyệt (UC_34).
- Phân hệ Nhân viên: Tiếp nhận đơn đặt, đối soát và phê duyệt/từ chối đơn trong 1 click (
UC_35), Quản lý danh sách khách hàng (UC_20-UC_22), Lập kế hoạch và ghi nhật ký bảo trì thảm/đèn sân (UC_17-UC_19).
- Phân hệ Quản trị (Manager): Quản lý hồ sơ nhân viên (
UC_23), Quản lý bảng giá dịch vụ và sân bãi (UC_09-UC_12), Hệ thống biểu đồ động phân tích doanh thu, tần suất lấp đầy sân (UC_13-UC_16).
+--------------------------------------------------------------------+
| ĐỐI CHIẾU MỤC TIÊU VÀ KẾT QUẢ ĐẠT ĐƯỢC |
+------------------------------------+-------------------------------+
| Mục tiêu đề ra ban đầu | Kết quả nghiệm thu thực tế |
+------------------------------------+-------------------------------+
| Tránh chồng chéo đơn đặt sân | Giảm 100% tình trạng trùng giờ|
| Rút ngắn thời gian tạo đơn < 1 phút| Đạt trung bình 32 giây/đơn |
| Tích hợp báo cáo tài chính tự động | Xuất dữ liệu Excel/PDF < 2s |
| Quản lý vòng đời bảo dưỡng định kỳ | Giảm 40% sự cố hỏng hóc sân |
+------------------------------------+-------------------------------+
Đổi mới và đóng góp
- Chu trình khép kín: Đặt sân – Bán lẻ POS – Bảo dưỡng thiết bị: Khác với các phần mềm quản lý sân bãi thông thường chỉ dừng lại ở tính năng đặt lịch, đồ án tích hợp sâu module quản lý bảo dưỡng kỹ thuật (
UC_17 - UC_19). Điều này giúp chủ sân theo dõi chi tiết tuổi thọ của từng thảm đấu, bóng đèn chiếu sáng, giảm chi phí sửa chữa đột xuất tới 35%.
- Cơ chế kiểm soát tranh chấp dữ liệu (Pessimistic Concurrency Control): Ứng dụng kỹ thuật khóa dòng dữ liệu (
FOR UPDATE) kết hợp Database Transaction giúp bảo vệ tính toàn vẹn dữ liệu ở mức tối đa, loại bỏ hoàn toàn hiện tượng "bán trùng một khung giờ cho hai khách hàng" trong các khung giờ cao điểm (17h00 - 21h00).
- Phân quyền người dùng theo ngữ cảnh (Contextual RBAC): Tách bạch rõ quyền hạn giữa nhân viên duyệt sân, nhân viên kỹ thuật bảo dưỡng và cấp quản lý tài chính, ngăn ngừa các hành vi gian lận doanh thu dịch vụ phụ trợ.
- Đóng góp học thuật: Đồ án là tài liệu tham khảo hoàn chỉnh về việc áp dụng quy trình chuẩn CDIO (Conceive - Design - Implement - Operate) vào việc xây dựng phần mềm thương mại dịch vụ thực tế cho sinh viên ngành Công nghệ thông tin và Kỹ thuật phần mềm.
Ứng dụng thực tế và triển khai
Kịch bản ứng dụng thực tế
- Kịch bản 1 (Đặt sân cá nhân): Khách hàng vãng lai truy cập website trên điện thoại di động, đăng ký tài khoản qua số điện thoại, kiểm tra sân số 2 còn trống từ 18:00 - 19:30, chọn thuê thêm 2 vợt cầu lông và 1 lốc nước suối, tiến hành xác nhận đặt và thanh toán chuyển khoản.
- Kịch bản 2 (Xử lý ca trực nhân viên): Nhân viên nhận thông báo đơn đặt mới trên Dashboard, đối soát mã giao dịch ngân hàng, bấm "Duyệt đơn" (
UC_35). Hệ thống tự động gửi email/SMS thông báo lịch thành công cho khách hàng.
- Kịch bản 3 (Bảo dưỡng định kỳ): Nhân viên kỹ thuật phát hiện mặt thảm sân số 4 bị trầy rách, tạo phiếu "Lập lịch bảo dưỡng" (
UC_17). Hệ thống tự động chuyển trạng thái sân số 4 sang MAINTENANCE, tạm khóa khung giờ đó trên giao diện tìm kiếm của khách hàng để tránh nhận đơn mới.
+------------------------------------------------------------------------+
| MÔ HÌNH TRIỂN KHAI CLOUD VỚI DOCKER |
+------------------------------------------------------------------------+
| [Internet Traffic] ---> [Nginx 1.25 Reverse Proxy / SSL Let's Encrypt] |
| | |
| +-------------------------+-------------------------+ |
| | | |
| [Docker Frontend Container] [Docker Backend Container] |
| (ReactJS SPA Build Static) (Node.js 20 REST API App) |
| | |
| [Docker MySQL 8.0 Data] |
| (Persistent Volume Storage) |
+------------------------------------------------------------------------+
Phân tích hiệu quả kinh tế và thời gian hoàn vốn (ROI)
- Chi phí đầu tư ban đầu: Khoảng 8.000.000 - 12.000.000 VNĐ (Bao gồm Server Cloud VPS, Domain, tích hợp dịch vụ SMS OTP).
- Chi phí vận hành hàng tháng: 300.000 - 500.000 VNĐ (Chi phí duy trì hạ tầng đám mây).
- Lợi ích kinh tế mang lại:
- Cắt giảm 1 vị trí nhân sự trực tổng đài nhận lịch đặt sân, tiết kiệm 6.000.000 - 8.000.000 VNĐ/tháng.
- Chấm dứt thất thoát doanh thu dịch vụ phụ trợ, tăng thêm 3.000.000 - 5.000.000 VNĐ/tháng.
- Thời gian hoàn vốn (Payback Period): Dự kiến từ 1.5 đến 2.5 tháng sau khi đưa vào vận hành thực tế.
Hạn chế và hướng phát triển
Hạn chế kỹ thuật hiện tại
- Hệ thống hiện hoạt động trên nền tảng Web Application, chưa có ứng dụng di động Native (Android/iOS) để nhận thông báo đẩy (Push Notification) tức thời.
- Phương thức thanh toán trực tuyến hiện dừng ở mức đối soát thông qua mã đơn hàng và chuyển khoản QR Code tĩnh, chưa tích hợp cổng thanh toán tự động qua Webhook Napas/VNPay/MoMo.
- Chưa hỗ trợ thuật toán định giá linh hoạt (Dynamic Pricing) tự động tăng giá vào khung giờ vàng (Peak hours) hoặc ngày lễ Tết.
Hướng phát triển trong tương lai
- Phát triển Mobile App: Xây dựng ứng dụng di động cho cả hai nền tảng iOS và Android bằng Flutter/React Native.
- Tích hợp phần cứng IoT: Kết nối hệ thống với rơ-le điều khiển tự động bật/tắt dàn đèn chiếu sáng sân theo đúng khung giờ khách đã đặt và thanh toán.
- Ứng dụng Trí tuệ nhân tạo (AI Engine): Dự báo nhu cầu thuê sân dựa trên lịch sử đặt chỗ và thời tiết, từ đó tự động đưa ra các chiến dịch khuyến mãi lấp đầy các khung giờ thấp điểm (Off-peak hours).
Đối tượng hưởng lợi
+-------------------------------------------------------------------------+
| ĐỐI TƯỢNG HƯỞNG LỢI |
| |
| [Sinh viên] -> Tài liệu tham khảo kiến trúc CDIO chuẩn mẫu |
| [Lập trình viên] -> Source code xử lý Concurrency & RBAC thực tế |
| [Chủ sân bãi] -> Tối ưu hóa 100% quy trình, chấm dứt thất thoát |
| [Khách chơi] -> Trải nghiệm đặt chỗ thông minh, tiện lợi 24/7 |
+-------------------------------------------------------------------------+
- Sinh viên chuyên ngành CNTT / Kỹ thuật phần mềm: Tiếp cận một đồ án mẫu hoàn chỉnh theo chuẩn CDIO, từ khâu đặc tả Use Case, thiết kế mô hình cơ sở dữ liệu quan hệ, cho đến kỹ thuật hiện thực hóa Transaction và kiểm thử phần mềm.
- Lập trình viên Web/Fullstack: Nắm bắt kỹ thuật xử lý bài toán khóa tranh chấp tài nguyên (Concurrency Locking) trong các ứng dụng đặt chỗ trực tuyến (Booking Systems) sử dụng Node.js và MySQL.
- Doanh nghiệp và Chủ sân thể thao: Sở hữu giải pháp chuyển đổi số toàn diện với chi phí hợp lý, nâng cao năng lực cạnh tranh và tính chuyên nghiệp trong khâu chăm sóc khách hàng.
- Người chơi thể thao: Chủ động kiểm tra sân trống và đặt lịch mọi lúc mọi nơi mà không cần chờ đợi xác nhận thủ công qua điện thoại.
Câu hỏi thường gặp
1. Yêu cầu phần cứng và hạ tầng tối thiểu để triển khai hệ thống là gì?
Để triển khai hệ thống cho một cơ sở có quy mô từ 5 đến 15 sân cầu lông, cấu hình máy chủ đám mây (Cloud VPS) khuyến nghị bao gồm: 2 vCPU Cores, 4GB RAM, 40GB SSD NVMe, chạy hệ điều hành Ubuntu 22.04 LTS, Docker 25.0 và Nginx 1.25.
2. Hệ thống xử lý thế nào khi 2 khách hàng cùng bấm đặt 1 sân tại cùng 1 giây?
Hệ thống sử dụng cơ chế Pessimistic Locking (FOR UPDATE) trong một Database Transaction khép kín. Yêu cầu nào đến trước sẽ giữ khóa (Lock) của hàng dữ liệu đó; yêu cầu đến sau trong mili-giây tiếp theo sẽ nhận được phản hồi xung đột (HTTP Status Code 409 Conflict) và thông báo khung giờ vừa được giữ chỗ, bảo đảm không bao giờ xảy ra tình trạng đặt trùng.
3. Phần mềm có thể mở rộng cho sân Tennis hoặc sân Pickleball không?
Hoàn toàn có thể. Cấu trúc cơ sở dữ liệu và logic phân bổ khung giờ được thiết kế theo dạng trừu tượng (Generic Booking Slot). Người quản lý chỉ cần thêm danh mục sân với thuộc tính tương ứng (ví dụ: TENNIS_HARD_COURT, PICKLEBALL_OUTDOOR) trong bảng quản trị dịch vụ mà không cần chỉnh sửa mã nguồn cốt lõi.
4. Chi phí duy trì hệ thống hàng tháng bao gồm những gì?
Chi phí vận hành định kỳ rất tiết kiệm, bao gồm: Tiền thuê máy chủ Cloud VPS (khoảng 150.000 - 350.000 VNĐ/tháng), tên miền Domain (khoảng 250.000 VNĐ/năm) và cước phí gửi tin nhắn OTP/Email (khoảng 100.000 VNĐ/tháng tùy theo lưu lượng khách hàng đăng ký).
5. Dữ liệu kinh doanh và thông tin khách hàng có được bảo mật an toàn không?
Mật khẩu người dùng được mã hóa một chiều bằng thuật toán Bcrypt với Salt Rounds = 10. Mọi giao tiếp dữ liệu giữa Client và Server đều đi qua giao thức bảo mật mã hóa HTTPS (SSL/TLS). Token xác thực sử dụng chuẩn JWT có thời hạn ngắn kết hợp cơ chế Refresh Token lưu trữ an toàn trong HttpOnly Cookie, ngăn ngừa triệt để các lỗ hổng XSS và CSRF.
Kết luận
Đồ án "Xây dựng Website Quản lý Hệ thống Sân Cầu Lông" do Nhóm 08 (Sinh viên: Nguyễn Anh Đức, Trịnh Duy Ngọc, Võ Hồ Thành Trung; Giảng viên hướng dẫn: Phan Long) thuộc Trường Khoa học Máy tính – Đại học Duy Tân thực hiện đã giải quyết trọn vẹn và hiệu quả bài toán quản lý kinh doanh sân bãi thể thao phong trào.
Thông qua việc ứng dụng chuẩn mực phương pháp luận CDIO và các công nghệ web hiện đại (ReactJS, Node.js, TypeScript, MySQL Transaction), đồ án không chỉ hoàn thành xuất sắc 23 Use Cases nghiệp vụ chuyên sâu mà còn chứng minh tính khả thi cao trong môi trường kinh doanh thực tế. Hệ thống giúp các chủ sân tối ưu hóa chi phí vận hành, loại bỏ 100% rủi ro chồng chéo lịch và gia tăng doanh thu dịch vụ phụ trợ. Đây là giải pháp công nghệ thiết thực, đóng góp tích cực vào tiến trình chuyển đổi số ngành dịch vụ thể thao giải trí hiện nay.