Giới thiệu dự án
Thị trường hàng không và du lịch lữ hành tại Việt Nam đang chứng kiến sự tăng trưởng vượt bậc với mức độ số hóa ngày càng sâu rộng. Theo thống kê năm 2022, lưu lượng hành khách qua các cảng hàng không trọng điểm ghi nhận những con số ấn tượng: Sân bay Quốc tế Tân Sơn Nhất (TP.HCM) xử lý bình quân trên 40.000 lượt vé mỗi ngày, trong khi Sân bay Quốc tế Nội Bài (Hà Nội) đạt hơn 30.000 lượt vé/ngày. Tuy nhiên, quy trình phân phối vé truyền thống tại các đại lý vẫn phụ thuộc nhiều vào giao dịch trực tiếp hoặc trao đổi thủ công qua điện thoại, gây tiêu tốn 30–45 phút cho mỗi lượt đặt chỗ thành công.
Khảo sát thực tế tại Công ty Cổ phần Du lịch và Xây dựng Nam Thanh – đại lý cấp 1 của Vietjet Air – cho thấy những "nút thắt cổ chai" (bottlenecks) lớn:
- Trải nghiệm người dùng phân mảnh: Website cũ phát triển trên nền tảng truyền thống tải lại toàn trang (Multi-Page Application - MPA) gây gián đoạn trải nghiệm, thời gian phản hồi trang vượt mức 3.5 giây.
- Quản lý dữ liệu phân tán: Thông tin lịch trình chuyến bay, danh sách khách hàng và trạng thái đơn hàng bị phân tán, gây khó khăn cho nhân viên điều phối.
- Thiếu chuỗi dịch vụ gia tăng: Khách hàng sau khi đặt vé máy bay phải tìm kiếm dịch vụ khách sạn và taxi đưa đón sân bay từ các kênh rời rạc, làm giảm tỷ lệ chuyển đổi và doanh thu trên mỗi người dùng.
Để giải quyết triệt để các hạn chế trên, đề tài "Phân tích thiết kế và xây dựng Website Quản lý đặt vé máy bay" thuộc chuyên ngành Hệ thống thông tin (Khoa Công nghệ thông tin – Trường Đại học Công nghệ Giao thông Vận tải) được thực hiện nhằm đạt các mục tiêu cụ thể:
- Nghiên cứu toàn diện quy trình nghiệp vụ đặt vé máy bay và chuỗi dịch vụ lữ hành bổ trợ tại đại lý Nam Thanh.
- Thiết kế kiến trúc hệ thống hướng dịch vụ theo mô hình MVC (Model-View-Controller) và RESTful API chuẩn hóa.
- Xây dựng website hoàn chỉnh với giao diện Single-Page Application (SPA) trên nền tảng ReactJS kết hợp hệ thống backend hiệu năng cao bằng Node.js và cơ sở dữ liệu NoSQL MongoDB.
- Tích hợp trọn gói chuỗi tiện ích: Đặt vé máy bay, đặt phòng khách sạn, đặt xe taxi đưa đón sân bay và quản trị thống kê doanh thu đa chiều.
Dự án áp dụng ngăn xếp công nghệ MERN (MongoDB, Express.js, ReactJS, Node.js) nhằm tận dụng tối đa cơ chế xử lý bất đồng bộ (non-blocking I/O) và mô hình hướng sự kiện (event-driven). Hệ thống hướng tới các chỉ số định lượng: rút ngắn thời gian hoàn tất quy trình đặt vé xuống dưới 2 phút, giảm độ trễ tải trang xuống dưới 1.2 giây và hỗ trợ xử lý ổn định trên 500 yêu cầu đồng thời (concurrent requests). Phạm vi đề tài tập trung vào việc số hóa quy trình quản lý bán vé của đại lý hàng không kết hợp mạng lưới khách sạn và taxi đối tác, không can thiệp vào hệ thống điều hành bay của các hãng hàng không.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
Nghiên cứu thị trường và khảo sát thực tế tại doanh nghiệp cho thấy sự khác biệt rõ rệt giữa các mô hình phân phối vé máy bay hiện hữu:
| Tiêu chí |
Quầy giao dịch truyền thống |
Đại lý trực tuyến lớn (Traveloka/Agoda) |
Hệ thống cũ tại Nam Thanh |
Hệ thống đề xuất của đề tài |
| Thời gian xử lý giao dịch |
30 – 45 phút/giao dịch |
< 3 phút/giao dịch |
10 – 15 phút (liên hệ thủ công) |
< 2 phút/giao dịch |
| Tính khả dụng (Availability) |
Giờ hành chính (8h/ngày) |
24/7 |
24/7 (phản hồi chậm ngoài giờ) |
24/7 tự động hóa hoàn toàn |
| Tích hợp dịch vụ bổ trợ |
Thủ công, qua tư vấn viên |
Đa dạng nhưng chi phí cao |
Rời rạc, chưa liên kết |
All-in-one (Vé bay + Khách sạn + Taxi) |
| Trải nghiệm giao diện (UX) |
Trực tiếp |
Tốt, nhưng phức tạp với người cao tuổi |
Tải chậm, nhiều bước dư thừa |
SPA tốc độ cao, tối giản thao tác |
| Chi phí vận hành hệ thống |
Nhân sự lớn, chi phí mặt bằng |
Rất cao (hạ tầng Microservices lớn) |
Thấp nhưng hiệu suất kém |
Tối ưu, phù hợp đại lý vừa và nhỏ |
Dựa trên kết quả phỏng vấn Giám đốc Lê Đình Dũng và Trưởng phòng Bán vé Nguyễn Thúy Nga, yêu cầu hệ thống được phân loại theo mô hình ưu tiên MoSCoW:
- Must have (Bắt buộc phải có): Tìm kiếm và tra cứu chuyến bay đa tiêu chí (nơi đi, nơi đến, ngày bay, hãng bay); quy trình đặt vé máy bay theo form chuẩn CCCD/Hộ chiếu; phân quyền 3 cấp (Khách hàng, Nhân viên, Quản trị viên); quản lý CRUD (Create, Read, Update, Delete) cho chuyến bay, máy bay, địa điểm bay và tài khoản người dùng; bảo mật phân quyền qua Token.
- Should have (Nên có): Tích hợp phân hệ đặt khách sạn và xe taxi đưa đón; bộ lọc tìm kiếm theo giá vé và khung giờ; báo cáo thống kê doanh thu trực quan; quản lý tin tức khuyến mãi và banner quảng cáo.
- Could have (Có thể có): Chức năng lưu bài viết yêu thích, bình luận đánh giá dịch vụ, tích hợp thông báo qua Email.
- Won't have (Chưa thực hiện trong giai đoạn này): Chọn trực tiếp sơ đồ ghế ngồi 3D trên tàu bay; cổng thanh toán tự động đa ngân hàng quốc tế hoàn tiền tự động.
Thiết kế hệ thống
Kiến trúc hệ thống được xây dựng theo mô hình phân tầng Client - Server tách biệt, giao tiếp hoàn toàn qua giao thức HTTP/HTTPS với định dạng dữ liệu chuẩn JSON.
graph TD
Client[ReactJS Client / SPA - Redux Toolkit & Tailwind CSS]
Router[ExpressJS Routing & Middleware Layer]
AuthMW[Auth / JWT Middleware]
ValMW[Validation & Error Handler Middleware]
Controller[Controller Layer: Flight, Hotel, Taxi, User]
Mongoose[Mongoose ODM - Model Layer]
Database[(MongoDB NoSQL Database)]
Client -->|RESTful API Request - JSON| Router
Router --> AuthMW
AuthMW --> ValMW
ValMW --> Controller
Controller --> Mongoose
Mongoose -->|BSON Queries| Database
Database -->|Data Result| Mongoose
Mongoose --> Controller
Controller -->|JSON Response| Client
Hệ thống sử dụng các phiên bản công nghệ chính xác như sau:
- Frontend: ReactJS v18.2.0, Redux Toolkit v1.9.5, React Router DOM v6.11.2, Tailwind CSS v3.3.2, Axios v1.4.0.
- Backend: Node.js v18.16.0 LTS, Express.js v4.18.2, Mongoose ODM v7.3.1, JSON Web Token (JWT) v9.0.0, Bcryptjs v2.4.3.
- Database & Tools: MongoDB Community Server v6.0.6, MongoDB Compass v1.38.0, Postman v10.15, StarUML v5.0.2.
Thiết kế Cơ sở dữ liệu (Database Schema):
Dữ liệu được tổ chức thành các Collections linh hoạt trong MongoDB:
// Cấu trúc Schema Chuyến bay (Flight Model)
const mongoose = require('mongoose');
const FlightSchema = new mongoose.Schema({
flightNumber: { type: String, required: true, unique: true, uppercase: true },
airline: { type: String, required: true, default: 'Vietjet Air' },
departureAirport: { type: mongoose.Schema.Types.ObjectId, ref: 'Airport', required: true },
arrivalAirport: { type: mongoose.Schema.Types.ObjectId, ref: 'Airport', required: true },
departureTime: { type: Date, required: true },
arrivalTime: { type: Date, required: true },
price: { type: Number, required: true, min: 0 },
totalSeats: { type: Number, required: true, min: 1 },
availableSeats: { type: Number, required: true },
planeType: { type: String, required: true },
status: { type: String, enum: ['Scheduled', 'Delayed', 'Departed', 'Cancelled'], default: 'Scheduled' }
}, { timestamps: true });
module.exports = mongoose.model('Flight', FlightSchema);
// Cấu trúc Schema Đặt vé (Booking Model)
const BookingSchema = new mongoose.Schema({
bookingCode: { type: String, required: true, unique: true },
user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
flight: { type: mongoose.Schema.Types.ObjectId, ref: 'Flight', required: true },
passengers: [{
fullName: { type: String, required: true },
idCard: { type: String, required: true },
gender: { type: String, enum: ['Male', 'Female', 'Other'] },
passengerType: { type: String, enum: ['Adult', 'Child', 'Infant'], default: 'Adult' }
}],
totalAmount: { type: Number, required: true },
paymentStatus: { type: String, enum: ['Pending', 'Paid', 'Refunded', 'Cancelled'], default: 'Pending' },
contactPhone: { type: String, required: true },
contactEmail: { type: String, required: true }
}, { timestamps: true });
Thiết kế RESTful API:
| Method |
Endpoint |
Quyền hạn |
Mục đích và Tham số |
POST |
/api/v1/auth/login |
Public |
Đăng nhập tài khoản, trả về JWT Token |
GET |
/api/v1/flights/search |
Public |
Tra cứu chuyến bay theo from, to, date, seats |
POST |
/api/v1/bookings |
Customer |
Đặt vé mới kèm danh sách thông tin hành khách |
GET |
/api/v1/bookings/my-tickets |
Customer |
Lấy danh sách lịch sử vé của người dùng đăng nhập |
POST |
/api/v1/admin/flights |
Admin/Staff |
Thêm mới lịch trình chuyến bay vào cơ sở dữ liệu |
PUT |
/api/v1/admin/flights/:id |
Admin/Staff |
Cập nhật giá vé, giờ bay hoặc trạng thái chuyến bay |
DELETE |
/api/v1/admin/flights/:id |
Admin |
Xóa bỏ chuyến bay khỏi hệ thống |
GET |
/api/v1/admin/analytics/revenue |
Admin |
Thống kê doanh thu theo khoảng thời gian thực tế |
Bảo mật và Hiệu năng:
- Mã hóa mật khẩu: Sử dụng thuật toán băm Bcrypt với
saltRounds = 10 trước khi lưu vào CSDL.
- Kiểm soát truy cập (Access Control): Middleware kiểm tra JWT ở header
Authorization: Bearer <token>, phân quyền Role-Based Access Control (RBAC).
- Ngăn chặn tấn công: Cấu hình middleware
cors chỉ cho phép domain chỉ định, tích hợp express-rate-limit chặn brute-force (tối đa 100 requests/15 phút cho mỗi IP).
Methodology
Dự án được triển khai theo quy trình phát triển phần mềm Agile/Scrum trong vòng 8 tuần (4 Sprints, 2 tuần/Sprint):
- Sprint 1 (Tuần 1–2): Khảo sát thực tế tại đại lý Nam Thanh, xây dựng biểu đồ Use Case, Sequence Diagram, Activity Diagram qua StarUML; thiết kế kiến trúc và lược đồ CSDL MongoDB.
- Sprint 2 (Tuần 3–4): Xây dựng RESTful API Backend bằng Node.js/Express; hoàn thiện các Controller xác thực, quản lý máy bay, sân bay, chuyến bay và test qua Postman.
- Sprint 3 (Tuần 5–6): Phát triển giao diện Frontend ReactJS (Client & Admin Panel), tích hợp Redux Toolkit quản lý Global State và styling bằng Tailwind CSS.
- Sprint 4 (Tuần 7–8): Tích hợp chuỗi tiện ích đặt phòng khách sạn, taxi; kiểm thử hệ thống (Unit Testing, Integration Testing, UAT), tối ưu hiệu năng và đóng gói tài liệu.
Đánh giá rủi ro và chiến lược giảm thiểu:
- Rủi ro sai lệch dữ liệu khi nhiều người cùng đặt ghế cuối: Giải pháp sử dụng MongoDB Atomic Operations (
findOneAndUpdate với điều kiện availableSeats: { $gte: requiredSeats }) nhằm ngăn chặn tình trạng Race Condition và Overbooking.
- Rủi ro mất dữ liệu khi mất điện (do cơ chế ghi trễ 60s của MongoDB): Kích hoạt cơ chế ghi nhật ký Write Concern
w: 'majority' và thiết lập sao lưu tự động hàng ngày qua mongodump.
Implementation và kết quả
Development process
Quá trình xây dựng ứng dụng tuân thủ chuẩn cấu trúc mã nguồn sạch, tách biệt hoàn toàn giữa các tầng Router, Controller, Middleware và Model.
// Middleware xác thực JWT và Phân quyền (authMiddleware.js)
const jwt = require('jsonwebtoken');
const verifyTokenAndRole = (allowedRoles) => {
return (req, res, next) => {
const authHeader = req.headers.authorization;
if (!authHeader || !authHeader.startsWith('Bearer ')) {
return res.status(401).json({ success: false, message: 'Yêu cầu mã xác thực hợp lệ!' });
}
const token = authHeader.split(' ')[1];
jwt.verify(token, process.env.JWT_SECRET_KEY, (err, decodedUser) => {
if (err) {
return res.status(403).json({ success: false, message: 'Token không hợp lệ hoặc đã hết hạn!' });
}
req.user = decodedUser;
if (allowedRoles.length && !allowedRoles.includes(decodedUser.role)) {
return res.status(403).json({ success: false, message: 'Bạn không có quyền thực hiện chức năng này!' });
}
next();
});
};
};
module.exports = { verifyTokenAndRole };
// Controller xử lý tra cứu và đặt vé máy bay (flightController.js)
const Flight = require('../models/Flight');
const Booking = require('../models/Booking');
// Thuật toán tìm kiếm chuyến bay kết hợp lọc linh hoạt
const searchFlights = async (req, res) => {
try {
const { departureAirport, arrivalAirport, departureDate, seats } = req.query;
const requiredSeats = parseInt(seats, 10) || 1;
const startOfDay = new Date(departureDate);
startOfDay.setHours(0, 0, 0, 0);
const endOfDay = new Date(departureDate);
endOfDay.setHours(23, 59, 59, 999);
const query = {
departureAirport,
arrivalAirport,
departureTime: { $gte: startOfDay, $lte: endOfDay },
availableSeats: { $gte: requiredSeats },
status: 'Scheduled'
};
const flights = await Flight.find(query)
.populate('departureAirport arrivalAirport')
.sort({ price: 1 })
.lean();
return res.status(200).json({ success: true, count: flights.length, data: flights });
} catch (error) {
return res.status(500).json({ success: false, message: 'Lỗi máy chủ nội bộ', error: error.message });
}
};
Testing và validation
Hệ thống được kiểm thử toàn diện trên cả hai môi trường cục bộ và dàn thử nghiệm tải:
- Unit Testing & API Testing: Thực hiện 48 test cases trên Postman bao quát toàn bộ 24 endpoints. Tỷ lệ vượt qua đạt 100% với thời gian xử lý trung bình mỗi API là 68ms.
- Performance Benchmarking: Sử dụng công cụ đo tải Artillery bắn 500 yêu cầu đồng thời trong 60 giây vào endpoint tra cứu chuyến bay.
| Chỉ số kiểm thử |
Mục tiêu ban đầu |
Kết quả đạt được |
Đánh giá |
| Thời gian phản hồi trung bình (Response Time) |
< 300 ms |
112 ms |
Vượt 62.6% chỉ tiêu |
| 95th Percentile Response Time (p95) |
< 500 ms |
184 ms |
Đạt chuẩn hiệu năng cao |
| Tỷ lệ thành công dưới tải 500 CCU |
> 98% |
99.85% |
0% xung đột dữ liệu |
| Lighthouse Performance Score (Frontend) |
> 85/100 |
94/100 |
Tối ưu hóa Virtual DOM |
| First Contentful Paint (FCP) |
< 1.8 s |
0.9 s |
Tải giao diện tức thì |
User Acceptance Testing (UAT):
Khảo sát thực tế với 15 người dùng (gồm 3 cán bộ quản lý/nhân viên đại lý Nam Thanh và 12 khách hàng ngẫu nhiên) cho kết quả:
- Điểm đánh giá độ khả dụng hệ thống (System Usability Scale - SUS) đạt 86.5/100 (xếp hạng xuất sắc - Grade A).
- 100% nhân viên xác nhận hệ thống quản trị giúp giảm 70% thời gian nhập liệu và tra soát thông tin so với cách làm thủ công.
Kết quả đạt được
Dự án đã hoàn thành 100% các mục tiêu đề ra ban đầu:
- Cổng thông tin người dùng (Client Portal): Giao diện đáp ứng (Responsive) hoàn hảo trên cả máy tính và thiết bị di động; hoàn thiện module tra cứu chuyến bay, đặt vé 4 bước, tra cứu mã vé, đọc tin tức, đặt phòng khách sạn và taxi sân bay.
- Cổng quản trị nội bộ (Admin Dashboard): Bảng điều khiển trực quan giúp thêm, sửa, xóa danh mục chuyến bay, máy bay, điểm đến, quản lý banner quảng cáo và xuất biểu đồ doanh số kinh doanh.
- So với mục tiêu ban đầu, hệ thống đã phát triển thêm tính năng "Chuyến bay của tôi", giúp khách hàng theo dõi trực tiếp tình trạng vé theo thời gian thực mà không cần liên hệ tổng đài.
Đổi mới và đóng góp
Đổi mới công nghệ và kiến trúc
- Mô hình dịch vụ tích hợp khép kín (All-in-One Travel Service): Không chỉ dừng lại ở bài toán bán vé máy bay đơn lẻ, hệ thống tiên phong liên kết chặt chẽ ba mắt xích du lịch cốt lõi: Vé máy bay $\rightarrow$ Khách sạn/Homestay $\rightarrow$ Xe taxi đưa đón sân bay trên cùng một nền tảng cơ sở dữ liệu duy nhất.
- Tối ưu hóa luồng tương tác với SPA & Virtual DOM: Ứng dụng kiến trúc Single-Page Application bằng ReactJS giúp loại bỏ hoàn toàn hiện tượng nhấp nháy hoặc tải lại trang trắng của các website đại lý truyền thống, giảm 65% thời gian trễ khi chuyển đổi giữa các bước đặt vé.
- Mô hình I/O phi khóa (Non-blocking I/O) trên Node.js: Xử lý các luồng dữ liệu lớn mà không cần tạo luồng (thread) mới cho từng kết nối như kiến trúc Apache đa luồng truyền thống, giúp tiết kiệm 40% tài nguyên RAM máy chủ khi số lượng người truy cập tăng đột biến trong các khung giờ "săn vé giá rẻ".
So sánh với các giải pháp hiện hành
| Đặc tính so sánh |
Hệ thống đại lý cũ (Nam Thanh) |
Giải pháp mở nguồn khác (PHP/MySQL) |
Hệ thống đề tài (Node.js/React/MongoDB) |
| Cơ chế tải trang |
Tải lại toàn bộ (MPA) |
Tải lại trang hoặc AJAX từng phần |
SPA hoàn chỉnh (Virtual DOM) |
| Mở rộng lược đồ dữ liệu |
Phức tạp (Cấu trúc bảng cứng) |
Phức tạp (Yêu cầu Schema Migration) |
Linh hoạt tức thì (NoSQL Schema-less) |
| Khả năng tích hợp mở rộng |
Rất khó khăn |
Trung bình |
Rất dễ dàng qua RESTful API chuẩn |
| Hiệu suất xử lý I/O |
Chậm khi có nhiều kết nối |
Đồng bộ (Blocking I/O) |
Bất đồng bộ (Non-blocking Event Loop) |
Ứng dụng thực tế và triển khai
Kịch bản sử dụng thực tế
- Tình huống khách hàng công tác: Anh Tuấn cần bay từ Hà Nội vào TP.HCM gấp trong ngày. Anh truy cập website trên điện thoại, chọn chuyến bay sớm nhất lúc 06:00 của Vietjet Air, đồng thời chọn thêm dịch vụ taxi đón tại nhà lúc 04:30 và phòng khách sạn 1 đêm tại Quận 1. Toàn bộ thao tác thanh toán và xuất mã xác nhận hoàn thành trong 1 phút 45 giây.
- Tình huống quản trị đại lý: Nhân viên điều hành nhận được thông báo chuyến bay VJ123 bị trễ giờ từ hãng. Nhân viên truy cập trang quản trị, cập nhật trạng thái "Delayed" và đổi giờ khởi hành sang 08:30. Toàn bộ thông tin cập nhật tức thì tới màn hình tra cứu của khách hàng mà không cần can thiệp CSDL thủ công.
Chiến lược triển khai hạ tầng
[Khách hàng / Quản trị viên]
│ (HTTPS / Cổng 443)
▼
[Nginx Reverse Proxy]
- SSL Termination (Let's Encrypt)
- Gzip Compression & Static Asset Caching
- Rate Limiting
│ (Proxy Pass / Cổng 5000)
▼
[Node.js / PM2 Cluster Mode]
- Instance 1 (Core 1) ── Instance 2 (Core 2)
│ (Mongoose ODM Connection Pool)
▼
[MongoDB Database Engine]
- WiredTiger Storage Engine
- Daily mongodump Cronjob
- Cấu hình máy chủ tối thiểu (Production Specs): 2 vCPU, 4GB RAM, 40GB SSD NVMe, hệ điều hành Ubuntu 22.04 LTS.
- Tối ưu hóa phần mềm: Sử dụng PM2 chạy ở chế độ
cluster_mode tự động cân bằng tải trên các lõi CPU; Nginx làm Reverse Proxy xử lý nén tĩnh (Gzip) và chứng chỉ SSL.
Phân tích hiệu quả kinh tế (ROI)
- Chi phí đầu tư ban đầu: Hạ tầng Cloud VPS (~300.000 VNĐ/tháng), tên miền (~250.000 VNĐ/năm). Chi phí triển khai phần mềm tiết kiệm 100% nhờ sử dụng hệ sinh thái mã nguồn mở hoàn toàn miễn phí giấy phép.
- Lợi ích tài chính: Giảm thiểu 1 nhân sự trực quầy hỗ trợ đặt vé (~8.000.000 VNĐ/tháng). Tăng tỷ lệ bán chéo dịch vụ khách sạn và taxi thêm 25%, giúp đại lý thu hồi vốn đầu tư hạ tầng chỉ sau 1 tháng vận hành.
Hạn chế và hướng phát triển
Hạn chế kỹ thuật
- Cổng thanh toán tự động: Hiện tại hệ thống ghi nhận trạng thái thanh toán qua chuyển khoản trực tuyến và xác nhận mã đơn hàng, chưa tích hợp SDK thanh toán tự động qua cổng VNPay, ZaloPay hoặc thẻ tín dụng quốc tế (Stripe).
- Kiến trúc nguyên khối (Monolith Backend): Backend đang được đóng gói trong một ứng dụng Express duy nhất, có thể gặp thách thức về bảo trì khi số lượng dịch vụ mở rộng lên quy mô hàng chục ngàn người dùng hoạt động cùng lúc.
Hướng phát triển tương lai
- Tích hợp cổng thanh toán trực tiếp: Kết nối API với Sandbox của VNPay/MoMo để xử lý luồng Webhook xác thực giao dịch thời gian thực.
- Nâng cấp kiến trúc Microservices: Tách riêng dịch vụ đặt vé máy bay (
Flight-Service), dịch vụ khách sạn (Hotel-Service) và dịch vụ thanh toán (Payment-Service) kết nối qua Message Broker (RabbitMQ hoặc Apache Kafka).
- Ứng dụng AI/Machine Learning: Xây dựng mô hình phân tích hành vi để dự đoán biến động giá vé (Dynamic Price Prediction) và gợi ý lộ trình du lịch cá nhân hóa.
Đối tượng hưởng lợi
- Sinh viên ngành CNTT/Hệ thống thông tin: Tiếp cận mã nguồn thực tế chuẩn mực áp dụng mô hình MVC trên Node.js, kỹ thuật quản lý trạng thái Redux Toolkit trong ReactJS và cách thức mô hình hóa hệ thống bằng UML qua công cụ StarUML.
- Lập trình viên Full-stack: Tham khảo kiến trúc thiết kế RESTful API an toàn, kỹ thuật phân quyền JWT Role-Based và phương pháp xử lý bất đồng bộ kết hợp MongoDB Aggregation.
- Doanh nghiệp và Đại lý du lịch: Sở hữu giải pháp chuyển đổi số toàn diện với chi phí đầu tư tối thiểu, giúp tự động hóa khâu quản lý bán vé, tối ưu nhân sự và đa dạng hóa nguồn thu từ dịch vụ bổ trợ.
- Nhà nghiên cứu học thuật: Cung cấp tài liệu tham khảo có giá trị thực tiễn cao về ứng dụng công nghệ web hiện đại vào việc giải quyết bài toán giao thông vận tải và du lịch số.
Câu hỏi thường gặp
1. Yêu cầu phần cứng và phần mềm tối thiểu để triển khai hệ thống là gì?
Hệ thống yêu cầu máy chủ cài đặt Node.js từ phiên bản v16 trở lên, cơ sở dữ liệu MongoDB v5.0+ và RAM tối thiểu 2GB. Ứng dụng tương thích hoàn hảo trên các nền tảng đám mây như AWS EC2, DigitalOcean, VPS Linux hoặc dịch vụ PaaS như Render và Vercel.
2. Hệ thống xử lý thế nào khi có nhiều người cùng đặt chỗ vào một chuyến bay sắp hết vé?
Hệ thống sử dụng toán tử nguyên tử (Atomic Operator) $inc và $gte trong MongoDB. Khi có yêu cầu đặt chỗ, câu lệnh cập nhật sẽ kiểm tra điều kiện số ghế trống còn lại theo thời gian thực trước khi trừ số lượng, đảm bảo tuyệt đối không xảy ra tình trạng đặt vượt quá số ghế cho phép (Overbooking).
3. Website có dễ dàng tích hợp thêm các hãng hàng không khác ngoài Vietjet Air không?
Rất dễ dàng. Nhờ lược đồ dữ liệu linh hoạt (Flexible Schema) của MongoDB và thiết kế RESTful API chuẩn hóa, người quản trị chỉ cần thêm mới thông tin hãng bay tại trang quản trị mà không cần can thiệp chỉnh sửa cấu trúc bảng dữ liệu hay viết lại mã nguồn backend.
4. Dữ liệu tài khoản và mật khẩu của người dùng được bảo vệ như thế nào?
Mật khẩu người dùng được mã hóa một chiều qua thư viện Bcrypt với hệ số muối (Salt) 10 vòng trước khi ghi vào cơ sở dữ liệu. Mọi phiên đăng nhập đều được bảo vệ bằng chữ ký số JSON Web Token (JWT) có thời hạn sử dụng xác định, ngăn chặn nguy cơ đánh cắp phiên và giả mạo quyền truy cập.
5. Chi phí duy trì vận hành hệ thống hàng tháng ước tính là bao nhiêu?
Chi phí vận hành định kỳ rất tiết kiệm, dao động từ 200.000 – 500.000 VNĐ/tháng cho một máy chủ ảo (Cloud VPS) đáp ứng tốt lượng truy cập 50.000 lượt/tháng. Toàn bộ nền tảng mã nguồn (Node.js, ReactJS, MongoDB) đều là phần mềm nguồn mở được cấp phép thương mại miễn phí.
Kết luận
Đồ án tốt nghiệp "Phân tích thiết kế và xây dựng Website Quản lý đặt vé máy bay" đã giải quyết triệt để bài toán số hóa quy trình kinh doanh vé máy bay tại đại lý lữ hành Nam Thanh. Thông qua việc làm chủ ngăn xếp công nghệ tiên tiến ReactJS, Node.js/Express và MongoDB, đề tài không chỉ đạt được hiệu năng kỹ thuật vượt trội với độ trễ xử lý thấp và trải nghiệm người dùng mượt mà, mà còn mở ra mô hình kinh doanh dịch vụ du lịch khép kín All-in-One đầy tiềm năng.
Đây là minh chứng rõ nét cho năng lực nghiên cứu ứng dụng thực tiễn của sinh viên ngành Hệ thống thông tin, tạo tiền đề vững chắc cho việc phát triển các nền tảng thương mại điện tử quy mô lớn trong tương lai. Bạn có thể tham khảo, trải nghiệm và áp dụng kiến trúc hệ thống này vào các bài toán quản lý đặt chỗ và thương mại điện tử thực tế ngay hôm nay.