![[软件管理系统类精品]基于面向对象的在线考试系统_第1页](http://file2.renrendoc.com/fileroot_temp3/2021-7/6/ba0ff5d8-1dc8-4716-a021-39a438c31d03/ba0ff5d8-1dc8-4716-a021-39a438c31d031.gif)
![[软件管理系统类精品]基于面向对象的在线考试系统_第2页](http://file2.renrendoc.com/fileroot_temp3/2021-7/6/ba0ff5d8-1dc8-4716-a021-39a438c31d03/ba0ff5d8-1dc8-4716-a021-39a438c31d032.gif)
![[软件管理系统类精品]基于面向对象的在线考试系统_第3页](http://file2.renrendoc.com/fileroot_temp3/2021-7/6/ba0ff5d8-1dc8-4716-a021-39a438c31d03/ba0ff5d8-1dc8-4716-a021-39a438c31d033.gif)
![[软件管理系统类精品]基于面向对象的在线考试系统_第4页](http://file2.renrendoc.com/fileroot_temp3/2021-7/6/ba0ff5d8-1dc8-4716-a021-39a438c31d03/ba0ff5d8-1dc8-4716-a021-39a438c31d034.gif)
![[软件管理系统类精品]基于面向对象的在线考试系统_第5页](http://file2.renrendoc.com/fileroot_temp3/2021-7/6/ba0ff5d8-1dc8-4716-a021-39a438c31d03/ba0ff5d8-1dc8-4716-a021-39a438c31d035.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于面向对象的在线考试系统 i 摘要 目前大多数在线考试系统都是采用结构化的分析和设计实现的,这样不免 在代码的复用性和可读性方面有不足,而且全部的功能都是在服务器端实现的, 在性能和用户体验方面也有欠缺。本系统采用了面向对象的分析和设计,整体 上采用了三层架构的设计方式,并结合了 ajax 技术在客户端实现部分逻辑,使 用了 nhibernate 作为数据访问层,大大改善了代码的重用性和可读性并改善了 用户体验和系统性能,而且简化了系统的开发。本系统实现了试题管理、根据 知识点制定出题策略、根据出题策略随机抽题、考试计时、自动交卷、客观题 自动阅卷、在线阅卷、查看分数等功能。 关键字:三层架
2、构;面向对象;nhibernate;ajax;xslt 洛阳师范学院 2008 届本科生毕业设计 ii abstract recently, most of examination systems are implemented with structural style design and analyse which is unavoidable to cause lack in codes reusability and readability. and their functions are implemented in server side. so they are also la
3、ck in the users experience and performance. this system applied object-oriented analysis and design, and applied three layer architecture on the whole, and combines ajax to realize some logic in the client side, and use nhibernate as data access layer. all above improves the codes reusability and re
4、adability, the users experience and the performance of system. also simplified the development of system. this system implemented question manage, making selecting strategy according knowledge, randomly selecting question according to selecting strategy, examination timing, automatic submitting pape
5、r, auto scoring for objective question, score online, check score and other functions. keywords:three layer architecture;oo;nhibernate;ajax;xslt 基于面向对象的在线考试系统 iii 目 录 第 1 章 绪论.1 1.1 系统的研究目的和意义 .1 1.2 系统的开发背景 .1 1.2.1 开发工具和平台介绍.1 1.2.2 nhibernate 介绍.1 1.2.3 xml,xslt 生成 xhtml 介绍 .2 1.2.4 a 和 jquery .2
6、 第 2 章 需求分析.3 2.1 需求说明 .3 2.2 用例说明 .3 2.3 用例图 .4 第 3 章 系统的总体设计.5 3.1 系统的业务流程 .5 3.2 系统的分层设计 .5 3.3 系统的包的设计 .6 3.4 各层之间的依赖关系 .9 3.5 抽象工厂和反射实现对数据访问层的依赖注入 .10 3.6 各层之间的交互 .10 3.7 系统的领域模型 .11 3.8 系统的数据库设计 .13 第 4 章 在线考试系统详细设计和实现.14 4.1 信息管理的设计和实现 .14 4.2 用户登陆和安全验证 .20 4.3 试题库的设计和实现 .25 4.4 试卷的设计和实现 .30
7、4.5 出题策略的设计和实现 .35 4.6 考试的设计和实现 .39 4.7 学生在线考试表示层的设计和实现 .43 4.8 改卷的设计和实现 .49 4.9 用户界面的设计和实现 .54 4.9.1 div+css 布局.54 洛阳师范学院 2008 届本科生毕业设计 iv 4.9.2 可编辑的树形控件 .56 第 5 章 总结.61 参考文献.61 致谢.61 基于面向对象的在线考试系统 1 第 1 章 绪论 1.1 系统的研究目的和意义 随着标准化考试的日益普及,在各种考试中越来越多地采用了计算机考试 的方式。相对于传统的卷面考试而言,由于传统的卷面考试从出题印刷到下发 试卷等环节需要
8、较长的时间,接触的人员相对较多,因而在保密方面具有一定 的困难。而计算机考试系统采用试题库方式提供试题来源,考前无任何成套试 卷,考试时考卷由计算机现场随机生成,各考生试卷不完全相同,从而避免了 互相参看等作弊现象或不公平成绩的出现。 目前国内在线考试系统多数都是基于 asp、jsp 等服务器端技术实现的。这 就不免在保存答案时候要刷新考试页面和重新生成试卷。这种方式的考试系统 使用起来给用户的体验非常的糟糕,而且效率不高。另外大多数的考试系统都 是结构化的方式分析设计的。结构化的代码组织方式在代码复用和代码可维护 性方面显然不如面向对象的方式。所以本系统在考试模块的实现上利用了 ajax 方
9、式来保存答案。并在系统分析和设计上采用了面向对象的方式。 1.2 系统的开发背景 1.2.1 开发工具和平台介绍 本系统采用了基于.net 平台的 a 2.0 框架。使用到了 a 和 jquery 作为 javascript 类库。使用了基于 xml 和 xslt 的转换视图来显示 html 考 试页面。使用了 nhibernate 作为数据访问层框架。开发工具主要是 visual studio 2005。使用了 visual source safe 2005 作为源代码和版本控制工具。数据 库使用的是 sql server 2005 express。单元测试工具使用的是 nunit。 1.2
10、.2 nhibernate 介绍 在企业应用开发中使用面向对象和关系数据库可能是一件非常笨重耗时 的事情。nhibernate 是一个针对.net 平台的对象关系映射工具。nhibernate 不 仅可以映射.net 类到数据库表中。也提供了灵活的数据查询取回的功能。与 使用 sql 和 手工处理数据相比,有了 nhibernate 可以大大的减少开发 时间。本系统的使用 nhibernate 做为数据访问层的框架,而不是直接使用 ado.net。有 nhibernate 只需要编写映射文件。当使用 nhibernate 来做数据 操作的时候 nhibernate 会自动生成 sql 语句来操
11、作数据库的内容。映射文件会 洛阳师范学院 2008 届本科生毕业设计 2 告诉 nhibernate 将类保存到那个表,将那个属性保存到那个字段中。 nhibernate 处理了所有的数据持久化工作。我们就可以专注于对象的业务逻 辑。这正是面向方面编程(aop)所提倡的把系统的职责(方面)划分到不 同的模块中。nhibernate 就是封装了数据持久化的这方面的任务。这样在编 写核心的业务逻辑类的时候就不用关心持久化的任务了。这让代码更加的清 晰容易理解。也容易修改。 1.2.3 xml,xslt 生成 xhtml 介绍 在表示层的经典架构 mvc 中 ,强调 model(模型)、view(视
12、图) 、 controller(控制器)三个角色的分离。这一框架已经得到了 a 的默认的 支持。其中 aspx 文件就是 view,aspx.cs 就是 controller ,领域类则是 model。 按照 martin flower 的定义 aspx 算是模板视图,aspx.cs 则是页面控制器。在开 始设计试卷显示问题的时候,开始考虑的也是使用 a 控件来生成试卷。 但是试验发现由于多个试卷对象间嵌套比较复杂,将试卷绑定到控件上代码比 较复杂和混乱。于是采用了另一种视图。转换视图。就是将试卷对象表示成 xml,然后用 xslt 将 xml 转换成 xhtml 再呈现给浏览器。这种视图使用
13、起来 比较直观。试卷对象先用 xml 表示。然后通过 xslt 换成 xhtml 表示。这种方 法还可以将试卷格式化成其它不同的表示,只要有不同的 xslt 转换就行了。 1.2.4 a 和 jquery ajax 是一种的改善 web 应用程序用户体验的技术。就是在浏览器中能够向 后台向服务器发出异步请求,并根据返回内容不刷新页面而更新页面的技术。 它是几个老技术的综合应用。包括 javascript、xml、xmlhttprequest 对象、 dom 和 css。javascript 则是将这几种技术粘合在一起的胶水。但是浏览器之 间对 javascript、dom、css 的支持不一致
14、。给 ajax 编程带来了很大的难度。 a 和 jquery 正是一个提供了跨浏览器的 javascript 库。它们对 ajax 的支 持都差不多。但是 a 由于是微软自己的产品,所以它可以很好的和服务 器端的技术集成。比如 a 提供了客户端访问 web 服务的内置支持。 jquery 则是一个非常流行的 javascript 库。它提供了非常简练操作 dom 的功能。 提供了非常方便获取 dom 节点引用的选择器。选择器类似 css 中的选择器。 链式表达式的应用也让代码更加简洁优雅。所以在系统中同时使用了这两个库。 a 主要用于和服务器端的通信。jquery 用来操作修改界面。相互取长补
15、短。 1.3 可行性分析 本系统属于数据信息管理系统类。用户对功能上的要求不是很复杂。加上 有这么强大工具可框架支持。所以本系统十分可行。 基于面向对象的在线考试系统 3 第 2 章 需求分析 2.1 需求说明 本系统统是一个基于 bs 结构的考试系统,它用来给学校提供无纸化考试的 平台,利用本系统管理员可以管理建设各个科目的试题库,并通过章节难度来 组织试题。教师可以根据题库来指定考试策略。然后根据考试策略随机的生成 试卷供学生考试。试卷的题型可以包括单选题,多选题,判断题,填空题,简 答题 5 中基本题型。也可以是这五种题的组合题型。 学生参加考试应包括基本的考场规则,比如,迟到多少分钟不
16、能进入考场, 不能提前交卷。每次考试可以允许多个班级参加,不属于参加班级的学生不能 参加考试。每次考试指定一个考试策略,并根据考试策略为参加考试的学生生 成试卷。考试时间到后不再允许交卷。考试结束后老师可以在线的批改试卷。 客观题允许自动阅卷。学生可以在线查看自己的考试成绩! 2.2 用例说明 1. 管理班级:管理员登陆后可以添加,删除班级。考试将要指定允许参加的班 级,只要属于参加班级的学生才能参加考试。班级信息包括班级名称等信息。 2. 管理教师信息:管理员登陆后可以添加修改教师信息。教师信息包括登陆名, 密码等信息。将作为教师登陆验证的依据。 3. 管理学生:管理员登陆后可以给班级添加学
17、生信息,学生信息包括学号,姓 名,密码等信息。密码初始为学号。学生登陆后可以修改自己信息。 4. 管理题库:教师登陆后可以添加,修改,删除科目、章节、题目等信息。其 中科目可以包括若干章节。科目章节是用来组织题库的。章节可以包括多个 试题。试题有难度,内容,答案等信息。 5. 制定出题策略:教师登陆后可以添加,删除,修改考试策略、考试题型、策 略项等信息。考试策略包括若干考试题型,考试题型包括多个策略项。策略 项包括题目出题范围和分值,出题数等信息用来从指定题中随机抽取一定的 题目。 6. 建立考试:教师登陆后可以建立一次考试,考试信息包括考试的名称,开始 时间,结束时间,参加班级,迟到时间,
18、交卷时间,和一个考试策略等信息, 在线考试时候将根据考试信息模拟真实的考场规则。 7. 该卷子:教师登陆后选择学生的考卷,根据学生输入的答案和标准答案给学 生的每个题打分。系统允许自动给客观题打分和合计总分。 洛阳师范学院 2008 届本科生毕业设计 4 8. 参加考试:学生登陆后选择参加的考试。考试根据考试规则判断是否允许学 生参加。如果允许将根据指定的考试策略为学生随机生成试卷。学生考试时 候可以随时保存自己的试卷。如何学生掉线重新登陆参加考试可以从上次保 存后的试卷状态继续答卷。学生做完试卷可以交卷。如果交卷时间不到不允 许交卷。如果考试结束也不允许交卷。 9. 查看分数:学生输入学号和
19、密码选择查看分数,系统显示所有学生所有考试 的成绩单。 10. 修改密码:所有用户登陆后都可以修改自己的登陆密码。 2.3 用例图 图图 2-12-1 系统用例图系统用例图 基于面向对象的在线考试系统 5 第 3 章 系统的总体设计 3.1 系统的业务流程 根据用户需求,本系统业务流程的设计如图 3-1。 图图 3-13-1 系统业务流程图系统业务流程图 3.2 系统的分层设计 在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。 微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻 辑层、表示层。本系统也采用了这种分层的方式。下图 3-2 为本系统分层架构 图。
20、登陆 管理员页面 教师页面 管理管理员 管理学生 管理教师 管理班级 添加考试 制定出题策 略 管理题库 管理科目 学生页面 批改试卷 页面 参加考试 修改密码 查看成绩 单 洛阳师范学院 2008 届本科生毕业设计 6 图图 3-23-2 系统架构图系统架构图 数据访问层:主要负责数据库的访问。简单的说就是实现对数据表的 select,insert,update, delete 的操作。在线考试考试系统的数据访问层中使 用了 nhbiernate 作为 or 映射工具。 业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关。在 线考试的业务逻辑主要是关于考试规则的逻辑。比如考试迟到不
21、能参加考试、 不能提前交卷等。如果涉及到数据库的访问,则调用数据访问层。 表示层:是系统的 ui 部分,负责使用者与整个系统的交互。在这一层中, 理想的状态是不应包括系统的业务逻辑。表示层中的逻辑代码,仅与界面元素 有关。在线考试中,是利用 a 来设计的,因此包含了许多 web 控件和相 关逻辑。 3.33.3 系统的包的设计系统的包的设计 包在.net 中对应的术语是命名空间。在线考试系统划分了三个大的命名空 间,分别是 web(包括表示层的内容) 、bll(包括业务逻辑层的内容)和 dal 包括了数据访问层的内容。其中 bll 包括了 5 个子命名空间,分别是 domain、 datain
22、terface、service、utils 和 exception。系统还使用了其他的外 部类库,包括 a,jquery,nhibernate,log4net 等。图 3-3 是系统包图,展示 了包之间的依赖关系。另外两个是工具类和自定义异常包,由于与核心设计关 系不大图上没有说明。 基于面向对象的在线考试系统 7 图图 3-33-3 系统包图系统包图 下图 3-4 是 vs 解决方案中对应的项目组成。其中一个项目是个程序集。 test 是个单元测试项目。 图图 3-43-4 解决方案图解决方案图 domain 包含了所有的领域类和映射文件,比如 student、question 等。大 洛阳
23、师范学院 2008 届本科生毕业设计 8 部分为数据类,没有什么行为。如图 3-5 所示 图图 3-53-5 领域包的文件组织图领域包的文件组织图 datainterface 包含了数据访问层的接口 idao、idaofactiory 工厂接口和 daomanage。daomanage 是用来注入具体 dao 工厂的简单工厂类,该类同时是 访问 dao 对象的门面类。如图 3-6 图图 3-63-6 datainterfacedatainterface 包的文件组织图包的文件组织图 service 包含的是对一个对业务层的简单封装的外观类,service 类本身没 有任何业务逻辑。它总是将数据
24、访问的职责委托给 dao 对象。将业务逻辑委托 给 domain 对象。如图 3-7。 基于面向对象的在线考试系统 9 图图 3-73-7 serviceservice 包的文件组织图包的文件组织图 dal 包含了具体的数据 dao 实现类和使用到的几个 nhiernate 帮助类。该 包的 dao 对象利用 nhibernate 实现了 examinationsystem.bll.datainterface 中 定义的数据访问接口和 dao 工厂接口.如图 3-8 所示。 图图 3-83-8 daldal 包文件组织图包文件组织图 web 包含了表示层用到的 web 页面和 js 脚本、we
25、bservice、css、xslt 等 内容。还有一些 ui 相关类和 httpmodule 类。nhibernatesessionmodule 用来实 现 open session in view。securitymodule 用来实现安全检查。 3.4 各层之间的依赖关系 由于 bll 层是整个系统的核心部分,所以表示层和数据访问层都应该依赖 与 bll 层。就是说要实现数据访问层对业务层的依赖倒置,这需要使用分离接 口来实现。如图 3-9 所示,左图为业务层依赖数据访问层。右图为分离接口后 倒置的依赖关系。 图图 3-93-9 各层依赖图各层依赖图 洛阳师范学院 2008 届本科生毕业设
26、计 10 业务层和表示层的关系和以前的一样这里就不多介绍了。 3.53.5 抽象工厂和反射实现对数据访问层的依赖注入抽象工厂和反射实现对数据访问层的依赖注入 业务逻辑层是不依赖数据访问层的,但是业务层还得使用数据访问层来操 作数据。既要使用又不能依赖,这就引出了抽象工厂模式。因为不能 new 关键 字来创建数据访问层的具体 dao 对象,所以我们只能从工厂里获得 dao 对象, 然后通过 idao 接口来使用数据访问层的 dao 对象。 下面给出具体的类图来说 明.如图 3-10 所示 图图 3-103-10 抽象工厂类图抽象工厂类图 为了简单,该图的 idao 接口只有一个数据操作方法 ge
27、tbyid 当然还可以有 save,update,delete 等方法。idaofactory 里也只有一个工厂方法 getdao 具体实 践时候应该是每一个领域类都有一个 dao 对象与之对应。比如 istudentdao、iteacherdao 等。而 idaofactory 应该对应的工厂方法可能有 getstudentdao、getteacherdao 等等。可以看到各个类的依赖关系不存在从业 务层到数据层的依赖。当我们想要获得一个具体 dao 对象时候,我们先从 daomangager 那里通过反射获得具体 daofactory 的实例。这样我们就可以通过 daofactory 来获
28、得具体的 dao 对象了。将依赖关系倒置后我们就可以动态的切 换数据访问层。因为我们的业务层不依赖与具体的数据访问层,而是依赖与数 据访问层接口。 基于面向对象的在线考试系统 11 3.63.6 各层之间的交互各层之间的交互 上面介绍了各层之间的静态关系,下面介绍各层之间是如何动态交互的。 用一个实例来说明,比如要显示一个领域对象信息。如图 3-11 所示。 图图 3-113-11 各层交互顺序图各层交互顺序图 从图上可以看出消息是如何在各层之间传递的首先从显示信息的。 showdomainpage 发送请求给 domainservice 服务对象,请求获得 id 号为 1 的 domain
29、对象。domainservice 从 daomangager 那里获取具体 daofactory 对象。 daomanager 是根据配置文件动态的加载数据访问层程序集,然后利用反射创建 daofacotry 对象的。有了 daofactory,domainservice 对象再从 daofactory 的工厂 方法里获得自己需要的 dao 对象。最后通过 dao 对象得到最终需要的 id=1 的 domain 对象。并返回给 page 对象。page 对象最后在将 domain 对象的内容绑 定到页面上显示给用户。这里只是简单的展示了请求是如何在各层之间传递的。 当然实际的请求可能更加的复杂
30、。关于如何删除,添加,修改等操作和显示操 作的交互方式是类似的这里就不多介绍了。 3.7 系统的领域模型 上面介绍了系统各层之间的静态和动态的关系。下面介绍下和领域相关的 一些内容。主要就是在线考试系统的领域概念。下图 3-12 是在线考试系统的领 域模型。 洛阳师范学院 2008 届本科生毕业设计 12 图图 3-123-12 领域模型图领域模型图 下面对各个领域概念一一说明下面对各个领域概念一一说明 1subject 代表科目。 2chapter 代表章节或者知识点。 3questioncontent 代表了题库中的一道题。 4tiankongcontent,danxuancontent
31、是 questioncontent 的子类分别代表填 空题,单选题等。 5question 代表的是学生考卷上的题。注意是和 questioncontent 是有区 别的。question 包含学生答案和分值,questioncontent 只是包含一道题的基本 信息。question 会引用 questioncontent 这样可以减小数据冗余。 6questioncontainer 代表的是一个大题它可以包含多个 question。比如单 选题。 7paper 表示一张试卷。试卷可以包含多个 questioncontainer。 8student 表示学生。 9class 表示班级。 10
32、examination 表示一次考试。每次考试对应一个考试策略(paperstrategy)。 12paperstrategy 是一个用来随机生成试卷的模板。 13strategycontainer 是用来随机生成大题(questioncontainer)的模板。 14strategyitem 策略项:策略项包括一个试题的集合。出题的题数(题数 必需小于等于试题集合的数量) ,分值。用来随机的从试题集合中抽取若干试题 并给试题附上指定分值!每个 strategycontainer 都包含多个策略项。不同的策 基于面向对象的在线考试系统 13 略项区分同一题型,不同分值的题目。 上面的领域模型中
33、没有提到 admin, 和 teacher 类。因为这两个领域类与 核心模型关系不大为了简洁没有将这两个列出。 3.8 系统的数据库设计 数据库的设计和领域模型基本上一一对象。即一个领域类对应一个表。但 是处于同一继承结构的领域类只有一个表与之对应。这种方法虽然浪费了些数 据库存储空间但是使用起来比较方便。另外多了几个表是用来存储对象之间的 关联的关联表。questioncontent 表存储了 questioncontent 类的所有子类。 student 表则存储了 user 的所有子类。为了方便 student,teacher,admin 都继承 自 user。表 strategyite
34、mquestioncontent,和 examinationclass 则是两个关联表。 下图 3-13 是在线考试系统的 er 图 图图 3-133-13 数据库数据库 erer 图图 洛阳师范学院 2008 届本科生毕业设计 14 第 4 章 在线考试系统详细设计和实现 4.1 信息管理的设计和实现 对领域类的添加、删除、修改是每个系统的主要任务。下面介绍系统是如 何在实现这些操作,以及如何利用泛型来减少重复代码。根据前面说到的业务 层和数据访问层的关系。要添加,删除,修改信息,必需先在业务层定义业务 层用到的数据访问层接口。比如要操作student、teacher对象,应该在业务层定 义
35、两个dao接口。istudentdao、iteacherdao.下图4-1说明了这两个dao接口的部 分持久化操作的方法。 图图 4-14-1 istudentdao,iteacherdaoistudentdao,iteacherdao 类图类图 我们发现这些dao接口都有类似的方法。只是参数和返回值不一样。如果 要定义所有领域类的dao接口。不得不到处的粘贴复制然后在修改每个方法的 参数。为了减少代码的重复我们要充分利用.net 2.0的泛型机制。利用泛型我们 首先定义一个泛型的接口。参数和返回值都现用泛型参数。然后在让具体的 dao接口继承泛型接口并给出类型参数就可以了。下图4-2是泛型接
36、口的定义。 图图 4-24-2 idaoidao 泛型接口类图泛型接口类图 基于面向对象的在线考试系统 15 这样我们就不用到处粘贴修改dao接口代码了。所有的具体dao接口只要继 承泛型的idao并给出类型就自动有了基本的持久化操作方法定义。定义完业务 层所需要的接口。接下来要在数据访问层实现这些接口。下面给出studentdao 和teacherdao的代码。其中用两个持久化方法的代码来说明数据访问层是如何 利用nhibernate来实现对student、teacher的持久化操作的。 1.studentdao namespace examinationsystem.dal public
37、class studentdao:istudentdao private static isessionfactory sessionfactory = new configuration().configure().buildsessionfactory(); public student getbyid(long id) isession session = sessionfactory.opensession(); return session.get(id); session.close(); public void save(student student) isession ses
38、sion = sessionfactory.opensession(); itransaction transation = session.begintransaction(); session.save(student); transation.commit(); session.close(); 2.teacherdao namespace examinationsystem.dal public class teacherdao:istudentdao private static isessionfactory sessionfactory = 洛阳师范学院 2008 届本科生毕业设
39、计 16 new configuration().configure().buildsessionfactory(); public teacher getbyid(long id) isession session = sessionfactory.opensession(); return session.get(id); session.close(); public void save(teacher teacher) isession session = sessionfactory.opensession(); itransaction transation = session.b
40、egintransaction(); session.save(teacher); transation.commit(); session.close(); 以上两个dao实现方法只是为了简单的说明不是真实代码。我们发现两个 dao的具体实现也是如此的相似以至于很轻易就想到粘贴复制就可以写其他的 dao实现代码。但是一旦我们到处粘贴复制我们的代码时候我们就应该意识到 我们应该来抽象。用抽象来消除重复。这里依然用泛型来解决问题。先定义一 个抽象类来实现上面提到的泛型接口。并在抽象类中给出泛型版的dao实现。 最后具体的dao继承抽象的dao实现类并继承具体的dao接口就可以自动实现所 有的数据
41、库操作了。下面分别用类图4-3和代码来说明是如何来实现的。 图图 4-34-3 数据库接口类图数据库接口类图 基于面向对象的在线考试系统 17 下面是abstractdao类实现。 namespace examinationsystem.dal public abstract class abstractdao:idao private static isessionfactory sessionfactory = new configuration().configure().buildsessionfactory(); public t getbyid(long id) isession
42、session = sessionfactory.opensession(); return session.get(id); session.close(); public void save(t obj) isession session = sessionfactory.opensession(); itransaction transation = session.begintransaction(); session.save(obj); transation.commit(); session.close(); 下面是更改后的 studentdao 和 teacherdao pub
43、lic class studentdao : abstractdao, istudentdao public class teacherdao : abstractdao, iteacherdao 这样数据访问层常见的逻辑全部都可以由 abstractdao 一个类来实现。这样大大 简化了测试和开发速度。 下面简要的说明系统的 80%逻辑crud。为什么说 80%的逻辑呢?我们 知道对于一个信息系统来说最多的操作就是对系统信息的添加,删除,修改, 和查找。为了避免重复的介绍系统这方面的功能。我们这里就用学生用户信息 的添加,删除,修改,查找来概括说明系统中其他的信息的 crud。系统中每 一个
44、领域类都有一个 dao 对象。和一个 service 对象。领域类负责业务逻辑。 dao 对象的职责就是对领域类对象的数据库操作。而 service 对象则是对业务层 洛阳师范学院 2008 届本科生毕业设计 18 的封装。三者之间的关系如下图 4-4 所示。 图图 4-44-4 各层主要类的类图各层主要类的类图 为什么要多出来一个 service 那?因为 domain 是系统最核心的东西。是业 务逻辑的所在。所以 domain 不应该依赖与其他的系统对象。但是有时候调用 过 domain 的业务逻辑后希望信息能够更新到数据库,所以必需要使用 dao 来 保存 domain,但是 domai
45、n 不能依赖 dao 所以就有了 service。我们可以在 service 里包含与 domain 相同的业务逻辑方法。然后将真正的业务逻辑委托给 domain。最后 service 再调用 dao 来更新数据库。又因为我们不想让表示层的 ui 直接依赖我们的数据访问层。service 的另一个作用就是包装 dao 的方法。 总之 service 是业务层的外观类。它自己没有任何实现。它将业务逻辑委托给 domain,将数据操作委托给 dao.并协调所有的操作。下面是伪码说明 1、domain public class domain public void dosomething() /执行
46、业务逻辑 2、dao public class dao:idao 基于面向对象的在线考试系统 19 public void update(domain obj) /更新 domain 对象到数据库 public domain getbyid(long id) /查询数据库返回 domain 对象 3、service public class service idao dao=new dao(); public void dosomething(domain obj) obj.dosomething(); dao.update(obj); public domain getbyid(long i
47、d) return dao.getbyid(id); 非常遗憾的事情是系统绝大多数的逻辑就是对 domain 的 crud 操作。因 为大部分 domain 几乎都是数据类没有什么有趣的逻辑。所以本系统的 service 类多数都是简单的对 dao 对象的调用。 下面用伪码说明系统是如何操作 student 对象的。 studentservice service=new studentservice(); /获取指定 id 学生 student student=service.getbyid(id); /获取姓名是 hanjie 的学生 student exmple=new student()
48、; 洛阳师范学院 2008 届本科生毕业设计 20 example.name=”hanjie”; student student=service.getuniquebyexample (example); /获得所有学生 ilist students=service.getall(); /更新学生 service.update(student); /删除学生 service.delete(student); 其他领域对象的操作和 student 类的操作类似。 4.2 用户登陆和安全验证 在线考试系统总共包括三种用户(学生、教师、管理员) 。他们分别有自己 的操作权限。而这些操作分别包含在不同
49、的页面中。为了简单的划分。系统将 三种用户的操作页面分别放到了不同的路径下。下图 4-5 是三个用户各自的文 件夹内容。 图图 4-54-5 不同用户的文件组织类图不同用户的文件组织类图 因为每个用户都不能访问其他用户的页面。所以我们除了要检查用户的登 陆还要检查用户的权限,看是否允许用户访问特定的页面。首先介绍下用户登 陆的设计和实现。下图 4-6 是用户登陆和权限管理涉及的领域类 基于面向对象的在线考试系统 21 图图 4-64-6 用户管理模块类图用户管理模块类图 因为验证用户的职责和领域类无关,所以我们将用户验证的职责分配给了 userservice对象。userservice对象除了
50、具有crud用户领域类的操作外。还有一 个checklogin的方法。该方法根据用户的输入的登录名和密码。判断是否为合 法用户。如果合法将返回该用户的一个对象,否则返回空。下面是checklogin 方法的实现。 namespace examinationsystem.bll.service public class userservice:abstractservice public user checklogin(string loginname, string password) /从数据库获取相同登陆名对象 user example = new user(); example.logi
51、nname = loginname; user user = dao.getuniquebyexample(example); if (user.password = password) return user;/密码正确返回该用户 return null;/否则返回空 上面代码展示的是真实的代码实现。我们可以看到用面向对象的方式编写代 码代码的易读性得到大大的提高。userservice类从泛型的抽象类abstractservice 继承了基本的crud操作。下面看看该方法由于继承带来的通用性。由于 student、teacher、admin都继承自user所以我们的登陆方法可以适用于所以的
52、 洛阳师范学院 2008 届本科生毕业设计 22 用户。所以我们只需要有一个用户登陆页面就可以了. 下面是登陆页面的登陆按钮的事件处理函数的实现。 protected void loginbutton_click(object sender, eventargs e) userservice service = new userservice(); user user = service.checklogin(loginnametextbox.text, passwordtextbox.text); if (user is student) sessionuser = user; respon
53、se.redirect(student/default.aspx); if (user is teacher) sessionuser = user; response.redirect(teacher/subject.aspx); if (user is admin) sessionuser = user; response.redirect(admin/admin.aspx); if (user = null) messagelabel.text = 用户信息不正确!; 调用checklogin后只要判断返回的user具体是那个用户类型。然后跳转到相 应用户的默认页面。之前有个sessio
54、nuser = user;可以看出系统是通过session 来记录用户的身份的。因为session是服务器端的所以它比cookie更加的安全。 由于学生考试时间和教师管理工作需要很长的时间系统将session的超时时间从 默认20分钟调整到了2小时。如果需要可以在web.config文件中继续调整。 有了登陆的实现下面介绍如何实现用户身份检查的。因为每个页面都必须 有特定的身份才能访问。因为用户登陆后已经用session记录了用户的身份。要 基于面向对象的在线考试系统 23 想限制用户对某个页面的访问只要在该页面里取出session里的用户对象看是否 是要求的角色就行了。比如想让添加班级的页面
55、只允许admin来访问。可以在 class.aspx页面的page_load事件处理函数里判断用户权限。下面代码说明了如 何来防止class.aspx被其他用户访问。 protected void page_load(object sender, eventargs e) if (sessionuser != null) user user = (user)sessionuser; if (user is not admin) response.redirect(login.aspx); else response.redirect(login.aspx); 上面伪代码说明如果用户没有登陆则转
56、到登陆页面,如果已经登陆但是身 份不是admin也转到登陆页面。只有登陆且身份是admin才能访问该页面。利用 这种方式可在每个页面做类似的检查就可以实现用户权限管理。 但是,这种方 式的缺点是到处要重复类似的检查。这样管理起来比较的麻烦。而且每个页面 都包含身份检查的代码也让页面理解起了比较麻烦。利用a 框架可以加入 自定义的http请求处理模块。httpmodule是a框架提供给用户在每次http请 求前后插入自定义逻辑的机制。编写的自定义模块必须实现ihttpmodule接口。 然后通过配置web.config文件将自定义模块加入到a的请求管道中。这样 就可以将自定义的行为加入到每个ht
57、tp请求的前后。在自定义的处理模块中可以 根据请求的url集中的为每个http请求做身份检查。下面代码是系统安全检查模 块 namespace examinationsystem.web public class securitymodule : ihttpmodule 洛阳师范学院 2008 届本科生毕业设计 24 public void init(httpapplication context) context.postacquirerequeststate += new eventhandler(checkuser); private void checkuser(object send
58、er, eventargs e) if (httpcontext.current.request = null | httpcontext.current.session=null) return; httpcontext context = httpcontext.current; if (context.request.url.absolutepath.tolower().contains(/admin/) if (context.request.url.absolutepath.tolower().contains(/teacher/) if (context.request.url.a
59、bsolutepath.tolower().contains(/student/) public void dispose() 我们首先在 init方法中注册postacquirerequeststate处理函数。因为在该事件 中session才可以被访问到。在事件处理函数中我们首先要检查session和request 对象是否存在。如果存在。就继续检查用户请求的页面是否和自己拥有的身份 一致。可以看到是根据请求url中是否包含teacher,student,admin来判断用户请 基于面向对象的在线考试系统 25 求的页面类型的。因为每个用户的可操作页面都在不同的文件夹下。所以检查 用户请求
60、页面类型时候只需要检查请求路径中是否包含特定名称就行了。比如 请求http:/localhost/exam/admin/admin.aspx因为请求中包含”/admin/”所以就可以 知道必须要admin权限参能访问该页面。然后我们检查session中的用户对象是 否是admin类型。如果不是则将请求转到默认的登陆页面。这样就完成了用户 的权限管理。 4.3 试题库的设计和实现 试题管理是整个系统的核心。为了尽量的从逻辑上组织试题和尽量的减少 数据冗余。在线考试系统把领域对象划分地非常细。下图 4-7 说明了试题库相 关领域类的设计 图图 4-74-7 试题库模块类图试题库模块类图 这些领域类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论