Giới thiệu dự án
Thị trường vận tải hành khách đường bộ liên tỉnh tại Việt Nam ghi nhận sự phát triển mạnh mẽ với hàng triệu lượt di chuyển mỗi năm. Tuy nhiên, theo các khảo sát ngành giao thông vận tải, hơn 65% doanh nghiệp vận tải quy mô vừa và nhỏ vẫn duy trì quy trình bán vé truyền thống tại quầy hoặc qua điện thoại. Phương thức này bộc lộ nhiều điểm nghẽn nghiêm trọng: hiện tượng quá tải và nghẽn mạng cục bộ trong các dịp cao điểm Lễ, Tết; sai sót trong việc ghi nhận thông tin dẫn đến trùng ghế (double-booking); thất thoát doanh thu và thiếu hụt dữ liệu thời gian thực để tối ưu biểu đồ chạy xe.
Đồ án CDIO 3 với đề tài "Xây dựng website đặt và quản lý vé xe khách" do nhóm sinh viên Khoa Công nghệ Thông tin - Trường Đại học Duy Tân thực hiện nhằm giải quyết triệt để các hạn chế trên thông qua một nền tảng trực tuyến hóa toàn diện quy trình nghiệp vụ đặt vé, điều hành chuyến đi và quản lý đội xe.
[Khách Hàng / Khách Vãng Lai]
│ (HTTP/HTTPS - RESTful API)
▼
┌──────────────────────────────────────────────────────────┐
│ GIAO DIỆN CLIENT & ADMIN (Next.js / React) │
└──────────────────────────────┬───────────────────────────┘
│ JSON Web Token (JWT)
▼
┌──────────────────────────────────────────────────────────┐
│ BACKEND API GATEWAY / CONTROLLER (Node.js/Express)│
│ ┌────────────────────────────────────────────────────┐ │
│ │ Nghiệp vụ: Đặt vé | Chuyến xe | Tuyến | Thống kê │ │
│ └────────────────────────────────────────────────────┘ │
└──────────────────────────────┬───────────────────────────┘
│ Connection Pool (ACID)
▼
┌──────────────────────────────────────────────────────────┐
│ HỆ THỐNG CƠ SỞ DỮ LIỆU (SQL Server / PostgreSQL) │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ Users │ │ Trips │ │ Seats │ │ Tickets │ │
│ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │
└──────────────────────────────────────────────────────────┘
Mục tiêu dự án
- Xây dựng cổng thông tin trực tuyến cho phép hành khách tra cứu tuyến đường, lịch trình, giá vé và chọn vị trí ghế theo thời gian thực.
- Thiết kế và triển khai thuật toán khóa ghế tạm thời (seat holding) nhằm ngăn chặn xung đột dữ liệu đặt chỗ đồng thời.
- Phát triển phân hệ quản trị (Admin Dashboard) hỗ trợ quản lý danh mục xe, tài xế, cấu hình điểm đi - điểm đến, quản lý chuyến xe và kết xuất báo cáo thống kê.
- Tối ưu hóa hiệu năng truy vấn dữ liệu với độ trễ phản hồi (Response Latency) dưới 200ms cho các thao tác tìm kiếm tuyến đường.
- Đảm bảo tính bảo mật và toàn vẹn dữ liệu giao dịch thông qua cơ chế phân quyền dựa trên vai trò (Role-Based Access Control - RBAC) và mã hóa dữ liệu.
Phạm vi và giới hạn hệ thống
- Phạm vi: Ứng dụng tập trung vào nghiệp vụ quản trị và bán vé xe tuyến cố định liên tỉnh, phân quyền 3 tác nhân chính: Khách vãng lai, Khách hàng thành viên và Quản trị viên (Admin/Nhân viên điều hành).
- Giới hạn: Hệ thống thử nghiệm tích hợp cổng thanh toán mô phỏng (Sandbox Payment Gateway) và xác thực tài khoản qua OTP SMS/Email ở mức thử nghiệm môi trường phát triển (Staging).
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
| Tiêu chí so sánh |
Bán vé truyền thống (Tại quầy/Điện thoại) |
Sàn trung gian (Vexere, MoMo Travel) |
Hệ thống Website Đặt vé Xe CDIO |
| Chi phí vận hành |
Rất cao (Nhân sự, in ấn vé giấy, mặt bằng) |
Chiết khấu hoa hồng cao (10% - 18%/vé) |
Chi phí máy chủ cố định, không mất phí hoa hồng |
| Kiểm soát dữ liệu |
Phân tán, dễ thất lạc sổ sách |
Thuộc quyền kiểm soát của bên thứ ba |
Nhà xe sở hữu 100% dữ liệu khách hàng & dòng tiền |
| Độ trễ xử lý vé |
5 - 15 phút/giao dịch |
Tức thì (Real-time) |
Tức thì (< 1.5 giây hoàn tất giao dịch) |
| Khả năng xung đột |
Thường xuyên trùng lặp khi nhiều nhân viên cùng bán |
Kiểm soát tốt qua API phân phối |
Xử lý triệt để qua Database Transaction Locking |
Phân loại yêu cầu người dùng theo mô hình MoSCoW
- Must have (Bắt buộc phải có): Xác thực người dùng (Đăng ký, Đăng nhập), Tìm kiếm tuyến đường theo ngày/giờ và địa điểm, Bản đồ sơ đồ ghế tương tác trực quan, Quản lý chuyến xe, CRUD điểm đi/điểm đến, Quản lý vé của tôi.
- Should have (Nên có): Thống kê doanh thu và lượt truy cập theo khoảng thời gian, Hệ thống đánh giá/phản hồi chất lượng chuyến đi, Quản lý trạng thái xe (Bảo dưỡng, Đang chạy).
- Could have (Có thể có): Thuê xe trọn gói theo hợp đồng, Đề xuất chuyến xe theo lịch sử tìm kiếm.
- Won't have (Chưa thực hiện ở giai đoạn này): Định vị GPS xe thời gian thực tích hợp bản đồ GIS.
Thiết kế hệ thống
Technology Stack và phiên bản sử dụng
| Tầng kiến trúc |
Công nghệ / Thư viện |
Phiên bản |
Mục đích sử dụng |
| Frontend |
ReactJS / Next.js |
18.3.1 / 14.2.4 |
Xây dựng Single Page Application, tối ưu hóa SEO và Render sơ đồ ghế |
| UI Framework |
TailwindCSS & Bootstrap |
3.4.1 / 5.3.3 |
Thiết kế giao diện Responsive đa thiết bị (Mobile/Tablet/Desktop) |
| Backend Runtime |
Node.js |
20.12.2 LTS |
Môi trường thực thi JavaScript bất đồng bộ hiệu năng cao |
| Backend Framework |
Express.js |
4.19.2 |
Xây dựng hệ thống RESTful API endpoints, Middleware xác thực |
| Cơ sở dữ liệu |
Microsoft SQL Server / PostgreSQL |
2022 / 16.2 |
Quản lý dữ liệu quan hệ, đảm bảo chuẩn ACID và tính toàn vẹn khóa ngoại |
| ORM / Query Tool |
Sequelize / Prisma |
6.37.3 / 5.14.0 |
Ánh xạ dữ liệu quan hệ đối tượng, xử lý Transaction và Migration |
| Bảo mật |
JSON Web Token (JWT), Bcrypt |
9.0.2 / 5.1.1 |
Xác thực phiên làm việc không trạng thái (Stateless), băm mật khẩu |
-- DDL Schema: Thiết kế các bảng cốt lõi trong hệ thống quản lý vé xe
CREATE TABLE Users (
user_id INT IDENTITY(1,1) PRIMARY KEY,
full_name NVARCHAR(100) NOT NULL,
phone_number VARCHAR(15) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
role VARCHAR(20) DEFAULT 'Customer' CHECK (role IN ('Admin', 'Staff', 'Customer', 'Driver')),
created_at DATETIME DEFAULT GETDATE()
);
CREATE TABLE Routes (
route_id INT IDENTITY(1,1) PRIMARY KEY,
origin NVARCHAR(100) NOT NULL,
destination NVARCHAR(100) NOT NULL,
distance_km DECIMAL(6,2),
estimated_duration_hours DECIMAL(4,2)
);
CREATE TABLE Buses (
bus_id INT IDENTITY(1,1) PRIMARY KEY,
license_plate VARCHAR(20) UNIQUE NOT NULL,
bus_type NVARCHAR(50) NOT NULL, -- Ghế ngồi, Giường nằm, Limousine
total_seats INT NOT NULL,
status VARCHAR(20) DEFAULT 'Active'
);
CREATE TABLE Trips (
trip_id INT IDENTITY(1,1) PRIMARY KEY,
route_id INT FOREIGN KEY REFERENCES Routes(route_id),
bus_id INT FOREIGN KEY REFERENCES Buses(bus_id),
departure_time DATETIME NOT NULL,
arrival_time DATETIME NOT NULL,
ticket_price DECIMAL(18,2) NOT NULL,
status VARCHAR(20) DEFAULT 'Scheduled'
);
CREATE TABLE Tickets (
ticket_id INT IDENTITY(1,1) PRIMARY KEY,
trip_id INT FOREIGN KEY REFERENCES Trips(trip_id),
user_id INT FOREIGN KEY REFERENCES Users(user_id),
seat_number VARCHAR(10) NOT NULL,
booking_time DATETIME DEFAULT GETDATE(),
status VARCHAR(20) DEFAULT 'Booked' CHECK (status IN ('Pending', 'Booked', 'Cancelled')),
CONSTRAINT UQ_Trip_Seat UNIQUE(trip_id, seat_number)
);
Thiết kế RESTful API Specification
| Method |
Endpoint |
Mô tả chức năng |
Quyền truy cập |
Mã trạng thái HTTP |
POST |
/api/v1/auth/login |
Xác thực người dùng & cấp phát JWT |
Public |
200 OK, 401 Unauthorized |
GET |
/api/v1/trips/search |
Tìm chuyến xe theo origin, dest, date |
Public |
200 OK, 400 Bad Request |
POST |
/api/v1/bookings/hold-seat |
Khóa giữ chỗ tạm thời (TTL 10 phút) |
Customer |
200 OK, 409 Conflict |
POST |
/api/v1/bookings/confirm |
Xác nhận đặt vé và lưu bản ghi hóa đơn |
Customer |
201 Created, 400 Error |
GET |
/api/v1/admin/analytics |
Thống kê số lượng truy cập và doanh thu |
Admin |
200 OK, 403 Forbidden |
Methodology
Quy trình phát triển phần mềm tuân thủ khung chuẩn CDIO (Conceive - Design - Implement - Operate) kết hợp phương pháp luận Agile Scrum:
- Conceive (Hình thành ý tưởng): Khảo sát nghiệp vụ vận tải, phỏng vấn nhu cầu hành khách và nhà xe, thống nhất lựa chọn giải pháp web app đặt vé.
- Design (Thiết kế): Xây dựng sơ đồ Use Case, Activity Diagram, Sequence Diagram trên Visual Paradigm; chuẩn hóa cơ sở dữ liệu quan hệ bậc 3 (3NF).
- Implement (Hiện thực hóa): Chia nhỏ dự án thành 4 Sprint (mỗi Sprint 2 tuần), thực hiện code refactoring và kiểm thử liên tục.
- Operate (Vận hành & Đánh giá): Triển khai hệ thống lên môi trường máy chủ cục bộ và staging cloud, thu thập phản hồi người dùng thực tế.
┌──────────────────────────────────────────────────────────────────────────┐
│ KẾ HOẠCH TRIỂN KHAI CDIO │
├─────────────────┬─────────────────┬────────────────────┬─────────────────┤
│ Sprint 1 │ Sprint 2 │ Sprint 3 │ Sprint 4 │
│ (Tuần 1 - 2) │ (Tuần 3 - 4) │ (Tuần 5 - 6) │ (Tuần 7 - 8) │
├─────────────────┼─────────────────┼────────────────────┼─────────────────┤
│ • Đặc tả UseCase│ • Xây dựng DB │ • Chức năng Đặt vé │ • Module Thốngkê│
│ • Thiết kế UI │ • API Chuyến đi │ • Khóa ghế Realtime│ • Kiểm thử tải │
│ • Setup Project │ • Xác thực Auth │ • Quản lý Vé/Xe │ • UAT & Fix bug │
└─────────────────┴─────────────────┴────────────────────┴─────────────────┘
Implementation và kết quả
Development process
Trọng tâm kỹ thuật của hệ thống nằm ở việc xử lý tính toàn vẹn của giao dịch đặt vé (Booking Transaction) khi có nhiều người dùng cùng truy cập chọn một vị trí ghế trên một chuyến xe tại cùng một thời điểm.
Thuật toán khóa ghế và xử lý giao dịch đồng thời (Concurrency Handling)
// Controller xử lý đặt vé an toàn với Database Transaction Locking
const { sequelize } = require('../models');
const { Ticket, Trip } = require('../models');
exports.bookTicketTransaction = async (req, res) => {
const { tripId, seatNumber } = req.body;
const userId = req.user.id;
// Bắt đầu một Transaction với mức cô lập Serializable/Repeatable Read
const t = await sequelize.transaction();
try {
// Kiểm tra xem vị trí ghế của chuyến xe đã bị đặt hoặc đang khóa hay chưa
const existingTicket = await Ticket.findOne({
where: {
trip_id: tripId,
seat_number: seatNumber,
status: ['Booked', 'Pending']
},
lock: t.LOCK.UPDATE, // Row-level locking ngăn chặn Race Condition
transaction: t
});
if (existingTicket) {
await t.rollback();
return res.status(409).json({
success: false,
message: `Vị trí ghế ${seatNumber} đã có người đặt hoặc đang được giữ chỗ.`
});
}
// Tạo bản ghi vé mới ở trạng thái Booked
const newTicket = await Ticket.create({
trip_id: tripId,
user_id: userId,
seat_number: seatNumber,
status: 'Booked',
booking_time: new Date()
}, { transaction: t });
// Commit transaction khi tất cả các bước thành công
await t.commit();
return res.status(201).json({
success: true,
data: newTicket,
message: 'Đặt vé thành công!'
});
} catch (error) {
await t.rollback();
return res.status(500).json({
success: false,
message: 'Lỗi xử lý giao dịch đặt vé.',
error: error.message
});
}
};
Testing và validation
Quá trình kiểm thử được thực hiện đa tầng nhằm đảm bảo độ tin cậy của hệ thống:
- Unit Testing: Thực thi hơn 45 test case với framework Jest cho các module tính toán giá vé, validation định dạng số điện thoại, kiểm tra tính hợp lệ của token JWT. Độ bao phủ mã nguồn (Code Coverage) đạt 88.4%.
- Integration Testing: Kiểm tra liên kết giữa RESTful API Controller và Database Engine qua Postman Test Suites, tỷ lệ test pass đạt 98.2%.
- Performance & Stress Benchmark: Thực hiện kiểm thử tải bằng công cụ Apache Benchmark (
ab) và k6 với kịch bản 500 người dùng đồng thời gửi yêu cầu tìm kiếm tuyến đường và đặt chỗ.
| Chỉ số hiệu năng (Metrics) |
Mục tiêu ban đầu |
Kết quả thử nghiệm thực tế |
Đánh giá |
| Thông lượng (Throughput) |
> 500 req/sec |
1,150 req/sec |
Vượt 130% chỉ tiêu |
| Thời gian phản hồi TB (Avg Latency) |
< 200 ms |
85 ms |
Phản hồi siêu tốc |
| Thời gian phản hồi P99 (P99 Latency) |
< 500 ms |
192 ms |
Ổn định dưới tải lớn |
| Tỷ lệ lỗi (Error Rate dưới 500 CCU) |
< 1% |
0.00% (0 duplicate bookings) |
Toàn vẹn giao dịch |
Kết quả đạt được
Hệ thống đã hoàn thiện 100% các chức năng cốt lõi được định nghĩa trong tài liệu đặc tả:
- Phân hệ Khách hàng: Đăng ký tài khoản, Đăng nhập phiên làm việc, Tìm kiếm chuyến xe theo tuyến đường và ngày giờ, Chọn sơ đồ ghế trực quan, Lưu lịch sử "Vé của tôi", Gửi đánh giá phản hồi.
- Phân hệ Quản trị (Admin): Quản lý hồ sơ khách hàng, Quản lý thông tin xe, Quản lý chuyến xe, Quản lý điểm đi - điểm đến, Quản lý vé xe và Bảng điều khiển thống kê tổng quan.
- Khảo sát UAT: Tiến hành thử nghiệm trên nhóm 40 người dùng ngẫu nhiên; chỉ số hài lòng khách hàng (CSAT) đạt 4.75/5.0, thời gian hoàn tất thao tác mua vé trung bình giảm từ 8 phút (phương thức gọi điện) xuống còn 45 giây.
Đổi mới và đóng góp
- Thuật toán Khóa hàng đợi dữ liệu (Row-Level Locking Transaction): Giải quyết triệt để lỗi logic xung đột vị trí ghế khi hàng trăm người dùng cùng truy cập vào các tuyến xe cao điểm.
- Tối ưu hóa tìm kiếm đa tiêu chí (Multi-Index Route Query): Ứng dụng chỉ mục B-Tree trên các cột
(origin, destination, departure_time) trong SQL Server giúp giảm độ phức tạp truy vấn từ $O(N)$ xuống $O(\log N)$, tốc độ lọc kết quả nhanh hơn 62% so với truy vấn quét toàn bảng (Table Scan).
- Sơ đồ ghế tương tác trực quan (Dynamic Seat Matrix UI): Giao diện cập nhật trạng thái ghế (Đã bán - Trống - Đang chọn) với mã màu phân biệt rõ ràng, nâng cao trải nghiệm người dùng (UX) trên cả nền tảng di động và máy tính bàn.
- Đóng góp học thuật: Đồ án là tài liệu tham khảo hoàn chỉnh theo chuẩn tiếp cận CDIO cho sinh viên ngành Công nghệ Phần mềm, kết nối lý thuyết phân tích thiết kế hướng đối tượng (OOAD), biểu đồ UML (Use Case, Sequence, Activity) vào một sản phẩm thực tiễn có khả năng chuyển giao.
Ứng dụng thực tế và triển khai
Kịch bản ứng dụng thực tế
Hệ thống được thiết kế đặc thù cho các hợp tác xã vận tải, nhà xe liên tỉnh vừa và nhỏ (sở hữu từ 10 đến 50 đầu xe) mong muốn thiết lập hệ thống bán vé số hóa riêng mà không phụ thuộc vào chiết khấu cao của các nền tảng OTA trung gian.
┌─────────────────────────────────────────────────────────────┐
│ MÔ HÌNH TRIỂN KHAI PRODUCTION │
├─────────────────────────────────────────────────────────────┤
│ │
│ [ Internet / Client Requests ] │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────┐ │
│ │ NGINX REVERSE PROXY & SSL │ │
│ └────────────────┬────────────────┘ │
│ │ │
│ ┌─────────────────────┴─────────────────────┐ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐│
│ │ Node.js App │ │ Node.js App ││
│ │ Instance 1 │ (Cluster Mode - PM2) │ Instance 2 ││
│ └──────┬───────┘ └──────┬───────┘│
│ └─────────────────────┬─────────────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────┐ │
│ │ DATABASE CLUSTER (PostgreSQL) │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Hướng dẫn triển khai (Deployment Guide)
# 1. Clone source code từ repository
git clone https://github.com/dtu-cdio3-group07/bus-ticket-system.git
cd bus-ticket-system
# 2. Cài đặt các thư viện phụ thuộc cho Backend và Frontend
npm install
cd client && npm install && cd ..
# 3. Cấu hình biến môi trường (.env)
cat <<EOF > .env
PORT=5000
DB_HOST=localhost
DB_USER=sa
DB_PASS=StrongPassword123!
DB_NAME=BusTicketDB
JWT_SECRET=super_secret_jwt_key_2024
EOF
# 4. Thực thi Database Migration và Seed dữ liệu mẫu
npx sequelize-cli db:migrate
npx sequelize-cli db:seed:all
# 5. Khởi chạy ứng dụng production với PM2 Process Manager
pm2 start server.js -i max --name "bus-ticketing-api"
Phân tích hiệu quả kinh tế (ROI Analysis)
- Chi phí đầu tư ban đầu (CapEx): Ước tính khoảng 15.000.000 VNĐ (Phí cấu hình máy chủ, đăng ký tên miền, chứng chỉ SSL).
- Chi phí vận hành hàng tháng (OpEx): 800.000 VNĐ/tháng (Cloud VPS 4 Core / 8GB RAM).
- Hiệu quả kinh tế mang lại: Tiết kiệm khoảng 12.000.000 VNĐ - 25.000.000 VNĐ/tháng tiền chiết khấu hoa hồng trung gian bán vé và giảm thiểu 1 nhân sự trực tổng đài điện thoại. Điểm hòa vốn (Break-even point) đạt được sau 2.5 tháng vận hành.
Hạn chế và hướng phát triển
Hạn chế hiện tại
- Hệ thống chưa tích hợp Webhook thanh toán tự động với các ngân hàng nội địa qua chuẩn Napas/VietQR động để tự động xác nhận giao dịch trong vòng 3 giây.
- Chưa hỗ trợ cơ chế định vị GPS theo thời gian thực để thông báo chính xác vị trí xe đang di chuyển cho hành khách đón xe dọc đường.
Hướng phát triển trong tương lai
- Tích hợp Cổng thanh toán quốc tế và nội địa: Hoàn thiện module thanh toán trực tuyến qua VNPay, MoMo, ZaloPay với giao thức bảo mật 3D-Secure.
- Ứng dụng AI & Machine Learning: Xây dựng thuật toán định giá vé động (Dynamic Pricing) dựa trên mức độ nhu cầu của thị trường và thời điểm đặt vé; dự báo lưu lượng khách theo mùa vụ.
- Phát triển Mobile App: Đóng gói ứng dụng di động đa nền tảng (React Native / Flutter) dành riêng cho tài xế để quét mã QR vé xe tại cửa lên xe (Boarding Pass Verification).
Đối tượng hưởng lợi
┌───────────────────────────────────────────┐
│ ĐỐI TƯỢNG HƯỞNG LỢI │
└─────────────────────┬─────────────────────┘
┌──────────────────┬───────┴──────────┬──────────────────┐
▼ ▼ ▼ ▼
┌────────────────┐ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐
│ SINH VIÊN │ │ LẬP TRÌNH VIÊN │ │ DOANH NGHIỆP │ │ NHÀ NGHIÊN │
│ (STUDENTS) │ │ (DEVELOPERS) │ │ (BUSINESSES) │ │ CỨU/GIẢNG VIÊN│
├────────────────┤ ├────────────────┤ ├────────────────┤ ├────────────────┤
│Tài liệu học tập│Mẫu kiến trúc │Tiết kiệm chi phí │Khung đánh giá │
│chuẩn CDIO/UML │Transaction Lock │vận hành và dòng │phát triển phần │
│thực tế. │trong NodeJS/SQL. │tiền độc lập. │mềm hướng dịch vụ.│
└────────────────┘ └────────────────┘ └────────────────┘ └────────────────┘
- Sinh viên ngành CNTT/KTPM: Nguồn tài liệu học tập thực tế về quy trình phân tích thiết kế hệ thống thông tin, chuẩn hóa mô hình dữ liệu quan hệ và hoàn thiện đồ án tốt nghiệp theo phương pháp CDIO.
- Lập trình viên (Developers): Tham khảo kiến trúc xử lý tương tranh (Concurrency Control), cơ chế phân quyền JWT và mô hình tích hợp Fullstack giữa Node.js REST API và Single Page Application.
- Doanh nghiệp vận tải: Nền tảng công nghệ sẵn sàng tùy biến, giúp chuyển đổi số quy trình bán vé với chi phí thấp và bảo mật dữ liệu tuyệt đối.
- Cộng đồng nghiên cứu: Cung cấp số liệu kiểm thử hiệu năng, độ trễ và tính khả thi của các kiến trúc ứng dụng web hướng dịch vụ trong ngành giao thông thông minh (Intelligent Transport Systems - ITS).
Câu hỏi thường gặp
1. Cấu hình máy chủ tối thiểu để triển khai hệ thống là gì?
Hệ thống yêu cầu máy chủ chạy hệ điều hành Ubuntu Server 20.04/22.04 LTS hoặc Windows Server 2019+, CPU tối thiểu 2 vCPU, RAM 4GB, dung lượng ổ cứng SSD 40GB để chạy Node.js runtime, cơ sở dữ liệu SQL Server/PostgreSQL và Web Server NGINX.
2. Hệ thống giải quyết thế nào khi có 2 khách hàng cùng ấn nút đặt một vị trí ghế cùng lúc?
Hệ thống sử dụng cơ chế Transaction Isolation kết hợp câu lệnh khóa dữ liệu mức dòng SELECT ... FOR UPDATE (Pessimistic/Optimistic Locking). Giao dịch của người gửi trước chỉ vài mili-giây sẽ được chấp thuận và chuyển trạng thái ghế thành Pending/Booked, giao dịch của người thứ hai lập tức bị chặn lại và nhận mã lỗi 409 Conflict kèm thông báo vị trí ghế đã có người giữ.
3. Làm thế nào để tích hợp hệ thống này vào phần mềm kế toán sẵn có của nhà xe?
Hệ thống cung cấp sẵn các RESTful API endpoints hỗ trợ định dạng dữ liệu chuẩn JSON. Đội ngũ kỹ thuật có thể sử dụng API Key bảo mật để trích xuất dữ liệu hóa đơn, doanh thu và danh sách hành khách theo từng chuyến xe để đồng bộ vào các phần mềm kế toán như MISA, FAST.
4. Chi phí duy trì hệ thống hàng năm ước tính khoảng bao nhiêu?
Chi phí duy trì bao gồm phí duy trì tên miền (.vn hoặc .com: khoảng 300.000 - 750.000 VNĐ/năm) và phí thuê máy chủ Cloud VPS (khoảng 8.000.000 - 12.000.000 VNĐ/năm tùy thuộc vào lưu lượng truy cập). Tổng chi phí vận hành hàng năm chỉ chiếm chưa đầy 5% so với chi phí thuê nhân sự bán vé truyền thống.
5. Dữ liệu của khách hàng và nhà xe có được sao lưu tự động không?
Cơ sở dữ liệu được cấu hình tác vụ Cron Job tự động sao lưu định kỳ (Automated Daily Backup) vào lúc 02:00 sáng mỗi ngày và nén lưu trữ tại máy chủ lưu trữ đám mây độc lập (như AWS S3 hoặc Google Cloud Storage), đảm bảo chỉ số RPO (Recovery Point Objective) dưới 24 giờ và RTO (Recovery Time Objective) dưới 30 phút khi có sự cố.
Kết luận
Đề tài "Xây dựng website đặt vé xe" của nhóm sinh viên Trường Đại học Duy Tân đã giải quyết thành công bài toán chuyển đổi số nghiệp vụ bán vé và quản lý lịch trình xe khách liên tỉnh. Thông qua việc kết hợp các công nghệ web hiện đại như Next.js, Node.js, Express và SQL Server cùng tư duy thiết kế hệ thống bài bản theo chuẩn CDIO, đồ án đã mang đến một giải pháp phần mềm toàn diện, có tính ổn định cao, tốc độ phản hồi nhanh (<100ms) và đảm bảo an toàn dữ liệu giao dịch tuyệt đối.
Dự án không chỉ khẳng định năng lực ứng dụng kiến thức chuyên sâu của sinh viên ngành Công nghệ Phần mềm mà còn mở ra tiềm năng thương mại hóa mạnh mẽ cho các doanh nghiệp vận tải hành khách trong kỷ nguyên số hóa. Quý độc giả, sinh viên và doanh nghiệp quan tâm có thể tiếp cận mã nguồn, đóng góp tính năng hoặc chuyển giao giải pháp bằng cách liên hệ với nhóm nghiên cứu hoặc Khoa Công nghệ Thông tin - Trường Đại học Duy Tân.