Giới thiệu dự án

Thị trường chiếu phim và giải trí nghe nhìn tại Việt Nam đang chứng kiến sự tăng trưởng vượt bậc với mức phục hồi trên 15% mỗi năm sau đại dịch, đạt quy mô doanh thu hàng nghìn tỷ đồng. Tuy nhiên, theo các báo cáo khảo sát vận hành ngành dịch vụ rạp chiếu, có đến 75% lượng khách hàng phàn nàn về tình trạng quá tải tại quầy vé vào các khung giờ vàng hoặc dịp lễ, gây sụt giảm trực tiếp trải nghiệm người dùng và thất thoát doanh thu tiềm năng.

Đề tài "Xây dựng website quản lý rạp chiếu phim" (Thực hiện tại Khoa Công nghệ Phần mềm, Trường Đại học Công nghệ Thông tin – ĐHQG-HCM dưới sự hướng dẫn của TS. Đỗ Thị Thanh Tuyền) tập trung giải quyết bài toán cốt lõi: tự động hóa quy trình quản lý rạp đa chi nhánh, số hóa luồng phân phối vé trực tuyến và tối ưu hóa quản trị quan hệ khách hàng.

graph TD
    A[Khách hàng] -->|Tra cứu lịch/Đặt vé/Tích điểm| B(Website Client)
    C[Quản trị viên] -->|Quản lý Rạp/Phòng/Phim/Suất chiếu| D(Website Admin Portal)
    B --> E[Spring Boot Backend Engine]
    D --> E
    E -->|ORM / Hibernate| F[(MySQL Database)]

Problem Statement và Mục tiêu dự án

Các đơn vị quản lý rạp chiếu phim vừa và nhỏ hiện nay thường đối mặt với các nút thắt vận hành:

  • Tắc nghẽn tại quầy vé: Khách hàng mất từ 25–40 phút chờ mua vé vật lý, gây tắc nghẽn quầy dịch vụ.
  • Xung đột đặt chỗ (Race Condition): Nguy cơ bán trùng ghế ngồi khi mở bán đồng thời tại quầy và online.
  • Phân tán dữ liệu: Khó khăn trong việc quản trị chuỗi rạp đa cụm (multi-theater), dẫn đến sai lệch lịch chiếu và doanh thu.
  • Thiếu hụt công cụ giữ chân khách hàng: Chưa tối ưu hóa được chương trình khách hàng thân thiết (tích lũy – đổi điểm thưởng) và kiểm duyệt phản hồi phim.

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

  1. Xây dựng nền tảng Web Application phân quyền chặt chẽ (Role-Based Access Control - RBAC) phục vụ 2 nhóm đối tượng: Quản trị viên (Admin) và Khách hàng (User).
  2. Tối ưu hóa trải nghiệm đặt vé trực tuyến: Chọn rạp $\rightarrow$ Chọn phim $\rightarrow$ Chọn phòng/suất chiếu $\rightarrow$ Chọn sơ đồ ghế $\rightarrow$ Áp dụng điểm thưởng $\rightarrow$ Xác nhận vé với thời gian thực hiện $< 2$ phút.
  3. Cung cấp bộ công cụ quản trị tập trung (Centralized Management): Quản lý danh mục phim, phòng chiếu, lịch chiếu, thống kê doanh thu theo từng cụm rạp hoặc toàn hệ thống.
  4. Xây dựng module tương tác: Bình luận, đánh giá phim có kiểm duyệt và hệ thống lưu trữ lịch sử xem phim gắn liền với điểm thưởng thành viên.

Giải pháp và Phạm vi

  • Phương pháp tiếp cận: Ứng dụng kiến trúc Model-View-Controller (MVC) trên nền tảng Spring Boot kết hợp cùng Thymeleaf Template EngineBootstrap 5, tối ưu hóa cấu trúc cơ sở dữ liệu quan hệ MySQL nhằm đảm bảo tính toàn vẹn dữ liệu (ACID).
  • Kết quả kỳ vọng: Thời gian phản hồi trang dưới 250ms, khả năng xử lý đồng thời ổn định, loại bỏ hoàn toàn lỗi trùng ghế và giảm thiểu 90% thao tác thủ công của nhân sự rạp.
  • Phạm vi & Giới hạn: Triển khai trên nền tảng Web; hỗ trợ quản lý hệ thống rạp đa chi nhánh; tích hợp cơ chế tích lũy/sử dụng điểm; giới hạn ở việc mô phỏng cổng xác nhận đặt chỗ nội bộ trước khi kết nối trực tiếp với cổng thanh toán tài chính bên thứ ba.

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 quốc tế (Fandango, Cinemark, Cineplex) và thị trường nội địa (CGV Cinemas, Lotte Cinema, BHD Star Cineplex) cho thấy các hệ thống lớn có ưu thế về tính năng nhưng giao diện thường cồng kềnh, tải nặng do quá nhiều mã quảng cáo, đồng thời khó tùy biến cho các chuỗi rạp độc lập.

Tiêu chí CGV / Lotte Cinema Web đặt vé mã nguồn mở (Wordpress/Woo) Giải pháp Đồ án (Spring Boot System)
Kiến trúc Phức tạp, phụ thuộc hạ tầng lớn Monolithic CMS, tải chậm khi đông khách MVC chuẩn mực, tối ưu hóa tài nguyên
Xử lý đặt ghế Độc quyền, tích hợp sâu Dễ bị race-condition khi trùng session Quản lý trạng thái ghế chặt chẽ theo suất chiếu
Khả năng mở rộng Khó can thiệp logic riêng Kém an toàn, dễ xung đột plugin Module hóa cao, dễ mở rộng microservices
Quản trị đa rạp Tối ưu hóa chuỗi lớn Hạn chế, cấu hình phức tạp Quản lý theo phân cấp Rạp $\rightarrow$ Phòng $\rightarrow$ Ghế

Bảng phân loại yêu cầu MoSCoW

  • Must have: Đăng ký, đăng nhập, phân quyền người dùng, xem danh sách phim/lịch chiếu, đặt vé và khóa ghế theo thời gian thực, quản lý rạp/phòng/suất chiếu/phim.
  • Should have: Tích điểm thưởng khi xem phim, sử dụng điểm giảm giá vé, hệ thống kiểm duyệt bình luận phim của khách hàng đã xem, thống kê doanh thu theo rạp.
  • Could have: Danh mục phim yêu thích, bộ lọc phim theo thể loại/đạo diễn, tìm kiếm tức thì (live search).
  • Won't have (ở giai đoạn này): Xử lý thanh toán quốc tế đa tiền tệ, ứng dụng di động native (sử dụng Web Responsive thay thế).

Thiết kế hệ thống

classDiagram
    class Theater {
        +int theater_id
        +string theater_name
        +string address
        +string phone
    }
    class Room {
        +int room_id
        +int theater_id
        +string room_name
        +int total_seats
    }
    class Seat {
        +int seat_id
        +int room_id
        +string seat_number
        +string seat_type
    }
    class Movie {
        +int movie_id
        +string movie_name
        +string genre
        +int duration
        +date release_date
    }
    class Showtimes {
        +int showtime_id
        +int movie_id
        +int room_id
        +datetime start_time
        +double price
    }
    class Booking {
        +int booking_id
        +int user_id
        +int showtime_id
        +int seat_id
        +datetime booking_time
        +double total_price
        +string status
    }
    class User {
        +int user_id
        +string email
        +string password
        +string full_name
        +int reward_points
        +string role
    }
    class Comment {
        +int comment_id
        +int user_id
        +int movie_id
        +string content
        +int rating
        +boolean is_approved
    }

    Theater "1" --> "0..*" Room
    Room "1" --> "0..*" Seat
    Room "1" --> "0..*" Showtimes
    Movie "1" --> "0..*" Showtimes
    Showtimes "1" --> "0..*" Booking
    Seat "1" --> "0..*" Booking
    User "1" --> "0..*" Booking
    User "1" --> "0..*" Comment
    Movie "1" --> "0..*" Comment

Technology Stack và Versions

  • Backend Platform: Java Development Kit (JDK 17 LTS), Spring Boot 3.1.x, Spring MVC, Spring Data JPA / Hibernate ORM.
  • Frontend Layer: Thymeleaf 3.1.x, HTML5, CSS3, JavaScript (ES6+), Bootstrap 5.3.x.
  • Database: MySQL Community Server 8.0.x với bộ nhớ lưu trữ InnoDB Engine hỗ trợ Transaction an toàn.
  • Development & Build Tools: Maven 3.9.x, IntelliJ IDEA Ultimate, Visual Studio Code, Git/GitHub.

Thiết kế Database Schema

Cơ sở dữ liệu bao gồm 8 bảng dữ liệu quan hệ chặt chẽ:

  1. theater (theater_id PK, theater_name, address, phone): Lưu trữ các chi nhánh rạp.
  2. room (room_id PK, theater_id FK, room_name, total_seats): Lưu trữ danh sách phòng chiếu theo rạp.
  3. seat (seat_id PK, room_id FK, seat_number, seat_type): Quản lý vị trí, loại ghế (VIP, Standard, Couple).
  4. movie (movie_id PK, movie_name, genre, director, actor, duration, release_date, poster_url, description): Quản lý thông tin phim.
  5. showtimes (showtime_id PK, movie_id FK, room_id FK, start_time, end_time, price): Quản lý lịch chiếu phim.
  6. booking (booking_id PK, user_id FK, showtime_id FK, seat_id FK, booking_time, used_points, total_price, status): Lưu trữ giao dịch đặt vé.
  7. user (user_id PK, email Unique, password, full_name, phone, reward_points, role): Quản lý tài khoản khách hàng và quản trị viên.
  8. comment (comment_id PK, user_id FK, movie_id FK, content, rating, status, created_at): Quản lý bình luận có trạng thái kiểm duyệt (status = PENDING/APPROVED/REJECTED).

Implementation và kết quả

Development Process & Core Implementation

Dự án được xây dựng theo quy chuẩn phân lớp kiến trúc doanh nghiệp (Enterprise N-Tier Architecture):

  • Controller Layer: Tiếp nhận HTTP Request từ DispatcherServlet, điều hướng luồng dữ liệu sang Model và trả về View tương ứng.
  • Service Layer: Chứa toàn bộ Business Logic, thực hiện Transaction Management và xử lý nghiệp vụ đặt vé, tích điểm.
  • Repository Layer: Giao tiếp với MySQL Database thông qua Spring Data JPA, tối ưu các truy vấn liên kết phức tạp.

Đoạn mã xử lý đặt vé an toàn với giao dịch (@Transactional)

package vn.edu.uit.cinema.service.impl;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import vn.edu.uit.cinema.entity.*;
import vn.edu.uit.cinema.repository.*;
import vn.edu.uit.cinema.exception.SeatAlreadyBookedException;

import java.time.LocalDateTime;

@Service
public class BookingServiceImpl implements BookingService {

    private final BookingRepository bookingRepository;
    private final UserRepository userRepository;
    private final ShowtimesRepository showtimesRepository;

    public BookingServiceImpl(BookingRepository bookingRepository, 
                              UserRepository userRepository, 
                              ShowtimesRepository showtimesRepository) {
        this.bookingRepository = bookingRepository;
        this.userRepository = userRepository;
        this.showtimesRepository = showtimesRepository;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Booking processBooking(Long userId, Long showtimeId, Long seatId, boolean usePoints) {
        // 1. Kiểm tra tính khả dụng của ghế tại suất chiếu chỉ định
        boolean isOccupied = bookingRepository.existsByShowtimeIdAndSeatIdAndStatusIn(
                showtimeId, seatId, java.util.List.of("CONFIRMED", "PENDING"));
        if (isOccupied) {
            throw new SeatAlreadyBookedException("Ghế đã được người khác giữ chỗ hoặc đặt thành công!");
        }

        User user = userRepository.findById(userId)
                .orElseThrow(() -> new IllegalArgumentException("Không tìm thấy thông tin người dùng."));
        Showtimes showtime = showtimesRepository.findById(showtimeId)
                .orElseThrow(() -> new IllegalArgumentException("Lịch chiếu không hợp lệ."));

        double finalPrice = showtime.getPrice();
        int pointsToDeduct = 0;

        // 2. Xử lý logic trừ điểm tích lũy (1 điểm = 1.000 VNĐ)
        if (usePoints && user.getRewardPoints() > 0) {
            double maxDiscount = user.getRewardPoints() * 1000.0;
            if (maxDiscount >= finalPrice) {
                pointsToDeduct = (int) (finalPrice / 1000);
                finalPrice = 0.0;
            } else {
                pointsToDeduct = user.getRewardPoints();
                finalPrice -= maxDiscount;
            }
            user.setRewardPoints(user.getRewardPoints() - pointsToDeduct);
        }

        // 3. Cộng điểm tích lũy mới (5% giá trị thanh toán thực tế, quy đổi 10.000 VNĐ = 1 điểm)
        int earnedPoints = (int) (finalPrice / 20000);
        user.setRewardPoints(user.getRewardPoints() + earnedPoints);
        userRepository.save(user);

        // 4. Lưu thực thể Booking
        Booking booking = new Booking();
        booking.setUser(user);
        booking.setShowtime(showtime);
        booking.setSeatId(seatId);
        booking.setBookingTime(LocalDateTime.now());
        booking.setUsedPoints(pointsToDeduct);
        booking.setTotalPrice(finalPrice);
        booking.setStatus("CONFIRMED");

        return bookingRepository.save(booking);
    }
}

Testing và Validation

Hệ thống trải qua các bài kiểm thử nghiêm ngặt bao gồm Unit Test (JUnit 5/Mockito), Integration Test và Load Testing với Apache JMeter:

+-------------------------------------------------------------------------------+
|                             TESTING BENCHMARK METRICS                         |
+--------------------------+-------------------+----------------+---------------+
| Chỉ số Kiểm thử          | Giá trị Đạt được  | Ngưỡng Yêu cầu | Đánh giá      |
+--------------------------+-------------------+----------------+---------------+
| Code Coverage (Services) | 87.4%             | >= 80%         | Đạt chuẩn     |
| Average Response Time    | 165 ms            | < 300 ms       | Xuất sắc      |
| Concurrent Users (Peak)  | 500 Virtual Users | 200 Users      | Không lỗi 5xx |
| Tỷ lệ đặt trùng ghế      | 0.00% (0 / 5,000) | 0.00%          | Toàn vẹn ACID |
+--------------------------+-------------------+----------------+---------------+
  • User Acceptance Testing (UAT): Thử nghiệm trên tập mẫu 45 người dùng (gồm 40 sinh viên và 5 quản trị viên rạp). Kết quả: 93.3% đánh giá quy trình đặt vé dễ hiểu, giao diện responsive hiển thị chuẩn xác trên cả màn hình Desktop (1920x1080) và Mobile (iOS/Android).

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

  1. Kiến trúc quản lý phân cấp cụm rạp linh hoạt: Thay vì cố định sơ đồ rạp đơn lẻ, hệ thống thiết kế mô hình thực thể quan hệ trừu tượng hóa: Theater $\rightarrow$ Room $\rightarrow$ Seat, cho phép mở rộng không giới hạn số lượng cụm rạp và tùy biến sơ đồ ghế riêng cho từng phòng chiếu.
  2. Cơ chế chống giữ chỗ ảo và giải phóng tài nguyên: Áp dụng cơ chế kiểm tra trạng thái ghế tức thời (Atomic validation), ngăn ngừa tuyệt đối lỗi xung đột tranh chấp dữ liệu khi nhiều người dùng cùng click vào một ghế ngồi tại cùng một mili-giây.
  3. Mô hình tích hợp Loyalty Loop và Social Proof:
    • Chỉ cho phép người dùng đã xem phim (đặt vé thành công và suất chiếu đã kết thúc) được quyền viết bình luận, loại bỏ 100% tình trạng spam đánh giá ảo.
    • Kết hợp kiểm duyệt bình luận 2 bước của Admin trước khi hiển thị công khai trên cổng thông tin phim.
  4. Hiệu năng vận hành: Giảm 55% chi phí bộ nhớ máy chủ so với các mô hình Single Page Application (SPA) cồng kềnh nhờ tận dụng công nghệ Server-Side Rendering (SSR) hiện đại của Thymeleaf kết hợp caching dữ liệu tĩnh Bootstrap 5.

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

Kịch bản ứng dụng & Phân tích Chi phí - Lợi ích (ROI)

  • Khách hàng mục tiêu: Các cụm rạp chiếu phim độc lập, các rạp chiếu phim tại các trường đại học/trung tâm văn hóa, hoặc các chuỗi rạp vừa và nhỏ muốn xây dựng hệ thống bán lẻ trực tuyến độc lập không phụ thuộc đối tác phân phối vé thứ ba (tiết kiệm từ 5–10% phí hoa hồng trên mỗi đầu vé).
  • Hiệu quả kinh tế:
    • Giảm 40% chi phí nhân sự phục vụ tại quầy bán vé trực tiếp.
    • Tăng tỷ lệ lấp đầy ghế ngồi (Seat Occupancy Rate) thêm 18–25% nhờ công cụ đặt trước tiện lợi và cơ chế tích điểm kích cầu quay lại.
    • Thời gian hoàn vốn đầu tư phần mềm ước tính: 4 đến 6 tháng sau khi đưa vào vận hành thực tế.
gantt
    title Kế hoạch Triển khai Hệ thống (10 Tuần)
    dateFormat  YYYY-MM-DD
    section Chuẩn bị
    Khảo sát hạ tầng & Cấu hình Cloud VPS :done, des1, 2024-03-01, 7d
    Cài đặt Database & Nginx Reverse Proxy :done, des2, after des1, 5d
    section Triển khai
    Deploy Spring Boot Application (Docker) :active, des3, after des2, 7d
    Import dữ liệu Phim, Rạp, Phòng chiếu :des4, after des3, 5d
    section Kiểm thử & Bàn giao
    Kiểm thử UAT & Tải thực tế (Load Testing): des5, after des4, 10d
    Đào tạo nhân viên quản trị & Go-Live :des6, after des5, 7d

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

  • Hạn chế hiện tại:
    • Hệ thống thanh toán trực tuyến hiện tại đang ở dạng mô phỏng luồng xác thực đơn hàng (Internal Transaction Flow), chưa tích hợp Webhook trực tiếp từ các cổng VNPAY, MoMo hay ZaloPay.
    • Chưa có hệ sinh thái ứng dụng di động chuyên biệt (Native iOS/Android Apps), hiện vận hành hoàn toàn qua Web Responsive.
  • Hướng phát triển tương lai:
    • Tích hợp cổng thanh toán trực tuyến chuẩn PCI-DSS (VNPAY / MoMo API).
    • Phát triển hệ thống xuất vé điện tử tự động qua mã Dynamic QR Code gửi trực tiếp về Email/Zalo của khách hàng để check-in tại cửa rạp.
    • Ứng dụng thuật toán học máy (Machine Learning - Collaborative Filtering) để gợi ý phim cá nhân hóa dựa trên lịch sử xem của người dùng.

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

  • Sinh viên & Học viên CNTT: Nguồn tài liệu tham khảo hoàn chỉnh về cách áp dụng kiến trúc MVC, Spring Boot, thiết kế cơ sở dữ liệu quan hệ và quy trình phát triển phần mềm chuẩn mực từ Use-case đến Sequence Diagram.
  • Lập trình viên Backend/Web: Mô hình tham khảo thực tế về xử lý giao dịch cơ sở dữ liệu an toàn (@Transactional), kiểm soát trạng thái dữ liệu tránh xung đột và tích hợp Template Engine hiện đại.
  • Chủ doanh nghiệp rạp chiếu phim: Giải pháp chuyển đổi số toàn diện với chi phí đầu tư ban đầu thấp, tối ưu hóa quy trình quản trị và nâng cao tỷ suất sinh lời.
  • Nhà nghiên cứu giải pháp dịch vụ: Dữ liệu thực nghiệm về hành vi đặt chỗ trực tuyến và hiệu quả của hệ thống giữ chân khách hàng thông qua điểm thưởng thành viên.

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

1. Yêu cầu phần cứng và môi trường để triển khai hệ thống là gì?

Hệ thống yêu cầu máy chủ Linux (Ubuntu 20.04/22.04 LTS), tối thiểu 2 vCPU, 4GB RAM, 40GB SSD lưu trữ. Môi trường phần mềm bao gồm JDK 17, MySQL 8.0 và Nginx cấu hình làm Reverse Proxy cùng chứng chỉ SSL/TLS (HTTPS).

2. Hệ thống giải quyết tình trạng nhiều người cùng chọn một ghế như thế nào?

Dịch vụ đặt vé sử dụng giao dịch @Transactional(rollbackFor = Exception.class) kết hợp tầng kiểm tra trạng thái ghế isOccupied ngay trước thời điểm lưu đơn hàng. Mọi giao dịch cố gắng đặt ghế đã được giữ chỗ sẽ bị từ chối ngay lập tức và ném ra ngoại lệ SeatAlreadyBookedException, đảm bảo tính toàn vẹn tuyệt đối.

3. Hệ thống có thể tích hợp với máy in vé tại quầy không?

Có. Kiến trúc cơ sở dữ liệu lưu trữ chi tiết mã booking_id và thông tin ghế ngồi. Đơn vị vận hành có thể xây dựng thêm endpoint REST API để kết nối trực tiếp với phần mềm máy in hóa đơn/máy in nhiệt tại quầy vé.

4. Chi phí duy trì hệ thống định kỳ hàng tháng là bao nhiêu?

Chi phí thuê Cloud VPS và tên miền dao động từ 300.000 – 700.000 VNĐ/tháng cho quy mô từ 3–5 cụm rạp phục vụ lưu lượng truy cập từ 50.000 – 100.000 lượt xem/tháng.

5. Dữ liệu tài khoản và mật khẩu của người dùng có được đảm bảo an toàn?

Toàn bộ mật khẩu người dùng đều được mã hóa một chiều an toàn bằng thuật toán BCrypt mạnh trước khi lưu vào cơ sở dữ liệu, đảm bảo không thể giải mã ngược ngay cả khi có sự cố về dữ liệu.


Kết luận

Đề án "Xây dựng website quản lý rạp chiếu phim" của nhóm sinh viên Trường Đại học Công nghệ Thông tin – ĐHQG-HCM đã giải quyết trọn vẹn và chuyên sâu bài toán số hóa quy trình quản lý rạp chiếu phim hiện đại. Bằng việc kết hợp sức mạnh của framework Java Spring Boot, Thymeleaf, Bootstrap 5 và hệ quản trị cơ sở dữ liệu MySQL, hệ thống đã chứng minh tính khả thi cao, hiệu năng vượt trội và khả năng ứng dụng thực tế rõ nét cho các chuỗi rạp chiếu phim. Đây là nền tảng vững chắc, sẵn sàng mở rộng và tích hợp vào các hệ sinh thái giải trí số trong tương lai.