第10章项目分析:在线考试系统·259·第四部分工程实践第10章项目分析:在线考试系统本章要点本章介绍一个在线考试系统的设计与开发。利用这个案例进一步巩固本书前面各章节的内容。分别介绍考试系统的数据库结构、考试系统的登录界面、考试系统的考试界面和考试的评分程序。10.1在线考试系统的数据结构考试系统的主要功能是实现在线考试和客观题的自动评分。首先介绍考试系统数据库的设计。该考试系统包含一个用户的成绩表和考试题目表,每个考试科目有一个表,保存考题信息。本考试系统实现两门科目的考试,加上成绩表,总共3个表。表结构如表10-1和10-2所示。表10-1数据库表“成绩单”的结构字段名类型说明学号Varchar(20)学员的学号姓名Varchar(20)学员的姓名,学号和姓名用来验证用户的合法性ASPIntASP科目的成绩,如果没有参加考试该字段为–1XMLIntXML科目的成绩,如果没有参加考试该字段为–1表10-1数据库表“ASP”的结构字段名类型说明类型Varchar(20)题目类型,单选或者多选题号Varchar(20)题号题目Varchar(1000)考题的提干选项1Varchar(500)选项一选项2Varchar(500)选项二选项3Varchar(500)选项三选项4Varchar(500)选项四分数Varchar(20)改题目的分值解答Varchar(20)该题目的解答其他科目的数据库表和表10-2的结构一样。考试系统由四个文件组成,功能如下。(1)TEST.MDB:考试系统的数据库文件(Access2000/XP格式)。(2)Login.asp:考试系统的登录界面。(3)Test.asp:考试系统的考试界面。(4)Score.asp:考试系统的评分界面。ASP精解案例教程·260·10.2考试系统的实现首先进入的登录程序,其界面如图10-1所示。图10-1考试系统的登录界面登录程序主要用于密码的验证,检查登录的用户是否在考试系统的用户表中,如果在而且还没有参加过本科目的考试则可以进入考试。如程序login.asp所示。案例名称:在线考试系统登录界面程序名称:login.asp%@Language=Jscript%%varNo=;varName=;varLesson=;varMsg=;if(Request(Name).Count0){No=Request(No)(1);Name=Request(Name)(1);Lesson=Request(Lesson)(1);SQL=Select*From成绩单;SQL=SQL+Where学号=+'+No+'+And姓名='+Name+';varconn=Server.CreateObject(ADODB.Connection);conn.Open(driver={MicrosoftAccessDriver(*.mdb)};dbq=+Server.MapPath(test.mdb));varrsScore=conn.Execute(SQL);if(rsScore.Eof){第10章项目分析:在线考试系统·261·Msg=你不是合法考生!;}else{if(rsScore(Lesson)!=-1){Msg=你已经考过本科目了!;}else{rsScore.Close();conn.Close();Response.Redirect(Test.asp?+Request.QueryString);}}rsScore.Close();conn.Close();}%HTMLHEADTITLE/TITLE/HEADBODYBGCOLOR=BEIGEH1ALIGN=CENTER在线考试系统/H1HRFORMACTION=login.aspMETHOD=GETP考试科目:SELECTNAME=LessonSIZE=1OPTIONVALUE=ASPASP/OPTIONOPTIONVALUE=XMLXML/OPTION/SELECT/PP姓名:INPUTTYPE=TEXTSIZE=20NAME=NameVALUE=%=Name%/PP学号:INPUTTYPE=TEXTSIZE=20NAME=NoVALUE=%=No%/PPINPUTTYPE=SUBMITNAME=SENDVALUE=开始考试/P/FORMHRFONTColor=red%=Msg%/FONTASP精解案例教程·262·/BODY/HTML首先利用SQL语句在数据库中查询,验证是否有此考生的信息。如果在数据库中找不到,说明该用户没有注册。找不到当前用户时,rsScore.Eof为真。如果在数据库中找到了这个人的信息,但是所选考试科目的分数不为–1,此时说明考生已经考完了。如果考生还没有参加考试,转到test.asp文件,利用Request.QueryString将浏览器地址栏的参数全部读取并传递到test.asp,显示如图10-2所示。图10-2考试主界面考题有单选题和多选题,所有试题都是从该科目的题库中读取的,程序如test.asp所示。案例名称:在线考试系统考试界面程序名称:test.asp%@Language=Jscript%%Lesson=Request(Lesson);No=Request(No);Name=Request(Name);SQL=Select*From+Lesson+OrderBy题号;conn=Server.CreateObject(ADODB.Connection);conn.Open(driver={MicrosoftAccessDriver(*.mdb)};dbq=+Server.MapPath(test.mdb));rs=conn.Execute(SQL);%HTML第10章项目分析:在线考试系统·263·BODYBGCOLOR=BEIGECENTERH1FONTCOLOR=#6699DD在线考试系统/FONT/H1/CENTERH2考试科目--%=Lesson%HR/H2FORMAction=Score.aspMethod=GETINPUTType=HiddenName=LessonValue=%=Lesson%INPUTType=HiddenName=NoValue=%=No%INPUTType=HiddenName=NameValue=%=Name%%while(!rs.EOF){Response.Write(B+rs(题号)+.+Server.HTMLEncode(rs(题目))+rs(类型)+:+rs(分数)+分)/B)Response.Write(div);for(i=1;i5;i++){if(rs(类型)==单选){TestType=Radio;}else{TestType=CheckBox;}Response.Write(INPUTType=+TestType+Name=No+rs(题号)+Value=+i++Server.HTMLEncode(rs(选项+i))+BR);}Response.Write(/div);rs.MoveNext();}%INPUTType=SubmitValue=交卷/FORMHR/BODY/HTML程序首先将上一页提交过来的考生信息和考试科目读出来放到一个变量中,然后执行SQL语句从科目的数据表中读出考题的内容。后面的页面还需要考生的信息,所以这里利用语句“INPUTType=HiddenASP精解案例教程·264·Name=LessonValue=%=Lesson%”将考生的信息保存起来,当考生提交表单时,信息同时被提交。下面利用循环将题目读取出来,并显示成考题的形式,首先从数据库科目表中读出题号、题目、类型和该题的分值,然后利用一个循环,将四个选项显示出来,判断是多选题还是单选题。因为单选多选输出在显示时,type属性不一样,如果是单选输出Radio,如果是多选输出CheckBox。当用户提交时,系统就会调用Score.asp文件来对考生进行自动判分,并将考生的考试信息显示出来,如图10-3所示。图10-3考生的得分显示如果考生按“返回”按扭再重新答卷的话,系统会显示考过的信息如图10-4所示。图10-4出错的信息利用程序score.asp实现自动评分。案例名称:在线考试系统成绩单界面程序名称:score.asp%@Language=Jscript%%Lesson=Request(Lesson)(1);No=Request(No)(1);Name=Request(Name)(1);varconn=Server.CreateObject(ADODB.Connection);conn.Open(driver={MicrosoftAccessDriver(*.mdb)};dbq=+Server.MapPath(test.mdb));varrs=conn.Execute(Select*from+Lesson);%第10章项目分析:在线考试系统·265·HTMLBODYBGCOLOR=BEIGEH2成绩单HR/H2%Score=0while(!rs.EOF){if(Request(No+rs(题号)).Count0){Sel=Request(No+rs(题号))+;Ans=rs(解答);//Response.Write(Sel+Ans+br);if(Ans==Sel){Score=Score+parseInt(rs(分数));//Response.Write(OK);}}rs.MoveNext();}SQL=Select*From成绩单;SQL=SQL+Where学号=+'+No+'+And姓名='+Name+';rsScore=conn.Execute(SQL);if(rsScore(Lesson)==-1){conn.Execute(update成绩单set+Lesson+=+parseInt(Score)+where学号=+'+No+'+And姓名='+Name+');rsScore=conn.Execute(SQL);}else{Response.Write(script{alert('你已经考过了')}/script);}%%=Name%同志你好,你的考试成绩统计为:BRCENTERTABLEBORDER=2BGCOLOR=#F1F1F1WIDTH=80%TRBGCOLOR=#DDDDDDTD你参加的科目/TDTD你的分数/TD/TRTRTDASP/TDTDAlign=Right%=TestResult(rsScore(ASP))%/TD/TRASP精解案例教程·266·TRTDXML/TDTDAlign=Right%=TestResult(rsScore(XML))%/TD/TR/TABLE/centerHRAHREF=login.asp?No=%=No%+Name=%=Name%参加其他科目考试/A/BODY/HTML%functionTestResult(Score){if(-1==Score){return你还没有考试;}elseif(Score60){returnFONTColor=Red+Score+/FONT;}else{returnScore;}conn.close();}%程序首先将变量Score设置为0,然后利用一个循环从数据库中分别读出每题的标准答案,与考生提交的答案比较,如果相同则将该题的分值从数据库中读出来,并累加到Score变量。判