Ứng dụng web tạo và quản lý đề thi trắc nghiệm với giao diện thân thiện và kiến trúc MVC hoàn chỉnh.
- ✅ Thêm, sửa, xóa chủ đề
- ✅ Giao diện sticky header không bị cuộn
- ✅ Popup xác nhận xóa đẹp mắt
- ✅ Tích hợp API backend hoàn chỉnh
- ✅ Kiến trúc MVC (Model-View-Controller)
- ✅ Tạo câu hỏi trắc nghiệm với 4 lựa chọn (A, B, C, D)
- ✅ Chọn đáp án đúng bằng radio button
- ✅ Liên kết câu hỏi với chủ đề
- ✅ Popup chọn chủ đề từ danh sách
- ✅ Lọc câu hỏi theo chủ đề (tính năng mới)
- ✅ Scroll và highlight câu hỏi sau khi cập nhật
- ✅ Tích hợp API backend hoàn chỉnh
- ✅ Kiến trúc MVC (Model-View-Controller)
- ✅ Không thể thay đổi chủ đề khi chỉnh sửa
- ✅ Tạo đề thi từ các câu hỏi đã có
- ✅ Lọc câu hỏi theo chủ đề
- ✅ Chọn nhiều câu hỏi cho đề thi
- ✅ Thiết lập thời gian làm bài (phút) với tùy chỉnh
- ✅ Popup nhập thời gian tùy chỉnh
- ✅ Tích hợp API backend hoàn chỉnh
- ✅ Kiến trúc MVC (Model-View-Controller)
- ✅ Không thể thay đổi chủ đề khi chỉnh sửa
- ✅ Scroll và highlight đề thi sau khi cập nhật
src/
├── models/ # Data structures & business logic
│ ├── Subject.js
│ ├── Question.js
│ └── Exam.js
├── services/ # API integration layer
│ ├── SubjectService.js
│ ├── QuestionService.js
│ └── ExamService.js
├── controllers/ # Business logic & state management
│ ├── SubjectController.js
│ ├── QuestionController.js
│ └── ExamController.js
├── views/ # UI components (React)
│ ├── SubjectView.js
│ ├── QuestionView.js
│ └── ExamView.js
├── App.js # Main application entry point
└── App.css # Global styles
- 🎯 Separation of Concerns: Mỗi layer có trách nhiệm riêng biệt
- 🔄 Loose Coupling: Views không trực tiếp gọi Services
- 🧪 Testability: Controllers có thể test độc lập
- 📈 Scalability: Dễ dàng thêm features mới
- 🔧 Maintainability: Code dễ maintain và debug
GET /get_subjects
- Lấy danh sách chủ đềPOST /add_subject
- Thêm chủ đề mớiPUT /update
- Cập nhật chủ đềDELETE /delete/{id}
- Xóa chủ đề
GET /get_questions
- Lấy danh sách câu hỏiPOST /add_question
- Thêm câu hỏi mớiPUT /update
- Cập nhật câu hỏi
GET /get_exams
- Lấy danh sách đề thiPOST /add_exam
- Thêm đề thi mớiPUT /update
- Cập nhật đề thiDELETE /delete/{id}
- Xóa đề thi
- 🎯 Sticky Navigation: Header và tabs cố định khi cuộn
- 🎨 Modern Design: Gradient backgrounds, card layouts
- ⚡ Smooth Animations: Scroll mượt mà, highlight effects
- 📱 Responsive: Tương thích mobile và desktop
- 🎭 Custom Popups: Popup xác nhận xóa, chọn chủ đề, thời gian tùy chỉnh
- 🔄 Loading States: Hiển thị trạng thái loading
- ❌ Error Handling: Xử lý lỗi thân thiện
- 🔍 Filter Controls: Lọc câu hỏi theo chủ đề
- ✨ Highlight Animation: Câu hỏi/đề thi được cập nhật sẽ highlight 2 giây
- 🎯 Auto Scroll: Tự động cuộn đến item vừa cập nhật
- 🎨 Hover Effects: Hiệu ứng hover cho buttons và cards
- 🌈 Color Coding: Màu sắc phân biệt các trạng thái
⚠️ Warning Messages: Thông báo khi không thể thay đổi chủ đề
- Node.js >= 14.0.0
- npm >= 6.0.0
- Backend API chạy trên
http://localhost:8080
# Clone repository
git clone <repository-url>
cd test-practice
# Cài đặt dependencies
npm install
# Chạy ứng dụng
npm start
- Frontend:
http://localhost:3000
- Backend API:
http://localhost:8080
Chạy ứng dụng ở chế độ development.
Mở http://localhost:3000 để xem trong trình duyệt.
Chạy test runner ở chế độ interactive watch mode.
Build ứng dụng cho production vào thư mục build
.
Ứng dụng được tối ưu hóa cho performance tốt nhất.
Lưu ý: Đây là thao tác một chiều. Một khi eject
, bạn không thể quay lại!
// GET /get_subjects
{
"data": [
{ "id": 1, "nameSubject": "Toán" },
{ "id": 2, "nameSubject": "Tiếng Anh" }
],
"message": "Success",
"status": 200
}
// POST /add_subject
Body: { "name_subject": "Vật Lí" }
Response: { "data": [...], "message": "Subject added successfully" }
// GET /get_questions
{
"data": [
{
"id": 1,
"subject": { "id": 1, "nameSubject": "Toán" },
"content": "Câu hỏi...",
"option_a": "A", "option_b": "B", "option_c": "C", "option_d": "D",
"correct_answer": 1 // 0=A, 1=B, 2=C, 3=D
}
]
}
// POST /add_question
Body: {
"subject_id": 1,
"content": "Câu hỏi...",
"option_a": "A", "option_b": "B", "option_c": "C", "option_d": "D",
"correct_answer": 1
}
// GET /get_exams
{
"data": [
{
"id": 1,
"subject": { "id": 1, "nameSubject": "Toán" },
"title": "Đề thi Toán 10",
"duration_seconds": 3600,
"questions": [...],
"created_at": "2025-01-23T10:30:00Z"
}
]
}
// POST /add_exam
Body: {
"subject_id": 1,
"title": "Đề thi Toán 10",
"duration_seconds": 3600,
"questions": "1, 2, 3" // Comma-separated question IDs
}
- Subjects: Lưu trữ qua API backend với real-time sync
- Questions: Lưu trữ qua API backend với filter theo chủ đề
- Exams: Lưu trữ qua API backend với time management
- 🔄 Real-time Updates: Cập nhật dữ liệu real-time từ API
- 🎯 Smart Navigation: Tự động cuộn và highlight
- ⚡ Fast Loading: Tối ưu hóa performance với MVC
- 🎨 Visual Feedback: Phản hồi trực quan cho mọi thao tác
- 🔍 Advanced Filtering: Lọc câu hỏi theo chủ đề
- ⏰ Time Management: Thời gian làm bài với tùy chỉnh linh hoạt
- 🏗️ MVC Pattern: Separation of concerns rõ ràng
- 🔧 Maintainable: Code dễ maintain và extend
- 🧪 Testable: Controllers có thể test độc lập
- 📈 Scalable: Dễ dàng thêm features mới
- 🔄 Reusable: Components có thể reuse
Mọi đóng góp đều được chào đón! Vui lòng tạo issue hoặc pull request.
Dự án này được phát hành dưới MIT License.