Giới thiệu dự án

Trong bối cảnh toàn cầu hóa và chuyển đổi số giáo dục (EdTech), tiếng Anh đã trở thành chuẩn đầu ra bắt buộc tại hầu hết các cơ sở giáo dục đại học cũng như tiêu chuẩn tuyển dụng cốt lõi của các doanh nghiệp đa quốc gia. Theo các báo cáo thị trường EdTech tại Việt Nam, nhu cầu học tập và khảo thí trực tuyến tăng trưởng với tốc độ CAGR vượt mức 20% mỗi năm. Tuy nhiên, việc tiếp cận các nguồn tài liệu chuẩn hóa và môi trường thi thử TOEIC quốc tế vẫn gặp nhiều rào cản về chi phí và tính linh hoạt. Đồ án tốt nghiệp "Xây dựng website luyện thi tiếng Anh online" do sinh viên Trần Đình Hải thực hiện dưới sự hướng dẫn của ThS. Trương Thị Khánh Dịp tại Khoa Công nghệ Thông tin – Trường Đại học Sư phạm Kỹ thuật TP.HCM (HCMUTE) đã giải quyết triệt để bài toán này bằng việc ứng dụng kiến trúc phân tầng hiện đại giữa ReactJS và Spring Boot.

Vấn đề cốt lõi mà người học thường gặp phải là thiếu môi trường cọ xát với áp lực phòng thi thực tế, giao diện luyện thi ở các nền tảng cũ thường xuyên giật lag, độ trễ cao khi tải tệp âm thanh (audio streaming), thiếu phản hồi chi tiết về đáp án và quy trình thanh toán khóa học chưa được tự động hóa. Đề tài tập trung giải quyết những "điểm đau" (pain points) này thông qua một nền tảng trực tuyến toàn diện.

Mục tiêu cụ thể của dự án bao gồm:

  1. Xây dựng giao diện người dùng Single Page Application (SPA) mượt mà, phản hồi tức thì bằng ReactJS và Material-UI.
  2. Thiết kế hệ thống Backend RESTful API vững chắc, bảo mật cao dựa trên nền tảng Java Spring Boot và Spring Security.
  3. Tích hợp cổng thanh toán trực tuyến VNPay đảm bảo an toàn giao dịch và tự động phân quyền truy cập khóa học theo thời gian thực.
  4. Xây dựng phân hệ mô phỏng thi thử TOEIC 2 kỹ năng (Listening & Reading) chuẩn format ETS với bộ đếm thời gian thực và thuật toán chấm điểm tức thì.
  5. Cung cấp hệ sinh thái học tập toàn diện tích hợp video bài giảng, hệ thống ghi chú cá nhân, blog kiến thức và diễn đàn thảo luận câu hỏi.

Giải pháp lựa chọn mô hình kiến trúc tách rời Client-Server (Decoupled Architecture) giúp tối ưu hóa hiệu năng, giảm tải cho máy chủ trung tâm và cho phép mở rộng hệ thống linh hoạt trong tương lai. Kết quả kỳ vọng của hệ thống là đạt thời gian phản hồi API dưới 200ms, tải trang ban đầu dưới 1.5 giây và chịu tải đồng thời ít nhất 500 người dùng tích cực (CCU) mà không xảy ra hiện tượng thắt nút cổ chai (bottleneck).

Phạm vi nghiên cứu của đề tài tập trung vào bài thi chuẩn hóa TOEIC 2 kỹ năng, quản lý nội dung số (khóa học video, chương học, bài tập), quản lý đơn hàng và xác thực người dùng qua OTP/JWT. Giới hạn hiện tại của dự án là chưa tích hợp công nghệ AI nhận dạng giọng nói để chấm điểm kỹ năng Speaking và Writing.


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 các nền tảng luyện thi tiếng Anh trực tuyến tại Việt Nam như Study4 hay Hệ thống Anh ngữ MsHoa đã có những thành công nhất định nhưng vẫn tồn tại những nhược điểm kỹ thuật đáng kể.

Tiêu chí phân tích Study4 Anh ngữ MsHoa Hệ thống đề xuất (HCMUTE)
Kiến trúc giao diện Web bán tĩnh kết hợp SSR Web truyền thống (Multi-Page) Single Page Application (ReactJS Virtual DOM)
Độ trễ khi tải Audio Thỉnh thoảng gián đoạn kết nối Trung bình (1.5s - 2.5s) Tối ưu hóa truyền stream (< 300ms)
Tích hợp thanh toán Chuyển khoản thủ công / Cổng trung gian Nhân viên tư vấn liên hệ lại Tự động hóa 100% qua VNPay IPN Webhook
Tương tác làm bài Lưu câu trả lời theo phiên Tải lại trang khi chuyển part Lưu trữ trạng thái Client-side tức thì
Hệ thống phản hồi Thảo luận cộng đồng cơ bản Diễn đàn hạn chế Thảo luận phân cấp (Nested Comments) đa tầng

Dựa trên phân tích khoảng cách công nghệ (Gap Analysis), các yêu cầu hệ thống được phân loại theo mô hình MoSCoW:

  • Must-have (Bắt buộc): Xác thực tài khoản với JWT và OTP qua Email, làm đề thi TOEIC có tính giờ, tự động chấm điểm theo thang điểm chuẩn ETS, thanh toán VNPay an toàn, quản lý người dùng và ngân hàng đề thi dành cho Admin.
  • Should-have (Cần có): Xem video bài giảng tích hợp YouTube/Drive API, theo dõi lịch sử tiến độ học tập (user_course_progress), đánh giá bài viết blog theo số sao.
  • Could-have (Có thể có): Thống kê doanh thu theo biểu đồ trực quan, áp dụng mã khuyến mãi (promotions), ghi chú trực tiếp khi đang xem video (note).
  • Won't-have (Chưa triển khai): Lớp học trực tuyến tương tác 1-1 qua WebRTC, chấm bài luận tự động bằng mô hình ngôn ngữ lớn (LLM).

Thiết kế hệ thống

Hệ thống được thiết kế theo mô hình kiến trúc phân tầng (Layered Architecture) chuẩn công nghiệp, tách biệt hoàn toàn giữa tầng trình diễn và tầng nghiệp vụ:

[ Client Layer (ReactJS SPA) ] 
       │  HTTP / RESTful (JSON) + Bearer JWT
       ▼
[ Controller Layer (Spring MVC REST Controllers) ]
       │
[ Security Layer (Spring Security + JWT Authentication Filter) ]
       │
[ Service Layer (Business Logic & Transactions) ]
       │
[ Data Access Layer (Spring Data JPA / Hibernate) ]
       │  JDBC Connection Pool (HikariCP)
       ▼
[ Database Layer (MySQL 8.0 RDBMS) ]

Ngăn xếp công nghệ (Technology Stack) bao gồm:

  • Front-End: ReactJS v18.2.0, React Router DOM v6.x, Material-UI (MUI) v5.x, Axios v1.6.x, SCSS, React Hook Form, React Helmet (SEO Optimization).
  • Back-End: Java JDK 17, Spring Boot v3.2.x, Spring Data JPA, Spring Security, JJWT (io.jsonwebtoken v0.11.5), Lombok v1.18.x.
  • Cơ sở dữ liệu: MySQL Server v8.0 với công cụ lưu trữ InnoDB, đảm bảo tuân thủ tính chất ACID.
  • Dịch vụ bên thứ ba: VNPay Payment Gateway, Firebase Admin SDK, Google Drive API & YouTube Data API v3.

Cơ sở dữ liệu được chuẩn hóa ở dạng chuẩn 3NF (Third Normal Form) với hơn 26 bảng quan hệ. Một số bảng nòng cốt bao gồm: users, exam, question, exam_detail, audio, category_exam, topic_exam, result, result_detail, user_course, user_course_progress, video_watch_history, comments, reply_comments, post, points, ratings, promotions.

-- Trích đoạn lược đồ bảng câu hỏi và kết quả làm bài
CREATE TABLE question (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    exam_detail_id BIGINT NOT NULL,
    question_number INT NOT NULL,
    content TEXT NOT NULL,
    option_a VARCHAR(255) NOT NULL,
    option_b VARCHAR(255) NOT NULL,
    option_c VARCHAR(255) NOT NULL,
    option_d VARCHAR(255) NOT NULL,
    correct_option CHAR(1) NOT NULL,
    explanation TEXT,
    CONSTRAINT fk_question_exam_detail FOREIGN KEY (exam_detail_id) REFERENCES exam_detail(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE result (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    exam_id BIGINT NOT NULL,
    listening_score INT NOT NULL,
    reading_score INT NOT NULL,
    total_score INT NOT NULL,
    time_spent INT NOT NULL,
    completed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_result_user FOREIGN KEY (user_id) REFERENCES users(id),
    CONSTRAINT fk_result_exam FOREIGN KEY (exam_id) REFERENCES exam(id)
) ENGINE=InnoDB;

Hệ thống cung cấp các API tiêu chuẩn tuân thủ định dạng RESTful:

  • POST /api/v1/auth/login: Xác thực tài khoản, trả về JWT Token và thông tin phân quyền.
  • POST /api/v1/auth/register-otp: Gửi mã OTP xác thực email khi đăng ký tài khoản.
  • GET /api/v1/exams/{id}: Truy xuất cấu trúc đề thi, danh sách Part và tệp âm thanh nghe đính kèm.
  • POST /api/v1/exams/{id}/submit: Tiếp nhận danh sách câu trả lời của thí sinh, tính điểm và lưu bản ghi result_detail.
  • POST /api/v1/payment/create-vnpay-url: Khởi tạo liên kết thanh toán sang cổng VNPay kèm chữ ký số bảo mật SHA512.

Methodology

Dự án áp dụng phương pháp phát triển phần mềm theo mô hình Agile/Scrum điều chỉnh, thực hiện trong 14 tuần (từ 04/03/2024 đến 15/06/2024), chia thành 6 giai đoạn Sprint chính:

  • Sprint 1 (Tuần 1 - 2): Khảo sát hiện trạng, phân tích nghiệp vụ đề thi TOEIC, thiết kế sơ đồ cơ sở dữ liệu và dựng khung kiến trúc Backend/Frontend.
  • Sprint 2 (Tuần 3 - 4): Xây dựng module xác thực (JWT Auth), phân quyền User/Admin, gửi mail OTP và quản lý hồ sơ cá nhân.
  • Sprint 3 (Tuần 5 - 7): Phát triển phân hệ thi trực tuyến (giao diện làm bài, cơ chế đồng bộ âm thanh, thuật toán tính điểm scaled score).
  • Sprint 4 (Tuần 8 - 9): Xây dựng module khóa học, bài học video, tích hợp hệ thống ghi chú note và lưu tiến độ user_course_progress.
  • Sprint 5 (Tuần 10 - 11): Tích hợp cổng thanh toán VNPay, phân hệ Blog, thảo luận bình luận đa cấp và hệ thống Dashboard thống kê doanh thu.
  • Sprint 6 (Tuần 12 - 14): Kiểm thử tự động với Selenium WebDriver, quản lý lỗi bằng Jira, tối ưu hiệu năng và đóng gói tài liệu khóa luận.

Để kiểm soát rủi ro, dự án thiết lập chiến lược bảo mật nhiều lớp: mã hóa mật khẩu bằng BCrypt (work factor 10), xác thực tính toàn vẹn dữ liệu giao dịch qua thuật toán HMAC-SHA512 của VNPay, và thiết lập CORS Filter chặt chẽ chỉ cho phép các domain được ủy quyền gửi request.


Implementation và kết quả

Development process

Quá trình lập trình tuân thủ nghiêm ngặt nguyên lý SOLID và mô hình thiết kế phần mềm sạch (Clean Code). Dưới đây là các hiện thực kỹ thuật cốt lõi trong hệ thống:

1. Bộ lọc xác thực Stateless JWT Authentication Filter trên Spring Boot:

@Component
@RequiredArgsConstructor
public class JwtAuthenticationFilter extends OncePerRequestFilter {

    private final JwtService jwtService;
    private final UserDetailsService userDetailsService;

    @Override
    protected void doFilterInternal(
            @NonNull HttpServletRequest request,
            @NonNull HttpServletResponse response,
            @NonNull FilterChain filterChain
    ) throws ServletException, IOException {
        final String authHeader = request.getHeader("Authorization");
        final String jwt;
        final String userEmail;

        if (authHeader == null || !authHeader.startsWith("Bearer ")) {
            filterChain.doFilter(request, response);
            return;
        }

        jwt = authHeader.substring(7);
        userEmail = jwtService.extractUsername(jwt);

        if (userEmail != null && SecurityContextHolder.getContext().getAuthentication() == null) {
            UserDetails userDetails = this.userDetailsService.loadUserByUsername(userEmail);
            if (jwtService.isTokenValid(jwt, userDetails)) {
                UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(
                        userDetails,
                        null,
                        userDetails.getAuthorities()
                );
                authToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                SecurityContextHolder.getContext().setAuthentication(authToken);
            }
        }
        filterChain.doFilter(request, response);
    }
}

2. Thuật toán chấm điểm và quy đổi thang điểm TOEIC (Scaled Scoring Logic):

@Service
@Transactional
public class ExamScoringServiceImpl implements ExamScoringService {

    @Override
    public ExamResultDTO calculateToeicScore(Long examId, UserAnswersDTO submission, Long userId) {
        List<Question> questions = questionRepository.findByExamId(examId);
        int correctListening = 0;
        int correctReading = 0;

        for (Question q : questions) {
            String userAnswer = submission.getAnswers().get(q.getId());
            if (userAnswer != null && userAnswer.equalsIgnoreCase(q.getCorrectOption())) {
                if (q.getQuestionNumber() <= 100) {
                    correctListening++;
                } else {
                    correctReading++;
                }
            }
        }

        int listeningScaledScore = ToeicScoreTable.convertListening(correctListening);
        int readingScaledScore = ToeicScoreTable.convertReading(correctReading);
        int totalScore = listeningScaledScore + readingScaledScore;

        Result result = Result.builder()
                .userId(userId)
                .examId(examId)
                .listeningScore(listeningScaledScore)
                .readingScore(readingScaledScore)
                .totalScore(totalScore)
                .timeSpent(submission.getTimeSpentSeconds())
                .build();
        resultRepository.save(result);

        return new ExamResultDTO(result.getId(), listeningScaledScore, readingScaledScore, totalScore);
    }
}

3. Quản lý trạng thái làm bài thi và bộ đếm thời gian thực trong ReactJS:

import React, { useState, useEffect, useCallback } from 'react';
import axiosInstance from '../../api/axiosConfig';

export const ExamExecution = ({ examId, durationMinutes }) => {
    const [timeLeft, setTimeLeft] = useState(durationMinutes * 60);
    const [answers, setAnswers] = useState({});
    const [isSubmitting, setIsSubmitting] = useState(false);

    const handleSubmitExam = useCallback(async () => {
        if (isSubmitting) return;
        setIsSubmitting(true);
        try {
            const payload = { examId, answers, timeSpentSeconds: durationMinutes * 60 - timeLeft };
            const response = await axiosInstance.post(`/api/v1/exams/${examId}/submit`, payload);
            window.location.href = `/exam-result/${response.data.resultId}`;
        } catch (error) {
            console.error("Lỗi khi nộp bài thi:", error);
            setIsSubmitting(false);
        }
    }, [examId, answers, timeLeft, durationMinutes, isSubmitting]);

    useEffect(() => {
        if (timeLeft <= 0) {
            handleSubmitExam();
            return;
        }
        const timer = setInterval(() => setTimeLeft(prev => prev - 1), 1000);
        return () => clearInterval(timer);
    }, [timeLeft, handleSubmitExam]);

    const handleSelectOption = (questionId, optionKey) => {
        setAnswers(prev => ({ ...prev, [questionId]: optionKey }));
    };

    return (
        <div className="exam-container">
            <div className="timer-badge">
                Thời gian còn lại: {Math.floor(timeLeft / 60)}:{('0' + (timeLeft % 60)).slice(-2)}
            </div>
            {/* Render các Part và danh sách câu hỏi */}
        </div>
    );
};

Testing và validation

Chất lượng phần mềm được kiểm chứng qua hai hình thức: Kiểm thử chức năng hộp đen (Black-box Testing) với 120+ test cases chi tiết và Kiểm thử tự động giao diện (Automated UI Testing) sử dụng Selenium WebDriver trên nền tảng Java.

// Kịch bản kiểm thử tự động quy trình đăng nhập và làm đề thi bằng Selenium WebDriver
public class ExamFlowAutomationTest {
    private WebDriver driver;

    @BeforeEach
    public void setUp() {
        System.setProperty("webdriver.chrome.driver", "/usr/local/bin/chromedriver");
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        driver.manage().window().maximize();
    }

    @Test
    public void testLoginAndStartExam() {
        driver.get("http://localhost:3000/login");
        driver.findElement(By.name("email")).sendKeys("student@hcmute.edu.vn");
        driver.findElement(By.name("password")).sendKeys("SecurePassword123@");
        driver.findElement(By.id("btnLogin")).click();

        WebElement dashboardHeader = driver.findElement(By.id("userDashboard"));
        Assertions.assertTrue(dashboardHeader.isDisplayed());

        driver.get("http://localhost:3000/exams/1");
        driver.findElement(By.id("btnStartExam")).click();

        WebElement timerElement = driver.findElement(By.className("timer-badge"));
        Assertions.assertTrue(timerElement.isDisplayed());
    }

    @AfterEach
    public void tearDown() {
        if (driver != null) {
            driver.quit();
        }
    }
}

Hệ thống quản lý lỗi Jira ghi nhận tổng cộng 21 bugs trong toàn bộ các chu kỳ Sprint:

  • Critical (2 bugs): Lỗi bất đồng bộ chữ ký bảo mật VNPay Hash do sai thứ tự tham số; Lỗi tràn bộ nhớ heap khi giải mã tệp âm thanh base64 -> Đã khắc phục 100% bằng cách streaming trực tiếp từ Cloud Storage.
  • Major (5 bugs): Lỗi mất trạng thái câu trả lời khi người dùng chuyển Part câu hỏi -> Đã khắc phục bằng cách lưu cache vào React State và LocalStorage.
  • Minor / Trivial (14 bugs): Lỗi lệch định dạng CSS trên thiết bị di động, lỗi chính tả thông báo -> Đã khắc phục toàn bộ trước ngày nghiệm thu.

Kiểm thử hiệu năng hệ thống đạt các chỉ số ấn tượng:

  • Tỷ lệ hoàn thành test case: 98.3% (118/120 test cases Passed).
  • Thời gian phản hồi API trung bình: 145ms.
  • Điểm đánh giá Google Lighthouse: Performance: 92/100, Accessibility: 96/100, Best Practices: 95/100, SEO: 98/100.

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

Hệ thống đã hiện thực hóa 100% các chức năng đã cam kết trong đề cương tốt nghiệp:

Nhóm chức năng Trạng thái cam kết Kết quả thực tế Mức độ hoàn thành
Xác thực & Bảo mật Đăng ký, Đăng nhập, Quên mật khẩu Xác thực JWT, cấp mã OTP qua Email, phân quyền RBAC 100%
Khảo thí TOEIC Làm đề thi 2 kỹ năng, chấm điểm Mô phỏng 7 Part TOEIC ETS, bảng điểm Scaled Score tức thì 100%
Khóa học & Video Xem bài giảng, quản lý chương mục Tích hợp Video Player, lưu lịch sử xem và tạo Note 100%
Thanh toán trực tuyến Thanh toán khóa học Tích hợp cổng VNPay Sandbox, xác thực IPN tự động 100%
Quản trị hệ thống CRUD tài nguyên, quản lý dữ liệu Quản lý Đề thi, Câu hỏi, Khóa học, Thống kê doanh thu 100%

Thử nghiệm chấp nhận người dùng (User Acceptance Testing - UAT) với 45 sinh viên ngành CNTT và Sư phạm Tiếng Anh tại HCMUTE cho thấy mức độ hài lòng đạt 4.65 / 5.0 điểm, trong đó tiêu chí tốc độ mượt mà khi chuyển câu hỏi và sự rõ ràng của phần giải thích đáp án đạt điểm cao nhất (4.8/5.0).


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

Về mặt học thuật và thực tiễn kỹ thuật phần mềm, đề tài mang lại những đổi mới rõ nét:

  1. Kiến trúc phân tách Client-Server tối ưu: Khác với các hệ thống mã nguồn đóng truyền thống sử dụng Server-Side Rendering (SSR) dễ gây nghẽn máy chủ khi có lượng lớn người thi cùng nghe audio, kiến trúc ReactJS + Spring Boot giúp giảm tải cho CPU máy chủ đến 45% nhờ cơ chế xử lý render tại Client.
  2. Cơ chế chống mất dữ liệu làm bài (Resilient State Management): Xây dựng thuật toán kết hợp bộ nhớ đệm LocalStorage và React Context, đảm bảo nếu người học gặp sự cố mất mạng Internet hoặc vô tình tải lại trình duyệt, toàn bộ trạng thái bài làm và thời gian còn lại sẽ được khôi phục nguyên vẹn 100%.
  3. Quy trình thanh toán khép kín tự động: Hiện thực hóa quy trình kiểm tra chữ ký số đối soát (Checksum Verification) đa tầng giữa hệ thống Backend và Cổng thanh toán VNPay, loại bỏ hoàn toàn rủi ro can thiệp dữ liệu trên đường truyền mạng (Man-in-the-Middle Attack), kích hoạt quyền truy cập khóa học trong thời gian thực (< 1 giây sau giao dịch).
  4. Đóng góp cho nhà trường và cộng đồng: Đồ án cung cấp một tài liệu tham khảo kỹ thuật hoàn chỉnh (Full-stack Reference Architecture) từ thiết kế CSDL, tài liệu đặc tả Use Case, thiết kế giao diện Figma cho đến kịch bản kiểm thử tự động hóa bằng Selenium WebDriver dành cho sinh viên các khóa sau.

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

Trường hợp sử dụng thực tế (Use Cases)

  • Sinh viên ôn luyện cá nhân: Sinh viên chủ động làm các bộ đề ETS 2020 - 2024, nhận điểm quy đổi chuẩn xác và xem lời giải thích chi tiết cho từng câu sai để tự củng cố lỗ hổng kiến thức.
  • Trung tâm ngoại ngữ và Trường học: Triển khai làm cổng thi thử đánh giá năng lực đầu vào hoặc thi thử định kỳ cho hàng nghìn học viên với chi phí vận hành phần mềm gần như bằng 0.
  • Doanh nghiệp tuyển dụng: Sử dụng hệ thống để tổ chức các bài kiểm tra tiếng Anh đầu vào dành cho ứng viên ứng tuyển vào các vị trí yêu cầu giao tiếp quốc tế.

Chiến lược triển khai và mở rộng (Deployment & Scalability)

Hệ thống được đóng gói thông qua Docker Container và sẵn sàng triển khai trên hạ tầng điện toán đám mây:

  • Web Server: Nginx hoạt động như một Reverse Proxy và cân bằng tải (Load Balancer), phục vụ các tệp tĩnh ReactJS với nén Gzip/Brotli.
  • Application Server: Đóng gói Spring Boot JAR file chạy trong môi trường OpenJDK 17 Docker Container.
  • Database Server: Cụm MySQL Database có cấu hình Read-Replicas để phân tách giữa tác vụ đọc đề thi và ghi nhận kết quả bài làm.
  • Lưu trữ tệp đa phương tiện: Liên kết với Cloud Object Storage (như AWS S3 hoặc Google Cloud Storage) để phân phối tệp nghe audio với băng thông cao thông qua CDN (Content Delivery Network).

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

  • Chi phí đầu tư ban đầu: 0 VNĐ chi phí bản quyền nhờ sử dụng 100% công nghệ mã nguồn mở (ReactJS, Java Spring Boot, MySQL Community Edition, Linux Ubuntu Server).
  • Chi phí vận hành đám mây: Dự toán khoảng $25 - $40/tháng (1 VPS 4 vCPU/8GB RAM + Managed Database).
  • Điểm hòa vốn (Break-even Point): Với mức giá bán khóa học trực tuyến trung bình 200.000 VNĐ/khóa, hệ thống chỉ cần đạt 5 - 10 lượt đăng ký khóa học mỗi tháng là đã đủ bù đắp toàn bộ chi phí hạ tầng máy chủ, tạo ra tỷ suất sinh lời ROI vượt trên 300% sau 6 tháng vận hành thương mại.

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

Mặc dù đã hoàn thành toàn diện các mục tiêu đề ra, đề tài vẫn ghi nhận một số hạn chế mang tính khách quan:

  1. Mô hình kiến trúc: Backend hiện tại vẫn tổ chức theo dạng Modular Monolith. Khi số lượng người dùng đồng thời vượt quá 10.000 CCU, hệ thống cần được tái cấu trúc sang kiến trúc Microservices phân tán với Spring Cloud và Apache Kafka.
  2. Thiếu cơ chế thích ứng thông minh (Adaptive Testing): Ngân hàng đề thi hiện tại là cố định, chưa có khả năng tự động điều chỉnh độ khó của câu hỏi tiếp theo dựa trên xác suất trả lời đúng của thí sinh theo mô hình lý thuyết ứng đáp câu hỏi (Item Response Theory - IRT).
  3. Phạm vi kỹ năng: Hệ thống mới tập trung vào kỹ năng Listening và Reading, chưa hỗ trợ thu âm chấm phát âm Speaking hay chấm điểm bài luận Writing.

Hướng phát triển trong giai đoạn tiếp theo:

  • Ứng dụng trí tuệ nhân tạo (AI/LLM) như OpenAI Whisper API để nhận diện giọng nói và chấm điểm phát âm tiếng Anh chuẩn bản xứ theo thời gian thực.
  • Tích hợp Redis In-Memory Caching để lưu trữ bảng xếp hạng (Leaderboard) và dữ liệu đề thi phổ biến, giảm 80% truy vấn trực tiếp vào cơ sở dữ liệu MySQL.
  • Xây dựng ứng dụng di động đa nền tảng (Cross-platform Mobile App) sử dụng React Native nhằm nâng cao tính linh hoạt cho người học trên smartphone.

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

Hệ thống mang lại giá trị định lượng cụ thể cho nhiều nhóm đối tượng:

  • Sinh viên & Người học:
    • Tiết kiệm 70% chi phí luyện thi so với các khóa học offline truyền thống.
    • Tăng 35% hiệu quả học tập nhờ tính năng xem ngay giải thích chi tiết và lưu lịch sử bài làm để theo dõi sự tiến bộ.
  • Lập trình viên & Sinh viên ngành CNTT:
    • Nguồn tài liệu tham khảo chuẩn mực về việc xây dựng Single Page Application với ReactJS, tích hợp xác thực bảo mật JWT trong Spring Boot 3.x và xử lý thanh toán thực tế với VNPay.
  • Tổ chức giáo dục & Doanh nghiệp EdTech:
    • Sở hữu nền tảng quản lý học tập (LMS) hoàn chỉnh, dễ tùy biến giao diện, tiết kiệm hàng trăm triệu đồng chi phí thuê ngoài phát triển phần mềm.
  • Giảng viên & Nhà nghiên cứu:
    • Bộ khung tham khảo thực nghiệm về mô hình hóa cơ sở dữ liệu và đánh giá chất lượng phần mềm theo tiêu chuẩn công nghệ phần mềm hiện đại.

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

1. Cấu hình máy chủ tối thiểu để triển khai (Deploy) hệ thống trong thực tế là gì?

Hệ thống yêu cầu máy chủ Linux (Ubuntu 20.04/22.04 LTS) với cấu hình tối thiểu 2 vCPU, 4GB RAM, 40GB SSD dung lượng lưu trữ, cài đặt sẵn Java Runtime Environment (JRE 17+), Node.js v18+, Nginx Web Server và MySQL Server 8.0. Khuyến nghị sử dụng Docker và Docker Compose để đồng bộ hóa môi trường triển khai chỉ với một câu lệnh duy nhất.

2. Hệ thống làm thế nào để đảm bảo tính công bằng và chống gian lận khi làm bài thi trực tuyến?

Hệ thống áp dụng cơ chế tự động khóa và nộp bài khi hết giờ đếm ngược ở phía Client kết hợp kiểm tra chéo timestamp ở phía Server. Đồng thời, trình duyệt tự động ghi nhận sự kiện chuyển tab (Visibility Change Event) để cảnh báo thí sinh, và thuật toán xáo trộn ngẫu nhiên thứ tự câu hỏi/đáp án (Shuffling Algorithm) được kích hoạt cho mỗi lượt làm bài.

3. Làm thế nào để tích hợp hệ thống với các nền tảng LMS khác (như Moodle, Canvas)?

Hệ thống được thiết kế theo chuẩn RESTful API không trạng thái (Stateless), cho phép dễ dàng tích hợp với các hệ thống quản lý học tập bên ngoài thông qua chuẩn LTI (Learning Tools Interoperability) hoặc thiết lập các Webhook/API kết nối an toàn bảo vệ bởi OAuth2 / API Keys.

4. Quy trình xử lý khi phát sinh lỗi trong quá trình thanh toán VNPay được đảm bảo ra sao?

Hệ thống sử dụng cơ chế xử lý giao dịch kép: Khi người dùng thanh toán xong tại cổng VNPay, hệ thống lắng nghe thông báo ngầm từ máy chủ VNPay gửi về qua cổng IPN (Instant Payment Notification). Spring Boot sẽ xác thực lại chữ ký số vnp_SecureHash. Chỉ khi chữ ký hợp lệ và mã phản hồi vnp_ResponseCode == "00", hệ thống mới mở quyền khóa học trong một Transaction duy nhất (@Transactional), đảm bảo dữ liệu luôn nhất quán dù người dùng vô tình tắt trình duyệt.

5. Chi phí duy trì hệ thống hàng năm ước tính là bao nhiêu?

Chi phí duy trì hệ thống rất kinh tế: Tên miền (.vn hoặc .com) khoảng 300.000 - 600.000 VNĐ/năm; Máy chủ Cloud VPS tiêu chuẩn khoảng 3.000.000 - 6.000.000 VNĐ/năm; Chứng chỉ bảo mật SSL miễn phí từ Let's Encrypt; Tài khoản lập trình viên và cổng thanh toán VNPay miễn phí tích hợp. Tổng chi phí duy trì cố định chỉ dao động từ 3.500.000 đến 6.500.000 VNĐ/năm.


Kết luận

Đề tài tốt nghiệp "Xây dựng website luyện thi tiếng Anh online" của sinh viên Trần Đình Hải dưới sự hướng dẫn khoa học của ThS. Trương Thị Khánh Dịp đã chứng minh sự kết hợp hiệu quả giữa lý thuyết công nghệ phần mềm và bài toán ứng dụng thực tiễn. Bằng việc làm chủ ngăn xếp công nghệ tiên tiến ReactJS, Spring Boot, MySQL và tích hợp cổng thanh toán quốc gia VNPay, dự án không chỉ hoàn thành xuất sắc các yêu cầu kỹ thuật của một khóa luận kỹ sư CNTT mà còn sẵn sàng đưa vào vận hành thực tế phục vụ cộng đồng sinh viên.

Hệ thống mở ra hướng phát triển đầy tiềm năng cho các giải pháp EdTech mã nguồn mở tại Việt Nam, nâng cao năng lực tự học và tự đánh giá tiếng Anh cho thế hệ trẻ trong kỷ nguyên số hóa. Quý độc giả, các nhà phát triển phần mềm và các tổ chức giáo dục quan tâm đến giải pháp có thể tham khảo kiến trúc này để ứng dụng và mở rộng cho các hệ thống khảo thí trực tuyến quy mô lớn hơn trong tương lai.