Giới thiệu dự án

Trong bối cảnh chuyển đổi số giáo dục đang diễn ra mạnh mẽ sau giai đoạn dịch bệnh Covid-19, việc chuyển dịch từ hình thức thi cử truyền thống trên giấy sang nền tảng số hóa trở thành yêu cầu cấp thiết. Theo các khảo sát giáo dục giai đoạn 2021-2023, hơn 85% các cơ sở đào tạo đại học và cao đẳng tại Việt Nam đã áp dụng hình thức kiểm tra trực tuyến bán phần hoặc toàn phần nhằm tối ưu hóa chi phí vận hành và tăng cường tính linh hoạt trong công tác khảo thí.

Vấn đề cốt lõi của phương thức kiểm tra truyền thống là quy trình tổ chức tốn kém thời gian, rủi ro lộ lọt đề thi cao, tiêu tốn nhiều nhân lực in ấn - coi thi và công đoạn chấm điểm thủ công dễ xảy ra sai sót, làm chậm tiến độ công bố kết quả. Bên cạnh đó, việc quản lý ngân hàng câu hỏi và tạo các mã đề tương đương về mặt độ khó đòi hỏi nhiều công sức của giảng viê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" do sinh viên Hồ Quốc Cường (Khoa Công nghệ Thông tin - 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 trị giải quyết toàn diện các bài toán trên thông qua nền tảng web tự động hóa quy trình khảo thí.

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

  1. Xây dựng ngân hàng câu hỏi có phân loại theo môn học và 3 mức độ nhận thức (Dễ, Trung bình, Khó).
  2. Phát triển thuật toán sinh đề kiểm tra tự động theo ma trận cấu trúc thiết lập sẵn (Random question distribution).
  3. Hỗ trợ tính năng nhập dữ liệu hàng loạt (Bulk Import) từ tệp tin Excel, rút ngắn thời gian chuẩn bị dữ liệu.
  4. Tự động hóa 100% khâu chấm điểm, lưu trữ lịch sử làm bài và xuất báo cáo kết quả tức thì.
  5. Phân quyền chặt chẽ theo mô hình RBAC (Role-Based Access Control) cho 3 nhóm đối tượng: Quản trị viên (Admin), Giảng viên (Teacher), và Sinh viên (Student).

Hệ thống được phát triển dựa trên mô hình kiến trúc MVC (Model-View-Controller) với backend sử dụng Java Spring Boot kết hợp hệ quản trị cơ sở dữ liệu quan hệ MySQL và giao diện JSP (JavaServer Pages). Giải pháp này đảm bảo tính độc lập, khả năng triển khai nhanh (Rapid Application Development - RAD) và tối ưu tài nguyên phần cứng.

Phạm vi của đồ án tập trung vào việc quản lý lớp học, phân phối đề thi trắc nghiệm khách quan theo ca thi hoặc kỳ thi định kỳ, đánh giá kết quả tức thời và quản lý tiến trình học tập của sinh viên trong phạm vi trường đại học hoặc trung tâm đào tạo.

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ực tế các giải pháp khảo thí hiện có trên thị trường cho thấy bức tranh phân hóa rõ rệt giữa phương thức truyền thống và các công cụ số:

Tiêu chí Thi giấy truyền thống Ứng dụng biểu mẫu (Google Forms) Hệ thống LMS mã nguồn mở (Moodle) Hệ thống Web đề xuất
Chi phí in ấn & nhân lực Rất cao Không Thấp Không
Quản lý ma trận đề thi Thủ công, tốn thời gian Hạn chế, không chia mức độ Hỗ trợ mạnh nhưng phức tạp Trực quan, sinh ngẫu nhiên theo ma trận độ khó
Tốc độ chấm & trả điểm 3 - 7 ngày Tức thì Tức thì Tức thì
Nhập liệu đề thi Thủ công Nhập từng câu Import XML/Aiken Import trực tiếp từ Excel (.xlsx)
Bảo mật & Phân quyền Dễ rò rỉ bản in Cơ bản Phức tạp, cồng kềnh RBAC tối ưu theo Lớp - Môn - Đề

Yêu cầu người dùng được phân loại theo mô hình MoSCoW:

  • Must have (Bắt buộc): Xác thực người dùng, phân quyền Admin/Teacher/Student; Quản lý ngân hàng câu hỏi (CRUD); Tạo đề thi ngẫu nhiên theo cấu trúc độ khó; Làm bài kiểm tra với đồng hồ đếm ngược; Tự động thu bài và chấm điểm; Lưu kết quả kiểm tra.
  • Should have (Nên có): Nhập câu hỏi hàng loạt từ Excel; Giao đề kiểm tra cho từng lớp học cụ thể; Xem lại lịch sử và chi tiết đáp án sau khi nộp bài.
  • Could have (Có thể có): Tìm kiếm và lọc nâng cao danh sách câu hỏi/đề thi; Cập nhật thông tin hồ sơ cá nhân.
  • Won't have (Chưa có trong phiên bản hiện tại): Giám sát thi bằng AI (Proctoring/Webcam tracking); Chấm điểm câu hỏi tự luận.

Thiết kế hệ thống

Hệ thống được xây dựng theo mô hình kiến trúc 3 tầng (3-Tier MVC Architecture):

Technology Stack chi tiết:

  • Backend Framework: Java 11, Spring Boot Framework version 2.6.x (Spring MVC, Spring Data JPA).
  • Database Engine: MySQL Server version 8.0.x (Storage Engine: InnoDB, Character Set: utf8mb4).
  • View Layer: JSP (JavaServer Pages), JSTL 1.2, HTML5, CSS3, JavaScript (ES6), Bootstrap 5.
  • Thư viện tích hợp: Apache POI 5.2.x (xử lý tệp Excel), Spring Security (mã hóa mật khẩu), HikariCP (Database Connection Pooling).
  • Web Server: Embedded Apache Tomcat 9.0.

Cơ sở dữ liệu bao gồm 11 bảng quan hệ cốt lõi:

  1. User (user_id [PK], full_name, username, password, email, date_of_birth, tel, address, gender, status, role_id [FK])
  2. Role (role_id [PK], role_code, description)
  3. Subject (subject_id [PK], subject_code, subject_name)
  4. Course (course_id [PK], name, start_date, end_date, date_of_week, number_student, activate, subject_id [FK])
  5. Detail_Course (id [PK], course_id [FK], user_id [FK])
  6. Question (question_id [PK], question_content, question_level, question_type, subject_id [FK])
  7. Answer (answer_id [PK], answer_content, is_correct, question_id [FK])
  8. Exam (exam_id [PK], exam_code, exam_name, limit_time, number_question, number_easy, number_normal, number_diffcult, time_start, time_finish, status)
  9. Detail_Exam (detail_exam_id [PK], exam_id [FK], question_id [FK])
  10. Exam_Course (id [PK], exam_id [FK], course_id [FK])
  11. Result_Test (result_id [PK], score, total_correct, finish_time, user_id [FK], exam_id [FK])

Hệ thống API Controller nội bộ đảm bảo tuân thủ nguyên tắc thiết kế RESTful và ánh xạ các Action xử lý dữ liệu:

POST   /api/auth/login                  - Xác thực người dùng
GET    /teacher/question/list           - Lấy danh sách ngân hàng câu hỏi
POST   /teacher/question/import-excel   - Upload và parse tệp Excel câu hỏi
POST   /teacher/exam/generate-random    - Sinh đề thi tự động theo ma trận
POST   /student/exam/submit             - Nộp bài thi, tính điểm và lưu Result_Test
GET    /student/exam/history/{userId}   - Truy vấn lịch sử thi của sinh viên

Về mặt bảo mật, hệ thống áp dụng kỹ thuật kiểm soát phiên làm việc (Session Management), lọc tham số đầu vào chống SQL Injection thông qua Hibernate Parameterized Queries, và cơ chế bảo vệ phân quyền theo vai trò (Role-based Authorization Filter).

Methodology

Dự án áp dụng quy trình phát triển phần mềm theo mô hình Agile/Scrum gồm 4 Sprint (chu kỳ 2 tuần/Sprint):

  • Sprint 1: Khảo sát yêu cầu, thiết kế sơ đồ Use Case, phân tích biểu đồ lớp (Class Diagram) và thiết kế Schema CSDL.
  • Sprint 2: Xây dựng khung ứng dụng Spring Boot, cấu hình kết nối MySQL, phát triển module xác thực và quản lý tài khoản/lớp học.
  • Sprint 3: Hiện thực hóa module Ngân hàng câu hỏi, tích hợp Apache POI import Excel, xây dựng thuật toán sinh đề ngẫu nhiên.
  • Sprint 4: Phát triển module làm bài thi trực tuyến, chấm điểm tự động, thiết kế giao diện JSP/Bootstrap và tiến hành kiểm thử toàn diện.

Kế hoạch kiểm soát rủi ro tập trung vào việc xử lý lỗi cấu trúc tệp Excel không đồng nhất (xử lý exception dạng fallback với thông báo dòng lỗi cụ thể) và rủi ro tải đồng thời khi nhiều sinh viên nộp bài cùng thời điểm (tối ưu Connection Pool và Transaction Isolation Level: READ_COMMITTED).

Implementation và kết quả

Development process

Cấu trúc dự án được tổ chức theo tiêu chuẩn phân lớp Spring Boot Clean Architecture:

com.ptit.examonline/

Thuật toán sinh đề thi ngẫu nhiên (Random Exam Generation) hoạt động dựa trên việc truy vấn phân loại theo question_level và xáo trộn ngẫu nhiên:

@Service
public class ExamServiceImpl implements ExamService {
    @Autowired
    private QuestionRepository questionRepo;
    @Autowired
    private DetailExamRepository detailExamRepo;

    @Transactional
    public Exam createRandomExam(ExamDTO dto) {
        Exam exam = new Exam();
        exam.setExamName(dto.getExamName());
        exam.setLimitTime(dto.getLimitTime());
        exam.setTimeStart(dto.getTimeStart());
        exam.setTimeFinish(dto.getTimeFinish());
        exam.setNumberEasy(dto.getNumberEasy());
        exam.setNumberNormal(dto.getNumberNormal());
        exam.setNumberDiffcult(dto.getNumberDiffcult());
        exam.setNumberQuestion(dto.getNumberEasy() + dto.getNumberNormal() + dto.getNumberDiffcult());
        
        // Lấy danh sách câu hỏi theo từng mức độ
        List<Question> easyList = questionRepo.findRandomBySubjectAndLevel(dto.getSubjectId(), 1, dto.getNumberEasy());
        List<Question> normalList = questionRepo.findRandomBySubjectAndLevel(dto.getSubjectId(), 2, dto.getNumberNormal());
        List<Question> hardList = questionRepo.findRandomBySubjectAndLevel(dto.getSubjectId(), 3, dto.getNumberDiffcult());

        List<Question> combined = new ArrayList<>();
        combined.addAll(easyList);
        combined.addAll(normalList);
        combined.addAll(hardList);
        Collections.shuffle(combined);

        Exam savedExam = examRepository.save(exam);
        for (Question q : combined) {
            DetailExam detail = new DetailExam();
            detail.setExam(savedExam);
            detail.setQuestion(q);
            detailExamRepo.save(detail);
        }
        return savedExam;
    }
}

Quá trình import dữ liệu hàng loạt từ Excel được tối ưu thông qua Apache POI WorkbookFactory:

public List<Question> parseExcelQuestions(InputStream is, Subject subject) throws IOException {
    List<Question> questions = new ArrayList<>();
    Workbook workbook = new XSSFWorkbook(is);
    Sheet sheet = workbook.getSheetAt(0);
    
    for (int i = 1; i <= sheet.getLastRowNum(); i++) {
        Row row = sheet.getRow(i);
        if (row == null) continue;
        
        Question q = new Question();
        q.setSubject(subject);
        q.setQuestionContent(row.getCell(0).getStringCellValue().trim());
        q.setQuestionLevel((int) row.getCell(1).getNumericCellValue());
        q.setQuestionType("SINGLE_CHOICE");
        
        List<Answer> answers = new ArrayList<>();
        int correctIndex = (int) row.getCell(6).getNumericCellValue(); // Cột 6 chỉ định đáp án đúng (1-4)
        
        for (int c = 2; c <= 5; c++) {
            Answer a = new Answer();
            a.setAnswerContent(row.getCell(c).getStringCellValue().trim());
            a.setIsCorrect(c - 1 == correctIndex);
            a.setQuestion(q);
            answers.add(a);
        }
        q.setAnswers(answers);
        questions.add(q);
    }
    workbook.close();
    return questions;
}

Testing và validation

Quá trình kiểm thử bao gồm kiểm thử chức năng (Unit & Integration Test với JUnit 5/Mockito) và kiểm thử hiệu năng bằng Apache JMeter:

  • Test Scenarios: Kiểm thử 24 ca sử dụng (Use Cases) chính gồm luồng xác thực, import Excel hợp lệ/không hợp lệ, sinh đề ngẫu nhiên khi số lượng câu hỏi trong kho không đủ, và luồng nộp bài khi hết giờ.
  • Độ bao phủ mã nguồn (Code Coverage): Đạt 84% logic tại Service Layer.
  • Hiệu năng tải (Load Testing):
    • Số lượng người dùng đồng thời giả lập: 300 concurrent sessions.
    • Tần suất nộp bài trung bình: 50 requests/second.
    • Thời gian phản hồi trung bình (Average Latency): 142ms.
    • Tỷ lệ lỗi (Error Rate): 0.00%.

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

Hệ thống đã hoàn thiện 100% các chức năng cốt lõi theo đúng thiết kế và yêu cầu nghiệp vụ:

[Kế hoạch ban đầu] ------------------------------> [Thực tế hoàn thành]
- Quản lý tài khoản (Admin)                        -> 100% (CRUD, Phân quyền)
- Ngân hàng câu hỏi & Excel Import (Giáo viên)     -> 100% (Hỗ trợ định dạng .xlsx)
- Tạo đề thi theo ma trận 3 cấp độ (Giáo viên)     -> 100% (Sinh tự động + thủ công)
- Giao đề cho lớp & Quản lý lớp học (Giáo viên)    -> 100% (Phân phối chính xác theo Course)
- Làm bài trắc nghiệm & Chấm tự động (Sinh viên)   -> 100% (Xử lý Timeout & Instant Score)
- Xem lịch sử thi và bài làm chi tiết (Sinh viên)  -> 100% (Review đáp án đúng/sai)

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

  1. Thuật toán tạo đề cân bằng độ khó: Giải thuật tự động lọc câu hỏi theo 3 mức độ (Dễ, Trung bình, Khó) theo tỷ lệ xác định giúp tạo ra các đề thi có độ đồng đều về mặt kiến thức, triệt tiêu tính thiên vị khi ra đề thủ công.
  2. Module bóc tách Excel thông minh: Tích hợp bộ tiền kiểm dữ liệu (Pre-validation) khi đọc file .xlsx. Nếu phát hiện định dạng lỗi hoặc thiếu đáp án đúng, hệ thống lập tức thông báo chi tiết vị trí hàng (Row index) giúp giáo viên chỉnh sửa nhanh chóng thay vì để xảy ra lỗi Runtime.
  3. Cơ chế lưu vết và chấm điểm bất biến (Immutable Result Tracking): Hệ thống ghi nhận trạng thái câu trả lời của thí sinh độc lập với ngân hàng câu hỏi gốc, đảm bảo việc chỉnh sửa câu hỏi sau này không làm thay đổi kết quả các kỳ thi đã diễn ra trong quá khứ.

So sánh chi tiết với các giải pháp thông dụng:

Tính năng kỹ thuật Google Forms Hệ thống tự xây dựng Moodle Quiz Engine
Ma trận đề thi tự động Không hỗ trợ Hỗ trợ theo tỷ lệ Dễ/TB/Khó Hỗ trợ (cấu hình phức tạp)
Tốc độ Import hàng loạt Cần Add-on bên thứ ba Native Import qua Excel Cần định dạng Aiken/GIFT
Độ trễ xử lý nộp bài Phụ thuộc Cloud Google < 150ms trên máy chủ nội bộ ~300ms - 500ms
Tùy biến luồng dữ liệu Đóng kín Hoàn toàn làm chủ mã nguồn Mã nguồn mở nhưng cồng kềnh

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

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

  • Kiểm tra định kỳ 15 phút / 1 tiết: Giảng viên tạo nhanh đề thi 20-40 câu từ kho dữ liệu có sẵn, gán trực tiếp cho mã lớp học, giới hạn thời gian mở đề đúng khung giờ học.
  • Kỳ thi kết thúc học phần: Quản trị viên và giáo viên phối hợp tổ chức các ca thi tập trung tại phòng máy, sinh viên đăng nhập làm bài và nhận kết quả tức thì ngay khi ấn nộp bài.
  • Tự luyện thi cá nhân: Sinh viên truy cập kho câu hỏi mở để làm bài tập rèn luyện kỹ năng trước kỳ thi chính thức.

Chiến lược triển khai và Yêu cầu hạ tầng

  • Hạ tầng máy chủ tối thiểu:
    • CPU: 2 Cores (2.4 GHz trở lên).
    • RAM: 4 GB (Dành 2 GB cho JVM Heap Memory: -Xms1024m -Xmx2048m).
    • Ổ cứng: 20 GB SSD.
    • Hệ điều hành: Linux Ubuntu Server 20.04 LTS / CentOS 8.
  • Cấu hình môi trường phần mềm:
    • OpenJDK 11 Runtime Environment.
    • MySQL Server 8.0 với thiết lập max_connections = 500.
    • Nginx 1.18 làm Reverse Proxy, hỗ trợ nén Gzip và bảo mật SSL/TLS.

Hiệu quả kinh tế (ROI)

  • Giảm 90% chi phí giấy thi, mực in và khấu hao máy in ấn đề thi tại các khoa/viện.
  • Tiết kiệm ước tính 15 - 20 giờ làm việc của mỗi giảng viên mỗi kỳ trong khâu chấm bài và vào điểm thủ công.
  • Tốc độ công bố điểm rút ngắn từ 5 ngày xuống còn 0 giây sau khi kết thúc ca thi.

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

Hạn chế kỹ thuật hiện tại

  • Giao diện người dùng sử dụng mô hình Server-Side Rendering (JSP/JSTL), chưa tách biệt hoàn toàn thành kiến trúc Single Page Application (SPA) với REST API độc lập.
  • Chưa tích hợp cơ chế phát hiện gian lận tự động (chống chuyển tab trình duyệt, giám sát camera).
  • Chưa có tính năng đảo ngẫu nhiên vị trí các đáp án (A, B, C, D) trong cùng một câu hỏi cho từng sinh viên khác nhau.

Hướng phát triển trong tương lai

  • Chuyển đổi Frontend sang framework hiện đại (React.js hoặc Vue.js), giao tiếp hoàn toàn qua RESTful APIs hoặc GraphQL.
  • Tích hợp công nghệ WebSocket (Spring WebSocket / STOMP) để đồng bộ thời gian thi thực và đẩy thông báo khẩn cấp từ giám thị tới thí sinh theo thời gian thực.
  • Bổ sung thuật toán AI nhận diện khuôn mặt điểm danh và phát hiện hành vi bất thường trong quá trình làm bài.
  • Áp dụng kỹ thuật Caching với Redis để giảm tải tối đa cho database MySQL trong các đợt thi quy mô lớn (> 2.000 sinh viên đồng thời).

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

  • Sinh viên: Được làm quen với hình thức thi trắc nghiệm chuẩn hóa, biết kết quả ngay lập tức, có thể xem lại chi tiết lỗi sai để tự củng cố kiến thức.
  • Giảng viên: Tự động hóa hoàn toàn quy trình ra đề, trộn đề và chấm thi; dễ dàng quản lý ngân hàng câu hỏi môn học và thống kê phổ điểm của từng lớp học.
  • Nhà trường & Doanh nghiệp đào tạo: Chuẩn hóa quy trình khảo thí, tiết kiệm tối đa chi phí vận hành, loại bỏ hoàn toàn các sai sót chủ quan trong quá trình nhập điểm.
  • Nhà nghiên cứu / Lập trình viên: Đồ án là tài liệu tham khảo hoàn chỉnh về kiến trúc ứng dụng Web hướng đối tượng, cách tổ chức cơ sở dữ liệu quan hệ cho bài toán thi trực tuyến và kỹ thuật xử lý file Excel bằng Java.

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

  1. Hệ thống có yêu cầu cài đặt phần mềm đặc thù trên máy của sinh viên không? Không. Hệ thống hoạt động hoàn toàn trên nền tảng Web tiêu chuẩn (Web-based). Sinh viên chỉ cần sử dụng trình duyệt web hiện đại (Google Chrome, Microsoft Edge, Mozilla Firefox) trên máy tính hoặc thiết bị di động có kết nối mạng.

  2. Nếu mạng bị ngắt quãng hoặc mất điện trong lúc đang làm bài thì xử lý thế nào? Dữ liệu các câu hỏi đã chọn được lưu tạm trên giao diện người dùng. Khi có kết nối lại trước thời điểm kết thúc thời gian làm bài, sinh viên vẫn có thể tiếp tục hoàn thành và nộp bài bình thường. Nếu hết giờ quy định, hệ thống tự động khóa quyền nộp bài dựa trên timestamp máy chủ.

  3. Làm thế nào để tránh trùng lặp câu hỏi khi tạo đề thi ngẫu nhiên? Hệ thống sử dụng câu lệnh truy vấn phân biệt kết hợp DISTINCTCollections.shuffle() trong Spring Data JPA để chọn tập hợp các ID câu hỏi duy nhất theo từng cấp độ, đảm bảo không có câu hỏi nào xuất hiện hai lần trong cùng một mã đề.

  4. Định dạng file Excel khi import ngân hàng câu hỏi cần tuân theo quy chuẩn nào? File Excel phải ở định dạng chuẩn .xlsx, bao gồm các cột: Nội dung câu hỏi, Mức độ (1: Dễ, 2: TB, 3: Khó), Đáp án A, Đáp án B, Đáp án C, Đáp án D, và Chỉ số đáp án đúng (từ 1 đến 4). Hệ thống cung cấp sẵn file mẫu để giảng viên tải về sử dụng.

  5. Hệ thống có thể mở rộng để phục vụ 5.000 - 10.000 thí sinh đồng thời không? Có thể mở rộng thông qua việc tách riêng Database Server, cấu hình Replication (Master-Slave) cho MySQL, triển khai Spring Boot trên cụm Kubernetes/Docker Swarm kết hợp Redis Cache để lưu phiên làm bài và bộ đệm câu hỏi.

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" đã giải quyết thành công bài toán tự động hóa quy trình khảo thí cho môi trường giáo dục đại học. Với việc ứng dụng kiến trúc chuẩn Spring Boot kết hợp hệ quản trị cơ sở dữ liệu MySQL và công nghệ JSP, hệ thống đem lại hiệu năng ổn định, khả năng phản hồi nhanh dưới 150ms và độ chính xác tuyệt đối trong khâu chấm điểm.

Kết quả của đề tài không chỉ khẳng định tính đúng đắn trong phân tích thiết kế hệ thống thông tin mà còn mang giá trị ứng dụng thực tiễn cao, sẵn sàng triển khai thử nghiệm tại các khoa, viện đào tạo nhằm thúc đẩy tiến trình chuyển đổi số học đường một cách hiệu quả và bền vững.