Giới thiệu dự án

Thị trường điện ảnh tại Việt Nam đang ghi nhận tốc độ tăng trưởng vượt bậc trong khu vực Đông Nam Á. Theo số liệu thống kê từ ngành công nghiệp điện ảnh, số lượng phòng chiếu toàn quốc đã tăng từ 87 phòng (doanh thu 302 tỷ VNĐ ~ 13 triệu USD) vào năm 2009 lên 1.063 phòng tại 204 cụm rạp vào năm 2019, đạt doanh thu 4.100 tỷ VNĐ (tương đương 178,3 triệu USD), gấp 13,5 lần sau một thập kỷ. Tỷ lệ bình quân tại Việt Nam hiện đạt mức xấp xỉ 450.000 người/cụm rạp (so với tỷ lệ 5.000 người/cụm rạp tại Hoa Kỳ), mở ra tiềm năng khai thác dịch vụ số rất lớn. Khảo sát hành vi người tiêu dùng chỉ ra rằng có tới 83,0% khán giả tìm kiếm thông tin phim và rạp qua Internet; trong đó 80,8% người xem quan tâm trực tiếp đến giá vé/ưu đãi và 65,2% chú trọng chất lượng phòng chiếu (âm thanh, màn hình).

Tuy nhiên, thị trường đang tồn tại sự phân mảnh thông tin nghiêm trọng giữa các hệ thống rạp lớn (như CJ CGV với 75 cụm rạp, Lotte Cinema với 42 cụm rạp, BHD Star, Galaxy Cinema). Khán giả gặp khó khăn trong việc tra cứu tập trung thông tin lịch chiếu, trạng thái phát hành (đang chiếu, sắp chiếu, phim hot), phân loại độ tuổi (G, PG, PG-13, R, NC-17), điểm đánh giá uy tín (IMDb, Rotten Tomatoes) và chương trình khuyến mãi theo khu vực địa lý.

Đề tài "Xây dựng quản lý Website review phim bằng công nghệ React + Node JS" (tác giả Trần Thị Phương Lan, GVHD ThS. Nguyễn Đức Thiện, Trường Đại học Công nghệ Đông Á, 2022) được triển khai nhằm giải quyết bài toán hợp nhất dữ liệu trên nền tảng web hiện đại.

+-------------------------------------------------------------------------------+
|                             MỤC TIÊU DỰ ÁN                                   |
+-------------------------------------------------------------------------------+
| 1. Xây dựng nền tảng Single Page Application (SPA) tra cứu thông tin phim     |
| 2. Chuẩn hóa hệ thống quản lý danh mục (CMS) cho phim, cụm rạp, diễn viên     |
| 3. Tự động hóa phân loại trạng thái phim theo mốc thời gian công chiếu        |
| 4. Thiết kế kiến trúc RESTful Web Services tách biệt hoàn toàn FE & BE        |
+-------------------------------------------------------------------------------+

Giải pháp lựa chọn kiến trúc hướng dịch vụ (Service-Oriented Architecture), kết hợp thư viện giao diện người dùng ReactJS (Front-end), nền tảng thực thi Node.js (Back-end) và hệ quản trị cơ sở dữ liệu hướng tài liệu MongoDB (NoSQL). Giải pháp này đảm bảo tối ưu hóa tốc độ tải trang dưới 1,5 giây, hỗ trợ khả năng mở rộng linh hoạt (Horizontal Scalability) và đáp ứng nhu cầu trải nghiệm người dùng (UX) trên đa thiết bị. Phạm vi đồ án tập trung vào phân hệ tra cứu - đánh giá - quản trị nội dung phim và rạp chiếu trên toàn quốc; không bao gồm phân hệ thanh toán trực tuyến và đặt giữ chỗ trực tiếp.


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ị trường cho thấy sự khác biệt rõ nét giữa hệ thống website đơn lẻ của từng rạp và các trang đánh giá phim quốc tế:

Tiêu chí phân tích Website Rạp đơn lẻ (CGV, Lotte) Website Đánh giá quốc tế (IMDb) Hệ thống Web Review Phim đề xuất
Dữ liệu rạp chiếu Cục bộ trong 1 hệ thống Không hỗ trợ rạp nội địa Đa hệ thống (CGV, Lotte, BHD, Galaxy)
Thông tin giá & Ưu đãi Cập nhật đơn lẻ từng hãng Không có thông tin giá Bảng giá tổng hợp, dịch vụ cơ sở
Độ phủ đánh giá Không hiển thị review khách quan Tổng hợp điểm quốc tế Tích hợp điểm IMDb, Rotten Tomatoes
Tốc độ phản hồi UI Chậm (Tải lại toàn trang) Trung bình (Nhiều quảng cáo) Nhanh (Single Page Application)

Mô hình phân loại yêu cầu người dùng theo ma trận MoSCoW:

  • Must have (Bắt buộc): Tra cứu phim theo trạng thái (Phim hot, Phim mới, Đang chiếu, Sắp chiếu); Tìm kiếm theo tên; Xem chi tiết nội dung, diễn viên, đạo diễn, giới hạn độ tuổi; Bảng giá và thông tin chi nhánh rạp; Module Admin CRUD (Create, Read, Update, Delete) phim, rạp, diễn viên.
  • Should have (Nên có): Lọc phim theo thể loại; Hiển thị video trailer chất lượng cao; Form liên hệ đặt quảng cáo cho doanh nghiệp.
  • Could have (Có thể có): Tổng hợp điểm đánh giá từ nhiều nguồn uy tín; Tích hợp bản đồ vị trí rạp cơ sở.
  • Won't have (Chưa thực hiện): Đặt vé trực tuyến và cổng thanh toán trung gian; Hệ thống bình luận thời gian thực (Real-time WebSockets).
+---------------------------------------------------------------------------------------+
|                                MA TRẬN YÊU CẦU MOSCOW                                 |
+---------------------------------------------------------------------------------------+
|  MUST HAVE (Bắt buộc)               |  SHOULD HAVE (Nên có)                           |
|  - Tra cứu trạng thái phim          |  - Lọc theo thể loại phim                       |
|  - Xem chi tiết phim & diễn viên    |  - Nhúng video Trailer HD                       |
|  - Danh mục rạp & bảng giá          |  - Tiếp nhận thông tin quảng cáo                |
|  - Hệ thống CMS Quản trị            |                                                 |
|-------------------------------------+-------------------------------------------------|
|  COULD HAVE (Mở rộng)               |  WON'T HAVE (Chưa hỗ trợ)                       |
|  - Tổng hợp điểm IMDb/Rotten        |  - Cổng thanh toán trực tuyến                   |
|  - Định vị tọa độ rạp cơ sở         |  - Đặt chỗ & xuất vé điện tử                    |
+---------------------------------------------------------------------------------------+

Thiết kế hệ thống

Hệ thống được thiết kế theo mô hình 3 tầng độc lập tương tác qua giao thức HTTP/HTTPS:

[ Client Layer: ReactJS SPA (Components, Props, State, JSX, Axios) ]
                                |
                   HTTP/RESTful API (JSON Payload)
                                v
[ Web Service Layer: Node.js runtime (Chrome V8) + Express.js Controller / Router ]
                                |
                    Mongoose ODM (Driver Protocol)
                                v
[ Data Persistence Layer: MongoDB (NoSQL Document Store, BSON Data Engine) ]
  • Front-end (Client Layer): Xây dựng trên nền tảng ReactJS 18, tổ chức cấu trúc theo Component-Driven Architecture. Sử dụng cú pháp JSX, luồng truyền dữ liệu thông qua Props và quản lý trạng thái giao diện qua State/React Hooks. Giao tiếp bất đồng bộ qua Axios Client.
  • Back-end (Service Layer): Sử dụng môi trường NodeJS v16+ kết hợp framework Express.js v4.x, vận hành theo cơ chế Event-driven Non-blocking I/O trên nền tảng Chrome V8 Engine. Triển khai kiến trúc RESTful API đáp ứng các phương thức chuẩn: GET, POST, PUT, DELETE.
  • Database Layer: MongoDB v5.0+, lưu trữ dữ liệu dưới định dạng tài liệu linh hoạt (BSON/JSON Document). Tự động tạo chỉ mục (Index) trên trường khóa chính _id và hỗ trợ mở rộng phần cứng linh hoạt (Horizontal Scalability).
+-----------------------------------------------------------------------------------------+
|                              DANH MỤC THIẾT KẾ RESTFUL API                              |
+-----------------------------------------------------------------------------------------+
| METHOD | ENDPOINT URI               | MÔ TẢ CHỨC NĂNG              | ĐỐI TƯỢNG XỬ LÝ    |
+--------+----------------------------+------------------------------+--------------------+
| GET    | /api/v1/movies             | Lấy danh sách phim phân trang| Client (Public)    |
| GET    | /api/v1/movies/:id         | Lấy chi tiết thông tin phim  | Client (Public)    |
| POST   | /api/v1/movies             | Tạo mới bản ghi phim         | Admin (Authorized) |
| PUT    | /api/v1/movies/:id         | Cập nhật thông tin phim      | Admin (Authorized) |
| DELETE | /api/v1/movies/:id         | Xóa phim khỏi hệ thống       | Admin (Authorized) |
| GET    | /api/v1/cinemas            | Lấy danh sách các đơn vị rạp | Client (Public)    |
| POST   | /api/v1/cinemas            | Thêm mới đơn vị rạp          | Admin (Authorized) |
| POST   | /api/v1/auth/login         | Xác thực quản trị viên       | Admin Auth         |
+-----------------------------------------------------------------------------------------+
// Model Schema thiết kế trên MongoDB sử dụng Mongoose ODM
const mongoose = require('mongoose');

const MovieSchema = new mongoose.Schema({
  title: { type: String, required: true, trim: true, index: true },
  director: { type: String, required: true },
  cast: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Actor' }],
  duration: { type: Number, required: true }, // Thời lượng (phút)
  releaseDate: { type: Date, required: true },
  genres: [{ type: String, required: true }],
  ageRating: { 
    type: String, 
    enum: ['G', 'PG', 'PG-13', 'R', 'NC-17'], 
    default: 'G' 
  },
  ratings: {
    imdb: { type: Number, min: 0, max: 10 },
    rottenTomatoes: { type: Number, min: 0, max: 100 }
  },
  trailerUrl: { type: String, required: true },
  isHot: { type: Boolean, default: false },
  isNewRelease: { type: Boolean, default: true },
  description: { type: String, required: true },
  cinemasShowing: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Cinema' }]
}, { timestamps: true });

module.exports = mongoose.model('Movie', MovieSchema);

Methodology

Quy trình phát triển dự án áp dụng mô hình phát triển linh hoạt (Agile/Scrum) với chu kỳ 4 Sprint trong 12 tuần:

  • Sprint 1 (Tuần 1-3): Khảo sát nghiệp vụ rạp chiếu, lập đặc tả Use-Case bằng chuẩn UML, thiết kế CSDL trên MongoDB.
  • Sprint 2 (Tuần 4-6): Xây dựng hệ thống RESTful API với Node.js/Express; thiết lập các endpoint CRUD cho Movie, Cinema, Actor.
  • Sprint 3 (Tuần 7-9): Xây dựng Front-end SPA bằng ReactJS; thiết kế hệ thống Component cho Trang chủ, Trang chi tiết, Trang quản trị CMS.
  • Sprint 4 (Tuần 10-12): Tích hợp hệ thống (System Integration), tối ưu hóa hiệu năng tải trang, kiểm thử chức năng và đóng gói triển khai.

Quản trị rủi ro kỹ thuật: Để khắc phục nhược điểm mất toàn vẹn dữ liệu do MongoDB không hỗ trợ ràng buộc khóa ngoại (Foreign Key Constraints), hệ thống triển khai middleware xác thực dữ liệu chặt chẽ ở tầng Back-end Controller trước khi lưu xuống Database.


Implementation và kết quả

Development process

Quá trình lập trình tập trung vào việc hiện thực hóa các thuật toán xử lý dữ liệu động và giao diện phản hồi nhanh.

1. Thuật toán tự động phân loại trạng thái phim theo mốc thời gian

Hệ thống xử lý phân loại tự động giữa danh mục Phim đang chiếuPhim sắp chiếu dựa trên phép so sánh giữa releaseDate của phim và thời gian thực thi của máy chủ (Date.now()):

// Controller xử lý phân loại trạng thái phim tại Node.js Back-end
const getMoviesByStatus = async (req, res) => {
  try {
    const currentDate = new Date();
    const { status } = req.query; // 'showing' | 'upcoming' | 'hot'
    
    let queryCondition = {};
    
    if (status === 'showing') {
      // Phim đang chiếu: Ngày công chiếu nhỏ hơn hoặc bằng ngày hiện tại
      queryCondition = { releaseDate: { $lte: currentDate } };
    } else if (status === 'upcoming') {
      // Phim sắp chiếu: Ngày công chiếu lớn hơn ngày hiện tại
      queryCondition = { releaseDate: { $gt: currentDate } };
    } else if (status === 'hot') {
      // Phim hot: Trạng thái isHot = true
      queryCondition = { isHot: true };
    }

    const movies = await Movie.find(queryCondition)
      .populate('cast', 'name avatar')
      .populate('cinemasShowing', 'name logo')
      .sort({ releaseDate: -1 });

    return res.status(200).json({
      success: true,
      count: movies.length,
      data: movies
    });
  } catch (error) {
    return res.status(500).json({ success: false, message: error.message });
  }
};

2. Khai thác Component và State trong ReactJS để lọc phim thời gian thực

// React Component: Bộ lọc danh sách phim đa tiêu chí
import React, { useState, useEffect } from 'react';
import axios from 'axios';

const MovieList = () => {
  const [movies, setMovies] = useState([]);
  const [filterGenre, setFilterGenre] = useState('ALL');
  const [searchTerm, setSearchTerm] = useState('');
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const fetchMovies = async () => {
      try {
        const res = await axios.get('/api/v1/movies?status=showing');
        setMovies(res.data.data);
        setLoading(false);
      } catch (err) {
        console.error('Lỗi khi tải dữ liệu phim:', err);
        setLoading(false);
      }
    };
    fetchMovies();
  }, []);

  const filteredMovies = movies.filter(movie => {
    const matchesGenre = filterGenre === 'ALL' || movie.genres.includes(filterGenre);
    const matchesSearch = movie.title.toLowerCase().includes(searchTerm.toLowerCase());
    return matchesGenre && matchesSearch;
  });

  if (loading) return <div className="spinner">Đang tải danh sách phim...</div>;

  return (
    <div className="movie-container">
      <div className="filter-controls">
        <input 
          type="text" 
          placeholder="Nhập tên phim cần tìm..." 
          value={searchTerm} 
          onChange={(e) => setSearchTerm(e.target.value)} 
        />
        <select onChange={(e) => setFilterGenre(e.target.value)} value={filterGenre}>
          <option value="ALL">Tất cả thể loại</option>
          <option value="Hành Động">Hành Động</option>
          <option value="Kinh Dị">Kinh Dị</option>
          <option value="Tình Cảm">Tình Cảm</option>
        </select>
      </div>
      <div className="movie-grid">
        {filteredMovies.map(movie => (
          <div key={movie._id} className="movie-card">
            <img src={movie.posterUrl} alt={movie.title} />
            <h3>{movie.title}</h3>
            <p>Khởi chiếu: {new Date(movie.releaseDate).toLocaleDateString('vi-VN')}</p>
            <span className={`badge badge-${movie.ageRating}`}>{movie.ageRating}</span>
          </div>
        ))}
      </div>
    </div>
  );
};

export default MovieList;

Testing và validation

Hệ thống đã trải qua quá trình kiểm thử tự động và kiểm thử chấp nhận người dùng (UAT):

  • Unit Test & Integration Test: 58 kịch bản kiểm thử API thông qua Postman và Jest; đạt tỷ lệ bao phủ mã nguồn (Code Coverage) 88%.
  • Performance Benchmarking:
    • Thời gian phản hồi API trung bình: 85ms đối với tác vụ đọc (Read) và 115ms đối với tác vụ ghi (Write).
    • Tốc độ tải trang đầu (First Contentful Paint - FCP): 1,1 giây trên nền tảng máy tính và 1,4 giây trên mạng 4G di động.
    • Truy vấn CSDL MongoDB tối ưu hóa qua Index: Tốc độ quét 10.000 bản ghi đạt mức < 15ms.
  • User Acceptance Testing (UAT): Thực nghiệm lấy ý kiến từ 50 người dùng cuối và 5 quản trị viên:
    • 94% người dùng hài lòng với độ rõ ràng của cấu trúc thông tin rạp và phân loại phim.
    • 90% đánh giá giao diện trực quan, thao tác nhanh hơn website truyền thống.
+-----------------------------------------------------------------------------------------+
|                     KẾT QUẢ ĐẠT ĐƯỢC SO VỚI MỤC TIÊU BAN ĐẦU                            |
+-----------------------------------------------------------------------------------------+
| HẠNG MỤC TÍNH NĂNG / CHỈ SỐ     | CHỈ TIÊU KẾ HOẠCH       | KẾT QUẢ THỰC TẾ ĐẠT ĐƯỢC    |
+---------------------------------+-------------------------+-----------------------------+
| Đăng tải & Quản lý Phim         | Đầy đủ CRUD + Phân loại | Đạt 100% (UC #006, UC #008) |
| Tra cứu thông tin rạp & Giá vé  | 4 hệ thống rạp lớn      | Đạt 100% (UC #003, UC #007) |
| Tự động cập nhật phim sắp chiếu | Phân loại theo ngày     | Đạt 100% (Độ trễ = 0s)      |
| Thời gian phản hồi trang (FCP)  | < 2.0 giây              | Đạt 1.1 - 1.4 giây          |
| Mức độ hài lòng người dùng      | > 85%                   | Đạt 94%                     |
+-----------------------------------------------------------------------------------------+

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

  1. Chuyển dịch kiến trúc từ Monolithic MVC sang Decoupled Headless SPA: Khác với các hệ thống PHP/Java truyền thống dựng giao diện trực tiếp từ máy chủ (Server-Side Rendering làm tăng tải phần cứng), đề tài tách biệt hoàn toàn máy chủ API và Client SPA. Băng thông truyền tải mạng giảm 45% do máy chủ chỉ trả về dữ liệu thuần định dạng JSON thay vì toàn bộ mã HTML.
  2. Mô hình dữ liệu hướng tài liệu tối ưu cho dữ liệu điện ảnh: Sử dụng cấu trúc Document của MongoDB cho phép nhúng danh sách rạp cơ sở và diễn viên trực tiếp vào cây dữ liệu của từng đối tượng rạp/phim. Giải pháp này triệt tiêu thao tác JOIN nhiều bảng phức tạp trong RDBMS, giảm 35% chi phí tính toán CPU trên máy chủ cơ sở dữ liệu khi truy vấn chi tiết phim.
  3. Hợp nhất thông tin rạp chiếu liên cụm: Thay vì buộc người dùng truy cập lần lượt từng ứng dụng riêng lẻ của CGV, Lotte, BHD để kiểm tra giá vé và phòng chiếu, hệ thống cung cấp giao diện tích hợp đa nền tảng đầu tiên tại phân khúc đồ án đại học đáp ứng tiêu chuẩn thông tin rạp chiếu toàn diện.

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

Kịch bản vận hành thực tế

  • Khán giả đại chúng: Truy cập hệ thống để tra cứu trailer, điểm số Rotten Tomatoes/IMDb và tìm kiếm rạp có giá vé dịch vụ phù hợp nhất trong bán kính khu vực trước khi đưa ra quyết định xem phim.
  • Doanh nghiệp / Đơn vị sản xuất phim: Sử dụng cổng thông tin để gửi yêu cầu đặt banner quảng bá chiến dịch truyền thông phim mới hoặc rạp chiếu mới khai trương thông qua module liên hệ quản trị.

Yêu cầu hệ thống và quy trình triển khai

+-----------------------------------------------------------------------------------------+
|                                 YÊU CẦU MÔI TRƯỜNG DEPLOY                               |
+-----------------------------------------------------------------------------------------+
| THÀNH PHẦN       | YÊU CẦU TỐI THIỂU             | KHUYẾN NGHỊ VẬN HÀNH                |
+------------------+-------------------------------+-------------------------------------+
| Hệ điều hành     | Linux (Ubuntu 20.04 LTS)      | Ubuntu 22.04 LTS / Debian 11        |
| CPU / RAM        | 1 vCPU / 2GB RAM              | 2 vCPU / 4GB RAM                    |
| Runtime          | Node.js v16.x + NPM v8.x      | Node.js v18.x LTS                   |
| Cơ sở dữ liệu    | MongoDB Community v5.0        | MongoDB Atlas Cluster / Replica Set |
| Web Server Proxy | Nginx 1.18                    | Nginx 1.22 (Bật Gzip & HTTP/2)      |
+-----------------------------------------------------------------------------------------+
# Quy trình triển khai Backend Node.js với Process Manager PM2
git clone https://github.com/production/movie-review-api.git
cd movie-review-api
npm install --production
pm2 start server.js --name "movie-api" -i max

# Cấu hình Nginx làm Reverse Proxy cho React SPA & Node API
server {
    listen 80;
    server_name reviewphim.domain.vn;

    location /api/ {
        proxy_pass http://localhost:5000/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    location / {
        root /var/www/movie-review-fe/build;
        index index.html;
        try_files $uri $uri/ /index.html;
    }
}

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

  • Hạn chế kỹ thuật hiện tại:
    1. Dữ liệu điểm đánh giá (IMDb, Rotten Tomatoes) hiện vẫn phụ thuộc vào việc cập nhật thủ công từ phía quản trị viên, chưa tích hợp hệ thống Web Crawler hoặc gọi trực tiếp Official Open API từ IMDb.
    2. Chưa tích hợp hệ thống kiểm soát quyền quản trị viên đa cấp bậc (Role-Based Access Control - RBAC) mà chỉ hỗ trợ tài khoản Super Admin duy nhất.
    3. Chưa có cơ chế cảnh báo tự động khi phát sinh lỗi kết nối đến cơ sở dữ liệu MongoDB.
  • Hướng phát triển đề xuất:
    1. Tích hợp công nghệ Web Socket (Socket.io) để cập nhật tương tác bình luận, chấm điểm review trực tiếp của cộng đồng người xem theo thời gian thực.
    2. Ứng dụng thuật toán gợi ý phim (Recommendation Engine) dựa trên lịch sử tìm kiếm và sở thích thể loại của người dùng.
    3. Đóng gói ứng dụng di động đa nền tảng bằng React Native, tận dụng lại 100% hệ thống RESTful API hiện có.

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

  • Sinh viên & Người học CNTT: Cung cấp mã nguồn tham khảo hoàn chỉnh về cách tổ chức kiến trúc tách biệt giữa Front-end ReactJS và Back-end NodeJS; nắm bắt kỹ thuật thiết kế CSDL NoSQL MongoDB chuẩn hóa.
  • Lập trình viên (Developers): Nắm vững quy trình xây dựng RESTful Web API, cơ chế quản lý vòng đời Component trong React và mô hình phi đồng bộ Non-blocking I/O trong Node.js.
  • Doanh nghiệp & Đơn vị rạp: Sở hữu giải pháp tiếp cận khách hàng mục tiêu với chi phí thấp, tối ưu hiệu quả quảng bá thương hiệu rạp chiếu và lịch phát hành phim.
  • Cộng đồng khán giả: Tiết kiệm 50% thời gian tra cứu và lựa chọn điểm xem phim, nắm bắt chính xác bảng giá vé và ưu đãi giữa các cụm rạp trên toàn quốc.

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

1. Cần chuẩn bị môi trường kỹ thuật gì để triển khai mã nguồn của dự án?

Để vận hành hệ thống, máy chủ cần cài đặt môi trường Node.js (phiên bản 16.x trở lên), trình quản lý gói NPM/Yarn, hệ quản trị cơ sở dữ liệu MongoDB (phiên bản 5.0 trở lên) và máy chủ web Nginx làm Reverse Proxy. Phía client chỉ cần trình duyệt web hiện đại hỗ trợ tiêu chuẩn ECMAScript 6 (Chrome, Firefox, Safari, Edge).

2. Hệ thống xử lý bài toán mở rộng (Scalability) như thế nào khi lượng truy cập tăng đột biến?

Nhờ vào tính chất phi đồng bộ (Non-blocking I/O) của Node.js, máy chủ có thể tiếp nhận hàng nghìn kết nối đồng thời trên một luồng duy nhất (Single Thread Event Loop). Ở tầng cơ sở dữ liệu, kiến trúc NoSQL của MongoDB cho phép mở rộng cụm máy chủ (Sharding/Clustering) theo chiều ngang mà không làm gián đoạn hệ thống. Phía Front-end ReactJS đã được đóng gói thành các file tĩnh (Static Assets), có thể phân phối dễ dàng qua mạng phân phối nội dung (CDN).

3. Có thể tái sử dụng hệ thống RESTful API của dự án cho ứng dụng Mobile không?

Hoàn toàn có thể. Do hệ sinh thái được thiết kế theo chuẩn Headless Architecture, toàn bộ logic nghiệp vụ và dữ liệu được đóng gói độc lập qua chuẩn RESTful API định dạng JSON. Bất kỳ ứng dụng di động nào (xây dựng bằng React Native, Flutter, Swift hay Kotlin) đều có thể gọi trực tiếp đến các endpoint /api/v1/movies hoặc /api/v1/cinemas mà không cần chỉnh sửa mã nguồn phía Back-end.

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

Chi phí vận hành hệ thống ở quy mô vừa và nhỏ là rất thấp do khai thác hoàn toàn các công nghệ nguồn mở (Open-source). Một máy chủ ảo (Cloud VPS) cấu hình 2 vCPU / 4GB RAM có chi phí khoảng 200.000 - 300.000 VNĐ/tháng, kết hợp dịch vụ MongoDB Atlas (bản miễn phí hoặc 9$/tháng) là đủ năng lực phục vụ hàng chục nghìn lượt truy cập mỗi ngày.

5. Khả năng bảo mật của website được thiết lập như thế nào?

Hệ thống áp dụng cơ chế bảo mật đa lớp: Tầng truyền tải được bảo vệ bằng giao thức mã hóa HTTPS/SSL; Tầng API sử dụng mã thông báo JWT (JSON Web Token) để xác thực quyền quản trị viên, tích hợp middleware kiểm tra và làm sạch dữ liệu đầu vào chống tấn công NoSQL Injection và Cross-Site Scripting (XSS); Tầng giao diện sử dụng CORS để giới hạn các domain được phép truy vấn dữ liệu.


Kết luận

Đồ án tốt nghiệp "Xây dựng quản lý Website review phim bằng công nghệ React + Node JS" của sinh viên Trần Thị Phương Lan đã giải quyết trọn vẹn bài toán thực tiễn về hợp nhất thông tin điện ảnh tại Việt Nam. Bằng việc ứng dụng thành công các công nghệ tiêu chuẩn hiện đại gồm ReactJS, NodeJSMongoDB, đề tài không chỉ đạt được hiệu năng vận hành vượt trội về tốc độ phản hồi giao diện và khả năng xử lý dữ liệu động, mà còn đóng góp một tài liệu tham khảo kỹ thuật giá trị cho sinh viên chuyên ngành Công nghệ Thông tin. Hệ thống sở hữu tiềm năng thương mại hóa cao, sẵn sàng mở rộng thành nền tảng truyền thông điện ảnh chuyên nghiệp trong tương lai.