178 lines
6.7 KiB
Markdown

# Role-Based School Management System with CBT
This is a comprehensive school management system with role-based access control and a Computer-Based Testing (CBT) module built with FastAPI and SQLite.
## Features
- **User Management** - Register and manage users with different roles (admin, teacher, student)
- **Role-Based Access Control** - Different permissions based on user roles
- **Student Management** - Register, update, and track student information
- **Teacher Management** - Manage teacher profiles and course assignments
- **Course Management** - Create and manage courses, assign teachers
- **Class Enrollment** - Enroll students in courses, track academic progress
- **Computer-Based Testing (CBT)**:
- **Exam Creation** - Create exams with different question types
- **Question Management** - Add, update, and delete questions and answer options
- **Exam Taking** - Students can take exams and submit answers
- **Result Analysis** - Automatic grading and score calculation
## API Documentation
The API documentation is available at the `/docs` or `/redoc` endpoints when the application is running.
### API Endpoints
#### Authentication
- `POST /api/v1/login/access-token` - Get JWT token
- `POST /api/v1/login/test-token` - Test token validation
#### Users
- `GET /api/v1/users/` - List users
- `POST /api/v1/users/` - Create a new user
- `GET /api/v1/users/{user_id}` - Get user details
- `PUT /api/v1/users/{user_id}` - Update a user
- `DELETE /api/v1/users/{user_id}` - Delete a user
#### Roles
- `GET /api/v1/roles/` - List roles
- `POST /api/v1/roles/` - Create a new role
- `GET /api/v1/roles/{role_id}` - Get role details
- `PUT /api/v1/roles/{role_id}` - Update a role
- `DELETE /api/v1/roles/{role_id}` - Delete a role
#### Students
- `GET /api/v1/students/` - List students
- `POST /api/v1/students/` - Create a new student profile
- `GET /api/v1/students/{student_id}` - Get student details
- `PUT /api/v1/students/{student_id}` - Update a student
- `DELETE /api/v1/students/{student_id}` - Delete a student
- `GET /api/v1/students/{student_id}/exams` - Get student's exam results
#### Teachers
- `GET /api/v1/teachers/` - List teachers
- `POST /api/v1/teachers/` - Create a new teacher profile
- `GET /api/v1/teachers/{teacher_id}` - Get teacher details
- `PUT /api/v1/teachers/{teacher_id}` - Update a teacher
- `DELETE /api/v1/teachers/{teacher_id}` - Delete a teacher
- `GET /api/v1/teachers/{teacher_id}/courses` - Get courses taught by teacher
#### Courses
- `GET /api/v1/courses/` - List courses
- `POST /api/v1/courses/` - Create a new course
- `GET /api/v1/courses/{course_id}` - Get course details
- `PUT /api/v1/courses/{course_id}` - Update a course
- `DELETE /api/v1/courses/{course_id}` - Delete a course
- `GET /api/v1/courses/{course_id}/exams` - Get exams for a course
#### Enrollments
- `GET /api/v1/enrollments/` - List enrollments
- `POST /api/v1/enrollments/` - Create a new enrollment
- `GET /api/v1/enrollments/{enrollment_id}` - Get enrollment details
- `PUT /api/v1/enrollments/{enrollment_id}` - Update an enrollment
- `DELETE /api/v1/enrollments/{enrollment_id}` - Delete an enrollment
#### Exams (CBT)
- `GET /api/v1/exams/` - List exams
- `GET /api/v1/exams/active` - Get active exams
- `GET /api/v1/exams/available` - Get available exams
- `POST /api/v1/exams/` - Create a new exam
- `GET /api/v1/exams/{exam_id}` - Get exam details with questions
- `GET /api/v1/exams/{exam_id}/creator` - Get exam with creator info
- `PUT /api/v1/exams/{exam_id}` - Update an exam
- `DELETE /api/v1/exams/{exam_id}` - Delete an exam
#### Questions (CBT)
- `GET /api/v1/questions/` - List questions
- `POST /api/v1/questions/` - Create a new question
- `GET /api/v1/questions/{question_id}` - Get question with options
- `PUT /api/v1/questions/{question_id}` - Update a question
- `DELETE /api/v1/questions/{question_id}` - Delete a question
#### Question Options (CBT)
- `GET /api/v1/options/` - List question options
- `POST /api/v1/options/` - Create a new option
- `GET /api/v1/options/{option_id}` - Get option details
- `PUT /api/v1/options/{option_id}` - Update an option
- `DELETE /api/v1/options/{option_id}` - Delete an option
#### Exam Results (CBT)
- `GET /api/v1/exam-results/` - List exam results
- `POST /api/v1/exam-results/` - Start a new exam attempt
- `GET /api/v1/exam-results/{result_id}` - Get exam result with answers
- `PUT /api/v1/exam-results/{result_id}` - Update an exam result
- `POST /api/v1/exam-results/{result_id}/complete` - Complete an exam and calculate score
- `DELETE /api/v1/exam-results/{result_id}` - Delete an exam result
### Health Check
- `GET /health` - Check application health status
## Environment Variables
The application uses the following environment variables:
- `SECRET_KEY` - Secret key for the application (default: auto-generated)
- `JWT_SECRET_KEY` - Secret key for JWT token generation (default: same as SECRET_KEY)
- `DATABASE_URL` - SQLite database URL (default: `sqlite:////app/storage/db/db.sqlite`)
- `ENVIRONMENT` - Application environment (default: `development`)
## Getting Started
### Prerequisites
- Python 3.8+
- pip
### Installation
1. Clone the repository
2. Install the dependencies:
```bash
pip install -r requirements.txt
```
3. Run the migrations:
```bash
alembic upgrade head
```
4. Start the application:
```bash
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
```
5. Open the API documentation at http://localhost:8000/docs
## Database Schema
The application uses SQLite as the database. The main entities are:
- **User** - Base user model with authentication details
- **Role** - User roles (admin, teacher, student)
- **Student** - Student profile linked to a user
- **Teacher** - Teacher profile linked to a user
- **Course** - Course details and teacher assignment
- **ClassEnrollment** - Student enrollment in courses
- **Exam** - CBT exam definitions
- **Question** - Exam questions with different types
- **QuestionOption** - Answer options for questions
- **ExamResult** - Student exam attempts and scores
- **StudentAnswer** - Student answers to questions
## CBT System
The Computer-Based Testing (CBT) system allows teachers to create exams with different question types, and students to take these exams online. The system supports:
- Multiple choice questions
- True/False questions
- Short answer questions
- Essay questions
Exams can be time-limited, have specific availability periods, and include different scoring mechanisms. After an exam is completed, the system automatically calculates the score based on the correct answers.
## Security
The application uses JWT tokens for authentication and role-based authorization for controlling access to resources. Password hashing is implemented using bcrypt.
## License
This project is licensed under the MIT License.