南 京 理 工 大 学
课程设计说明书
组员 : |
刘雨薇 |
学 号: |
914106840606 |
|
张钰 |
|
914106840310 |
|
张欢欢 |
|
914106840509 |
|
彭姿容 |
|
914106840501 |
学院(系): |
计算机科学与工程学院 |
||
专业 |
计算机科学与技术专业 |
||
题目 |
计算机网络课程测试系统 |
2016 年 11 月
目录
一、概述 ·················································3
二、需求分析··············································4
三、系统设计··············································8
四、系统实施··············································14
五、系统测试·············································39六、收获和体会 ···········································69七、附录·················································70
八、参考文献············································70
一、概述
1、项目背景:
a. 工程名称:江苏省南京理工大学计算机网络课程练习测验系统
b. 本项目的任务提出者:南京理工大学计算机学院
本项目的开发者:南京理工大学计算机学院14级9141062302班刘雨薇、张钰、彭姿容、张欢欢
本项目的用户:南京理工大学计算机网络课程师生及管理员
实现该软件的计算中心:南京理工大学
c. 产品所有权: 南京理工大学计算机学院14级9141062302班刘雨薇、张钰、彭姿容、张欢欢
d.当前的运行现场:个人计算机上。
e.计划的运行现场:部署到特定的服务器上,所有远程的计算机能够访问。
2、编写目的:
信息社会高速发展的当下,信息管理日益成熟。信息技术在管理上的应用也越来越深入和广泛。管理信息系统是一个不断发展的新型学科,任何一个单位要生存要发展,就要高效率地把内部活动有机地组织起来,建立与自身特点相适应的管理信息系统。在高校,课堂测试时老师常用的手段,但是学生太多,信息量太大,出题管理起来就很麻烦,所以设计一个智能的课堂测试系统可以大大的提高效率,也可以很大程度的减少教师的工作量与工作时间,对软件进行需求分析,以便设计可用于教育单位,达到学生可以在这个系统上完成课堂测试,也免去像传统那样收发作业的麻烦。软件完成后,能让教师更好的掌握学生对这门课的理解程度学习的怎么样,方便更好的教学,同时学生想了解自己的掌握程度也可以随时在线测试,这样教育工作才会越来越好。
基于这个目的,我们小组打算就做一个课堂测试系统。
本系统的软件实现计划采用Visual Studio 2013.NET框架,SQL Server 2014数据库,因此具有很强的应用性、可维护性、可扩展性以及重复使用的能力,可以很方便进行版本控制、数据库操作等复杂度比较高的控制。本项目的成果提供了一个课堂测验练习系统,学生可以按照教师的建议或各自的计划对所学知识进行自我测验;教师可以通过此平台提供的环境对学生的学习情况进行动态管理,并依据网站记录的考试成绩对每一位学生进行客观的综合评价。
应用.NET程序设计,开发WEB应用程序,从而完善课程的网络畅通程度,其中采用的B/S模式,让客户端从繁重的数据计算的劳动中解脱出来,C/S模式又提高了软件的可控与安全性,这种三层模式的数据库访问与管理方式让我们数据库的管理与访问变得更加高效快捷。
保证软件开发的质量、需求的完整与可追溯性,为开发人员、维护人员、客户之间提供共同的协议,为该课程练习测验系统做功能性描述。
本说明书的预期读者为客户、需求分析人员、测试人员、用户文档编写者及管理员。
3、软件定义:
课程练习测验系统:它是由南京理工大学计算机学院14级软件课程设计第9开发小组完全自主开发设计的课程练习测验软件,以江苏省南京理工大学计算机网络课程为基本元素、用vs2013和SQL Server 2014来实现其功能的软件。
4、开发环境:
Microsoft Visual Studio 2013、SQL Server 2014
二、需求分析
1、问题的提出:
为开发高效便捷的课堂测试系统,在计算机上为学生提供课堂测试的平台,进一步提高办学效益,也为广大师生和学生提高工作效率,进一步实现课堂测试系统工作流程的系统化、规范化和自动化。根据计算机网络课程的课程性质以及考试模式,开发一个可提供学生对自身学习情况进行检测的课堂测试系统,在平台上通过老师出题、学生答题的模式实现老师与学生之间的交互,进一步便利学生和老师的需求,规范教学模式,从而提高了课堂的效率。
2、系统的业务功能分析:
本软件使用者主要为系统管理员,大学老师以及学生。管理员拥有最高权限,可以实现增删用户、更新系统信息、编辑题库、查询测试结果等功能;教师可实现查询修改个人信息、查询并修改学生答案以及增删试题等功能;学生则可以查询修改个人信息以及查询历史成绩。各种类型的用户功能不同,权限也各不相同。
本测试系统共分为八大模块:登录模块、个人信息模块、题库模块、学生做题模块、老师批改试卷模块、查看答案模块和管理人员模块,各个模块相互关联,并实现所对应的功能。
3、系统的业务流程分析:
本系统主要实现的是三种不同的用户学生、老师和管理员所具有的不同的功能,三中用户必须用已经注册的用户名和密码登录系统,其次才能实现其角色所对应的功能,学生在登录系统之后可选择查询修改个人信息、开始测试、查看成绩以及联系老师等操作;教师在登录系统之后可在自己的界面选择查询修改个人信息、密码重置、添加修改删除学生成绩、查询学生成绩、添加修改删除题库和修改试卷等操作;管理员在登录系统之后可选择进行添加修改删除用户、密码重置、查看修改个人信息、添加修改删除题库和添加修改删除查询学生成绩等操作。
4、需完成的功能:
管理员功能:1)添加、修改、删除用户(教师/学生)
2)找回密码
3)查询修改个人信息
4)添加、修改、删除测试题库
5)删除、查询学生成绩
教师功能:1)查询修改个人信息
2)找回密码
3)添加、修改、删除学生成绩(批改练习)
4)查询学生成绩
5)添加、修改删除测试题库
6)批改试卷
学生功能:1)查询修改个人信息
2)开始测试
3)查询测试成绩
4)找回密码
5、数据流图:
图2.1 0层数据流图
图2.2 1层数据流图
2层数据流图:
图2.3 管理员数据流图
图2.4 教师数据流图
图2.5 学生数据流图
6、数据字典
表2.1 数据结构
数据结构名 |
含义说明 |
组成 |
Users |
用户的各项信息 |
账号,姓名,密码,性别,联系方式,专业,角色,安全问题,安全密码,任课教师(可以为空) |
Paper |
试题信息 |
试卷编号,章节,试卷名称,试卷是否可用 |
PaperDetail |
一套试卷详细信息 |
编号,试卷编号,题目类型,题目编号,分值 |
UserAnswer |
用户完成试卷情况 |
编号,题目序号,学生学号,试卷ID,改卷老师,得分,所做答案,完成时间 |
Scores |
成绩信息 |
成绩编号,学生学号,试卷ID,得分,考试时间批改时间,评语 |
Roles |
角色信息 |
编号,角色名称 |
Course |
章节信息 |
编号,章节名称 |
Department |
部门名称 |
编号,专业名称 |
SingleProble |
单选题信息 |
编号,章节,题目,选项A、B、C、D,答案,已选用次数 |
FillblankProblen |
填空题信息 |
编号,章节,题目前描述,题目后描述,答案,已选用次数 |
JudgeProblem |
判断题信息 |
编号,章节,题目,答案,已选用次数 |
QuestionProblem |
问答题信息 |
编号,章节,题目,答案,已选用次数 |
表2.2 存储数据
编号 |
存储数据存储名 |
说明 |
输入的数据流 |
输出的数据流 |
组成 |
1 |
用户信息存储 |
用于存储用户的各项信息 |
用户的基本信息 |
用户信息表 |
账号,姓名,密码,性别,联系方式,专业,角色,安全问题,安全密码,任课教师(可以为空) |
2 |
试题信息存储 |
试题的各项存储 |
试题的基本信息 |
试题信息表 |
试卷编号,章节,试卷名称,试卷是否可用,编号,试卷编号,题目类型,题目编号,分值,编号,章节,题目,答案 |
3 |
成绩信息存储 |
用于存储成绩的各项信息 |
成绩的基本信息 |
成绩信息表 |
成绩编号,学生学号,试卷ID,得分,考试时间批改时间,评语 |
4 |
答题信息存储 |
答题信息的各项存储 |
答题的基本信息 |
学生答题信息表 |
编号,题目序号,学生学号,试卷ID,改卷老师,得分,所做答案,完成时间 |
三、系统设计
1、数据表:
(1)、数据库的关系模式:
Users(UserID,UserNam,UserPwd,UserSex,DepartmentID,RoleID,SafeQuestion,SafeAnswer,Teaname)
Paper(PaperID,CourseID,PaperName,PaperState)
PaperDetail(ID,PaperID,Type,TitleID,Mark)
UserAnswer(ID,UserID,Type,PaperID,Type,TitleID,UserAnser,ExamTime,PaperState)
Scores(ID,UserID,PaperID,Score,ExamTime,JudgeTime,PingYu)
Roles(RoleID,RoleName)
Course(ID,Name)
Department(DepartmentId,DepartmentName)
SingleProblem(ID,CourseID,AnswerA,AnswerB,AnswerC,AnswerD,answer,count)
FillbankProblem (ID,CourseID,FrontTitle,BackTitle,answer,count)
JudgeProblem(ID,CourseID,Title,Answer,count)
QuestionProblem (ID,CourseID,Title,Answer,count)
(2)、表的物理设计:
表3.1 Users
表3.2 Paper
表3.3 PaperDetail
表3.4 UserAnswer
表3.5 Scores
表3.6 Roles
表3.7 Course
表3.8 Department
表3.9 SingleProble
表 3.10 FillblankProblen
表3.11 JudgeProblem
表3.12 QuestionProblem
(3)数据库权限:
1.管理员
管理员能够对表SingleProblem、JudgeProblem、FillBlankProblem、QuestionProblem、PaperDetials、Score、UserAnswer、Student、Teacher进行添加、修改、删除以及查询操作,能够查看Manager表的部分信息。
2.教师
教师能够对表SingleProblem、FillBlankProblem、JudgeProblem、QuestionProblem、Score进行添加、修改、删除以及查询操作,可以查看表Teacher的部分信息。
3.学生
学生可以对表UserAnswer进行添加、修改、删除以及查询操作,可以查看Student表的部分信息。
4.软件功能设计
(1)、系统的结构图:
图 3.1 功能图
(2)、功能表:
用户 |
功能 |
功能具体描述 |
管理员 |
学生信息管理 |
添加、删除、修改学生信息 |
教师信息管理 |
添加、删除、修改教师信息 |
|
题库管理 |
添加、删除、修改题目信息 |
|
成绩管理 |
添加、删除、修改学生成绩 |
|
查询成绩 |
查询学生成绩 |
|
修改密码 |
修改用户密码 |
|
教师 |
查询个人信息 |
查询用户个人信息 |
成绩管理 |
添加、删除、修改学生成绩 |
|
查询成绩 |
查询教授课程学生成绩 |
|
题库管理 |
添加、删除、修改题目信息 |
|
修改密码 |
修改用户密码 |
|
学生 |
查询个人信息 |
查询用户个人信息 |
查询成绩 |
查询个人成绩 |
|
查询试卷 |
查询所做试卷的信息 |
|
修改密码 |
修改用户密码 |
(3)、功能描述:
本系统主要计算机网络课程的在线测试,包括在线选择测试题目的难度,类型等。不同用户实现不同功能。用户可分为三类,管理员、教师和学生。
管理员登录后,进入功能页面。能够对教师、学生信息进行管理,包含添加、修改、删除;能够对题库信息进行管理,包含添加、修改、删除;能够对学生成绩信息进行管理,包含添加、修改、删除;能够查询学生成绩;能够修改个人账户密码。
教师登录后,进入功能页面。能够查询个人信息;能够对学生成绩信息进行管理,包含添加、修改、删除;能够查询学生成绩;能够对题库信息进行管理,包含添加、修改、删除;能够修改个人账户密码。
学生登录后,进入功能页面。能够查询个人信息;能够查询个人成绩;能够查询已经测试过卷子的信息;能够修改个人账户密码。
四、系统实施
(1)、系统的界面设计:
图4.1 登录界面/忘记密码
图4.2 学生主页面
图4.3 教师主页面
图4.4 管理员主页面
图4.5 重置密码之确认信息
图4.6 重置密码2
(2)、事件的设计过程:
- 创建SQL Server 数据库文件
- 在数据库中建立需要的数据表
- 创建asp.net工程
- 创建connectingStrings,连接数据库
- 登录界面设计
- 忘记密码界面设计
- 功能界面设计
8. 学生登录: 1) 个人信息查询修改界面设计
2) 考试界面设计
3) 成绩查询界面设计
4) 联系老师界面设计
9. 教师登录: 1) 个人信息查询界面设计
2) 批改试卷界面设计
3) 成绩信息管理(添加、修改、删除)界面设计
4) 题库管理(添加、修改、删除)界面设计
10. 管理员登录: 1) 个人信息查询修改界面设计
2) 学生/教师信息管理(添加、修改、删除)界面设计
3) 题库管理(添加、修改、删除)界面设计
4) 成绩查询删除界面设计
11. 界面美化
*(3)、主要代码描述:
试卷有关的BLL层代码:
//用户类
public class Paper
{
#region 私有成员
private int _paperID; //试卷编号
private int _courseID; //科目编号
private string _paperName; //试卷名称
private byte _paperState; //试卷状态
private string _type;
private string _userid;
private string _state;
#endregion 私有成员
#region 属性
public int PaperID
{
set
{
this._PaperID = value;
}
get
{
return this._ PaperID;
}
public int CourseID
{
set
{
this._courseID = value;
}
get
{
return this._courseID;
}
}
public string PaperName
{
set
{
this._paperName = value;
}
get
{
return this._paperName;
}
}
public byte PaperState
{
set
{
this._paperState = value;
}
get
{
return this._paperState;
}
}
public string Type
{
set
{
this._type = value;
}
get
{
return this._type;
}
}
public string UserID
{
set
{
this._userid = value;
}
get
{
return this._userid;
}
}
public string state
{
set
{
this._state = value;
}
get
{
return this._state;
}
}
#endregion 属性
#region 方法
//向Paper表中添加试卷信息(采用存储过程)
//输出:
// 插入成功:返回True;
// 插入失败:返回False;
public bool InsertByProc()
{
SqlParameter[] Params = new SqlParameter[3];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@CourseID", SqlDbType.Int, 4, CourseID); //科目编号
Params[1] = DB.MakeInParam("@PaperName", SqlDbType.VarChar, 200, PaperName); //试卷名称
Params[2] = DB.MakeInParam("@PaperState", SqlDbType.Bit, 1, PaperState); //试卷状态
int Count = -1;
Count = DB.RunProc("Proc_PaperAdd", Params);
if (Count > 0)
return true;
else return false;
}
//更新试卷信息
public bool UpdateByProc(int PID)
{
SqlParameter[] Params = new SqlParameter[2];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@PaperID", SqlDbType.Int, 4, PID); //试卷编号
Params[1] = DB.MakeInParam("@PaperState", SqlDbType.Bit, 1, PaperState); //试卷状态
int Count = -1;
Count = DB.RunProc("Proc_PaperModify", Params);
if (Count > 0)
return true;
else return false;
}
//更新试卷是否评阅的状态
public bool UpdateByProc(string XUserID, int XPaperID, string Xstate)
{
SqlParameter[] Params = new SqlParameter[3];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 50, XUserID);
Params[1] = DB.MakeInParam("@PaperID", SqlDbType.Int, 4, XPaperID);
Params[2] = DB.MakeInParam("@state", SqlDbType.VarChar, 50, Xstate);
int Count = -1;
Count = DB.RunProc("Proc_UserAnswerStateModify", Params);
if (Count > 0)
return true;
else return false;
}
//删除题目
//输入:
// TID - 题目编号;
//输出:
// 删除成功:返回True;
// 删除失败:返回False;
public bool DeleteByProc(int PID)
{
SqlParameter[] Params = new SqlParameter[1];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@ID", SqlDbType.Int, 4, PID); //题目编号
int Count = -1;
Count = DB.RunProc("Proc_PaperDelete", Params);
if (Count > 0)
return true;
else return false;
}
// 删除某位用户的试卷
public bool DeleteByProc(string userid, int paperid)
{
SqlParameter[] Params = new SqlParameter[2];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 50, userid); //用户ID
Params[1] = DB.MakeInParam("@PaperID", SqlDbType.Int, 4, paperid); //试卷ID
int Count = -1;
Count = DB.RunProc("Proc_UserPaperDelete", Params);
if (Count > 0)
return true;
else return false;
}
//查询所用试卷
//不需要参数
public DataSet QueryAllPaper()
{
DataBase DB = new DataBase();
return DB.GetDataSet("Proc_PaperList");
}
//查询所用可用试卷
//不需要参数
public DataSet QueryPaper()
{
DataBase DB = new DataBase();
SqlParameter[] Params = new SqlParameter[1];
Params[0] = DB.MakeInParam("@PaperState", SqlDbType.Bit, 1, "true"); //题目编号
return DB.GetDataSet("Proc_PaperUseList", Params);
}
//查询所有用户考试的试卷
public DataSet QueryUserPaperList()
{
DataBase DB = new DataBase();
return DB.GetDataSet("Proc_UserPaperList");
}
//查询某个用户考试的试卷
public DataSet QueryUserPaper(string type, string userid)
{
DataBase DB = new DataBase();
SqlParameter[] Params = new SqlParameter[2];
//Params[0] = DB.MakeInParam("@PaperID", SqlDbType.Int, 4, paperid); //试卷编号
Params[0] = DB.MakeInParam("@Type", SqlDbType.VarChar, 10, type); //题目类型
Params[1] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 50, userid); //用户ID
return DB.GetDataSet("Proc_UserAnswer", Params);
}
#endregion 方法
}
成绩的BLL层面代码:
//用户类
public class Scores
{
#region 私有成员
private int _ID;
private string _userID;
private int _paperID;
private int _score;
private DateTime _examtime;//考试时间
private DateTime _judgetime; //评阅时间
private string _pingyu; //评阅时间
#endregion 私有成员
#region 属性
public int ID
{
set
{
this._ID = value;
}
get
{
return this._ID;
}
}
public string UserID
{
set
{
this._userID = value;
}
get
{
return this._userID;
}
}
public int PaperID
{
set
{
this._paperID = value;
}
get
{
return this._paperID;
}
}
public int Score
{
set
{
this._score = value;
}
get
{
return this._score;
}
}
public DateTime ExamTime
{
set
{
this._examtime = value;
}
get
{
return this._examtime;
}
}
public DateTime JudgeTime
{
set
{
this._judgetime = value;
}
get
{
return this._judgetime;
}
}
public string PingYu
{
set
{
this._pingyu = value;
}
get
{
return this._pingyu;
}
}
#endregion 属性
#region 方法
//向Score表中添加成绩
//输出:
// 插入成功:返回True;
// 插入失败:返回False;
public bool InsertByProc()
{
SqlParameter[] Params = new SqlParameter[6];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 20, UserID);
Params[1] = DB.MakeInParam("@PaperID", SqlDbType.Int, 4, PaperID);
Params[2] = DB.MakeInParam("@Score", SqlDbType.Int, 4, Score);
Params[3] = DB.MakeInParam("@ExamTime", SqlDbType.DateTime, 8, ExamTime);
Params[4] = DB.MakeInParam("@JudgeTime", SqlDbType.DateTime, 8, DateTime.Now);
Params[5] = DB.MakeInParam("@PingYu", SqlDbType.VarChar, 1000, PingYu);
int Count = -1;
Count = DB.RunProc("Proc_ScoreAdd", Params);
if (Count > 0)
return true;
else return false;
}
public bool CheckScore(string XUserID, int XPaperID)
{
SqlParameter[] Params = new SqlParameter[2];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 20, XUserID);
Params[1] = DB.MakeInParam("@PaperID", SqlDbType.Int, 4, XPaperID);
SqlDataReader DR = DB.RunProcGetReader("Proc_ScoreDetail", Params);
if (!DR.Read())
{
return false;
}
else
{
return true;
}
}
//删除成绩
//输入:
// XUserID - 用户编号;
//输出:
// 删除成功:返回True;
// 删除失败:返回False;
public bool DeleteByProc(int SID)
{
SqlParameter[] Params = new SqlParameter[1];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@ID", SqlDbType.Int, 4, SID); //成绩编号
int Count = -1;
Count = DB.RunProc("Proc_ScoreDelete", Params);
if (Count > 0)
return true;
else return false;
}
//查询所用成绩
//不需要参数
public DataSet QueryScore()
{
DataBase DB = new DataBase();
return DB.GetDataSet("Proc_ScoreList");
}
//查询某个用户成绩
public DataSet QueryUserScore(string XUserID)
{
SqlParameter[] Params = new SqlParameter[1];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 20, XUserID);
return DB.GetDataSet("Proc_UserScore", Params);
}
#endregion 方法
}
人员管理的BLL层面代码:
public class Users
{
#region 私有成员
private string _userID; //用户编号
private string _userPwd; //用户密码
private string _userName; //用户姓名
private int _department; //用户部门
private int _roleid; //用户角色
private string _rolename;
private ArrayList _duties = new ArrayList(); //用户所有的权限
#endregion 私有成员
#region 属性
public string UserID
{
set
{
this._userID = value;
}
get
{
return this._userID;
}
}
public string UserPwd
{
set
{
this._userPwd = value;
}
get
{
return this._userPwd;
}
}
public string UserName
{
set
{
this._userName = value;
}
get
{
return this._userName;
}
}
public int DepartmentId
{
set
{
this._department = value;
}
get
{
return this._department;
}
}
public int RoleId
{
set
{
this._roleid = value;
}
get
{
return this._roleid;
}
}
public string RoleName
{
set
{
this._rolename = value;
}
get
{
return this._rolename;
}
}
public ArrayList Duties
{
set
{
this._duties = value;
}
get
{
return this._duties;
}
}
#endregion 属性
#region 方法
//根据用户 UserID 初始化该用户
//输入:
// XUserID - 用户编号;
//输出:
// 用户存在:返回True;
// 用户不在:返回False;
public bool LoadData(string XUserID)
{
SqlParameter[] Params = new SqlParameter[1];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 50, XUserID); //用户编号
DataSet ds = DB.GetDataSet("Proc_UsersDetail", Params);
ds.CaseSensitive = false;
DataRow DR;
if (ds.Tables[0].Rows.Count > 0)
{
DR = ds.Tables[0].Rows[0];
this._userID = GetSafeData.ValidateDataRow_S(DR, "UserID"); //用户编号
this._userName = GetSafeData.ValidateDataRow_S(DR, "UserName"); //用户姓名
this._userPwd = GetSafeData.ValidateDataRow_S(DR, "UserPwd"); //用户密码
this._department = GetSafeData.ValidateDataRow_N(DR, "DepartmentId"); //所在专业
this._roleid = GetSafeData.ValidateDataRow_N(DR, "RoleId"); //用户权限
this._rolename = GetSafeData.ValidateDataRow_S(DR, "RoleName"); //用户权限
//获取权限集合
string colName = "";
for (int i = 0; i < DR.ItemArray.Length; i++)
{
colName = DR.Table.Columns[i].ColumnName;
if (colName.StartsWith("HasDuty_") && GetSafeData.ValidateDataRow_N(DR, colName) == 1)
{
this._duties.Add(DR.Table.Columns[i].ColumnName.Substring(8)); //去掉前缀“HasDuty_”
}
}
return true;
}
else
{
return false;
}
}
//根据UserID判断该用户是否存在
//输入:
// XUserID - 用户编号;
//输出:
// 用户存在:返回True;
// 用户不在:返回False;
public bool CheckUser(string XUserID)
{
SqlParameter[] Params = new SqlParameter[1];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 50, XUserID); //教工姓名
SqlDataReader DR = DB.RunProcGetReader("Proc_UsersDetail", Params);
if (!DR.Read())
{
return false;
}
else
{
return true;
}
}
//根据UserID和UserPassword判断密码是否正确
//输入:
// XUserID - 用户编号;
//输出:
// 用户存在:返回True;
// 用户不在:返回False;
public bool CheckPassword(string XUserID)
{
SqlParameter[] Params = new SqlParameter[1];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 50, XUserID); //编号
SqlDataReader DR = DB.RunProcGetReader("Proc_UsersDetail", Params);
if (!DR.Read())
{
return false;
}
else
{
this._userPwd = DR["UserPwd"].ToString();
return true;
}
}
//判断是否已经考试
public bool IsTest(string UserID, int PaperID)
{
SqlParameter[] Params = new SqlParameter[2];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 20, UserID);
Params[1] = DB.MakeInParam("@PaperID", SqlDbType.Int, 4, PaperID);
SqlDataReader DR = DB.RunProcGetReader("Proc_IsTest", Params);
if (!DR.Read())
{
return false;
}
else
{
return true;
}
}
//修改用户的密码
//输入:
// XUserID - 用户编号;
//输出:
// 修改成功:返回True;
// 修改失败:返回False;
public bool ModifyPassword(string XUserID)
{
SqlParameter[] Params = new SqlParameter[2];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 20, XUserID); //用户编号
Params[1] = DB.MakeInParam("@UserPwd", SqlDbType.VarChar, 64, UserPwd); //用户密码
int Count = -1;
Count = DB.RunProc("Proc_UserPwdModify", Params);
if (Count > 0)
return true;
else return false;
}
//向Users表中添加用户信息(采用存储过程)
//输出:
// 插入成功:返回True;
// 插入失败:返回False;
public bool InsertByProc()
{
SqlParameter[] Params = new SqlParameter[5];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 50, UserID); //用户编号
Params[1] = DB.MakeInParam("@UserName", SqlDbType.VarChar, 50, UserName); //用户姓名
Params[2] = DB.MakeInParam("@UserPwd", SqlDbType.VarChar, 64, UserPwd); //用户密码
Params[3] = DB.MakeInParam("@RoleId", SqlDbType.Int, 4, RoleId); //角色
Params[4] = DB.MakeInParam("@DepartmentId", SqlDbType.Int, 4, DepartmentId); //部门
int Count = -1;
Count = DB.RunProc("Proc_UsersAdd", Params);
if (Count > 0)
return true;
else return false;
}
//更新用户的信息
public bool UpdateByProc(string XUserID)
{
SqlParameter[] Params = new SqlParameter[4];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 50, XUserID); //用户编号
Params[1] = DB.MakeInParam("@UserName", SqlDbType.VarChar, 50, UserName); //用户姓名
Params[2] = DB.MakeInParam("@DepartmentId", SqlDbType.Int, 4, DepartmentId); //部门
Params[3] = DB.MakeInParam("@RoleId", SqlDbType.Int, 4, RoleId); //角色
int Count = -1;
Count = DB.RunProc("Proc_UsersModify", Params);
if (Count > 0)
return true;
else return false;
}
//删除用户
//输入:
// XUserID - 用户编号;
//输出:
// 删除成功:返回True;
// 删除失败:返回False;
public bool DeleteByProc(string XUserID)
{
SqlParameter[] Params = new SqlParameter[1];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 50, XUserID); //用户编号
int Count = -1;
Count = DB.RunProc("Proc_UsersDelete", Params);
if (Count > 0)
return true;
else return false;
}
//查询用户
//查询所用用户
//不需要参数
public DataSet QueryUsers()
{
DataBase DB = new DataBase();
return DB.GetDataSet("Proc_UsersList");
}
/// 查询用户
public static DataTable QueryUsers(Hashtable queryItems)
{
string where = SQLString.GetConditionClause(queryItems);
string sql = "Select * From [Users],[Department],[Role] " + where;
if (where == "")
sql += " Where";
else
sql += " And";
sql += " [Users].DepartmentId=[Department].DepartmentId"
+ " And [Users].RoleId=[Role].RoleId";
DataBase DB = new DataBase();
return DB.GetDataTable(sql);
}
#endregion 方法
}
单选题的BLL层的类的代码:
//单选题类
public class SingleProblem
{
#region 私有成员
private int _ID; //题目编号
private int _CourseID; //所属科目
private string _Title; //题目
private string _AnswerA; //答案A
private string _AnswerB; //答案B
private string _AnswerC; //答案C
private string _AnswerD; //答案D
private string _Answer; //答案
#endregion 私有成员
#region 属性
public int ID
{
set
{
this._ID = value;
}
get
{
return this._ID;
}
}
public int CourseID
{
set
{
this._CourseID = value;
}
get
{
return this._CourseID;
}
}
public string Title
{
set
{
this._Title = value;
}
get
{
return this._Title;
}
}
public string AnswerA
{
set
{
this._AnswerA = value;
}
get
{
return this._AnswerA;
}
}
public string AnswerB
{
set
{
this._AnswerB = value;
}
get
{
return this._AnswerB;
}
}
public string AnswerC
{
set
{
this._AnswerC = value;
}
get
{
return this._AnswerC;
}
}
public string AnswerD
{
set
{
this._AnswerD = value;
}
get
{
return this._AnswerD;
}
}
public string Answer
{
set
{
this._Answer = value;
}
get
{
return this._Answer;
}
}
#endregion 属性
#region 方法
//根据题目ID 初始化题目
//输入:
// TID - 题目编号;
//输出:
// 题目存在:返回True;
// 题目不在:返回False;
public bool LoadData(int TID)
{
SqlParameter[] Params = new SqlParameter[1];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@ID", SqlDbType.Int, 4, TID); //用户编号
DataSet ds = DB.GetDataSet("Proc_SingleProblemDetail", Params);
ds.CaseSensitive = false;
DataRow DR;
if (ds.Tables[0].Rows.Count > 0)
{
DR = ds.Tables[0].Rows[0];
this._CourseID = GetSafeData.ValidateDataRow_N(DR, "CourseID"); //科目编号
this._Title = GetSafeData.ValidateDataRow_S(DR, "Title"); //题目
this._AnswerA = GetSafeData.ValidateDataRow_S(DR, "AnswerA"); //答案A
this._AnswerB = GetSafeData.ValidateDataRow_S(DR, "AnswerB"); //答案B
this._AnswerC = GetSafeData.ValidateDataRow_S(DR, "AnswerC"); //答案C
this._AnswerD = GetSafeData.ValidateDataRow_S(DR, "AnswerD"); //答案D
this._Answer = GetSafeData.ValidateDataRow_S(DR, "Answer"); //答案
return true;
}
else
{
return false;
}
}
//向SingleProblem表中添加题目信息(采用存储过程)
//输出:
// 插入成功:返回True;
// 插入失败:返回False;
public bool InsertByProc()
{
SqlParameter[] Params = new SqlParameter[7];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@CourseID", SqlDbType.Int, 4, CourseID); //科目编号
Params[1] = DB.MakeInParam("@Title", SqlDbType.VarChar, 1000, Title); //题目
Params[2] = DB.MakeInParam("@AnswerA", SqlDbType.VarChar, 500, AnswerA); //答案A
Params[3] = DB.MakeInParam("@AnswerB", SqlDbType.VarChar, 500, AnswerB); //答案B
Params[4] = DB.MakeInParam("@AnswerC", SqlDbType.VarChar, 500, AnswerC); //答案C
Params[5] = DB.MakeInParam("@AnswerD", SqlDbType.VarChar, 500, AnswerD); //答案D
Params[6] = DB.MakeInParam("@Answer", SqlDbType.VarChar, 2, Answer); //答案
int Count = -1;
Count = DB.RunProc("Proc_SingleProblemAdd", Params);
if (Count > 0)
return true;
else return false;
}
//更新单选题试题信息
public bool UpdateByProc(int TID)
{
SqlParameter[] Params = new SqlParameter[8];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@ID", SqlDbType.Int, 4, TID); //题目编号
Params[1] = DB.MakeInParam("@CourseID", SqlDbType.Int, 4, CourseID); //科目编号
Params[2] = DB.MakeInParam("@Title", SqlDbType.VarChar, 1000, Title); //题目
Params[3] = DB.MakeInParam("@AnswerA", SqlDbType.VarChar, 500, AnswerA); //答案A
Params[4] = DB.MakeInParam("@AnswerB", SqlDbType.VarChar, 500, AnswerB); //答案B
Params[5] = DB.MakeInParam("@AnswerC", SqlDbType.VarChar, 500, AnswerC); //答案C
Params[6] = DB.MakeInParam("@AnswerD", SqlDbType.VarChar, 500, AnswerD); //答案D
Params[7] = DB.MakeInParam("@Answer", SqlDbType.VarChar, 2, Answer); //答案
int Count = -1;
Count = DB.RunProc("Proc_SingleProblemModify", Params);
if (Count > 0)
return true;
else return false;
}
//删除题目
//输入:
// TID - 题目编号;
//输出:
// 删除成功:返回True;
// 删除失败:返回False;
public bool DeleteByProc(int TID)
{
SqlParameter[] Params = new SqlParameter[1];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@ID", SqlDbType.Int, 4, TID); //题目编号
int Count = -1;
Count = DB.RunProc("Proc_SingleProblemDelete", Params);
if (Count > 0)
return true;
else return false;
}
//查询单选题
public DataSet QuerySingleProblem(int TCourseID)
{
SqlParameter[] Params = new SqlParameter[1];
DataBase DB = new DataBase();
Params[0] = DB.MakeInParam("@CourseID", SqlDbType.Int, 4, TCourseID); //题目编号
return DB.GetDataSet("Proc_SingleProblemList", Params);
}
#endregion 方法
}
五、系统测试
(1)、给出单元测试的测试用例:
(2)、给出系统测试的测试用例:
1、功能测试
(1)用户登录功能测试:
表2.1用户登录功能测试用例 |
|
字段名称 |
描 述 |
标识符 |
0000 |
测试项 |
用户登录功能测试 |
测试环境要求 |
略 |
输入数据 |
学生登录: 1、输入错误的用户名和密码,单击“立即登录”按钮 2、仅输入密码,单击“立即登陆”按钮 3、仅输入用户名,单击“立即登陆”按钮 4、输入正确的用户名和密码,单击“立即登陆”按钮 5、学生主页单击“退出系统“按钮 教师登录: 1、输入错误的用户名和密码,单击“立即登录”按钮 2、仅输入密码,单击“立即登陆”按钮 3、仅输入用户名,单击“立即登陆”按钮 4、输入正确的用户名和密码,单击“立即登陆”按钮 5、教师主页单击“退出系统“按钮 管理员登录: 1、输入错误的用户名和密码,单击“立即登录”按钮 2、仅输入密码,单击“立即登陆”按钮 3、仅输入用户名,单击“立即登陆”按钮 4、输入正确的用户名和密码,单击“立即登陆”按钮 5、管理员主页单击“退出系统”按钮 |
对应输出数据 |
学生登录: 1、页面提示“用户名或密码错误” 2、页面提示“请输入用户名” 3、页面提示“请输入密码” 4、登录成功,转入相应主页 5、退出成功,转入登录页面 教师登录: 1、页面提示“用户名或密码错误” 2、页面提示“请输入用户名” 3、页面提示“请输入密码” 4、登录成功,转入相应主页 5、退出成功,转入登录页面 管理员登录: 1、页面提示“用户名或密码错误” 2、页面提示“请输入用户名” 3、页面提示“请输入密码” 4、登录成功,转入相应主页 5、退出成功。转入登录页面 |
测试用例间的关联 |
0001(有效密码测试) |
(1)学生登录:
protected void login_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("Data Source=PC-LYW;Initial Catalog=OnLineExam;Integrated Security=True");
string userid = user.Text.ToString().Trim();
string userpw = password.Text.ToString().Trim();
if (userid == "")
{
Response.Write("<script>alert('请输入用户名!')</script>");
}
else if (userpw == "")
{
Response.Write("<script>alert('请输入密码!')</script>");
}
else
{
if (List.SelectedIndex == 0)
{
SqlCommand cmd = new SqlCommand("select * from [Users] where UserID='" + userid + "'and UserPwd= '" + userpw + "'and RoleID='1' ", con);
con.Open();
SqlDataReader rd = cmd.ExecuteReader();
if (rd.Read())
{
Session["userID"] = userid;
Response.Redirect("stu_home.aspx");
}
else
{
Response.Write("<script>alert('用户名或密码错误!')</script>");
password.Text = "";
}
con.Close();
}
图5.1 用户名或密码错误
图5.2 用户名为空
图2-5
图5.3 密码为空
图5.4 登录成功,转入相应主页
图5.5 退出系统,转入登录界面
(2)忘记密码功能测试:
表2.2忘记密码功能测试用例 |
|
字段名称 |
描 述 |
标识符 |
0001 |
测试项 |
忘记密码功能测试 |
测试环境要求 |
略 |
输入数据 |
学生重置密码: 1、输入错误的用户名或密保答案,单击“确定”按钮 2、用户名为空,单击“确定”按钮 3、密保答案为空,单击“确定”按钮 4、输入正确的用户名和密保答案,单击“确定”按钮,转入页面中输入新密码,单击“确定”按钮 教师重置密码: 1、输入错误的用户名或密保答案,单击“确定”按钮 2、用户名为空,单击“确定”按钮 3、密保答案为空,单击“确定”按钮 4、输入正确的用户名和密保答案,单击“确定”按钮,转入页面中输入新密码,单击“确定”按钮 管理员重置密码: 1、输入错误的用户名或密保答案,单击“确定”按钮 2、用户名为空,单击“确定”按钮 3、密保答案为空,单击“确定”按钮 4、输入正确的用户名和密保答案,单击“确定”按钮,转入页面中输入新密码,单击“确定”按钮 |
对应输出数据 |
学生重置密码: 1、页面提示“用户名或答案错误” 2、页面提示“请输入用户名” 3、页面提示“请输入答案” 4、页面提示“修改成功” 教师重置密码: 1、页面提示“用户名或答案错误” 2、页面提示“请输入用户名” 3、页面提示“请输入答案” 4、页面提示“修改成功” 管理员重置密码: 1、页面提示“用户名或答案错误” 2、页面提示“请输入用户名” 3、页面提示“请输入答案” 4、页面提示“修改成功” |
测试用例间的关联 |
无 |
用户名或答案错误:
if (String.Compare(Request.Cookies["yzmcode"].Value, Validator.Text, true) != 0)
{
Response.Write("<script>alert('验证码错误!')</script>");
}
else if (userid == "")
{
Response.Write("<script>alert('请输入用户名!')</script>");
}
else if (userans == "")
{
Response.Write("<script>alert('请输入答案!')</script>");
}
else
{
if (List.SelectedIndex == 0)
{
SqlCommand cmd = new SqlCommand("select * from [Users] where UserID='" + userid + "'and SafeAnswer= '" + userans + "'and RoleID='1' ", con);
con.Open();
SqlDataReader rd = cmd.ExecuteReader();
if (rd.Read())
{
Session["userID"] = userid;
Response.Redirect("stu_forget1.aspx");
}
else
{
Response.Write("<script>alert('用户名或答案错误!')</script>");
txtAnsPwd.Text = "";
}
con.Close();
}
图5.6 用户名或密码错误
图2-32
图5.7 用户名为空
图5.8 答案为空
(3)学生个人信息功能测试:
表2.3用户登录功能测试用例 |
|
字段名称 |
描 述 |
标识符 |
0002 |
测试项 |
学生个人信息功能测试 |
测试环境要求 |
略 |
输入数据 |
1、修改姓名,填写密保答案,单击“确定“按钮 2、修改密码,填写密保答案,单击“确定“按钮 3、修改专业,填写密保答案,单击“确定“按钮 4、修改性别,填写密保答案,单击“确定“按钮 |
对应输出数据 |
1、页面显示“修改成功” 2、页面显示“修改成功” 3、页面显示“修改成功” 4、页面显示“修改成功” |
测试用例间的关联 |
无 |
(1) 修改信息:
protected void Button1_Click(object sender, EventArgs e)
{
string id = Session["UserID"].ToString().Trim();
string name = txtStuName.Text.ToString().Trim();
string pw = txtPwd.Text.ToString().Trim();
string sex = DropDownList1.SelectedValue.ToString().Trim();
string question = DropDownList3.SelectedValue.ToString().Trim();
string answer = txtAnsPwd.Text.ToString().Trim();
SqlConnection con = new SqlConnection(@"Data Source=PC-LYW;Initial Catalog=OnLineExam;Integrated Security=True");
con.Open();
string sql = "update Users set UserName = '" + name + "',UserPwd = '" + pw + "',UserSex = '" + sex + "',SafeQuestion = '" + question + "',SafeAnswer = '" + answer + "' where UserID = '" + id + "'";
SqlCommand cmd = new SqlCommand(sql, con);
cmd.ExecuteNonQuery();
con.Close();
Response.Write("<script language=javascript>alert('修改成功!');window.location = 'stu_home.aspx';</script>");
}
protected void Button2_Click(object sender, EventArgs e)
{
Response.Write("<script language=javascript>alert('未修改!');window.location = 'stu_home.aspx';</script>");
}
图5.9 确认修改个人信息
图5.10 修改成功
图5.11
(4)学生开始答题功能测试:
表5.4学生开始答题功能测试用例 |
|
字段名称 |
描 述 |
标识符 |
0003 |
测试项 |
学生开始答题功能测试 |
测试环境要求 |
略 |
输入数据 |
1、选择试题,单击“开始考试”按钮 2、完成部分试题后,单击“提交”按钮 3、完成全部试题后,单击“提交”按钮 4、提交试卷后,回到主页再次选择该试卷,单击“开始考试按钮” |
对应输出数据 |
1、试卷信息显示正确且可以做题 2、页面显示“试卷提交成功” 3、页面显示“试卷提交成功” 4、页面显示“您已经考试过了不能再考试” |
测试用例间的关联 |
无 |
//初始化考试科目下拉列表框
protected void InitData()
{
Paper paper = new Paper(); //创建Paper对象
DataSet ds = paper.QueryPaper(); //查询所有可用试卷
if (ds.Tables[0].Rows.Count >= 1)
{
ddlPaper.DataSource = ds; //指名考试科目列表框数据源
ddlPaper.DataTextField = "PaperName"; //DataTextField显示Name字段值
ddlPaper.DataValueField = "PaperID"; //DataValueField显示ID字段值
ddlPaper.DataBind(); //绑定数据
}
else
{
ddlPaper.Enabled = false;
Button1.Enabled = false;
lblMessage.Text = "没有试卷!";
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Users user = new Users();
if (user.IsTest(Session["userID"].ToString().Trim(), Convert.ToInt32(ddlPaper.SelectedValue)))
{
lblMessage.Text = "您已经考试过了,不能再考试!";
}
else
{
Session["PaperID"] = ddlPaper.SelectedValue;
Session["PaperName"] = ddlPaper.SelectedItem.Text;
Response.Redirect("UserTest.aspx"); //转向考试界面
}
}
图5.12 试卷信息显示正确且可以做题
图5.13 开始做题
图5.14 完成试题后交卷
图5.15 再次考试
(5)学生查看成绩功能测试:
表2.5学生查看成绩功能测试用例 |
|
字段名称 |
描 述 |
标识符 |
0004 |
测试项 |
学生查看成绩功能测试 |
测试环境要求 |
略 |
输入数据 |
无 |
对应输出数据 |
显示学生所有做过的试卷的成绩 |
测试用例间的关联 |
无 |
protected void ScoreInitData()//初始化成绩
{
Scores score = new Scores(); //创建Scores对象
DataSet ds = score.QueryUserScore(Session["userID"].ToString());
if (ds.Tables[0].Rows.Count > 0)
{
GridView1.DataSource = ds; //为GridView控件指名数据源
GridView1.DataBind(); //绑定数据
}
else
{
lblScore.Text = "没有成绩!";
}
}
图5.16 成绩显示
(6)学生联系老师功能测试:
表2.6学生联系老师功能测试用例 |
|
字段名称 |
描 述 |
标识符 |
0005 |
测试项 |
学生联系老师功能测试 |
测试环境要求 |
略 |
输入数据 |
方框中留言,单击“确定”按钮 |
对应输出数据 |
|
测试用例间的关联 |
无 |
图5.17 确认留言
(7)教师批改试题功能测试:
表2.8教师批改试卷功能测试用例 |
|
字段名称 |
描 述 |
标识符 |
0007 |
测试项 |
教师批改试卷功能测试 |
测试环境要求 |
略 |
输入数据 |
1、单击“试卷编号”按钮进入试卷页面,填写问答题所得分数,单击“问答题计分”按钮,确认学生所得分数无误后,单击“保存”按钮 2、单击“删除”按钮删除改该名学生所做试卷 |
对应输出数据 |
1、页面显示“成绩保存成功” 2、删除成功 |
测试用例间的关联 |
无 |
protected void Button1_Click(object sender, EventArgs e)
{
int quemark = 0;
int maxMark = int.Parse(((Label)GridView5.Rows[0].FindControl("Label21")).Text);
int flag = 1;
foreach (GridViewRow dr in GridView5.Rows)
{
if (int.Parse(((TextBox)dr.FindControl("tbxqueScore")).Text.Trim()) > maxMark)
{
lblQuestion.Text = "问答题每道的得分不能超过每道题的分数!";
flag = 0;
}
}
if (flag == 1)
{
foreach (GridViewRow dr in GridView5.Rows)
{
quemark = quemark + int.Parse(((TextBox)dr.FindControl("tbxqueScore")).Text.Trim());
queScore.Text = Convert.ToString(quemark);
sumScore.Text = Convert.ToString(Convert.ToInt32(sinScore.Text) + Convert.ToInt32(judScore.Text) + Convert.ToInt32(filScore.Text) + Convert.ToInt32(queScore.Text));
}
lblQuestion.Text = "";
}
}
图5.18 答卷评阅
图5.19 评阅分数
图5.20 评分
图5.21 答卷删除成功
图5.22 答卷删除跳转
(9)教师增改题库功能测试:
表2.9教师增改题库功能测试用例 |
|
字段名称 |
描 述 |
标识符 |
0008 |
测试项 |
教师增改题库功能测试 |
测试环境要求 |
略 |
输入数据 |
1、单击“编辑”按钮 2、单击“详细”按钮 3、单击“删除”按钮 4、单击“新增试卷”按钮 单选题管理: 5、单击“单选题”按钮,单击“详细”按钮 6、单击“单选题”按钮,单击“删除”按钮 7、单击“单选题”按钮,单击“添加单选题”按钮 判断题管理: 8、单击“判断题”按钮,单击“详细”按钮 9、单击“判断题”按钮,单击“删除”按钮 10、单击“判断题”按钮,单击“添加判断题”按钮 填空题管理: 11、单击“填空题”按钮,单击“详细”按钮 12、单击“填空题”按钮,单击“删除”按钮 13、单击“填空题”按钮,单击“添加填空题”按钮 问答题管理: 14、单击“问答题”按钮,单击“详细”按钮 15、单击“问答题”按钮,单击“删除”按钮 16、单击“问答题”按钮,单击“添加问答题”按钮 |
对应输出数据 |
1、可改变试卷状态 2、详细显示该试卷题目 3、删除试卷 4、人工选择试卷题目数量与分值,随机生成试卷 单选题管理: 5、显示该单选题详细信息,可编辑修改 6、删除该单选题 7、人工添加单选题 判断题管理: 8、显示该判断题详细信息,可编辑修改 9、删除该判断题 10、人工添加判断题 填空题管理: 11、显示该填空题详细信息,可编辑修改 12、删除该填空题 13、人工添加填空题 问答题管理: 14、显示该问答题详细信息,可编辑修改 15、删除该问答题 16、人工添加问答题 |
测试用例间的关联 |
无 |
protected void InitData()
{
Paper paper = new Paper();
DataSet ds = paper.QueryAllPaper();
if (ds.Tables[0].Rows.Count > 0)
{
GridView1.DataSource = ds;
GridView1.DataBind();
}
else
{
lblMessage.Text = "没有试卷!";
}
}
//GridView控件RowCanceling事件
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
GridView1.EditIndex = -1;
InitData();
}
//GridView控件RowDeleting事件
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
Paper paper = new Paper(); //创建Paper对象
int ID = int.Parse(GridView1.DataKeys[e.RowIndex].Values[0].ToString()); //取出要删除记录的主键值
if (paper.DeleteByProc(ID))
{
Response.Write("<script language=javascript>alert('成功删除该试卷!')</script>");
}
else
{
Response.Write("<script language=javascript>alert('删除试卷失败!')</script>");
}
//InitData();
Response.Redirect("PaperLists.aspx");
}
图2-112
图5.23 编辑试题
图5.24 查看试卷详细信息
图5.25 删除试卷
图5.26 新增试卷
图5.27 新增试卷题目
//删除试题事件
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
SingleProblem singleproblem = new SingleProblem(); //创建单选题对象
int ID = int.Parse(GridView1.DataKeys[e.RowIndex].Values[0].ToString()); //取出要删除记录的主键值
if (singleproblem.DeleteByProc(ID))
{
Response.Write("<script language=javascript>alert('成功删除试题!')</script>");
}
else
{
Response.Write("<script language=javascript>alert('删除试题失败!')</script>");
}
GridView1.EditIndex = -1;
GridViewBind();//重新绑定数据
}
图5.28 单选题管理
图5.29 题目编辑
图5.30 题目删除
(10)教师查看成绩功能测试:
表2.10教师查看成绩功能测试用例 |
|
字段名称 |
描 述 |
标识符 |
0009 |
测试项 |
教师查看成绩功能测试 |
测试环境要求 |
略 |
输入数据 |
再要删除的成绩后单击“删除”按钮 |
对应输出数据 |
删除该成绩 |
测试用例间的关联 |
无 |
//GridView控件RowDeleting事件
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
Scores score = new Scores(); //创建Scores对象
int ID = int.Parse(GridView1.DataKeys[e.RowIndex].Values[0].ToString()); //取出要删除记录的主键值
if (score.DeleteByProc(ID))
{
Response.Write("<script language=javascript>alert('成功删除!')</script>");
}
else
{
Response.Write("<script language=javascript>alert('删除失败!')</script>");
}
GridView1.EditIndex = -1;
InitData();
}
图5.31 成绩删除
(11)管理员界面管理人员测试:
表2.12管理员管理人员功能测试用例 |
|
字段名称 |
描 述 |
标识符 |
0011 |
测试项 |
管理员管理人员功能测试 |
测试环境要求 |
略 |
输入数据 |
1、单击“添加”按钮 删除用户: 2、在要删除的用户后单击“删除”按钮 3、勾选多个用户,单击“删除”按钮 查询用户: 4、仅输入用户名,单击“查询”按钮 5、仅输入姓名,单击“查询”按钮 6、用户名和姓名均为空,单击“查询”按钮
7、单击“编辑”按钮 8、在要重置密码的用户框中勾选,单击“重置密码”按钮 |
对应输出数据 |
1、填写用户相关信息,单击“保存”按钮后成功添加该用户 2、删除成功 3、删除成功 4、查询成功 5、查询成功 6、查询成功 7、可改变用户姓名、专业、角色 8、成功给该用户重置密码 |
测试用例间的关联 |
无 |
//GridView控件RowUpdating事件
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
string userID = GridView1.DataKeys[e.RowIndex].Values[0].ToString(); //取出记录的主键值
Users user = new Users();
user.UserName = ((TextBox)GridView1.Rows[e.RowIndex].FindControl("tbxName")).Text;
user.RoleId = Convert.ToInt32(((DropDownList)GridView1.Rows[e.RowIndex].FindControl("ddlRole")).SelectedValue); //取出修改后的值
user.DepartmentId = Convert.ToInt32(((DropDownList)GridView1.Rows[e.RowIndex].FindControl("ddlDepartment")).SelectedValue); //取出修改后的值
if (user.UpdateByProc(userID))//使用Users类UpdateByProc方法修改用户信息
{
GridViewBind();
Response.Write("<script language=javascript>alert('修改成功!')</script>");
}
else
{
Response.Write("<script language=javascript>alert('修改成功!')</script>");
}
GridView1.EditIndex = -1;
GridViewBind();
}
protected void ImageButtonQuery_Click(object sender, ImageClickEventArgs e)
{
Hashtable queryItems = new Hashtable();
queryItems.Add("UserID", tbxUserID.Text.Trim());
queryItems.Add("UserName", tbxUserName.Text.Trim());
DataTable dt = OnLineExam.BusinessLogicLayer.Users.QueryUsers(queryItems);
if (dt.Rows.Count >= 1)
{
GridView1.DataSource = dt;
GridView1.DataBind();
}
else
{
Response.Write("<script language=javascript>alert('没有这个用户!')</script>");
}
}
protected void ImageButtonDelete_Click(object sender, ImageClickEventArgs e)
{
for (int i = 0; i < this.GridView1.Rows.Count; i++)
{
bool isChecked = ((CheckBox)GridView1.Rows[i].FindControl("chkSelected")).Checked;
if (isChecked)
{
string userID = ((Label)GridView1.Rows[i].FindControl("Label1")).Text;
Users user = new Users();//创建Users类对象user
if (user.DeleteByProc(userID))//根据主键使用DeleteByProc方法删除用户
{
Response.Write("<script language=javascript>alert('删除成功!')</script>");
}
else
{
Response.Write("<script language=javascript>alert('" + userID + "删除失败!')</script>");
}
}
}
GridViewBind();
}
图5.32 添加用户
图5.33 删除用户
图5.34 输入用户名查找用户
、、
图5.35 编辑用户
图5.36 修改用户成功
图5.37 用户编辑成功跳转
图5.38 用户重置密码
图5.39 重置密码成功
2、安全性测试
(1)访问控制
网络考试系统的数据库服务器采用SQL Server 2014,后台包含了与考试相关的各种数据,包括用户信息、试题信息、组卷方案信息、成绩信息等。除了采用SQL Server与Windows相结合的方式登录数据库服务器来实现安全性的身份验证方式以外,还根据不同类别用户权限的设计与划分,避免用户在使用时获取到身份不相符权限,或者页面缺少身份验证,用户不经身份验证就打开相应的页面等问题。不同类别用户的功能确定不同的操作对象和操作级别,从源头保证数据操作的安全。通过建立角色,将访问许可集中授予角色,之后将需要拥有这一许可的用户加到角色中,这些用户即继承角色的访问许可。需要撤销用户的访问许可时,将用户从角色中删除即可。
本系统中,有三种用户角色,分别为管理员,教师,学生,其各自权限为:
(1)管理员权限:个人信息,管理人员,增改题库,查看成绩
(2)教师权限:个人信息,批改试卷,题库管理,查看成绩
(3)学生权限:个人信息,开始测试,查看成绩,联系老师
(2)数据加密
试题库,学生的答卷信息,教师记录的成绩信息以及用户信息都属于敏感数据,为避免随意的操作和修改,相关用户必须获得相应权限才能进行相关操作。
(3)数据备份策略
定期进行数据备份是减少数据损失的有效手段,能让数据库在遭到损坏(恶意或者误操作)后,及时恢复数据资源。
(4)二次考试
在考试中,可能某些考生因成绩不理想而擅自再次考试做答,系统要记录考生的考试状态,杜绝考生二次做答。
3、兼容性测试
本系统平台为vs2013和SQL Server 2014,兼容性良好,win7,win8,win10均可兼容。
六、收获和体会
经过将近两个月的努力,终于完成了计算机网络在线课堂测试系统的项目。在这一个多月里,我们从什么都不会的四个人,在请教同学老师和学长学姐以及自己的不断研究摸索,最终完成了项目。
从确定课程、到需求分析、到甘特图、到软件的安装、到模块功能的设计、到前台的设计、到再后台代码不断尝试修改、到最后的美工、到数据的导入、到对软件的测试、到最后的软件设计报告,一步一脚印,虽然期间遇到了无数大大小小的问题,但经过各种途径寻找解决方方案之后,最后四个人最后还是完成了项目,这便是我们两个月的努力的成果和收获。
我觉得我们的亮点在于在完成.net简单网站制作的同时,尝试的使用了三层开发架构,将系统的整个业务应用划分为表示层,业务逻辑层和数据访问层。
BLL业务逻辑层承担了大部分重要的代码,用于做一些有效性验证的工作,以更好的保证程序运行的健壮性。如完成数据添加、修改和查询业务等;不允许指定的文本框中输入空字符串,数据格式是否正确以及数据类型验证;通过以上的诸多判断以决定是否将操作继续向后传递,尽量保证程序的正常运行。
数据访问层则大胆的尝试使用了数据库的存储过程。通过存储过程存储编译好了的一些sql语句。应用程序需要用的时候直接调用就可以了,提高SQL语言的功能和灵活性,,可保证数据的安全性和完整性。同时通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
七、附录
无。
八、参考文献
[1] 刘斌,李*,等.Delphi 7数据库高级教程[M]. 北京:清华大学出版社,2004.
[2] 赵松涛.SQL Sever 2000应用及实例集锦[M]. 北京:人民邮电出版社,2002.
[3] 周绪,管丽娜,白海波.SQL Server 2000 入门与提高[M]. 北京:清华大学出版社,2001.
[4] 杜军平,黄杰.SQL Server 2000数据库开发[M]. 北京:机械工业出版社,2001.
[5] 亚林等.Delphi管理信息系统项目方案精解[M]. 北京:航空工业出版社,2006.
[6] 熊庆宇,吴映波,文俊浩,喻国良等主编. 软件工程实训项目案例I[M]. 重庆:重庆大学出版社,2013.