1、徐州工业职业技术学院C#高级开发实训说明书C#高级开发实训说明书设计题目名称:在线考试系统学 生 姓 名:专业名称:软件技术班 级:学 制:三学 号:学历层次:专 科指导教师:评 阅 人: C#高级开发实训成绩评定书 专业、班级 姓名 日期 1、设计题目 在线考试系统 2、设计指导教师(签名) 3、设计评阅人(签名) 评阅日期 4、评定意见及成绩 年 月 日目录一项目开发背景4二项目功能需求分析4三项目数据库设计51、数据库概念设计:52、数据库逻辑设计:10四公共类设计13五完成的主要功能141.功能1:登录模块设计142.功能2名称:抽取试题模块设计153.功能3:试题类别管理模块设计20
2、4功能4:试卷定制管理员模块设计255功能5:用户试卷管理员模块设计286功能6:用户信息管理员模块设计33六、致谢37一项目开发背景摘要:近年来,计算机技术的迅猛发展,给传统的办学提出了新的模式。绝大部分高等院校都已接入互联网并建成校园网,各校的硬件设施也已经比较完善,一现代计算机技术、网络技术为基础的数字化教学主要朝着信息化、网络化、现代化的目标迈进。开发无纸化在线考试系统,目的在于探索一种以互联网为基础的考试模式。通过这种新的模式提高了考试工作效率和标准化水平,使学校管理者、教师和学生在任何时候、任何地点都可以通过网络进行在线考试。关键词:信息化、网络化、在线考试系统二项目功能需求分析介
3、绍系统计划设计的主要功能,简要描述功能的实现方案。可以绘制功能框图。在线考试系统前台功能结构图登录模块抽取试题模块退出系统选择考试科目开始考试修改密码图1:在线考试系统前台功能结构图在线考试系统后台管理管理员登录试题类别管理试卷定制维护用户试卷管理用户信息管理个人信息管理后台管理模块退出系统图2:在线考试系统后台功能结构图三项目数据库设计1、数据库概念设计:开发在线考试系统时,为了灵活地维护系统,设计了后台管理员模块,通过后台管理员模块可以方便地堆整个在线考试系统进行维护。这时,必须建立一个数据表用于存储所有的管理员信息。管理员信息实体E-R图如图3所示。管理员信息表系统编号登录名登录密码角色
4、图3:管理员信息实体E-R图当考生成功登录在线考试系统后,可以根据需要选择考试的科目,考生不同可能选择的考试科目也会不同,系统必须提供一些参加考试的科目,供考生选择。这时,在数据库中应该建立一个存储所有参加考试科目的数据库表。开始科目信息实体E-R图如图4所示:系统编号考试科目名称考试科目信息表图4:考试科目信息实体E-R图考生选择考试科目,开始在线考试。在规定时间内必须完成考试,否则系统会自动提交试卷,并且将考生的考试成绩保存在数据表中。这样,方便后期查询考生是否参加过考试,以及查询咯是考试得分。考试成绩信息实体E-R图如:5所示:考试成绩信息表系统编号考生考号考试科目名称剩余考试时间考试时
5、间考试得分图5:考试成绩信息实体E-R图在数据库中建立一个用于存储考生各项信息的数据表。其中包括考生登录时的账号(考生编号或考生学号)及密码。若某个考生参加了考试,系统会将考生答卷的最后得分保存到此数据库中,以便教师或考生对开始历史记录进行查询。考生信息实体E-R图如图6所示:试卷类型信息表系统编号课程编号试卷状态试卷名称图6:试卷类型信息实体E-R图为了方便后台管理员对考试试题及考生考试结果进行管理,在数据库中必须建立一个数据表用于存储试卷信息。试卷详细信息实体E-R图如:7所示:试卷详细信息表系统编号试卷编号试卷类型分数试题编号图7:试卷详细信息实体E-R图在线考试系统中的考生答题答案是保
6、存在数据库中的,所以必须在数据库中建立一个数据表用于存储考生所给的答案信息。考生答案信息实体E-R图如图8所示:考生答案信息表系统编号考生编号试卷编号考试时间考生答案分数试题类型题目编号图8:考生答案信息实体E-R图在线考试系统中的考试单选题是通过对数据库中存储的所有试题产生的,所以必须在数据库中建立一个数据表用于存储单选试题信息,其中包括试题题目、试题的4个备选答案、正确答案以及所属的科目。单选题信息实体E-R图如图9所示:单选题信息表系统编号课程编号试题题目试题正确答案试题答案D试题答案C试题答案A试题答案B图9:试题信息实体E-R图在线考试系统中的考试中的判断题是通过对数据库中存储的所有
7、试题产生的,所以必须在数据库中建立一个数据表用于存储判断试题信息,其中包括试题题目、试题的正确答案和错误答案2个选项、正确答案以及所属的科目。判断题信息实体E-R图如图10所示:判断题信息表系统编号课程编号试题正确答案试题题目图10:判断题信息实体E-R图在线考试系统中的考试中的多选题是通过对数据库中存储的试题产生的,所以必须在数据库中建立一个数据表用于存储多选试题信息,其中包括试题题目、试题的4个备选答案、正确答案以及所属的科目。多选题信息实体E-R图如图11所示:多选题信息表系统编号课程编号试题题目试题正确答案试题答案D试题答案C试题答案A试题答案B图11:多选题信息实体E-R图在线考试系
8、统中的考试中的简答题是通过对数据库中存储的试题产生的,所以必须在数据库中建立一个数据表用于存储简答试题信息,其中包括试题题目、试题的答案、及所属的科目。试题信息实体E-R图如图12所示:问答题信息表系统编号课程编号试题正确答案试题题目图12:问答题信息实体E-R图2、数据库逻辑设计:根据设计好的E_R图在数据库中创建各表,系统数据库中各表的结构如下。表1:管理员用户表字段名数据类型是否为空约束备注UserIDvarchar(50)否主键编号UserNamevarchar(50)是管理员姓名UserPwdvarchar(64)是管理员登录密码RoleIdint是角色表2:考试科目信息表字段名数据
9、类型是否允许约束备注IDint否主键系统编号Namevarchar(200)是考试科目名称表3:考试成绩信息表字段名数据类型是否为空约束备注IDInt否主键系统编号UserIDvarchar(50)是参加考试的考生编号PaperIDInt是考试科目编号ScoreInt是考生得分ExamTimedatetime是参加考试的时间JudgeTimedatetime是考试剩余时间表4:试卷类型信息表字段名数据类型是否为空约束备注PaperIDInt否主键系统编号CourseIDInt否外键课程编号PaperNameInt否外键试卷名称PaperStatebit否外键试卷类型表5:试卷详细信息表字段名数
10、据类型是否为空约束备注IDInt是主键系统编号PaperIDvarchar(200)否外键试卷编号Typevarchar(200)否外键试题类型TitleIDvarchar(200)否外键题目编号Markvarchar(200)否分数表6:考生答案信息表字段名数据类型是否为空约束备注IDInt是主键系统编号UserIDvarchar(200)否外键考生编号PaperIDvarchar(200)否外键试卷编号Typevarchar(200)否外键试题类型TitleIDvarchar(200)否题目编号Markvarchar(200)否分数UserAnswervarchar(200)否考生答案Ex
11、amTimeInt否考试时间表7:单选题题信息表字段名数据类型是否为空约束备注IDInt否主键系统编号CourseIDInt否外键课程编号TitleVarchar1000)否外键题目AnswerAvarchar(500)否外键备选答案AAnswerBvarchar(500)否备选答案BAnswerCvarchar(500)否备选答案CAnswerDvarchar(500)否备选答案DAnswervarchar(2)否正确答案表8 :判断题信息表字段名数据类型是否为空约束备注IDInt否主键系统编号CourseIDInt否外键课程编号TitleVarchar1000)否外键题目Answerbit
12、否正确答案表9 :多选题信息表字段名数据类型是否为空约束备注IDInt否主键系统编号CourseIDInt否外键课程编号TitleVarchar1000)否外键题目AnswerAvarchar(500)否外键备选答案AAnswerBvarchar(500)否备选答案BAnswerCvarchar(500)否备选答案CAnswerDvarchar(500)否备选答案DAnswervarchar(2)否正确答案表10 :简答题信息表字段名数据类型是否为空约束备注IDInt否主键系统编号CourseIDInt否外键课程编号TitleVarchar1000)否外键题目AnswerVarchar1000
13、)否正确答案表11 :填空题信息表字段名数据类型是否为空约束备注IDInt否主键系统编号CourseIDInt否外键课程编号FrontTitlevarchar(500)否外键题目BackTitlevarchar(500)否题目Answervarchar(200)正确答案四公共类设计在开发项目中以类的形式来组织、封建一些常用的方法和事件,不仅可以提高代码的重用率,也大大方便了代码的管理。本系统中通过创建了三层架构OnLineExamBLL层、OnLineExamDAL层和一个公共类UserService设计,其中包含GetConnection ()方法、SelectAll()方法。具体代码如下:
14、 public class UserServicepublic List SelectAll(string PaperID) using (SqlConnection conn = DBHelp.GetConnection() string sql = select ID,Score.UserID,PaperID,Score,ExamTime,JudgeTime,Users.UserName from Score,Users where Score.UserID=Users.UserID and PaperID= + PaperID + ; SqlCommand cmd = conn.Crea
15、teCommand(); cmd.CommandText = sql; conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); List list = new List(); while (dr.Read() Users user = new Users(); Scores scores = new Scores(); scores.ID = Convert.ToInt32(drID); scores.UserID = drUserID.ToString(); user.UserName = drUserName.ToString(); sco
16、res.UserName = user.UserName; scores.PaperID = Convert.ToInt32(drPaperID); scores.Score = Convert.ToInt32(drScore); scores.ExamTime = Convert.ToDateTime(drExamTime); scores.JudgeTime = Convert.ToDateTime(drJudgeTime);list.Add(scores); dr.Close();conn.Close();return list;public static SqlConnection G
17、etConnection() string connStr = ConfigurationManager.ConnectionStringsConnectionString.ConnectionString; SqlConnection conn = new SqlConnection(connStr); return conn;五完成的主要功能1.功能1:登录模块设计(1)系统默认是不允许匿名登录的,只有使用管理员分配的账号和密码才能登录在线考试系统参加考试,这时就需要通过登录模块验证登录用户的合法性。登录模块是在线考试系统的第一道安全屏障,其运行结果如图所示:图5-1 用户登录(2) 实现
18、过程:新建一个网页,命名为Login.aspx,主要实现系统的登录功能。主要控件如表7所示:表5-1:登录界面用到的主要控件 控件类型控件ID主要属性设置用途TextBoxtxtUserID无输入登录用户名txtPwdTextModed属性设置为Password输入登录用户密码CheckBoxcbxRemeberUserChecked属性设置为True记住用户名RequiredFieldValidatorRequiredFieldValidator1Controltovalidate属性设置为txtUserID进行验证RequiredFieldValidator2Controltovalida
19、te属性设置为txtPwd进行验证ButtonbtloginText属性设置为“登录”登录btconcelText属性设置为“取消”取消输入账号和密码等信息确认无误后,单机“登录“进行登录。程序首先会判断输入的用户名是否正确,如果正确则根据选择的用户名调用公共类中相应的方法验证账号和密码是否正确,如果正确,则会转向与登录身份符合的页面(3)实现代码:protected void Page_Load(object sender, EventArgs e) this.txtUserID.Focus(); if (!IsPostBack)try HttpCookie readcookie = Req
20、uest.CookiesUsersID; this.txtUserID.Text = readcookie.Value; catch (Exception) this.txtUserID.Text = string.Empty; protected void imgBtnLogin_Click(object sender, ImageClickEventArgs e)string usersId = txtUserID.Text.Trim(); string pwdMd5 = System.Web.Security.FormsAuthentication.HashPasswordForStor
21、ingInConfigFile(txtPwd.Text.Trim(), MD5).ToString(); Users u = new Users(); u.UserID = usersId; u.UserPwd = pwdMd5; bool success = UserManager.Login(ref u); if (success) if (u.UserPwd = pwdMd5)/输入密码与用户密码相同 if (this.cbxRemeberUser.Checked) if (object.Equals(Request.CookiesUsersID, null) CreateCookie(
22、); else CreateCookie(); SessionuserID = txtUserID.Text.Trim();/存储用户编号 Response.Redirect(Default.aspx);/转向管理员操作界面 else lblMessage.Text = 您输入的密码错误!; else lblMessage.Text = 该用户不存在!; private void CreateCookie() HttpCookie cookie = new HttpCookie(UsersID); if (this.cbxRemeberUser.Checked) cookie.Value =
23、txtUserID.Text; cookie.Expires = DateTime.MaxValue; Response.AppendCookie(cookie);2.功能2名称:抽取试题模块设计(1)开发在线考试系统过程中,需要考虑如何将试题显示在页面上,即如何将试题从数据库中方读取出来。比较合理的做法是将所有试题信息存储在数据库中,然后随机抽取若干道试题,动态地显示在页面当中。为了实现此功能,设计出抽取试题模块,运行结果如图所示;图5-2:随机抽取试题(2)实现过程:在随机抽取试题之前,考生要选择考试的科目,然后根据选择的科目随机从数据库中抽取试题,所以考生选择考试科目是随机抽取试题的条件
24、,其运行结果如图所示:图5-3:选择考试科目新建一个网页,命名为UserTest.aspx,作为抽取试题页面及考试页面。该页面用到的主要控件如图所示:表5-2:抽取试题页面用到的主要控件控件类型控件ID主要属性设置用途LabellblPaperName无显示考试科目labUser无显示考生姓名TextBoxtimeBox无显示考试用时RepeaterRepeater1无显示从数据库中抽取的试题Buttonbtnsubmit无提交试卷当页面加载时,根据考生选择的科目在数据库中随机抽取试题,并显示在Repeater控件中。(3)实现代码如下:protected int singeCount = 1
25、; protected void Page_Load(object sender, EventArgs e) if (!Page.IsPostBack) if (SessionuserID = null) Response.Redirect(Login.aspx); else string userId = SessionuserID.ToString(); string userName = UserManager.GetUserName(userId); Label i1 = (Label)Page.FindControl(labUser); i1.Text = userName; lbl
26、PaperName.Text = SessionPaperName.ToString(); GetParperAll(); private void GetParperAll() IEnumerable list = sqlSingleMark.Select(DataSourceSelectArguments.Empty); foreach (DataRowView o in list) labSingle.Text = o0.ToString(); break; IEnumerable list1 = SqlMultiMark.Select(DataSourceSelectArguments
27、.Empty); foreach (DataRowView o in list1) Label3.Text = o0.ToString(); break; IEnumerable list2 = SqlFillMark.Select(DataSourceSelectArguments.Empty); foreach (DataRowView o in list2) Label5.Text = o0.ToString(); break;IEnumerable list3 = SqlJudgeMark.Select(DataSourceSelectArguments.Empty); foreach
28、 (DataRowView o in list3) Label4.Text = o0.ToString(); break; IEnumerable list4 = SqlQuestionMark.Select(DataSourceSelectArguments.Empty); foreach (DataRowView o in list4) Label6.Text = o0.ToString(); break; protected void imgBtnSubmit_Click(object sender, ImageClickEventArgs e) NewMethod(); private
29、 void NewMethod() string Label = labSingle.Text;/单选分数 string paperid = SessionPaperID.ToString(); string UserId = SessionuserID.ToString(); DBHelp db = new DBHelp(); foreach (RepeaterItem item in singleRep.Items) HiddenField titleId = item.FindControl(titleId) as HiddenField; string id = (string)tit
30、leId.Value; string str = ; if (RadioButton)item.FindControl(rbA).Checked) str = A; else if (RadioButton)item.FindControl(rbB).Checked) str = B; else if (RadioButton)item.FindControl(rbC).Checked) str = C; else if (RadioButton)item.FindControl(rbD).Checked) str = D; string single = insert into UserAn
31、swer(UserID,PaperID,Type,TitleID,Mark,UserAnswer,ExamTime) values( + UserId + , + paperid + ,单选题, + id + , + Label + , + str + , + DateTime.Now.ToString() + ); db.Insert(single); string labeM = Label3.Text;/多选分数 foreach (RepeaterItem item in Repeater2.Items) HiddenField titleId = item.FindControl(ti
32、tleId) as HiddenField; string id = (string)titleId.Value; string str = ; if (CheckBox)item.FindControl(CheckBox1).Checked) str += A; if (CheckBox)item.FindControl(CheckBox2).Checked) str += B; if (CheckBox)item.FindControl(CheckBox3).Checked) str += C; if (CheckBox)item.FindControl(CheckBox4).Checke
33、d) str += D; string Multi = insert into UserAnswer(UserID,PaperID,Type,TitleID,Mark,UserAnswer,ExamTime) values( + UserId + , + paperid + ,多选题, + id + , + labeM + , + str + , + DateTime.Now.ToString() + ); db.Insert(Multi); string labeJ = Label4.Text;/判断分数 foreach (RepeaterItem item in Repeater3.Ite
34、ms) HiddenField titleId = item.FindControl(titleId) as HiddenField; string id = (string)titleId.Value; string str = Convert.ToString(false); if (RadioButton)item.FindControl(rbA).Checked) str = Convert.ToString(true); else if (RadioButton)item.FindControl(rbB).Checked) str = Convert.ToString(false);
35、 string Judge = insert into UserAnswer(UserID,PaperID,Type,TitleID,Mark,UserAnswer,ExamTime) values( + UserId + , + paperid + ,判断题, + id + , + labeJ + , + str + , + DateTime.Now.ToString() + ); db.Insert(Judge); string labeF = Label5.Text;/填空分数 foreach (RepeaterItem item in Repeater1.Items) HiddenFi
36、eld titleId = item.FindControl(titleId) as HiddenField; string id = (string)titleId.Value; string str = ; str = (TextBox)item.FindControl(TextBox1).Text.Trim(); string Fill = insert into UserAnswer(UserID,PaperID,Type,TitleID,Mark,UserAnswer,ExamTime) values( + UserId + , + paperid + ,填空题, + id + ,
37、+ labeF + , + str + , + DateTime.Now.ToString() + ); db.Insert(Fill); string labeQ = Label6.Text;/问答分数 foreach (RepeaterItem item in Repeater4.Items) HiddenField titleId = item.FindControl(titleId) as HiddenField; string id = (string)titleId.Value; string str = ; str = (TextBox)item.FindControl(TextBox2).Text.Trim(); string Que = insert into UserAnswer(UserID,PaperID,Type,TitleID,Mark,UserAnswer,ExamTime) values( + UserId