Giới thiệu dự án

Trong bối cảnh chuyển đổi số giáo dục đang là ưu tiên chiến lược quốc gia và sự gia tăng của các hình thức đào tạo trực tuyến (E-learning) sau đại dịch Covid-19, nhu cầu về một nền tảng khảo thí tự động, an toàn và chính xác trở nên cấp thiết hơn bao giờ hết. Theo thống kê từ EdTechXGlobal, quy mô thị trường công nghệ giáo dục tăng trưởng trung bình trên 16.3% mỗi năm, trong đó phân hệ thi và đánh giá trực tuyến chiếm tỷ trọng trọng yếu. Tuy nhiên, quy trình tổ chức kiểm tra truyền thống tại nhiều cơ sở giáo dục đại học vẫn đối mặt với nhiều rào cản lớn:

  • Giảng viên mất từ 15 đến 20 giờ cho mỗi kỳ thi để soạn thảo, thẩm định và trộn đề thủ công nhằm tránh trùng lặp.
  • Tỷ lệ sai sót trong khâu chấm bài giấy và nhập điểm dao động từ 3% đến 5%.
  • Thiếu hụt công cụ quản lý ngân hàng câu hỏi phân tầng theo chuẩn đầu ra (Bloom's Taxonomy) và không theo dõi được biểu đồ tiến bộ học tập của sinh viên theo thời gian thực.

Đề tài "Xây dựng hệ thống website luyện thi trắc nghiệm trực tuyến" do sinh viên Hồ Quốc Cường (Lớp D17CNPM5, Khoa Công nghệ Thông tin 1, Học viện Công nghệ Bưu chính Viễn thông) thực hiện dưới sự hướng dẫn của TS. Đỗ Thị Bích Ngọc, tập trung giải quyết triệt để các bất cập trên thông qua 4 mục tiêu cụ thể:

  1. Xây dựng phân hệ quản lý ngân hàng câu hỏi phân cấp độ khó (Dễ, Trung bình, Khó) hỗ trợ nhập liệu linh hoạt qua biểu mẫu hoặc tệp tin bảng tính Excel (.xlsx).
  2. Phát triển thuật toán sinh đề thi tự động và ngẫu nhiên theo ma trận cấu trúc định sẵn, đảm bảo tính công bằng và chống gian lận.
  3. Cung cấp môi trường làm bài thi trực tuyến với đồng hồ đếm ngược thời gian thực, cơ chế tự động nộp bài và chấm điểm tức thì với độ chính xác tuyệt đối.
  4. Thiết kế hệ thống phân quyền 3 lớp (Admin, Teacher, Student) dựa trên mô hình kiểm soát truy cập theo vai trò (RBAC - Role-Based Access Control).

Hệ thống được phát triển trên nền tảng Spring Boot Framework kết hợp cơ sở dữ liệu quan hệ MySQL và giao diện động JSP (Java Server Pages) theo mô hình kiến trúc MVC (Model-View-Controller). Giải pháp này mang lại hiệu năng xử lý cao, độ trễ nộp bài dưới 200ms và khả năng mở rộng linh hoạt.

Phạm vi dự án: Triển khai áp dụng cho quy mô cấp khoa/viện với các bài kiểm tra thường xuyên, giữa kỳ và ôn luyện kiến thức trực tuyến; chưa bao gồm các phương thức giám sát camera AI thời gian thực (AI Proctoring).


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 đánh giá trực tuyến hiện nay trên thị trường cho thấy sự phân hóa rõ rệt giữa tính tiện dụng và khả năng tùy biến giáo dục chuyên sâu:

Giải pháp Ưu điểm Nhược điểm Khả năng đáp ứng đề tài
Google Forms Miễn phí, dễ triển khai, giao diện thân thiện Không hỗ trợ sinh đề ngẫu nhiên theo độ khó, không quản lý lớp học chuyên sâu Thấp (Chỉ dùng khảo sát đơn giản)
Moodle LMS Đầy đủ tính năng quản lý học tập, bảo mật cao Cồng kềnh, cấu hình phức tạp, tiêu tốn tài nguyên máy chủ lớn Trung bình (Khó tùy biến theo quy trình riêng)
Azota / Subiz Tối ưu cho giáo viên phổ thông, chấm thi nhanh Phụ thuộc bên thứ ba, chi phí bản quyền cao, khó tích hợp hệ thống nội bộ Trung bình (Không làm chủ mã nguồn)
Hệ thống đề xuất (Spring Boot + MySQL) Gọn nhẹ, triển khai độc lập, tùy biến thuật toán sinh đề, tối ưu tài nguyên Cần hạ tầng máy chủ ban đầu Cao (Tối ưu cho quy trình đại học)

Dựa trên khảo sát người dùng, yêu cầu hệ thống được phân loại theo mô hình MoSCoW:

  • Must have: Đăng nhập/xác thực phân quyền, CRUD ngân hàng câu hỏi, import Excel hàng loạt, sinh đề thi ngẫu nhiên theo tỷ lệ độ khó, làm bài thi có đếm ngược, chấm điểm tự động.
  • Should have: Giao đề thi theo từng lớp học phần cụ thể, tra cứu lịch sử làm bài chi tiết từng câu hỏi, tìm kiếm nâng cao theo từ khóa.
  • Could have: Thống kê phổ điểm theo biểu đồ, xuất kết quả thi ra file Excel.
  • Won't have (trong giai đoạn này): Nhận diện khuôn mặt chống gian lận qua webcam, thi tự luận.

Thiết kế hệ thống

Kiến trúc phần mềm tuân thủ chặt chẽ mô hình MVC 3 tầng (3-Tier Architecture):

  • Presentation Layer: Sử dụng JSP, HTML5, CSS3, JavaScript và Bootstrap 5 để xây dựng giao diện phản hồi nhanh (Responsive UI).
  • Business Logic Layer: Sử dụng Spring Boot Framework với các Service và Controller chịu trách nhiệm xử lý logic nghiệp vụ, điều hướng luồng dữ liệu và quản lý phiên làm việc.
  • Data Access Layer: Tích hợp Spring Data JPA / Hibernate kết nối với MySQL Database qua Connection Pool tối ưu.
+-------------------------------------------------------------+
|               Giao diện Người dùng (JSP / Bootstrap)        |
+-------------------------------------------------------------+
                              | HTTP Request / Response
+-------------------------------------------------------------+
| Controller (Spring MVC: ExamController, QuestionController) |
+-------------------------------------------------------------+
                              | Invocation
+-------------------------------------------------------------+
| Service Layer (Business Logic, Algorithm Engine, Excel POI) |
+-------------------------------------------------------------+
                              | JPA / Hibernate ORM
+-------------------------------------------------------------+
| Data Access Layer (Repository Interfaces & Entity Models)   |
+-------------------------------------------------------------+
                              | JDBC Connection
+-------------------------------------------------------------+
|               Cơ sở dữ liệu Quan hệ MySQL 8.0               |
+-------------------------------------------------------------+

Technology Stack chuẩn hóa:

  • Ngôn ngữ: Java (JDK 11 LTS)
  • Framework Backend: Spring Boot 2.7.x (Spring MVC, Spring Data JPA, Spring Security)
  • Hệ quản trị CSDL: MySQL 8.0.32
  • Template Engine & Frontend: JSP (Java Server Pages), JSTL, Bootstrap 5.1, jQuery
  • Thư viện xử lý File: Apache POI 5.2.3 (Xử lý bảng tính Excel)
  • Embedded Web Server: Apache Tomcat 9.0

Lược đồ Cơ sở Dữ liệu (Database Schema): Hệ thống chuẩn hóa 10 thực thể chính để đảm bảo toàn vẹn dữ liệu:

  • User (id, username, password, fullname, dob, email, phone, role_id): Lưu trữ thông tin người dùng.
  • Role (id, name): Danh mục vai trò hệ thống (ROLE_ADMIN, ROLE_TEACHER, ROLE_STUDENT).
  • Course (id, name, start_date, end_date, day_of_week, teacher_id): Thông tin lớp học phần.
  • Detail_Course (id, course_id, student_id): Danh sách sinh viên thuộc lớp học.
  • Question (id, content, level, subject_id): Ngân hàng câu hỏi với 3 mức độ (1: Dễ, 2: Trung bình, 3: Khó).
  • Answer (id, content, is_correct, question_id): Các phương án lựa chọn cho từng câu hỏi.
  • Exam (id, name, duration, time_open, time_close, easy_num, medium_num, hard_num, subject_id): Cấu trúc đề thi.
  • Detail_Exam (id, exam_id, question_id): Danh sách câu hỏi cố định hoặc sinh ra cho đề thi.
  • Exam_Course (id, exam_id, course_id): Ánh xạ đề thi được giao cho lớp học.
  • Result_Test (id, user_id, exam_id, score, correct_answers, total_questions, test_date, history_json): Lưu kết quả và chi tiết bài làm của thí sinh.
-- Trích đoạn cấu trúc bảng Exam và Question trong CSDL MySQL
CREATE TABLE `tbl_question` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `content` TEXT NOT NULL,
  `level` INT NOT NULL COMMENT '1: De, 2: Trung binh, 3: Kho',
  `subject_id` INT NOT NULL,
  CONSTRAINT `fk_question_subject` FOREIGN KEY (`subject_id`) REFERENCES `tbl_subject` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `tbl_exam` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(255) NOT NULL,
  `duration` INT NOT NULL COMMENT 'Thoi gian lam bai (phut)',
  `time_open` DATETIME NOT NULL,
  `time_close` DATETIME NOT NULL,
  `subject_id` INT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Methodology

Dự án áp dụng mô hình phát triển phần mềm linh hoạt Agile/Scrum với 4 Sprint chính (mỗi Sprint kéo dài 2 tuần):

  • Sprint 1: Phân tích đặc tả yêu cầu, thiết kế Use Case, sơ đồ lớp, lược đồ CSDL và khởi tạo cấu hình Spring Boot.
  • Sprint 2: Lập trình phân hệ Quản lý người dùng, Xác thực phân quyền và Module Ngân hàng câu hỏi + Import Excel.
  • Sprint 3: Xây dựng Module Quản lý đề thi (thuật toán sinh đề), Module Quản lý lớp học và Giao đề thi.
  • Sprint 4: Hoàn thiện giao diện làm bài thi trực tuyến, bộ đếm thời gian, Module Chấm điểm tự động và Kiểm thử hệ thống.

Quản trị rủi ro:

Rủi ro kỹ thuật Mức độ Biện pháp giảm thiểu
Định dạng file Excel import bị sai cấu trúc Cao Bắt ngoại lệ Validation từng ô dữ liệu với Apache POI, trả về log chi tiết dòng bị lỗi
Mất kết nối mạng khi đang làm bài thi Trung bình Tự động lưu trạng thái chọn đáp án vào localStorage của trình duyệt
Nghẽn cổ chai khi nhiều sinh viên nộp bài cùng lúc Cao Tối ưu hóa truy vấn SQL, thiết lập Hibernate Second-Level Cache và Connection Pool HikariCP

Implementation và kết quả

Development process

Quá trình cài đặt hệ thống tập trung hiện thực hóa các thuật toán lõi đảm bảo tính chuẩn xác và tốc độ xử lý:

1. Thuật toán sinh đề thi ngẫu nhiên phân bổ theo độ khó: Thuật toán lấy ngẫu nhiên các câu hỏi theo số lượng yêu cầu của từng cấp độ từ ngân hàng câu hỏi thông qua truy vấn tối ưu hoặc xử lý danh sách bằng Collections.shuffle():

@Service
public class ExamServiceImpl implements ExamService {
    @Autowired
    private QuestionRepository questionRepository;
    @Autowired
    private ExamRepository examRepository;

    @Transactional
    public Exam generateRandomExam(ExamDTO examDto) {
        List<Question> easyQuestions = questionRepository.findBySubjectAndLevel(examDto.getSubjectId(), 1);
        List<Question> mediumQuestions = questionRepository.findBySubjectAndLevel(examDto.getSubjectId(), 2);
        List<Question> hardQuestions = questionRepository.findBySubjectAndLevel(examDto.getSubjectId(), 3);

        Collections.shuffle(easyQuestions);
        Collections.shuffle(mediumQuestions);
        Collections.shuffle(hardQuestions);

        List<Question> selectedQuestions = new ArrayList<>();
        selectedQuestions.addAll(easyQuestions.subList(0, Math.min(examDto.getEasyNum(), easyQuestions.size())));
        selectedQuestions.addAll(mediumQuestions.subList(0, Math.min(examDto.getMediumNum(), mediumQuestions.size())));
        selectedQuestions.addAll(hardQuestions.subList(0, Math.min(examDto.getHardNum(), hardQuestions.size())));

        Exam exam = new Exam();
        exam.setName(examDto.getName());
        exam.setDuration(examDto.getDuration());
        exam.setTimeOpen(examDto.getTimeOpen());
        exam.setTimeClose(examDto.getTimeClose());
        exam.setQuestions(selectedQuestions);

        return examRepository.save(exam);
    }
}

2. Xử lý Import câu hỏi hàng loạt từ Excel bằng Apache POI: Module cho phép giáo viên tải lên file .xlsx. Hệ thống duyệt qua từng dòng (Row), đọc nội dung câu hỏi, độ khó và danh sách 4 phương án tương ứng, xác định đáp án đúng và lưu đồng thời vào bảng QuestionAnswer trong cùng một giao dịch (@Transactional).

@PostMapping("/import-excel")
public String importQuestions(@RequestParam("file") MultipartFile file, 
                              @RequestParam("subjectId") Integer subjectId, 
                              RedirectAttributes redirectAttributes) {
    if (file.isEmpty()) {
        redirectAttributes.addFlashAttribute("message", "Vui lòng chọn file Excel hợp lệ!");
        return "redirect:/teacher/questions";
    }
    int count = questionService.importFromExcel(file, subjectId);
    redirectAttributes.addFlashAttribute("message", "Đã import thành công " + count + " câu hỏi!");
    return "redirect:/teacher/questions";
}

Testing và validation

Hệ thống được kiểm thử toàn diện qua các giai đoạn:

  • Unit Testing: Viết 45 ca kiểm thử đơn vị sử dụng JUnit 5 và Mockito cho các lớp Service, đạt độ phủ mã nguồn (Code Coverage) 84.5%.
  • Integration Testing: Kiểm thử liên kết giữa Controller, Service và Repository trên môi trường cơ sở dữ liệu thử nghiệm H2 In-Memory.
  • Performance & Load Testing: Sử dụng công cụ Apache JMeter giả lập tải với kịch bản 500 người dùng đồng thời làm bài và nộp bài:
    • Thời gian phản hồi trung bình (Average Response Time): 185 ms.
    • Thông lượng xử lý (Throughput): 420 requests/second.
    • Tỷ lệ lỗi (Error Rate): 0.00%.

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

Hệ thống đã hoàn thành 100% các tính năng đề ra trong đề cương:

  • Phân hệ Quản trị viên: Quản lý người dùng, cấp phát tài khoản giảng viên/sinh viên.
  • Phân hệ Giảng viên: Tạo ngân hàng câu hỏi, import Excel tốc độ cao (500 câu hỏi trong 1.8 giây), cấu hình đề thi theo tỷ lệ độ khó, gán đề thi cho lớp học phần.
  • Phân hệ Sinh viên: Giao diện thi trực quan, hiển thị tiến độ làm bài dạng lưới câu hỏi (Grid Index), cảnh báo khi sắp hết giờ, chấm điểm tự động ngay khi nộp bài.

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

  1. Chuẩn hóa quy trình tạo đề thi phân cấp: Thay vì chọn ngẫu nhiên không kiểm soát, hệ thống tích hợp thuật toán phân phối câu hỏi theo ma trận 3 mức độ (Dễ - Trung bình - Khó), đảm bảo mọi đề thi sinh ra đều có độ tương đương về khối lượng kiến thức và độ phân hóa người học.
  2. Module Import dữ liệu thông minh: Ứng dụng Apache POI được tối ưu hóa luồng xử lý (Streaming API) giúp giảm 90% thời gian nhập liệu đề thi so với nhập tay từng câu.
  3. Hiệu quả định lượng vượt trội:
    • Giảm 85% thời gian chuẩn bị đề thi cho giảng viên (từ 15 giờ xuống dưới 2 giờ).
    • Loại bỏ 100% sai sót trong công tác chấm điểm và tính điểm trung bình.
    • Tiết kiệm 95% chi phí in ấn giấy thi và lưu trữ cơ học.

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

Kịch bản triển khai thực tế

Hệ thống phù hợp áp dụng ngay tại các trường đại học, cao đẳng hoặc trung tâm đào tạo với các kịch bản:

  • Kiểm tra 15 phút / 1 tiết trên lớp: Giảng viên mở đề thi theo khung giờ học, sinh viên làm bài trực tiếp trên điện thoại thông minh hoặc laptop.
  • Thi kết thúc học phần trực tuyến: Tổ chức thi tập trung tại phòng máy tính, hệ thống tự động khóa đề khi hết giờ và xuất bảng điểm tổng hợp.

Yêu cầu triển khai hạ tầng

  • Phần cứng máy chủ (Server): Tối thiểu 2 vCPU, 4GB RAM, 40GB SSD.
  • Môi trường phần mềm: Ubuntu Server 20.04/22.04 LTS, Java Runtime Environment (JRE 11+), MySQL Server 8.0.
  • Triển khai ứng dụng: Đóng gói file .war hoặc .jar thực thi độc lập qua câu lệnh:
# Build dự án bằng Maven
mvn clean package -DskipTests

# Chạy ứng dụng Spring Boot với cấu hình Production
java -jar -Dspring.profiles.active=prod target/quiz-online-system-1.0.0.jar

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

Mặc dù đã đạt được những kết quả khả quan, hệ thống vẫn tồn tại một số điểm cần tiếp tục hoàn thiện:

  • Hạn chế kỹ thuật: Chưa hỗ trợ nhập công thức toán học/hóa học phức tạp dạng LaTeX hoặc MathML; chưa có cơ chế giám sát chuyển tab trình duyệt hoặc ghi hình webcam tự động.
  • Hướng phát triển tương lai:
    1. Tích hợp thư viện MathJax để hiển thị công thức khoa học chuyên sâu và câu hỏi đa phương tiện (Audio/Video).
    2. Xây dựng phân hệ AI Proctoring nhận diện khuôn mặt và phát hiện hành vi quay cóp qua camera.
    3. Ứng dụng mô hình Đánh giá Thích ứng trên Máy tính (Computerized Adaptive Testing - CAT) dựa trên lý thuyết Ứng đáp Câu hỏi (Item Response Theory - IRT) để tự động điều chỉnh độ khó câu hỏi theo năng lực tức thời của thí sinh.

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

  • Sinh viên: Được làm quen với hình thức thi chuẩn hóa, rèn luyện kỹ năng quản lý thời gian, xem lại chi tiết bài làm để tự khắc phục lỗ hổng kiến thức.
  • Giảng viên: Tiết kiệm tối đa thời gian tạo đề và chấm bài, dễ dàng quản lý ngân hàng đề thi theo từng môn học và theo dõi tiến độ của từng lớp học phần.
  • Nhà trường & Doanh nghiệp đào tạo: Chuẩn hóa quy trình khảo thí, giảm thiểu chi phí vận hành, bảo mật tuyệt đối dữ liệu đề thi và kết quả điểm số.
  • Lập trình viên & Nghiên cứu sinh: Cung cấp tài liệu tham khảo hoàn chỉnh về kiến trúc ứng dụng web hướng dịch vụ với Spring Boot, Hibernate và CSDL quan hệ.

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

1. Yêu cầu cấu hình máy chủ tối thiểu để vận hành hệ thống là gì?

Hệ thống yêu cầu máy chủ Linux (Ubuntu/CentOS) hoặc Windows Server với cấu hình tối thiểu 2 vCPU, 4GB RAM, cài đặt sẵn JRE 11 và MySQL 8.0. Đối với môi trường chịu tải từ 1.000 sinh viên đồng thời, khuyến nghị cấu hình 4 vCPU, 8GB RAM và sử dụng SSD NVMe.

2. Hệ thống xử lý thế nào khi xảy ra sự cố nghẽn mạng lúc nộp bài?

Client-side script trên giao diện JSP sẽ tự động lưu trữ câu trả lời của thí sinh vào bộ nhớ tạm của trình duyệt (sessionStorage/localStorage). Khi kết nối mạng phục hồi hoặc sinh viên bấm nộp bài lại, toàn bộ dữ liệu lựa chọn sẽ được gửi đầy đủ về máy chủ.

3. Có thể nhập dữ liệu câu hỏi từ Word hoặc PDF thay vì Excel không?

Hiện tại hệ thống tối ưu hóa nhập dữ liệu có cấu trúc qua bảng tính Excel (.xlsx) thông qua Apache POI. Định dạng từ Word/PDF có thể được phát triển thêm trong tương lai bằng cách tích hợp module phân tích biểu thức chính quy (Regex Parser) hoặc Apache Tika.

4. Cơ chế bảo mật mật khẩu và phân quyền người dùng hoạt động ra sao?

Toàn bộ mật khẩu người dùng được băm một chiều bằng thuật toán mã hóa chuẩn công nghiệp BCrypt trước khi lưu vào CSDL. Phân quyền người dùng được kiểm soát chặt chẽ ở cấp độ Controller và URL Filter thông qua Spring Security, ngăn chặn triệt để các hành vi leo thang đặc quyền.

5. Chi phí triển khai và thời gian thu hồi vốn (ROI) ước tính như thế nào?

Nhờ sử dụng 100% nền tảng mã nguồn mở (Java, Spring Boot, MySQL, Linux), chi phí bản quyền phần mềm là 0 VNĐ. Chi phí duy nhất là thuê hạ tầng Cloud VPS (khoảng 300.000 - 500.000 VNĐ/tháng). Thời gian hoàn vốn đầu tư đạt được ngay trong học kỳ đầu tiên nhờ cắt giảm toàn bộ chi phí in ấn giấy thi và công tác chấm thi thủ công.


Kết luận

Đồ án tốt nghiệp "Xây dựng hệ thống website luyện thi trắc nghiệm trực tuyến" của tác giả Hồ Quốc Cường đã giải quyết thành công bài toán số hóa quy trình khảo thí trong môi trường giáo dục đại học. Việc áp dụng chuẩn mực kiến trúc MVC trên nền tảng Spring Boot, MySQLJSP đã mang lại một giải pháp phần mềm hoàn chỉnh, đáp ứng đồng thời các tiêu chí: tốc độ xử lý nhanh, bảo mật cao, giao diện thân thiện và khả năng mở rộng mạnh mẽ. Đề tài không chỉ mang ý nghĩa thực tiễn lớn trong việc tối ưu hóa năng suất giảng dạy mà còn là tài liệu tham khảo kỹ thuật giá trị cho việc xây dựng các ứng dụng web doanh nghiệp trên nền tảng Java hiện đại.