文章同步发于公众号:1024程序开发者社区(cxkfzsq1024)
近期给朋友帮忙,使用Django+xadmin开发了一个简单在线考试系统,开发的整个过程有一些收获,现就如何从0开始打造一个在线考试系统写几期文章,抛砖引玉,多批评指正。先上图:
登陆视图
/1/前言
开发环境:
Python:3.5.2
Django:2.0.2
后台管理:
Xadmin
项目功能:
- 完整的用户注册、登陆和个人中心功能;
- 具有试卷列表、随机抽题功能;
- 具有试卷答题、提交、阅卷和时间限制功能;
- 具有考试公平性设计,拒绝后退、用户验证等;
- 具有调看个人历史成绩和成绩可视化的功能;
- 具有导航栏功能,包含首页、历史成绩和个人中心。
/2/models设计
models设计是一个项目的开端,后台的管理和前端的渲染无非就是对数据库的增删改查,所以models设计的好坏对整个项目的开发起着至关重要的作用,搞不好从头返工是非常酸爽的。
本项目models分三部分:
1.用户信息:
2.考试系统
models
3.用户考试
models
/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
以上是建立在线考试系统的第一部分,本次内容就到这里,说的比较浅,还请各路大神指点。
关注公众号,送海量学习资源~
//猜你喜欢//
网友评论