当前位置: 首页 > 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…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...