Giới thiệu dự án

Sự bùng nổ của ngành du lịch kết hợp với tốc độ số hóa mạnh mẽ đã làm thay đổi hoàn toàn hành vi của người tiêu dùng. Theo thống kê của Tổng cục Du lịch và Hiệp hội Thương mại Điện tử Việt Nam (VECOM), hơn 75% du khách nội địa tìm kiếm thông tin điểm đến qua internet và có đến 62% có nhu cầu mua sắm các thiết bị, phụ kiện chuyên dụng phục vụ dã ngoại trước mỗi chuyến đi. Tuy nhiên, thị trường công nghệ hiện nay vẫn tồn tại sự phân mảnh rõ rệt: các trang tra cứu địa điểm thường thuần túy cung cấp thông tin hoặc đánh giá, trong khi các sàn thương mại điện tử lại thiếu tính ngữ cảnh du lịch, khiến người dùng mất nhiều thời gian chuyển đổi qua lại giữa nhiều nền tảng để lên kế hoạch và chuẩn bị hành trang.

Khóa luận tốt nghiệp chuyên ngành Kỹ thuật Phần mềm (Khoa Công nghệ Thông tin - Đại học Công nghiệp TP.HCM) với đề tài "Website du lịch và dịch vụ bán sản phẩm" do sinh viên Phạm Thanh Duy và Trịnh Đức Duy thực hiện dưới sự hướng dẫn của ThS. Nguyễn Văn Thắng đã giải quyết triệt để bài toán này. Đề tài tập trung xây dựng một nền tảng hợp nhất (All-in-one Web Application) kết nối trải nghiệm khám phá địa điểm, lập lịch trình tự động, tương tác cộng đồng thời gian thực và cung cấp hệ sinh thái thương mại điện tử mua sắm phụ kiện du lịch chuyên nghiệp.

+-----------------------------------------------------------------------------------+
|                           HỆ THỐNG ALL-IN-ONE TRAVEL & E-COMMERCE                 |
+-----------------------------------------------------------------------------------+
|  [Khám Phá Địa Điểm] ---> [Lập Lịch Trình Tự Động] ---> [Gợi Ý & Mua Sắm Dụng Cụ] |
|           ^                                                        |              |
|           |                                                        v              |
|  [Cộng Đồng Review (Socket.io)] <----------------- [Thanh Toán Trực Tuyến PayPal] |
+-----------------------------------------------------------------------------------+

Mục tiêu đề tài

  1. Xây dựng hệ thống web full-stack hiện đại: Đảm bảo hiệu năng cao, giao diện chuẩn Single Page Application (SPA), đáp ứng thời gian phản hồi API dưới 300ms với tải đồng thời 500+ CCU.
  2. Tích hợp phân hệ E-commerce toàn diện: Hỗ trợ quản lý danh mục sản phẩm, giỏ hàng động, xử lý đơn hàng đa phương thức (COD và Cổng thanh toán quốc tế PayPal REST API).
  3. Phát triển module Lập lịch trình & Thông báo tự động: Cho phép người dùng tùy biến lịch trình chuyến đi theo ngày, địa điểm và tự động đồng bộ gửi email chi tiết hành trình qua giao thức SMTP.
  4. Cộng đồng tương tác thời gian thực: Xây dựng diễn đàn chia sẻ trải nghiệm, đánh giá địa điểm/sản phẩm với tính năng cập nhật tức thì (Real-time updates) sử dụng WebSockets.
  5. Hệ thống Quản trị & Công cụ tự động hóa: Cung cấp Dashboard phân tích doanh thu, thống kê sản phẩm bán chạy và tích hợp Bot thu thập dữ liệu (Crawl Data) tự động từ các nguồn du lịch uy tín.

Phạm vi và giới hạn hệ thống

  • Phạm vi chức năng: Khách vãng lai (Guest) tra cứu điểm đến, sản phẩm; Thành viên (Member) quản trị lịch trình, giỏ hàng, thanh toán, tương tác bài viết; Quản trị viên (Admin) quản lý kho hàng, duyệt bài viết, thống kê doanh thu; Phân hệ hệ thống (System) xử lý gửi Mail, xác thực OAuth2 (Facebook, Google), kết nối PayPal và Data Scraping.
  • Giới hạn kỹ thuật: Triển khai trên môi trường điện toán đám mây Heroku PaaS (Dyno tiêu chuẩn) kết hợp MongoDB Atlas; phiên bản hiện tại chưa tích hợp phân hệ đặt phòng khách sạn (Hotel Booking) và vé phương tiện giao thông (Flights/Trains/Buses).

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 giải pháp hiện hành trên thị trường cho thấy sự chia cắt rõ ràng giữa nền tảng nội dung và nền tảng giao dịch:

Tiêu chí so sánh Nền tảng đánh giá du lịch (TripAdvisor, DuLich24) Sàn TMĐT tổng hợp (Shopee, Tiki, Lazada) Hệ thống Website du lịch & Dịch vụ (Đề tài)
Tra cứu & Lập lịch trình Xuất sắc, nhiều bài viết đánh giá Không hỗ trợ Trực quan, tích hợp tạo và xuất lịch trình qua Email
Gắn kết mua sắm theo ngữ cảnh Thấp (chỉ điều hướng Affiliate) Cao nhưng không có gợi ý theo địa điểm/hành trình Tối ưu hóa giỏ hàng dựa trên nhu cầu thực tế của chuyến đi
Tương tác thời gian thực Hạn chế (F5 để tải lại bình luận) Tin nhắn shop riêng lẻ Cập nhật tương tác tức thì qua Socket.io
Độ phức tạp khi thao tác Cần sử dụng nhiều tab/ứng dụng Quy trình mua hàng nhiều bước Luồng trải nghiệm liền mạch từ Xem -> Lên lịch -> Mua

Phân loại yêu cầu theo mô hình MoSCoW

  • Must Have (Bắt buộc): Đăng nhập/Đăng ký (Local & Social OAuth2), Tìm kiếm & Chi tiết địa điểm/sản phẩm, Quản lý giỏ hàng, Đặt hàng & Thanh toán PayPal, Lập lịch trình cá nhân.
  • Should Have (Nên có): Tương tác bài đăng thời gian thực (Socket.io), Gửi email xác nhận lịch trình, Thống kê doanh thu biểu đồ Admin, Duyệt bài viết cộng đồng.
  • Could Have (Có thể có): Bot tự động Crawl Data cập nhật danh mục địa điểm, Đánh giá sản phẩm theo sao (1-5 sao).
  • Won't Have (Chưa phát triển trong giai đoạn này): Tích hợp API cổng vé máy bay, Thuật toán AI gợi ý lịch trình tự động dựa trên vị trí GPS thực tế.

Thiết kế hệ thống

Hệ thống được thiết kế theo kiến trúc phân tầng chuẩn Three-tier Architecture kết hợp Single Page Application (Client-Side Rendering) và RESTful API Service.

+--------------------------------------------------------------------+
|                         CLIENT LAYER (SPA)                         |
|   ReactJS 16.13 | Redux Store | React Router | Axios | Bootstrap 4  |
+---------------------------------+----------------------------------+
                                  | HTTP REST / WebSocket
+---------------------------------v----------------------------------+
|                      APPLICATION LAYER (BACKEND)                   |
|   Node.js 12.18 / Express.js 4.17 Platform                         |
|   +-------------------+  +-------------------+  +----------------+ |
|   | Controller / API  |  | Middleware / Auth |  | Socket.io v2.3 | |
|   +-------------------+  +-------------------+  +----------------+ |
|   | Nodemailer Engine |  | PayPal SDK v1.8   |  | Cheerio Bot    | |
|   +-------------------+  +-------------------+  +----------------+ |
+---------------------------------+----------------------------------+
                                  | Mongoose ODM (Query / Indexing)
+---------------------------------v----------------------------------+
|                         DATABASE LAYER (NoSQL)                     |
|   MongoDB Atlas v4.2 (Collections: Accounts, Places, Products,...) |
+--------------------------------------------------------------------+

Công nghệ và phiên bản sử dụng

  • Frontend: ReactJS (v16.13.1), HTML5, CSS3, JavaScript ES6+, Bootstrap (v4.5.0), Axios (v0.19.2), React-Router-DOM (v5.2.0).
  • Backend Runtime: NodeJS (v12.18.3 LTS), Express.js Framework (v4.17.1).
  • Database: MongoDB NoSQL Database (v4.2.8), Mongoose ODM (v5.9.25).
  • Giao thức Real-time: Socket.io (v2.3.0).
  • Bảo mật & Tích hợp: JSON Web Token (JWT), Bcrypt.js (v2.4.3), Passport.js (Facebook/Google Strategy), PayPal Checkout-NodeJS-SDK (v1.0.1), Nodemailer (v6.4.10).
  • Hạ tầng triển khai: Heroku Cloud Application Platform, Heroku Dynos, mLab/MongoDB Atlas Service.

Thiết kế Cơ sở dữ liệu (Database Schemas)

Dữ liệu được tổ chức tối ưu dưới dạng Non-relational Document JSON. Dưới đây là mô hình lược đồ Mongoose tiêu biểu:

// models/Itinerary.js - Quản lý lịch trình người dùng
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const ItinerarySchema = new Schema({
  userId: { type: Schema.Types.ObjectId, ref: 'Account', required: true, index: true },
  title: { type: String, required: true, trim: true },
  startDate: { type: Date, required: true },
  endDate: { type: Date, required: true },
  destinations: [{
    dayIndex: { type: Number, required: true },
    placeId: { type: Schema.Types.ObjectId, ref: 'Place', required: true },
    note: { type: String, default: '' },
    estimatedCost: { type: Number, default: 0 }
  }],
  status: { type: String, enum: ['draft', 'confirmed', 'completed'], default: 'confirmed' },
  createdAt: { type: Date, default: Date.now }
});

module.exports = mongoose.model('Itinerary', ItinerarySchema);
// models/Order.js - Quản lý đơn hàng và tích hợp thanh toán
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const OrderSchema = new Schema({
  customerId: { type: Schema.Types.ObjectId, ref: 'Account', required: true },
  items: [{
    productId: { type: Schema.Types.ObjectId, ref: 'Product', required: true },
    quantity: { type: Number, required: true, min: 1, max: 10 },
    unitPrice: { type: Number, required: true }
  }],
  totalAmount: { type: Number, required: true },
  paymentMethod: { type: String, enum: ['COD', 'PAYPAL'], required: true },
  paymentStatus: { type: String, enum: ['Pending', 'Completed', 'Cancelled'], default: 'Pending' },
  paypalOrderId: { type: String, default: null },
  shippingAddress: {
    recipientName: { type: String, required: true },
    phone: { type: String, required: true },
    street: { type: String, required: true }
  },
  orderDate: { type: Date, default: Date.now }
}, { timestamps: true });

module.exports = mongoose.model('Order', OrderSchema);

Thiết kế API Endpoints (RESTful API Specifications)

Method Endpoint Route Phân quyền Mô tả chức năng Mã phản hồi HTTP
POST /api/account/login-local Public Xác thực đăng nhập bằng Username/Password 200 OK, 401 Unauthorized
POST /api/account/add Public Đăng ký tài khoản thành viên mới 201 Created, 409 Conflict
GET /api/place/list-place Public Truy vấn danh sách địa điểm (có phân trang & lọc) 200 OK, 500 Server Error
GET /api/place/:id Public Lấy dữ liệu chi tiết, hình ảnh và đánh giá địa điểm 200 OK, 404 Not Found
POST /api/itinerary/create Member Khởi tạo lịch trình mới và kích hoạt gửi Email 201 Created, 400 Bad Request
POST /api/order/checkout-paypal Member Khởi tạo giao dịch thanh toán qua PayPal SDK 200 OK, 402 Payment Required
GET /api/admin/statistics/revenue Admin Tổng hợp báo cáo doanh thu theo mốc thời gian 200 OK, 403 Forbidden

Methodology và Quy trình phát triển

Dự án áp dụng quy trình phát triển phần mềm linh hoạt (Agile/Scrum) rút gọn kéo dài trong 12 tuần (6 Sprints, 2 tuần/Sprint):

  • Sprint 1 - 2 (Tuần 1 - 4): Khảo sát thực tế, phân tích Usecase, thiết kế sơ đồ tuần tự (Sequence Diagram), sơ đồ hoạt động (Activity Diagram), thiết kế cơ sở dữ liệu MongoDB.
  • Sprint 3 - 4 (Tuần 5 - 8): Xây dựng RESTful API Backend (Express), tích hợp module xác thực JWT/OAuth2, xây dựng giao diện ReactJS UI Components (Địa điểm, Sản phẩm, Giỏ hàng).
  • Sprint 5 (Tuần 9 - 10): Tích hợp cổng PayPal SDK, cấu hình Socket.io Real-time comments, lập trình Nodemailer và xây dựng Bot Crawl Data.
  • Sprint 6 (Tuần 11 - 12): Kiểm thử đơn vị (Unit Test), kiểm thử tích hợp (Integration Test), triển khai CI/CD lên nền tảng Heroku và hoàn thiện hồ sơ khóa luận.

Implementation và kết quả

Quá trình phát triển và Kỹ thuật cốt lõi

Kiến trúc mã nguồn được phân định rõ ràng theo cấu trúc Module hóa (Modular Architecture):

project-root/
├── client/                     # Frontend ReactJS Application
│   ├── src/
│   │   ├── components/         # UI Reusable Components (Header, Footer, ItemCard)
│   │   ├── pages/              # Route Views (HomePage, PlaceDetail, CartPage,...)
│   │   └── services/           # Axios API Client & Socket Connection Manager
└── server/                     # Backend Node.js / Express Application
    ├── config/                 # Cấu hình Database, PayPal, Passport, Mailer
    ├── controllers/            # Xử lý Logic nghiệp vụ (Place, Product, Order)
    ├── models/                 # Mongoose Schema Definitions
    └── routes/                 # Định nghĩa các Route Endpoints

Xử lý thanh toán trực tuyến qua PayPal REST SDK

Quá trình thanh toán yêu cầu đảm bảo tính toàn vẹn giao dịch và bảo mật dữ liệu tài chính:

// controllers/orderController.js
const paypal = require('@paypal/checkout-server-sdk');
const Order = require('../models/Order');

// Cấu hình môi trường PayPal Sandbox
function getPayPalClient() {
  const environment = new paypal.core.SandboxEnvironment(
    process.env.PAYPAL_CLIENT_ID,
    process.env.PAYPAL_CLIENT_SECRET
  );
  return new paypal.core.PayPalHttpClient(environment);
}

exports.processPayPalPayment = async (req, res) => {
  const { orderId, orderDetails } = req.body;
  const request = new paypal.orders.OrdersCaptureRequest(orderId);
  request.requestBody({});

  try {
    const client = getPayPalClient();
    const capture = await client.execute(request);
    const captureId = capture.result.purchase_units[0].payments.captures[0].id;

    if (capture.result.status === 'COMPLETED') {
      const newOrder = new Order({
        customerId: req.user._id,
        items: orderDetails.items,
        totalAmount: orderDetails.totalAmount,
        paymentMethod: 'PAYPAL',
        paymentStatus: 'Completed',
        paypalOrderId: captureId,
        shippingAddress: orderDetails.shippingAddress
      });

      const savedOrder = await newOrder.save();
      return res.status(200).json({ success: true, order: savedOrder });
    }
    return res.status(400).json({ success: false, message: 'Thanh toán chưa hoàn tất' });
  } catch (error) {
    return res.status(500).json({ success: false, error: error.message });
  }
};

Quản lý trạng thái Real-time với React Hooks và Socket.io

Đảm bảo khi một thành viên gửi bình luận hoặc đánh giá, toàn bộ người dùng đang truy cập trang chi tiết điểm đến đó đều nhận được nội dung mới ngay lập tức mà không cần reload trang:

// client/src/components/RealtimeComments.jsx
import React, { useState, useEffect } from 'react';
import io from 'socket.io-client';

const socket = io(process.env.REACT_APP_SOCKET_ENDPOINT || 'http://localhost:5000');

export const RealtimeComments = ({ placeId, currentUser }) => {
  const [comments, setComments] = useState([]);
  const [inputComment, setInputComment] = useState('');

  useEffect(() => {
    // Tham gia phòng (Room) riêng của địa điểm
    socket.emit('joinPlaceRoom', { placeId });

    socket.on('receiveNewComment', (newComment) => {
      setComments((prevComments) => [newComment, ...prevComments]);
    });

    return () => {
      socket.emit('leavePlaceRoom', { placeId });
      socket.off('receiveNewComment');
    };
  }, [placeId]);

  const handleSendComment = (e) => {
    e.preventDefault();
    if (!inputComment.trim()) return;

    const payload = {
      placeId,
      user: currentUser.username,
      avatar: currentUser.avatar,
      content: inputComment,
      createdAt: new Date().toISOString()
    };

    socket.emit('sendComment', payload);
    setInputComment('');
  };

  return (
    <div className="comment-section mt-4">
      <h5>Bình luận & Đánh giá thời gian thực</h5>
      <form onSubmit={handleSendComment} className="d-flex mb-3">
        <input
          type="text"
          className="form-control me-2"
          placeholder="Chia sẻ cảm nhận của bạn về địa điểm này..."
          value={inputComment}
          onChange={(e) => setInputComment(e.target.value)}
        />
        <button type="submit" className="btn btn-primary">Gửi</button>
      </form>
      <div className="comment-list">
        {comments.map((item, idx) => (
          <div key={idx} className="comment-item p-2 mb-2 border rounded bg-light">
            <strong>{item.user}</strong>: <span>{item.content}</span>
            <small className="text-muted d-block">{new Date(item.createdAt).toLocaleTimeString()}</small>
          </div>
        ))}
      </div>
    </div>
  );
};

Pipeline thống kê doanh thu nâng cao trên MongoDB

Sử dụng Aggregation Framework để trích xuất thống kê doanh số bán hàng phục vụ trang Admin Dashboard:

// controllers/adminController.js
exports.getMonthlyRevenueStats = async (req, res) => {
  try {
    const stats = await Order.aggregate([
      { $match: { paymentStatus: 'Completed' } },
      {
        $group: {
          _id: { $month: '$createdAt' },
          totalRevenue: { $sum: '$totalAmount' },
          totalOrders: { $sum: 1 },
          itemsSold: { $sum: { $sum: '$items.quantity' } }
        }
      },
      { $sort: { '_id': 1 } }
    ]);
    return res.status(200).json({ success: true, data: stats });
  } catch (err) {
    return res.status(500).json({ success: false, error: err.message });
  }
};

Kiểm thử và Đánh giá hiệu năng

Hệ thống đã trải qua quá trình kiểm thử nghiêm ngặt bao gồm Functional Testing, Security Validation, và Load Testing.

Kết quả kiểm thử chức năng và độ bao phủ (Test Coverage)

  • Unit Test (Jest & Supertest): 54 Test Cases kiểm tra toàn bộ Controller và Helper Functions. Độ bao phủ mã nguồn (Code Coverage) đạt 86.4%.
  • Integration Test: 26 Test Scenarios kiểm tra tính toàn vẹn luồng dữ liệu (Authentication -> Cart -> Checkout -> Socket Notification). Tỷ lệ vượt qua: 100%.
Hạng mục kiểm thử Công cụ thực hiện Số lượng kịch bản Kết quả đạt được Trạng thái
Xác thực & Phân quyền Postman / JWT Validator 12 Scenarios Ngăn chặn truy cập trái phép 100% Đạt
Giỏ hàng & Thanh toán Jest / PayPal Mock Sandbox 15 Scenarios Tính toán chính xác 100%, không sai lệch tiền Đạt
Gửi Email Lịch trình Nodemailer Mock Server 8 Scenarios 100% email gửi thành công (< 2.1s) Đạt
WebSocket Concurrency Socket.io Client Tester 5 Scenarios Phân phối message chính xác tới Room mục tiêu Đạt

Đo lường hiệu năng thực tế (Performance Benchmarks)

Sử dụng công cụ Apache JMeter và Google Lighthouse để đánh giá:

  • Tải đồng thời (Load Test): Giả lập 500 người dùng đồng thời (500 Virtual Users gửi request liên tục trong 5 phút).
    • Tỷ lệ lỗi (Error Rate): 0.00%.
    • Thông lượng trung bình (Throughput): 245.8 Requests/giây.
    • Thời gian phản hồi trung bình (Average Latency): 142ms.
  • Chỉ số Google Lighthouse (Client Web App):
    • Performance: 92/100.
    • Accessibility: 96/100.
    • Best Practices: 95/100.
    • SEO Score: 98/100.

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

Hệ thống đã hiện thực hóa 100% các yêu cầu nghiệp vụ được đề ra trong đề cương khóa luận:

  • Hoàn thành đầy đủ 26 Usecases phân bổ cho 3 nhóm tác nhân chính.
  • Khả năng xử lý giỏ hàng phía Client mượt mà, lưu trữ đồng bộ trạng thái giữa LocalStorage và cơ sở dữ liệu MongoDB khi đăng nhập.
  • Phân hệ quản trị trực quan với biểu đồ tương tác, cho phép kiểm duyệt nội dung cộng đồng chỉ với 1 cú nhấp chuột.
  • 94% người tham gia thử nghiệm (trên mẫu 50 sinh viên) đánh giá hệ thống dễ sử dụng, tính năng tạo lịch trình kèm gợi ý sản phẩm mang lại giá trị thiết thực vượt trội.

Đổi mới và đóng góp

Điểm mới về giải pháp công nghệ

  1. Kiến trúc tích hợp Cross-Domain (Travel Contextual E-Commerce): Lần đầu tiên đưa trải nghiệm mua sắm vật phẩm du lịch gắn liền trực tiếp với dữ liệu địa hình, khí hậu và đặc điểm của từng điểm đến trong lịch trình người dùng thiết lập.
  2. Khả năng tương tác thời gian thực hai chiều: Áp dụng cơ chế Room-based WebSocket của Socket.io, cô lập luồng dữ liệu tương tác theo từng địa điểm du lịch, tối ưu băng thông máy chủ và loại bỏ hoàn toàn hiện tượng Polling gây nghẽn mạng.
  3. Thu thập dữ liệu tự động (Automated Web Crawling Engine): Phát triển Module Web Scraper tự động định kỳ tổng hợp dữ liệu thông tin địa danh, khách sạn và sản phẩm từ các website công cộng, giúp kho dữ liệu luôn được cập nhật mà không tốn công nhập liệu thủ công.
+-------------------------------------------------------------------------------+
|                      MA TRẬN SO SÁNH GIẢI PHÁP ĐỔI MỚI                         |
+--------------------------+-------------------+----------------+---------------+
| Chỉ tiêu                 | Web Truyền Thống  | Sàn E-Commerce | Đề Tài Nghiên |
|                          | (PHP/MySQL CMS)   | Tổng Hợp       | Cứu (MERN)    |
+--------------------------+-------------------+----------------+---------------+
| Tốc độ render trang      | 1.8s - 3.2s       | 1.2s - 2.0s    | 0.4s - 0.8s   |
| Đồng bộ dữ liệu Realtime | Không (Manual F5) | Hạn chế        | Có (Socket.io)|
| Lập & Gửi Mail lịch trình| Không             | Không          | Tự động 100%  |
| Thanh toán Quốc tế       | Ít tích hợp       | Đa dạng        | PayPal SDK    |
| Khả năng chịu tải        | Trung bình        | Rất lớn        | Tùy biến Dyno |
+--------------------------+-------------------+----------------+---------------+

Hiệu quả cải tiến định lượng

  • Tối ưu hóa thời gian chuẩn bị hành trình: Giảm từ trung bình 4.5 giờ (tìm kiếm địa điểm trên Google + lập danh sách đồ dùng + đặt mua trên các sàn thương mại riêng lẻ) xuống chỉ còn 35 phút thao tác trực tiếp trên một hệ thống duy nhất (tiết kiệm 87% thời gian).
  • Hiệu suất phản hồi giao diện: Ứng dụng công nghệ Virtual DOM của ReactJS giúp tốc độ cập nhật giao diện nhanh hơn 65% so với cách tiếp cận render trang phía server truyền thống.
  • Tiết kiệm tài nguyên máy chủ: Mô hình I/O Non-blocking của NodeJS giúp máy chủ xử lý lượng kết nối đồng thời cao hơn gấp 4 lần so với mô hình Apache đa luồng trên cùng một thông số phần cứng RAM/CPU.

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

Kịch bản sử dụng thực tế (Real-world Scenarios)

  • Kịch bản Du khách cá nhân/Nhóm phượt thủ: Người dùng chuẩn bị đi trekking tại Fansipan (Sa Pa). Sau khi tìm kiếm thông tin địa điểm và đọc các bài review thực tế của thành viên khác, người dùng khởi tạo lịch trình 3 ngày 2 đêm, thêm các sản phẩm chuyên dụng (lều trại chống nước, gậy leo núi, đèn pin siêu sáng) trực tiếp từ gợi ý của website vào giỏ hàng, thanh toán qua PayPal và nhận file lịch trình đầy đủ qua Email cá nhân.
  • Kịch bản Doanh nghiệp lữ hành vừa và nhỏ: Sử dụng website như một kênh truyền thông quảng bá tour tuyến, quản lý kho dụng cụ dã ngoại cho thuê hoặc bán đính kèm, đồng thời theo dõi xu hướng điểm đến được yêu thích nhất thông qua biểu đồ phân tích dữ liệu Admin.
+------------------------------------------------------------------------------------+
|                         QUY TRÌNH DEPLOY CI/CD LÊN HEROKU                          |
+------------------------------------------------------------------------------------+
| [Git Push origin master]                                                           |
|           |                                                                        |
|           v                                                                        |
| [Heroku Buildpack: Node.js] ---> [Install Dependencies: NPM Install]               |
|           |                                                                        |
|           v                                                                        |
| [Client Build: React Webpack Optimization] ---> [Set Config Vars: Environment]     |
|           |                                                                        |
|           v                                                                        |
| [Procfile Execution: `web: node server/server.js`]                                 |
|           |                                                                        |
|           v                                                                        |
| [Dyno Provisioning: Routing & SSL Certification Enabled]                           |
+------------------------------------------------------------------------------------+

Chiến lược Triển khai và Hạ tầng

  • Cấu hình Deploy Heroku:
    • Khai báo tập tin Procfile: web: node server/server.js.
    • Thiết lập biến môi trường (Config Vars) bảo mật trên Heroku Dashboard: MONGO_URI, JWT_SECRET, PAYPAL_CLIENT_ID, PAYPAL_CLIENT_SECRET, MAIL_USER, MAIL_PASS.
    • Tích hợp Git tự động kích hoạt Build Pipeline khi có commit mới trên nhánh main/production.
  • Phân tích Chi phí và ROI (Return on Investment):
    • Chi phí khởi tạo ban đầu: 0 USD (Tận dụng gói miễn phí của Heroku Dyno, MongoDB Atlas 512MB M0 Sandbox, PayPal Sandbox và Mailtrap/Gmail SMTP).
    • Chi phí vận hành sản xuất thương mại: Ước tính 25 - 50 USD/tháng (Bao gồm 1 Heroku Standard Dyno 25$/tháng, MongoDB Atlas M10 15$/tháng, Custom Domain & CDN Cloudflare).
    • Thời gian hoàn vốn dự kiến: 3 - 6 tháng khi vận hành với mô hình thu phí hoa hồng 5% từ các cửa hàng phân phối dụng cụ du lịch liên kết.

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

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

  • Độ trễ khởi động dịch vụ (Cold Start): Do chạy trên hạ tầng Heroku Free Dyno, khi không có lưu lượng truy cập sau 30 phút, server sẽ tự động chuyển sang chế độ ngủ (Sleep mode), gây ra độ trễ 10-15 giây cho request đầu tiên.
  • Thuật toán gợi ý ở mức cơ bản: Hiện tại hệ thống gợi ý sản phẩm dựa trên danh mục tĩnh thay vì áp dụng các mô hình Học máy (Machine Learning) phân tích hành vi người dùng (Collaborative Filtering).
  • Hạn chế dịch vụ liên kết: Chưa trực tiếp kết nối API của các hãng hàng không hoặc hệ thống đặt phòng Booking.com/Agoda.

Hướng phát triển và Mở rộng

  1. Kiến trúc Vi dịch vụ (Microservices Architecture): Tách riêng Service Xử lý đơn hàng, Service Chat/Realtime và Service Thu thập dữ liệu để nâng cao năng lực mở rộng độc lập.
  2. Tích hợp Trí tuệ nhân tạo (AI Engine): Ứng dụng mô hình AI gợi ý lịch trình thông minh tối ưu hóa theo kinh phí dự kiến và thời tiết thực tế từ OpenWeather API.
  3. Phát triển Ứng dụng Di động (Mobile App): Sử dụng React Native hoặc Flutter để tái sử dụng mã nguồn RESTful API sẵn có, cung cấp tính năng định vị GPS dẫn đường và thông báo đẩy (Push Notifications) khi đang di chuyển.

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

+-----------------------------------------------------------------------------------+
|                            ĐỐI TƯỢNG HƯỞNG LỢI & GIÁ TRỊ                          |
+-----------------------------------------------------------------------------------+
|  [Sinh Viên CNTT]      ---> Mã nguồn chuẩn MERN Stack, tài liệu UML chi tiết (88+ trang)|
|  [Lập Trình Viên]      ---> Mẫu tích hợp PayPal REST SDK, cấu hình Room Socket.io |
|  [Doanh Nghiệp Du Lịch]---> Mô hình kinh doanh tích hợp E-commerce tăng 40% doanh thu|
|  [Khách Du Lịch]       ---> Giảm 87% thời gian chuẩn bị hành trang và lịch trình  |
+-----------------------------------------------------------------------------------+
  • Sinh viên chuyên ngành Công nghệ thông tin / Kỹ thuật phần mềm: Được tiếp cận một tài liệu đồ án tốt nghiệp mẫu mực với 125 trang báo cáo, 36 bảng biểu đặc tả chi tiết và 118 sơ đồ UML (Use Case, Activity, Sequence, Entity Class Diagram), phục vụ làm tài liệu tham khảo học tập giá trị.
  • Lập trình viên Web Full-Stack: Nắm bắt các kỹ thuật xử lý bất đồng bộ trong NodeJS, quy chuẩn thiết kế REST API an toàn, giải pháp xác thực JWT kết hợp OAuth2 và phương thức tích hợp cổng thanh toán quốc tế chuẩn PCI-DSS.
  • Doanh nghiệp và Đơn vị Khởi nghiệp Du lịch: Sở hữu giải pháp công nghệ trọn gói với chi phí triển khai thấp, mở ra cơ hội kinh doanh đa kênh kết hợp giữa nội dung số và thương mại điện tử.
  • Cộng đồng Người đam mê Du lịch: Được trải nghiệm một tiện ích số toàn diện, tối ưu hóa công tác chuẩn bị hành trang, an tâm tuyệt đối trên mọi cung đường khám phá.

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

1. Yêu cầu cấu hình tối thiểu để cài đặt và triển khai hệ thống là gì?

  • Môi trường máy chủ (Server/Cloud): NodeJS runtime phiên bản 12.x trở lên (khuyên dùng Node 14.x/16.x LTS), RAM tối thiểu 512MB (Khuyến nghị 1GB RAM), dung lượng ổ cứng tối thiểu 1GB.
  • Cơ sở dữ liệu: MongoDB Server phiên bản 4.0 trở lên hoặc tài khoản MongoDB Atlas Cloud Database.
  • Client (Người dùng): Bất kỳ trình duyệt web hiện đại nào có hỗ trợ JavaScript ES6+ (Google Chrome v75+, Mozilla Firefox v68+, Microsoft Edge Chromium, Safari v12+).

2. Hệ thống xử lý bài toán quá tải khi lượng người truy cập tăng đột biến như thế nào?

Nhờ nền tảng NodeJS Non-blocking I/O kết hợp với mô hình Scale linh hoạt của Heroku, hệ thống có thể mở rộng theo cả hai chiều:

  • Scale chiều dọc (Vertical Scaling): Nâng cấp Dyno từ Standard-1X (512MB RAM) lên Standard-2X (1GB RAM) hoặc Performance Dynos.
  • Scale chiều ngang (Horizontal Scaling): Tăng số lượng Dynos chạy song song kết hợp Load Balancer tự động phân bổ tải. Với cơ sở dữ liệu, việc chuyển sang cụm Replica Set trên MongoDB Atlas giúp phân tách tải đọc (Read Replicas) và tải ghi một cách hiệu quả.

3. Làm thế nào để tích hợp thêm các cổng thanh toán nội địa như VNPay hoặc MoMo?

Hệ thống được thiết kế theo mẫu thiết kế Service-Oriented:

  1. Tạo một Service Module mới tại thư mục server/services/vnpayService.js hoặc momoService.js.
  2. Khởi tạo Controller xử lý tạo URL thanh toán và URL Callback xác nhận chữ ký số (Checksum HMAC-SHA512).
  3. Bổ sung phương thức tương ứng vào OrderSchema (enum: ['COD', 'PAYPAL', 'VNPAY', 'MOMO']).
  4. Cập nhật giao diện lựa chọn phương thức thanh toán tại React component CheckoutPage.jsx. Toàn bộ luồng dữ liệu nghiệp vụ còn lại của đơn hàng được giữ nguyên.

4. Hệ thống có cơ chế sao lưu dữ liệu và khắc phục sự cố (Backup & Disaster Recovery) như thế nào?

  • Cơ sở dữ liệu: Khi sử dụng MongoDB Atlas, hệ thống được kích hoạt cơ chế Continuous Cloud Backup tự động snapshot dữ liệu mỗi ngày, hỗ trợ Point-in-Time Restore trong vòng 7 ngày gần nhất.
  • Mã nguồn ứng dụng: Lưu trữ tập trung trên GitHub Repository kết hợp tính năng Rollback tức thì trên Heroku Dashboard, cho phép quay về phiên bản Build ổn định trước đó chỉ trong vòng 30 giây khi phát hiện sự cố mã nguồn.

5. Chi phí duy trì hệ thống thực tế và thời gian hoàn vốn (ROI) được ước tính ra sao?

  • Chi phí vận hành: Ở giai đoạn thử nghiệm (MVP), chi phí là 0 VNĐ. Khi vận hành thực tế phục vụ khoảng 10.000 lượt truy cập/tháng, chi phí ước tính khoảng 600.000 - 1.200.000 VNĐ/tháng (cho Cloud Hosting và Database).
  • Mô hình doanh thu & ROI: Nguồn thu đến từ hoa hồng bán dụng cụ du lịch (trung bình 8-12% trên giá trị đơn hàng), dịch vụ quảng cáo địa điểm nổi bật cho các homestay/nhà hàng địa phương. Với quy mô 300 đơn hàng/tháng, hệ thống đạt điểm hòa vốn và bắt đầu sinh lợi nhuận sau 3 đến 5 tháng hoạt động.

Kết luận

Đồ án khóa luận tốt nghiệp "Website du lịch và dịch vụ bán sản phẩm" của sinh viên Phạm Thanh Duy và Trịnh Đức Duy (Khoa CNTT - Đại học Công nghiệp TP.HCM) là một công trình nghiên cứu ứng dụng có giá trị thực tiễn cao, đáp ứng xuất sắc các tiêu chuẩn khắt khe của chuyên ngành Kỹ thuật Phần mềm. Bằng việc làm chủ và kết hợp nhuần nhuyễn hệ sinh thái công nghệ tiên tiến ReactJS - NodeJS - Express - MongoDB - Socket.io - Heroku, nhóm tác giả đã xây dựng thành công một giải pháp công nghệ toàn diện, giải quyết trọn vẹn bài toán tích hợp giữa truyền thông thông tin du lịch và thương mại điện tử chuyên ngành.

Dự án không chỉ khẳng định năng lực phân tích, thiết kế hệ thống phần mềm chuyên nghiệp mà còn mở ra tiềm năng thương mại hóa mạnh mẽ trong kỷ nguyên chuyển đổi số du lịch. Đây là nguồn tài liệu học thuật và mã nguồn tham khảo chất lượng cao cho cộng đồng kỹ sư phần mềm trẻ và các nhóm nghiên cứu phát triển web hiện đại.