在线考试系统设计思路

0.模块

近日对在线考试系统有些想法,所以写下来和大家讨论一下,顺便自己也记录一下这些想法。

在线考试系统大致有这几部分内容,下面逐一分析这些模块和需求

 

1.试题库

    创建试题库的意义在于根据知识点创建试题,比如创建一个期中的考试,只需要在试题库中选择知识点12。而期末考试需要选择知识点1234。这样类似将试题分组更有利于试题的重复的利用,创建试卷配置中也能更快的找到试题。

     然后分析一下试题的类型,实际生活中试题类型基本有这几种:单选,判断,多选,填空,问答,作文。前3种题型是可以通过判断自动打分的,后三种只能通过人工阅卷。实际在线考试中很少用到后三种的试题,并且必然消耗大量的人力改卷。所以在这里只考虑单选,判断,多选的考试试题类型。

     试题选项和答案Json的形式保存在试题表中的,主要考虑到这些选项并不常用也很少关于选项的查询,所以试题表不需要在多余的选项表,试题在编辑的和浏览操作可以通过反序列化json内容。最重要的是当生成试卷的时候这些选项json是要复制起来相当方便,这样避免当试卷生成以后,试题被修改造成试卷逻辑混乱。

 

2.试卷配置

  这个模块是系统中最重要的模块,配置一张试卷的流程如下   。

  • 选择考试学员或者配置为开放试卷让学员自由进入考试(练习考试)
  • 其他选项配置试卷,比如:考试开始时间,结束时间,及格分数线
  • 设置考试引用的题库。
  • 设置大题和分数,比如:第一大题单选10题每题5分,第二大题单选10题每题10
  • 组卷就是将题库的题目填充到大题中,组卷可以分自动组卷,或者手动组卷。
  • 生成试卷是根据组卷配置将每张试卷的试题抽取出来,生成一个JSON结果集合。学员考试时,直接读取这个集合。

(要注意的是,生成的试卷JSON结果集合不能修改但是可以停用试卷,防止学员考过以后的试卷被修改,造成之前的数据和当前的不匹配)

 

讨论在线考试系统的性能瓶颈在于,大批量学员同时开始考试时,系统配卷消耗大量的性能。我的处理方式是所有的试卷都预先生成,教师可以选择随机由系统组卷还是手动组卷。系统组卷设置一个组卷份数比如100份,当1000个学生同时进入考试时,将1000张试卷随机分配一张给学员,生成的份数越多随机率越高.如果教师只想给让所有学员考同一份试卷,只需要手动组一张试卷即可

 

 3.学员

      学员是参与考试的主体,学员通过注册或者是后台导入的方式进入系统。如果是注册还需要对应的审核功能。学员有两种方式参加考试和练习,一种是主动选择这张考卷,一种是被推送这张考卷,只有被推送的学生才能能参加考试。有些比较复杂的系统还会有考试的预先报名。通过审核以后才能获取考试的权限。

     学员的表结构相对简单没什么可讨论的,只是建议学员的主表应该和登录表分开,学员应该可以支持多种账号登陆,比如注册邮箱、准考证、身份证等登录方式。

 

 

4.考试过程

      这里我们从学员进入考试说起,当学员点击进入时,随机分配一个试卷给学员。页面加载试卷的内容。 然后开辟一个内存空间用hash形式保存学员根据“本次考试ID_试题ID”保存学员的本次考试的答题记录,学员每次点击选项,都向服务器提交本题的数据,提交数据时需要带上时间戳,防止先提交的数据后到达。当学员不小心关闭页面,或者电脑死机重新打开浏览器的时候,我们将缓存中的数据显示在页面上,让学员继续考试。

     改卷是一个异步的操作,后台一个C/s程序实时扫描数据库,查找已完成答卷并且未改卷的试卷,在内存中提取学员的考试数据一一比对,评卷完成以后将内存的答题内容序列化JSON保存起来(类似试题的保存方式,也可以考虑保存成文本文件)。查看试卷时先加载试卷,然后加载学员的答卷内容。

 

5.Api

  Api模块通过REST的方式提供这几个服务。

  •   考试添加学员
  •   查询成绩(批量或者单个)
  •   创建试卷配置
  •  学员获得试卷(被推送试卷)时发邮件通知,并告知考试地址
  •  提供试卷快速访问地址,也就是学员点击这个地址以后输入账号(或者SSO登录)直接进入考试页面

 

 

 

posted @ 2014-02-23 12:23  coding111  阅读(12372)  评论(11编辑  收藏  举报