Giới thiệu dự án

Thị trường giải trí số và tiêu thụ nội dung video trực tuyến (Over-The-Top - OTT) chứng kiến sự bùng nổ mạnh mẽ, với lưu lượng video chiếm hơn 65% tổng lưu lượng băng thông Internet toàn cầu theo báo cáo từ Sandvine. Tại Việt Nam, nhu cầu tiếp cận các nền tảng xem phim trực tuyến độ nét cao, tương tác tức thì và phân loại nội dung khoa học ngày càng trở thành yêu cầu thiết yếu của người dùng Internet. Tuy nhiên, nhiều nền tảng trực tuyến truyền thống vẫn gặp phải các điểm nghẽn (pain points) lớn: kiến trúc nguyên khối (monolithic) gây nghẽn cổ chai khi lượng truy cập tăng đột biến, giao diện tải lại toàn trang (full-page reload) làm gián đoạn trải nghiệm nghe nhìn, và thiếu cơ chế theo dõi nhật ký tìm kiếm (search logs) để tối ưu hóa gợi ý nội dung.

Đề tài "Xây dựng website xem phim" do sinh viên Lại Thị Huyền (Khóa 2017 – 2022, Ngành Hệ thống Thông tin, Học viện Công nghệ Bưu chính Viễn thông - PTIT) thực hiện dưới sự hướng dẫn của TS. Nguyễn Tất Thắng, tập trung giải quyết triệt để các thách thức kỹ thuật trên thông qua việc phân tách kiến trúc hệ thống hiện đại, tối ưu hóa cơ sở dữ liệu quan hệ và xây dựng giao diện ứng dụng đơn trang (Single Page Application - SPA).

+-------------------------------------------------------------------------------+
|                             HỆ THỐNG WEBSITE XEM PHIM                         |
+---------------------------------------+---------------------------------------+
|             PHÂN HỆ ADMIN             |           PHÂN HỆ NGƯỜI DÙNG          |
+---------------------------------------+---------------------------------------+
| * Quản lý Video & Luồng phát tiếp theo | * Xem phim theo Thể loại & Channel    |
| * Quản lý Danh mục Phim & Menu        | * Danh sách Phim Hot của tháng        |
| * Quản lý Channel phân phối           | * Tìm kiếm thời gian thực (Real-time) |
| * Analytics & Search Logs Tracking    | * Bình luận tích hợp Google Account   |
+---------------------------------------+---------------------------------------+

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

  1. Thiết kế và hiện thực hóa hệ thống phân loại phim đa chiều thông qua các bảng liên kết FilmMenuMappingVideoFilmMapping.
  2. Xây dựng dịch vụ quản trị nội dung (CMS) toàn diện cho phép kiểm soát tập trung: Video, Film, Channel, Menu, và Search Logs.
  3. Tích hợp phân hệ người dùng tối ưu hóa trải nghiệm tương tác: tìm kiếm phim nhanh, theo dõi phim hot trong tháng, và bình luận tương tác tự động đồng bộ tài khoản Google.
  4. Triển khai kiến trúc Decoupled Backend (Java Spring Framework) và Frontend (Angular SPA) nhằm đạt độ trễ phản hồi API dưới 150ms và giảm 40% tải băng thông giao diện.

Phạm vi giới hạn: Hệ thống tập trung vào phân phối luồng video MP4/HLS tiêu chuẩn, quản lý quan hệ thực thể nội dung và phân tích hành vi tìm kiếm trên môi trường web; chưa tích hợp giải pháp mã hóa bảo vệ bản quyền số phức hợp (Multi-DRM) ở phiên bản hiện tại.


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 web xem phim trên thị trường chỉ ra sự phân hóa rõ rệt giữa các mô hình kiến trúc:

Tiêu chí phân tích Nền tảng PHP Monolithic / WordPress Nền tảng Java Server Pages (JSP/Servlet) Giải pháp đề xuất: Spring Boot + Angular
Kiến trúc giao diện Server-Side Rendering (SSR) truyền thống, gián đoạn khi chuyển trang SSR với Java Beans, tải lại trang liên tục Single Page Application (SPA), Client-Side Routing bất đồng bộ
Hiệu năng xử lý Trung bình, tiêu tốn tài nguyên máy chủ khi render view Ổn định nhưng chiếm dụng bộ nhớ Session trên máy chủ Tối ưu hóa cao qua Cơ chế Dependency Injection (DI) & Two-way Data Binding
Khả năng mở rộng API Khó tích hợp với các ứng dụng di động bên ngoài Hạn chế, gắn liền với chu kỳ sống của Servlet Container RESTful API độc lập, chuẩn hóa định dạng JSON
Theo dõi hành vi Dựa vào Google Analytics bên ngoài Ghi nhận Log tệp thô (Flat File Log) Bảng SearchLogs chuyên biệt lưu vết truy vấn phục vụ phân tích xu hướng

Ma trận ưu tiên yêu cầu người dùng theo phương pháp MoSCoW:

  • Must have (Bắt buộc): Module đăng nhập bảo mật Admin; CRUD (Create-Read-Update-Delete) Video, Phim, Channel, Menu; Chức năng phát video trực tuyến và tìm kiếm phim.
  • Should have (Nên có): Bộ theo dõi Search Logs thống kê tần suất từ khóa; Cơ chế tự động chỉ định tập video kế tiếp (next_video_id); Tích hợp bình luận liên kết Google User Info.
  • Could have (Có thể có): Bộ lọc phim hot của tháng dựa trên tương tác; Phân luồng phim theo chuyên trang Channel.
  • Won't have (Chưa có): Thuật toán nén video tự động đa độ phân giải (Transcoding on-the-fly) và cổng thanh toán đăng ký thuê bao VIP.
graph TD
    Client[Client Browser: Angular SPA / TypeScript] -->|HTTP RESTful JSON Request| Controller[Spring REST Controllers]
    Controller -->|Dependency Injection| Service[Business Logic Service Layer]
    Service -->|Hibernate / Spring Data JPA| DAO[Data Access Object - DAO Layer]
    DAO -->|Connection Pool / JDBC Driver| Database[(MySQL Database Engine)]
    Controller -.->|OAuth2 Token Verification| GoogleAuth[Google Identity Services]
    Service -->|Log Search Queries| SearchLogTable[(SearchLogs Table)]

Thiết kế hệ thống

Hệ thống được tổ chức theo mô hình phân tầng nghiêm ngặt (N-Tier Layered Architecture):

  1. Technology Stack:

    • Backend: Java JDK 11, Spring Framework 5.3.x (Spring MVC, Spring Data JPA, Spring Security), Hibernate ORM, Maven.
    • Frontend: Angular 12, TypeScript 4.3, RxJS, Bootstrap UI framework.
    • Database: MySQL 8.0 Community Server với Storage Engine InnoDB hỗ trợ ACID transactions.
    • Môi trường & Công cụ: Apache Tomcat 9, Git, Postman API Tester, IntelliJ IDEA.
  2. Thiết kế Cơ sở dữ liệu và Lược đồ quan hệ (Schema Design): Hệ thống loại bỏ tình trạng dư thừa dữ liệu bằng việc chuẩn hóa về dạng chuẩn 3NF. Quan hệ nhiều-nhiều ($N-N$) giữa FilmMenu, cũng như giữa VideoFilm được giải quyết bằng các thực thể bảng trung gian:

-- Lược đồ các bảng quan hệ n-n và theo dõi log
CREATE TABLE User (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    role VARCHAR(20) DEFAULT 'ROLE_ADMIN'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE Channels (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    channel_name VARCHAR(100) NOT NULL,
    description TEXT,
    user_id BIGINT,
    FOREIGN KEY (user_id) REFERENCES User(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE Film (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    film_name VARCHAR(255) NOT NULL,
    avatar_url VARCHAR(500),
    description TEXT,
    is_hot_month BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE Video (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    video_url VARCHAR(500) NOT NULL,
    avatar_url VARCHAR(500),
    description TEXT,
    next_video_id BIGINT DEFAULT NULL,
    FOREIGN KEY (next_video_id) REFERENCES Video(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE VideoFilmMapping (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    video_id BIGINT NOT NULL,
    film_id BIGINT NOT NULL,
    FOREIGN KEY (video_id) REFERENCES Video(id) ON DELETE CASCADE,
    FOREIGN KEY (film_id) REFERENCES Film(id) ON DELETE CASCADE,
    UNIQUE KEY uq_video_film (video_id, film_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE SearchLogs (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    search_keyword VARCHAR(255) NOT NULL,
    search_count INT DEFAULT 1,
    last_searched TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  1. Thiết kế RESTful API:
Method Endpoint Quyền truy cập Chức năng chi tiết
POST /api/v1/auth/login Public Xác thực thông tin Admin, cấp phát phiên làm việc
GET /api/v1/films/hot-month Public Truy vấn danh sách phim hot trong tháng (is_hot_month = true)
GET /api/v1/films/search?keyword={q} Public Tìm kiếm danh mục phim theo từ khóa, ghi nhận vào SearchLogs
POST /api/v1/admin/videos Admin Thêm mới Video, gán Avatar và cấu hình next_video_id
POST /api/v1/comments Authenticated Tiếp nhận comment, xác thực tài khoản Google, cập nhật luồng bình luận
GET /api/v1/admin/search-logs Admin Trích xuất báo cáo thống kê các từ khóa tìm kiếm nhiều nhất

Methodology

Dự án áp dụng mô hình phát triển phần mềm lặp linh hoạt (Iterative Agile-like Lifecycle) kéo dài 16 tuần:

  • Tuần 1 - 3: Khảo sát yêu cầu, xây dựng danh mục Use Case tổng quan/chi tiết (21 Usecase scenarios), định nghĩa biểu đồ lớp (Class Diagram) và biểu đồ tuần tự (Sequence Diagram).
  • Tuần 4 - 6: Thiết kế CSDL quan hệ trên MySQL, viết DDL scripts, cấu hình tầng DAO và Spring Data JPA Entity Mapping.
  • Tuần 7 - 11: Phát triển lõi nghiệp vụ Backend (Spring Services/Controllers) và xây dựng giao diện Angular (Components, Two-way binding, Routing Modules).
  • Tuần 12 - 14: Kiểm thử tích hợp (Integration Testing), kiểm thử bảo mật tầng truy cập (Access Control), tối ưu hóa truy vấn SQL.
  • Tuần 15 - 16: Đánh giá chấp nhận người dùng (UAT), sửa lỗi và nghiệm thu kỹ thuật.

Implementation và kết quả

Development process

  1. Xây dựng tầng Data Access Object (DAO) và Service trong Spring Framework: Áp dụng mô hình hướng đối tượng với các nguyên tắc cốt lõi: Dependency Injection (DI), Inversion of Control (IoC), và tách biệt Plain Old Java Objects (POJOs).
// FilmService.java - Xử lý tìm kiếm và tự động ghi Search Logs
@Service
@Transactional
public class FilmServiceImpl implements FilmService {

    @Autowired
    private FilmDAO filmDAO;

    @Autowired
    private SearchLogsDAO searchLogsDAO;

    @Override
    public List<FilmDTO> searchFilmByKeyword(String keyword) {
        if (keyword == null || keyword.trim().isEmpty()) {
            return Collections.emptyList();
        }
        
        String cleanKeyword = keyword.trim().toLowerCase();
        // 1. Ghi nhận và gia tăng số đếm trong SearchLogs
        SearchLogs log = searchLogsDAO.findBySearchKeyword(cleanKeyword);
        if (log != null) {
            log.setSearchCount(log.getSearchCount() + 1);
            searchLogsDAO.save(log);
        } else {
            SearchLogs newLog = new SearchLogs();
            newLog.setSearchKeyword(cleanKeyword);
            newLog.setSearchCount(1);
            searchLogsDAO.save(newLog);
        }

        // 2. Truy vấn danh sách phim khớp từ khóa
        List<Film> films = filmDAO.findByFilmNameContainingIgnoreCase(cleanKeyword);
        return films.stream().map(this::convertToDTO).collect(Collectors.toList());
    }

    private FilmDTO convertToDTO(Film film) {
        FilmDTO dto = new FilmDTO();
        dto.setId(film.getId());
        dto.setFilmName(film.getFilmName());
        dto.setAvatarUrl(film.getAvatarUrl());
        dto.setDescription(film.getDescription());
        return dto;
    }
}
  1. Hiện thực hóa giao diện tương tác trên Angular SPA: Sử dụng cơ chế Two-way Data Binding và RxJS Observables để quản lý dữ liệu luồng và cập nhật trạng thái UI tức thì không cần tải lại trang.
// video-player.component.ts - Quản lý phát video và tự động chuyển tập
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { VideoService } from '../services/video.service';
import { VideoDetail } from '../models/video-detail.model';

@Component({
  selector: 'app-video-player',
  templateUrl: './video-player.component.html',
  styleUrls: ['./video-player.component.css']
})
export class VideoPlayerComponent implements OnInit {
  currentVideo!: VideoDetail;
  isLoading: boolean = true;

  constructor(
    private route: ActivatedRoute,
    private router: Router,
    private videoService: VideoService
  ) {}

  ngOnInit(): void {
    this.route.params.subscribe(params => {
      const videoId = +params['id'];
      this.loadVideoDetails(videoId);
    });
  }

  loadVideoDetails(id: number): void {
    this.isLoading = true;
    this.videoService.getVideoById(id).subscribe({
      next: (data) => {
        this.currentVideo = data;
        this.isLoading = false;
      },
      error: (err) => {
        console.error('Lỗi khi tải dữ liệu video:', err);
        this.isLoading = false;
      }
    });
  }

  onVideoEnded(): void {
    if (this.currentVideo && this.currentVideo.nextVideoId) {
      this.router.navigate(['/watch', this.currentVideo.nextVideoId]);
    }
  }
}

Testing và validation

Hệ thống đã trải qua các đợt kiểm thử đơn vị (Unit Testing), kiểm thử tích hợp (Integration Testing) và đánh giá tải:

  • Test Scenarios: 45 kịch bản kiểm thử bao phủ toàn bộ 21 Use Case chính (xác thực đăng nhập, CRUD dữ liệu, phân trang danh mục, chuyển luồng video).
  • Code Coverage: Đạt 89.5% độ bao phủ trên các tầng DAO và Service thông qua JUnit và Mockito.
  • Performance Benchmarks:
    • Thời gian phản hồi API trung bình: 85ms đối với tác vụ đọc dữ liệu có chỉ mục (Indexed Read), 140ms đối với tác vụ ghi (Write/Update).
    • Tải trang ban đầu (First Contentful Paint - FCP) trên trình duyệt máy khách: 1.2 giây; chuyển đổi giữa các View trong Single Page Application chỉ mất < 180ms.
  • User Acceptance Testing (UAT): Thử nghiệm với 50 người dùng độc lập thực hiện các tác vụ duyệt phim, tìm kiếm từ khóa và đăng bình luận; tỷ lệ hoàn thành tác vụ thành công đạt 98.4%.
+-------------------------------------------------------------------------------+
|                       KẾT QUẢ KIỂM THỬ VÀ HIỆU NĂNG TẢI                       |
+------------------------------+--------------------+---------------------------+
| Chỉ số đo lường              | Mục tiêu ban đầu   | Kết quả thực nghiệm       |
+------------------------------+--------------------+---------------------------+
| Tỷ lệ bao phủ kiểm thử (DAO) | >= 80%             | 89.5%                     |
| Thời gian phản hồi API (GET) | < 200 ms           | 85 ms (vượt 57.5%)        |
| Chuyển đổi trạng thái SPA    | < 300 ms           | 180 ms                    |
| Tỷ lệ xử lý lỗi kịch bản UAT | 0 lỗi nghiêm trọng | 0 Critical / 2 Minor Bugs |
+------------------------------+--------------------+---------------------------+

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

  1. Xây dựng hoàn chỉnh phân hệ Quản trị (CMS) gồm 6 màn hình chức năng: Quản lý Video (Upload, sửa, xóa, gắn cờ tập tiếp theo), Quản lý Phim, Quản lý Channel, Quản lý Menu động, Theo dõi Search Logs, và Đăng nhập.
  2. Hoàn thiện phân hệ Client cho người dùng: Trang chủ phân loại phim nổi bật, Khung hiển thị phim hot của tháng, Phân loại theo Menu/Channel, Khung video player tương tác, Bộ tìm kiếm gợi ý tức thì và Phân hệ bình luận liên kết tài khoản Google.
  3. Đạt được cấu trúc phân tách hoàn toàn giữa Business Layer và Presentation Layer, tăng tính tái sử dụng mã nguồn và thuận tiện cho bảo trì nâng cấp.

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

  • Tự động hóa chuỗi tập tiếp theo (Automated Sequential Video Streaming): Khác với các hệ thống phát video thông thường yêu cầu truy vấn lại toàn bộ danh sách phát, thiết kế thuộc tính tự tham chiếu next_video_id trong bảng Video cho phép bộ phát client chuyển tập ngay lập tức với độ trễ chuyển mạch 0ms (zero-delay switching).
  • Cơ chế Search Logs Tracking tích hợp sâu tại tầng Service: Thay vì sử dụng các plugin phân tích bên thứ ba làm tăng chi phí tải trang, hệ thống tự động bắt và đếm tần suất các từ khóa tìm kiếm ngay trong chu kỳ xử lý nghiệp vụ, cung cấp dữ liệu tức thì cho Quản trị viên để nắm bắt xu hướng thị hiếu người xem.
  • Tối ưu hóa đa phân loại bằng Mapping Tables: Thiết kế FilmMenuMappingVideoFilmMapping cho phép một bộ phim có thể linh hoạt xuất hiện trên nhiều chuyên mục menu hoặc nhiều channel mà không gây trùng lặp dữ liệu, giảm 35% dung lượng lưu trữ CSDL so với cách thiết kế phẳng truyền thống.

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

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

  1. Cổng thông tin giải trí truyền thông: Triển khai làm cổng phân phối phim bản quyền, phim bộ, phim tài liệu cho các đơn vị phát hành nội dung số.
  2. Kênh đào tạo Video trực tuyến nội bộ (E-Learning / Knowledge Base): Áp dụng mô hình cấu trúc Channel - Film - Video để tổ chức các khóa học nhiều bài giảng có tính liên kết chặt chẽ và tự động chuyển bài.
[Máy Khách / Client Devices]
      │ (HTTPS / Web Browser)
      ▼
[Reverse Proxy / Nginx Web Server] (SSL Termination, Gzip Compression)
      │
      ├────────► [Static Files: Angular Production Build (HTML/CSS/JS)]
      │
      └────────► [Spring Boot Application Server (Port 8080)]
                     │
                     ├────────► [Google OAuth Identity API (Token Check)]
                     │
                     └────────► [MySQL 8.0 Database Cluster (InnoDB Engine)]

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

  • Yêu cầu máy chủ tối thiểu: CPU 2 Cores, RAM 4GB, Dung lượng đĩa SSD 40GB, Môi trường Ubuntu Linux 20.04 LTS.
  • Phần mềm yêu cầu: OpenJDK 11, MySQL 8.0, Nginx làm Reverse Proxy.
  • Quy trình triển khai:
    1. Khởi tạo cơ sở dữ liệu và phân quyền: Chạy script schema.sql trên máy chủ MySQL.
    2. Đóng gói ứng dụng Backend: Thực thi mvn clean package -DskipTests để tạo file movie-streaming-api.jar.
    3. Chạy dịch vụ Backend dưới dạng daemon systemd hoặc container Docker.
    4. Build ứng dụng Frontend: Thực thi lệnh ng build --configuration production trong thư mục client.
    5. Cấu hình Nginx trỏ thư mục gốc (Root Directory) về thư mục /dist/movie-client và cấu hình proxy_pass cho các request /api/ tới máy chủ Spring Boot.

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

  • Hạn chế kỹ thuật hiện tại: Chưa tích hợp hệ thống lưu trữ phân tán (như AWS S3 hoặc MinIO) và mạng phân phối nội dung (CDN) cho tệp tin video dung lượng lớn; tính năng gợi ý phim vẫn dựa trên phân loại tĩnh và Search Logs cơ bản, chưa áp dụng các thuật toán máy học (Collaborative Filtering / Deep Learning Recommendation).
  • Hướng phát triển:
    1. Tích hợp giao thức truyền phát video thích ứng HTTP Live Streaming (HLS) / MPEG-DASH để tự động thay đổi độ phân giải (360p, 720p, 1080p, 4K) theo tốc độ mạng của người dùng.
    2. Xây dựng dịch vụ Recommendation Engine dựa trên thuật toán lọc cộng tác (Collaborative Filtering) phân tích hành vi xem phim thực tế.
    3. Mở rộng ứng dụng trên nền tảng di động (Flutter / React Native) kế thừa toàn bộ hệ thống Spring Boot REST API đã xây dựng.

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

  • Sinh viên & Học viên ngành Công nghệ thông tin: Là 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 từ sơ đồ Use Case, Biểu đồ lớp, Biểu đồ tuần tự đến triển khai mã nguồn thực tế.
  • Lập trình viên Full-Stack: Tiếp cận mô hình chuẩn về việc phân tách kiến trúc Backend (Spring Framework) và Frontend (Angular SPA), cách thiết kế quan hệ bảng n-n hiệu quả trong Hibernate/JPA.
  • Doanh nghiệp vừa và nhỏ: Sở hữu kiến trúc nền tảng có thể tùy biến nhanh chóng để xây dựng cổng video thương mại hoặc phân phối nội dung nội bộ với chi phí phần mềm bản quyền bằng 0 (Open-Source Stack).

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

1. Hệ thống có yêu cầu phần cứng đặc biệt nào để triển khai không?

Không. Hệ thống được tối ưu hóa trên nền tảng mã nguồn mở Java và MySQL, có thể vận hành mượt mà trên bất kỳ máy chủ ảo (VPS) tiêu chuẩn nào có cấu hình từ 2 CPU Cores và 4GB RAM trở lên.

2. Khả năng mở rộng (Scalability) của hệ thống khi lượng người xem tăng cao như thế nào?

Do Backend được thiết kế theo dạng RESTful Stateless API, hệ thống dễ dàng mở rộng theo chiều ngang (Horizontal Scaling) bằng cách bổ sung các phiên bản chạy ứng dụng Spring Boot phía sau một bộ cân bằng tải (Load Balancer như Nginx hoặc HAProxy), đồng thời tách biệt máy chủ lưu trữ MySQL và máy chủ Video CDN.

3. Việc tích hợp bình luận Google Account có yêu cầu lưu trữ mật khẩu của người dùng không?

Hoàn toàn không. Hệ thống chỉ nhận xác thực và đồng bộ định danh công khai (Tên hiển thị, Avatar, Email) từ Google API Client Token, đảm bảo an toàn bảo mật tuyệt đối cho dữ liệu cá nhân của người dùng cuối.

4. Cơ chế chuyển tập video tự động hoạt động ra sao?

Bảng Video chứa trường khóa ngoại next_video_id trỏ đến id của video tiếp theo trong cùng bộ phim. Khi sự kiện ended của thẻ video HTML5 kích hoạt trên Angular, hệ thống sẽ tự động điều hướng Router sang ID video kế tiếp mà không cần sự can thiệp của người dùng.

5. Chi phí vận hành ước tính cho một hệ thống quy mô vừa là bao nhiêu?

Nhờ tận dụng 100% công nghệ mã nguồn mở (Linux, Java OpenJDK, Spring, Angular, MySQL), chi phí bản quyền phần mềm là 0 đồng. Chi phí duy nhất là hạ tầng máy chủ lưu trữ và băng thông truyền tải, ước tính từ 30 - 80 USD/tháng cho quy mô 10.000 lượt xem phim hàng ngày.


Kết luận

Đồ án tốt nghiệp "Xây dựng website xem phim" của tác giả Lại Thị Huyền đã giải quyết thành công bài toán xây dựng một hệ thống giải trí trực tuyến hoàn chỉnh, hiện đại và chuẩn mực về mặt kỹ thuật công nghệ thông tin. Việc kết hợp hài hòa giữa sức mạnh xử lý đa luồng, bảo mật của Java Spring Framework ở phía Backend cùng tính linh hoạt, tương tác mượt mà của Angular SPA ở phía Frontend đã tạo nên một giải pháp có tính ứng dụng thực tiễn cao, đáp ứng đầy đủ các tiêu chuẩn khắt khe về trải nghiệm người dùng số. Hệ thống không chỉ cung cấp một sản phẩm phần mềm hoàn thiện mà còn đóng vai trò là một tài liệu nghiên cứu ứng dụng mẫu mực cho việc phân tích, thiết kế và phát triển các hệ thống phần mềm hướng dịch vụ trong kỷ nguyên chuyển đổi số.