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

系统展示

部分代码

python 复制代码
import uuid
from datetime import time

from django.core.cache import cache
from django.core.paginator import Paginator
from django.db import transaction
from django.db.models import Q

from 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.atomic
    def 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.atomic
    def 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.atomic
    def 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.atomic
    def 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.0
        answers = models.AnswerLogs.objects.filter(qruery)
        for item in answers:

            if item.practise.type==0:
                temp = 2 if item.practise.answer==item.answer else 0
                total = total + temp
                models.AnswerLogs.objects. \
                    filter(id=item.id).update(
                    status=1,
                    score = temp
                )
            elif item.practise.type==1:
                total = total + item.score
            elif item.practise.type==2:
                temp = 2 if item.practise.answer==item.answer else 0
                total = total + temp
                models.AnswerLogs.objects. \
                    filter(id=item.id).update(
                    status=1,
                    score = temp
                )
            elif item.practise.type==3:
                total = total + item.score

        models.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.atomic
    def 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()
html 复制代码
<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

相关推荐
提笔惊蚂蚁3 分钟前
java-web-day7-会话跟踪技术
java·开发语言·前端·程序人生
蚍蜉撼树谈何易5 分钟前
C++线程池
开发语言·c++
水水阿水水12 分钟前
第二章:C语言基础(三)
linux·c语言·开发语言·算法
恒风521213 分钟前
空元组同一空间,空列表不是同一空间print(a is b, c is d)
python
爱吃涮毛肚的肥肥(暂时吃不了版)17 分钟前
Linux高阶——1103—修改屏蔽字&&信号到达及处理流程&&时序竞态问题
linux·运维·服务器·开发语言·c++·后端
尘浮生21 分钟前
Java项目实战II基于Java+Spring Boot+MySQL的高校办公室行政事务管理系统(源码+数据库+文档)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
码农小伙35 分钟前
java设计模式之监听者模式
java·开发语言·设计模式
ktkiko111 小时前
Java8的新特性——Stream与completableFuture详解
java·开发语言
sc写算法1 小时前
STL 迭代器iteratior 详解
开发语言·c++·stl
AI视觉网奇2 小时前
显存占用 显存测试
pytorch·python·深度学习