学生在线考试管理系统的设计与开发

摘要

随着计算机技术的不断发展,以及近些年新冠病毒的影响,线上办公,线上教学已经成为一种趋势。对于高校来说,如何考试已经成为一个难点,传统的纸质考试已经无法满足基本的需求,因此开发一个学生在线考试系统已经势在必行。

在线考试系统能够让全国各地无法到达学校的学生在家就可以参加考试,解决了当前疫情的影响,同时也让高校完成了相应的教学任务。对于高校来说,开发一套属于自己的考试系统可以有效的提升学校对学生的服务,让学校的形象在外界的眼中有所提升。

本文根据学生在线考试系统目前的发展,设计开发一个学生考试管理系统。本文将从绪论、系统开发的相关技术、系统分析、系统实现、系统测试和总结六个部分进行论述。

关键字:Mysql,Jsp,在线考试

 第一章绪论

  1.1系统的开发背景及意义

近年来,随着计算机的飞速发展,与计算机相结合的教育逐渐出现在大众的视野中,并且由于新型冠状病毒的影响,进一步促进了这一结合,还极大的促进了高校远程教育的发展。在线上课,在线考试的需求逐渐增加,与传统的考试方式相比,在线考试系统的出现极大的减少了高校的成本。

传统考试一般要经过人工出卷、人工校对、学生考试、人工阅卷、人工录入成绩等步骤。随着学生的增加教师出卷以及阅卷的工作量也在不断增加,这样的工作十分繁琐并且非常容易出现错误。同时如何存储这些纸质试卷也是一个非常大的问题,纸质试卷不但占空间且随着时间的推移纸质可能会存在一定的损伤,在未来如果学生想要查询当年的考试试卷,可能存在丢失或者破损的情况。因此,在线考试管理系统的优势就凸显了出来,在线考试系统可以将所有试题保存在数据库中,并且随着时间的推移,老师出卷的次数越来越多,这个数据库中的题目也会越来越多,这样可以在未来帮助老师快速的出很多版本的试卷,在这个过程中会减少人工校对这一过程,减少人力资源。同时在线考试系统可以帮助老师快速阅卷,这个成绩也会永久的保存在数据库中,以便学生在未来查看,降低了未来试卷和成绩丢失的风险。在线考试系统还能有效的避免学生作弊的情况,因为在线考试系统的题库越来越多,系统可以自动出卷,在每次考试前随机出卷,在考试时再随即分配,每个学生拿到的试卷不同,但是难易程度相同,在这种情况下,既可以保证公平也能杜绝抄袭的问题。在线考试系统的出现大大的简化了传统纸质考试的过程。

本文开发设计了一个基于JAVA语言的在线学生考试系统,主要采用Jsp技术实现web端,并且采用MySql数据库作为数据持久化存储的数据库。主要实现了管理员系统,试卷管理系统,以及用户考试系统等。

 1.2主要内容及结构

1、绪论

本章主要介绍学生在线考试系统开发的背景及意义,发展现况以及论文的基本结构,最后对本章进行了总结。

2.系统开发的相关技术

本章主要介绍本文所使用的相关开发技术,以及如何应用,最后对本章进行总结。

3.系统分析

本章主要针对功能需求、业务流程、数据流程、系统总体设计、系统功能模块设计和数据库设计几个方面进行介绍,最后对本章进行总结。

4.系统实现

本章主要介绍系统的实现,主要包括运行环境、主界面的实现、登录模块的实现、试卷管理模块的实现、成绩管理模块的实现、科目信息模块的实现、在线考试模块的实现和修改密码模块的实现,最后进行了总结。

5.系统测试

本章进行了黑盒测试,主要针对不同功能模块输入不同数据进行测试。

6.总结

本章对论文总体进行了总结,以及对未来进行了展望。

1.3本章总结

本章主要针对学生在线考试系统的选题背景和选题意义进行分析,并且分析了在线考试系统与传统考试方式相比所带来的好处,最后总述文章主要内容和结构。

 第2章系统开发的相关技术

  2.1Jsp技术

本文使用JAVA语言作为学生在线考试系统的主开发语言,采用JavaWeb中的Jsp技术来渲染页面达到系统的相关操作。Jsp全称javaserverpages是一种动态网页技术。将Jsp部署在服务器上,可以响应客户端发送的请求,进而根据客户端的请求动态的生成Web内容,再返回给客户端。Jsp技术将Java代码嵌入静态网页中,实现静态页面为模版,动态生成内容的效果,Jsp技术的出现增强了用户与系统的交互性,同时增加了用户的操作体验。

在编写好Jsp文件后,Jsp文件在运行时被转换为Servlet代码,再由Java编译器编译,再进行执行,从而达到用户请求,Jsp文件拿到数据库的信息,再显示给用户这一过程。

2.2Mysql数据库

本文使用Mysql数据库作为学生在线考试系统的主要数据存储方式。Mysql是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。所以本文采用Mysql数据库存储数据。

 2.3本章总结

本章主要介绍了学生在线考试系统所使用相关技术,一个是Jsp技术,另一个是对数据进行持久化存储的数据库Mysql数据库。

第3章系统分析

  3.1功能需求

根据对实际高校的需求的考察,学生在线考试系统主要应该包含管理员与用户的角色,具体需求如下表所示。

表3-1 功能需求列表

编号 功能名称 功能描述 输入内容 输出内容
1 用户注册 学生可以进行注册,注册后可以参加考试,查看成绩 用户名,密码、性别、QQ、邮箱等 注册的结果(提醒“用户注册成功”或者“用户注册失败”)
2 用户登录 学生登录在线考试管理系统 用户名、密码 用户登录是否成功
3 试卷类别添加 管理员(老师)添加新的试卷类别 要添加的试卷类别内容 试卷类别列表和添加是否成功
4 试卷类别删除 管理员(老师)删除违规的试卷类别 要删除的试卷类别 删除是否成功和删除后的试卷类别列表
5 修改个人信息 学生校对修改自己的个人简介,以便老师查看 要修改的信息 提示修改的结果
6 添加试卷 管理员(老师)添加试卷 试卷生成的相关信息 试卷列表
7 修改试卷 管理员(老师)修改试卷信息 试卷生成相关信息 是否修改成功
8 删除试卷 管理员(老师)删除试卷 试卷生成信息 试卷删除成功或失败
9 试卷审核 管理员(老师)对已经添加好的试卷再次校对审核 试卷生成审核 试卷审核是否通过
10 添加试题 管理员(老师)添加试题 试题的相关信息 试题列表
11 修改试题 管理员(老师)修改试题信息 试题相关信息 是否修改成功
12 删除试题 管理员(老师)删除试题 试题信息 试题删除成功或失败
13 试题审核 管理员(老师)对已经添加好的试题再次校对审核 试题审核 试题审核是否通过

学生在线考试系统的需求用例图如下图所示。

6fa1499dae733cb2af1b72fad6eed8c6  图3-1系统用例图

 3.2业务流程

学生在线考试系统的业务流程具体如下图所示。

b901c104c42abde305236a0dba46508f  图3-2总体业务流程图

学生管理系统的总体流程:以学生的身份在登录页面输入账号和密码,经过数据库身份验证,验证成功后登录系统主页,可以使用修改个人信息,在线考试,查询成绩等功能,以管理员(老师)的身份在登录页面输入账号和密码,经过数据库身份验证,验证成功后登录系统主页,可以使用试卷管理,试题管理,用户管理等功能。

 3.3数据流程

学生和管理员(老师)都可以通过登录系统的界面来进入系统,如下图所示:

19524eac5ef39db867c3b454d66220a1  图3-3数据流图

用户在登录学生在线考试系统时,系统通过账号和密码判断登录的是学生还是管理员(老师),再根据登录的角色跳转到不同的页面上,用户在系统内操作时,根据操作的不同数据会从页面流向Mysql数据库,再从数据库中拿到数据反馈给用户。

 3.4系统总体设计

学生在线考试系统主要分为学生和管理员(老师)两个角色操作的子系统,在这两个子系统可分为功能模块,具体功能模块如下图所示。

c69445ee57240f8f18cc3c8bf44cfbd4  图3-4系统功能图

学生子系统只能让学生使用,其中包括在线考试,成绩查询,个人信息管理等功能。

管理员(老师)子系统只能让管理员使用,其中包括试题库的增删改查、试题科目的增删改查、试卷管理的增删改查,同时管理员(老师)还可以管理系统用户信息,查询学生的分数等操作。

3.5系统功能模块设计

1.登录功能模块

该模块的主要功能是判断用户登录角色信息,判断用户是学生还是管理员(老师),在账号与密码验证成功的情况下,根据角色的不同跳转不同的显示界面,该模块是整个系统的入口。

2.系统用户管理模块

超级管理员可以增加新的管理员(老师),可以对其密码进行修改,可以给管理员(老师)具体的权限,可以修改管理员(老师)的信息,也可以删除管理员(老师)账号。

3.学生用户管理

管理员(老师)可以管理学生用户,可以对其信息进行修改,可以添加新的学生用户,修改密码等操作。

4.修改密码模块

超级管理员,管理员(老师),以及学生用户都可以自行修改密码,超级管理员和管理员(老师)在用户管理界面时也可以修改学生用户的密码。当用户修改密码后,需要重新登录系统。

5.试卷管理模块

该模块只能由超级管理员和管理员(老师)进行操作,在该模块中可以对系统中试卷类别进行查询、删除、修改、新增。并且在增加了试卷后,可以添加试题,且可以对试题进行修改、删除、查询等操作。

6、个人资料管理

该模块主要由学生用户使用,当学生登录系统后,可以校对修改个人资料,比如电话号码、QQ号码、邮箱、家庭住址等信息,而用户名,学号等学校分配信息无法修改只能查看。

7.登录状态管理

该模块在系统中的每个用户都可使用,用户可以查看个人历史登录信息,例如登录IP、登录时间、登录地址、登录设备等信息,防止账号被盗,修改系统信息。

8.操作日志管理

该模块在系统中的每个用户都可使用,用户可以查看个人操作历史日志。管理员(老师)用户添加了一套试卷,在日志上可以查询到相关操作信息,学生用户考试后,应显示考试时间及类型等信息,加强系统的安全性。

9.成绩查阅

该模块主要是学生用户在使用,在学生登录系统后,可以进行相关操作查看已经进行过的考试成绩。

  3.6数据库设计

学生在线考试系统采用Mysql数据库,本系统主要包括系统用户表、成绩表、错题记录、单选题表、单选题数据分析表、科目信息表、判断题表、试卷表、填空题表、问答题表和学生得分表11个表,每个表的具体设计情况如下所示。

表3-2 系统用户表

序号 字段名称 字段类型 大小 允许为空 最大长度 备注
1 ID Int 4 自增 10
2 username VarChar 50 255
3 pwd VarChar 50 255
4 cx VarChar 50 255
5 addtime DateTime 8 23

表3-3 成绩表

序号 字段名称 字段类型 大小 允许为空 最大长度 备注
1 ID Int 4 自增 10
2 username VarChar 50 255
3 cj Float 8 15
4 zcj Float 8 15
5 sjbh VarChar 50 255
6 addtime DateTime 8 23

表3-4 错题记录表

序号 字段名称 字段类型 大小 允许为空 最大长度 备注
1 ID Int 4 自增 10
2 username VarChar 50 255
3 biao VarChar 50 255
4 timuid VarChar 50 255
5 sjbh VarChar 50 255
6 cwda VarChar 500 255
7 addtime DateTime 8 23

表3-5 单选题表

序号 字段名称 字段类型 大小 允许为空 最大长度 备注
1 ID Int 4 自增 10
2 bianhao VarChar 50 255
3 shiti VarChar 500 255
4 kemumingcheng VarChar 50 255
5 xuanxiangA VarChar 50 255
6 xuanxiangB VarChar 50 255
7 xuanxiangC VarChar 50 255
8 xuanxiangD VarChar 50 255
9 daan VarChar 50 255
10 addtime DateTime 8 23

表3-6 单选题数据分析表

序号 字段名称 字段类型 大小 允许为空 最大长度 备注
1 ID Int 4 自增 10
2 timuid VarChar 50 255
3 kscs Int 4 10
4 xas Int 4 10
5 xbs Int 4 10
6 xcs Int 4 10
7 xds Int 4 10
8 addtime DateTime 8 23

表3-7 科目信息表

序号 字段名称 字段类型 大小 允许为空 最大长度 备注
1 ID Int 4 自增 10
2 kemumingcheng VarChar 50 255
3 addtime DateTime 8 23

表3-8 判断题表

序号 字段名称 字段类型 大小 允许为空 最大长度 备注
1 ID Int 4 自增 10
2 bianhao VarChar 50 255
3 shiti VarChar 500 255
4 kemumingcheng VarChar 50 255
5 daan VarChar 50 255
6 addtime DateTime 8 23

表3-9 试卷表

序号 字段名称 字段类型 大小 允许为空 最大长度 备注
1 ID Int 4 自增 10
2 shijuanbianhao VarChar 50 255
3 kemumingcheng VarChar 50 255
4 xuanzetishu VarChar 50 255
5 xuanzetifenzhi VarChar 50 255
6 panduantishu VarChar 50 255
7 panduantifenzhi VarChar 50 255
8 tiankongtishu VarChar 50 255
9 tiankongtifenzhi VarChar 50 255
10 wendatishu VarChar 50 255
11 danxuanti VarChar 300 255
12 panduanti VarChar 300 255
13 tiankongti VarChar 300 255
14 wendati VarChar 300 255
15 kaishiriqi VarChar 50 255
16 jieshuriqi VarChar 50 255
17 tianjiaren VarChar 50 255
18 addtime DateTime 8 23

表3-10 填空题表

序号 字段名称 字段类型 大小 允许为空 最大长度 备注
1 ID Int 4 自增 10
2 bianhao VarChar 50 255
3 shiti VarChar 500 255
4 kemumingcheng VarChar 50 255
5 daan VarChar 50 255
6 addtime DateTime 8 23

表3-11 问答题表

序号 字段名称 字段类型 大小 允许为空 最大长度 备注
1 ID Int 4 自增编号 10
2 bianhao VarChar 50 255
3 shiti VarChar 500 255
4 kemumingcheng VarChar 50 255
5 addtime DateTime 8 23

表3-12 学生得分表

序号 字段名称 字段类型 大小 允许为空 最大长度 备注
1 ID Int 4 自增编号 10
2 username VarChar 50 255
3 timuid VarChar 50 255
4 xueshengdaan VarChar 500 255
5 defen Float 8 15
6 sjbh VarChar 50 255
7 addtime DateTime 8 23

3.7本章总结

本章主要针对学生在线考试系统的功能需求、业务流程、数据流程、系统总体设计、系统功能模块设计和数据库设计几个方面展开,利用图表的形式展示了系统中各个部分的设计情况,并配有文字详细描述了各个功能模块的设计使用情况。

 第4章系统实现

  4.1运行环境

本系统运行所需的软硬件要求如下表所示。

表5-1硬软件要求

要求
处理器 奔腾III以上,2GB
内 存 2GB以上
硬 盘 500GB以上
显 卡 核心显卡以上
操作系统 Windows XP或 Windows7以上
应用软件 IE浏览器

 4.2主界面的实现

本文实现的是一个学生在线考试系统,该系统包含系统用户管理模块、科目管理模块、试题库管理模块、试卷管理模块、成绩管理模块和系统管理模块,主界面如图所示。

图4-1系统主界面

f757f0d6f673c3678ece5bfe24594afd  主界面相关代码如下所示。

<%@ page language=”java” pageEncoding=”gb2312″%>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml”>

<head>

<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″ />

<meta http-equiv=”X-UA-Compatible” content=”IE=EmulateIE9″ />

<link rel=”icon” href=”favicon.ico” type=”image/x-icon” />

<title>在线考试系统 – 后台控制面板</title>

</head>

<frameset rows=”96,*” frameborder=”no” border=”0″ framespacing=”0″>

<frame src=”top.jsp” noresize=”noresize” id=”topFrame” frameborder=”0″ name=”topFrame” marginwidth=”0″ marginheight=”0″ scrolling=”no”>

<frameset rows=”*” cols=”185,*” id=”frame” framespacing=”0″ frameborder=”no” border=”0″>

<frame src=”mygo.jsp” name=”leftFrame” id=”leftFrame” noresize=”noresize” marginwidth=”0″ marginheight=”0″ frameborder=”0″ scrolling=”yes”>

<frame src=”sy.jsp” name=”main” id=”main” marginwidth=”8″ marginheight=”5″ frameborder=”0″ scrolling=”yes”>

</frameset>

<noframes>

<body>当前浏览器不支持框架!</body>

</noframes>

</frameset>

</html>

代码4-1系统主界面代码

<%@ page language=”java” import=”java.util.*” pageEncoding=”gb2312″%>

<%@page import=”util.Info”%>

<%@page import=”dao.CommDAO”%>

<%@page import=”util.PageManager”%>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml”>

<head>

<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″/>

<meta http-equiv=”X-UA-Compatible” content=”IE=EmulateIE9″ />

<link href=”css/left.css” type=”text/css” rel=”stylesheet” />

<title>左侧菜单</title>

<script src=”js/jquery.min.js”></script>

<script language=”javascript” type=”text/javascript” charset=”utf-8″ src=”js/admin.js”></script>

</head>

<body oncontextmenu=”return false” ondragstart=”return false” onSelectStart=”return false”>

<div class=”div_bigmenu”>

<div class=”div_bigmenu_nav_down” id=”nav_1″ onclick=”javascript:lefttoggle(1);”>系统用户管理</div>

<ul id=”ul_1″>

<li><a href=”yhzhgl.jsp” target=’main’>管理员用户</a></li>

<li><a href=”mod.jsp” target=’main’>修改密码</a></li>

</ul>

</div>

<div class=”div_bigmenu”>

<div class=”div_bigmenu_nav_down” onclick=”javascript:lefttoggle(2);” id=”nav_2″>科目管理</div>

<ul id=”ul_2″>

<li><a href=”kemuxinxi_add.jsp” target=’main’>科目添加</a></li>

<li><a href=”kemuxinxi_list.jsp” target=’main’>科目查询</a></li>

</ul>

</div>

<div class=”div_bigmenu”>

<div class=”div_bigmenu_nav_down” onclick=”javascript:lefttoggle(3);” id=”nav_3″>试题库管理</div>

<ul id=”ul_3″>

<li><a href=”danxuanti_add.jsp” target=’main’>单选题添加</a></li>

<li><a href=”danxuanti_list.jsp” target=’main’>单选题查询</a></li>

<li><a href=”panduanti_add.jsp” target=’main’>判断题添加</a></li>

<li><a href=”panduanti_list.jsp” target=’main’>判断题查询</a></li>

<li><a href=”tiankongti_add.jsp” target=’main’>填空题添加</a></li>

<li><a href=”tiankongti_list.jsp” target=’main’>填空题查询</a></li>

<li><a href=”wendati_add.jsp” target=’main’>问答题添加</a></li>

<li><a href=”wendati_list.jsp” target=’main’>问答题查询</a></li>

</ul>

</div>

<div class=”div_bigmenu”>

<div class=”div_bigmenu_nav_down” onclick=”javascript:lefttoggle(5);” id=”nav_5″>试卷管理</div>

<ul id=”ul_5″>

<li><a href=”shijuanshengcheng_add.jsp” target=’main’>试卷生成</a></li>

<li><a href=”shijuanshengcheng_list.jsp” target=’main’>试卷查询</a></li>

</ul>

</div>

<div class=”div_bigmenu”>

<div class=”div_bigmenu_nav_down” onclick=”javascript:lefttoggle(4);” id=”nav_4″>成绩管理</div>

<ul id=”ul_4″>

<li><a href=”cj_list3.jsp” target=’main’>主观题打分</a></li>

<li><a href=”cj_list.jsp” target=’main’>成绩查询</a></li>

</ul>

</div>

<!– <div class=”div_bigmenu”>

<div class=”div_bigmenu_nav_down” onclick=”javascript:lefttoggle(7);” id=”nav_7″>数据分析管理</div>

<ul id=”ul_7″>

<li><a href=”zhuzhuangtu.jsp” target=’main’>数据分析柱状图</a></li>

</ul>

</div>–>

<div class=”div_bigmenu”>

<div class=”div_bigmenu_nav_down” onclick=”javascript:lefttoggle(6);” id=”nav_6″>系统管理</div>

<ul id=”ul_6″>

<li><a href=”databack.jsp” target=’main’>数据备份</a></li>

</ul>

</div>

</body>

</html>

代码4-2系统主界面管理员(老师)左侧菜单代码

<%@ page language=”java” import=”java.util.*” pageEncoding=”gb2312″%>

<%@page import=”util.Info”%>

<%@page import=”dao.CommDAO”%>

<%@page import=”util.PageManager”%>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml”>

<head>

<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″/>

<meta http-equiv=”X-UA-Compatible” content=”IE=EmulateIE9″ />

<link href=”css/left.css” type=”text/css” rel=”stylesheet” />

<title>左侧菜单</title>

<script src=”js/jquery.min.js”></script>

<script language=”javascript” type=”text/javascript” charset=”utf-8″ src=”js/admin.js”></script>

</head>

<body oncontextmenu=”return false” ondragstart=”return false” onSelectStart=”return false”>

<div class=”div_bigmenu”>

<div class=”div_bigmenu_nav_down” id=”nav_1″ onclick=”javascript:lefttoggle(1);”>密码修改</div>

<ul id=”ul_1″>

<li><a href=”mod.jsp” target=’main’>密码修改</a></li>

</ul>

</div>

<div class=”div_bigmenu”>

<div class=”div_bigmenu_nav_down” onclick=”javascript:lefttoggle(2);” id=”nav_2″>考试管理</div>

<ul id=”ul_2″>

<li><a href=”shijuanshengcheng_list2.jsp” target=’main’>在线考试</a></li>

</ul>

</div>

<div class=”div_bigmenu”>

<div class=”div_bigmenu_nav_down” onclick=”javascript:lefttoggle(3);” id=”nav_3″>我的成绩</div>

<ul id=”ul_3″>

<li><a href=”cj_list2.jsp” target=’main’>我的成绩</a></li>

</ul>

</div>

</body>

</html>

代码4-3系统主界面学生左侧菜单代码

4.3登录模块的实现

用户登录分为超级管理员、管理员(老师)和学生。首先用户输入账号和密码,点击登录后系统调取数据库的数据进行比对,首先对比账号密码是否正确,如果正确则返回用户的权限,然后系统进入相应的主界面。登录模块流程图如下图所示。

7e4ead424d580942f76da7c98245c888  图4-2登录流程图

登录界面如下图所示。

67fe484c120a0c311e789ab11a1ce514  图4-3登录界面

登录相关核心代码如下所示。

<%@ page language=”java” import=”java.util.*” pageEncoding=”gb2312″%>

<%@page import=”util.Info”%>

<%@page import=”dao.CommDAO”%>

<%@page import=”util.PageManager”%>

<html>

<head>

<title>在线考试系统</title>

<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>

<style type=”text/css”>

<!–

*{overflow:hidden; font-size:9pt;}

body {

margin-left: 0px;

margin-top: 0px;

margin-right: 0px;

margin-bottom: 0px;

background-repeat: repeat-x;

background-image: url(images/bg.jpg);

background-color: #1d3e47;

}

–>

</style>

</head>

<script type=”text/javascript”>

<%

String error = (String)request.getAttribute(“error”);

if(error!=null)

{

%>

alert(“用户名或密码错误”);

<%}%>

<%

String random = (String)request.getAttribute(“random”);

if(random!=null)

{

%>

alert(“验证码错误”);

<%}%>

popheight = 39;

function check()

{

if(document.form1.username.value==”” || document.form1.pwd.value==”” || document.form1.pagerandom.value==””)

{

alert(‘请输入完整’);

return false;

}

}

function loadimage(){

document.getElementById(“randImage”).src = “image.jsp?”+Math.random();

}

</script>

<body leftmargin=”0″ topmargin=”0″ marginwidth=”0″ marginheight=”0″>

<table width=”1000″ height=”564″ border=”0″ align=”center” cellpadding=”0″ cellspacing=”0″ background=”images/login.jpg” id=”__01″>

<tr>

<td height=”193″ colspan=”3″><div align=”center” style=”color: #CCFFCC;font-size: 26pt;font-weight: bold;”>在线考试系统</div></td>

</tr>

<tr>

<td width=”352″ rowspan=”2″ valign=”top”></td>

<td width=”211″ height=”152″><form action=”jspmzxksxtdzkf95?ac=adminlogin&a=a” method=”post” name=”form1″ style=”display: inline”><table width=”205″ border=”0″ align=”center” cellpadding=”0″ cellspacing=”0″>

<tr>

<td width=”44″ height=”30″><span class=”STYLE9″>用户:</span></td>

<td height=”30″ colspan=”2″><input name=”username” type=”text” id=”username” style=”width:100px; height:16px; border:solid 1px #000000; color:#666666″></td>

</tr>

<tr>

<td height=”30″><span class=”STYLE9″>密码:</span></td>

<td height=”30″ colspan=”2″><input name=”pwd” type=”password” id=”pwd” style=”width:100px; height:16px; border:solid 1px #000000; color:#666666″></td>

</tr>

<tr>

<td height=”30″><span class=”STYLE9″>权限:</span></td>

<td height=”30″ colspan=”2″><select name=”cx” id=”cx”>

<option value=”管理员”>管理员</option>

<option value=”普通用户”>普通用户</option>

</select>

</td>

</tr>

<tr>

<td height=”30″><span class=”STYLE9″>验证码:</span></td>

<td width=”59″ height=”30″><input name=”pagerandom” type=”text” id=”pagerandom” style=” height:20px; border:solid 1px #000000; color:#666666; width:50px” />

<td width=”102″><a href=”javascript:loadimage();”><img alt=”看不清请点我!” name=”randImage” id=”randImage” src=”image.jsp” width=”60″ height=”20″ border=”1″ align=”absmiddle”> </a></td>

</tr>

<tr>

<td height=”30″ colspan=”3″><input type=”submit” name=”Submit” value=”登陆” onClick=”return check();” style=”background:url(images/the_formbtn.gif) no-repeat;color:#000000;width:80px;height: 24px; border:0px;line-height:24px; font-size:12px;margin-right: 5px; cursor:pointer”>

<input type=”reset” name=”Submit2″ value=”重置” style=”background:url(images/the_formbtn.gif) no-repeat;color:#000000;width:80px;height: 24px; border:0px;line-height:24px; font-size:12px;margin-right: 5px; cursor:pointer” ></td>

</tr>

</table> </form></td>

<td width=”437″ rowspan=”2″></td>

</tr>

<tr>

<td></td>

</tr>

</table>

</body>

</html>

代码4-4 登录核心代码

登录成功后会根据不同角色跳转不同的页面,不同角色有不同的操作权限。如下图所示为管理员管理用户操作。

2c8154aa4c5a22f72be1b4b9a7192bcc  图4-4 管理员用户管理界面

管理员用户管理核心代码如下所示。

<%@ page language=”java” import=”java.util.*” pageEncoding=”gb2312″%>

<%@page import=”util.Info”%>

<%@page import=”dao.CommDAO”%>

<%@page import=”util.PageManager”%>

<%

if(request.getSession().getAttribute(“username”)==null )

{

out.print(“<script>javascript:alert(‘对不起,您已超时或未登陆,请在IE中重新打开登陆!’);window.close();</script>”);

out.close();

}

else

{

if(request.getSession().getAttribute(“cx”).equals(“超级管理员”))

{}

else

{

out.print(“<script>javascript:alert(‘对不起,您无权操作此模块!’);history.back();</script>”);

out.close();

}

}

%>

<html>

<head>

<title>管理员用户管理</title><link rel=”stylesheet” href=”css.css” type=”text/css”>

</head>

<%

new CommDAO().delete(request,”allusers”);

HashMap ext = new HashMap();

new CommDAO().insert(request,response,”allusers”,ext,true,false,””);

%>

<body >

<form action=”yhzhgl.jsp?f=f” method=”post” name=”f1″ onsubmit=”return checkform();”>

<table width=”100%” border=”1″ align=”center” cellpadding=”3″ cellspacing=”1″ bordercolor=”#00FFFF” style=”border-collapse:collapse”>

<tr>

<td width=”200″>用户名:</td>

<td><input name=”username” type=”text” id=”username” onblur=’checkform()’ /> <label id=’clabelusername’ />

*</td>

</tr>

<tr>

<td width=”200″>密码:</td>

<td><input name=”pwd” type=”password” id=”pwd” onblur=’checkform()’ /> <label id=’clabelpwd’ />

*</td>

</tr>

<tr>

<td width=”200″>确认密码:</td>

<td><input name=”pwd2″ type=”password” id=”pwd2″ onblur=’checkform()’ /> <label id=’clabelpwd2′ />

*</td>

</tr>

<tr>

<td>权限:</td>

<td><select name=”cx” id=”cx”>

<option value=”超级管理员”>超级管理员</option>

<option value=”普通用户”>普通用户</option>

</select></td>

</tr>

<tr>

<td width=”200″></td>

<td><input name=”Submit” type=”submit” value=”提交” />

<input name=”Submit2″ type=”reset” value=”重置” /></td>

</tr>

</table>

</form>

<p>已有管理员列表:</p>

<table width=”100%” border=”1″ align=”center” cellpadding=”3″ cellspacing=”1″ bordercolor=”#00FFFF” style=”border-collapse:collapse”>

<tr>

<td bgcolor=”A4B6D7″>序号</td>

<td bgcolor=”A4B6D7″>用户名</td>

<td bgcolor=”A4B6D7″>密码</td>

<td bgcolor=”A4B6D7″>权限</td>

<td bgcolor=”A4B6D7″>添加时间</td>

<td bgcolor=”A4B6D7″>操作</td>

</tr>

<%

int i=0;

for(HashMap map:new CommDAO().select(“select * from allusers order by id desc “)){

i++;

%>

<tr>

<td><%=i %></td>

<td><%=map.get(“username”) %></td>

<td><%=map.get(“pwd”) %></td>

<td><%=map.get(“cx”) %></td>

<td><%=map.get(“addtime”) %></td>

<td><a href=”yhzhgl.jsp?scid=<%=map.get(“id”) %>” onClick=”return confirm(‘真的要删除?’)”>删除</a></td>

</tr>

<%}%>

</table>

</body>

</html>

<script language=javascript src=’js/My97DatePicker/WdatePicker.js’></script>

<script language=javascript src=’js/popup.js’></script>

<script language=javascript src=’js/ajax.js’></script>

<%@page import=”java.util.ArrayList”%>

<%@page import=”java.util.HashMap”%>

<script language=javascript >

function checkform(){

var usernameobj = document.getElementById(“username”);

if(usernameobj.value==””){

document.getElementById(“clabelusername”).innerHTML=”<font color=red>请输入用户名</font>”;

return false;

}else{

document.getElementById(“clabelusername”).innerHTML=” “;

}

var usernameobj = document.getElementById(“username”);

if(usernameobj.value!=””){

var ajax = new AJAX();

ajax.post(“factory/checkno.jsp?table=allusers&col=username&value=”+usernameobj.value+”&checktype=insert&ttime=<%=Info.getDateStr()%>”)

var msg = ajax.getValue();

if(msg.indexOf(‘Y’)>-1){

document.getElementById(“clabelusername”).innerHTML=”<font color=red>用户名已存在</font>”;

return false;

}else{document.getElementById(“clabelusername”).innerHTML=” “;

}

}

var pwdobj = document.getElementById(“pwd”);

if(pwdobj.value==””){

document.getElementById(“clabelpwd”).innerHTML=”<font color=red>请输入密码</font>”;

return false;

}else{

document.getElementById(“clabelpwd”).innerHTML=” “;

}

var pwd2obj = document.getElementById(“pwd2″);

if(pwd2obj.value==””){

document.getElementById(“clabelpwd2″).innerHTML=”<font color=red>请再次输入密码</font>”;

return false;

}else{

document.getElementById(“clabelpwd2″).innerHTML=” “;

}

if(pwd2obj.value!=pwdobj.value){

document.getElementById(“clabelpwd2″).innerHTML=”<font color=red>两次密码输入不一致</font>”;

return false;

}else{

document.getElementById(“clabelpwd2″).innerHTML=” “;

}

return true;

}

popheight=450;

</script>

代码4-5 管理员用户管理代码

4.4试卷管理模块的实现

当管理员(老师)登录后,想要添加试卷,首先点击左侧的试卷管理按钮,跳转到相应的页面,然后再点击添加按钮,之后页面会跳转到shijuan_add.jsp页面。当试卷添加成功后,管理员可以在shijuan_list.jsp页面对已经生成的试卷进行管理,该页面可以显示所有试卷信息,且每条试卷有对应的删除和修改按钮,当管理员点击删除后,会将数据库中该试卷信息删除,在shijuan_list.jsp也同样删除该条数据。当管理员点击修改后,页面跳转到shijuan_update.jsp,可以对试卷信息进行相应的修改。

试卷管理流程图如下图所示。

图4-5试卷管理流程图

试卷添加页面如下图所示。

图4-6试卷添加页面

试卷添加核心代码如下所示。

<%@ page language=”java” import=”java.util.*” pageEncoding=”gb2312″%>

<%@page import=”util.Info”%>

<%@page import=”dao.CommDAO”%>

<%@page import=”util.PageManager”%>

<html>

<head>

<title>试卷生成</title>

<!–bixanjxiqxi–>

<LINK href=”css.css” type=text/css rel=stylesheet>

<script type=”text/javascript” src=”js/My97DatePicker/WdatePicker.js” charset=”gb2312″></script>

<script type=”text/javascript” src=”js/popup.js”></script>

</head>

<%

String id=””;

//xuxyaxodenxglxu

//islbd1q id=request.getParameter(“id”);

//islbd1q HashMap mlbdq = new CommDAO().getmap(id,”melieibaoduqubiaoiguo”);

//islbd2q HashMap mlbdq = new CommDAO().getmaps(“hsgzhujian”,(String)request.getSession().getAttribute(“username”),”melieibaoduqubiaoiguo”);

//islbdq gogogogogo

//islbdq lelelelelele

%>

<script language=”javascript”>

function gow()

{

document.location.href=”shijuanshengcheng_add.jsp?id=<%=id%>”;

}

</script>

<!–hxsglxiangdxongjxs–>

<%

HashMap ext = new HashMap();

if(request.getParameter(“f”)!=null){

int nxuanzetishu = Integer.parseInt(request.getParameter(“xuanzetishu”));

int npanduantishu = Integer.parseInt(request.getParameter(“panduantishu”));

int ntiankongtishu = Integer.parseInt(request.getParameter(“tiankongtishu”));

int nwendatishu = Integer.parseInt(request.getParameter(“wendatishu”));

String shijuanbianhao=request.getParameter(“shijuanbianhao”);String kemumingcheng=request.getParameter(“kemumingcheng”);String danxuanti=request.getParameter(“danxuanti”);String panduanti=request.getParameter(“panduanti”);String tiankongti=request.getParameter(“tiankongti”);String wendati=request.getParameter(“wendati”);String tianjiaren=request.getParameter(“tianjiaren”);

String sql3= “select * from danxuanti where kemumingcheng='”+kemumingcheng+”‘ “;

CommDAO dao = new CommDAO();

List<HashMap> userlist1 = dao.select(sql3);

if(userlist1.size()<nxuanzetishu)

{

out.print(“<script>alert(‘对不起,单选题数不足!’);location.href=’sy.jsp’;</script>”);

return;

}

String sql4= “select * from panduanti where kemumingcheng='”+kemumingcheng+”‘ “;

CommDAO dao2 = new CommDAO();

List<HashMap> userlist2 = dao2.select(sql4);

if(userlist2.size()<npanduantishu)

{

out.print(“<script>alert(‘对不起,判断题数不足!’);location.href=’sy.jsp’;</script>”);

return;

}

String sql5= “select * from tiankongti where kemumingcheng='”+kemumingcheng+”‘ “;

CommDAO dao3 = new CommDAO();

List<HashMap> userlist3 = dao3.select(sql5);

if(userlist3.size()<ntiankongtishu)

{

out.print(“<script>alert(‘对不起,填空题数不足!’);location.href=’sy.jsp’;</script>”);

return;

}

String sql7= “select * from wendati where kemumingcheng='”+kemumingcheng+”‘ “;

CommDAO dao7 = new CommDAO();

List<HashMap> userlist7 = dao7.select(sql7);

if(userlist7.size()<nwendatishu)

{

out.print(“<script>alert(‘对不起,问答题数不足!’);location.href=’sy.jsp’;</script>”);

return;

}

for(HashMap map:new CommDAO().select(“select top ” + nxuanzetishu + ” id from danxuanti where kemumingcheng='”+kemumingcheng+”‘ order by newid()”)){

id=id+map.get(“id”)+”,”;

}

id=id.substring(0,id.length()-1);

String id2=””;

for(HashMap map:new CommDAO().select(“select top ” + ntiankongtishu + ” id from tiankongti where kemumingcheng='”+kemumingcheng+”‘ order by newid()”)){

id2=id2+map.get(“id”)+”,”;

}

id2=id2.substring(0,id2.length()-1);

String id5=””;

for(HashMap map:new CommDAO().select(“select top ” + npanduantishu + ” id from panduanti where kemumingcheng='”+kemumingcheng+”‘ order by newid()”)){

id5=id5+map.get(“id”)+”,”;

}

id5=id5.substring(0,id5.length()-1);

String id6=””;

for(HashMap map:new CommDAO().select(“select top ” + nwendatishu + ” id from wendati where kemumingcheng='”+kemumingcheng+”‘ order by newid()”)){

id6=id6+map.get(“id”)+”,”;

}

id6=id6.substring(0,id6.length()-1);

ext.put(“danxuanti”,id);

ext.put(“tiankongti”,id2);

ext.put(“panduanti”,id5);

ext.put(“wendati”,id6);

}

new CommDAO().insert(request,response,”shijuanshengcheng”,ext,true,false,””);

%>

<body >

<form action=”shijuanshengcheng_add.jsp?f=f” method=”post” name=”form1″ onsubmit=”return checkform();”>

添加试卷生成:

<br><br>

<table width=”100%” border=”1″ align=”center” cellpadding=”3″ cellspacing=”1″ bordercolor=”#00FFFF” style=”border-collapse:collapse”>

<tr><td width=”200″>试卷编号:</td><td><input name=’shijuanbianhao’ type=’text’ id=’shijuanbianhao’ value=” onblur=’checkform()’ style=’border:solid 1px #000000; color:#666666′ />*<label id=’clabelshijuanbianhao’ /></td></tr>

<tr><td>科目名称:</td><td><%=Info.getselect(“kemumingcheng”,”kemuxinxi”,”kemumingcheng”)%>*<label id=’clabelkemumingcheng’ /></td></tr>

<tr>

<td>选择题数:</td>

<td><input name=’xuanzetishu’ type=’text’ id=’xuanzetishu’ value=” onblur=” style=’border:solid 1px #000000; color:#666666′ /></td>

</tr>

<tr>

<td>选择题分值:</td>

<td><input name=’xuanzetifenzhi’ type=’text’ id=’xuanzetifenzhi’ value=” onblur=” style=’border:solid 1px #000000; color:#666666′ /></td>

</tr>

<tr>

<td>判断题数:</td>

<td><input name=’panduantishu’ type=’text’ id=’panduantishu’ value=” onblur=” style=’border:solid 1px #000000; color:#666666′ /></td>

</tr>

<tr>

<td>判断题分值:</td>

<td><input name=’panduantifenzhi’ type=’text’ id=’panduantifenzhi’ value=” onblur=” style=’border:solid 1px #000000; color:#666666′ /></td>

</tr>

<tr>

<td>填空题数:</td>

<td><input name=’tiankongtishu’ type=’text’ id=’tiankongtishu’ value=” onblur=” style=’border:solid 1px #000000; color:#666666′ /></td>

</tr>

<tr>

<td>填空镇分值:</td>

<td><input name=’tiankongtifenzhi’ type=’text’ id=’tiankongtifenzhi’ value=” onblur=” style=’border:solid 1px #000000; color:#666666′ /></td>

</tr>

<tr>

<td>问答题数:</td>

<td><input name=’wendatishu’ type=’text’ id=’wendatishu’ value=” onblur=” style=’border:solid 1px #000000; color:#666666′ /></td>

</tr>

<tr><td width=”200″>开始日期:</td><td><input name=’kaishiriqi’ type=’text’ id=’kaishiriqi’ value=” onblur=” readonly=’readonly’ onClick=”WdatePicker({‘dateFmt’:’yyyy-MM-dd’})” style=’width:100px; height:16px; border:solid 1px #000000; color:#666666’/></td></tr>

<tr><td width=”200″>结束日期:</td><td><input name=’jieshuriqi’ type=’text’ id=’jieshuriqi’ value=” onblur=” readonly=’readonly’ onClick=”WdatePicker({‘dateFmt’:’yyyy-MM-dd’})” style=’width:100px; height:16px; border:solid 1px #000000; color:#666666’/></td></tr>

<tr><td width=”200″>添加人:</td><td><input name=’tianjiaren’ type=’text’ id=’tianjiaren’ onblur=” style=’border:solid 1px #000000; color:#666666′ value='<%=request.getSession().getAttribute(“username”)%>’ readonly=”readonly” /></td></tr>

<tr>

<td></td>

<td><input type=”submit” name=”Submit” value=”提交” style=’border:solid 1px #000000; color:#666666′ />

<input type=”reset” name=”Submit2″ value=”重置” style=’border:solid 1px #000000; color:#666666′ /></td>

</tr>

</table>

</form>

</body>

</html>

<!–suxilxatxihuxan–>

<script language=javascript src=’js/My97DatePicker/WdatePicker.js’></script>

<script language=javascript src=’js/ajax.js’></script>

<%@page import=”java.util.ArrayList”%>

<%@page import=”java.util.HashMap”%>

<script language=javascript >

function checkform(){

var shijuanbianhaoobj = document.getElementById(“shijuanbianhao”); if(shijuanbianhaoobj.value==””){document.getElementById(“clabelshijuanbianhao”).innerHTML=”<font color=red>请输入试卷编号</font>”;return false;}else{document.getElementById(“clabelshijuanbianhao”).innerHTML=” “; }

var shijuanbianhaoobj = document.getElementById(“shijuanbianhao”);

if(shijuanbianhaoobj.value!=””){

var ajax = new AJAX();

ajax.post(“factory/checkno.jsp?table=shijuanshengcheng&col=shijuanbianhao&value=”+shijuanbianhaoobj.value+”&checktype=insert&ttime=<%=Info.getDateStr()%>”)

var msg = ajax.getValue();

if(msg.indexOf(‘Y’)>-1){

document.getElementById(“clabelshijuanbianhao”).innerHTML=”<font color=red>试卷编号已存在</font>”;

return false;

}else{document.getElementById(“clabelshijuanbianhao”).innerHTML=” “;

}

}

var kemumingchengobj = document.getElementById(“kemumingcheng”); if(kemumingchengobj.value==””){document.getElementById(“clabelkemumingcheng”).innerHTML=”<font color=red>请输入科目名称</font>”;return false;}else{document.getElementById(“clabelkemumingcheng”).innerHTML=” “; }

return true;

}

popheight=450;

</script>

代码4-6试卷添加核心代码

试卷管理页面如下图所示。

图4-7试卷管理页面

试卷管理核心代码如下所示。

<%@ page language=”java” import=”java.util.*” pageEncoding=”gb2312″%>

<%@page import=”util.Info”%>

<%@page import=”dao.CommDAO”%>

<%@page import=”util.PageManager”%>

<html>

<head>

<title>试卷生成</title>

<LINK href=”css.css” type=text/css rel=stylesheet>

<script type=”text/javascript” src=”js/My97DatePicker/WdatePicker.js” charset=”gb2312″></script>

</head>

<!–hxsglxiangdxongjxs–>

<body >

<p>已有试卷生成列表:</p>

<form name=”form1″ id=”form1″ method=”post” action=””>

搜索: 试卷编号:<input name=”shijuanbianhao” type=”text” id=”shijuanbianhao” style=’border:solid 1px #000000; color:#666666′ size=”12″ /> 科目名称:<%=Info.getselect(“kemumingcheng”,”kemuxinxi”,”kemumingcheng”,” 1=1 “)%> 开始日期:<input name=”kaishiriqi1″ type=”text” id=”kaishiriqi1″ value=” onClick=”WdatePicker({‘dateFmt’:’yyyy-MM-dd’})” style=’width:80px; height:20px; border:solid 1px #000000; color:#666666′ />-<input name=”kaishiriqi2″ type=”text” id=”kaishiriqi2″ value=” onClick=”WdatePicker({‘dateFmt’:’yyyy-MM-dd’})” style=’width:80px; height:20px; border:solid 1px #000000; color:#666666′ /> 结束日期:<input name=”jieshuriqi1″ type=”text” id=”jieshuriqi1″ value=” onClick=”WdatePicker({‘dateFmt’:’yyyy-MM-dd’})” style=’width:80px; height:20px; border:solid 1px #000000; color:#666666′ />-<input name=”jieshuriqi2″ type=”text” id=”jieshuriqi2″ value=” onClick=”WdatePicker({‘dateFmt’:’yyyy-MM-dd’})” style=’width:80px; height:20px; border:solid 1px #000000; color:#666666′ /> 添加人:<input name=”tianjiaren” type=”text” id=”tianjiaren” style=’border:solid 1px #000000; color:#666666′ size=”12″ />

<input type=”submit” name=”Submit” value=”查找” style=’border:solid 1px #000000; color:#666666′ /> <input type=”button” name=”Submit2″ value=”导出EXCEL” style=’border:solid 1px #000000; color:#666666′ onClick=”javascript:location.href=’shijuanshengcheng_listxls.jsp’;” />

</form>

<table width=”100%” border=”1″ align=”center” cellpadding=”3″ cellspacing=”1″ bordercolor=”00FFFF” style=”border-collapse:collapse”>

<tr>

<td width=”31″ align=”center” bgcolor=”CCFFFF”>序号</td>

<td width=”214″ bgcolor=’#CCFFFF’>试卷编号</td>

<td width=”162″ bgcolor=’#CCFFFF’>科目名称</td>

<td width=”193″ bgcolor=’#CCFFFF’>单选题</td>

<td width=”160″ bgcolor=’#CCFFFF’>单选题分值</td>

<td width=”160″ bgcolor=’#CCFFFF’>判断题</td>

<td width=”133″ bgcolor=’#CCFFFF’>判断题分值</td>

<td width=”133″ bgcolor=’#CCFFFF’>填空题</td>

<td bgcolor=’#CCFFFF’ width=’134′ align=’left’>填空题分值</td>

<td bgcolor=’#CCFFFF’ width=’134′ align=’center’>问答题</td>

<td bgcolor=’#CCFFFF’ width=’91’ align=’center’>开始日期</td>

<td bgcolor=’#CCFFFF’ width=’84’ align=’center’>结束日期</td>

<td width=”75″ bgcolor=’#CCFFFF’>添加人</td>

<!–dpinglun1–>

<td width=”147″ align=”center” bgcolor=”CCFFFF”>操作</td>

</tr>

<%

//difengysfiqfgieuheze

//youzuiping1

//txixixngdy

new CommDAO().delete(request,”shijuanshengcheng”);

String url = “shijuanshengcheng_list.jsp?1=1”;

String sql = “select * from shijuanshengcheng where 1=1”;

if(request.getParameter(“shijuanbianhao”)==”” ||request.getParameter(“shijuanbianhao”)==null ){}else{sql=sql+” and shijuanbianhao like ‘%”+request.getParameter(“shijuanbianhao”)+”%'”;}

if(request.getParameter(“kemumingcheng”)==”” ||request.getParameter(“kemumingcheng”)==null ){}else{sql=sql+” and kemumingcheng like ‘%”+request.getParameter(“kemumingcheng”)+”%'”;}

if (request.getParameter(“kaishiriqi1″)==”” ||request.getParameter(“kaishiriqi1″)==null ) {}else{sql=sql+” and kaishiriqi >= ‘”+request.getParameter(“kaishiriqi1″)+”‘”;}

if (request.getParameter(“kaishiriqi2″)==”” ||request.getParameter(“kaishiriqi2″)==null ) {}else {sql=sql+” and kaishiriqi <= ‘”+request.getParameter(“kaishiriqi2″)+”‘”;}

if (request.getParameter(“jieshuriqi1″)==”” ||request.getParameter(“jieshuriqi1″)==null ) {}else{sql=sql+” and jieshuriqi >= ‘”+request.getParameter(“jieshuriqi1″)+”‘”;}

if (request.getParameter(“jieshuriqi2″)==”” ||request.getParameter(“jieshuriqi2″)==null ) {}else {sql=sql+” and jieshuriqi <= ‘”+request.getParameter(“jieshuriqi2″)+”‘”;}

if(request.getParameter(“tianjiaren”)==”” ||request.getParameter(“tianjiaren”)==null ){}else{sql=sql+” and tianjiaren like ‘%”+request.getParameter(“tianjiaren”)+”%'”;}

sql+=” order by id desc”;

ArrayList<HashMap> list = PageManager.getPages(url,15,sql, request);

int i=0;

for(HashMap map:list){

i++;

%>

<tr>

<td width=”31″ align=”center”><%=i %></td>

<td><%=map.get(“shijuanbianhao”) %></td>

<td><%=map.get(“kemumingcheng”) %></td>

<td><%=map.get(“danxuanti”) %></td>

<td><%=map.get(“xuanzetifenzhi”) %></td>

<td><%=map.get(“panduanti”) %></td>

<td><%=map.get(“panduantifenzhi”) %></td>

<td><%=map.get(“tiankongti”) %></td>

<td><%=map.get(“tiankongtifenzhi”) %></td>

<td><%=map.get(“wendati”) %></td>

<td><%=map.get(“kaishiriqi”) %></td>

<td><%=map.get(“jieshuriqi”) %></td>

<td><%=map.get(“tianjiaren”) %></td>

<!–dpinglun2–>

<td width=”147″ align=”center”><a href=”shijuanshengcheng_updt.jsp?id=<%=map.get(“id”)%>”>修改</a> <a href=”shijuanshengcheng_list.jsp?scid=<%=map.get(“id”) %>” onClick=”return confirm(‘真的要删除?’)”>删除</a> <a href=”shijuan_detail2.jsp?id=<%=map.get(“id”) %>”>查看</a> <!–qiatnalijne–> </td>

</tr>

<%

}

%>

</table>

<br>

<!–yoxugonxgzitoxnxgjxi–> <!–youzuiping3–>

${page.info }

<%

//yoxutixinxg if(kucddduntx>0)

//yoxutixinxg{

//yoxutixinxg tsgehxdhdm

//yoxutixinxg}

%>

<input type=button name=Submit52 value=打印 onClick=”javascript:window.print()” />

</body>

</html>

代码4-7试卷管理核心代码

4.5成绩管理模块的实现

在管理员(老师)已经登录的情况下,管理员点击成绩管理,可以进行成绩查询操作以及主观题打分操作。在点击成绩查询后页面跳转到chengji_list.jsp,在这个页面可以看到所有用户的成绩以及考试时间等信息,每条成绩信息有一个删除按钮,当管理员点击删除后,将从数据库中将该信息删除,并且更新当前页面。成绩查阅功能流程图如下所示。

b880d8ab688a96732fc1b0ea0ec0e3e0  图4-8成绩查询流程图

成绩管理页面如下图所示。

bb867bce059db0a75633baafa342cef0  图4-9成绩管理页面

成绩查询核心代码如下所示。

<%@ page language=”java” import=”java.util.*” pageEncoding=”gb2312″%>

<%@page import=”util.Info”%>

<%@page import=”dao.CommDAO”%>

<%@page import=”util.PageManager”%>

<html>

<head>

<title>成绩查看</title>

<LINK href=”css.css” type=text/css

rel=stylesheet>

</head>

<body >

<p>成绩列表:</p>

<table width=”100%” border=”1″ align=”center” cellpadding=”3″ cellspacing=”1″ bordercolor=”#00FFFF” style=”border-collapse:collapse”>

<tr>

<td width=”6%” bgcolor=”A4B6D7″>序号</td>

<td width=”14%” bgcolor=’#A4B6D7′>用户名</td>

<td width=”15%” bgcolor=’#A4B6D7′>试卷编号</td>

<td width=”17%” bgcolor=’#A4B6D7′>成绩</td>

<td width=”17%” bgcolor=’#A4B6D7′>客观题成绩</td>

<td width=”14%” bgcolor=”A4B6D7″>主观题成绩</td>

<td width=”15%” bgcolor=”A4B6D7″>测试时间</td>

<td width=”19%” bgcolor=”A4B6D7″>操作</td>

</tr>

<%

double chengji=0;

double chengjiz=0;

double zgfchengji=0;double zdfchengji=10000;

int yxrs=0;

int lrs=0;

int bjgrs=0;

new CommDAO().delete(request,”cj”);

String url = “cj_list.jsp?1=1”;

String sql = “select * from cj where 1=1”;

ArrayList<HashMap> list = PageManager.getPages(url,15,sql, request);

int i=0;

for(HashMap map:list){

i++;

chengji=Float.valueOf((String)map.get(“cj”)).floatValue()+Float.valueOf((String)map.get(“zcj”)).floatValue();

chengjiz=chengjiz+chengji;

if(chengji>zgfchengji){zgfchengji=chengji;}

if(chengji<zdfchengji){zdfchengji=chengji;}

if(chengji<zdfchengji){zdfchengji=chengji;}

if(chengji>=85){yxrs=yxrs+1;}

if(chengji<85 && chengji>=60){lrs=lrs+1;}

if(chengji<60){bjgrs=bjgrs+1;}

%>

<tr>

<td><%=i %></td>

<td><%=map.get(“username”) %></td><td><%=map.get(“sjbh”) %></td>

<td><%=chengji %></td>

<td><%=map.get(“cj”) %></td>

<td><%=map.get(“zcj”) %></td>

<td><%=map.get(“addtime”) %></td>

<td> <a href=”cj_list.jsp?scid=<%=map.get(“id”) %>” onClick=”return confirm(‘真的要删除?’)”>删除</a> </td>

</tr>

<%

}

%>

</table>

<br>

以上数据共<%=i %>条,<a style=”cursor:hand” onClick=”javascript:window.print();”>打印本页</a> 共计成绩:<%=chengjiz%>; 其中最高成绩:<%=zgfchengji %>;最低成绩:<%=zdfchengji %>;85分及以上人数:<%=yxrs %>;60-85分人数:<%=lrs %>;低于60分人数:<%=bjgrs %>;平均成绩:<%out.print(Math.round(1000*(chengjiz/i))/1000.0);%>;

${page.info }<input type=button name=Submit52 value=打印 onClick=”javascript:window.print()” />

</body>

</html>

代码4-8成绩查询核心代码

主观题打分核心代码如下所示。

<%@ page language=”java” import=”java.util.*” pageEncoding=”gb2312″%>

<%@page import=”util.Info”%>

<%@page import=”dao.CommDAO”%>

<%@page import=”util.PageManager”%>

<html>

<head>

<title>成绩查看</title>

<LINK href=”css.css” type=text/css

rel=stylesheet>

</head>

<body >

<p>成绩列表:</p>

<table width=”100%” border=”1″ align=”center” cellpadding=”3″ cellspacing=”1″ bordercolor=”#00FFFF” style=”border-collapse:collapse”>

<tr>

<td width=”6%” bgcolor=”A4B6D7″>序号</td>

<td width=”16%” bgcolor=’#A4B6D7′>用户名</td>

<td width=”13%” bgcolor=’#A4B6D7′>试卷编号</td>

<td width=”14%” bgcolor=’#A4B6D7′>主观题题题号</td>

<td width=”7%” bgcolor=”A4B6D7″>主观题成绩</td>

<td width=”9%” bgcolor=”A4B6D7″>测试时间</td>

</tr>

<%

new CommDAO().delete(request,”cj”);

String url = “cj_list2.jsp?1=1”;

String sql = “select * from cj where username='”+request.getSession().getAttribute(“username”)+”‘”;

ArrayList<HashMap> list = PageManager.getPages(url,15,sql, request);

int i=0;

for(HashMap map:list){

i++;

//wxflzhistri

//zoxngxetxoxngjxvi

//txixgihxngjs

//youzuiping2

%>

</table>

<br>

以上数据共<%=i %>条,<a style=”cursor:hand” onClick=”javascript:window.print();”>打印本页</a>

</body>

</html>

代码4-9主观题打分核心代码

 4.6科目信息模块的实现

当管理员(老师)成功登录后,可以点击科目管理进行相关操作。当管理员(老师)想要新增一个科目信息时,点击科目添加,页面会跳转到kemuxinxi_add.jsp页面,输入相关信息后,点击添加,系统会在数据库中插入一条新的数据。当页面显示添加成功后,管理员可以点击科目查询跳转到kemuxinxi_list.jsp页面,查询数据库中存在的科目信息。科目信息管理流程图如下图所示。

e4ee5f20c248c0d3ec0fc77e4273e084  图4-10科目信息管理流程图

科目信息添加界面如下图所示。

图4-11科目信息添加界面

370ec129e19b3b6b742eb049aa99cc85  科目信息添加核心代码如下所示。

<%@ page language=”java” import=”java.util.*” pageEncoding=”gb2312″%>

<%@page import=”util.Info”%>

<%@page import=”dao.CommDAO”%>

<%@page import=”util.PageManager”%>

<html>

<head>

<title>科目信息</title>

<!–bixanjxiqxi–>

<LINK href=”css.css” type=text/css rel=stylesheet>

<script type=”text/javascript” src=”js/My97DatePicker/WdatePicker.js” charset=”gb2312″></script>

<script type=”text/javascript” src=”js/popup.js”></script>

</head>

<%

//xuxyaxodenxglxu

String id=””;

//islbd1q id=request.getParameter(“id”);

//islbd1q HashMap mlbdq = new CommDAO().getmap(id,”melieibaoduqubiaoiguo”);

//islbd2q HashMap mlbdq = new CommDAO().getmaps(“hsgzhujian”,(String)request.getSession().getAttribute(“username”),”melieibaoduqubiaoiguo”);

//islbdq gogogogogo

//islbdq lelelelelele

%>

<script language=”javascript”>

function gow()

{

document.location.href=”kemuxinxi_add.jsp?id=<%=id%>”;

}

</script>

<!–hxsglxiangdxongjxs–>

<%

HashMap ext = new HashMap();

if(request.getParameter(“f”)!=null){

//wxfladd

//qiuji

//youshenhe

//youzhifu

//jitihuan

}

new CommDAO().insert(request,response,”kemuxinxi”,ext,true,false,””);

%>

<body >

<form action=”kemuxinxi_add.jsp?f=f&id=<%=id%>” method=”post” name=”form1″ onsubmit=”return checkform();”>

添加科目信息:

<br><br>

<table width=”100%” border=”1″ align=”center” cellpadding=”3″ cellspacing=”1″ bordercolor=”#00FFFF” style=”border-collapse:collapse”>

<tr><td width=”200″>科目名称:</td><td><input name=’kemumingcheng’ type=’text’ id=’kemumingcheng’ value=” onblur=’checkform()’ style=’border:solid 1px #000000; color:#666666′ />*<label id=’clabelkemumingcheng’ /></td></tr>

<tr>

<td></td>

<td><input type=”submit” name=”Submit” value=”提交” style=’border:solid 1px #000000; color:#666666′ />

<input type=”reset” name=”Submit2″ value=”重置” style=’border:solid 1px #000000; color:#666666′ /></td>

</tr>

</table>

</form>

</body>

</html>

<!–suxilxatxihuxan–>

<script language=javascript src=’js/My97DatePicker/WdatePicker.js’></script>

<script language=javascript src=’js/ajax.js’></script>

<%@page import=”java.util.ArrayList”%>

<%@page import=”java.util.HashMap”%>

<script language=javascript >

function checkform(){

var kemumingchengobj = document.getElementById(“kemumingcheng”); if(kemumingchengobj.value==””){document.getElementById(“clabelkemumingcheng”).innerHTML=”<font color=red>请输入科目名称</font>”;return false;}else{document.getElementById(“clabelkemumingcheng”).innerHTML=” “; }

var kemumingchengobj = document.getElementById(“kemumingcheng”);

if(kemumingchengobj.value!=””){

var ajax = new AJAX();

ajax.post(“factory/checkno.jsp?table=kemuxinxi&col=kemumingcheng&value=”+kemumingchengobj.value+”&checktype=insert&ttime=<%=Info.getDateStr()%>”)

var msg = ajax.getValue();

if(msg.indexOf(‘Y’)>-1){

document.getElementById(“clabelkemumingcheng”).innerHTML=”<font color=red>科目名称已存在</font>”;

return false;

}else{document.getElementById(“clabelkemumingcheng”).innerHTML=” “;

}

}

return true;

}

popheight=450;

</script>

代码4-10科目信息添加核心代码

科目信息查询页面如下图所示。

564d5d02c959ecd152b11f956e8e6aa4  图4-12科目信息查询界面

科目信息查询核心代码如下所示。

<%@ page language=”java” import=”java.util.*” pageEncoding=”gb2312″%>

<%@page import=”util.Info”%>

<%@page import=”dao.CommDAO”%>

<%@page import=”util.PageManager”%>

<html>

<head>

<title>科目信息</title>

<LINK href=”css.css” type=text/css rel=stylesheet>

<script type=”text/javascript” src=”js/My97DatePicker/WdatePicker.js” charset=”gb2312″></script>

</head>

<!–hxsglxiangdxongjxs–>

<body >

<p>已有科目信息列表:</p>

<form name=”form1″ id=”form1″ method=”post” action=””>

搜索: 科目名称:<input name=”kemumingcheng” type=”text” id=”kemumingcheng” style=’border:solid 1px #000000; color:#666666′ size=”12″ />

<input type=”submit” name=”Submit” value=”查找” style=’border:solid 1px #000000; color:#666666′ /> <input type=”button” name=”Submit2″ value=”导出EXCEL” style=’border:solid 1px #000000; color:#666666′ onClick=”javascript:location.href=’kemuxinxi_listxls.jsp’;” />

</form>

<table width=”100%” border=”1″ align=”center” cellpadding=”3″ cellspacing=”1″ bordercolor=”00FFFF” style=”border-collapse:collapse”>

<tr>

<td width=”30″ align=”center” bgcolor=”CCFFFF”>序号</td>

<td bgcolor=’#CCFFFF’>科目名称</td>

<!–dpinglun1–>

<td width=”138″ align=”center” bgcolor=”CCFFFF”>添加时间</td>

<td width=”60″ align=”center” bgcolor=”CCFFFF”>操作</td>

</tr>

<%

//difengysfiqfgieuheze

//youzuiping1

//txixixngdy

new CommDAO().delete(request,”kemuxinxi”);

String url = “kemuxinxi_list.jsp?1=1”;

String sql = “select * from kemuxinxi where 1=1”;

if(request.getParameter(“kemumingcheng”)==”” ||request.getParameter(“kemumingcheng”)==null ){}else{sql=sql+” and kemumingcheng like ‘%”+request.getParameter(“kemumingcheng”)+”%'”;}

sql+=” order by id desc”;

ArrayList<HashMap> list = PageManager.getPages(url,15,sql, request);

int i=0;

for(HashMap map:list){

i++;

//wxflzhistri

//zoxngxetxoxngjxvi

//txixgihxngjs

//youzuiping2

%>

<tr>

<td width=”30″ align=”center”><%=i %></td>

<td><%=map.get(“kemumingcheng”) %></td>

<!–dpinglun2–>

<td width=”138″ align=”center”><%=map.get(“addtime”) %></td>

<td width=”60″ align=”center”><a href=”kemuxinxi_updt.jsp?id=<%=map.get(“id”)%>”>修改</a> <a href=”kemuxinxi_list.jsp?scid=<%=map.get(“id”) %>” onClick=”return confirm(‘真的要删除?’)”>删除</a> <!–qiatnalijne–> </td>

</tr>

<%

}

%>

</table>

<br>

<!–yoxugonxgzitoxnxgjxi–> <!–youzuiping3–>

${page.info }

<%

//yoxutixinxg if(kucddduntx>0)

//yoxutixinxg{

//yoxutixinxg tsgehxdhdm

//yoxutixinxg}

%>

<input type=button name=Submit52 value=打印 onClick=”javascript:window.print()” />

</body>

</html>

代码4-11科目信息查询核心代码

4.7在线考试模块的实现

当学生登录在线考试管理系统后,可以看到左侧分别有修改密码、考试管理和我的成绩几个选项,在选择考试管理下的在线考试后,页面会跳转到考试界面,在此页面下,学生需要进行答题,当所有题目做答完毕后点击提交,系统会自动判卷,客观题等待老师判卷,当老师打完分数后更新数据库信息,学生可以查询到自己的分数。在线考试流程图如下图所示。

d5586f7d3cadcf9df42614704766346b  图4-13在线考试流程图

在线考试管理页面如下图所示。

bccef548833dcc7f92eac8928e3fbdac  图4-14在线考试页面

在线考试核心代码如下所示。

<%@ page language=”java” import=”java.sql.*” %>

<%@ page import=”java.text.*”%>

<%@ page import=”java.util.Date”%>

<%@ page import=”java.util.*”%>

<%@ page import=”java.text.SimpleDateFormat,java.util.Date”%>

<%@ page language=”java” import=”java.util.*” pageEncoding=”gb2312″%>

<%@page import=”util.Info”%>

<%@page import=”dao.CommDAO”%>

<%@page import=”util.PageManager”%>

<%

if((String)request.getSession().getAttribute(“username”)==null || (String)request.getSession().getAttribute(“username”)==””) //判断用户是否已经登陆,如果没有,则给出登陆框,如果有则显示当前用户信息

{

out.print(“<script>alert(‘对不起,请您先登陆!’);window.history.go(-1);</script>”);

}

String addtime=new SimpleDateFormat(“yyyy-MM-dd”).format(Calendar.getInstance().getTime());

String jieshuriqi=request.getParameter(“jieshuriqi”);

java.text.DateFormat df=new java.text.SimpleDateFormat(“yyyy-MM-dd”); java.util.Calendar c1=java.util.Calendar.getInstance();

java.util.Calendar c2=java.util.Calendar.getInstance();

try{

c1.setTime(df.parse(jieshuriqi));

c2.setTime(df.parse(addtime));

}catch(java.text.ParseException e)

{

out.print(“<script>alert(‘格式不正确!’);location.href=’shangpinxinxilist.jsp’;</script>”);

return;

}

int result=c1.compareTo(c2);

if(result<0)

{

out.print(“<script>alert(‘对不起,考试日期已过,不允许再考试!’);location.href=’shijuanshengcheng_list2.jsp’;</script>”);

return;

}

%>

<html>

<head>

<title>在线考试系统</title><LINK href=”css.css” type=text/css rel=stylesheet>

<style type=”text/css”>

<!–

.STYLE2 {color: #FFFFFF}

.STYLE4 {color: #FFFFFF; font-weight: bold; }

.STYLE6 {color: #198A95; font-weight: bold; }

.STYLE5 { color: #72AC27;

font-size: 26pt;

}

–>

</style>

<link href=”qtimages/StyleSheet.css” rel=”stylesheet” type=”text/css”>

</head>

<body bgcolor=”#FFFFFF” leftmargin=”0″ topmargin=”0″ marginwidth=”0″ marginheight=”0″>

<table id=”__01″ width=”100%” height=”193″ border=”0″ cellpadding=”0″ cellspacing=”0″>

<tr>

<td height=”162″ align=”center”>

<%

String id=request.getParameter(“id”);

String sql=””;

String nnn=””;

String bianhao=””;

String bbb=””;

String ccc=””;

String ddd=””;

String eee=””;

String nxuanzetishu=””;

String nxuanzetifenzhi=””;

String npanduantishu=””;

String npanduantifenzhi=””;

String ntiankongtishu=””;

String ntiankongtifenzhi=””;

String nwendatishu=””;

sql=”select * from shijuanshengcheng where id=”+id+””;

for(HashMap map:new CommDAO().select(sql)){

// while(RS_result.next()){

nnn=(String)map.get(“danxuanti”);

bianhao=(String)map.get(“shijuanbianhao”);

bbb=(String)map.get(“tiankongti”);

ccc=(String)map.get(“panduanti”);

eee=(String)map.get(“wendati”);

nxuanzetishu=(String)map.get(“xuanzetishu”);

nxuanzetifenzhi=(String)map.get(“xuanzetifenzhi”);

npanduantishu=(String)map.get(“panduantishu”);

npanduantifenzhi=(String)map.get(“panduantifenzhi”);

ntiankongtishu=(String)map.get(“tiankongtishu”);

ntiankongtifenzhi=(String)map.get(“tiankongtifenzhi”);

nwendatishu=(String)map.get(“wendatishu”);

}

%>

<p>试卷编号:<%=bianhao%> 时间:1小时,现在开始计时!剩余<SPAN id=tiao></SPAN>秒 <SCRIPT language=javascript>

<!–

function clock(){

j=Math.floor(i/60);

i=i-1;

t=(i%60);

document.getElementById(‘tiao’).innerHTML=j+”分”+t;

if(i>0) {

setTimeout(“clock();”,1000);

}

else {

alert(“考试时间到,系统自动交卷!”);

document.form1.submit();

}

}

var i=3600

clock()

//–>

</SCRIPT> </p>

<form name=”form1″ method=”post” action=”jiaojuan.jsp?id=<%= id%>&bianhao=<%=bianhao%>”>

<table width=”98%” height=”103″ border=”1″ cellpadding=”1″ cellspacing=”0″ bordercolor=”#F8C878″>

<tr>

<td height=”33″ colspan=”2″>单选题(题数<%=nxuanzetishu%>,每题<%=nxuanzetifenzhi%>分)</td>

</tr>

<%

sql=”select * from danxuanti where id in (“+nnn+”)”;

sql=sql+” order by id desc”;

//RS_result=connDbBean.executeQuery(sql);

id=””;

String timu=””;String xuanxiangA=””;String xuanxiangB=””;String xuanxiangC=””;String xuanxiangD=””;String daan=””;String kemumingcheng=””;

addtime=””;

int i=0;

for(HashMap map:new CommDAO().select(sql)){

//while(RS_result.next()){

i=i+1;

id=(String)map.get(“id”);

timu=(String)map.get(“shiti”);xuanxiangA=(String)map.get(“xuanxiangA”);

xuanxiangB=(String)map.get(“xuanxiangB”);xuanxiangC=(String)map.get(“xuanxiangC”);xuanxiangD=(String)map.get(“xuanxiangD”);

daan=(String)map.get(“daan”);

//nanyichengdu=map.get(“nanyichengdu”);

addtime=(String)map.get(“addtime”);

%>

<tr>

<td width=”9%” height=”33″>试题<%=i%>:</td>

<td>题目:<%=timu%>

<input name=”xztshitida<%=i%>” type=”hidden” id=”xztshitida<%=i%>” value=”<%=daan%>”></td>

</tr>

<tr>

<td rowspan=”4″>选项</td>

<td width=”91%”><input type=”radio” name=”xztxxa<%=i%>” value=”A”>

选项A:<%=xuanxiangA%></td>

</tr>

<tr>

<td><input type=”radio” name=”xztxxa<%=i%>” value=”B”>

选项B:<%=xuanxiangB%></td>

</tr>

<tr>

<td><input type=”radio” name=”xztxxa<%=i%>” value=”C”>

选项C:<%=xuanxiangC%></td>

</tr>

<tr>

<td><input type=”radio” name=”xztxxa<%=i%>” value=”D”>

选项D:<%=xuanxiangD%></td>

</tr>

<%

}

%>

</table>

<table width=”98%” height=”103″ border=”1″ cellpadding=”1″ cellspacing=”0″ bordercolor=”#F8C878″>

<tr>

<td height=”33″ colspan=”3″>填空题(题数<%=ntiankongtishu%>,每题<%=ntiankongtifenzhi%>分)</td>

</tr>

<%

sql=”select * from tiankongti where id in (“+bbb+”)”;

sql=sql+” order by id desc”;

//RS_result=connDbBean.executeQuery(sql);

id=””;

i=0;

for(HashMap map:new CommDAO().select(sql)){

//while(RS_result.next()){

i=i+1;

id=(String)map.get(“id”);

timu=(String)map.get(“shiti”);

daan=(String)map.get(“daan”);

//nanyichengdu=map.get(“nanyichengdu”);

addtime=(String)map.get(“addtime”);

%>

<tr>

<td width=”9%” height=”33″>试题<%=i%>:</td>

<td colspan=”2″>题目:<%=timu%>

<input name=”tdtshitida<%=i%>” type=”hidden” id=”tdtshitida<%=i%>” value=”<%=daan%>”></td>

</tr>

<tr>

<td>答案:</td>

<td colspan=”2″><input name=”tktdaan<%=i%>” type=”text” id=”tktdaan<%=i%>”></td>

</tr>

<%

}

%>

</table>

<table width=”98%” height=”103″ border=”1″ cellpadding=”1″ cellspacing=”0″ bordercolor=”#F8C878″>

<tr>

<td height=”33″ colspan=”3″>判断题(题数<%=npanduantishu%>,每题<%=npanduantifenzhi%>分)</td>

</tr>

<%

sql=”select * from panduanti where id in (“+ccc+”)”;

sql=sql+” order by id desc”;

// RS_result=connDbBean.executeQuery(sql);

id=””;

i=0;

for(HashMap map:new CommDAO().select(sql)){

i=i+1;

id=(String)map.get(“id”);

timu=(String)map.get(“shiti”);

daan=(String)map.get(“daan”);

//nanyichengdu=map.get(“nanyichengdu”);

addtime=(String)map.get(“addtime”);

%>

<tr>

<td width=”9%” height=”33″>试题<%=i%>:</td>

<td colspan=”2″>题目:<%=timu%>

<input name=”pdtshitida<%=i%>” type=”hidden” id=”pdtshitida<%=i%>” value=”<%=daan%>”></td>

</tr>

<tr>

<td>答案:</td>

<td colspan=”2″><input type=”radio” name=”pdtxxa<%=i%>” value=”对”>

<input type=”radio” name=”pdtxxa<%=i%>” value=”错”>

错</td>

</tr>

<%

}

%>

</table>

<table width=”98%” height=”103″ border=”1″ cellpadding=”1″ cellspacing=”0″ bordercolor=”#F8C878″>

<tr>

<td height=”33″ colspan=”3″>问答题(题数<%=nwendatishu%>,管理员手动打分)</td>

</tr>

<%

sql=”select * from wendati where id in (“+eee+”)”;

sql=sql+” order by id desc”;

//RS_result=connDbBean.executeQuery(sql);

id=””;

i=0;

for(HashMap map:new CommDAO().select(sql)){

//while(RS_result.next()){

i=i+1;

id=(String)map.get(“id”);

timu=(String)map.get(“shiti”);

daan=(String)map.get(“daan”);

//nanyichengdu=map.get(“nanyichengdu”);

addtime=(String)map.get(“addtime”);

%>

<tr>

<td width=”9%” height=”33″>试题<%=i%>:</td>

<td colspan=”2″>题目:<%=timu%>

<input name=”wdtshitida<%=i%>” type=”hidden” id=”wdtshitida<%=i%>” value=”<%=daan%>”></td>

</tr>

<tr>

<td>回答:</td>

<td colspan=”2″><input name=”wdtdaan<%=i%>” type=”text” id=”wdtdaan<%=i%>”></td>

</tr>

<%

}

%>

</table>

<p>

<input type=”submit” name=”Submit” value=”交卷”>

</p>

</form>

<p></p>

</td>

</tr>

</table>

</body>

</html>

代码4-12在线考试核心代码

修改密码在用户成功登陆系统后,可以点击左侧修改密码选项。点击后跳转到修改密码界面,在改页面中需要填写原始密码,以及两次新密码。如果两次新密码不一致,则系统会弹出“对不起,两次密码不一至,请重新输入”的信息。如果原密码不正确,则系统会弹出“原密码输入错误”的信息,如果修改成功则会退出系统,重新登录。修改密码模块流程图如下所示。

图4-15修改密码流程图

0ae664a537491dfbdb3e425b42db5e15  修改密码核心代码如下所示。

<%@ page language=”java” import=”java.util.*” pageEncoding=”gb2312″%>

<%@page import=”util.Info”%>

<%@page import=”dao.CommDAO”%>

<%@page import=”util.PageManager”%>

<html>

<head>

<title>修改密码</title><link rel=”stylesheet” href=”css.css” type=”text/css”>

</head>

<script>

function check()

{

if(document.form1.ymm.value==””)

{

alert(“请输入原密码”);

document.form1.ymm.focus();

return false;

}

if(document.form1.xmm1.value==””)

{

alert(“请输入新密码”);

document.form1.xmm1.focus();

return false;

}

if(document.form1.xmm2.value==””)

{

alert(“请输入确认密码”);

document.form1.xmm2.focus();

return false;

}

if (document.form1.xmm1.value!=document.form1.xmm2.value)

{

alert(“对不起,两次密码不一至,请重新输入”);

document.form1.xmm1.value=””;

document.form1.xmm2.value=””;

document.form1.xmm1.focus();

return false;

}

}

</script>

<script type=”text/javascript”>

<!–

<%

//out.print(Info.getadminUser(request).get(“id”).toString());

String error = (String)request.getAttribute(“error”);

if(error!=null)

{

%>

alert(“原密码输入错误”);

<%}%>

<%

String suc = (String)request.getAttribute(“suc”);

if(suc!=null)

{

%>

alert(“修改成功”);

<%}%>

//–>

</script>

<body >

<form action=”jspmzxksxtdzkf95?ac=adminuppass” name=”form1″ method=”post”>

<table width=”32%” height=”126″ border=”1″ align=”center” cellpadding=”0″ cellspacing=”0″ bordercolor=”9DC9FF” style=”border-collapse:collapse”>

<tr>

<td colspan=”2″><div align=”center”>修改密码</div></td>

</tr>

<tr>

<td>原密码:</td>

<td><input name=”ymm” type=”text” id=”ymm” /></td>

</tr>

<tr>

<td>新密码:</td>

<td><input name=”xmm1″ type=”password” id=”xmm1″ /></td>

</tr>

<tr>

<td>确认密码:</td>

<td><input name=”xmm2″ type=”password” id=”xmm2″ /></td>

</tr>

<tr>

<td colspan=”2″ align=”center”><input name=”Submit” type=”submit” onClick=”return check()” value=”确定” />

<input name=”Submit2″ type=”reset” value=”重置” /></td>

</tr>

</table>

</form>

</body>

</html>

代码4-13修改密码核心代码

 4.8本章总结

本章针对学生在线考试系统主要介绍了系统的几个核心部分的功能实现以及所需要的运行环境,核心功能主要主界面的实现、登录模块的实现、试卷管理模块的实现、成绩管理模块的实现、科目信息模块的实现、在线考试模块的实现与修改密码模块的实现。为了便于理解,本章在每个核心功能介绍部分附上了流程图、系统页面以及核心代码。

 第5章系统测试

  5.1测试的目的

为了学生在线考试系统的稳定性与可用性,需要进行一定程度的测试来检验系统,本章主要针对系统的界面以及功能性进行测试,目的是保证学生在线考试系统在部署到生产环境下可以正常,有效的运转。

本次测试主要针对Web端的使用以及后台调用数据库是否正常进行测试,Web端主要对科目管理、题库管理和试题管理功能进行测试,测试其是否正常运行,以及可能会出现的问题。

  5.2界面测试

本文采用黑盒测试Web端的界面,主要测试字体,窗口,以及其他元素是否正常。Web端界面测试项目如下表所示。

表5-1用户界面测试表

检查项 测试人 测试结果
窗口切换、移动、改变大小时正常吗? 本人 正常
各种界面元素的文字正确吗?(如标题、提示等) 本人 正常
各种界面元素的状态正确吗?(如有效、无效、选中等状态) 本人 正常
各种界面元素支持键盘操作吗? 本人 正常
数据项能正确回显吗? 本人 正常
执行有风险的操作时,有“确认”、“放弃”等提示吗? 本人 正常
有联机帮助吗? 本人 正常
各种界面元素的布局合理吗?美观吗? 本人 正常

5.3功能测试

用户登录测试当用户以超级管理员身份登录,输入账号或密码为空时,提示框会提示“请输入完整”。当输入错误的账号或密码时,会弹出提示框显示“用户名或密码错误”。

图5-1用户登录测试界面

e82af45808301ee2e515718e7d845798  当用户使用正确的账号和密码登录时,系统会弹出提示框显示“登陆成功!”。这时页面会自动跳转到相应的角色主界面。

图5-2用户登录测试界面

b41042323857eefbe178cb167cc5339d  系统用户信息管理测试对系统用户信息管理进行测试时,采用黑盒测试法中的等效性法和边界值法相结合的测试方法对功能进行测试,例如输入错误的数据,输入非法的字段或者输入超越输入框规定范围的数字(如年龄、手机号、QQ号和银行账号等)。系统用户信息管理测试表如下表所示。

表5-2系统用户信息管理测试

功能A描述 以管理员身份登录,添加、修改、查询用户信息
用例目的 是否能够正确修改信息
前提条件 用户安全登录系统界面
输入/动作 输入 实际情况
示例:典型值… 年龄 53 53
示例:边界值… 年龄 —10 输入数据有误
示例:异常值… 年龄 a 输入数据有误

如果输入的测试数据完全正确,则弹出对话框显示“操作成功”,并且显示“添加成功!”,这时表示系统添加用户成功,具体对话框如下图所示。

图5-3录入用户信息成功界面

3e6ca3c641410bb3ea12a1ca9f14032d  部分功能测试为了验证系统功能的有效性及完整性,本文做了大量黑盒测试。下表展示了部分测试实例。

表5-3部分测试用例表

模块 用例描述 预期结果 备注
用户注册 用户名文本框中不输入任何数据 提示“请填写完整的信息” 测试用户名是否为空
在密码文本框中输入“123”三个字符 提示“密码长度最少为6位” 测试密码位数是否正确
在密码文本框和确认密码文本框中分别输“123456”和“258769” 提示“两次输入的密码不匹配” 测试用户两次输入的密码是否匹配
密码修改 在用户管理中修改密码,原始密码若输入不正确 提示“原始密码错误” 测试原始密码是否正确
科目信息 科目信息内容为空 系统提示科目信息内容为空,科目信息失败 测试科目信息是否为空
输入呢称和科目信息内容 系统提示科目信息成功,科目信息板显示新科目信息 测试科目信息是否成功
添加试卷 用户未登录时,点击试卷按钮 系统提示请先登录 测试是否能不用登录用户添加试卷
用户登录后,点击试卷按钮 系统提示试卷成功 测试试卷功能是否可用

5.4测试结果

进过一系列的测试后,学生在线考试系统基本可以按照开发需求正常运行,能够满足高校的基本需求。本次测试项目主要针对系统日常使用进行测试,由于条件有限只进行了界面测试和系统测试,在未来可以尝试对系统进行一定程度的压力测试,检验系统的承载能力。

 5.5本章总结

本章主要针对学生在线考试系统设计开发完成后进行一些列的黑盒测试,目的是在系统交付给高校时,可以真正的直接部署在生产环境中。虽然本系统经过了界面测试和系统测试,但是没有条件尝试压力测试,并且本系统所涉及的并发场景并不多,所以也未能进行并发测试。

 第6章总结与展望

本文根据当前大环境下高校所处的情况,以及高校针对考试的需求设计并开发了一个学生在线考试系统。本文首先介绍学生在线考试系统开发的背景及意义,发展现况以及论文的基本结构,然后介绍了开发所采用的相关技术Jsp技术和Mysql数据库。随后进行了系统分析,主要针对功能需求、业务流程、数据流程、系统总体设计、系统功能模块设计和数据库设计几个方面进行介绍,并且针对这些设计完成了系统的开发,主要实现了学生在线考试系统的主界面、登录模块、试卷管理模块、成绩管理模块、科目信息模块和在线考试模块。最后进行了系统测试,分别对系统界面和功能进行了测试,分析了学生在线考试系统测试情况,以及存在的缺陷。

在未来,本系统可以继续完善,将系统的规模扩展到多个高校的联考版本,并且加入人工智能的方法对主观题进行阅卷,减少人力的消耗。在高校联考版本,需要考虑并发问题,并且在系统测试时需要加入压力测试,来保证系统运行的稳定性。

致谢

我所做的毕业设计是在老师的指导下进行的,在整个设计过程中,老师给予我很大的帮助,为我解决关键问题指点迷津,使我开拓思路,增长见识,帮助我更好地完成毕业设计工作,同时使我在各方面的能力得到提高。我非常感谢老师对我的帮助及教导,同时也感谢班级为我提供良好的毕业设计环境,最后感谢在毕业设计中为我提供帮助的众多益友和同学。

毕业设计真正给我带来快乐及回忆是我在进行毕业设计的过程当中所体会到的,同时也在这个过程中体会到了自己的不足之处。我相信,通过日后的学习和努力,我会做出更加优秀的作品,这是本次毕业设计带给我的信心。

参考文献

[1] 史洁.基于人脸识别技术的英语在线考试系统[J].信息技术,2022(02):20-24.DOI:10.13274/j.cnki.hdzj.2022.02.004.

[2] 宋巍.基于B/S构架的在线考试系统设计与研究[J].电大理工,2021(02):18-20+25.DOI:10.19469/j.cnki.1003-3297.2021.02.0018.

[3] 魏晓艳.基于Java Web的在线考试系统的设计与实现[J].信息技术与信息化,2021(05):161-163.

[4] 徐飞龙.JSP的网络数据库连接技术探讨[J].时代汽车,2021(23):36-37.

[5] 庾佳.关于JSP动态Web开发技术课程建设思路的研究[J].电脑知识与技术,2020,16(14):216-217.DOI:10.14004/j.cnki.ckt.2020.1564.

[7] 涂华燕.基于MySQL宿舍管理系统数据库设计[J].电脑编程技巧与维护,2021(12):104-106.DOI:10.16184/j.cnki.comprg.2021.12.038.

[8] 闫继正,张雷,张海涛.基于MySQL的空管设备集中监控系统数据库设计[J].微处理机,2021,42(06):47-51.

[9] 李兆琪.基于MySQL数据库服务器创建企业工资管理系统[J].赤峰学院学报(自然科学版),2021,37(11):10-11.DOI:10.13398/j.cnki.issn1673-260x.2021.11.004.

[10] 徐艺澜,沈艳,范恩,余冬华.基于PHP和MySQL的绿色垃圾回收系统设计[J].电脑知识与技术,2021,17(31):32-35.DOI:10.14004/j.cnki.ckt.2021.3094.

[11] 什么是黑盒测试?[J].电子质量,2019(02):23.

[12] 张勇斌,蔡吉飞,李烨.基于黑盒测试的高校课堂教学目标达成度研究[J].北京印刷学院学报,2021,29(10):86-89.DOI:10.19461/j.cnki.1004-8626.2021.10.027.

[13] 林勤花.黑盒测试用例设计方法及综合应用[J].电子测试,2018(17):88-89.DOI:10.16520/j.cnki.1000-8519.2018.17.045.

学生在线考试管理系统的设计与开发

学生在线考试管理系统的设计与开发

价格 ¥9.90 发布时间 2023年8月12日
已付费?登录刷新
下载提示:

1、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“文章版权申述”(推荐),也可以打举报电话:18735597641(电话支持时间:9:00-18:30)。

2、网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。

3、本站所有内容均由合作方或网友投稿,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务。

原创文章,作者:1158,如若转载,请注明出处:https://www.447766.cn/chachong/159724.html,

Like (0)
1158的头像1158编辑
Previous 2023年8月12日
Next 2023年8月12日

相关推荐

My title page contents