python项目分享 基于Django的智慧校园考试系统

0 前言

Hi,大家好,今天给大家介绍一个python管理系统,大家可以用于自己的课设或毕设!

今天要分享的是:毕业设计 基于Django的智慧校园考试系统

项目分享:

https://gitee.com/sinonfin/system-sharing

1 设计说明

在虚拟环境下输入命令“python manage.py runserver”启动项目,然后,访问“http://127.0.0.1:8000”进入网站首页,如图1所示。

在这里插入图片描述
注册用户

鼠标悬浮至顶部导航中的“登录”按钮时,单击“密码”登录,弹出登录框,如图2所示。如果没有账号,需要点击登录框中的“注册”按钮进行注册,如图3所示。

在这里插入图片描述

在注册页面中,需要填写真实可用的邮箱,注册成功后,需要进行邮箱验证,如图4所示。单击“发送邮件”按钮,提示发送信息,如图5所示。

在这里插入图片描述

查看邮箱,如图6所示。

在这里插入图片描述

由于我们在本地测试,不能直接单击邮箱验证链接,可以手动赋值链接,然后在链接地址前添加“http://127.0.0.1:8000”, 即完成的链接地址为:“http://127.0.0.1:8000/auth/[email protected]&sign=53ec094a-4acf-11e9-8b5b-b0d59d3cadab”。然后使用浏览器访问该地址即可完成验证并自动登录,如图7所示。

在这里插入图片描述

注册完用户后,即可参与答题,如选择热门比赛。点击一个比赛,即可进入该比赛信息页,如图8所示。
在这里插入图片描述单击“开始挑战”按钮开始答题,如图9所示。单击“查看排行榜”按钮,即可查看排行榜。

在这里插入图片描述
在答题页面,单击“后退”按钮,返回上一题;单击“前进”按钮,进入下一题;单击“交卷”按钮,显示答题成绩,如图10所示。

在这里插入图片描述

注册机构

机构用户可以参与出题,用户需要先注册结构才能成为机构用户。单击顶部导航中的“成为机构”按钮,进入注册机构页面,如图11所示。在该页面中,邮箱填写用户注册网站时邮箱。

在这里插入图片描述
注册完成后,单击导航栏顶部的“快速出题”按钮,进入出题页面。如图12所示。

在这里插入图片描述
在快速出题页面,需要先来录制题库,然后再配置比赛。单击“开始录制”按钮,如图13所示。创建题库时,需要先下载题库模块,然后根据模板提示,创建自己的Excel题库。然后填写题库名称,选择题库类型,上传Excel文件,最后单击“开始录制”按钮,上传题库。

在这里插入图片描述

上传完题库以后,开始配置比赛。在快速出题页面,单击“配置比赛”超链接,进入配置比赛页面。配置比赛时,选择题库,填写配置信息。如果需要答题用户在比赛前填写用户信息,则需要勾选“开启录入信息功能”,然后勾选下面的字段,如图14所示。配置完成后,页面跳转到答题页,单击“开始挑战”按钮,弹出一个填写答题用户信息的表单,该表单中的字段就是在配置信息中设定的内容,如图15所示。

在这里插入图片描述
在这里插入图片描述

后台管理员

后台管理员可以通过账号密码登录后台,输入网址“http://127.0.0.1:8000/admin/”,输入如下账号密码即可登录。
账号:mr
密码:mrsoft
登录成功后进入后台主页,如图16所示。在后台主页,管理员可以根据对应菜单执行相应的管理工作。

在这里插入图片描述

部分相关源码

# -*- coding: utf-8 -*-

import datetime

from django.conf import settings
from django.contrib.auth import login, logout
from django.contrib.auth.models import User
from django.db import transaction
from django.shortcuts import redirect, render, reverse

from account.models import Profile
from utils.errors import VeriCodeError, VerifyFailed, PasswordResetFailed, UserNotFound, VeriCodeTimeOut
from utils.redis.rprofile import get_signcode, get_passwd


def web_index(request):
    """
    首页渲染视图
    :param request:请求对象
    :return: 渲染视图并返回: user_info:用户信息;upgrade_info: 用户会员信息;has_login: 是否已登录;kinds: 比赛数据
    """

    uid = request.session.get('uid', '')

    try:
        profile = Profile.objects.get(uid=uid)
    except Profile.DoesNotExist:
        profile = None

    return render(request, 'web/index.html', {
    
    
        'user_info': profile and profile.data,
        'upgrade_info': profile and profile.upgrade_data,
        'has_login': bool(profile),
    })


def web_login(request):
    """
    登录页面渲染视图
    :param request: 请求对象
    :return: 渲染视图并返回: login_info: 用户登录所需配置信息;has_login:是否已经登录;user_info:用户信息;upgrade_info: 用户会员信息
    """

    uid = request.session.get('uid', '')

    if uid:
        try:
            profile = Profile.objects.get(uid=uid)
        except Profile.DoesNotExist:
            profile = None

        if profile:
            return render(request, 'web/index.html', {
    
    
                'user_info': profile and profile.data,
                'upgrade_info': profile and profile.upgrade_data,
                'has_login': bool(uid)
            })
        else:
            try:
                del request.session['uid']
            except KeyError:
                pass

    return render(request, 'web/login.html', {
    
    
        'login_info': settings.WXWEB_LOGIN_PARAMS or {
    
    },
        'has_login': False
    })


def web_logout(request):
    """
    用户注销视图
    :param request: 请求对象
    :return: 重定向首页
    """

    logout(request)

    try:
        del request.session['uid']
    except KeyError:
        pass

    return redirect(reverse('web_index'))


def signup_redirect(request):
    """

    :param request: 请求对象
    :return:emai邮箱地址,sign注册验证码
    """

    email = request.GET.get('email', '')
    sign = request.GET.get('sign', '')

    return render(request, 'web/sign_email.html', {
    
    
        'email': email,
        'sign': sign
    })


@transaction.atomic
def email_notify(request):
    email = request.GET.get('email', '')  # 获取要验证的邮箱
    sign = request.GET.get('sign', '')  # 获取校验码
    signcode = get_signcode(sign)  # 在redis校验邮箱
    if not signcode:
        return render(request, 'err.html', VeriCodeTimeOut)  # 校验失败返回错误视图
    if not (email == signcode.decode('utf-8')):
        return render(request, 'err.html', VeriCodeError)  # 校验失败返回错误视图
    try:
        user = User.objects.get(email=email)  # 获取用户
    except User.DoesNotExist:
        user = None
    if user is not None:  # 激活用户
        user.is_active = True
        user.is_staff = True
        user.save()
        login(request, user)  # 登录用户
        profile, created = Profile.objects.select_for_update().get_or_create(  # 配置用户信息
            name=user.username,
            email=user.email,
        )
        profile.user_src = Profile.NORMAL_USER  # 配置用户为普通登录用户
        profile.save()

        request.session['uid'] = profile.uid  # 配置session
        request.session['username'] = profile.name
        return render(request, 'web/index.html', {
    
      # 渲染视图,并返回已登录信息
            'user_info': profile.data,
            'has_login': True,
            'msg': "激活成功",
        })
    else:
        return render(request, 'err.html', VerifyFailed)  # 校验失败返回错误视图

@transaction.atomic
def reset_notify(request):
    email = request.GET.get('email', '')
    sign = request.GET.get('sign', '')
    is_biz = request.GET.get('is_biz')

    password = get_passwd(sign)

    if not password:
        return render(request, 'err.html', PasswordResetFailed)

    try:
        u = User.objects.get(email=email)
    except User.DoesNotExist:
        return render(request, 'err.html', UserNotFound)

    if is_biz == '1':
        u.is_staff = True
        u.is_active = True
    u.set_password(password)
    u.save()

    return render(request, 'web/index.html', {
    
    
        'has_login': False,
        'msg': '密码修改成功!'
    })


def error(request):
    return render(request, 'err.html', {
    
    "errtitle": "页面发生错误", "errmsg": "页面发生未知错误,请联系管理员解决~"})

项目分享

项目分享:完整源码 + 环境配置文档 + 设计使用手册

https://gitee.com/sinonfin/system-sharing

猜你喜欢

转载自blog.csdn.net/mabile123444/article/details/135426626