1. 项目概述与背景
这个基于Django框架开发的在线考试系统,是我在计算机专业毕业设计中的实践成果。系统采用B/S架构,主要面向教育机构提供高效、安全的考试管理解决方案。在实际开发过程中,我深刻体会到Django框架"开箱即用"的特性如何显著提升开发效率。
系统设计了三个核心角色:学生、教师和管理员。学生可以参加在线考试、查看成绩和错题记录;教师能够创建和管理试题库、试卷,并进行评分;管理员则负责系统的全面管理。这种角色划分很好地满足了教育场景中的实际需求。
技术选型方面,我选择了Python+Django+MySQL的组合。Django自带的ORM让数据库操作变得简单,而MySQL则提供了稳定可靠的数据存储。前端使用HTML/CSS/JavaScript构建响应式界面,确保在不同设备上都有良好的用户体验。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术栈解析
后端技术:
- Django 3.2:作为核心框架,提供了完善的MVT模式支持
- Django REST framework:用于构建API接口
- Redis:用作缓存,提高系统响应速度
- Celery:处理异步任务,如成绩统计等
前端技术:
- Bootstrap 5:构建响应式界面
- jQuery:简化DOM操作和AJAX请求
- Chart.js:用于成绩统计图表展示
开发工具:
- Visual Studio Code:主要开发IDE
- Git:版本控制
- Postman:API测试
2.2 数据库设计
系统采用MySQL作为主数据库,主要表结构包括:
-
用户相关表:
user:存储账户基础信息student_users:学生扩展信息teacher_users:教师扩展信息
-
考试核心表:
subject:科目表subject_exam:试卷表exam_question_database:试题库subject_user_answer:用户答题记录
-
系统管理表:
notice:公告管理slides:轮播图管理article:资讯管理
数据库关系采用外键约束确保数据完整性,同时建立了适当的索引提高查询效率。
3. 核心功能实现
3.1 用户认证模块
用户认证采用Django自带的认证系统,并进行了扩展:
python复制# 自定义用户模型
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
USER_TYPE_CHOICES = (
(1, 'student'),
(2, 'teacher'),
(3, 'admin'),
)
user_type = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES)
phone = models.CharField(max_length=15, blank=True)
avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)
登录流程实现:
- 前端提交用户名和密码
- 后端验证凭证有效性
- 生成token并返回给客户端
- 客户端存储token用于后续请求认证
3.2 考试管理模块
3.2.1 试题库管理
教师可以创建多种题型:
- 单选题
- 多选题
- 判断题
- 填空题
- 简答题
试题模型设计:
python复制class Question(models.Model):
QUESTION_TYPES = (
('single', '单选题'),
('multiple', '多选题'),
('judge', '判断题'),
('fill', '填空题'),
('short', '简答题'),
)
subject = models.ForeignKey(Subject, on_delete=models.CASCADE)
question_type = models.CharField(max_length=10, choices=QUESTION_TYPES)
content = models.TextField()
options = models.JSONField(null=True, blank=True) # 用于存储选择题选项
answer = models.TextField()
score = models.DecimalField(max_digits=5, decimal_places=2)
difficulty = models.PositiveSmallIntegerField(default=3) # 1-5表示难度
creator = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
