lạ nhỉ. sao tôi xóa user đó đi. sau đó add lại vẫn bị quá giới hạn số lần làm nhỉ
lạ nhỉ. sao tôi xóa user đó đi. sau đó add lại vẫn bị quá giới hạn số lần làm nhỉ
Hiện tượng này xảy ra là do cơ chế quản lý và đếm số lượt thi trong mã nguồn hệ thống của bạn đang dựa trên dữ liệu lịch sử thi chứ không dựa trên danh sách tài khoản thí sinh.
Dưới đây là nguyên nhân chi tiết và cách xử lý triệt để vấn đề này:
🔍 Nguyên nhân vì sao xóa User rồi Add lại vẫn bị chặn?
Trong file code Python z52-main.py của bạn, khi một thí sinh truy cập vào đề thi, hệ thống kiểm tra số lượt bằng câu lệnh SQL sau:
cur.execute("""
SELECT COUNT(id)
FROM exam_sessions_v2
WHERE username=%s AND sbd=%s AND category=%s
""", (name, sbd, cat))
Hệ thống thực hiện đếm xem trong bảng exam_sessions_v2 (bảng lưu kết quả/lịch sử thi) có bao nhiêu dòng trùng khớp với Họ tên (username), Số báo danh (sbd) và Đề tài (category) đó.
Khi bạn vào trang quản lý học sinh (
/admin/students) để xóa thí sinh, hệ thống chỉ thực hiện xóa tài khoản của họ trong bảng danh sách thí sinh (students).Tuy nhiên, toàn bộ lịch sử làm bài cũ của họ trong bảng
exam_sessions_v2vẫn còn nguyên vẹn (không tự động mất đi).
Vì vậy, khi bạn add lại tài khoản đó với SBD và Họ tên cũ, thí sinh đăng nhập vào thi thì hàm COUNT(id) quét trong bảng lịch sử vẫn tìm thấy đủ 3 lượt làm bài trước đó. Kết quả là hệ thống tiếp tục báo lỗi quá giới hạn số lần làm.
🛠️ Cách xử lý triệt để
Để thí sinh đó có thể vào thi lại bình thường sau khi bạn đã add lại tài khoản, bạn phải xóa bỏ các bản ghi lịch sử cũ của họ trong Database. Bạn có thể chọn 1 trong 2 cách sau:
Cách 1: Sử dụng giao diện admin_reset_user_page.html bạn vừa tạo
Bạn không cần phải xóa/add lại user nữa. Hãy truy cập vào đường link quản lý reset:
http://localhost:5000/admin/reset_user_page
Tại đây, bạn nhập SBD hoặc Họ tên của thí sinh đó vào ô tìm kiếm. Danh sách các lượt thi cũ của thí sinh sẽ hiện ra. Bạn chỉ cần bấm nút 🗑️ Reset lượt này đối với các lượt thi cũ của họ. Hệ thống sẽ xóa các bản ghi đó đi, số lượt đếm sẽ giảm về 0 và thí sinh sẽ vào thi lại được ngay.
Cách 2: Chạy lệnh SQL trực tiếp trong Database
Nếu bạn đang mở các công cụ quản lý DB như pgAdmin hoặc DBeaver, hãy chạy lệnh sau để dọn sạch lịch sử thi của thí sinh đó (ví dụ thí sinh có SBD là SBD005):
-- 1. Xóa chi tiết câu hỏi để tránh lỗi ràng buộc khóa ngoại
DELETE FROM exam_details_v2
WHERE session_id IN (SELECT id FROM exam_sessions_v2 WHERE sbd = 'SBD005');
-- 2. Xóa phiên thi để reset hoàn toàn lượt làm bài
DELETE FROM exam_sessions_v2 WHERE sbd = 'SBD005';
(Bạn chỉ cần thay SBD005 bằng Số báo danh thực tế của thí sinh cần reset là xong).

