当前位置: 首页 > news >正文

[免费]基于Python的Django+Vue3在线考试系统【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的基于Python的Django+Vue3在线考试系统,分享下哈。

项目视频演示

【免费】基于Python的Django+Vue3在线考试系统 Python毕业设计_哔哩哔哩_bilibili

项目介绍

本论文提出并实现了一种基于Python的Django和Vue3技术栈的在线考试系统,旨在为教育机构提供高效、便捷的考试管理与评估解决方案。随着在线教育的快速发展,传统的考试模式面临诸多挑战,包括时间限制、资源分配及评分效率等问题。针对这些挑战,我们设计了一个集题库管理、在线答题、自动评分、统计分析等功能于一体的系统,以提高考试的灵活性和效率。

系统的后端采用Django框架,充分利用其强大的ORM(对象关系映射)功能,便于数据的管理与操作。通过Django REST framework构建RESTful API,实现了前后端的高效通信,确保数据的实时更新与处理。系统的数据库设计包括用户管理、考试管理、题库管理等模块,能够满足不同类型考试的需求。

前端方面,我们选择了Vue3作为主要开发框架,利用其响应式数据绑定和组件化开发的优势,实现了一个友好且易于操作的用户界面。用户可以通过直观的操作界面进行考试报名、在线答题、查看成绩等功能,提升了用户体验。此外,系统还集成了实时反馈机制,允许考生在答题过程中查看答题状态和剩余时间,提高了考试的透明度和紧迫感。

为了确保系统的稳定性和安全性,我们进行了严格的测试,包括功能测试、性能测试和安全性测试。结果表明,该系统在高并发场景下仍能保持良好的响应速度,自动评分功能能够快速且准确地处理考试结果,并生成详细的统计报表,帮助教师和管理人员分析考生表现。

综上所述,基于Django和Vue3的在线考试系统不仅解决了传统考试模式中的一些痛点,还为用户提供了便捷的操作体验。未来,我们计划进一步扩展系统功能,例如引入智能题库推荐、实时监考功能以及数据挖掘分析,以适应更加复杂的在线考试需求。该系统的实现对于推动教育信息化进程具有重要意义,有助于提升在线教育的质量和效率。

系统展示

部分代码

import uuid
from datetime import timefrom django.core.cache import cache
from django.core.paginator import Paginator
from django.db import transaction
from django.db.models import Qfrom app import models
from comm import ExamUtils
from comm.BaseView import BaseView
from comm.CommUtils import SysUtil
from comm.CommUtils import DateUtil'''
系统处理
'''
class SysView(BaseView):def get(self, request, module, *args, **kwargs):if module == 'info':return SysView.getUserInfo(request)else:return BaseView.error('请求地址不存在')def post(self, request, module, *args, **kwargs):if module == 'login':return SysView.login(request)elif module == 'exit':return SysView.exit(request)elif module == 'info':return SysView.updUserInfo(request)elif module == 'pwd':return SysView.updUserPwd(request)else:return BaseView.error('请求地址不存在')# 获取指定用户信息def getUserInfo(request):user = models.Users.objects.filter(id=cache.get(request.GET.get('token'))).first()if user.type==0:return BaseView.successData({'id': user.id,'userName': user.userName,'name': user.name,'gender': user.gender,'age': user.age,'type': user.type,})elif user.type==1:teacher = models.Teachers.objects.filter(user__id=user.id).first()return BaseView.successData({'id': user.id,'userName': user.userName,'name': user.name,'gender': user.gender,'age': user.age,'type': user.type,'phone': teacher.phone,'record': teacher.record,'job': teacher.job,})elif user.type==2:student = models.Students.objects.filter(user__id=user.id).first()return BaseView.successData({'id': user.id,'userName': user.userName,'name': user.name,'gender': user.gender,'age': user.age,'type': user.type,'gradeId': student.grade.id,'gradeName': student.grade.name,'collegeId': student.college.id,'collegeName': student.college.name,})#登陆处理def login(request):userName = request.POST.get('userName')passWord = request.POST.get('passWord')user = models.Users.objects.filter(userName=userName)if user.exists():user = user.first()if user.passWord == passWord:token = uuid.uuid4()resl = {'token': str(token)}cache.set(token, user.id, 60*60*60*3)return SysView.successData(resl)else:return SysView.warn('用户密码输入错误')else:return SysView.warn('用户名输入错误')#退出系统def exit(request):cache.delete(request.POST.get('token'))return BaseView.success()# 修改用户信息def updUserInfo(request):user = models.Users.objects.filter(id=cache.get(request.POST.get('token')))if (request.POST.get('userName') != user.first().userName) & \(models.Users.objects.filter(userName=request.POST.get('userName')).exists()):return BaseView.warn('用户账号已存在')else:user.update(userName=request.POST.get('userName'),name=request.POST.get('name'),gender=request.POST.get('gender'),age=request.POST.get('age'),)return BaseView.success()# 修改用户密码def updUserPwd(request):user = models.Users.objects.filter(id=cache.get(request.POST.get('token')))if(request.POST.get('newPwd')!=request.POST.get('rePwd')):return BaseView.warn('两次输入的密码不一致')elif(request.POST.get('oldPwd')!=user.first().passWord):return BaseView.warn('原始密码输入错误')else:user.update(passWord=request.POST.get('newPwd'))return BaseView.success()'''
学院信息处理
'''
class CollegesView(BaseView):def get(self, request, module, *args, **kwargs):if module == 'all':return CollegesView.getAll(request)elif module == 'page':return CollegesView.getPageInfos(request)else:return BaseView.error('请求地址不存在')def post(self, request, module, *args, **kwargs):if module == 'add':return CollegesView.addInfo(request)elif module == 'upd':return CollegesView.updInfo(request)elif module == 'del':return CollegesView.delInfo(request)else:return BaseView.error('请求地址不存在')# 获取全部的学院信息def getAll(request):colleges = models.Colleges.objects.all();return BaseView.successData(list(colleges.values()))# 分页获取学院信息def getPageInfos(request):pageIndex = request.GET.get('pageIndex', 1)pageSize = request.GET.get('pageSize', 10)name = request.GET.get('name')qruery = Q();if SysUtil.isExit(name):qruery = qruery & Q(name__contains=name)data = models.Colleges.objects.filter(qruery).order_by('-createTime')paginator = Paginator(data, pageSize)resl = []for item in list(paginator.page(pageIndex)):resl.append({'id': item.id,'name': item.name,'createTime': item.createTime})pageData = BaseView.parasePage(int(pageIndex), int(pageSize),paginator.page(pageIndex).paginator.num_pages,paginator.count, resl)return BaseView.successData(pageData)# 添加学院信息def addInfo(request):models.Colleges.objects.create(name=request.POST.get('name'),createTime=DateUtil.getNowDateTime())return BaseView.success()# 修改学院信息def updInfo(request):models.Colleges.objects. \filter(id=request.POST.get('id')).update(name=request.POST.get('name'))return BaseView.success()# 删除学院信息def delInfo(request):if models.Students.objects.filter(college__id=request.POST.get('id')).exists():return BaseView.warn('存在关联记录无法移除')else:models.Colleges.objects.filter(id=request.POST.get('id')).delete()return BaseView.success()'''
班级信息处理
'''
class GradesView(BaseView):def get(self, request, module, *args, **kwargs):if module == 'all':return GradesView.getAll(request)elif module == 'page':return GradesView.getPageInfos(request)else:return BaseView.error('请求地址不存在')def post(self, request, module, *args, **kwargs):if module == 'add':return GradesView.addInfo(request)elif module == 'upd':return GradesView.updInfo(request)elif module == 'del':return GradesView.delInfo(request)else:return BaseView.error('请求地址不存在')# 获取全部的班级信息def getAll(request):grades = models.Grades.objects.all();return BaseView.successData(list(grades.values()))# 分页获取班级信息def getPageInfos(request):pageIndex = request.GET.get('pageIndex', 1)pageSize = request.GET.get('pageSize', 10)name = request.GET.get('name')qruery = Q();if SysUtil.isExit(name):qruery = qruery & Q(name__contains=name)data = models.Grades.objects.filter(qruery).order_by('-createTime')paginator = Paginator(data, pageSize)resl = []for item in list(paginator.page(pageIndex)):resl.append({'id': item.id,'name': item.name,'createTime': item.createTime})pageData = BaseView.parasePage(int(pageIndex), int(pageSize),paginator.page(pageIndex).paginator.num_pages,paginator.count, resl)return BaseView.successData(pageData)# 添加班级信息def addInfo(request):models.Grades.objects.create(name=request.POST.get('name'),createTime=DateUtil.getNowDateTime())return BaseView.success()# 修改班级信息def updInfo(request):models.Grades.objects. \filter(id=request.POST.get('id')).update(name=request.POST.get('name'))return BaseView.success()# 删除班级信息def delInfo(request):if models.Students.objects.filter(grade__id=request.POST.get('id')).exists():return BaseView.warn('存在关联学生无法移除')elif models.Exams.objects.filter(grade__id=request.POST.get('id')).exists():return BaseView.warn('存在关联考试无法移除')else:models.Grades.objects.filter(id=request.POST.get('id')).delete()return BaseView.success()'''
科目信息处理
'''
class ProjectsView(BaseView):def get(self, request, module, *args, **kwargs):if module == 'all':return ProjectsView.getAll(request)elif module == 'page':return ProjectsView.getPageInfos(request)else:return BaseView.error('请求地址不存在')def post(self, request, module, *args, **kwargs):if module == 'add':return ProjectsView.addInfo(request)elif module == 'upd':return ProjectsView.updInfo(request)elif module == 'del':return ProjectsView.delInfo(request)else:return BaseView.error('请求地址不存在')# 获取全部的科目信息def getAll(request):projects = models.Projects.objects.all();return BaseView.successData(list(projects.values()))# 分页获取科目信息def getPageInfos(request):pageIndex = request.GET.get('pageIndex', 1)pageSize = request.GET.get('pageSize', 10)name = request.GET.get('name')qruery = Q();if SysUtil.isExit(name):qruery = qruery & Q(name__contains=name)data = models.Projects.objects.filter(qruery).order_by('-createTime')paginator = Paginator(data, pageSize)resl = []for item in list(paginator.page(pageIndex)):resl.append({'id': item.id,'name': item.name,'createTime': item.createTime})pageData = BaseView.parasePage(int(pageIndex), int(pageSize),paginator.page(pageIndex).paginator.num_pages,paginator.count, resl)return BaseView.successData(pageData)# 添加科目信息def addInfo(request):models.Projects.objects.create(name=request.POST.get('name'),createTime=DateUtil.getNowDateTime())return BaseView.success()# 修改科目信息def updInfo(request):models.Projects.objects. \filter(id=request.POST.get('id')).update(name=request.POST.get('name'))return BaseView.success()# 删除科目信息def delInfo(request):if (models.Exams.objects.filter(project__id=request.POST.get('id')).exists() |models.Practises.objects.filter(project__id=request.POST.get('id')).exists()):return BaseView.warn('存在关联记录无法移除')else:models.Projects.objects.filter(id=request.POST.get('id')).delete()return BaseView.success()'''
教师信息处理
'''
class TeachersView(BaseView):def get(self, request, module, *args, **kwargs):if module == 'page':return TeachersView.getPageInfos(request)else:return BaseView.error('请求地址不存在')def post(self, request, module, *args, **kwargs):if module == 'add':return TeachersView.addInfo(request)elif module == 'upd':return TeachersView.updInfo(request)elif module == 'del':return TeachersView.delInfo(request)else:return BaseView.error('请求地址不存在')# 分页查询教师信息def getPageInfos(request):pageIndex = request.GET.get('pageIndex', 1)pageSize = request.GET.get('pageSize', 10)name = request.GET.get('name')record = request.GET.get('record')job = request.GET.get('job')qruery = Q();if SysUtil.isExit(name):qruery = qruery & Q(user__name__contains=name)if SysUtil.isExit(record):qruery = qruery & Q(record=record)if SysUtil.isExit(job):qruery = qruery & Q(job=job)data = models.Teachers.objects.filter(qruery)paginator = Paginator(data, pageSize)resl = []for item in list(paginator.page(pageIndex)):resl.append({'id': item.user.id,'userName': item.user.userName,'name': item.user.name,'gender': item.user.gender,'age': item.user.age,'type': item.user.type,'phone': item.phone,'record': item.record,'job': item.job})pageData = BaseView.parasePage(int(pageIndex), int(pageSize),paginator.page(pageIndex).paginator.num_pages,paginator.count, resl)return BaseView.successData(pageData)# 添加教师信息@transaction.atomicdef addInfo(request):if models.Users.objects.filter(userName=request.POST.get('userName')).exists():return BaseView.warn('账号已存在,请重新输入')elif models.Users.objects.filter(id=request.POST.get('id')).exists():return BaseView.warn('工号已存在,请重新输入')else:user = models.Users.objects.create(id=request.POST.get('id'),userName=request.POST.get('userName'),passWord=request.POST.get('userName'),name=request.POST.get('name'),gender=request.POST.get('gender'),age=request.POST.get('age'),type=1,)models.Teachers.objects.create(user=user,phone=request.POST.get('phone'),record=request.POST.get('record'),job=request.POST.get('job'))return BaseView.success()# 修改教师信息def updInfo(request):models.Teachers.objects. \filter(user__id=request.POST.get('id')).update(phone=request.POST.get('phone'),record=request.POST.get('record'),job=request.POST.get('job'))return BaseView.success()#删除教师信息@transaction.atomicdef delInfo(request):if models.Exams.objects.filter(teacher__id=request.POST.get('id')).exists():return BaseView.warn('存在关联记录无法移除')else:models.Users.objects.filter(id=request.POST.get('id')).delete()return BaseView.success()'''
学生信息处理
'''
class StudentsView(BaseView):def get(self, request, module, *args, **kwargs):if module == 'page':return StudentsView.getPageInfos(request)elif module == 'info':return StudentsView.getInfo(request)else:return BaseView.error('请求地址不存在')def post(self, request, module, *args, **kwargs):if module == 'add':return StudentsView.addInfo(request)elif module == 'upd':return StudentsView.updInfo(request)elif module == 'del':return StudentsView.delInfo(request)else:return BaseView.error('请求地址不存在')# 获取指定学生信息def getInfo(request):student = models.Students.objects.filter(user__id=request.GET.get('id')).first()return BaseView.successData({'id': student.user.id,'userName': student.user.userName,'passWord': student.user.passWord,'name': student.user.name,'gender': student.user.gender,'gradeId': student.grade.id,'gradeName': student.grade.name,'collegeId': student.college.id,'collegeName': student.college.name,})#分页查询学生信息def getPageInfos(request):pageIndex = request.GET.get('pageIndex', 1)pageSize = request.GET.get('pageSize', 10)name = request.GET.get('name')collegeId = request.GET.get('collegeId')gradeId = request.GET.get('gradeId')qruery = Q();if SysUtil.isExit(name):qruery = qruery & Q(user__name__contains=name)if SysUtil.isExit(collegeId):qruery = qruery & Q(college__id=int(collegeId))if SysUtil.isExit(gradeId):qruery = qruery & Q(grade__id=int(gradeId))data = models.Students.objects.filter(qruery)paginator = Paginator(data, pageSize)resl = []for item in list(paginator.page(pageIndex)):resl.append({'id': item.user.id,'userName': item.user.userName,'name': item.user.name,'gender': item.user.gender,'age': item.user.age,'type': item.user.type,'gradeId': item.grade.id,'gradeName': item.grade.name,'collegeId': item.college.id,'collegeName': item.college.name})pageData = BaseView.parasePage(int(pageIndex), int(pageSize),paginator.page(pageIndex).paginator.num_pages,paginator.count, resl)return BaseView.successData(pageData)# 添加学生信息@transaction.atomicdef addInfo(request):if models.Users.objects.filter(userName=request.POST.get('userName')).exists():return BaseView.warn('账号已存在,请重新输入')elif models.Users.objects.filter(id=request.POST.get('id')).exists():return BaseView.warn('学号已存在,请重新输入')else:user = models.Users.objects.create(id=request.POST.get('id'),userName=request.POST.get('userName'),passWord=request.POST.get('userName'),name=request.POST.get('name'),gender=request.POST.get('gender'),age=request.POST.get('age'),type=2,)models.Students.objects.create(user=user,grade=models.Grades.objects.get(id=request.POST.get('gradeId')),college=models.Colleges.objects.get(id=request.POST.get('collegeId')))return BaseView.success()# 修改学生信息def updInfo(request):models.Students.objects. \filter(user__id=request.POST.get('id')).update(grade=models.Grades.objects.get(id=request.POST.get('gradeId')),college=models.Colleges.objects.get(id=request.POST.get('collegeId')))return BaseView.success()#删除学生信息@transaction.atomicdef delInfo(request):if (models.ExamLogs.objects.filter(student__id=request.POST.get('id')).exists() |models.AnswerLogs.objects.filter(student__id=request.POST.get('id')).exists()):return BaseView.warn('存在关联记录无法移除')else:models.Users.objects.filter(id=request.POST.get('id')).delete()return BaseView.success()'''
习题信息处理
'''
class PractisesView(BaseView):def get(self, request, module, *args, **kwargs):if module == 'page':return PractisesView.getPageInfos(request)elif module == 'info':return PractisesView.getInfo(request)else:return BaseView.error('请求地址不存在')def post(self, request, module, *args, **kwargs):if module == 'add':return PractisesView.addInfo(request)elif module == 'setanswer':return PractisesView.setAnswer(request)else:return BaseView.error('请求地址不存在')# 获取指定 ID 的习题信息def getInfo(request):practise = models.Practises.objects.filter(id=request.GET.get('id')).first()if practise.type==0:return  BaseView.successData({'id': practise.id,'name': practise.name,'answer': practise.answer,'analyse': practise.analyse,'type': practise.type,'createTime': practise.createTime,'projectId': practise.project.id,'projectName': practise.project.name,'options': list(models.Options.objects.filter(practise__id=practise.id).values())})else:return BaseView.successData({'id': practise.id,'name': practise.name,'answer': practise.answer,'analyse': practise.analyse,'type': practise.type,'createTime': practise.createTime,'projectId': practise.project.id,'projectName': practise.project.name,})#分页查询习题信息def getPageInfos(request):pageIndex = request.GET.get('pageIndex', 1)pageSize = request.GET.get('pageSize', 10)name = request.GET.get('name')type = request.GET.get('type')projectId = request.GET.get('projectId')qruery = Q();if SysUtil.isExit(name):qruery = qruery & Q(name__contains=name)if SysUtil.isExit(type):qruery = qruery & Q(type=int(type))if SysUtil.isExit(projectId):qruery = qruery & Q(project__id=int(projectId))data = models.Practises.objects.filter(qruery).order_by('-createTime')paginator = Paginator(data, pageSize)resl = []for item in list(paginator.page(pageIndex)):if item.type==0:resl.append({'id': item.id,'name': item.name,'answer': int(item.answer) if SysUtil.isExit(item.answer) else '','analyse': item.analyse,'type': item.type,'projectId': item.project.id,'projectName': item.project.name,'createTime': item.createTime,'optionTotal': models.Options.objects.filter(practise__id=item.id).count()})else:resl.append({'id': item.id,'name': item.name,'answer': item.answer,'analyse': item.analyse,'type': item.type,'projectId': item.project.id,'projectName': item.project.name,'createTime': item.createTime,'optionTotal': 0})pageData = BaseView.parasePage(int(pageIndex), int(pageSize),paginator.page(pageIndex).paginator.num_pages,paginator.count, resl)return BaseView.successData(pageData)#添加习题信息def addInfo(request):models.Practises.objects.create(name=request.POST.get('name'),type=request.POST.get('type'),project=models.Projects.objects.get(id=request.POST.get('projectId')),createTime=DateUtil.getNowDateTime())return BaseView.success()#修改习题信息def setAnswer(request):models.Practises.objects. \filter(id=request.POST.get('id')).update(answer=request.POST.get('answer'),analyse=request.POST.get('analyse'))return BaseView.success()
'''
选项信息处理
'''
class OptionsView(BaseView):def get(self, request, module, *args, **kwargs):if module == 'list':return OptionsView.getListByPractiseId(request)else:return BaseView.error('请求地址不存在')def post(self, request, module, *args, **kwargs):if module == 'add':return OptionsView.addInfo(request)elif module == 'upd':return OptionsView.updInfo(request)else:return BaseView.error('请求地址不存在')#依据习题编号获取选项信息def getListByPractiseId(request):options = models.Options.objects.filter(practise__id=request.GET.get('practiseId'))return BaseView.successData(list(options.values()))# 添加选项信息def addInfo(request):models.Options.objects.create(name=request.POST.get('name'),practise=models.Practises.objects.get(id=request.POST.get('practiseId')))return BaseView.success()#修改选项信息def updInfo(request):models.Options.objects. \filter(id=request.POST.get('id')).update(name=request.POST.get('name'))return BaseView.success()'''
考试信息处理
'''
class ExamsView(BaseView):def get(self, request, module, *args, **kwargs):if module == 'page':return ExamsView.getPageInfos(request)elif module == 'info':return ExamsView.getInfo(request)else:return BaseView.error('请求地址不存在')def post(self, request, module, *args, **kwargs):if module == 'add':return ExamsView.addInfo(request)elif module == 'make':return ExamsView.createExamPaper(request)else:return BaseView.error('请求地址不存在')# 获取考试信息def getInfo(request):exam = models.Exams.objects.filter(id=request.GET.get('id')).first()return BaseView.successData({'id': exam.id,'name': exam.name,'createTime': exam.createTime,'examTime': exam.examTime,'teacherId': exam.teacher.id,'teacherName': exam.teacher.name,'projectId': exam.project.id,'projectName': exam.project.name,'gradeId': exam.grade.id,'gradeName': exam.grade.name,})#分页查询考试信息def getPageInfos(request):pageIndex = request.GET.get('pageIndex', 1)pageSize = request.GET.get('pageSize', 10)name = request.GET.get('name')gradeId = request.GET.get('gradeId')projectId = request.GET.get('projectId')teacherId = request.GET.get('teacherId')qruery = Q();if SysUtil.isExit(teacherId):qruery = qruery & Q(teacher__id=teacherId)if SysUtil.isExit(name):qruery = qruery & Q(name__contains=name)if SysUtil.isExit(gradeId):qruery = qruery & Q(grade__id=gradeId)if SysUtil.isExit(projectId):qruery = qruery & Q(project__id=projectId)data = models.Exams.objects.filter(qruery).order_by('-createTime')paginator = Paginator(data, pageSize)resl = []for item in list(paginator.page(pageIndex)):resl.append({'id': item.id,'name': item.name,'examTime': item.examTime,'createTime': item.createTime,'projectId': item.project.id,'projectName': item.project.name,'teacherId': item.teacher.id,'teacherName': item.teacher.name,'gradeId': item.grade.id,'gradeName': item.grade.name,})pageData = BaseView.parasePage(int(pageIndex), int(pageSize),paginator.page(pageIndex).paginator.num_pages,paginator.count, resl)return BaseView.successData(pageData)# 添加考试信息def addInfo(request):if ExamUtils.CheckPractiseTotal.check(request.POST.get('projectId')):if models.Teachers.objects.filter(user__id=request.POST.get('teacherId')).exists():models.Exams.objects.create(name=request.POST.get('name'),examTime=request.POST.get('examTime'),project=models.Projects.objects.get(id=request.POST.get('projectId')),teacher=models.Users.objects.get(id=request.POST.get('teacherId')),grade=models.Grades.objects.get(id=request.POST.get('gradeId')),createTime=DateUtil.getNowDateTime())return BaseView.success()else:return BaseView.warn('指定工号的教师不存在')else:return BaseView.warn('相关题目数量不足,无法准备考试')# 生成考试试卷def createExamPaper(request):projectId = request.POST.get('projectId')paper = ExamUtils.MakeExam.make(projectId)return BaseView.successData(paper)'''
考试记录处理
'''
class ExamLogsView(BaseView):def get(self, request, module, *args, **kwargs):if module == 'pagestu':return ExamLogsView.getPageStudentLogs(request)elif module == 'pagetea':return ExamLogsView.getPageTeacherLogs(request)elif module == 'info':return ExamLogsView.getInfo(request)else:return BaseView.error('请求地址不存在')def post(self, request, module, *args, **kwargs):if module == 'add':return ExamLogsView.addInfo(request)elif module == 'upd':return ExamLogsView.updInfo(request)elif module == 'put':return ExamLogsView.putExamLog(request)else:return BaseView.error('请求地址不存在')# 获取指定考试记录def getInfo(request):examLogs = models.ExamLogs.objects.filter(id=request.GET.get('id')).first()answers = []qruery = Q();qruery = qruery & Q(student__id=request.GET.get('studentId'))qruery = qruery & Q(exam__id=examLogs.exam.id)temps = models.AnswerLogs.objects.filter(qruery).order_by('no')for item in temps:answers.append({'id': item.id,'score': item.score,'status': item.status,'answer': item.answer,'no': item.no,'practiseId': item.practise.id,'practiseName': item.practise.name,'practiseAnswer': item.practise.answer,'practiseAnalyse': item.practise.analyse,'options': list(models.Options.objects.filter(id=item.practise.id).values()),})return BaseView.successData({'id': examLogs.id,'status': examLogs.status,'score': examLogs.score,'createTime': examLogs.createTime,'examId': examLogs.exam.id,'examName': examLogs.exam.name,'projectId': examLogs.exam.project.id,'projectName': examLogs.exam.project.name,'teacherId': examLogs.exam.teacher.id,'teacherName': examLogs.exam.teacher.name,'gradeId': examLogs.exam.grade.id,'gradeName': examLogs.exam.grade.name,'answers': answers})# 分页获取学生考试记录def getPageStudentLogs(request):pageIndex = request.GET.get('pageIndex', 1)pageSize = request.GET.get('pageSize', 10)examName = request.GET.get('examName')studentId = request.GET.get('studentId')projectId = request.GET.get('projectId')qruery = Q(student__id=studentId);if SysUtil.isExit(examName):qruery = qruery & Q(exam__name__contains=examName);if SysUtil.isExit(projectId):qruery = qruery & Q(exam__project__id=projectId)data = models.ExamLogs.objects.filter(qruery).order_by('-createTime')paginator = Paginator(data, pageSize)resl = []for item in list(paginator.page(pageIndex)):resl.append({'id': item.id,'status': item.status,'createTime': item.createTime,'score': item.score,'examId': item.exam.id,'examName': item.exam.name,'teacherId': item.exam.teacher.id,'teacherName': item.exam.teacher.name,'projectId': item.exam.project.id,'projectName': item.exam.project.name,})pageData = BaseView.parasePage(int(pageIndex), int(pageSize),paginator.page(pageIndex).paginator.num_pages,paginator.count, resl)return BaseView.successData(pageData)# 分页获取教师审核记录def getPageTeacherLogs(request):pageIndex = request.GET.get('pageIndex', 1)pageSize = request.GET.get('pageSize', 10)examName = request.GET.get('examName')token = request.GET.get('token')gradeId = request.GET.get('gradeId')projectId = request.GET.get('projectId')qruery = Q(exam__teacher__id=cache.get(token));if SysUtil.isExit(examName):qruery = qruery & Q(exam__name__contains=examName)if SysUtil.isExit(gradeId):qruery = qruery & Q(exam__grade__id=gradeId)if SysUtil.isExit(projectId):qruery = qruery & Q(exam__project__id=projectId)data = models.ExamLogs.objects.filter(qruery).order_by('-createTime')paginator = Paginator(data, pageSize)resl = []for item in list(paginator.page(pageIndex)):resl.append({'id': item.id,'status': item.status,'createTime': item.createTime,'score': item.score,'examId': item.exam.id,'examName': item.exam.name,'studentId': item.student.id,'studentName': item.student.name,'projectId': item.exam.project.id,'projectName': item.exam.project.name,'gradeId': item.exam.grade.id,'gradeName': item.exam.grade.name,})pageData = BaseView.parasePage(int(pageIndex), int(pageSize),paginator.page(pageIndex).paginator.num_pages,paginator.count, resl)return BaseView.successData(pageData)# 添加考试记录def addInfo(request):models.ExamLogs.objects.create(student=models.Users.objects.get(id=cache.get(request.POST.get('token'))),exam=models.Exams.objects.get(id=request.POST.get('examId')),status=0,score=0,createTime=DateUtil.getNowDateTime())return BaseView.success()# 修改考试记录def updInfo(request):models.ExamLogs.objects. \filter(id=request.POST.get('id')).update(status=request.POST.get('status'))return BaseView.success()# 公布学生考核成绩def putExamLog(request):studentId = request.POST.get('studentId')examId = request.POST.get('examId')qruery = Q(student__id=studentId)qruery = qruery & Q(exam__id=examId)total = 0.0answers = models.AnswerLogs.objects.filter(qruery)for item in answers:if item.practise.type==0:temp = 2 if item.practise.answer==item.answer else 0total = total + tempmodels.AnswerLogs.objects. \filter(id=item.id).update(status=1,score = temp)elif item.practise.type==1:total = total + item.scoreelif item.practise.type==2:temp = 2 if item.practise.answer==item.answer else 0total = total + tempmodels.AnswerLogs.objects. \filter(id=item.id).update(status=1,score = temp)elif item.practise.type==3:total = total + item.scoremodels.ExamLogs.objects. \filter(qruery).update(status=2,score=total)return BaseView.success()'''
答题记录处理
'''
class AnswerLogsView(BaseView):def get(self, request, module, *args, **kwargs):if module == 'info':return AnswerLogsView.getInfo(request)elif module == 'answers':return AnswerLogsView.getAnswers(request)elif module == 'check':return AnswerLogsView.checkAnswers(request)else:return BaseView.error('请求地址不存在')def post(self, request, module, *args, **kwargs):if module == 'add':return AnswerLogsView.addInfo(request)elif module == 'audit':return AnswerLogsView.aduitAnswer(request)else:return BaseView.error('请求地址不存在')# 获取指定答题记录def getInfo(request):pass# 获取指定的答案列表def getAnswers(request):studentId = request.GET.get('studentId')type = request.GET.get('type')examId = request.GET.get('examId')qruery = Q(student__id=studentId);qruery = qruery & Q(exam__id=examId)resl = []data = models.AnswerLogs.objects.filter(qruery).order_by('no')for item in data:if item.practise.type == int(type):resl.append({'id': item.id,'practiseId': item.practise.id,'practiseName': item.practise.name,'practiseAnswer': item.practise.answer,'answer': item.answer,'score': item.score,'status': item.status,'no': item.no})elif item.practise.type == int(type):resl.append({'id': item.id,'practiseId': item.practise.id,'practiseName': item.practise.name,'practiseAnswer': item.practise.answer,'answer': item.answer,'score': item.score,'status': item.status,'no': item.no})return BaseView.successData(resl)#按照类型检查答题def checkAnswerType(studentId, examId, type):qruery = Q(student__id=studentId)qruery = qruery & Q(exam__id=examId)qruery = qruery & Q(status=0)qruery = qruery & Q(practise__type=type)return models.AnswerLogs.objects.filter(qruery).exists()# 检查手动审核题目def checkAnswers(request):studentId = request.GET.get('studentId')examId = request.GET.get('examId')qruery = Q(student__id=studentId)qruery = qruery & Q(exam__id=examId)qruery = qruery & Q(status=0)qruery = qruery & Q(practise__type=1)qruery = qruery | Q(practise__type=3)if AnswerLogsView.checkAnswerType(studentId, examId, 1):return BaseView.successData({'flag': True, 'msg': '填空题还有未审核的内容'})elif AnswerLogsView.checkAnswerType(studentId, examId, 3):return BaseView.successData({'flag': True, 'msg': '编程题还有未审核的内容'})else:return BaseView.successData({'flag': False, 'msg': '手动审核部分已完成'})# 添加答题记录@transaction.atomicdef addInfo(request):answers = request.POST.getlist('answers')nos = request.POST.getlist('nos')practiseIds = request.POST.getlist('practiseIds')examId = request.POST.get('examId')token = request.POST.get('token')for no in nos:models.AnswerLogs.objects.create(student=models.Users.objects.get(id=cache.get(token)),exam=models.Exams.objects.get(id=examId),practise=models.Practises.objects.get(id=practiseIds[int(no)-1]),status=0,answer=answers[int(no)-1],no=no)qruery = Q(exam__id=examId);qruery = qruery & Q(student__id=cache.get(token))models.ExamLogs.objects. \filter(qruery).update(status=1)return BaseView.success()# 审核答题def aduitAnswer(request):if int(request.POST.get('type'))==1:models.AnswerLogs.objects. \filter(id=request.POST.get('id')).update(status=1,score=2 if int(request.POST.get('flag'))==0 else 0,)else:models.AnswerLogs.objects. \filter(id=request.POST.get('id')).update(status=1,score=20 if int(request.POST.get('flag'))==0 else 0,)return BaseView.success()
<template><div class="login-body"><div class="login-win"><div class="login-form"><Form ref="loginForm" :rules="rules" :model="loginForm" :label-width="90"><FormItem prop="userName"><Input v-model="loginForm.userName" placeholder="请输入您的账号..."></Input></FormItem><FormItem prop="passWord"><Input type="password" v-model="loginForm.passWord" placeholder="请输入您的密码..."></Input></FormItem><FormItem style="margin-top: 50px;"><Button style="width:226px;" @click="submitForm('loginForm')"  class="login-btn" type="primary">用户登陆</Button></FormItem></Form></div></div></div>
</template><style>
.login-body{background-color: #2db7f5;background-image: url(../assets/2.jpg);position: fixed;left: 0;top: 0;bottom: 0;right: 0;
}
.login-win{position: absolute;top: 45%;left: 50%;transform: translate(-50%, -50%);width: 600px;height: 330px;padding: 15px;border-radius: 5px;border: 2px solid #fff;background-image: url('../assets/1.jpg');background-size: cover;
}
.login-form{position: absolute;left: 40%;top: 30%;width: 320px;
}
</style><script>
import initMenu from "../utils/menus.js";
import { login } from '../api/index.js';
export default {data() {return {loginForm: {userName: '',passWord: '',},rules: {userName: [{ required: true, message: '用户账号必须输入', trigger: 'blur' }],passWord: [{ required: true, message: '用户密码必须输入', trigger: 'blur' }],}}},methods: {submitForm (formName) {this.$refs[formName].validate((valid) => {if (valid) {login(this.loginForm).then(res => {if(res.code == 0){this.$store.commit('setToken', res.data.token);sessionStorage.setItem("token", res.data.token);initMenu(this.$router, this.$store);this.$router.push('/welcome');}else{this.$Message.warning(res.msg);}});} else {return false;}})}},
}
</script>

源码代码

链接:https://pan.baidu.com/s/10b83UvwFEA9b_47VJcJRMg 
提取码:1234

相关文章:

[免费]基于Python的Django+Vue3在线考试系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的基于Python的DjangoVue3在线考试系统&#xff0c;分享下哈。 项目视频演示 【免费】基于Python的DjangoVue3在线考试系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 本论文提出并实现了一种基于Python…...

Python使用爬虫

一、基本介绍 爬虫&#xff08;Web Scraping&#xff09;是一种自动化获取网页内容的技术&#xff0c;它通过编写程序模拟浏览器的行为&#xff0c;从互联网上抓取网页数据。爬虫可以用于多种目的&#xff0c;比如数据收集、信息整合、自动化测试等。 二、常用的库 1、Request…...

CommunityToolkit.Mvvm如何使用

CommunityToolkit.Mvvm 是一个现代、快速和模块化的 MVVM 库&#xff0c;用于 .NET 应用程序。以下是如何使用 CommunityToolkit.Mvvm 的基本步骤&#xff1a; 安装包&#xff1a; 你可以通过 NuGet 包管理器安装 CommunityToolkit.Mvvm。在 Visual Studio 中&#xff0c;你可以…...

Python小游戏20——超级玛丽

首先&#xff0c;你需要确保你的Python环境中安装了pygame库。如果还没有安装&#xff0c;可以使用以下命令进行安装&#xff1a; bash pip install pygame 运行效果展示 代码展示 python import pygame import sys # 初始化pygame pygame.init() # 设置屏幕尺寸 screen_width …...

配置文件格式(xml、properties、yml/yaml)

配置文件格式&#xff08;xml、properties、yml/yaml&#xff09; 配置文件格式一、XML二、properties三、yml/yaml基本语法yml数据格式1、对象/Map集合1、数组/List/Set集合 配置文件格式 什么是配置文件&#xff1f;&#xff1a; 配置文件是包含应用程序或系统配置信息的文件…...

CentOS 7 软件/程序安装示例

安装软件/程序 wget&#xff0c;前提需要用 root 用户 1、搜索软件/程序 yum search wget 搜索到软件/程序。 2、安装软件/程序 yum -y install wget 安装完成。...

Python绘制正弦函数图形

1&#xff0c;绘制正弦函数图形&#xff0c;让数学看得见&#xff0c; import math # 导入函数模块 import turtle # 导入turtle模块&#xff0c;用于绘图t turtle.Turtle() # 创建对象 turtle.bgcolor("#2dded9") # 设置背景颜色 t.pencolor(blue) # 设置画笔…...

【LVGL-列表部件 lv_list_create】

LVGL-列表部件 lv_list_create ■ LVGL-列表部件-函数■ 修改样式-■ 修改样式- 背景色■ 修改样式- 改变项的颜色-label■ 修改样式- 改变项的颜色-btn ■ 事件(Event)■ 示例0&#xff1a;综合■ 示例1&#xff08;自动出现滚动&#xff09;■ 示例2&#xff08;滚动捕捉&…...

【P2-6】ESP8266 WIFI模块在STA模式下实现UDP与电脑/手机网络助手通信——UDP数据透传

前言:完成ESP8266 WIFI模块在STA模式下实现UDP与电脑/手机网络助手通信——实现UDP数据透传 STA模式,通俗来说就是模块/单片机去连接路由器/热点来通信。 UDP协议,是传输层协议,UDP没有服务器和客户端的说法。 本实验需要注意,wifi模块/单片机与电脑/手机需要连接在同一个…...

从零学习大模型(十)-----剪枝基本概念

剪枝的基本概念 模型压缩中的地位&#xff1a;剪枝是模型压缩中的重要技术之一&#xff0c;它通过减少模型的参数量来降低计算资源的需求。对于大型神经网络&#xff0c;尤其是像BERT、GPT等参数量级巨大的模型&#xff0c;剪枝可以有效地减少模型的内存占用和计算量&#xff…...

Jest进阶知识:模拟 ES6 类 - 掌握类的依赖模拟与方法监听技巧

引言 在现代前端开发中&#xff0c;ES6 类&#xff08;class&#xff09;是常用的一种面向对象编程方式。在测试类的时候&#xff0c;我们经常需要模拟类的依赖&#xff0c;以避免外部因素对测试结果的影响。Jest 提供了强大的工具来模拟类及其方法&#xff0c;确保测试的高效…...

前端Nginx的安装与应用

目录 一、前端跨域方式 1.1、CORS(跨域资源共享) 1.2、JSONP(已过时) 1.3、WebSocket 1.4、PostMessage 1.5、Nginx 二、安装 三、应用 四、命令 4.1、基本操作命令 4.2、nginx.conf介绍 4.2.1、location模块 4.2.2、反向代理配置 4.2.3、负载均衡模块 4.2.4、通…...

Java设计模式(代理模式整理中ing)

一、代理模式 1、代理模式定义&#xff1a; 代理模式&#xff1a;由于某些原因要给某对象提供一个代理以控制对该对象的访问&#xff0c;这时访问对象不适合或者不能够直接引用目标对象&#xff0c;代理对象作为访问对象与目标对象之间的中介进行连接调控调用。 2、代理模式的…...

第J9周:Inception v3算法实战与解析(pytorch版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** &#x1f4cc;本周任务&#xff1a;&#x1f4cc; 了解并学习InceptionV3相对与InceptionV1有哪些改进的地方 使用Inception完成天气…...

如何封装一个axios,封装axios有哪些好处

什么是Axios Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;用于在浏览器和 Node.js 中发送异步网络请求。它简化了发送 GET、POST、PUT、DELETE 等请求的过程&#xff0c;并且支持请求拦截、响应拦截、取消请求和自动处理 JSON 数据等功能。 为什么要封装Axios 封装…...

java的批量update

这个问题挺有代表性的&#xff0c;今天拿出来给大家一起分享一下&#xff0c;希望对你会有所帮助。 1 案发现场 有一天上午&#xff0c;在我的知识星球群里&#xff0c;有位小伙伴问了我一个问题&#xff1a;批量更新你们一般是使用when case吗&#xff1f;还是有其他的批量更…...

go语言连续监控事件并回调处理

前言 go语言中使用回调函数处理事件&#xff1a;事件监测部分&#xff08;如无限循环中的事件检测逻辑&#xff09;可以独立于具体的业务处理逻辑。这使得代码的各个部分更加清晰&#xff0c;易于理解和维护。如果需要更改事件处理的方式&#xff0c;只需要修改注册的回调函数…...

1.探索WebSocket:实时网络的心跳!

序言 你可能听说过"WebSokcet"这个词&#xff0c;感觉它好像很高深&#xff0c;但其实它是一个超级酷的小工具&#xff0c;让我们在Web应用里实现实时通信。想象一下&#xff0c;你可以像聊天一样&#xff0c;在浏览器和服务器之间来回“畅聊“&#xff0c;没有延迟…...

uniapp学习(010-2 实现抖音小程序上线)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第113p的内容 文章目录 抖音小程序下载抖音开发者工具先去开发者工具里进行测试 抖音开放平台配置开始打包上传…...

测试和实施面试题收集

前端+测试+运维+算法综合 前端部分面试题 判断第二个日期比第一个日期大 如何用脚本判断用户输入的的字符串是下面的时间格式2004-11-21 必须要保证用户的输入是此格式,并且是时间,比如说月份不大于12等等,另外我需要用户输入两个,并且后一个要比前一个晚,只允许用JAVASCR…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...