在线考试系统JAVA_第1页
在线考试系统JAVA_第2页
在线考试系统JAVA_第3页
在线考试系统JAVA_第4页
在线考试系统JAVA_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、题目 在线考试系统1、实验目的熟练运用 JAVA开发环境及工具、并用 JAVA语言编写程序; 掌握面向对象的概念;掌握系统功能模块的合理划分,并实现各模块接口的连接;掌握 C/S 结构的编程方法; 设计数据库模型。2、实验容编辑生成试题库,随机生成本次考试试题,同时提供在线评分并保存结果。 选择 ACCESS作为后台的数据库。3、实验过程3.1 系统模块部分设计在线考试系统考试 管理试 卷 管 理题 库 管 理评卷管理成绩管理信息管理题库管理:用于对单个试题的增、删、改、查等基本维护,还可对题库进行数据备份和数据还原。我们针对不同题型、不同应用围及不同科目对试题进行维护。试卷管理:可进行三种组

2、卷方式的维护:随机组卷、人工组卷、综合组卷。还可 对考生的基本信息进行维护。考试管理: 对考试分配试卷, 并对考试的基本信息进行维护。 相当于人工安排考 试的过程 评卷管理:对试卷的客观题分配评卷人,并对评卷人基本信息进行管理。成绩管理: 对每次考试的学生成绩的基本信息进行维护, 并提供学生成绩的统计 管理。用户管理:对使用本系统的用户基本信息进行维护,用户多数为:系统管理员、 老师、教务处人员、其他权限管理:对系统的访问权限进行管理,并对用户可进行权限的分配。系统应该具备的基本功能各模块需完成以下功能:试题其它维护维护题库管理试卷管理题型维护: 对试题的题型进行 增、删、改、查操作。在操作之

3、后会自动刷新主页, 以使信息更新。围维护:对试题的应用围进行 增、删、改、查操作。在操作之后会自动刷新主页, 以使信息更新。科目维护: 对试题的科目进行 增、删、改、查操作。在操作之后会自动刷新主页, 以使信息更新。试题维护:对试题的基本信息进行 增、删、改、查 操作。在操作之后会自动刷新 主页,以使信息更新。其他维护:对试题信息的批量查询,并可进行数据导出、数据备份、数据恢复。随机组卷:用户只需对试卷题型进行设置就可组卷的方式。人工组卷:可使用户选择试卷的题型中的试题的组卷方式。综合组卷: 是随机组卷与人工组卷的混合组卷方式, 即用户对某一类型的试题可 进行选择,也可对试题不进行选择。试卷其

4、他维护:对试卷信息的批量查询,对试题的数据备份与还原。考试信息维护:对考试的时间、地点、监考人、考试用的试卷、试卷总分数及答 卷总时间等考试的基本要素进行设置。考生信息维护:对考试的学生的基本信息进行增、删、改、查 操作,在操作之后 会自动刷新主页,以使信息更新。分配评卷人: 对考试所用试卷的客观题分配评卷人, 并对评卷的基本信息进行维 护。评卷人评卷:对分配试卷的评卷人可以在此进行评卷。考生成绩维护: 对考试的考生成绩信息进行统计与汇总, 对有权限的人可进行成绩的增、删、改、查操作。成绩其他维护: 对考生成绩信息的批量查询,并可进行数据导出、数据备份、数 据恢复。信息管理信息基 本维护用户基

5、本信息维护: 对使用本系统的用户进行维护, 而用户的权限由权限管理进 行维护,并分配给用户,使用户只能访问自己拥有的权限。权限信息维护:对基本的权限进行维护,用户可自定义维护权限。用户分配权限: 对未分配权限的用户进行权限的分配, 即对 分配权限的增、 删、 改、查操作。信息基本维护:我们的信息除了有关考试的信息外,还有公告、新闻、留言信息 需要我们维护,其中公告、新闻由后台有权限的人进行增、删、改、查 操作,而 留言是由前台的用户(学生)或游客录入的,我们要防止垃圾数据显示,即对留 言有权更改等操作。3.2 系统结构图1 、本系统分为学生前台子系统和考试管理子系统,整个系统的结构图如下:3.

6、3 数据库设计 试题类型表 (questionType_table) :其中包括了试题的类型的基本信息,如类型 名称、答题方式、说明信息等字段;录入时,我们将答题方式确定为大概几种类 型:填空方式,选择方式,问答方式,判断方式,综合方式。试题围表 ( questionBound_table ):用于控制试题应用的围 ,如同样的科目语文, 在小学、初中、高中、大学都有,由此我们设定了此表,此表中有围名称、围说 明等基本信息;所属科目表 (questionSubject_table) :用于录入试题相关的科目应用,它可以 有不同的应用围。如上所述,我们只需录入一次的科目,就可方便我们在录入试 题时

7、每次都录。各种题库表:我们采用一种类型的题存储在一个表中,由此我们 会有填空题表( question_blanc_table )、单选题表( question_selectone_table )、多选题表( question_selectMany_tabel )一 题多问表 (question_askone_table) 、一题多问表 (question_askMany_table) 、 判断题表( question_judge_table )等试题表试卷表 (exam_table) :用于报存考试中试卷的基本信息,如出卷方式 (有随机出 卷、人工出卷、综合出卷)、试卷名称、试卷应用围(与试题

8、围相对应)、试卷 所属科目(与试题科目相对应)、试题标题级别、试题标题容、试题总类型、试 题个数、试题总 ID 等基本信息。学生表 (student_table) :用于保存学生的考试的用户名及登陆密码。成绩表 (grade_table) :用于存储学生的考试成绩。评题表 (appraiser_question_table) :对于主观题的答案我们须要评卷人 (有权 限的用户)进行手工评卷,本表用来存储评卷人评卷的一些信息。答案表 (student_answer_table) :用于存储学生问答题的答案,如试卷 ID ,学 生 ID 及各种试题类型的答案字段。用户表 (user_table)

9、:用于保存用户的登陆的基本信息及分配的权限。权限表 (purview_table) :用于存储用户组织的的权限,通过分配操作模块的权 限组织权限。4、关键代码及其分析4.1ServerGui.javapublic void actionPerformed(ActionEvent e) if (e.getSource() = log) / boolean b=login();String username = JOptionPane.showInputDialog(this, 请 输入用户名 , 输 入 用 户 名 ,JOptionPane.QUESTION_MESSAGE).trim();St

10、ring password = JOptionPane.showInputDialog(this, 请 输入密码 , 输 入 密 码 ,JOptionPane.QUESTION_MESSAGE).trim();if (username = null | password = null) username = temp;password = temp; return;adminCheck(username,password);/ 验证管理员if (tf = true) else JOptionPane.showMessageDialog(this, 你还没有设置考试信息 , 警告信息 ,JOpt

11、ionPane.INFORMATION_MESSAGE);JOptionPane.showMessageDialog(thi s, 登陆成功! , 成功,if (start = true)JOptionPane.INFORMATION_MESSAGE);toolBar1.setVisible(true);linkArea.append(ServerManager.linkShow(ServerManager.linkstatusplit_one.setVisible(true); else s)+ n);JOptionPane.showMessageDialog(thi else s, 登陆失

12、败! , 失败,JOptionPane.showMessageDialog(thiJOptionPane.ERROR_MESSAGE);s, 服务器还没有启动不能进行操作 , 警return;告信息 , else if (e.getSource()=JOptionPane.INFORMATION_MESSAGE);setCount) userCount=JOptionPane.showInputDialog(this,请 else if (e.getSource() =输入本次考试的人数 );userButton) inittest();/数据库信息初始化if (start = true) e

13、lse if (e.getSource() = startSer) if (settime = true & setcount = true) new ServerManager();serArea.append( 服 务 器已启动 n 预设考试人数为 : + userCount + n 考试时间为: + timeCount + n);userArea.append(ServerManager.userShow(ServerManager.userstatus)+ n);userArea.append(ServerManager.countShow(ServerManager.ucount);

14、start = true; else public void adminCheck(String s1, String s2)ConnectBean cb=new ConnectBean();4.2Server_login.java/ 定义一个接收用户登陆的类 public void run() String s = null;try s = in.readUTF(); /接收考试号和密码 , 然后分别取出StringTokenizer st = new StringTokenizer(s, ,);if (st.hasMoreTokens() str1 = st.nextToken();str

15、2 = st.nextToken();System.out.println(username : + str1);System.out.println(password : + str2); catch (IOException e) e.printStackTrace();/ 读取数据库里的用户信息 并 进行验证try ConnectBean cb = new ConnectBean();if (!cb.openConnection()if (!cb.openConnection() System.out.println( 连 接 数据失败 );System.exit(1);return;S

16、ystem.out.println(连接数据失败 );System.exit(1);return;cb.createPreparedStatement(select flag from stuinfo where sno=+ str1 +ResultSet r cb.executeQuery();String m =; while (r.next() m=r.getString(flag);System.out.println( 标识: +m);if ( !m.equals(0) ) out.writeUTF( 用 户 已 经完成考试,不能再考试 ); else cb.createPrepar

17、edStatement(select sname,spass from stuinfo where sno= + str1+ , false);Stringsql1 =update stuinfoset flag = 1where sno=+str1+;PreparedStatementps = cb.createPreparedStatement(sql1);ResultSet rscb.executeQuery();while (rs.next() dbn rs.getString(sname);dbprs.getString(spass);ps.executeUpdate();Syste

18、m.out.println(用户: + str1+ 你的用户名为: + dbn+ , 你的密码为 : + dbp);/验证用户密码, 如果登录成功将登录标志设为 1if(str2.equals(dbp.trim() 码错误 );System.out.println( 用户 成 功登 录 );else out.writeUTF( 密out.writeUTF( 用 户 + dbn + 登陆成功 );System.out.println( 登陆 密 码错 误 );out.close();out.close();cb.close();4.3ServerManager.javapublic Server

19、Manager() ServerSocket(port1);System.out.println( 用户 + dbn + 登陆成功 );Thread td1 = new Thread() public void run() serstatus= login thread start!n;serstatuslistener the port: + port1;serShow(serstatus);serShow(serstatus);ServerSocket ss1 null;Socket you = null; int port1 = 8001; try catch (IOException

20、e)e.printStackTrace();while (true) ss1newtry / 中断线程启动new Maxcounter(you);td1.start();you ss1.accept(); catch (IOException e) e.printStackTrace();if (you != null) counter+; ucount = 现在 参加考试的人数为 : + counter;countShow(ucount);if (counter Maxcount) userstatus= usersIP+you.getInetAddress()+ connected + p

21、ort1 + 进行登陆 ;/ 启动一个响应客户端读取试题的线程Thread td2 = new Thread(two) public void run() serstatus= thread 2 start!;serShow(linkstatus);ServerSocket ss2 = null;int port2 = 8002;try ss2 = new ServerSocket(port2);userShow(userstatus);/ 第一个线程启动newServer_login(you).start();linkstatuslistener the port: + port2;link

22、Show(serstatus); catch (IOException e) else e.printStackTrace();catchuserstatus = users IP + you.getInetAddress()+ connected + port1 + 中断线程启动userShow(userstatus);while (true) Socket you2 = null; try you2 ss2.accept();(IOException e) userstatus =Socket you3 = null;users IP + you2.getInetAddress()+try

23、 connected + port2 + 进行读题 ;you3 =ss3.accept();userShow(userstatus);catchnew(IOException e) if (you2 != null) while (true) Server_readTest(you2).start();e.printStackTrace();e.printStackTrace();e.printStackTrace();td2.start()userstatus=usersIP+/ 启动一个接收用户答应并存储you3.getInetAddress()的线程+Thread td3 = new T

24、hread(three)connected + port3 + 提交答案 ;userShow(userstatus);if (you3 != null) ServerSocket ss3 = null;/ 第 3 个线程start!;int port3 = 8003;public void run() serstatus=threadserShow(serstatus);启动newServer_readScore(you3).start();ss3 =newtd3.start();ServerSocket(port3);/ 启动一个用户查询的线程linkstatus=listener the

25、port: +Thread td4 = new Thread(four)try port3;linkShow(linkstatus);ServerSocket ss4 = null; catch (IOException e)int port4 = 8004;public void run() serstatus=thread 4try start!;you4 =serShow(serstatus);ss4.accept(); catchtry (IOException e) ServerSocket(port4);e.printStackTrace();linkstatus=listener

26、 the port: +port4;if (you4 != null) linkShow(linkstatus);userstatus=usersIP +you4.getInetAddress() catch (IOException e)+ connected + port4 + 进行查询 ;userShow(userstatus);e.printStackTrace();ss4while (true) Socket you4 = null;4.4Server_readTest.javapublic void run() / 数据库连接部分String sql2; /定义查询语句String

27、 dbt = 以下为试题 ; /试题String ts = null; /接收用户发送的考试科目int tcount = 0; /试题的数目/ 查询客户端所选试题ConnectBean cb = new ConnectBean();if (!cb.openConnection()System.out.println( 连接数据失败 );System.exit(1); return;System.out.println(ts);cb.createPreparedStatement(sql2, false);ts = in.readUTF();try / 网络连接部分out.writeUTF( 你

28、 连 接 成 功/ 在数据库选题sql2 = select * from exam where eid= + ts + ;cb.executeQuery();while (rs.next() dbt+=+n+rs.getString(2) +t + n +ResultSetrsrs.getString(3) + tcount+;cb.close();/ 传送考试时间out.writeUTF(+Timecount);out.flush();out.close();System.out.println( 读 取试题成功!); catch (SQLException e) e.printStackT

29、race();System.out.println(dbt);out.writeUTF(Integer.toString(tcount);System.out.println(not connect db); catch (IOException e1) System.out.println(not read client select!);out.writeUTF(dbt); / 将读 到的试题返回到客户端4.5/Server_readScore.java/ 定义一个接收用户答案的类,判断对错,将分数返回到用户端,并将成绩存入数据库 public Server_readScore(Socke

30、t socket) e1.printStackTrace();/ 创建网络连接/this.socket = socket;StringTokenizer stc = new StringTokenizer(readkey, ,);public void run() readkey = in.readUTF();if (stc.hasMoreTokens() / 客户传来答案的第一个字符为用户名,第二个字符为考试科目str1 = stc.nextToken().trim();System.out.println( 用 户 为 : + str1);uno =Integer.parseInt(str

31、1); catch (IOException e1) System.out.println(readkey);if (stc.hasMoreTokens() / 第二个字符为考试科目str2 =stc.nextToken().trim();System.out.println(试题类型为 : + str2);out.writeUTF(Integer.toString(cou nt);System.out.println( 将 分 数返回到客户端 );out.flush(); out.close();/ 在 数 据 库获取正确答案 /try ConnectBean cb = newConnect

32、Bean();if(!cb.openConnection()System.out.println(连接数据失败 );/ 判 断 分 数/for (int i = 0; iInteger.parseInt(str4); i+) if(userAnsweri.equals(crreAnsweri)count += 10;System.out.println( 用 户 : + str1 + , 你的得分为: + count); catch (IOException e) e.printStackTrace();/ 将分数存到数据库/try ConnectBean cb = newConnectBea

33、n();if(!cb.openConnection()System.out.println(连接数据失败 );System.exit(1);return;PreparedStatement pscb.createPreparedStatement(subject);ps.setInt(1, count);ps.setInt(2, uno);ps.executeUpdate();System.out.println( 更 新 成功 );mit();/ 将分数返回到客户端 try cb.close(); catch (SQLException e) / TODO 自动生成 catch 块Syste

34、m.out.println( 写 入 数据发生错误! !/n + e);if (e.getSource()= callIP)4.7TestGui.javapublic voidactionPerformed(ActionEvent e) / 呼叫服务器if (socket != null & in != null & out != null) /消除以往的连接信息try socket.close(); in.close(); out.close(); catch (Exception ee)String login = user + , +pass;int port1 = 8001;try/

35、建立网络连接socket = new Socket(ip,port1);in = new DataInputStream(socket.getInputStream();out = new DataOutputStream(socket.getOutputStre am();out.writeUTF(login); catch (IOException ee) /如果连接失败ipField.setText( 呼叫 失败 );stateField.setText( 你呼叫没有成功 );int port4 =8004;try in = new DataInputStream(socket.getI

36、nputStream ();out = new DataOutputStream(socket.getOutputStre am();out.writeUTF(user); stuinfo.setText( 请求 信息已发送 ); catch (IOException ee) / 如果连接失败ipField.setText( 呼叫 失败 );stateField.setText( 你呼叫没有成功 );stuinfo.setText( 你呼 叫没有成功 );if (socket != null) /如果连接成功try String queryInfo = in.readUTF(); / 得到 查

37、询结果stuinfo.setText(queryInfo);out.flush(); out.close(); catch (IOException e1) / 出现异常otherinfo.setText(数 据 传 输 错 误);socket = new Socket(ip,port4);考试 else if (e.getSource() beginExe) /生成试题String mgr = (String) subject.getSelectedItem();if (mgr.equals( 英语 ) /选择英语selectT(e); else if (mgr.equals(数学) /选择数学selectT(m);stateField.setText( 你 已 经选择了 + mgr + 试题 );testinfo.setText(你 已 经选择了 + mgr + 试题);startTest.setEnabled(true); else if (e.getSource()start

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论