前言
随着教育信息化的不断推进,传统考试模式已无法满足高效、便捷的需求。本文介绍一个基于 Python + Django + MySQL 开发的在线考试系统,实现了从题库管理、在线考试到成绩统计的完整流程。
适合学习Django框架开发、Web项目实战的同学参考。
一、技术栈
后端语言:Python Web框架:Django 数据库:MySQL 架构模式:B/S(浏览器/服务器) 前端:HTML + CSS + Bootstrap 开发工具:PyCharm
二、系统功能概览
本系统主要面向两类用户:管理员 和 考生。
管理员功能:
- 后台首页(数据看板)
- 系统用户管理(管理员、考生用户)
- 题库管理(增删改查)
- 在线阅卷/改卷
- 成绩数据统计
- 考生信息统计(已考/未考)
考生功能:
- 在线考试
- 查询成绩
- 个人资料修改
三、系统架构设计
系统采用经典的 MVC 架构(Django中为MTV模式):
浏览器(前端页面) → Django服务(业务逻辑) → MySQL(数据存储)
Model(模型层):负责与数据库交互,定义数据表结构 Template(模板层):负责页面渲染 View(视图层):负责业务逻辑处理
四、数据库设计
- 用户表(users)
字段名:id,类型:int,说明:主键 字段名:username,类型:varchar,说明:用户名 字段名:password,类型:varchar,说明:密码 字段名:role,类型:int,说明:角色(0管理员/1考生)
- 试题表(questions)
字段名:id,类型:int,说明:主键 字段名:title,类型:varchar,说明:题目内容 字段名:option_a,类型:varchar,说明:选项A 字段名:option_b,类型:varchar,说明:选项B 字段名:option_c,类型:varchar,说明:选项C 字段名:option_d,类型:varchar,说明:选项D 字段名:answer,类型:varchar,说明:正确答案 字段名:score,类型:int,说明:分值
- 成绩表(scores)
字段名:id,类型:int,说明:主键 字段名:user_id,类型:int,说明:考生ID 字段名:exam_id,类型:int,说明:考试ID 字段名:total_score,类型:float,说明:总分 字段名:exam_time,类型:datetime,说明:考试时间
五、核心模块实现
5.1 登录模块
from django.contrib.auth import authenticate, login from django.shortcuts import render, redirect
def login_view(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return redirect('/index/') else: return render(request, 'login.html', {'error': '用户名或密码错误'}) return render(request, 'login.html')
5.2 在线考试模块
def exam_view(request, exam_id): """在线考试 - 获取试题并展示""" questions = Question.objects.filter(exam_id=exam_id).order_by('?') context = { 'questions': questions, 'exam_id': exam_id, } return render(request, 'exam.html', context)
def submit_exam(request): """提交答卷并计算成绩""" if request.method == 'POST': user = request.user exam_id = request.POST.get('exam_id') total_score = 0
questions = Question.objects.filter(exam_id=exam_id) for q in questions: user_answer = request.POST.get(f'question_{q.id}') if user_answer == q.answer: total_score += q.score Score.objects.create( user=user, exam_id=exam_id, total_score=total_score ) return render(request, 'result.html', {'score': total_score})5.3 成绩统计模块
from django.db.models import Avg, Max, Min, Count
def score_statistics(request): """成绩数据统计""" stats = Score.objects.aggregate( avg_score=Avg('total_score'), max_score=Max('total_score'), min_score=Min('total_score'), total_count=Count('id') )
all_users = User.objects.filter(role=1) tested_users = Score.objects.values_list('user_id', flat=True).distinct() untested_users = all_users.exclude(id__in=tested_users) context = { 'stats': stats, 'untested_count': untested_users.count(), } return render(request, 'statistics.html', context)六、项目亮点
- 角色权限分离:管理员和考生拥有不同的功能权限
- 随机组卷:支持从题库中随机抽取试题
- 自动阅卷:客观题自动判分,提高效率
- 数据统计:可视化展示成绩分布、参考率等
- 响应式设计:适配不同设备访问
七、项目运行
环境要求:
- Python 3.8+
- MySQL 5.7+
- Django 3.x
快速启动:
安装依赖 pip install -r requirements.txt
配置数据库(修改settings.py中的数据库连接信息)
数据库迁移 python manage.py migrate
创建管理员账号 python manage.py createsuperuser
启动项目 python manage.py runserver
八、总结
本项目基于Django框架实现了一个功能完整的在线考试系统,涵盖了从用户管理、题库维护、在线考试到成绩统计的完整业务闭环。项目结构清晰,代码规范,适合作为Django入门实战项目学习参考。
如果这篇文章对你有帮助,欢迎点赞、收藏、关注!有关于项目的问题可以在评论区交流,或者私信我。更多Python/Django项目实战分享,持续更新中...