版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
页绪论研究背景及意义以在线教育系统和在线考试系统为主要内容的教学管理系统作为一种新的教学方式已经开始进入各大高校,对教育的发展形成新的推动力。到目前为止,全国主要高校的校园网络都完成了初步的铺设工作,学生随时可以在校园、教室、寝室等地访问校园网。相对于传统教学模式的限制,网络教学顺应了个性化教学的发展,不再像传统教学那样受时间与空间的限制,同时网络教学可以使得教学资源得到更大的共享,极大的降低了教育的成本,体现了教育的大众化、终身化、多样化和国际化的最终目的。教学管理是学校管理的核心内容,随着高校规模的扩大,学生人数的增多,课程的增设,其复杂性和综合性要求现代化的管理手段比较高,而我国一些高校对教学管理仍然沿用原始的机制,极大的浪费了人力物力。在信息化时代的今天,这种传统的管理方法已经被以计算机为基础的信息管理系统所取代[1]。是的,比如都做过学生的我们来讲,考试这个事情一定都不会陌生,而考试与考卷总是同行的,考卷又和评分不可分离,而与以往不同的是在互联网软件技术发达的今天,我们可以采取一种全新的、即时的、便捷的、高效的在线考试平台来替代传统的、纸质的、手动批改的线下考试。对于以往的考试来说,从古至今都是采用纸质试卷,笔墨作答的方式来给出我们的答案,老师作为出题者,将题交由印刷者印刷出试题卷,再分发给考生,考生做答完试卷,交由老师手动批改,核算得分,这一流程中,老师作为出卷人需要花费大量时间等待试卷印刷完成,考试完后需要花费大量时间修改试卷核算分数,所以会造成大量宝贵的教学时间、休息时间和教学资源上的浪费、效率的降低,但是在互联网技术如此发达的今天,我们不再仅限于纸质的试题卷上了,我们可以采取一种线上的考试系统来完成这一过程。线上考试的灵活性更高,组织效率更高,老师不再手动改评试卷,而由软件系统来自动测评试卷完成评分,从而节约很多的教育教学资源和大量的时间,不仅如此,在线考试系统更加轻松更加公平,能够更快的完成考试这一环节的工作,降低考试带来的环节复杂性,改善考试管理、学习水平、技能水平的要求。国内外研究现状国内从上世纪90年代起,就开始逐步向有权威性的考试部门推行计算机在线考试的方式,但当时几乎很难被社会认可。从上世纪末期,国内许多全国范围性的考试便已开始使用计算机来组织。从1994年开始的计算机软件水平等级专业技术考试开始,到1996年起执行的全国性非计算机专业等级考试等[2],到现在国内的在线考试平台多入牛毛,都标志着线上考试的逐步普及和使用常态化。国内的比如考试酷、优考试等在线考试网站都是被普遍使用的在线考试系统,其中优考试在技术上更加领先应用更广,它结合了大数据的分析,广泛用于员工培训考核、竞赛、模考练习、认证考试等多种考试场景。优考试采用基于B/S的系统架构,基于最新的多并发高性能的GO语言编写,采用Mysql数据库,可部署于Windows、Linux、Unix、Mac等各种操作系统,可以在任意平台诸如iPhone、Android、PC、iPad等设备上以相同的优异体验进行学习考试,满足从简单到复杂的各种环境下的测评、考试、学习等任务。从目前来看,线上考试更加趋于公平和公正,高效且客观,因此国内很多大型考试也在采用这种模式在推进考试事业的发展,比如CET4、CET6采用的就是建立题库,然后计算机随机抽题出卷,这种方式较为科学客观。国外的互联网技术发展状况相比国内更加靠前,在教育方面,国外的大学和社会部门都在实现通过网络实现远程教育,美国、日本、加拿大、英国等在该领域的发展较早,其发展模式也较为成熟,同时也受到了大量国家的借鉴。从1995年底,国外便开始出现了支持网上在线教学的系统和平台。例如美国的NTU、英国的OPCollege等都是当时十分典型的网络教育先驱示范点。此外,美国的ATA开创了一个以考试为核心的新型智能在线发展模式。该考试模式开创了计算机信息考试的里程,在该系统里集成了考试题型管理、试题加载管理、数字化考务管理、智能阅卷管理、成绩统计分析管理等多项功能,实现了先进的计算机自动化考试管理模式,率先推行了先进的考试技术平台[2],就比如大家熟知的“ACCA”(国际注册会计师)就是采用的在线机考的方式来进行的。2012年“TOBEFL”(托福)这个被中国学子熟知的出国考试流程也改为了“IBT”网上考试。由此可见在线考试在很多年前已经成为了一种趋势,时至今日这种趋势已经不再叫趋势,应该叫新的考试方式、教育考试中的一种基本模式了。且近年来,软件开发的核心在往大数据方向发展,结合大数据技术、多线程、高并发技术来发展教育考试系统是当前需要发展的方向,以此提高数据处理和同时在线访问数。论文研究特色选题很有意义,综合分析成都工业学院的教学进程、教学特点,并设计实现一种贴合这些特点的在线测试系统,很有意义。且系统本身采用B/S架构,这种架构模式可以很好的去解决传统纸质考试的一些局限性。研究内容系统的总体架构课程在线测试平台的基础开发框架采用Spring、SpringMVC、Mybatis有机结合作为系统的大框架以及基础框架(下文简称为SSM框架)。以SSM框架为一个基础的模板,在构建程序的时候就只需要将注意力放在业务代码的实现上,帮助提高开发效率。系统架构采用B/S模式,即(Browser/Server)的架构模式实现页面的展示和数据的传输。相关技术介绍B/S架构B/S架构是Browser/Server的简称。它的工作原理是通过浏览器Browser的解释将页面放置于前端进行展示,事务逻辑交给服务器Server来进行处理,只需要安装有浏览器,用户就能随时随地的访问服务器的数据,然后使用HTML文档技术将数据结合页面放在Browser进行展示,这样可以将各种数据机制联合起来。首先用户于页面进行动作发送服务请求,请求到达服务器,服务器启动服务调用适当的业务控制器访问数据库,再将数据结合页面反馈给浏览器,生成响应页面,完成整个服务过程。这种架构对于Java这种跨平台的语言而言,可以更好的管理软件系统,而且对于更新较多的系统而言,可以更加便捷,易于升级和维护。不仅如此,对于用户的UI展示,可以做到更加的丰富和更强的交互性。SpringSpring意为“春”,它不仅给程序员带来春天,还给程序系统带来了春天。它是为了降低企业级开发的难度与复杂度诞生的一种开源轻量级框架,是一款软件半成品。它的主要作用就是实现系统各种层级间的分离,将各个层级进行模块化的划分,使得在开发系统的时候能够像搭积木一般将各个模块进行结合。Spring框架主要有两个核心,控制反转IoC、面向切面编程(AOP),它像一个大管家一样管理着整个程序,降低对象和各个组件之间的耦合性。IoC是将创建对象的控制权反转给Spring,可以更好的管理对象的生命周期,所以说Spring是一个大管家。AOP可以进行事务的集中处理,将重复的代码进行提炼,然后织入到各个切面的切点中,完成代码的逻辑增强。Spring也是整合其他框架的整合组件,可以将SpringMVC和Mybatis串联起来。Spring的特点有:(1)轻量级:轻量级是针对重量级容器(EJB)来说的,Spring的核心包就不到1M大小,而使用Spring的核心包所需的资源也很小,所以可以在小型设备中使用。(2)非入侵式:Spring目标是一个非入侵式的服务框架。原因是所有框架都是提供大量的功能供用户去使用,从而简化开发时间和成本,但由于大量的使用了框架的API,使应用程序和框架发生了大量的依赖性,无法从框架中独立出来,更加无法使程序组件在其他程序中使用。(3)容器:Spring提供了容器功能,容器可以管理对象的生命周期、对象与对象间的关系、我们可以通过编写XML来设置对象关系和初始值,这样容器在启动之后,所有的对象都直接可以使用,不用编写任何编码来产生对象。Spring有两种不同的容器:Bean工厂以及应用上下文。Spring部分核心jar包及其作用介绍:(1)SpringAOP:Spring的面向切面编程,提供AOP(面向切面编程)的实现。(2)SpringAspects:Spring提供的对AspectJ框架的整合。(3)SpringBeans:SpringIOC的基础实现,包含访问配置文件。创建和管理bean等,所有应用都能用到。(4)SpringContext:在基础IOC功能上提供扩展服务,此外还提供许多企业级服务的支持。有邮件服务、任务调度。JNDI定位,EJB集成、远程访问、缓存以及多种规图层框架的支持。(5)SpringCore:Spring的核心工具包,其他包依赖此包。(6)Springexpression:Spring表达式语言。(7)SpringJDBC:对JDBC的简单封装。SpringMVCSpringMVC是一种基于Spring实现了WebMVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC的架构模式思想,将Web层进行解耦,并管理应用所需的生命周期,为简化日常开发,提供了很大便利。SpringMVC提供了总开关DispatcherServlet,请求处理映射器(HandlerMapping)和处理适配器(HandlerAdapter),视图解析器(ViewResolver)进行视图管理,动作处理器Controller接口(包含ModelAndView,以及处理请求响应对象请求和响应),配置灵活,支持文件上传,数据简单转化等强大功能。它的工作原理是首先请求到达核心控制器dispatcherServlet,dispatcherServlet会判断请求后缀是否满足格式要求,如果满足格式要求,会查询handlerMapping,查找对应的handler,调用handlerAdapter进行参数绑定等适配工作,之后调用具体的handler进行业务逻辑处理,返回一个ModelAndView对象给dispatcherServlet,dispatcherServlet调用viewResolver进行视图解析渲染,然后返回给客户端。MybatisMybatis是一个支持普通sql查询,存储过程和高级映射的优秀持久层框架。Mybatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装,Mybatis可以使用简单的xml或注解用于配置原始映射,将接口和Java的POJO(PlainOldJavaObjects,普通的Java对象)映射成数据库中的记录。它的工作原理是先通过xml解析、反射,最后通过动态代理机制来生成mapper接口的实现类对象,xml文件中namespace的值就等于mapper接口的类路径、sql标签的id值就等于mapper接口的方法名。例如一个插入语句:<insertid=“isAddClass”parameterType=“com.online.exam.po.ClassInfo”>INSERTINTOClassInfoVALUES(NULL,#{className},#{grade.gradeId},#{teacher.teacherId})</insert>这里id属性的值就代表了DAO层接口中定义的CRUD方法名,parameterType代表参数类型,insert语句放在标签<insert>内部这样一种xml文件定义的标签格式。AjaxAjax是AsynchronousJavaScriptandXML的简称,意为异步javascript和xml,是一种与服务器交换数据并更新部分网页的技术,也是一种艺术,不用重新加载整个页面。在原生javascriptajax的基础上,在前台页面中嵌入JqueryAjax技术,更加减少了代码量,一般在页面结合动作事件来触发,达到一个动态刷新页面的效果。很简单的一个运用例子,在进行网页登录的时候需要验证账号密码,当用户填写完成账号和密码之后,会进行点击登录按钮的操作,那么在登录按钮上绑定一个单击事件,然后通过这个事件去触发一个ajax请求,将账号或密码往后台进行发送,后台业务处理机制接收到此参数,进行业务逻辑处理,然后进行数据库访问,到数据库中做一个查询动作,然后返回结果给ajax,然后在ajax回调函数中进行结果接收,以此返回给用户,如果没有找到此账号相关的信息,就提示账号不存在来完成账号的验证过程。系统分析可行性分析技术可行性分析利用现有的软件开发技术,可以构建出系统的基础架构,并进行业务逻辑的实现。可以在一定的期限内完成整个系统的构建与实现,所以在本文研究范畴内系统的实现是具有技术可行性的。操作可行性分析系统开发中包含大量的交互动作,通过用户的操作进行系统的业务流程周转,并和用户进行交互,在操作上是可以给与用户反馈的,具有高度可操作性。经济可行性分析拟采用的技术,从经济角度分析,成本是在一定的小范围内并且可估的,因为现有的技术在网络或书籍中有大量的介绍,相似的简单系统中实现起来成本是可估可控的,在本文研究范畴内系统的实现是具有经济可行性的。需求分析功能需求分析1.学生:(1)学生登录:通过账号,密码进行系统的登录;(2)参与考试:学生登录系统以后可以参加需要完成的考试;(3)查询历史考试情况:学生登录系统后可以查看历史考试情况以及对历史考试题目的回顾;2.教师:(1)查看基本信息:查看包括班级信息及学生基本信息;(2)试题管理:对试题进行添加、删除、修改、查询以及分类;(3)试卷管理:包括对试卷添加、删除、修改、查询,以及对试卷题目的添加修改;(4)考试安排:查询待考信息以及添加和删除考试安排;(5)以往考试查询:查询以往的考试信息;3.管理员:(1)教师的基本功能:管理员的权限是在教师基础上添加了与系统管理有关的权限,管理员本身也可以担任老师;(2)班级管理:对班级进行添加、删除、修改、查询及老师分配等;(3)教师管理:对老师信息的查询、修改、删除、查询等;(4)基本信息管理:对年级的管理和对科目的管理,分别包括查询、修改、删除、查询操作;根据系统功能分析,将整个系统的功能模块规划为如下的功能模块图:用例分析(1)学生用例:(2)教师用例:(3)管理员用例:系统设计总体设计课程在线测试平台主要采用B/S架构,在页面方面主要引用Bootstrap前端框架进行页面上的展示,SSM框架为后台基础框架进行开发,采用MVC的模式,在页面中触发请求到达控制器,控制器进行业务逻辑处理,将数据反馈给页面,整个逻辑较为清晰。前端UI展示方面,主要还是以JSP页面为基础,结合Bootstrap框架进行前端展示,调用JavaScript代码进行一些前台的业务处理和动态交互,CSS代码进行部分页面效果调整,Jquery库文件进行元素操作。后台主要使用MVC设计模式和SSM框架进行业务处理、数据访问和视图渲染。根据设计好的数据表通过逆向工程生成实体类,业务处理接口和Mapper文件,很大程度上减轻开发的难度。概要设计课程在线测试平台采用的架构是B/S模式,使用Java语言开发,所以在部署上可以采用Linux系统等多种系统进行部署,且工程整体占用的空间不大,对系统本身的性能要求不高,服务器只需具备必要的环境,如JDK、JRE、Tomcat服务器、Mysql数据库等必要的工具即可。外部直接访问服务器提供给用户的接口便可以进行数据访问和资源访问,用户可自行进行交互,而交互的结果是对数据的改变,并且最终由页面进行呈现。系统最终划分成两个独立的端系统,前台学生端系统和后台教师管理系统。前台学生端系统主要用于开放学生登录和教师登录的用户接口,学生的考试中心和考试历史查看;后台教师端管理系统主要用于对基础信息的管理、学生的管理、试卷的管理、试题的管理、考试安排管理等。详细设计表4-1学生端功能表模块名称功能简述学生登录学生输入个人账号和密码进行登录,进入学生端主页考试中心参加安排好的考试考试记录查看已参加的考试历史,成绩试卷等表4-2教师端功能表模块名称功能简述教师登录教师使用账号进行登录年级管理管理员对班级信息的CRUD,普通教师查看班级信息科目管理管理员对科目信息的CRUD,普通教师查看科目信息班级管理管理员对班级信息的CRUD,普通教师查看班级信息教师管理管理员对教师信息的CURD,教师查看教师信息但只能修改本人信息学生管理管理员对学生信息的CRUD,教师对学生信息的修改删除试卷管理管理员对试卷信息的CRUD,试卷的题目编辑,教师对对试卷信息的CRUD,试卷的题目编辑试题管理管理员对试题信息的CRUD,教师对试题信息的CRUD考试安排管理管理员对代考信息的CRUD,教师对代考信息的CRUD以往考试信息管理员对考试记录信息的CRUD,教师对考试记录信息的CRUD数据库设计数据库选择数据库选用MySQL数据库作为开发的基础数据库。MySQL数据库是目前在企业级中小型项目开发所用到主流轻量级关系型数据库,采用结构化查询语言。MySQL数据库现属Oracle公司管理,具有体积小,速度快的优点,且开源免费,对比Oracle公司的另一款Oracle数据库的话,Oracle相比MySQL主要用于重量级的开发。MySQL数据库还支持事务管理,事务处理可以维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。MySQL支持SQL的GROUPBY和ORDERBY子句,支持聚合函数,支持多种开发语言,符合在线测试平台的数据操作要求,所以选用MySQL作为基础数据库。数据表设计首先,信息世界中包含的基本概念有两个,实体和联系。(1)实体(entity)客观存在并可相互区别的事物称为实体。实体可以是具体的人、事、物,也可以是抽象的概念或联系。例如:一个学生、一门课、一个供应商、一个部门、一本书、一位读者等都是实体。(2)联系(relationship)在现实世界中,事物内部以及事物之间是有联系的,这些联系在信息世界中反映为实体内部的联系和实体之间的联系。实体内部的联系通常是组成实体的各属性之间的联系。两个实体型之间的联系可以分为3类,一对一联系(1:1);一对多联系(1:n);多对多联系(m:n)。概念模型是对信息世界建模,所以概念模型应该能够方便、准确地表示信息世界中的常用概念。概念模型的表示方法很多,其中最为常用的是实体-联系(Entity-RelationshipApproach)方法简记为E-R表示法。该方法用E-R图来描述现实世界的概念模型,称为实体-联系模型,简称E-R模型。根据数据流程分析,课程在线测试系统的全局E-R模型如图所示。根据设计规划的主要实体有:教师/管理员、学生、班级、试题、科目、试卷、考试。各个实体,根据实体信息,数据库表的设计主要由班级信息表classinfo,课程信息表courseinfo,考生答案表examchooseinfo,考试记录表examhistoryinfo,试卷信息表exampaperinfo,考试安排表examplaninfo,试卷题目信息中间表examsubjectmiddleinfo,年级信息表gradeinfo,学生表studentinfo,题目信息表subjectinfo,教师信息表teacherinfo构成。班级信息表classinfo主要存储班班级id、级名、年级id、教师id等信息。课程信息表courseinfo主要存储课程id、课程名、年级id等信息。考生答案表examchooseinfo主要存储答案id、考生id、试卷id、课程id、答案等信息。考试记录表examhistoryinfo主要存储考试记录id、考生id、试卷id、得分等信息。试卷信息表exampaperinfo存储试卷名、题目数、考试计时、总分、适用年级等信息。考试安排表examplaninfo主要存储安排id、学科id、班级id、试卷id、考试时间等信息。试卷题目信息中间表examsubjectmiddleinfo主要存储试卷id和包含的题目id信息,年级信息表gradeinfo主要存储年级id年级名称等信息。学生表studentinfo主要存储学生id、学生姓名的信息,题目信息表subjectinfo主要存储题目的id、答案、分数、试题类型、难度等一些信息。教师信息表teacherinfo主要存储教师id、教师姓名等信息。表4-3班级信息表classinfo字段类型长度是/否可以为null注释classIdint11否班级id主键classNamevarchar50否班级名称gradeIdint11否年级idteacherIdint11是教师id表4-4课程信息表courseinfo字段类型长度是/否可以为null注释courseIdint11否课程id主键courseNamevarchar50否课程名gradeIdint11是年级id表4-5考生答案表examchooseinfo字段类型长度是/否可以为null注释chooseIdint11否答案id主键studentIdint11否学生idexamPaperIdint11否试卷idsubjectIdint11否题目idchooseResultvarchar500否答案表4-6考试记录表examhistoryinfo字段类型长度是/否可以为null注释historyIdint11否记录id主键studentIdint11否学生idexamPaperIdint11否试卷idexamScoreint11是得分表4-7试卷信息表exampaperinfo字段类型长度是/否可以为null注释examPaperIdint11否试卷id主键examPaperNamevarchar50否试卷名subjectNumint11否题目数量examPaperTimeint11否试卷作答时间examPaperScoreint11否总分gradeIdint11否年级idexamPaperEasyint11是难度表4-8考试安排表examplaninfo字段类型长度是/否可以为null注释examPlanIdint11否考试安排id主键courseIdint11否课程idclassIdint11否年级idexamPaperIdint11否试卷idbeginTimedatetime0否开始时间表4-9试卷题目信息中间表examsubjectmiddleinfo字段类型长度是/否可以为null注释esmIdint11否考试安排id主键examPaperIdint11否试卷idsubjectIdint11否题目id表4-10年级信息表gradeinfo字段类型长度是/否可以为null注释gradeIdint11否年级id主键gradeNamevarchar50否年级名称表4-11学生表studentinfo字段类型长度是/否可以为null注释studentIdint11否学生id主键studentNamevarchar32否学生姓名studentAccountvarchar64否学生登录账号studentPwdvarchar32否学生登录密码classIdint11否班级id表4-12题目信息表subjectinfo字段类型长度是/否可以为null注释subjectIdint11否题目id主键subjectNamevarchar500否题目题干optionAvarchar500否选项AoptionBvarchar500否选项BoptionCvarchar500否选项CoptionDvarchar500否选项DrightResultvarchar500否正确答案subjectScoreint11否题目分数subjectTypeint11是题目类型courseIdint11否课程idgradeIdint11否年级idsubjectEasyint11是题目难度表4-13教师信息表teacherinfo字段类型长度是/否可以为null注释teacherIdint11否教师id主键teacherNamevarchar10是教师姓名teacherAccountvarchar10是教师登录账号teacherPwdvarchar10是教师登录密码系统实现功能实现首页首页模块如下图所示,也是学生登录后的主页面,左上角的考试中心及考试历史,只有学生登录后方可以使用。学生登录如下图为学生登录时的弹框,分别有前端js与后端java对表单进行验证,学生通过输入正确的账号信息与密码方可进入考试系统。表5-1学生登录核心代码@RequestMapping(value="/studentLogin",method=RequestMethod.POST)
publicModelAndViewstudentLogin(StudentInfostudent,HttpServletRequestrequest){
ModelAndViewmodel=newModelAndView();
StudentInfologinStudent=studentInfoService.getStudentByAccountAndPwd(student.getStudentAccount());
("学生"+loginStudent+"有效登录");
if(loginStudent==null||!student.getStudentPwd().equals(loginStudent.getStudentPwd())){
model.setViewName("reception/suc");
model.addObject("success","密码错误");
returnmodel;
}
request.getSession().setAttribute("loginStudent",loginStudent);
model.setViewName("reception/suc");
model.addObject("success","登录成功");
returnmodel;
}教师登录如下图所示,为老师的登录界面,分别有前端js与后端java对表单进行验证,教师通过输入正确的账号和密码才能登陆教师后台界面。部分核心代码:表5-2教师登录部分核心代码/***教师登录
*@paramteacherAccount
*@paramrequest
*@return
*/
@RequestMapping(value="/teacherlogin",method=RequestMethod.POST)
publicStringteacherLogin(@RequestParam("teacherAccount")StringteacherAccount,HttpServletRequestrequest){
if(teacherAccount==null||"".equals(teacherAccount)){
logger.error("教师账号为空");
request.setAttribute("error","登录信息有误");
return"/error";
}
("教师"+teacherAccount+"登录");
//获取当前登录教师
TeacherInfoteacherInfo=teacherInfoService.getTeacherByAccount(teacherAccount);
if(teacherInfo==null){
logger.error("教师账号为空");
request.setAttribute("error","账号不存在!");
return"/error";
}
StringteacherPwd=request.getParameter("teacherPwd");
if(!teacherInfo.getTeacherPwd().equals(teacherPwd)){
logger.error("密码错误");
request.setAttribute("error","密码错误!");
return"/error";
}
//将当前登录教师后台权限存入Session
request.getSession().setAttribute("adminPower",teacherInfo.getAdminPower());
request.getSession().setAttribute("loginTeacher",teacherInfo);
return"redirect:admin/index.jsp";
}教师端基本信息(1)年级管理此处以基本信息作为例子简述实现思路,基本信息模块有年级管理和科目管理,年级管理主要是查看年级的信息,对gradeinfo表做CRUD操作,包含年级编号。主要的实现思路是,在页面中单击年级管理的连接发送请求,请求到达后台控制器GradeInfoController映射到对应请求地址“/grades”,进行业务处理调用相应的service方法,通过dao层访问数据库获取到数据,然后定义ModelAndView对象添加属性并设置返回的视图,最后返回ModelAndView对象,由此对象将数据带入页面进行遍历展示,科目管理、班级管理模块、教师管理模块主要也是查看科目信息和教师信息,实现方式同年级管理的实现思路。下图为年级管理,对于普通老师来说只能看到列表而不能看到相应的操作选项,也就是操作后的“添加”,以及每行信息后面的修改和删除;当具有管理员权限的老师(以下简称管理员)进行操作是添加、删除、编辑。本系统中其它一些页面也会使用类似的方法,同一前端页面会根据用户权限显示也稍有区别,以此来减少前端代码的冗余。下图为以管理员身份登录并添加年级时的页面,只需要正确的输入年级名称点击提交即可完成年级的添加。部分核心代码:表5-3年级管理部分核心代码@RequestMapping(value="/grade",method=RequestMethod.)StringisAddGrade(GradeInfograde,HttpServletRequestrequest){("添加年级"+grade);if(grade==null){logger.error("年级"+grade+"为空");request.setAttribute("error","年级添加失败,请稍后再试!");"error";}row=gradeInfoService.isAddGrade(grade);if(row<1){logger.error("年级添加失败");request.setAttribute("error","年级添加失败,请稍后再试!");"error";}"redirect:grades";}(2)科目管理下图为科目管理页面,对于普通老师仅能进行查看,对于管理员可以进行相应的操作,包括添加、修改和删除。部分核心代码:表5-4科目管理部分核心代码@RequestMapping(value="/course/course",method=RequestMethod.)StringisUpdateOrAddCourse(@RequestParam(value="courseId",required=false)IntegercourseId,@RequestParam(value="isupdate",required=false)IntegerisUpdate,@RequestParam("courseName")StringcourseName,@RequestParam("gradeId")IntegergradeId){CourseInfocourse=newCourseInfo();course.setCourseId(courseId);course.setCourseName(courseName);GradeInfograde=newGradeInfo();grade.setGradeId(gradeId);course.setGrade(grade);//修改if(isUpdate!=null){("修改科目"+course+"的信息");row=courseInfoService.isUpdateCourse(course);}//添加else{("添加科目"+course+"的信息");row=courseInfoService.isAddCourse(course);}"redirect:/courses";}班级管理下图为班级管理页面,对于普通教师来说只能查看班级信息,包括班级名称、所属年级及班主任姓名,而不能进行相关操作。而管理员可对班级进行添加、修改以及删除操作。教师管理下图为教师管理界面,教师管理页面可以查看所有教师的信息,对于普通教师而言可以查看所有教师的信息,但能查看自己的密码以及对自己账号的信息进行修改。而管理员则可以修改和删除所有教师的信息,也仅有管理员能够添加新的教师。下图为管理员添加教师时的界面,管理员需要选择教师权限,填写教师姓名、账户以及密码来完成教师的添加。学生管理学生管理可以查看所有学生信息。下图为所有学生页面,教师及管理员都可对查看所有学生信息,和对学生的信息进行修改以及删除操作。下图为对学生信息的修改操作,教师可以修改学生的班级、姓名以及登录密码。试卷管理试卷管理可以查看所有试卷信息。下图为所有试卷页面,教师及管理员都可对查看所有试卷的基本信息,和试卷的修改、删除以及查看试卷试题、添加试题和自动生成试卷功能。同时教师及管理员也可以直接添加新的试卷。部分核心代码:表5-5试卷信息获取部分核心代码@RequestMapping("/examPapers")ModelAndViewgetCourses(@RequestParam(value="gradeId",required=false)IntegergradeId,@RequestParam(value="startPage",required=false,defaultValue="1")IntegerstartPage,@RequestParam(value="pageShow",required=false,defaultValue="10")IntegerpageShow){("获取试卷集合gradeId="+gradeId+",startPage="+startPage+",pageShow="+pageShow);ModelAndViewmodel=newModelAndView();model.setViewName("/admin/examPapers");if(gradeId!=null){grade.setGradeId(gradeId);examPaper.setGrade(grade);}Map<String,Object>map=newHashMap<String,Object>();//计算当前查询起始数据索引startIndex=(start1)*pageShow;map.put("examPaper",examPaper);map.put("startIndex",startIndex);map.put("pageShow",pageShow);List<ExamPaperInfo>examPapers=newExamPaperInfoService.getExamPapers(map);model.addObject("examPapers",examPapers);//获取试卷总量examPaperTotal=examPaperInfoService.getExamPpaerTotal();//计算总页数pageTotal=1;if(examPaperTotal%pageShow==0){pageTotal=examPaperTotal/pageShow;}else{pageTotal=examPaperTotal/pageShow+1;}model.addObject("pageTotal",pageTotal);model.addObject("pageNow",startPage);model;}下图为添加试卷的页面,教师需要选择试卷的难易程度、所属年级以及填写试卷名称和考试时长来完成试卷的创建。下图为添加试题到试卷的操作,教师考试手动的从题库里选择相应的试题添加的对应的试卷中。当然也可以使用系统提供的生成试题功能,通过设定数量、难度等信息由系统自动为试卷添加题目。部分核心代码:表5-6试卷编辑部分核心代码@RequestMapping(value="/handAdd",method={RequestMethod.,RequestMethod.})isHandAddSubjectToExamPaper(@RequestParam(value="examPaperId")IntegerexamPaperId,HttpSessionsession,HttpServletResponseresponse)throwException{//添加试题总分统计scoreSum=0;//添加试题总量统计subjectSum=0;Map<String,Object>map=newHashMap<String,Object>();map.put("examPaperId",examPaperId);ArrayList<Integer>subjectIds=newArrayList<Integer>();//试题信息List<String>ids=(List<String>)session.getAttribute("ids");session.removeAttribute("ids");if(ids!=null){(Stringis:ids){//分割试题编号和分数String[]idAndScore=is.split(",");subjectIds.add(Integer.(idAndScore[0]));//累加试题分数scoreSum+=Integer.(idAndScore[1]);//累加试题数量subjectSum+=1;}/**需要添加试题集合*/map.put("subjectIds",subjectIds);}{logger.error("试题集合为空,不能进行添加试题操作!");response.getWriter().print("需要添加的试题为空,操作失败!");}("添加试题集合到试卷"+examPaperId);//总分和题目数量信息Map<String,Object>scoreWithNum=newHashMap<String,Object>();scoreWithNum.put("subjectNum",subjectSum);scoreWithNum.put("score",scoreSum);scoreWithNum.put("examPaperId",examPaperId);/**修改试卷总分*/examPaperInfoService.isUpdateExamPaperScore(scoreWithNum);/**修改试卷试题总量*/examPaperInfoService.isUpdateExamPaperSubjects(scoreWithNum);/**添加试题到试卷中*/esmService.isAddESM(map);response.getWriter().print("试题已成功添加到试卷中!");}试题管理试题管理可以查看所有试题信息。下图为所有试题页面,教师及管理员都可查看所有试题的基本信息,以及对相应的试题进行修改。同时教师及管理员也可以直接添加新的试题。下图展示了教师添加新题目的界面,首先教师需要选择添加的题型,并且在下方所对应的编辑栏里输入对应的题目信息。其次在同页面中填写对应的难易程度、所属科目、所属年级以及题目分值信息来完成新题目的添加。部分核心代码:表5-7添加试题核心代码@RequestMapping(value="/addSubject",method=RequestMethod.)addSubject(SubjectInfosubject,HttpServletResponseresponse)throwIOException{if(subject!=null){subject.setSubjectName(trimChar(subject.getSubjectName()));subject.setRightResult(trimChar(subject.getRightResult()));subject.setOptionA(trimChar(subject.getOptionA()));subject.setOptionB(trimChar(subject.getOptionB()));subject.setOptionC(trimChar(subject.getOptionC()));subject.setOptionD(trimChar(subject.getOptionD()));}row=subjectInfoService.isAddSubject(subject);response.getWriter().print("试题添加成功!");}考试安排管理考试安排管理可查询待考信息。下图为待考信息页面,教师可以查看所有的代考信息,并且可以对一些考试的安排进行修改和删除,同时也可以添加新的考试安排。部分核心代码:表5-8考试安排部分核心代码/***预添加**/@RequestMapping("/preAddep")ModelAndViewpreAddep(){ModelAndViewmodel=newModelAndView();model.setViewName("admin/examPlanedit");//获取所有班级信息List<ClassInfo>classes=classInfoService.getClasses();model.addObject("classes",classes);//获取所有科目信息List<CourseInfo>courses=courseInfoService.getCourses();model.addObject("courses",courses);//获取所有的试卷信息--纯净的List<ExamPaperInfo>examPapers=examPaperInfoService.getExamPapersClear();model.addObject("examPapers",examPapers);model;}/***添加待考信息*examPlan考试安排记录信息**/@RequestMapping(value="examPlan",method=RequestMethod.)StringisAddExamPlan(ExamPlanInfoexamPlan){("添加待考记录:"+examPlan);examPlanInfoService.isAddExamPlan(examPlan);"redirect:examPlans";}以往考试信息以往考试信息可以查看所有考生的所有考试的记录,除了试卷名称、试卷总分、考试分数、考生名称之外,还可以查看考试详情,从而看到考试答题的实际情况。下图为以往考试信息的所有记录页面。下图为某一考生某次考试的详细信息,可以在页面中看到所有试卷信息、考生答题信息以及正确答案信息。部分核心代码:表5-9考试历史查看部分核心代码@RequestMapping("/historys")ModelAndViewexamHistorys(){List<ExamHistoryInfo>historys=examHistoryPaperService.getExamHistoryToTeacher();ModelAndViewmodel=newModelAndView("admin/examHistorys");("教师查询历史考试信息SIZE"+historys.size());model.addObject("historys",historys);model;}学生端考试中心如下图为学生登录后在考试中心中查看到的与自己相关的所有考试安排,并且能在开考时间后进入考试,来完成相应的考试。如下图为进入考试后的界面,整个页面分为左右两个部分,左边为题目以及答题区,右边则是答题剩余时间以及题目列表,在题目列表中黄色的题目为已经作答过的题目,红色的题目为正在作答的题目,绿色的题目为还未作答的题目。一旦考试时间达到后,试卷就会强制自动提交。部分核心代码:表5-10答题部分核心代码@RequestMapping(value="/choose",method=RequestMethod.)examChooseHandler(@RequestParam("studentId")IntegerstudentId,@RequestParam("examPaperId")IntegerexamPaperId,@RequestParam("subjectId")IntegersubjectId,@RequestParam(value="index",required=)Integerindex,@RequestParam("chooseAswer")StringchooseAswer,HttpServletResponseresponse)throwIOException{("考生"+studentId+"在试卷"+examPaperId+"中试题"+subjectId+"选择了答案"+chooseAswer+"序号"+index);//判断该考生是否已经选择过该试题Map<String,Object>map=newHashMap<String,Object>();map.put("studentId",studentId);map.put("examPaperId",examPaperId);map.put("subjectId",subjectId);examChoose=examChooseInfoService.getChooseWithIds(map);("考生是否选择过试题"+subjectId+""+examChoose+"(NULL-否)");if(examChoose==null){("考生"+studentId+"尚未选择试题"+subjectId+"添加选择记录答案"+chooseAswer);map.put("chooseResult",chooseAswer);/**添加选择记录*/examChooseInfoService.addChoose(map);}if(examChoose.getChooseId()!=&&examChoose!=){("考生"+studentId+"已经选择试题"+subjectId+"修改选择记录答案"+examChoose.getChooseResult()+"更新为"+chooseAswer);/**如果选择了和上次相同的答案,则不做修改操作*优化--判断选择了相同答案则不发出请求*/if(!chooseAswer.equals(examChoose.getChooseResult())){examChoose.setChooseResult(chooseAswer);/**当前选择答案和之前选择答案不同修改答案记录*/examChooseInfoService.updateChooseWithIds(examChoose);}else{("考生选择了相同答案,不做修改操作");}}else{response.getWriter().print("f");}response.getWriter().print("t");}考试历史如下图为学生登录后在考试历史中查看到的与自己相关的所有考试历史信息,并且能够查询相应的考试结果及答案信息。系统测试测试目的及意义系统测试的目的是模拟现实中系统在运行工作的条件下与预先的需求做对比,检查软件系统的工作环境是否正确,发现软件系统中与需求矛盾的地方,不仅如此,系统测试还能检验系统的健壮性和合理性,通过系统的运行状况和测试结果检验系统的漏洞和缺陷以完善系统。系统测试接口测试接口测试是测试系统接口组件的一种方式且成本相对较低,通常通过接口返回的数据来检查数据的交互是否符合预期结果,以此来检验接口的数据传递性是否正确,这样能提前发现代码逻辑上的一些问题,以提高系统的质量,设计接口测试用例的出发点是要验证接口实现的功能与性能指标与接口设计文档的一致性,同时测试接口具有良好的容错机制,能在接收到各种异常输入数据时做到:返回对错误定位具有良好参考意义的错误码,屏蔽底层错误信息,同时接口测试用例需要暴露接口代码更多的代码缺陷,以这个出发点为导向。(1)测试工具:postman(2)测试设计:对于返回的是数据的请求接口,将访问地址进行梳理,然后对接参数进行模拟请求发送,查看预期结果和测试结果是否相同。(3)测试用例:表6-1教师账号信息验证用例测试功能对教师账号信息进行验证测试目的检测教师信息验证返回的数据是否正确编号用例数据预测结果实际结果测试状态1URL:http://localhost:8080/OnlineExamSSM/validateTeacher11与预期结果一致2URL:http://localhost:8080/OnlineExamSSM/validateTeacher11与预期结果一致3URL:http://localhost:8080/OnlineExamSSM/validateTeacher123456123456与预期结果一致4URL:http://localhost:8080/OnlineExamSSM/validateTeacher123123与预期结果一致表6-2试题删除验证用例测试功能对试题进行删除测试测试目的检测在模拟请求的情况下查看能否删除指定的试题编号用例数据预测结果实际结果测试状态1URL:http://localhost:8080/OnlineExamSSM/delSubjecttt与预期结果一致2URL:http://localhost:8080/OnlineExamSSM/delSubject返回400请求错误网页400请求错误网页与预期结果一致3URL:http://localhost:8080/OnlineExamSSM/delSubjectff与预期结果一致4URL:http://localhost:8080/OnlineExamSSM/delSubject返回400请求错误网页400请求错误网页与预期结果一致表6-3试卷查询用例测试功能对试卷进行条件查询测试目的检测在模拟请求的情况下能否返回正确的试卷信息编号用例数据预测结果实际结果测试状态1URL:http://localhost:8080/OnlineExamSSM/getESM返回id为21的试卷信息Id=21的试卷信息与预期结果一致2URL:http://localhost:8080/OnlineExamSSM/delSubject返回课程名为Java的试卷信息courseName=Java的试卷信息与预期结果一致表6-4班级信息获取用例测试功能获取指定年级下的班级信息测试目的检测在模拟请求的情况下查看能否返回正确的班级信息编号用例数据预测结果实际结果测试状态1URL:http://localhost:8080/OnlineExamSSM//gradeclass/gradeId返回班级对象的集合返回班级对象的集合与预期结果一致表6-5移除试卷中的某个试题用例测试功能移除试卷中的某个试题测试目的检测在模拟请求的情况下移除某个试题,查看能否返回正确的结果信息编号用例数据预测结果实际结果测试状态1URL:http://localhost:8080/OnlineExamSSM/removeSubjectFromPapertt与预期结果一致2URL:http://localhost:8080/OnlineExamSSM/removeSubjectFromPaperff与预期结果一致表6-6添加某个试题到试卷中用例测试功能向试卷中添加指定试题测试目的检测在模拟请求的情况下查看能否添加成功并返回正确结果信息编号用例数据预测结果实际结果测试状态1URL:http://localhost:8080/OnlineExamSSM/getChooseSubIdtt与预期结果一致2URL:http://localhost:8080/OnlineExamSSM/getChooseSubIdff与预期结果一致(4)问题报告:以上用例对于可返回数据的接口进行了简单测试,对于出现的可能情况进行了测试,在预期结果和实际结果的对比中未出现太大的差异,说明接口实现正确获取数据。单元测试单元测试(unittesting),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。(1)测试工具:eclipse引入Junit-4.9.jar包支持(2)测试设计:使用Test注解创建单元测试方式对数据库进行访问,查看是否能够进行读写操作(3)测试用例:表6-7用例1测试模块年级管理模块测试目的检查年级信息模块的功能正确性测试功能预测结果实际结果测试状态添加年级信息创建对象封装信息调用服务方法,返回数据库影响行数1数据库影响行数=1成功年级信息修改创建对象封装信息调用服务方法,返回数据库影响行数1数据库影响行数=1成功年级信息删除创建对象封装信息调用服务方法,返回数据库影响行数1数据库影响行数=1成功年级信息查询直接查询和条件查询,返回的为GradeInfo集合返回为List<GradeInfo>成功表6-8用例2测试模块班级管理模块测试目的检查班级信息模块的功能正确性测试功能预测结果实际结果测试状态添加班级信息创建对象封装信息调用服务方法,返回数据库影响行数1数据库影响行数=1成功班级信息修改创建对象封装信息调用服务方法,返回数据库影响行数1数据库影响行数=1成功班级信息删除创建对象封装信息调用服务方法,返回数据库影响行数1数据库影响行数=1成功班级信息查询直接查询和条件查询,返回的为ClassInfo集合返回为List<ClassInfo>成功表6-9用例3测试模块教师管理模块测试目的检查教师信息模块的功能正确性测试功能预测结果实际结果测试状态添加教师信息创建对象封装信息调用服务方法,返回数据库影响行数1数据库影响行数=1成功教师信息修改创建对象封装信息调用服务方法,返回数据库影响行数1数据库影响行数=1成功教师信息删除创建对象封装信息调用服务方法,返回数据库影响行数1数据库影响行数=1成功教师信息查询直接查询和条件查询,返回的为TeacherInfo集合返回为List<TeacherInfo>成功表6-10用例4测试模块学生管理模块测试目的检查学生信息模块的功能正确性测试功能预测结果实际结果测试状态添加学生信息创建对象封装信息调用服务方法,返回数据库影响行数1数据库影响行数=1成功学生信息修改创建对象封装信息调用服务方法,返回数据库影响行数1数据库影响行数=1成功学生信息删除创建对象封装信息调用服务方法,返回数据库影响行数1数据库影响行数=1成功学生信息查询直接查询和条件查询,返回的为StudentInfo集合返回为List<StudentInfo>成功表6-11用例5测试模块试卷管理模块测试目的检查试卷信息模块的功能正确性测试功能预测结果实际结果测试状态添加试卷信息创建对象封装信息调用服务方法,返回数据库影响行数1数据库影响行数=1成功试卷信息修改创建对象封装信息调用服务方法,返回数据库影响行数1数据库影响行数=1成功试
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026四川成都市新津区外国语实验小学校面向社会招聘教师18人备考题库附答案详解(轻巧夺冠)
- 2026福州鼓楼攀登信息科技有限公司招聘1人备考题库附答案详解(能力提升)
- 2026春季江西铜业集团建设有限公司校园招聘7人备考题库及参考答案详解(精练)
- 2026广东中山市绩东二社区见习生招聘备考题库带答案详解ab卷
- 脑卒中的康复训练
- 2026中兵节能环保集团有限公司招聘4人备考题库及参考答案详解ab卷
- 2026福建福州三中晋安校区招聘编外英语教师2人备考题库带答案详解(突破训练)
- 2026河北邢台学院高层次人才引进55人备考题库及答案详解(全优)
- 2026山西经济管理干部学院(山西经贸职业学院)招聘博士研究生5人备考题库及答案详解【新】
- 弘扬宪法精神争做守法小公民
- 2023年新高考河北卷政治高考真题解析(参考版)
- 《中国铁路总公司铁路建设项目档案管理办法》(铁总档史〔2018〕29号)
- 部编人教版四年级下册小学数学全册课时练(一课一练)
- 社区零星维修工程投标方案(技术标)
- 碳捕集、利用与封存技术
- 培训膜片ecs700系统概述新
- 【新高教版中职数学基础模块下册PPT】7.2旋转体
- 抑郁病诊断证明书
- 全国优质课一等奖小学四年级道德与法治下册《学会合理消费》(精品课件)
- 核磁共振上册氢谱
- GB/T 32299-2015航天项目风险管理
评论
0/150
提交评论