ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:314.86KB ,
资源ID:11589000      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11589000.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(题库管理系统设计文档.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

题库管理系统设计文档.docx

1、题库管理系统设计文档(此文档为word格式,下载后您可任意编辑修改!)华南农业大学软件开发技术实践课程设计实验报告小组成员:教 师: 林 毅 申提交日期: 2013年 11月 30日华南农业大学信息学院课程设计实验题目题库管理中心起止日期2013学年第一学期课程名称软件开发技术实践学生资料实验内容 每一位教师都可将自己平日教学中积累的题目添加到题库中,与传统意义的题库不同的是,在这里教师可以将题库中的题目按照各种不同的属性(章节、知识点、考试时间、考试地区、难易度、助记码等)把每一道题目定义,方便教师搜索查阅,从不同的角度判断题目是否对自己的教学有益,运用到教学中是否能有的放矢、因材施教。评语

2、与成绩项目/分数优良中及格不及格系统分析设计程序设计水平内容完成情况设计报告撰写质量课程设计总结情况附加说明:成绩 (优/良/及格/不及格) 指导教师 林毅申 2013 年 12 月1、基本信息1.1 小组基本信息学号姓名手机邮箱所做工作简述签名赖威数据库设计,数据库实体化工作以及数据库面向业务层的接口李志杰客户端界面以及相关数据绑定周加伟业务逻辑层设计与实现,具体功能的算法实现1.2 项目基本信息 这次我们小组开发的是一个面向一所大学内的任课老师以及在校学生的题库管理系统。作为数字化校园的一部分,该系统的主要的功能包括为教师用户提供的查阅题库,新组试卷功能和面向学生的在线考试功能。题库分为两

3、部分,一部分是之前教师利用组卷功能得到并保存的试卷,一部分是不同类型的题目。题目范围为学校内各门课程期末考试的试题,包括公共基础课以及各学院开设的不同课程。题目不仅包括普通的文字类题目,还包括一些包含复杂元素如图片,特殊公式等的题目,做到基本兼容现在学校内能看到的题目。 考虑到小组成员的技术水平以及项目的实际需要,该系统是采用C/S模式。为提高效能,服务器方面采用IOCP模型,客户端采用WPF技术来改善Winform在界面上的劣势。1.3 项目技术信息 开发语言C#平台Windows7技术客户端(WPF), 服务器(IOCP模型)工具Visual Studio 2010 Sql Server

4、20082、系统架构图注:实线表示数据传输方向,虚线表示模块间调用关系,由被调用者指向调用者服务器程序:数据加密模块:采用一种加密算法,(具体哪种算法等系统实现时,再进行确定),将即将发送的数据进行加密。保证数据再传输过程中的安全性。与客户端中的数据加密模块原理一样。数据解密模块:采用与加密算法相对应的解密算法,将接受到数据,进行解密,还原得到原始的数据。与客户端中的数据解密模块原理一样。消息队列:为了能实现同时让尽量多的客户连接到服务器,所以不使用一线程处理一客户模型的服务器。这里的消息队列是将所有用户对服务器的各种请求按照先进先出的规则排列起来。等待处理。如果实现是使用windows io

5、完成端口和对应的SOCKET进行绑定,这个消息队列是由系统生成和维护的。工作者线程池:线程池用于维护和管理服务器中所有以工作者身份存在的线程,工作者线程就是用来处理客户请求的线程。线程池的线程会互斥的到消息队列中取出对应的客户请求进行处理。没有请求时候,所有线程都处于阻塞状态等待消息队列中出现客户请求。当工作者线程获得客户请求的时候会按顺序去调用数据解密模块,数据传输格式解析模块,业务逻辑处理模块,加密发送数据模块。数据传输格式解析模块:数据在网络传输的过程中,我们给它规定特定的格式。通过该模块,服务器可以清楚的知道,客户需要服务器为他实现哪些功能。但是这里解析的数据需要通过解密之后,才能解析

6、。对应的客户端想要与服务器进行交互,就需要使用这个特定的格式发送数据。业务逻辑处理模块: 这个模块就是服务器具体工作的模块,模块中包含服务器能够为客户端提供的所有服务。工作者线程通过解析数据格式,知道客户的需求,再从这个模块中调用指定的服务。这个模块也是直接和数据库进行交互的模块。数据发送加密模块:业务逻辑模块处理完客户的请求的服务之后,需要为客户返回处理后的结果。可能是简单的操作成功和失败的返回结果,也可能是直接数据的传输。和加密模块结合在一起,说明数据发送前需要进行加密。数据库模块:采用sql server做数据库管理,ADO.NET技术实现面向业务层的接口。3、系统功能客户端:学生:在这

7、个题库管理中心中,我们设定的学生功能有查看试卷、导出试卷和在线考试并评分。查看试卷:学生可以查看不同科目的试卷,选择科目时需要先选择科目分类、学院等上级目录,试卷包括历年考试卷和各学科老师自己组合试题的模拟卷。导出试卷:学生查看了试卷之后如果需要带出,可以选择导出试卷,导出的试卷根据学生选择存储位置以WORD文档存储。老师:老师可以使用的功能包括:查看题目、组卷。组卷分为按要求自动组卷和手动组卷两个部分。查看题目:跟学生的一样,首先选择科目分类、学院等目录,选择了科目之后还需要选择章节和知识点、或者选择某一套题(具体的操作在编码时确定),进入单个题目可以看到题目分类、难易度、内容和答案,还可以

8、把该题目加入到组卷区里(类似网络购物加入购物车的形式)。组卷:自动组卷:老师选择科目、难易度,填入试卷总分和考试时间,选择题数目和选择题总分,填空题数目和填空题总分,客观题视科目需要而定,可以选择简答题、计算题、材料分析题等题型,最后各题总分要跟试卷总分相同,全部填写好之后就可以进行自动组卷,组卷成功之后老师看是否满意,不满意可以重来或者可以留下某一些需要的题其他题目随机加入。数据传输:用户进行操作需要读取数据的时候发出命令传给服务器,服务器传过来的数据接受后给用户看。服务器:提取数据:根据客户端传来的命令来进行数据库的读取,读取后给传输模块。数据传输:数据提取出来之后,经过格式化以后再进行加

9、密,之后就可以传输给客户端进行解密并呈现给用户。4、数据库设计PDM图数据字典清单:表名解释QB_ACCOUNTS用户信息表QB_CHAPTERS课程章节表QB_COLLEGES学院信息表QB_COURSES课程信息表QB_ORIGIN题目出处表QB_PAPERS试题信息表QB_POINTS知识点信息表QB_PUBLICKINDS公共课信息表QB_QUESTIONS题目信息表QB_STUDENTS学生信息表QB_TEACHERS教师信息表表名:QB_ACCOUNTS 解释:用户信息表QB_ACCOUNTS(用户信息表)是否主键字段名字段描述数据类型长度可空约束缺省值备注是ACCOUNT_IDA

10、ccount_IdINTN用户idACCOUNT_NAMEAccount_NameNCHAR(10)10N用户的姓名ACCOUNT_ACCOUNTAccount_AccountNCHAR(20)20N用户的登陆账号ACCOUNT_PASSWORDAccount_PasswordNCHAR(20)20N“123456”用户的登陆密码ACCOUNT_KINDAccount_KindBITN用户的类型。0代表教师,1代表学生表名:QB_CHAPTERS 解释:章节信息表QB_CHAPTERS(QB_Chapters)是否主键字段名字段描述数据类型长度可空约束缺省值备注是CHAPTER_IDChapt

11、er_IdINTN章节idCHAPTER_COURSEIDChapter_CourseIdINTN课程信息表中的课程id章节所属的课程表名:QB_COLLEGES 解释:学院信息表QB_COLLEGES(QB_Colleges)是否主键字段名字段描述数据类型长度可空约束缺省值备注是COLLEGE_IDCollege_IDINTN学院idCOLLEGE_NAMECollege_NameNCHAR(10)10N学院名COLLEGE_KINDCollege_KindINTN学院所属类别,如:工科表名:QB_COURSES 解释:课程信息表QB_COURSES(QB_Courses)是否主键字段名字段

12、描述数据类型长度可空约束缺省值备注是COURSE_IDCourse_IdINTN课程类别COURSE_NAMECourse_NameNCHAR(10)10N课程名COURSE_KINDCourse_KindBITN课程类别:0代表学院专业课;1代表公共基础课COURSE_KINDIDCourse_KindIdINTN学院信息表中的学院id或公共课信息表中的公共课id学院id或者是公共课类别表名:QB_ORIGIN 解释:题目来源表 QB_ORIGIN(QB_Origin)是否主键字段名字段描述数据类型长度可空约束缺省值备注是ORIGIN_IDOrigin_IdINTN来源idORINGIN_D

13、ATEOringin_DateDATEN题目对应的年份ORIGIN_KINDOrigin_KindNCHAR(10)10N题目的出处表名:QB_PAPERS 解释:试题信息表QB_PAPERS(QB_Papers)是否主键字段名字段描述数据类型长度可空约束缺省值备注是PAPER_IDPaper_IdINTN试题idPAPER_MADEDATEPaper_MadeDateDATEN出题时间PAPER_AUTHORPaper_AuthorNCHAR(10)10N出卷人姓名PAPER_ENDPaper_EndNCHAR(10)10N试题用处考试时间表名:QB_POINTS 解释:知识点信息表 QB_

14、POINTS(QB_Points)是否主键字段名字段描述数据类型长度可空约束缺省值备注是POINT_IDPoint_IdINTN知识点idPOINT_CHAPTERIDPoint_ChapterIdINTN章节信息表中的章节id知识点所对应的章节的id表名:QB_PUBLICKINDS 解释:公共课信息表QB_PUBLICKINDS(QB_PublicKinds)是否主键字段名字段描述数据类型长度可空约束缺省值备注是PUBLICKIND_IDPublicKind_IdINTN公共课idPUBLICKIND_NAMEPublicKind_NameNCHAR(10)10N公共课的类型,如全校公共基

15、础课表名:QB_QUESTIONS 解释:题目信息表QB_QUESTIONS(QB_Questions)是否主键字段名字段描述数据类型长度可空约束缺省值备注是QUESTION_IDQuestion_IdINTN题目idQUESTION_POINTIDQuestion_PointIdINTN知识点信息表中的知识点id题目所属知识点的idQUESTION_ORINGINIDQuestion_OringinIdINTN来源表中的来源id题目的来源的idQUESTION_LEVELQuestion_LevelSMALLINTN1题目的难易度,分5个级别,数值越大代表题目越难QUESTION_CODEI

16、DQuestion_CodeIdINTN助记符idQUESTION_KINDChar(10)题目类型表名:QB_STUDENTS 解释:学生信息表QB_STUDENTS(QB_Students)是否主键字段名字段描述数据类型长度可空约束缺省值备注是STUDENT_IDStudent_IdINTN学生学号STUDENT_ACCOUNTIDStudent_AccountIdINTN用户信息表中的用户id学生的账号信息STUDENT_COLLEGEStudent_CollegeINTN学院信息表中的学院id学生所在学院表名:QB_TEACHERS 解释:教师信息表 QB_TEACHERS(QB_Te

17、achers)是否主键字段名字段描述数据类型长度可空约束缺省值备注是TEACHER_IDTeacher_IdINTN教师编号TEACHER_ACCOUNTIDTeacher_AccountIdINTN用户表中的用户id教师的账户信息TEACHER_DESCRIPTIONTeacher_DescriptionNCHAR(100)100N教师介绍5、程序结构整个系统的数据流大致如上图。用户在客户端上进行操作时,某些需要用到数据库里的数据的操作,客户端就会编写对应的命令编号以及相应的参数,转换成字节流,经过加密发送到服务器。服务器收到之后经过解密,并且转换回字符串,可以得到相应的命令和参数,根据这个

18、可以进行对应的操作,操作之后返回的是一个布尔值的字符串或者整型数组、字符串数组、题目数组,转换为字节流之后发送给客户端,跟服务器一样接收之后解密转换得到原有的数组或字符串,再分别绑定到对应的控件上。这是一次完整的客户端和服务器之间的数据传输。Client:客户端类,与服务器传输的代码。Parse:服务器返回的数据的转换。Paper:试卷的类。Questios:题目的类,里面有选择题、填空题、简答题继承题目类。SecuritySystem:加密解密。Download:下载文件,利用Tomcat进行传输。Login:登录Page。MainWindow:主界面,Grid加载Login。SelectC

19、ourse:选择科目的Page。Look:查看题目或试卷的Page。AutoPaper:自动组卷的窗口。QLMain、QLMainStu:老师、学生的界面,加载科目和查看的Page。Detail:题目详情窗口。PaperDetailxaml:试卷详情窗口。BufferManager:缓冲区管理器。SecuritySystem:加密解密。Paper:试卷的类。Questios:题目的类,里面有选择题、填空题、简答题继承题目类。Parser:客户端发送的数据的转换。Server:服务器类,与服务器传输的代码。Function:跟数据库打交道,利用SQL语句取数据。Database:数据库打开、链接

20、等基本操作。SocketAsyncEventArgsPool:管理栈。AsyncUserToken:记录客户端信息的类。Program:程序入口。6、关键功能及代码实现6.1多并发量的实现为了实现尽量多的并发量,一般不会使用阻塞的socket模型去编写服务器。因为阻塞的socket操作,需要大量的线程,才能让每个客户都能及时的得到响应,因此cpu在进行频繁的线程切换的过程就浪费了不少cpu的资源。所以必须要选择一个异步的socket模型,在windows中,IOCP(完成端口)是最适合用来实现网络服务器的,所以就选择IOCP。在.net的平台中MSDN中对SocketAsyncEventArg

21、s 的描述是:”SocketAsyncEventArgs 类就是这一组增强功能的一部分。该类专为需要高性能的网络服务器应用程序而设计。应用程序可以完全使用增强的异步模式,也可以仅仅在目标热点区域(例如,在接收大量数据时)使用此模式。”所以这次实现选择了SocketAsyncEventArgs 类来实现服务器。具体会有以下几个方面的实现6.1.1 实现 SocketAsyncEventArgsPool (SocketAsyncEventArgs 对象池)这个对象池用于存放 SocketAsyncEventArgs 对象。对象池中的对象都是预先分配的,而且也是可重用的,当有客户连接的时候,就在对象

22、池中给客户取出一个对象使用。当客户退出时就回收客户使用的SocketAsyncEventArgs 对象,放回对象池当中,使用这个对象池的好处是在服务器运行阶段,减少了对象申请释放的操作。对于多客户的连接中,就需要多次分配。也为服务器运行的过程节省一些cpu时间。主要代码如下,简单的实现对象池的效果,实际上就是用栈来管理对象using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net.Sockets;namespace Server_ class SocketA

23、syncEventArgsPool / SocketAsyncEventArgs 管理栈 private Stack pool_; public SocketAsyncEventArgsPool(int capacity) pool_ = new Stack(capacity); / 回收没用的SocketAsyncEventArgs public void Push(SocketAsyncEventArgs item) if (item = null) throw new ArgumentNullException(Items added to a SocketAsyncEventArgsP

24、ool cannot be null); lock (pool_) pool_.Push(item); / 分配SocketAsyncEventArgs public SocketAsyncEventArgs Pop() lock (pool_) return pool_.Pop(); / 返回可用SocketAsyncEventArgs的个数 public int Count get return pool_.Count; 6.1.2 实现缓冲区管理(BufferManager类)自定义的一个类,因为在每一个SocketAsyncEventArgs对象中,都必须为其指定一个缓冲区。用于数据接

25、收(来自socket缓冲区) 用于数据的发送(写进socket缓冲区)。因此假设对于没分配一个SocketAsyncEventArgs对象就必须对应的为其分配一个缓冲区,所以将所有缓冲区也预先分配好,然后统一为SocketAsyncEventArgs 指定,还有回收。好处跟上述的对象池差不多。 class BufferManager private int num_byte_; / 大缓冲区总大小 private byte buffer_; / 缓冲区数组 private Stack free_index_pool_; / 已回收的空闲的缓冲区 private int current_inde

26、x_ ; / 为分配缓冲区的下标 private int buffer_size_; / 小缓冲区的大小 / 构造函数 / totalBytes 大缓冲区总的大小 / bufferSize 小缓冲区的大小 public BufferManager(int totalBytes, int bufferSize) num_byte_ = totalBytes; buffer_size_ = bufferSize; current_index_ = 0; / 用于保存已经回收的缓冲区的栈 free_index_pool_ = new Stack(); / 申请空间初始化大缓冲区 public bool initBuffer() buffer_ = new bytenum_byte_; if (buffer_ = null) return false; return true; / 将缓冲区分配出去 / 先从栈中,获取小缓冲区 / 若栈空,就在当前下标下获取小缓冲区 public bool setBuffer(SocketAsyncEventArgs args) if (free_index_pool_.Count 0) args.SetBuffer(buffer_, free_index_pool_.Pop(), buffer_size_); else

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1