Code Grader là một nền tảng ứng dụng web được thiết kế để tự động hóa quy trình chấm điểm các bài tập lập trình C++. Hệ thống cho phép giáo viên tạo lớp học, ra đề bài kèm theo các bộ dữ liệu kiểm thử (test case), và sinh viên có thể nộp bài làm của mình để nhận được phản hồi tức thì.
Dự án này giải quyết vấn đề chấm bài thủ công tốn thời gian, đảm bảo tính công bằng và cung cấp một môi trường học tập và rèn luyện kỹ năng lập trình hiệu quả.
- Quản lý Lớp học: Tạo, xem danh sách và quản lý các lớp học của mình.
- Mã mời An toàn: Mỗi lớp học có một mã mời (
invite_code
) duy nhất để gửi cho sinh viên. - Quản lý Bài tập: Dễ dàng tạo, sửa, xóa các bài tập lập trình trong mỗi lớp.
- Cấu hình Test Case: Định nghĩa các bộ dữ liệu vào/ra (
input
/output
) cho mỗi bài tập. - Thiết lập Ràng buộc: Giới hạn thời gian chạy (Time Limit) và bộ nhớ (Memory Limit) cho mỗi bài nộp.
- Xem Kết quả: Theo dõi tiến độ và xem kết quả bài nộp của sinh viên.
- Tham gia Lớp học: Dễ dàng tham gia một lớp học bằng mã mời do giáo viên cung cấp.
- Nộp bài: Gửi mã nguồn C++ để được chấm điểm.
- Phản hồi Tức thì: Nhận kết quả chi tiết gần như ngay lập tức sau khi nộp bài.
- Kết quả Chi tiết: Xem trạng thái của từng test case:
Accepted (AC)
: Chấp nhậnWrong Answer (WA)
: Sai kết quảCompile Error (CE)
: Lỗi biên dịchTime Limit Exceeded (TLE)
: Vượt quá thời gianRuntime Error (RE)
: Lỗi thực thi
- Chấm bài Bất đồng bộ: Sử dụng RabbitMQ để xử lý các bài nộp theo hàng đợi, đảm bảo hệ thống luôn phản hồi nhanh chóng ngay cả khi có nhiều lượt nộp.
- Môi trường An toàn (Sandbox): Mỗi bài nộp được biên dịch và thực thi trong một container Docker riêng biệt, giúp cách ly hoàn toàn và ngăn chặn các mã độc hại.
+----------+ +-----------------+ +----------------+ +----------+
| |----->| Frontend (React)|----->| Backend (Flask)|----->| RabbitMQ |
| User | +-----------------+ +----------------+ +----------+
| (Browser)| ^ |
+----------+ | (CRUD) | (Grading Task)
| v
+-------+-------+ +---------------+
| PostgreSQL | | Worker (Python|
+---------------+ | + Docker) |
+---------------+
- Backend: Python, Flask, Flask-SQLAlchemy, Flask-Migrate, Flask-JWT-Extended
- Worker: Python, Docker SDK
- Frontend: JavaScript, React.js (Chưa triển khai)
- Database: PostgreSQL
- Message Queue: RabbitMQ
- Containerization: Docker, Docker Compose
Dự án được thiết kế để có thể cài đặt và chạy chỉ bằng một lệnh duy nhất thông qua script setup.sh
.
- Docker
- Docker Compose (Thường đi kèm với Docker Desktop)
- Python 3
- Git
-
Clone Repository:
git clone <https://github.com/Venus2Mice/code-grader-project.git> cd <ten_thu_muc_project>
-
Cấu hình Môi trường: Tạo một file
.env
ở thư mục gốc bằng cách copy từ file mẫu:cp .env.example .env
Bạn có thể tùy chỉnh các giá trị trong file
.env
(ví dụ:POSTGRES_PASSWORD
), nhưng các giá trị mặc định đã được thiết lập để hoạt động ngay. -
Chạy Script Cài đặt: Script này sẽ tự động dọn dẹp, build, khởi động các service, cài đặt CSDL và cuối cùng là chạy worker.
# Cấp quyền thực thi cho script (chỉ cần làm một lần) chmod +x setup.sh # Chạy script! ./setup.sh
Sau khi script chạy xong, toàn bộ hệ thống đã sẵn sàng!
- API Backend có thể truy cập tại:
http://localhost:5000
- Tài liệu API (Swagger UI):
http://localhost:5000/api/docs
- RabbitMQ Management:
http://localhost:15672
(user:guest
, pass:guest
) - Terminal hiện tại của bạn sẽ hiển thị log của Worker.
- API Backend có thể truy cập tại:
Script cài đặt đã tạo sẵn các tài khoản để bạn có thể thử nghiệm ngay:
- Giáo viên:
teacher.dev@example.com
/ Mật khẩu:password
- Học sinh:
student.dev@example.com
/ Mật khẩu:password
Nếu bạn muốn chạy từng thành phần một cách độc lập để gỡ lỗi.
Lệnh này sẽ khởi động mọi thứ trừ worker, và bạn có thể chạy worker thủ công.
docker compose up --build
Sau đó, bạn có thể thực hiện các lệnh flask db...
bằng docker compose exec backend <lenh>
. hoặc docker exec -it container-id bash
Đây là cách tốt nhất để debug cho worker.
# Di chuyển đến thư mục của worker
cd grader-engine
# Kích hoạt môi trường ảo
source venv/bin/activate
# Chạy worker (nó sẽ tự đọc file .env ở thư mục gốc)
python run_worker.py
# Di chuyển đến thư mục frontend
cd frontend
# Cài đặt các thư viện
npm install
# Khởi động server development
npm start
- Nếu bạn đã chạy bằng script
setup.sh
, nhấnCtrl+C
trong terminal đang chạy worker. - Sau đó, chạy lệnh sau ở thư mục gốc để dừng và xóa các container:
docker compose down
- Để xóa cả dữ liệu database, dùng thêm cờ
-v
:docker compose down -v
.
├── backend/ # Chứa mã nguồn Flask Backend API
├── grader-engine/ # Chứa mã nguồn Worker chấm bài
├── frontend/ # (Tương lai) Chứa mã nguồn React Frontend
├── .env # File cấu hình môi trường (cần được tạo)
├── .env.example # File cấu hình môi trường mẫu
├── docker compose.yml # Định nghĩa các service Docker
└── setup.sh # Script cài đặt và khởi chạy tự động