1、在线考试系统JAVA题目 在线考试系统1、 实验目的熟练运用JAVA开发环境及工具、并用JAVA语言编写程序;掌握面向对象的概念;掌握系统功能模块的合理划分,并实现各模块接口的连接;掌握C/S结构的编程方法;设计数据库模型。2、 实验内容编辑生成试题库,随机生成本次考试试题,同时提供在线评分并保存结果。选择ACCESS作为后台的数据库。3、 实验过程3.1 系统模块部分设计题库管理:用于对单个试题的增、删、改、查等基本维护,还可对题库进行数据备份和数据还原。我们针对不同题型、不同应用范围及不同科目对试题进行维护。试卷管理:可进行三种组卷方式的维护:随机组卷、人工组卷、综合组卷。还可对考生的基本
2、信息进行维护。考试管理:对考试分配试卷,并对考试的基本信息进行维护。相当于人工安排考试的过程评卷管理:对试卷的客观题分配评卷人,并对评卷人基本信息进行管理。成绩管理:对每次考试的学生成绩的基本信息进行维护,并提供学生成绩的统计管理。用户管理:对使用本系统的用户基本信息进行维护,用户多数为:系统管理员、老师、教务处人员、其他权限管理:对系统的访问权限进行管理,并对用户可进行权限的分配。系统应该具备的基本功能各模块需完成以下功能:题库管理试卷管理试卷其他维护试卷信息维护其它维护试题维护基本维护综合组卷人工组卷随机组卷题型维护科目维护范围维护题型维护:对试题的题型进行增、删、改、查操作。在操作之后会
3、自动刷新主页,以使信息更新。范围维护:对试题的应用范围进行增、删、改、查操作。在操作之后会自动刷新主页,以使信息更新。科目维护:对试题的科目进行增、删、改、查操作。在操作之后会自动刷新主页,以使信息更新。试题维护:对试题的基本信息进行增、删、改、查操作。在操作之后会自动刷新主页,以使信息更新。其他维护:对试题信息的批量查询,并可进行数据导出、数据备份、数据恢复。随机组卷:用户只需对试卷题型进行设置就可组卷的方式。人工组卷:可使用户选择试卷的题型中的试题的组卷方式。综合组卷:是随机组卷与人工组卷的混合组卷方式,即用户对某一类型的试题可进行选择,也可对试题不进行选择。试卷其他维护:对试卷信息的批量
4、查询,对试题的数据备份与还原。考试信息维护:对考试的时间、地点、监考人、考试用的试卷、试卷总分数及答卷总时间等考试的基本要素进行设置。考生信息维护:对考试的学生的基本信息进行增、删、改、查操作,在操作之后会自动刷新主页,以使信息更新。分配评卷人:对考试所用试卷的客观题分配评卷人,并对评卷的基本信息进行维护。评卷人评卷:对分配试卷的评卷人可以在此进行评卷。考生成绩维护:对考试的考生成绩信息进行统计与汇总,对有权限的人可进行成绩的增、删、改、查操作。成绩其他维护:对考生成绩信息的批量查询,并可进行数据导出、数据备份、数据恢复。用户基本信息维护:对使用本系统的用户进行维护,而用户的权限由权限管理进行
5、维护,并分配给用户,使用户只能访问自己拥有的权限内。权限信息维护:对基本的权限进行维护,用户可自定义维护权限。用户分配权限:对未分配权限的用户进行权限的分配,即对 分配权限的增、删、改、查操作。信息基本维护:我们的信息除了有关考试的信息外,还有公告、新闻、留言信息需要我们维护,其中公告、新闻由后台有权限的人进行增、删、改、查操作,而留言是由前台的用户(学生)或游客录入的,我们要防止垃圾数据显示,即对留言有权更改等操作。3.2系统结构图、本系统分为学生前台子系统和考试管理子系统,整个系统的结构图如下:3.3 数据库设计试题类型表(questionType_table):其中包括了试题的类型的基本
6、信息,如类型名称、答题方式、说明信息等字段;录入时,我们将答题方式确定为大概几种类型:填空方式,选择方式,问答方式,判断方式,综合方式。试题范围表(questionBound_table):用于控制试题应用的范围,如同样的科目语文,在小学、初中、高中、大学都有,由此我们设定了此表,此表中有范围名称、范围说明等基本信息;所属科目表(questionSubject_table):用于录入试题相关的科目应用,它可以有不同的应用范围。如上所述,我们只需录入一次的科目,就可方便我们在录入试题时每次都录。各种题库表:我们采用一种类型的题存储在一个表中,由此我们会有填空题表(question_blanc_t
7、able)、单选题表(question_selectone_table)、多选题表(question_selectMany_tabel)一题多问表(question_askone_table)、一题多问表(question_askMany_table)、判断题表(question_judge_table)等试题表 试卷表(exam_table):用于报存考试中试卷的基本信息,如出卷方式(有随机出卷、人工出卷、综合出卷)、试卷名称、试卷应用范围(与试题范围相对应)、试卷所属科目(与试题科目相对应)、试题标题级别、试题标题内容、试题总类型、试题个数、试题总ID等基本信息。学生表(student_t
8、able):用于保存学生的考试的用户名及登陆密码。成绩表(grade_table):用于存储学生的考试成绩。评题表(appraiser_question_table):对于主观题的答案我们须要评卷人(有权限的用户)进行手工评卷,本表用来存储评卷人评卷的一些信息。答案表(student_answer_table):用于存储学生问答题的答案,如试卷ID,学生ID及各种试题类型的答案字段。用户表(user_table):用于保存用户的登陆的基本信息及分配的权限。权限表(purview_table):用于存储用户组织的的权限,通过分配操作模块的权限组织权限。4、 关键代码及其分析4.1-ServerG
9、ui.java-public void actionPerformed(ActionEvent e) if (e.getSource() = log) / boolean b=login(); String username = JOptionPane.showInputDialog(this, 请输入用户名, 输入用户名, JOptionPane.QUESTION_MESSAGE).trim(); String password = JOptionPane.showInputDialog(this, 请输入密码, 输入密码, JOptionPane.QUESTION_MESSAGE).tri
10、m(); if (username = null | password = null) username = temp; password = temp; return; adminCheck(username, password);/ 验证管理员 if (tf = true) JOptionPane.showMessageDialog(this, 登陆成功!, 成功, JOptionPane.INFORMATION_MESSAGE); toolBar1.setVisible(true); split_one.setVisible(true); else JOptionPane.showMes
11、sageDialog(this, 登陆失败!, 失败, JOptionPane.ERROR_MESSAGE); return; else if (e.getSource() = setCount) userCount = JOptionPane.showInputDialog(this, 请输入本次考试的人数); inittest(); / 数据库信息初始化 else if (e.getSource() = startSer) if (settime = true & setcount = true) new ServerManager(); serArea.append(服务器已启动n预设考
12、试人数为: + userCount + n考试时间为: + timeCount + n); start = true; else JOptionPane.showMessageDialog(this, 你还没有设置考试信息, 警告信息, JOptionPane.INFORMATION_MESSAGE); if (start = true) linkArea.append(ServerManager .linkShow(ServerManager.linkstatus) + n); else JOptionPane.showMessageDialog(this, 服务器还没有启动不能进行操作,
13、警告信息, JOptionPane.INFORMATION_MESSAGE); else if (e.getSource() = userButton) if (start = true) userArea.append(ServerManager .userShow(ServerManager.userstatus) + n); userArea.append(ServerManager.countShow(ServerManager.ucount); else public void adminCheck(String s1, String s2) ConnectBean cb=new C
14、onnectBean(); if (!cb.openConnection() System.out.println(连接数据失败); System.exit(1); return; 4.2-Server_login.java-/ 定义一个接收用户登陆的类public void run() String s = null; try s = in.readUTF(); / 接收考试号和密码,然后分别取出 StringTokenizer st = new StringTokenizer(s, ,); if (st.hasMoreTokens() str1 = st.nextToken(); str2
15、 = 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() System.out.println(连接数据失败); System.exit(1); return; cb.createPreparedStatem
16、ent(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.createPreparedStatement( select sname,spass from stuinfo where sno= + str1 + , false
17、); ResultSet rs = cb.executeQuery(); while (rs.next() dbn = rs.getString(sname); dbp = rs.getString(spass); System.out.println(用户: + str1 + 你的用户名为: + dbn + , 你的密码为: + dbp); / 验证用户密码,如果登录成功将登录标志设为1 if (str2.equals(dbp.trim() out.writeUTF(用户 + dbn + 登陆成功); System.out.println(用户 + dbn + 登陆成功); out.clos
18、e(); String sql1 = update stuinfo set flag = 1 where sno= +str1+; PreparedStatement ps = cb.createPreparedStatement(sql1); ps.executeUpdate(); System.out.println(用户成功登录); else out.writeUTF(密码错误); System.out.println(登陆密码错误); out.close(); cb.close();4.3-ServerManager.java-public ServerManager() Thread
19、 td1 = new Thread() public void run() serstatus= login thread start!n; serShow(serstatus); ServerSocket ss1 = null; Socket you = null; int port1 = 8001; try ss1 = new ServerSocket(port1); serstatus = listener the port: + port1; serShow(serstatus); catch (IOException e) e.printStackTrace(); while (tr
20、ue) try you = ss1.accept(); catch (IOException e) e.printStackTrace(); if (you != null) counter+; ucount = 现在参加考试的人数为: + counter; countShow(ucount); if (counter Maxcount) userstatus= users IP + you.getInetAddress() + connected + port1 + 进行登陆; userShow(userstatus); / 第一个线程启动 new Server_login(you).sta
21、rt(); else userstatus = users IP + you.getInetAddress() + connected + port1 + 中断线程启动; userShow(userstatus); / 中断线程启动 new Maxcounter(you); ; td1.start(); / 启动一个响应客户端读取试题的线程 Thread td2 = new Thread(two) public void run() serstatus= thread 2 start!; serShow(linkstatus); ServerSocket ss2 = null; int por
22、t2 = 8002; try ss2 = new ServerSocket(port2); linkstatus = listener the port: + port2; linkShow(serstatus); catch (IOException e) e.printStackTrace(); while (true) Socket you2 = null; try you2 = ss2.accept(); catch (IOException e) e.printStackTrace(); if (you2 != null) userstatus = users IP + you2.g
23、etInetAddress() + connected + port2 + 进行读题; userShow(userstatus); new Server_readTest(you2).start(); ; td2.start() / 启动一个接收用户答应并存储的线程 Thread td3 = new Thread(three) ServerSocket ss3 = null; int port3 = 8003; public void run() serstatus=thread 3 start!; serShow(serstatus); try ss3 = new ServerSocket(
24、port3); linkstatus=listener the port: + port3; linkShow(linkstatus); catch (IOException e) e.printStackTrace(); while (true) Socket you3 = null; try you3 = ss3.accept(); catch (IOException e) e.printStackTrace(); if (you3 != null) userstatus=users IP + you3.getInetAddress() + connected + port3 + 提交答
25、案; userShow(userstatus); / 第3个线程启动 new Server_readScore(you3).start(); ; td3.start(); / 启动一个用户查询的线程 Thread td4 = new Thread(four) ServerSocket ss4 = null; int port4 = 8004; public void run() serstatus=thread 4 start!; serShow(serstatus); try ss4 = new ServerSocket(port4); linkstatus=listener the por
26、t: + port4; linkShow(linkstatus); catch (IOException e) e.printStackTrace(); while (true) Socket you4 = null; try you4 = ss4.accept(); catch (IOException e) e.printStackTrace(); if (you4 != null) userstatus=users IP + you4.getInetAddress() + connected + port4 + 进行查询; userShow(userstatus); 4.4-Server_readTest.java-public void run() String
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1