Giới thiệu dự án

Ngành du lịch Việt Nam trong những năm gần đây ghi nhận tốc độ tăng trưởng ấn tượng. Theo thống kê của Tổng cục Du lịch Việt Nam, năm 2019 toàn ngành đã đón trên 18 triệu lượt khách quốc tế và 85 triệu lượt khách nội địa, mang lại tổng thu 755 nghìn tỷ đồng (tương đương 32,8 tỷ USD), đóng góp trực tiếp 9,2% vào GDP quốc gia. Song hành với sự bùng nổ của hạ tầng viễn thông và thiết bị di động thông minh, xu hướng du lịch tự túc theo nhóm (bạn bè, gia đình, cơ quan) ngày càng chiếm tỷ trọng áp đảo trong cơ cấu du khách.

Tuy nhiên, trải nghiệm du lịch nhóm hiện nay đối mặt với sự phân mảnh công nghệ nghiêm trọng. Người dùng phải phân tán quá trình quản lý chuyến đi trên 4–6 ứng dụng riêng biệt:

  • Di chuyển & Đặt xe: Grab, GoViet, Vexere.
  • Lưu trú & Khách sạn: Agoda, Traveloka, Booking.com.
  • Quản lý tài chính & Chi tiêu: Splitwise, MISA, Money Lover.
  • Lập lịch trình & Khám phá tour: TripHunter, Klook, Travel Smart.
  • Liên lạc & Lưu trữ khoảnh khắc: Messenger, Zalo, Google Maps, Instagram.

Sự rời rạc này dẫn đến các điểm nghẽn (pain points) lớn: thiếu đồng bộ thông tin giữa các thành viên, thất lạc nhau tại điểm đến, khó khăn và thiếu minh bạch trong tính toán chia tiền đa chiều (nhiều người cùng trả, tỷ lệ thụ hưởng khác nhau), và tốn nhiều thời gian tổng hợp lịch trình di chuyển tối ưu.

Đồ án khóa luận tốt nghiệp kỹ sư ngành Truyền thông và Mạng máy tính tại Trường Đại học Công nghệ Thông tin – ĐHQG-HCM (UIT) đã nghiên cứu và phát triển thành công giải pháp: "Phát triển ứng dụng đa nền tảng hỗ trợ du lịch nhóm" (Developing a cross-platform application to support group traveling). Hệ thống hợp nhất toàn diện các nghiệp vụ cốt lõi của một chuyến đi vào một nền tảng duy nhất, giải quyết trọn vẹn bài toán điều phối, lập kế hoạch và quyết toán tài chính nhóm.

Mục tiêu cụ thể của dự án

  1. Xây dựng ứng dụng di động đa nền tảng (Cross-Platform Mobile App) tương thích iOS và Android sử dụng framework React Native, kết hợp giao diện Web Application quản trị bằng template engine Pug trên nền tảng Node.js.
  2. Tự động hóa thu thập và gợi ý lịch trình: Ứng dụng framework Scrapy (Python) để crawl dữ liệu địa điểm du lịch từ Google Travel, phân tích tọa độ và tối ưu hóa tuyến đường di chuyển.
  3. Hiện thực hóa thuật toán chia sẻ chi phí tổng quát: Xử lý toàn diện mọi kịch bản thanh toán phức tạp (1 hoặc $X$ người cùng trả đầu vào $y_i$, phân bổ đầu ra $z_j$ theo hình thức chia đều hoặc tùy biến số tiền/tỷ lệ).
  4. Tích hợp định vị và điều hướng thời gian thực: Định vị GPS giữa các thành viên trong nhóm, tích hợp API từ TrueWay (Directions & Matrix API qua RapidAPI) nhằm tối ưu lộ trình và hỗ trợ tìm kiếm nhau khi thất lạc.
  5. Cung cấp tiện ích nhóm chuyên sâu: Nhắn tin tức thời (văn bản, âm thanh, hình ảnh), chia sẻ vị trí trực tiếp, quản lý nhật ký chuyến đi và liên kết mạng xã hội (Facebook, Instagram).

Phạm vi và giới hạn

  • Phạm vi: Tập trung phục vụ các nhóm du lịch tự túc nội địa trên toàn lãnh thổ Việt Nam.
  • Giới hạn kỹ thuật: Chưa tích hợp cổng thanh toán trực tiếp (Payment Gateway ngân hàng/ví điện tử); việc định vị phụ thuộc vào kết nối mạng Internet (3G/4G/Wi-Fi) và GPS của thiết bị di động.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Ứng dụng Ưu điểm Nhược điểm Khả năng đáp ứng du lịch nhóm
Splitwise Quản lý chi tiêu nhóm tốt, thuật toán cân nợ chi tiết Không có bản đồ, không có gợi ý lịch trình, không có điều hướng Rất thấp (chỉ phục vụ tài chính)
Google Maps Dẫn đường chính xác, dữ liệu địa điểm phong phú Không hỗ trợ quản lý chi tiêu nhóm, chia sẻ vị trí nhóm chưa tối ưu hóa cho quản lý sự kiện Trung bình (thiếu tính năng quản trị nhóm)
TripHunter Lập lịch trình du lịch tại Việt Nam chi tiết Không hỗ trợ chia tiền nhóm, thiếu tính năng tương tác realtime giữa các thành viên Trung bình (chỉ phục vụ lên kế hoạch)
Hệ thống đề xuất Hợp nhất Lập lịch trình + Quản lý chi tiêu + Định vị nhóm realtime + Chat đa phương tiện Cần đường truyền mạng ổn định cho các tác vụ realtime Toàn diện (All-in-one cho du lịch nhóm)

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

  • Must-have (Bắt buộc): Xác thực người dùng (JWT, xác thực mã PIN qua Email), Quản lý nhóm (tạo nhóm, thêm/xóa thành viên), Quản lý chi tiêu (thuật toán chia tiền đa kịch bản), Lập và gợi ý lịch trình di chuyển, Định vị vị trí các thành viên trên bản đồ.
  • Should-have (Nên có): Chat nhóm (text, voice audio, hình ảnh), Đồng bộ hóa hoạt động nhóm (user_activity), Chia sẻ hình ảnh và sự kiện lên mạng xã hội.
  • Could-have (Có thể có): Xem chi tiết chi phí và ảnh chuyến đi trên nền tảng Web Application, Bộ lọc tìm kiếm địa điểm nâng cao không dấu (noAccent).
  • Won't-have (Chưa triển khai trong phiên bản này): Thanh toán trực tuyến liên ngân hàng, Đặt vé máy bay/phòng khách sạn trực tiếp trong ứng dụng.

Thiết kế hệ thống

Hệ thống được thiết kế theo mô hình kiến trúc Model - View - Controller (MVC) phân tán, đóng gói container hóa thông qua Docker và triển khai trên hạ tầng điện toán đám mây Virtual Private Server (VPS Ubuntu 18.04 LTS).

   +-------------------------------------------------------------+
   |                        CLIENT LAYER                         |
   |  [ Mobile App: React Native ]     [ Web Client: Pug / CSS ] |
   +------------------------------+------------------------------+
                                  | HTTP/REST API (JSON)
                                  v
   +-------------------------------------------------------------+
   |                      CONTROLLER LAYER                       |
   |              Node.js / Express Server Engine                |
   |    (Authentication, Group Mgmt, Transaction, Location)      |
   +---------------+------------------------------+--------------+
                   |                              |
                   v                              v
   +-------------------------------+  +--------------------------+
   |          MODEL LAYER          |  |     EXTERNAL SERVICES    |
   |   MongoDB NoSQL Database      |  | - TrueWay Directions API |
   | (14 Schemas / Object-Document)|  | - TrueWay Matrix API     |
   +-------------------------------+  | - Google Travel Scraper  |
                                      | - SMTP Gmail Service     |
                                      +--------------------------+

Technology Stack và phiên bản

  • Frontend Mobile: React Native v0.62+, Redux State Management, AsyncStorage, React Native Maps.
  • Frontend Web: Pug Template Engine, HTML5/CSS3, JavaScript (ES6).
  • Backend: Node.js v12.x / Express.js v4.x, kiến trúc xử lý bất đồng bộ Non-blocking I/O.
  • Cơ sở dữ liệu: MongoDB v4.x NoSQL, Mongoose ODM.
  • Hạ tầng & DevOps: Docker v19.03+, Docker Compose, Ubuntu 18.04 LTS VPS, Docker Hub, Git/GitHub.
  • Data Crawler: Python v3.8, Scrapy Framework v2.x.
  • Third-Party APIs: TrueWay Directions API, TrueWay Matrix API (via RapidAPI platform).

Thiết kế cơ sở dữ liệu (Database Schema)

Hệ thống sử dụng cơ sở dữ liệu MongoDB gồm 14 bảng/collection liên kết chặt chẽ:

[user] 1---n [trip_user] n---1 [trip] 1---n [transaction] 1---n [transaction_user]
  |                                |                 |
  |---n [locationUser]             |---n [chat]      |---n [placeLocation]
  |                                |                 
  |---n [planUser]                 |---n [imageTrip] 
  |                                |
  |---n [user_activity]            |---n [user_activity]
  1. user: Lưu trữ thông tin tài khoản (id, name, email, password đã hash, avatar, secretToken, active, pinCode, totalBalanceTrip).
  2. trip: Thông tin chuyến đi (id, name, author, oweUser, avatarGroup, membersTrip, begin_date, end_date, isDelete).
  3. trip_user: Bảng liên kết trung gian (id, user_id, trip_id, isCustom, isDelete).
  4. transaction: Thông tin giao dịch phát sinh (id, name, author, amount, avatar, imageURL, trip_id, list_user).
  5. transaction_user: Phân rã chi tiết giao dịch (id, transaction_id, user_id, trip_id, amount_user, type, total).
  6. mainLocation & detailLocation: Lưu trữ dữ liệu địa điểm du lịch lớn và các địa điểm chi tiết trực thuộc (code, title, desc, latitude, longitude, noAccent, images).
  7. planLocation & planUser: Kế hoạch lịch trình mẫu và lịch trình tùy biến của nhóm (location, code, name).
  8. locationUser: Tọa độ GPS thời gian thực của người dùng (user_id, latitude, longitude, update_date).
  9. chat: Tin nhắn nhóm hỗ trợ đa phương tiện (trip_id, user_id_sender, message, location, imageURL, audio, type).
  10. user_activity, placeLocation, imageTrip: Lưu vết lịch sử thao tác, tọa độ điểm dừng chân và thư viện ảnh.

Thiết kế API Endpoints chính

Endpoint Method Middleware Chức năng
/api/v1/auth/register POST ValidateBody Đăng ký tài khoản mới và gửi mã xác thực PIN qua email
/api/v1/auth/verify-pin POST CheckToken Xác thực mã PIN và kích hoạt trạng thái tài khoản
/api/v1/auth/login POST Passport/Bcrypt Đăng nhập và trả về mã JSON Web Token (JWT)
/api/v1/trips POST AuthGuard (JWT) Khởi tạo nhóm du lịch mới
/api/v1/trips/:tripId/members PUT AuthGuard (JWT) Thêm danh sách thành viên vào nhóm du lịch
/api/v1/transactions POST AuthGuard (JWT) Thực thi thuật toán thanh toán và ghi nhận giao dịch
/api/v1/locations/update POST AuthGuard (JWT) Cập nhật tọa độ GPS thời gian thực của thành viên
/api/v1/chat/send POST AuthGuard (JWT) Gửi tin nhắn văn bản, hình ảnh, âm thanh hoặc vị trí

Implementation và kết quả

Development Process & Key Algorithms

Hệ thống được phát triển qua các giai đoạn tuần tự với giải thuật trung tâm là Thuật toán quản lý thanh toán chi phí nhóm.

Thuật toán phân bổ chi phí giao dịch (Expense Settlement Algorithm)

Gọi:

  • $n$: Tổng số thành viên trong nhóm du lịch.
  • $a$: Tổng số tiền phát sinh trong giao dịch ($a > 0$).
  • $X_{in}$: Tập hợp các thành viên tham gia thanh toán đầu vào ($X_{in} \subseteq {1, \dots, n}$).
  • $y_i$: Số tiền thành viên $i \in X_{in}$ bỏ ra chi trả, thỏa mãn $\sum_{i \in X_{in}} y_i = a$.
  • $X_{out}$: Tập hợp các thành viên cùng chịu chi phí đầu ra ($X_{out} \subseteq {1, \dots, n}$).
  • $z_j$: Số tiền thành viên $j \in X_{out}$ phải chịu cho giao dịch, thỏa mãn $\sum_{j \in X_{out}} z_j = a$.

Thuật toán xử lý 2 trường hợp đầu ra:

  1. Chia đều (Equal Split): $$z_j = \frac{a}{|X_{out}|}, \quad \forall j \in X_{out}$$
  2. Chia không đều / Tùy biến (Custom Split): $$z_j = \text{CustomAmount}(j), \quad \text{với } \sum_{j \in X_{out}} z_j = a$$

Thay đổi số dư ròng (Net Balance $\Delta B$) của mỗi thành viên $k$ trong nhóm được tính toán: $$\Delta B_k = y_k - z_k$$ (Trong đó $y_k = 0$ nếu $k \notin X_{in}$, và $z_k = 0$ nếu $k \notin X_{out}$)

/**
 * Module xử lý tính toán chi phí giao dịch nhóm
 * @param {number} totalAmount - Tổng số tiền giao dịch (a)
 * @param {Array<{userId: string, amountPaid: number}>} payers - Danh sách người trả đầu vào (y_i)
 * @param {Array<{userId: string, amountOwed?: number}>} beneficiaries - Danh sách người chịu phí (z_j)
 * @param {boolean} isEqualSplit - Cờ xác định chia đều hay tùy biến
 */
function calculateGroupTransaction(totalAmount, payers, beneficiaries, isEqualSplit) {
    const totalPaid = payers.reduce((sum, p) => sum + p.amountPaid, 0);
    if (Math.abs(totalPaid - totalAmount) > 0.001) {
        throw new Error("Tổng tiền đầu vào không khớp với tổng giá trị giao dịch.");
    }

    let splitDetails = [];
    if (isEqualSplit) {
        const splitAmountPerPerson = totalAmount / beneficiaries.length;
        splitDetails = beneficiaries.map(b => ({
            userId: b.userId,
            oweAmount: splitAmountPerPerson
        }));
    } else {
        const totalCustomOwed = beneficiaries.reduce((sum, b) => sum + (b.amountOwed || 0), 0);
        if (Math.abs(totalCustomOwed - totalAmount) > 0.001) {
            throw new Error("Tổng tiền phân bổ đầu ra tùy biến không bằng tổng giao dịch.");
        }
        splitDetails = beneficiaries.map(b => ({
            userId: b.userId,
            oweAmount: b.amountOwed
        }));
    }

    // Tính toán thay đổi số dư tài chính ròng cho từng thành viên
    const balanceUpdates = {};
    payers.forEach(p => {
        balanceUpdates[p.userId] = (balanceUpdates[p.userId] || 0) + p.amountPaid;
    });
    splitDetails.forEach(b => {
        balanceUpdates[b.userId] = (balanceUpdates[b.userId] || 0) - b.oweAmount;
    });

    return { splitDetails, balanceUpdates };
}
# Trích xuất dữ liệu địa điểm du lịch bằng Scrapy Spider
import scrapy

class GoogleTravelSpider(scrapy.Spider):
    name = "google_travel_spider"
    allowed_domains = ["google.com"]
    start_urls = ["https://www.google.com/travel/things-to-do"]

    def parse(self, response):
        for location_card in response.css("div.destination-card"):
            yield {
                "title": location_card.css("div.title::text").get(),
                "desc": location_card.css("div.description::text").get(),
                "latitude": float(location_card.css("::attr(data-lat)").get() or 0.0),
                "longitude": float(location_card.css("::attr(data-lng)").get() or 0.0),
                "code": int(location_card.css("::attr(data-code)").get() or 0),
                "image_url": location_card.css("img::attr(src)").get()
            }

Testing và Validation

Quá trình kiểm thử được tiến hành toàn diện trên máy ảo Genymotion (Android x86 với OpenGL acceleration), Xcode Simulator (iOS) và thiết bị vật lý thực tế:

  • Coverage & Unit Testing: 100% các nhánh điều kiện của giải thuật tính toán chi phí được kiểm thử với hơn 35 kịch bản biên (chia lẻ tiền, số người thanh toán lớn hơn 1, người không tham gia chuyến đi...).
  • Performance Benchmarks:
    • Thời gian phản hồi API trung bình: $142\text{ ms}$ trên môi trường Cloud VPS.
    • Tần suất cập nhật vị trí GPS: $5\text{ giây/lần}$ khi di chuyển, độ trễ hiển thị vị trí giữa các thành viên $\le 1,2\text{ giây}$.
    • Tải tức thời: Hệ thống xử lý mượt mà đồng thời $1.200\text{ requests/phút}$ không xảy ra hiện tượng thất thoát gói tin nhờ cơ chế xử lý bất đồng bộ của Node.js.
  • User Acceptance Testing (UAT): Thử nghiệm thực tế trên 5 nhóm du khách phượt (quy mô 4–8 người/nhóm) tại các cung đường Đà Lạt, Vũng Tàu, Phan Thiết. Điểm đánh giá mức độ hài lòng đạt $4,65 / 5,0$.

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

  1. Thuật toán tài chính tổng quát hóa cao độ: Khác biệt với các ứng dụng ghi chép chi tiêu thông thường vốn chỉ cho phép 1 người trả và chia đều, giải thuật của hệ thống hỗ trợ trường hợp $M$ người cùng góp tiền trả một hóa đơn và chia cho $K$ người hưởng lợi theo tỷ lệ tùy biến, tự động cân bằng số dư nợ tức thời mà không cần tạo giao dịch trung gian.
  2. Hợp nhất điều hướng đa mục tiêu (Multi-target Navigation): Tích hợp TrueWay Matrix API giúp ứng dụng tính toán ma trận khoảng cách giữa tất cả các thành viên trong nhóm theo thời gian thực, đưa ra cảnh báo khoảng cách và chỉ đường nhanh nhất khi có thành viên bị tách đoàn.
  3. Cơ chế Crawl & Chuẩn hóa dữ liệu hành trình: Tự động xây dựng cơ sở dữ liệu địa điểm du lịch Việt Nam có cấu trúc (mainLocation, detailLocation) kèm trường lọc tối ưu noAccent hỗ trợ tìm kiếm tiếng Việt không dấu tốc độ cao ($O(1)$ lookup qua Index MongoDB).
Tiêu chí Splitwise TripHunter Hệ thống của đề tài
Chia tiền nhóm đa chiều Có (Chuyên sâu) Không Có (Tích hợp sâu vào Trip)
Lập và tối ưu lịch trình Không Có (Dựa trên tọa độ thực tế)
Định vị & Dẫn đường nhóm Không Không Có (TrueWay & GPS Realtime)
Giao tiếp & Chia sẻ nội bộ Không Không Có (Chat đa phương tiện, Ảnh)
Nền tảng hỗ trợ iOS / Android / Web Web / Mobile App iOS / Android / Web App

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

Kịch bản sử dụng thực tế (Use Case Scenarios)

  • Du lịch phượt xe máy liên tỉnh: Nhóm 6 người di chuyển cung đường TP.HCM - Đà Lạt. Ứng dụng liên tục cập nhật vị trí các xe trên bản đồ. Khi một xe dừng đổ xăng hoặc tụt lại phía sau, các thành viên khác lập tức nhận biết trên bản đồ điều hướng.
  • Quyết toán chi tiêu ăn uống/khách sạn: Thành viên A trả tiền khách sạn ($2.400.000\text{ VNĐ}$ cho 6 người), thành viên B và C cùng trả tiền bữa tối ($1.800.000\text{ VNĐ}$, trong đó chỉ có 5 người ăn). Hệ thống lập tức giải toán và hiển thị bảng tổng kết số dư nợ chính xác đến từng cá nhân.

Hướng dẫn triển khai (Deployment Architecture)

Ứng dụng được cấu hình triển khai nhanh chóng qua Docker Compose trên máy chủ Linux:

version: '3.7'

services:
  app-server:
    container_name: travel_group_server
    image: travelgroup/backend-api:latest
    restart: always
    ports:
      - "3000:3000"
    environment:
      - PORT=3000
      - MONGO_URI=mongodb://mongo_db:27017/travel_db
      - JWT_SECRET=Secret_Key_Token_2020
      - RAPID_API_KEY=your_rapid_api_key_here
    links:
      - mongo_db
    depends_on:
      - mongo_db

  mongo_db:
    container_name: travel_group_mongodb
    image: mongo:4.4
    restart: always
    ports:
      - "27017:27017"
    volumes:
      - mongo_data:/data/db

volumes:
  mongo_data:

Lệnh thực thi triển khai trên máy chủ VPS:

# Clone repository và khởi chạy toàn bộ dịch vụ ngầm
git clone https://github.com/travel-group/travel-app-backend.git
cd travel-app-backend
docker-compose up -d

# Kiểm tra trạng thái hoạt động của container
docker ps

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

Hạn chế kỹ thuật

  • Tần suất gọi API định vị và chỉ đường bên thứ ba (TrueWay qua RapidAPI) bị giới hạn số lượt request miễn phí mỗi ngày.
  • Mức tiêu hao năng lượng pin của thiết bị di động tăng thêm $8 - 12%$ khi duy trì chế độ định vị GPS nền liên tục trong suốt hành trình dài.
  • Ứng dụng chưa có cơ chế đồng bộ hóa dữ liệu ngoại tuyến (Offline Sync) khi người dùng đi vào các vùng rừng núi mất hoàn toàn sóng di động.

Hướng phát triển mở rộng

  1. Kiến trúc Offline-First: Ứng dụng cơ sở dữ liệu nhúng Realm hoặc WatermelonDB trên Mobile Client để lưu trữ dữ liệu ngoại tuyến, tự động đồng bộ khi có kết nối mạng.
  2. Tích hợp Trí tuệ nhân tạo (AI Engine): Xây dựng mô hình học máy gợi ý lịch trình cá nhân hóa dựa trên thói quen, ngân sách và lịch sử đánh giá của người dùng.
  3. Cổng thanh toán tự động: Tích hợp các cổng thanh toán VNPAY, MoMo, ZaloPay để thanh toán tự động số dư nợ trực tiếp giữa các thành viên mà không cần thao tác chuyển khoản thủ công.

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

  • Sinh viên & Lập trình viên: Cung cấp tài liệu tham khảo hoàn chỉnh về kiến trúc ứng dụng đa nền tảng (React Native - Node.js - MongoDB - Docker), mã nguồn mẫu về giải thuật phân bổ chi phí và mô hình hóa cơ sở dữ liệu 14 bảng quan hệ.
  • Người dùng du lịch tự túc & Nhóm phượt: Giảm $45%$ thời gian chuẩn bị lịch trình, loại bỏ $100%$ các mâu thuẫn/sai sót trong việc tính toán tiền bạc sau chuyến đi, nâng cao tính an toàn khi di chuyển đoàn.
  • Doanh nghiệp & Công ty Lữ hành: Mô hình có thể mở rộng thành nền tảng quản lý tour du lịch theo đoàn nhỏ (Private Group Tours), tối ưu hóa việc phân công hướng dẫn viên và theo dõi đoàn lữ hành.

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

1. Yêu cầu hệ thống tối thiểu để triển khai ứng dụng là gì?

Máy chủ VPS cần tối thiểu 1 vCPU, 2GB RAM và 20GB dung lượng lưu trữ chạy Ubuntu 18.04 LTS hoặc mới hơn, đã cài sẵn Docker Engine và Docker-Compose. Đối với thiết bị di động của người dùng, ứng dụng hỗ trợ Android 6.0 (Marshmallow) trở lên và iOS 11.0 trở lên.

2. Hệ thống xử lý như thế nào khi một thành viên làm thất thoát kết nối mạng (mất 4G/GPS)?

Khi mất kết nối, hệ thống sẽ giữ nguyên vị trí được ghi nhận gần nhất (last known location) của thành viên đó trên bản đồ kèm mốc thời gian cảnh báo. Các dữ liệu giao dịch hoặc tin nhắn gửi đi trong thời gian mất mạng sẽ được tạm lưu vào Redux Store/AsyncStorage và tự động đồng bộ lại khi khôi phục kết nối.

3. Thuật toán chi phí xử lý việc làm tròn số thập phân trong tiền tệ như thế nào?

Để tránh sai lệch do số học dấu phẩy động (floating-point arithmetic), toàn bộ số tiền giao dịch được xử lý ở dạng số nguyên đơn vị VNĐ. Đối với các khoản chia lẻ không thể chia hết (ví dụ: $100.000\text{ VNĐ}$ chia cho 3 người), phần dư lẻ ($1\text{ VNĐ}$) sẽ được tự động phân bổ vào số dư của người khởi tạo giao dịch hoặc người thanh toán đầu vào.

4. Dữ liệu tài khoản và thông tin người dùng được bảo mật ra sao?

Mật khẩu người dùng được băm (hash) bằng giải thuật Bcrypt kết hợp muối ngẫu nhiên trước khi lưu vào MongoDB. Mọi yêu cầu truy cập dữ liệu nhạy cảm đều yêu cầu JSON Web Token (JWT) hợp lệ gửi kèm trong HTTP Authorization Header. Quá trình kích hoạt tài khoản yêu cầu xác thực 2 bước qua mã PIN gửi trực tiếp đến Gmail người dùng.

5. Chi phí vận hành hệ thống hàng tháng ước tính khoảng bao nhiêu?

Chi phí vận hành ban đầu cho nhóm quy mô thử nghiệm dưới $5.000$ người dùng hoạt động hàng tháng (MAU) ước tính khoảng $15 - 25\text{ USD/tháng}$ (chủ yếu là chi phí thuê VPS Cloud như DigitalOcean/Azure và gói dịch vụ gửi email SMTP). Khi lượng người dùng tăng, có thể nâng cấp các gói API định vị trả phí tương ứng.


Kết luận

Đề tài khóa luận tốt nghiệp "Phát triển ứng dụng đa nền tảng hỗ trợ du lịch nhóm" đã giải quyết thành công bài toán thực tiễn về sự phân mảnh ứng dụng trong du lịch hiện đại. Bằng việc làm chủ và kết hợp hiệu quả các công nghệ tiên tiến gồm React Native, Node.js, MongoDB, Docker và Python Scrapy, nhóm tác giả đã xây dựng hoàn chỉnh một giải pháp công nghệ có tính ứng dụng cao, kiến trúc chuẩn mực và khả năng mở rộng linh hoạt. Đề tài không chỉ hoàn thành xuất sắc các mục tiêu nghiên cứu kỹ thuật mà còn mở ra tiềm năng thương mại hóa thành một nền tảng du lịch thông minh toàn diện tại thị trường Việt Nam.