Giới thiệu dự án

Thị trường du lịch trực tuyến (Online Travel Agency - OTA) tại Việt Nam đang chứng kiến sự tăng trưởng vượt bậc với tỷ lệ số hóa đạt trên 60% trong hành vi đặt tour và lưu trú của người tiêu dùng. Đồ án tốt nghiệp chuyên ngành Công nghệ Thông tin tại Trường Đại học Sư phạm Kỹ thuật TP.HCM với đề tài "Xây dựng website cung cấp các dịch vụ du lịch" (thực hiện bởi sinh viên Đinh Minh Khôi và Phạm Văn Đức Tiến, dưới sự hướng dẫn của ThS. Nguyễn Trần Thi Văn) đã giải quyết triệt để bài toán kết nối giữa các đơn vị cung cấp dịch vụ du lịch (Enterprise) và khách hàng cá nhân (Customer).

+-------------------------------------------------------------------------------+
|                       HỆ SINH THÁI DỊCH VỤ DU LỊCH TRỰC TUYẾN                 |
|                                                                               |
|   +-------------------+     +--------------------+     +------------------+   |
|   |  Super Admin/Admin| <-> | Enterprise / Staff | <-> |  Customer / User |   |
|   | (Quản trị & Phân  |     | (Quản lý Tour, Lưu |     | (Tìm kiếm, Đặt   |   |
|   |  quyền, Hoa hồng) |     |  trú, Doanh thu)   |     |  chỗ, Đánh giá)  |   |
|   +-------------------+     +--------------------+     +------------------+   |
|             |                         |                         |             |
|             +-------------------------+-------------------------+             |
|                                       |                                       |
|                    +-------------------------------------+                    |
|                    |  Core Engine: Next.js + Node.js API |                    |
|                    |  Tích hợp VNPAY & Google Maps API   |                    |
|                    +-------------------------------------+                    |
+-------------------------------------------------------------------------------+

1. Vấn đề thực tiễn (Problem Statement)

Các doanh nghiệp vừa và nhỏ (SMEs) trong lĩnh vực lữ hành và lưu trú thường gặp nhiều trở ngại:

  • Thiếu nền tảng thương mại điện tử chuyên biệt để quảng bá dịch vụ và tự động hóa quy trình phân phối vé/phòng.
  • Xung đột trạng thái phòng trống (race conditions) và dữ liệu tour theo thời gian thực.
  • Xử lý thủ công các nghiệp vụ phức tạp như đổi lịch (reschedule), hủy dịch vụ (cancellation), và hoàn tiền.
  • Kênh tương tác hai chiều còn hạn chế, khách hàng mới khó tiếp cận phản hồi thực tế từ những người đã trải nghiệm dịch vụ.

2. Mục tiêu của dự án (Project Objectives)

  1. Xây dựng API Server chuẩn RESTful: Đáp ứng toàn bộ luồng nghiệp vụ từ quản trị tài khoản, kiểm tra phòng trống, quản lý tour đến xử lý thanh toán tự động.
  2. Phát triển Frontend tối ưu hóa SEO: Ứng dụng Next.js với kỹ thuật Server-Side Rendering (SSR) và Static Site Generation (SSG) nhằm tăng tốc độ tải trang và khả năng lập chỉ mục của công cụ tìm kiếm.
  3. Tích hợp các dịch vụ bên thứ ba (Third-party Integration): Kết nối Cổng thanh toán VNPAY và Google Maps API để định vị tọa độ du lịch chính xác.
  4. Thiết lập kiến trúc phân quyền Role-Based Access Control (RBAC): Phân cấp 5 nhóm quyền hạn chuyên biệt: Super Admin, Admin, Enterprise, Staff và Customer.

3. Phương pháp tiếp cận và kết quả kỳ vọng

  • Giải pháp: Xây dựng kiến trúc phân tầng rõ ràng giữa Backend (Node.js/Express) và Frontend (Next.js/React), chuẩn hóa cơ sở dữ liệu quan hệ MySQL qua Sequelize ORM.
  • Kết quả kỳ vọng: Hệ thống chịu tải ổn định, thời gian phản hồi API trung bình dưới 200ms, tỷ lệ tự động hóa quy trình đặt chỗ và xuất hóa đơn đạt 100%.
  • Phạm vi & Giới hạn: Ứng dụng tập trung vào thị trường du lịch nội địa Việt Nam, hỗ trợ thanh toán nội địa qua cổng VNPAY.

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 nền tảng OTA hàng đầu thế giới và khu vực giúp định hình các tính năng cốt lõi cần tối ưu hóa:

Nền tảng Ưu điểm kỹ thuật & Trải nghiệm Nhược điểm / Điểm cần cải tiến Bài học áp dụng cho dự án
Traveloka UI thu hút, tích hợp đa dạng dịch vụ, nhiều khuyến mãi Luồng đặt dịch vụ nhiều bước, xử lý giao diện nặng Giữ bố cục trang chủ tập trung vào dịch vụ chính và sự kiện ưu đãi
Booking.com Bộ lọc chi tiết, chọn số lượng phòng trực tiếp trong chi tiết Header bị ẩn khi cuộn, thiếu thông tin sự kiện giảm giá nổi bật Áp dụng sticky header, cải tiến bộ lọc linh hoạt
Agoda Trình bày phòng trực quan, phương thức thanh toán phong phú Header cuộn chưa tối ưu việc chuyển tab dịch vụ Tối ưu hóa thanh điều hướng cố định, tích hợp bản đồ số

Phân tích yêu cầu theo mô hình MoSCoW

  • Must-have: Xác thực người dùng (JWT, Email Verification), tìm kiếm & lọc dịch vụ, kiểm tra phòng trống (CheckRoom), đặt tour/phòng và tích hợp cổng thanh toán VNPAY.
  • Should-have: Hệ thống quản lý hoa hồng (Commission), quản lý đổi lịch/hủy đơn theo chính sách (Policy), phân hệ quản trị doanh thu đa cấp.
  • Could-have: Module thảo luận lồng nhau trong đánh giá (cho phép người chưa đặt câu hỏi cho người đã trải nghiệm).
  • Won't-have (giai đoạn này): Đặt vé máy bay quốc tế, gợi ý lịch trình thông minh bằng AI đa phương thức.
+-----------------------------------------------------------------------------------+
|                         MA TRẬN YÊU CẦU DỰ ÁN (MoSCoW MATRIX)                     |
+-----------------------------------------+-----------------------------------------+
| [MUST-HAVE] (Bắt buộc hoàn thành)       | [SHOULD-HAVE] (Quan trọng cần có)       |
| - JWT Authentication & RBAC 5 Roles     | - Quản lý hoa hồng (Commission engine)  |
| - Dynamic Room Availability (CheckRoom) | - Quản lý đổi lịch / Hủy đơn (Policy)   |
| - Core Booking Engine & VNPAY Payment   | - Báo cáo doanh thu thời gian thực      |
+-----------------------------------------+-----------------------------------------+
| [COULD-HAVE] (Giá trị gia tăng)         | [WON'T-HAVE] (Phát triển tương lai)     |
| - Thảo luận 2 chiều trong Review        | - AI Recommendation Engine              |
| - Tích hợp tương tác Google Maps API    | - Đặt vé máy bay quốc tế                |
+-----------------------------------------+-----------------------------------------+

Thiết kế hệ thống

1. Kiến trúc phân tầng và Công nghệ sử dụng

Hệ thống được thiết kế theo mô hình Client-Server tách biệt hoàn toàn:

  • Client Tier: Next.js (v13.4+), React (v18.2), Redux Toolkit, Reactstrap, Bootstrap 5.
  • Application/API Tier: Node.js (v18 LTS), ExpressJS (v4.18), JSON Web Token (JWT), Nodemailer, Sequelize ORM (v6.31).
  • Database Tier: MySQL Server 8.0.
  • External Services: VNPAY Payment Gateway API, Google Maps JavaScript API.
+-----------------------------------------------------------------------------------+
|                            KIẾN TRÚC HỆ THỐNG PHÂN TẦNG                           |
+-----------------------------------------------------------------------------------+
| [CLIENT TIER] Next.js v13.4 (SSR/SSG) + Redux Toolkit + Reactstrap + Google Maps  |
+-----------------------------------------------------------------------------------+
                                         |  HTTPS / RESTful API (JSON Payload)
                                         v
+-----------------------------------------------------------------------------------+
| [API GATEWAY / APP TIER] Node.js v18 LTS + Express.js v4.18                      |
|  - Middleware: JWT Auth, RBAC Authorization, Rate Limiting, Input Validation      |
|  - Business Controllers: Booking, Tour, Stay, Availability, Commission, Payment   |
|  - Services: Nodemailer, VNPAY IPN Integration                                   |
+-----------------------------------------------------------------------------------+
                                         |  Sequelize ORM v6.31
                                         v
+-----------------------------------------------------------------------------------+
| [DATA PERSISTENCE TIER] MySQL 8.0 (ACID Compliant Transactions)                   |
|  - Entities: Account, User, Tour, Stay, Room, CheckRoom, TourBill, StayBill,...   |
+-----------------------------------------------------------------------------------+

2. Thiết kế Cơ sở dữ liệu quan hệ (Database Schema)

Các thực thể chính được chuẩn hóa ở dạng chuẩn 3NF:

  • User & Account: Lưu trữ thông tin định danh, mật khẩu băm (bcrypt), mã kích hoạt email, phân loại quyền (roleId).
  • Tour & Schedule: Thông tin tour, lịch trình, giá bán, thời gian khởi hành, số chỗ tối đa.
  • Stay, Room & CheckRoom: Thông tin khách sạn/resort, các loại phòng, quản lý số lượng phòng khả dụng theo từng ngày cụ thể (available_date, room_count).
  • TourBill, StayBill & RoomBillDetail: Lưu trữ hóa đơn, trạng thái thanh toán, mã giao dịch VNPAY, chính sách hoàn hủy.
  • Commission, Event, Policy, Comment: Quản lý tỷ lệ chiết khấu sàn, khuyến mãi voucher và thảo luận dịch vụ.

3. Thiết kế RESTful API Endpoints tiêu biểu

  • POST /api/v1/auth/register & POST /api/v1/auth/login: Xác thực và cấp phát access token.
  • GET /api/v1/tours/search: Lọc tour theo địa điểm, ngày đi và khoảng giá.
  • GET /api/v1/stays/:id/availability: Kiểm tra số lượng phòng trống theo khoảng ngày [checkIn, checkOut].
  • POST /api/v1/bookings/create-payment-url: Khởi tạo phiên thanh toán sang VNPAY Sandbox.
  • GET /api/v1/bookings/vnpay-return: Xử lý phản hồi trạng thái giao dịch từ VNPAY (IPN / Return URL).

Phương pháp luận (Methodology)

Dự án áp dụng mô hình Agile Scrum với các chu kỳ phát triển 2 tuần/sprint:

  • Thời gian thực hiện: 20/02/2023 – 29/05/2023 (14 tuần).
  • Quản lý rủi ro:
    • Rủi ro bất đồng bộ trạng thái thanh toán: Xây dựng cơ chế kiểm tra chéo giữa bảng hóa đơn và mã phản hồi VNPAY vnp_ResponseCode === '00'.
    • Rủi ro quá tải truy vấn tìm kiếm: Tối ưu hóa index trên các trường location, price, departure_date.
  • Đảm bảo chất lượng (QA): Kiểm thử tự động API bằng Postman, kiểm thử tải (stress testing) cho luồng kiểm tra phòng trống.

Triển khai và kết quả thực nghiệm

Quy trình phát triển (Development Process)

Dự án kế thừa có chọn lọc từ đề tài nghiên cứu cơ sở, thực hiện tái cấu trúc toàn diện (refactoring):

  • Tái cấu trúc 85% logic backend: Sửa đổi toàn bộ kiến trúc xử lý dữ liệu dịch vụ tour và phòng lưu trú cũ bị sai logic nghiệp vụ.
  • Xây dựng mới 100% giao diện: Chuyển đổi sang Next.js SSR để hỗ trợ SEO vượt trội so với kiến trúc Single Page Application thuần túy.

1. Thuật toán kiểm tra phòng trống (CheckRoom Availability Engine)

Để ngăn ngừa tình trạng đặt vượt quá số phòng thực tế (overbooking), hệ thống triển khai thuật toán kiểm tra giao thoa các khoảng thời gian đặt phòng:

/**
 * Thuật toán kiểm tra số lượng phòng khả dụng trong khoảng thời gian
 * Độ phức tạp thuật toán: O(N) với N là số ngày trong khoảng checkIn -> checkOut
 */
async function verifyRoomAvailability(roomId, checkInDate, checkOutDate, requestedQuantity) {
  const checkRooms = await CheckRoom.findAll({
    where: {
      roomId: roomId,
      date: {
        [Op.gte]: new Date(checkInDate),
        [Op.lt]: new Date(checkOutDate)
      }
    },
    transaction: t // Đảm bảo tính cô lập giao dịch ACID
  });

  // Duyệt qua từng ngày để đối chiếu với số lượng phòng trống thực tế
  for (const record of checkRooms) {
    if (record.availableRooms < requestedQuantity) {
      return { 
        isAvailable: false, 
        failedDate: record.date,
        remaining: record.availableRooms 
      };
    }
  }
  return { isAvailable: true };
}

2. Phân quyền truy cập đa cấp (RBAC Middleware)

const authorizeRoles = (...allowedRoles) => {
  return (req, res, next) => {
    if (!req.user || !allowedRoles.includes(req.user.roleName)) {
      return res.status(403).json({
        success: false,
        message: 'Truy cập bị từ chối: Bạn không có quyền thực thi tác vụ này.'
      });
    }
    next();
  };
};

Kiểm thử và Đánh giá (Testing & Validation)

Hệ thống trải qua các kịch bản kiểm thử nghiêm ngặt trên môi trường staging:

+-------------------------------------------------------------------------------+
|                       KẾT QUẢ KIỂM THỬ HỆ THỐNG (TESTING & UAT)               |
+-----------------------------------+-------------------------------------------+
| Phân hệ kiểm thử                  | Kết quả & Chỉ số đo lường                |
+-----------------------------------+-------------------------------------------+
| 1. Authentication & Security      | 100% Pass (JWT, Bcrypt, XSS Sanitization) |
| 2. Tour & Stay Search Performance | Avg Response Time: 128ms (MySQL Indexed)  |
| 3. Room Availability Check        | 0% Race Condition (ACID Transactions)     |
| 4. VNPAY Payment Gateway Flow     | 100% Khớp trạng thái đơn hàng (Sandbox)   |
| 5. Next.js SEO & Performance      | Google Lighthouse Score: 95/100           |
+-----------------------------------+-------------------------------------------+
  1. Hiệu năng tải trang (Google Lighthouse Metrics):
    • First Contentful Paint (FCP): 0.8 giây.
    • Largest Contentful Paint (LCP): 1.4 giây.
    • SEO Score: 95/100 (nhờ cơ chế Next.js Server-Side Rendering).
  2. Kiểm thử chấp nhận người dùng (User Acceptance Testing - UAT):
    • Thử nghiệm trên 50 người dùng độc lập (bao gồm 10 quản lý doanh nghiệp du lịch).
    • Tỷ lệ hài lòng về tính tiện dụng và độ mượt mà đạt 92%.

Kết quả đạt được

Hệ thống hoàn thành 100% các chức năng cốt lõi theo đề cương nhiệm vụ tốt nghiệp:

  • Xây dựng hoàn chỉnh phân hệ đặt tour và phòng tích hợp cổng thanh toán trực tuyến.
  • Phân tách quyền hạn mạch lạc giữa Super Admin (quản lý vĩ mô, đối soát hoa hồng), Admin (vận hành hệ thống), Enterprise (chủ cơ sở du lịch), Staff (nhân viên điều hành) và Customer.
  • Cung cấp module thống kê doanh thu đa chiều theo từng tháng và theo từng dịch vụ cụ thể.

Đổi mới và đóng góp kỹ thuật

  1. Module thảo luận tương tác hai chiều trong đánh giá dịch vụ: Khác với cơ chế bình luận một chiều thông thường trên Booking.com hay Traveloka, hệ thống cho phép những khách hàng chưa đặt dịch vụ có thể đặt câu hỏi trực tiếp dưới bình luận của khách hàng đã sử dụng. Giải pháp này giúp tăng tỷ lệ chuyển đổi (conversion rate) thêm ước tính 25%.
  2. Cơ chế tính toán và quản lý hoa hồng sàn tự động (Commission Engine): Hệ thống hóa cấu trúc chiết khấu phần trăm linh hoạt cho Super Admin đối với từng đối tác Enterprise, tự động khấu trừ và xuất báo cáo đối soát doanh thu minh bạch.
  3. Quy trình xử lý đổi lịch và hoàn tiền tích hợp Policy: Số hóa quy trình đổi ngày khởi hành tour hoặc đổi phòng lưu trú trực tiếp trên giao diện cá nhân, tự động tính chênh lệch giá và áp dụng biểu phí theo quy định trước đó của nhà cung cấp.

Ứng dụng thực tế và triển khai

Kịch bản ứng dụng thực tế (Real-world Use Cases)

  • Doanh nghiệp lữ hành nội địa: Đăng ký tài khoản Enterprise để đăng tải danh sách tour, quản lý số lượng hướng dẫn viên (Staff) và theo dõi doanh thu hàng tháng theo thời gian thực.
  • Chủ chuỗi homestay / khách sạn vừa và nhỏ: Kiểm soát tình trạng phòng trống linh hoạt theo từng ngày, tiếp nhận đặt cọc tức thì qua VNPAY mà không cần đầu tư hệ thống PMS đắt đỏ.
  • Khách du lịch tự túc: Tra cứu vị trí chính xác của điểm đến thông qua bản đồ số Google Maps, đặt trọn gói vé tham quan và nơi lưu trú chỉ trong một giao dịch.

Chiến lược triển khai (Deployment Architecture)

  • Hạ tầng máy chủ: Triển khai trên Ubuntu Server 22.04 LTS (Nginx Reverse Proxy, PM2 Process Manager cho Node.js API).
  • Frontend Hosting: Vercel Platform hoặc Node.js SSR Cluster.
  • Bảo mật: Mã hóa toàn bộ đường truyền qua giao thức HTTPS (Chứng chỉ Let's Encrypt SSL/TLS), bảo vệ cơ sở dữ liệu sau tường lửa Private Subnet.
  • Hiệu quả kinh tế (ROI): Giúp các doanh nghiệp du lịch cắt giảm 65% chi phí nhân sự trực tổng đài và xử lý đơn đặt thủ công.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật hiện tại

  • Hệ thống chưa tích hợp bộ nhớ đệm phân tán Redis để tối ưu hóa bộ nhớ tạm cho các truy vấn kiểm tra phòng trống có mật độ truy cập cao.
  • Xử lý gửi email kích hoạt tài khoản và hóa đơn vẫn đang chạy đồng bộ trên main thread của Node.js, có thể gây trễ nhẹ khi lưu lượng email tăng đột biến.

Hướng phát triển trong tương lai

  1. Chuyển đổi sang kiến trúc Microservices: Tách riêng Service Đặt phòng (Booking Service) và Service Thanh toán (Payment Service) sử dụng Docker Container và Kubernetes.
  2. Tích hợp Message Queue: Áp dụng RabbitMQ hoặc Apache Kafka để xử lý bất đồng bộ các tác vụ gửi thông báo, xuất hóa đơn PDF và gửi email.
  3. Ứng dụng Trí tuệ nhân tạo (AI Engine): Xây dựng hệ thống gợi ý (Recommendation System) dựa trên lịch sử tìm kiếm và hành vi của người dùng.
  4. Mở rộng thanh toán quốc tế: Tích hợp thêm cổng thanh toán Stripe và PayPal nhằm phục vụ khách du lịch nước ngoài.

Đối tượng hưởng lợi

+-------------------------------------------------------------------------------+
|                       GIÁ TRỊ MANG LẠI CHO CÁC NHÓM ĐỐI TƯỢNG                 |
+-------------------------------------------------------------------------------+
| [SINH VIÊN & NGHIÊN CỨU SINH]                                                 |
| - Tài liệu tham khảo chuẩn mực về đồ án Full-stack (Next.js + Node.js).       |
| - Mã nguồn mẫu thiết kế phân quyền RBAC và tích hợp thanh toán thực tế.       |
+-------------------------------------------------------------------------------+
| [LẬP TRÌNH VIÊN WEB (DEVELOPERS)]                                             |
| - Mô hình giải quyết bài toán chống race condition khi đặt phòng.             |
| - Cấu trúc thư mục chuẩn RESTful API và Next.js SSR SEO-friendly.             |
+-------------------------------------------------------------------------------+
| [DOANH NGHIỆP DU LỊCH & LỮ HÀNH (SMEs)]                                       |
| - Giải pháp chuyển đổi số toàn diện, tiết kiệm chi phí xây dựng hệ thống.     |
| - Tự chủ quản lý doanh thu, nhân sự và tương tác trực tiếp với khách hàng.    |
+-------------------------------------------------------------------------------+
| [KHÁCH HÀNG / DU KHÁCH (END USERS)]                                           |
| - Trải nghiệm đặt dịch vụ mượt mà, minh bạch về giá cả và tình trạng phòng.   |
| - Thanh toán an toàn, bảo mật thông qua cổng thanh toán quốc gia VNPAY.       |
+-------------------------------------------------------------------------------+

Câu hỏi thường gặp

1. Yêu cầu kỹ thuật phần cứng và môi trường để triển khai hệ thống là gì?

Máy chủ tối thiểu yêu cầu CPU 2 Cores, RAM 4GB, ổ cứng SSD 40GB chạy hệ điều hành Ubuntu 20.04/22.04 LTS; cài đặt sẵn Node.js runtime v18.x, MySQL Server v8.0 và web server Nginx đóng vai trò Reverse Proxy.

2. Hệ thống xử lý thế nào khi xảy ra xung đột nhiều người cùng đặt 1 phòng cuối cùng?

Hệ thống sử dụng cơ chế Transaction Isolation Level trong MySQL kết hợp Sequelize Transaction (LOCK FOR UPDATE), đảm bảo việc đọc và trừ số lượng phòng trống trong bảng CheckRoom diễn ra tuần tự (Atomic), ngăn ngừa hoàn toàn tình trạng ghi đè dữ liệu sai lệch.

3. Khả năng tích hợp với các hệ thống quản lý khách sạn (PMS) hiện có như thế nào?

Kiến trúc Backend được xây dựng chuẩn RESTful API với định dạng dữ liệu đầu ra JSON, cho phép dễ dàng phát triển các module Webhook hoặc Open API để đồng bộ dữ liệu hai chiều với các phần mềm PMS hoặc Channel Manager bên thứ ba.

4. Chi phí bảo trì và vận hành hệ thống ước tính hàng tháng là bao nhiêu?

Chi phí duy trì hạ tầng đám mây (Cloud VPS), tên miền (Domain), chứng chỉ SSL và chi phí cổng thanh toán dao động trong khoảng 500.000 – 1.500.000 VNĐ/tháng, rất tối ưu cho các doanh nghiệp vừa và nhỏ.

5. Thời gian thu hồi vốn (ROI Timeline) khi doanh nghiệp áp dụng giải pháp này?

Nhờ việc cắt giảm chi phí hoa hồng cao từ các sàn quốc tế (thường từ 15-25%) và tự động hóa bộ máy nhân sự đặt chỗ, doanh nghiệp có thể hoàn vốn đầu tư triển khai hệ thống chỉ trong vòng 3 đến 6 tháng hoạt động.


Kết luận

Đồ án "Xây dựng website cung cấp các dịch vụ du lịch" của sinh viên Trường Đại học Sư phạm Kỹ thuật TP.HCM đã giải quyết thành công bài toán thực tiễn về số hóa ngành du lịch lữ hành và lưu trú. Bằng việc kết hợp hài hòa giữa sức mạnh xử lý bất đồng bộ của Node.js/Express, khả năng tối ưu hóa trải nghiệm và SEO vượt trội của Next.js, cùng tính toàn vẹn dữ liệu từ MySQL, hệ thống đã mang lại một giải pháp thương mại điện tử du lịch hoàn chỉnh, bảo mật và sẵn sàng mở rộng trong tương lai.