Python-django在线考试系统搭建[前端+后端 ] - Go语言中文社区

Python-django在线考试系统搭建[前端+后端 ]


一:项目目标:

1,制作一个学生端:可以登录,在线考试,查看成绩.教师端:可以进行组卷,分析试卷,查看学生成绩.管理员端可以进行数据修改.

2,主要运用的技术:前端(bootstrap+jQuery+html+js+css)后端(django2.0+Python)数据库(MySQL).

3,使用流程:教师组卷--------学生接收试卷--------学生在线考试------------考试结束----------系统分析学生成绩----------教师查看成绩.

4,不足点<系统没有设计防作弊的系统>

二:项目过程:

1,分析表与表之间的关系如下图:

2,分析完表之后在合适的目录下创建项目还是老三样(创建项目这里不做说明,可以搜索自学堂查看django相关教程)

3,配置stting文件(主要激活应用,添加APP,改汉语,修改数据库)

"""
Django settings for exm_project project.

Generated by 'django-admin startproject' using Django 2.0.

For more information on this file, see
https://docs.djangoproject.com/en/2.0/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.0/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '(@cj^i*y#owss&s$nu=cuu%h931hcq$*gx)0vq@06+g@s#-akp'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'student',

]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'exm_project.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'exm_project.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'exam',
        'USER':'root',
        'PASSWORD':'root',
    }
}


# Password validation
# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/

STATIC_URL = '/static/'
STATICFILES_DIRS = [
	os.path.join(BASE_DIR,'templates'),


]

4,大家一定不能忘记在_init_.py中添加import pymysql
pymysql.install_as_MySQLdb()不然会报错

5,表的设计:<将代码写在创建的APP目录下的models中>

from django.db import models

# Create your models here.
SEX=(
	('男','男'),
	('女','女'),
)

DEPT=(
	('计算机与通信学院','计算机与通信学院'),
	('电气与自动化学院','电气与自动化学院'),
	('外国语学院','外国语学院'),
	('理学院','理学院'),
)

class Student(models.Model):
	id = models.CharField('学号',max_length=20,primary_key=True)
	name = models.CharField('姓名',max_length=20)
	sex = models.CharField('性别',max_length=4,choices=SEX,default='男')
	dept = models.CharField('学院',max_length=20,choices=DEPT,default=None)
	major = models.CharField('专业',max_length=20,default=None)
	password = models.CharField('密码',max_length=20,default='111')
	email = models.EmailField('邮箱',default=None)
	birth = models.DateField('出生日期')

	class Meta:
		db_table='student'
		verbose_name='学生'
		verbose_name_plural=verbose_name

		def __str__(self):
			return self.id;

class Teacher(models.Model):
	id = models.CharField('教工号',max_length=20,primary_key=True)
	name = models.CharField('姓名',max_length=20)
	sex = models.CharField('性别',max_length=4,choices=SEX,default='男')
	dept = models.CharField('学院',max_length=20,choices=DEPT,default=None)
	email = models.EmailField('邮箱',default=None)
	password = models.CharField('密码',max_length=20,default='000000')
	birth = models.DateField('出生日期')

	class Meta:
		db_table='teacher'
		verbose_name='教师'
		verbose_name_plural=verbose_name

		def __str__(self):
			return self.name;


class Question(models.Model):
	ANSWER=(
		('A','A'),
		('B','B'),
		('C','C'),
		('D','D'),
)
	LEVEL={
		('1','easy'),
		('2','general'),
		('3','difficult'),
}
	id = models.AutoField(primary_key=True)
	subject = models.CharField('科目',max_length=20)
	title = models.TextField('题目')
	optionA = models.CharField('A选项',max_length=30)
	optionB = models.CharField('B选项',max_length=30)
	optionC = models.CharField('C选项',max_length=30)
	optionD = models.CharField('D选项',max_length=30)
	answer = models.CharField('答案',max_length=10,choices=ANSWER)
	level = models.CharField('等级',max_length=10,choices=LEVEL)
	score = models.IntegerField('分数',default=1)


	class Meta:
		db_table='question'
		verbose_name='单项选择题'
		verbose_name_plural=verbose_name

		def __str__(self):
			return '<%s:%s>'%(self.subject,self.title);

class Paper(models.Model):
    pid=models.ManyToManyField(Question)
    tid=models.ForeignKey(Teacher,on_delete=models.CASCADE)
    subject=models.CharField('科目',max_length=20,default='')
    major=models.CharField('考卷适用专业',max_length=20)
    examtime=models.DateTimeField()


    class Meta:
        db_table='paper'
        verbose_name='试卷'
        verbose_name_plural=verbose_name
    def __str__(self):
        return self.major;

class Grade(models.Model):
    sid=models.ForeignKey(Student,on_delete=models.CASCADE,default='')#添加外键
    subject=models.CharField('科目',max_length=20,default='')
    grade=models.IntegerField()

    def __str__(self):
        return '<%s:%s>'%(self.sid,self.grade);

    class Meta:
        db_table='grade'
        verbose_name='成绩'
        verbose_name_plural=verbose_name

6,生成迁移文件

python manage.py makemigrations

python manage.py migrate

7,一切准备就绪之后,我们进行路由,模板和视图的制作.

urls.py

from django.contrib import admin
from django.urls import path
from student.views import *
urlpatterns = [
    path('admin/', admin.site.urls),
    path('',index),


views.py

from django.shortcuts import render,redirect
from student import models
from django.http import HttpResponse
from django.contrib.auth import logout
# Create your views here.



def index(request):
	return render(request,'index.html')





<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">


    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <!--引入jQuery文件-->
    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>

    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

    <title>在线考试系统</title>

</head>
<body>

<nav class="navbar navbar-expand-sm bg-light navbar-light ">
    <ul class="navbar-nav" style="list-style: none;">
        <li class="nav-item" >
            <a class="nav-link" href="/toIndex/"><h3>在线考试系统 首页</h3></a>
        </li>


        <li>
            <button data-target="#stuModal" data-toggle="modal" class="btn btn-primary" style="margin-left: 400px;margin-top: 20px;">学生登陆</button>
        </li>

        <li>
            <button data-target="#teaModal" data-toggle="modal" class="btn btn-primary" style="margin-left: 90px;margin-top: 20px;">教师登陆</button>
        </li>

        <li class="nav-item">
            <a class="nav-link" href="/admin"><button data-toggle="modal" class="btn btn-primary" style="margin-left: 90px; margin-top: 20px;">管理员登录</button> </a>
        </li>


        <li style="position: fixed;right: 70px; font-size: 30px;color: #0a0a0a;font-family: 粗体;margin-top: 17px;">{{ student.name }}{{ message }}</li>
       <a href="/logout/"><li style="position: fixed;right: 20px; font-size: 20px;top:22px;color:##080808;font-family: 楷体;margin-top: 10px;">退出</li></a>

    </ul>
</nav>

<div class="container">

  <br>
  <!-- Nav pills -->
  <ul class="nav nav-pills" role="tablist">
    <li class="nav-item">
      <a class="nav-link active" data-toggle="pill" href="#home">个人信息</a>
    </li>
    <li class="nav-item">
      <a class="nav-link" data-toggle="pill" href="#menu1">考试信息</a>
    </li>
    <li class="nav-item">
      <a class="nav-link" data-toggle="pill" href="#menu2">成绩查询</a>
    </li>
  </ul>

  <!-- Tab panes -->
  <div class="tab-content">
    <div id="home" class="container tab-pane active"><br>
      <h3>学生信息</h3>

        <table class="table">
    <thead>
      <tr>
        <th>属性</th>
        <th>信息</th>

      </tr>
    </thead>
    <tbody>
      <tr>
        <td>学号</td>
        <td>{{ student.id }}</td>

      </tr>
      <tr class="table-primary">
        <td>姓名</td>
        <td>{{ student.name }}</td>

      </tr>
      <tr class="table-success">
        <td>性别</td>
        <td>{{ student.sex }}</td>

      </tr>
      <tr class="table-danger">
        <td>学院</td>
        <td>{{ student.dept }}</td>

      </tr>

       <tr class="table-success">
        <td>专业</td>
        <td>{{ student.major }}</td>

      </tr>

      <tr class="table-warning">
        <td>邮箱地址</td>
        <td>{{ student.email }}</td>

      </tr>
      <tr class="table-active">
        <td>出生日期</td>
        <td>{{ student.birth }}</td>

      </tr>

    </tbody>
  </table>
    </div>

    <div id="menu1" class="container tab-pane fade"><br>
      <h3>考试信息</h3>
      <p></p>
        <table class="table">
    <thead>
      <tr>
          <th>学号</th>
        <th>姓名</th>
        <th>考试科目</th>
          <th>考试时间</th>
          <th>操作</th>
      </tr>
    </thead>
    <tbody>
    {#   遍历字典  paper #}
    {% for paper1 in paper %}




     <tr class="table-info">
          <td>{{ student.id }}</td>
          <td>{{ student.name }}</td>
          <td>{{ paper1.subject }}{{ paper2.subject }}</td>
          <td>{{ paper1.examtime }} {{ paper2.examtime }}</td>
          <td>
              <a href="/startExam/?sid={{ student.id }}&subject={{ paper1.subject }}">
              <button class="btn btn-primary" id="toExam+{{ paper1.subject }}">开始考试</button>
             </a>
          </td>
      </tr>
    {% endfor %}



    </tbody>
  </table>
    </div>

    <div id="menu2" class="container tab-pane fade"><br>
      <h3>考试成绩</h3>
      <p></p>
        <table class="table">
        <thead>
          <tr>
            <th>姓名</th>
            <th>科目</th>
            <th>成绩</th>

          </tr>
        </thead>
    <tbody>

    {% for grade1 in grade %}
        <tr class="table-primary">
        <td>{{ student.name }}</td>
        <td>{{ grade1.subject }}</td>
        <td>{{ grade1.grade }}</td>

      </tr>
    {% endfor %}




    </tbody>
  </table>
    </div>
  </div>
</div>


{#学生登录的模态对话框#}
<div class="modal fade" tabindex="-1" role="dialog" id="stuModal">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
                <h4 class="modal-title">学生登陆</h4>
            </div>
            <form class="form-horizontal" action="/studentLogin/" method="post">
            <div class="modal-body">

                    <div class="form-group">
                        <label class="col-sm-3 control-label">学生学号</label>
                        <div class="col-sm-9">
                            <input type="text" class="form-control" name="id" placeholder="输入学号">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="addr" class="col-sm-3 control-label">密码</label>
                        <div class="col-sm-9">
                            <!--
                            <textarea id="addr" class="form-control" rows="3"></textarea>
                            -->
                            <input type="password" class="form-control" name="password" placeholder="输入密码">
                         </div>
                    </div>

            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                <button type="submit" class="btn btn-primary">登陆</button>
            </div>
            </form>
        </div><!-- /.modal-content -->
    </div><!-- /.modal-dialog -->
</div>

{#老师登录的模态对话框#}
<div class="modal fade" tabindex="-1" role="dialog" id="teaModal">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
                <h4 class="modal-title">教师登陆</h4>
            </div>
            <form class="form-horizontal" action="/tea_login/" method="post">
            <div class="modal-body">

                    <div class="form-group">
                        <label for="inputEmail3" class="col-sm-3 control-label">教师工号</label>
                        <div class="col-sm-9">
                            <input type="text" class="form-control" name="id" placeholder="输入教工号">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="addr" class="col-sm-3 control-label">密码</label>
                        <div class="col-sm-9">
                            <!--
                            <textarea id="addr" class="form-control" rows="3"></textarea>
                            -->
                            <input type="password" name="password" placeholder="输入密码" class="form-control">
                         </div>
                    </div>

            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                <button type="submit" class="btn btn-primary">登陆</button>
            </div>
            </form>
        </div><!-- /.modal-content -->
    </div><!-- /.modal-dialog -->
</div>
<div>
  <!--Floot-->
  <p style="  text-align: center;
  background: #337ab7;
  color: #fff;
  padding:20px;margin-top: 18%;">江苏农林职业技术学院 &copy; 2020, All Rights Reserved</p>

</div>

</body>

<script>
    $("#toExam+{{ paper1.subject }}").click(function () {

    });
</script>
</html>

在模板中我们将bootstrap使用cdn引入

8,完成路由的配置,我们打开cmd   到相应位置输入python   manage.py  runserver

9,到浏览器输入http://127.0.0.1:8000/即可看到如下内容:

10,明天我们进行学生登录,教师登录的制作.

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_46244909/article/details/110247189
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-06-12 18:13:12
  • 阅读 ( 1163 )
  • 分类:前端

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢