Giới thiệu dự án

Ngành du lịch đóng vai trò là ngành kinh tế mũi nhọn, đóng góp đáng kể vào tổng sản phẩm quốc nội (GDP) tại nhiều quốc gia. Theo số liệu từ Tổng cục Du lịch Việt Nam, sau giai đoạn gián đoạn bởi đại dịch Covid-19, hành vi tiêu dùng và xu hướng tìm kiếm thông tin du lịch của người dùng đã dịch chuyển mạnh mẽ sang không gian số, với hơn 82% du khách chủ động tra cứu lịch trình, địa điểm và hình ảnh trực tuyến trước mỗi chuyến đi. Tuy nhiên, phần lớn các hệ thống hiện nay gặp phải tình trạng phân mảnh thông tin, tốc độ tải trang chậm do xử lý tài nguyên đa phương tiện (hình ảnh/video) kém tối ưu, và giao diện thiếu tính cá nhân hóa theo đặc thù địa lý vùng miền.

Đề tài tốt nghiệp "Xây dựng ứng dụng nền tảng web giới thiệu các địa điểm du lịch" do sinh viên Đinh Văn Phóng thực hiện dưới sự hướng dẫn của TS. Lương Thanh Nhạn (Trường Đại học Quản lý và Công nghệ Hải Phòng, 2024) tập trung giải quyết bài toán cốt lõi: Thiết kế và triển khai một nền tảng web hiện đại, tối ưu hóa trải nghiệm tìm kiếm, quản lý và tương tác nội dung du lịch đa vùng miền với kiến trúc phân tầng hiệu năng cao.

+-------------------------------------------------------------------------+
|                        MÔ HÌNH HỆ THỐNG TỔNG QUAN                       |
|                                                                         |
|  [ Client: ReactJS + TailwindCSS ] <---> [ RESTful API: Node.js/Express]|
|                 |                                      |                |
|                 v                                      v                |
|       [ Cloudinary Media CDN ]               [ Database: MongoDB ]      |
+-------------------------------------------------------------------------+

Mục tiêu dự án

  1. Phân tích và mô hình hóa hệ thống: Đặc tả chi tiết tiến trình nghiệp vụ, ca sử dụng (Use Case), biểu đồ tuần tự (Sequence Diagram), biểu đồ cộng tác và mô hình thực thể quan hệ (ERD).
  2. Xây dựng hệ thống Client-Server phân tách: Phát triển giao diện người dùng Single Page Application (SPA) bằng ReactJS kết hợp TailwindCSS, quản trị trạng thái tập trung với Redux.
  3. Thiết kế Backend & RESTful API: Hiện thực hóa dịch vụ xử lý nghiệp vụ với Node.js runtime, lưu trữ dữ liệu phi quan hệ với MongoDB và MongoDB Compass.
  4. Tối ưu hóa quản lý đa phương tiện: Tích hợp dịch vụ đám mây Cloudinary nhằm giảm tải băng thông máy chủ và tăng tốc độ phân phối nội dung hình ảnh du lịch chất lượng cao.
  5. Cung cấp công cụ quản trị vòng đời bài viết (CMS): Hiện thực hóa cơ chế phân quyền (RBAC), tạo lập, cập nhật, xóa mềm (soft delete), ẩn và khôi phục bài viết du lịch.

Chỉ số kỳ vọng (Measurable Metrics)

  • Thời gian phản hồi API (Latency): Dưới 200ms cho các truy vấn danh sách bài viết theo vùng miền.
  • Thời gian tải trang đầu (FCP/LCP): First Contentful Paint < 1.1s và Largest Contentful Paint < 2.2s.
  • Mức độ giảm tải máy chủ tĩnh: Giảm 75% dung lượng lưu trữ cục bộ thông qua cơ chế lưu trữ đám mây.
  • Tính sẵn sàng của hệ thống: Đáp ứng tải đồng thời tối thiểu 500 người dùng trực tuyến mà không gây nghẽn kết nối cơ sở dữ liệu.

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

  • Phạm vi: Nền tảng web công cộng hỗ trợ người dùng khám phá địa điểm du lịch ba miền (Bắc - Trung - Nam), tìm kiếm theo từ khóa, bình luận tương tác; cung cấp bảng điều khiển (Admin Dashboard) cho người quản trị.
  • Giới hạn: Hệ thống tập trung vào cung cấp và chia sẻ thông tin, chưa tích hợp cổng thanh toán trực tuyến (Payment Gateway) và hệ thống đặt vé/phòng thời gian thực (Booking Engine).

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

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

Khảo sát thực tế các hệ thống thông tin du lịch hiện nay cho thấy sự phân hóa rõ rệt giữa các giải pháp CMS truyền thống (như WordPress) và các cổng thông tin thương mại điện tử lớn (TripAdvisor, Traveloka).

Tiêu chí so sánh WordPress CMS nguyên khối Nền tảng du lịch thương mại lớn Hệ thống MERN Stack đề xuất
Kiến trúc phần mềm Monolithic (PHP/MySQL) Microservices phức tạp Decoupled Client-Server (SPA + REST API)
Tốc độ tải trang & UX Chậm khi có nhiều media (LCP > 3.5s) Tối ưu nhưng giao diện nặng nghiệp vụ booking Tải tức thì với ReactJS Virtual DOM, LCP < 2.0s
Quản trị media Lưu trữ trên Local Web Server CDN riêng chi phí cao Cloudinary CDN tối ưu hóa tự động
Tùy biến nghiệp vụ Phụ thuộc plugin bên thứ ba Hệ thống đóng Linh hoạt mở rộng theo chuẩn RESTful
Chi phí vận hành Trung bình (Tốn dung lượng hosting) Rất cao Thấp, dễ dàng đóng gói triển khai đám mây

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

  • Must have (Bắt buộc): Đăng ký/đăng nhập người dùng; Đăng nhập quản trị viên; Xem danh sách bài viết phân loại theo miền Bắc - Trung - Nam; Xem chi tiết bài viết; Đăng bình luận; CRUD bài viết phía Admin (Tạo, Sửa, Ẩn/Hiện, Khôi phục, Xóa vĩnh viễn); Upload ảnh lên đám mây.
  • Should have (Nên có): Tìm kiếm bài viết theo tiêu đề và nội dung; Quản lý phiên làm việc bảo mật; Responsive UI trên thiết bị di động.
  • Could have (Có thể có): Chia sẻ bài viết trực tiếp lên mạng xã hội (Facebook, Instagram); Bộ lọc danh mục nâng cao.
  • Won't have (Chưa phát triển): Tích hợp bản đồ GPS tương tác thời gian thực; Thanh toán dịch vụ tour.

Thiết kế hệ thống

Kiến trúc hệ thống

Hệ thống tuân thủ mô hình kiến trúc phân tầng Client - Server:

  • Frontend Layer (Trình duyệt máy khách): Xây dựng bằng ReactJS v18.2, quản lý luồng dữ liệu một chiều qua Redux Toolkit, tạo kiểu giao diện với TailwindCSS v3.3.
  • Backend Layer (Máy chủ ứng dụng): Node.js v18 LTS kết hợp Express.js framework cung cấp các REST API endpoints chuẩn hóa JSON.
  • Storage Layer (Lưu trữ dữ liệu): MongoDB v6.0 (NoSQL) quản lý dữ liệu phi cấu trúc, kết hợp dịch vụ lưu trữ đám mây Cloudinary cho tài nguyên tĩnh.
+-----------------------------------------------------------------------------------+
|                              KIẾN TRÚC THÀNH PHẦN                                 |
|                                                                                   |
|  [ React SPA Client ]                                                             |
|         |                                                                         |
|         |-- (1) REST API Requests (JSON / Auth Token)                             |
|         v                                                                         |
|  [ Node.js + Express Server ]                                                     |
|         |                                                                         |
|         +---> (2) MQL Queries / ODM Indexing ---> [ MongoDB Database ]           |
|         |                                         - users collection              |
|         |                                         - blogs collection              |
|         |                                         - comments collection           |
|         |                                                                         |
|         +---> (3) Multi-part Form Uploads    ---> [ Cloudinary Media Storage ]    |
+-----------------------------------------------------------------------------------+

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

Hệ thống sử dụng MongoDB để tối ưu hóa khả năng mở rộng dữ liệu bài viết và bình luận dạng Document-oriented.

// Cấu trúc Schema thực thể Blogs (Mongoose ODM)
const mongoose = require('mongoose');

const BlogSchema = new mongoose.Schema({
  title: { type: String, required: true, trim: true, index: true },
  time: { type: String, required: true },
  description: { type: String, required: true },
  note: { type: String, default: '' },
  zones: { 
    type: String, 
    enum: ['MienBac', 'MienTrung', 'MienNam'], 
    required: true,
    index: true 
  },
  imgList: [{ type: String, required: true }],
  isHidden: { type: Boolean, default: false, index: true },
  author: { type: mongoose.Schema.Types.ObjectId, ref: 'Users' }
}, { timestamps: true });

// Index tổng hợp tối ưu hóa truy vấn lọc vùng miền và trạng thái ẩn
BlogSchema.index({ zones: 1, isHidden: 1, createdAt: -1 });

module.exports = mongoose.model('Blogs', BlogSchema);
// Cấu trúc Schema thực thể Users
const UserSchema = new mongoose.Schema({
  username: { type: String, required: true, unique: true, trim: true },
  email: { type: String, required: true, unique: true, lowercase: true },
  password: { type: String, required: true },
  admin: { type: Boolean, default: false }
}, { timestamps: true });

module.exports = mongoose.model('Users', UserSchema);
// Cấu trúc Schema thực thể Comments
const CommentSchema = new mongoose.Schema({
  blogId: { type: mongoose.Schema.Types.ObjectId, ref: 'Blogs', required: true, index: true },
  userId: { type: mongoose.Schema.Types.ObjectId, ref: 'Users', required: true },
  comment: { type: String, required: true, trim: true }
}, { timestamps: true });

module.exports = mongoose.model('Comments', CommentSchema);

Danh sách API Endpoints chính

Phương thức Đường dẫn API Chức năng nghiệp vụ Yêu cầu xác thực
POST /api/auth/register Đăng ký tài khoản người dùng mới Công khai
POST /api/auth/login Đăng nhập hệ thống, cấp token/session Công khai
GET /api/blogs?zone={zone} Lấy danh sách bài viết theo vùng miền Công khai
GET /api/blogs/:id Lấy nội dung chi tiết bài viết và hình ảnh Công khai
POST /api/blogs Tạo mới bài viết du lịch kèm danh sách ảnh Quản trị viên (Admin)
PUT /api/blogs/:id Cập nhật thông tin bài viết Quản trị viên (Admin)
PATCH /api/blogs/:id/hide Chuyển đổi trạng thái Ẩn/Khôi phục bài viết Quản trị viên (Admin)
DELETE /api/blogs/:id Xóa vĩnh viễn bài viết khỏi hệ thống Quản trị viên (Admin)
POST /api/comments Gửi bình luận vào bài viết du lịch Người dùng đã đăng nhập

Methodology

Dự án áp dụng quy trình phát triển phần mềm theo mô hình lặp (Iterative Software Lifecycle) với 4 giai đoạn chính kéo dài trong 12 tuần:

Tuần 1-2: Khảo sát & Phân tích yêu cầu (Use Case, Activity Diagrams)
Tuần 3-5: Thiết kế kiến trúc, Thiết kế Database (ERD, Class, Sequence Diagrams)
Tuần 6-9: Lập trình chức năng (Backend Express, Frontend ReactJS, Redux, Cloudinary)
Tuần 10-12: Kiểm thử, Tối ưu hóa hiệu năng, Đóng gói và Triển khai

Đánh giá rủi ro và giải pháp khắc phục

  • Rủi ro nghẽn I/O khi người dùng tải nhiều hình ảnh chất lượng cao: Xử lý bằng middleware stream trực tiếp dữ liệu hình ảnh lên Cloudinary API, không lưu đệm vào bộ nhớ tạm của server.
  • Rủi ro mất mát dữ liệu do thao tác nhầm của Admin: Triển khai cơ chế xóa mềm hai bước (Soft Delete thông qua cờ isHidden) trước khi cho phép xóa vĩnh viễn (Hard Delete).

Implementation và kết quả

Development process

Quá trình phát triển tập trung vào việc hiện thực hóa các luồng nghiệp vụ phức tạp thông qua các hàm xử lý phi đồng bộ (Asynchronous JavaScript) và kiến trúc điều khiển luồng dữ liệu đơn hướng.

// Trích đoạn Controller xử lý Ẩn/Hiện bài viết (Soft Delete Logic)
// Backend: controllers/blogController.js
const Blogs = require('../models/BlogModel');

exports.toggleHideBlog = async (req, res) => {
  try {
    const { id } = req.params;
    const currentBlog = await Blogs.findById(id);
    
    if (!currentBlog) {
      return res.status(404).json({ success: false, message: 'Bài viết không tồn tại.' });
    }

    // Đảo trạng thái hiển thị
    currentBlog.isHidden = !currentBlog.isHidden;
    await currentBlog.save();

    return res.status(200).json({
      success: true,
      message: currentBlog.isHidden ? 'Đã ẩn bài viết thành công.' : 'Đã khôi phục bài viết.',
      data: currentBlog
    });
  } catch (error) {
    return res.status(500).json({ success: false, error: error.message });
  }
};
// Trích đoạn tích hợp Redux Async Thunk phía Client
// Frontend: features/blogSlice.js
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import axios from 'axios';

export const fetchBlogsByZone = createAsyncThunk(
  'blogs/fetchByZone',
  async (zone, { rejectWithValue }) => {
    try {
      const response = await axios.get(`/api/blogs?zone=${zone}`);
      return response.data;
    } catch (err) {
      return rejectWithValue(err.response.data);
    }
  }
);

Testing và validation

Hệ thống đã trải qua quá trình kiểm thử nghiêm ngặt bao gồm kiểm thử đơn vị (Unit Testing), kiểm thử tích hợp (Integration Testing) và kiểm thử chấp nhận người dùng (User Acceptance Testing - UAT) với 50 người tham gia thử nghiệm.

+-------------------------------------------------------------------------+
|                        KẾT QUẢ KIỂM THỬ TỔNG QUAN                       |
|                                                                         |
|  - Tổng số kịch bản kiểm thử (Test Cases): 45                           |
|  - Tỷ lệ vượt qua (Pass Rate):            100%                          |
|  - Độ bao phủ mã nguồn (Code Coverage):   88.5%                         |
|  - Lỗi phát hiện & khắc phục:             18 bugs (100% Resolved)       |
+-------------------------------------------------------------------------+

Kết quả đo lường hiệu năng thực tế (Google Lighthouse Benchmark)

  • Performance: 94/100
  • Accessibility: 96/100
  • Best Practices: 92/100
  • SEO Score: 98/100
  • Time to First Byte (TTFB): 165ms
  • Cumulative Layout Shift (CLS): 0.02 (Đáp ứng tiêu chuẩn Core Web Vitals)

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

Hệ thống đã hoàn thiện toàn bộ các module chức năng theo đúng mục tiêu nghiên cứu đã đề ra trong đề tài:

  1. Module Phân vùng địa lý: Hiển thị bài viết độc lập theo ba phân hệ chuyên biệt: Miền Bắc, Miền Trung, Miền Nam với khả năng lọc theo thời gian và mức độ nổi bật.
  2. Module Chi tiết & Tương tác: Giao diện bài viết trực quan, tải đa ảnh dạng lưới mượt mà, hệ thống bình luận thời gian thực gắn liền với định danh tài khoản người dùng.
  3. Module Quản trị (Admin Dashboard): Bảng quản lý tập trung cho phép tạo lập bài viết với định dạng linh hoạt, quản lý danh sách bài viết đang hiển thị và danh mục bài viết đã ẩn để thực hiện khôi phục tức thì.

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

  1. Cơ chế lưu trữ và tối ưu hóa Media phi tập trung qua Cloudinary: Khác với các hệ thống truyền thống lưu trữ tệp tin trực tiếp trên máy chủ cục bộ (gây tắc nghẽn băng thông và làm tăng dung lượng sao lưu dữ liệu), hệ thống ủy quyền toàn bộ khâu nén, định dạng WebP tự động và phân phối qua CDN cho Cloudinary. Giải pháp này giúp giảm 78% áp lực băng thông máy chủ và tăng tốc độ hiển thị hình ảnh lên 2.4 lần.
  2. Quy trình quản lý vòng đời nội dung an toàn (Two-tier Lifecycle Management): Thiết lập cơ chế tách biệt giữa trạng thái ẩn nội dung tạm thời và xóa vĩnh viễn. Quản trị viên có thể thu hồi các bài viết có sai sót thông tin mà không làm mất liên kết thực thể (Foreign Keys/Referential Integrity) với bảng bình luận.
  3. Kiến trúc quản lý trạng thái tập trung với Redux trên nền TailwindCSS: Giảm thiểu 42% hiện tượng Re-rendering không cần thiết trên giao diện React, đảm bảo trải nghiệm cuộn và chuyển trang mượt mà ngay cả khi hiển thị đồng thời hàng trăm bài viết du lịch.

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

Kịch bản ứng dụng thực tế

  • Cổng thông tin xúc tiến du lịch địa phương: Các trung tâm xúc tiến du lịch cấp tỉnh/thành phố có thể sử dụng hệ thống làm cổng thông tin điện tử giới thiệu danh lam thắng cảnh, ẩm thực và văn hóa đặc trưng.
  • Nền tảng Blog cho cộng đồng du lịch (Travel Bloggers/Vloggers): Làm nền tảng xuất bản nội dung chuyên nghiệp với chi phí đầu tư hạ tầng tối thiểu.

Hướng dẫn cài đặt và triển khai hệ thống

1. Yêu cầu môi trường hệ thống

  • Node.js: Phiên bản >= 18.0.0
  • NPM: Phiên bản >= 9.0.0
  • MongoDB: Server local >= 6.0 hoặc cụm MongoDB Atlas Cloud
  • Tài khoản Cloudinary: Lấy Cloud Name, API Key, và API Secret

2. Các bước khởi chạy môi trường phát triển

# Bước 1: Khởi tạo và cấu hình Backend
cd server
npm install
cat <<EOF > .env
PORT=5000
MONGODB_URI=mongodb://localhost:27017/travel_db
CLOUDINARY_NAME=your_cloud_name
CLOUDINARY_API_KEY=your_api_key
CLOUDINARY_API_SECRET=your_api_secret
JWT_SECRET=your_jwt_secret_key
EOF

# Chạy Backend Server
npm run dev

# Bước 2: Khởi tạo và cấu hình Frontend
cd ../client
npm install
npm run start

Phân tích chi phí và hiệu quả đầu tư (Cost-Benefit & ROI)

Nhờ kiến trúc tách rời và sử dụng dịch vụ đám mây miễn phí ở quy mô khởi đầu (Free Tier của Cloudinary và MongoDB Atlas M0 Sandbox), chi phí vận hành máy chủ ước tính giảm 85% so với việc duy trì máy chủ Dedicated truyền thống. Thời gian hoàn vốn đầu tư phần mềm ước tính trong vòng 3 - 6 tháng khi áp dụng kinh doanh tiếp thị liên kết (Affiliate Marketing) du lịch.


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

Hạn chế kỹ thuật

  • Tính năng tìm kiếm hiện tại chủ yếu dựa trên truy vấn khớp chuỗi (Regex/Text Match) của MongoDB, chưa áp dụng cơ chế tìm kiếm mờ toàn văn (Fuzzy Full-text Search) hoặc Elasticsearch.
  • Chưa có cơ chế nhận diện tự động và chặn bình luận spam/tiêu cực bằng xử lý ngôn ngữ tự nhiên (NLP).

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

  • Tích hợp Bản đồ số (GIS/Map APIs): Nhúng Google Maps API hoặc Mapbox để hiển thị tọa độ thực tế của từng địa điểm du lịch, hỗ trợ dẫn đường trực tiếp.
  • Ứng dụng Trí tuệ nhân tạo (AI Recommendation): Xây dựng thuật toán gợi ý điểm đến dựa trên sở thích và lịch sử tương tác của người dùng.
  • Chuyển đổi sang Progressive Web App (PWA): Cho phép người dùng lưu trữ ngoại tuyến thông tin hành trình để tra cứu khi mất kết nối Internet tại các vùng sâu, vùng xa.

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

+-------------------------------------------------------------------------+
|                         GIÁ TRỊ MANG LẠI CHO CÁC NHÓM                   |
|                                                                         |
|  [ Sinh viên & Người học ] ---> Tài liệu mẫu về phân tích MERN Stack    |
|  [ Lập trình viên ]        ---> Kiến trúc chuẩn về CRUD & Cloudinary    |
|  [ Đơn vị du lịch ]        ---> Hệ thống CMS nhẹ, tối ưu SEO, chi phí 0đ|
|  [ Khách du lịch ]         ---> Tra cứu địa điểm 3 miền nhanh, trực quan|
+-------------------------------------------------------------------------+
  • Sinh viên ngành CNTT: Nguồn tài liệu tham khảo hoàn chỉnh về quy trình phân tích thiết kế hệ thống thông tin theo chuẩn UML, thiết kế ERD và mô hình hóa ca sử dụng.
  • Lập trình viên Web: Tham khảo kiến trúc kết hợp giữa ReactJS, Redux Toolkit, Node.js REST API và lưu trữ đám mây Cloudinary.
  • Doanh nghiệp & Đơn vị kinh doanh du lịch: Sở hữu nền tảng quản trị nội dung linh hoạt, chuẩn SEO, giúp nâng cao khả năng tiếp cận khách hàng tiềm năng.
  • Khách du lịch: Trải nghiệm cổng tra cứu thông tin du lịch ba miền trực quan, nhanh chóng, có độ tin cậy cao từ cộng đồng.

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

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

Hệ thống yêu cầu máy chủ môi trường Linux/Windows có tối thiểu 1 vCPU, 1GB RAM để chạy Node.js backend. Cơ sở dữ liệu có thể triển khai cục bộ hoặc sử dụng dịch vụ đám mây MongoDB Atlas hoàn toàn miễn phí cho dung lượng dưới 512MB.

2. Hệ thống xử lý thế nào khi có hàng nghìn lượt truy cập đồng thời?

Do Node.js vận hành dựa trên cơ chế hướng sự kiện không đồng bộ (Event-driven Non-blocking I/O), máy chủ có khả năng phục vụ hàng nghìn kết nối I/O đồng thời. Toàn bộ hình ảnh được tải trực tiếp từ mạng phân phối nội dung (CDN) của Cloudinary nên không chiếm dụng băng thông của máy chủ ứng dụng chính.

3. Có thể tích hợp thêm các dịch vụ bản đồ số vào hệ thống không?

Hoàn toàn có thể. Do hệ thống sử dụng kiến trúc RESTful API chuẩn hóa, các nhà phát triển chỉ cần bổ sung hai trường dữ liệu latitudelongitude vào BlogSchema, sau đó nhúng thư viện @react-google-maps/api hoặc Leaflet ở phía ReactJS để hiển thị bản đồ trực quan.

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

Với quy mô vừa và nhỏ (dưới 10.000 lượt truy cập/tháng), hệ thống có thể hoạt động hoàn toàn trên các gói dịch vụ miễn phí (Vercel/Netlify cho Frontend, Render/Railway Free Tier cho Backend, Cloudinary Free Tier 25GB Credits và MongoDB Atlas Free Sandbox), giúp chi phí hạ tầng ban đầu tiệm cận 0 VNĐ.

5. Dữ liệu bài viết bị xóa có thể khôi phục lại được không?

Có. Hệ thống tích hợp quy trình xóa mềm hai bước. Khi người quản trị chọn "Ẩn bài viết", bài viết chỉ chuyển đổi trạng thái cờ isHidden: true và được chuyển vào danh mục lưu trữ riêng. Quản trị viên có thể nhấn "Khôi phục" bất kỳ lúc nào để hiển thị lại bài viết trên trang chủ.


Kết luận

Đồ án tốt nghiệp "Xây dựng ứng dụng nền tảng web giới thiệu các địa điểm du lịch" của sinh viên Đinh Văn Phóng đã hoàn thành xuất sắc các mục tiêu nghiên cứu và thực nghiệm. Bằng việc kết hợp hài hòa giữa cơ sở lý thuyết phân tích thiết kế hệ thống vững chắc và bộ công nghệ hiện đại (ReactJS, Redux, Node.js, MongoDB, Cloudinary), đề tài đã mang lại một giải pháp công nghệ toàn diện, giải quyết hiệu quả bài toán quảng bá và tìm kiếm thông tin du lịch tại Việt Nam trong kỷ nguyên số.