Django+xadmin打造在线考试系统(一)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/id_iot/article/details/88629526

文章同步发于公众号:1024程序开发者社区(cxkfzsq1024)

近期给朋友帮忙,使用Django+xadmin开发了一个简单在线考试系统,开发的整个过程有一些收获,现就如何从0开始打造一个在线考试系统写几期文章,抛砖引玉,多批评指正。先上图:
在这里插入图片描述
/1/前言

开发环境:
Python:3.5.2
Django:2.0.2
后台管理:
Xadmin
项目功能:

  1. 完整的用户注册、登陆和个人中心功能;
  2. 具有试卷列表、随机抽题功能;
  3. 具有试卷答题、提交、阅卷和时间限制功能;
  4. 具有考试公平性设计,拒绝后退、用户验证等;
  5. 具有调看个人历史成绩和成绩可视化的功能;
  6. 具有导航栏功能,包含首页、历史成绩和个人中心。

/2/models设计

models设计是一个项目的开端,后台的管理和前端的渲染无非就是对数据库的增删改查,所以models设计的好坏对整个项目的开发起着至关重要的作用,搞不好从头返工是非常酸爽的。
本项目models分三部分:
1.用户信息:
在这里插入图片描述
2.考试系统
在这里插入图片描述
3.用户考试
在这里插入图片描述
/3/虚拟化环境和工程建立

虚拟环境旨在为程序运行搭建一个独立的环境,避免受到其他工程的影响,也是工程部署的一个重要手段。
通过“virtualenv venv --no-site-packages”建立虚拟环境
通过“venv\Scripts\activate”激活虚拟环境
在其中安装所需的Python的包,如:“pip install django”
准备工作做完后,输入:
“django-admin startproject testonline"建立工程
因为model分为三个部分,因此建立三个APP
“python manage.py startapp users”
“python manage.py startapp operation”
“python manage.py startapp test”
分别在三个APP的model文件中定义第二部分的模型,部分代码如下:

class UserProfile(AbstractUser):
    gender_choices = (
        ('male','男'),
        ('female','女'),
    )
    danwei_choices = (
        ('tengxun','腾讯'),
        ('ali','阿里'),
    )
    leibie_choices = (
        ('guanliyuan','管理员'),
        ('danweiguanliyuan','单位管理员'),
        ('kaosheng','考生'),
    )
    zhiwu_choices = (
        ('jingli','经理'),
        ('zhiyuan','职员'),

    )
    nickname = models.CharField(max_length=50, verbose_name=u"姓名", default= "")
    zhiwu = models.CharField('职务',max_length=50,choices=zhiwu_choices,default='')
    birthday = models.DateField('生日',null=True,blank=True)
    gender = models.CharField('性别',max_length=50,choices=gender_choices,default='male')
    leibie = models.CharField('类别',max_length=50,choices=leibie_choices,default='kaosheng')
    danwei = models.CharField('单位',max_length=50,choices=danwei_choices,default='')
    phone = models.CharField('电话',max_length=50,null=True,blank=True)
    image = models.ImageField(upload_to='image/%Y%m',default='image/default.png',max_length=100)

class UserAnswerLog(models.Model):
    user = models.ForeignKey(UserProfile, verbose_name=u"用户",on_delete=models.CASCADE)
    course = models.ForeignKey(CourseList, verbose_name=u"课程",on_delete=models.CASCADE)
    paper = models.ForeignKey(Paper,verbose_name=u"试卷",on_delete=models.CASCADE)
    answer = models.TextField(verbose_name=u"用户答案")
    score = models.IntegerField(verbose_name=u"得分")
    add_time = models.DateField(default=datetime.now, verbose_name=u"作答时间")

class UserScore(models.Model):
    user = models.ForeignKey(UserProfile, verbose_name=u"用户",on_delete=models.CASCADE)
    paper = models.ForeignKey(PaperList, verbose_name=u"试卷",on_delete=models.CASCADE)
    total = models.IntegerField(verbose_name=u"总分", default=0)
    add_time = models.DateField(verbose_name=u"录入时间",default=datetime.now)
    nickname = models.CharField(max_length=50, verbose_name=u"姓名", default= "")
    zhiwu = models.CharField(verbose_name=u'职务',max_length=50,default='')
    leibie = models.CharField(verbose_name=u'类别',max_length=50,default='')
    danwei = models.CharField(verbose_name=u'单位',max_length=50,default='')

class CourseList(models.Model):
    name = models.CharField(max_length=100, verbose_name=u"科目名", default="")
    decs = models.CharField(max_length=500, verbose_name=u"科目说明", default="")
    add_time = models.DateField(default=datetime.now, verbose_name=u"添加时间")

class Question(models.Model):
    course = models.ForeignKey(CourseList, verbose_name=u"考试科目",on_delete=models.CASCADE)
    questionType = models.CharField(max_length=2, choices=(("xz", u"选择题"), ("pd", u"判断题"), ("zg", u"问答")), default="xz", verbose_name=u"题目类型")
    content = models.TextField(verbose_name=u"题目内容")
    answer = models.TextField(verbose_name=u"正确答案")
    choice_a = models.TextField(verbose_name=u"A选项", default="A.")
    choice_b = models.TextField(verbose_name=u"B选项", default="B.")
    choice_c = models.TextField(verbose_name=u"C选项", default="C.")
    choice_d = models.TextField(verbose_name=u"D选项", default="D.")
    score = models.IntegerField(verbose_name=u"分值", default=0)
    note = models.TextField(verbose_name=u"备注信息", default= u"问答题在此处做答")
    boolt = models.TextField(verbose_name=u"判断正误正确选项", default= "True")
    boolf = models.TextField(verbose_name=u"判断正误错误选项", default= "False")
    add_time = models.DateField(default=datetime.now, verbose_name=u"添加时间")

class PaperList(models.Model):#用于查看往期考试题目可能不用
    course = models.ForeignKey(CourseList, verbose_name=u"所属课程",on_delete=models.CASCADE)
    name = models.CharField(max_length=100, verbose_name=u"试卷名", default=u"")
    is_allow = models.BooleanField(default=False, verbose_name=u"是否启用")
    add_time = models.DateField(default=datetime.now, verbose_name=u"添加时间")

class Paper(models.Model):#题目如何存储
    course = models.ForeignKey(CourseList, verbose_name=u"所属课程", default=1,on_delete=models.CASCADE)
    question = models.ForeignKey(Question, verbose_name=u"题目",on_delete=models.CASCADE)
    paper_name = models.ForeignKey(PaperList, verbose_name=u"试卷名称",on_delete=models.CASCADE)
    add_time = models.DateField(default=datetime.now, verbose_name=u"添加时间")

class PaperCache(models.Model):#题目如何存储
    question = models.IntegerField(verbose_name=u"题目")
    add_time = models.DateField(default=datetime.now, verbose_name=u"添加时间")
    user = models.ForeignKey(UserProfile, verbose_name=u"用户",on_delete=models.CASCADE)

/4/MySQL的使用和生成数据库

通过在settings.py中定义数据库调用MySQL。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '',
		'USER': 'root',          #账号
        'PASSWORD': '',      #密码
        'HOST': '127.0.0.1',    #IP
        'PORT': '3306',
    }
}

通过
“python manage.py makemigrations
python manage.py migrate”
进行数据库迁移生成,最终结果如图所示:
image
以上是建立在线考试系统的第一部分,本次内容就到这里,说的比较浅,还请各路大神指点。

关注公众号,送海量学习资源~
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/id_iot/article/details/88629526