




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
华南农业大学软件开发技术实践课程设计实验报告小组成员:赖威(学号201030690215),李志杰(学号201030690217)周加伟(学号201030690230)教 师:林 毅 申提交日期:2013年 11月 30日华南农业大学信息学院课程设计实验题目题库管理中心起止日期2013学年第一学期课程名称软件开发技术实践学生资料学号 201030690215 学生姓名 赖威 学号 201030690217 学生姓名 李志杰 学号 201030690230 学生姓名 周加伟 实验内容 每一位教师都可将自己平日教学中积累的题目添加到题库中,与传统意义的题库不同的是,在这里教师可以将题库中的题目按照各种不同的属性(章节、知识点、考试时间、考试地区、难易度、助记码等)把每一道题目定义,方便教师搜索查阅,从不同的角度判断题目是否对自己的教学有益,运用到教学中是否能有的放矢、因材施教。评语与成绩项目/分数优良中及格不及格系统分析设计程序设计水平内容完成情况设计报告撰写质量课程设计总结情况附加说明:成绩 (优/良/及格/不及格) 指导教师 林毅申 2013 年 12 月1、基本信息1.1 小组基本信息学号姓名手机邮箱所做工作简述签名201030690215赖威15915847987346358653数据库设计,数据库实体化工作以及数据库面向业务层的接口201030690217李志杰15813374172369245326客户端界面以及相关数据绑定201030690230周加伟15813374064328748244业务逻辑层设计与实现,具体功能的算法实现1.2 项目基本信息 这次我们小组开发的是一个面向一所大学内的任课老师以及在校学生的题库管理系统。作为数字化校园的一部分,该系统的主要的功能包括为教师用户提供的查阅题库,新组试卷功能和面向学生的在线考试功能。题库分为两部分,一部分是之前教师利用组卷功能得到并保存的试卷,一部分是不同类型的题目。题目范围为学校内各门课程期末考试的试题,包括公共基础课以及各学院开设的不同课程。题目不仅包括普通的文字类题目,还包括一些包含复杂元素如图片,特殊公式等的题目,做到基本兼容现在学校内能看到的题目。 考虑到小组成员的技术水平以及项目的实际需要,该系统是采用C/S模式。为提高效能,服务器方面采用IOCP模型,客户端采用WPF技术来改善Winform在界面上的劣势。1.3 项目技术信息开发语言C#平台Windows7技术客户端(WPF), 服务器(IOCP模型)工具Visual Studio 2010 Sql Server 20082、系统架构图注:实线表示数据传输方向,虚线表示模块间调用关系,由被调用者指向调用者数据解密模块 消息队列 服务器程序 客户1请求 客户2请求客户3请求客户1请求 。 。 。数据库服务器消息接收模块数据加密模块传输数据格式解析模块数据解密模块 数据发送模块工作者线程池业务逻辑处理模块数据加密模块客户消息请求发送模块发送模块客户端程序4123服务器程序:数据加密模块:采用一种加密算法,(具体哪种算法等系统实现时,再进行确定),将即将发送的数据进行加密。保证数据再传输过程中的安全性。与客户端中的数据加密模块原理一样。数据解密模块:采用与加密算法相对应的解密算法,将接受到数据,进行解密,还原得到原始的数据。与客户端中的数据解密模块原理一样。消息队列:为了能实现同时让尽量多的客户连接到服务器,所以不使用一线程处理一客户模型的服务器。这里的消息队列是将所有用户对服务器的各种请求按照先进先出的规则排列起来。等待处理。如果实现是使用windows io完成端口和对应的SOCKET进行绑定,这个消息队列是由系统生成和维护的。工作者线程池:线程池用于维护和管理服务器中所有以工作者身份存在的线程,工作者线程就是用来处理客户请求的线程。线程池的线程会互斥的到消息队列中取出对应的客户请求进行处理。没有请求时候,所有线程都处于阻塞状态等待消息队列中出现客户请求。当工作者线程获得客户请求的时候会按顺序去调用数据解密模块,数据传输格式解析模块,业务逻辑处理模块,加密发送数据模块。数据传输格式解析模块:数据在网络传输的过程中,我们给它规定特定的格式。通过该模块,服务器可以清楚的知道,客户需要服务器为他实现哪些功能。但是这里解析的数据需要通过解密之后,才能解析。对应的客户端想要与服务器进行交互,就需要使用这个特定的格式发送数据。业务逻辑处理模块:这个模块就是服务器具体工作的模块,模块中包含服务器能够为客户端提供的所有服务。工作者线程通过解析数据格式,知道客户的需求,再从这个模块中调用指定的服务。这个模块也是直接和数据库进行交互的模块。数据发送加密模块:业务逻辑模块处理完客户的请求的服务之后,需要为客户返回处理后的结果。可能是简单的操作成功和失败的返回结果,也可能是直接数据的传输。和加密模块结合在一起,说明数据发送前需要进行加密。数据库模块:采用sql server做数据库管理,ADO.NET技术实现面向业务层的接口。3、系统功能题库管理中心服务器客户端在线考试评分数据传输查看试卷导出试卷数据提取学生老师手动组卷自动组卷查看题目客户端:学生:在这个题库管理中心中,我们设定的学生功能有查看试卷、导出试卷和在线考试并评分。查看试卷:学生可以查看不同科目的试卷,选择科目时需要先选择科目分类、学院等上级目录,试卷包括历年考试卷和各学科老师自己组合试题的模拟卷。导出试卷:学生查看了试卷之后如果需要带出,可以选择导出试卷,导出的试卷根据学生选择存储位置以WORD文档存储。老师:老师可以使用的功能包括:查看题目、组卷。组卷分为按要求自动组卷和手动组卷两个部分。查看题目:跟学生的一样,首先选择科目分类、学院等目录,选择了科目之后还需要选择章节和知识点、或者选择某一套题(具体的操作在编码时确定),进入单个题目可以看到题目分类、难易度、内容和答案,还可以把该题目加入到组卷区里(类似网络购物加入购物车的形式)。组卷:自动组卷:老师选择科目、难易度,填入试卷总分和考试时间,选择题数目和选择题总分,填空题数目和填空题总分,客观题视科目需要而定,可以选择简答题、计算题、材料分析题等题型,最后各题总分要跟试卷总分相同,全部填写好之后就可以进行自动组卷,组卷成功之后老师看是否满意,不满意可以重来或者可以留下某一些需要的题其他题目随机加入。数据传输:用户进行操作需要读取数据的时候发出命令传给服务器,服务器传过来的数据接受后给用户看。服务器:提取数据:根据客户端传来的命令来进行数据库的读取,读取后给传输模块。数据传输:数据提取出来之后,经过格式化以后再进行加密,之后就可以传输给客户端进行解密并呈现给用户。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_IDAccount_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_IDChapter_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)是否主键字段名字段描述数据类型长度可空约束缺省值备注是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_DATEOringin_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_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公共课的类型,如全校公共基础课表名:QB_QUESTIONS 解释:题目信息表QB_QUESTIONS(QB_Questions)是否主键字段名字段描述数据类型长度可空约束缺省值备注是QUESTION_IDQuestion_IdINTN题目idQUESTION_POINTIDQuestion_PointIdINTN知识点信息表中的知识点id题目所属知识点的idQUESTION_ORINGINIDQuestion_OringinIdINTN来源表中的来源id题目的来源的idQUESTION_LEVELQuestion_LevelSMALLINTN1题目的难易度,分5个级别,数值越大代表题目越难QUESTION_CODEIDQuestion_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_Teachers)是否主键字段名字段描述数据类型长度可空约束缺省值备注是TEACHER_IDTeacher_IdINTN教师编号TEACHER_ACCOUNTIDTeacher_AccountIdINTN用户表中的用户id教师的账户信息TEACHER_DESCRIPTIONTeacher_DescriptionNCHAR(100)100N教师介绍5、程序结构返回数据(数组) 返回数据(字节流)返回数据(数组)操作命令(字符串) 操作命令(字节流) 操作命令(字符串)客户端接收并解密加密并发送数据库调用接收并解密加密并发送客户端整个系统的数据流大致如上图。用户在客户端上进行操作时,某些需要用到数据库里的数据的操作,客户端就会编写对应的命令编号以及相应的参数,转换成字节流,经过加密发送到服务器。服务器收到之后经过解密,并且转换回字符串,可以得到相应的命令和参数,根据这个可以进行对应的操作,操作之后返回的是一个布尔值的字符串或者整型数组、字符串数组、题目数组,转换为字节流之后发送给客户端,跟服务器一样接收之后解密转换得到原有的数组或字符串,再分别绑定到对应的控件上。这是一次完整的客户端和服务器之间的数据传输。Client:客户端类,与服务器传输的代码。Parse:服务器返回的数据的转换。Paper:试卷的类。Questios:题目的类,里面有选择题、填空题、简答题继承题目类。SecuritySystem:加密解密。Download:下载文件,利用Tomcat进行传输。Login:登录Page。MainWindow:主界面,Grid加载Login。SelectCourse:选择科目的Page。Look:查看题目或试卷的Page。AutoPaper:自动组卷的窗口。QLMain、QLMainStu:老师、学生的界面,加载科目和查看的Page。Detail:题目详情窗口。PaperDetailxaml:试卷详情窗口。BufferManager:缓冲区管理器。SecuritySystem:加密解密。Paper:试卷的类。Questios:题目的类,里面有选择题、填空题、简答题继承题目类。Parser:客户端发送的数据的转换。Server:服务器类,与服务器传输的代码。Function:跟数据库打交道,利用SQL语句取数据。Database:数据库打开、链接等基本操作。SocketAsyncEventArgsPool:管理栈。AsyncUserToken:记录客户端信息的类。Program:程序入口。6、关键功能及代码实现6.1多并发量的实现为了实现尽量多的并发量,一般不会使用阻塞的socket模型去编写服务器。因为阻塞的socket操作,需要大量的线程,才能让每个客户都能及时的得到响应,因此cpu在进行频繁的线程切换的过程就浪费了不少cpu的资源。所以必须要选择一个异步的socket模型,在windows中,IOCP(完成端口)是最适合用来实现网络服务器的,所以就选择IOCP。在.net的平台中MSDN中对SocketAsyncEventArgs 的描述是:”SocketAsyncEventArgs 类就是这一组增强功能的一部分。该类专为需要高性能的网络服务器应用程序而设计。应用程序可以完全使用增强的异步模式,也可以仅仅在目标热点区域(例如,在接收大量数据时)使用此模式。”所以这次实现选择了SocketAsyncEventArgs 类来实现服务器。具体会有以下几个方面的实现6.1.1 实现 SocketAsyncEventArgsPool (SocketAsyncEventArgs 对象池)这个对象池用于存放 SocketAsyncEventArgs 对象。对象池中的对象都是预先分配的,而且也是可重用的,当有客户连接的时候,就在对象池中给客户取出一个对象使用。当客户退出时就回收客户使用的SocketAsyncEventArgs 对象,放回对象池当中,使用这个对象池的好处是在服务器运行阶段,减少了对象申请释放的操作。对于多客户的连接中,就需要多次分配。也为服务器运行的过程节省一些cpu时间。主要代码如下,简单的实现对象池的效果,实际上就是用栈来管理对象using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net.Sockets;namespace Server_ class SocketAsyncEventArgsPool / 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 SocketAsyncEventArgsPool 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对象中,都必须为其指定一个缓冲区。用于数据接收(来自socket缓冲区) 用于数据的发送(写进socket缓冲区)。因此假设对于没分配一个SocketAsyncEventArgs对象就必须对应的为其分配一个缓冲区,所以将所有缓冲区也预先分配好,然后统一为SocketAsyncEventArgs 指定,还有回收。好处跟上述的对象池差不多。 class BufferManager private int num_byte_; / 大缓冲区总大小 private byte buffer_; / 缓冲区数组 private Stack free_index_pool_; / 已回收的空闲的缓冲区 private int current_index_ ; / 为分配缓冲区的下标 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 if (num_byte_ - buffer_size_ current_index_) return false; else args.SetBuffer(buffer_, current_index_, buffer_size_); current_index_ += buffer_size_; return true; / 回收小缓冲区至栈中 public void freeBuffer(SocketAsyncEventArgs args) free_index_pool_.Push(args.Offset); args.SetBuffer(null, 0, 0); 6.1.3 服务器的实现服务器的逻辑比较简单,就是使用线程阻塞的进行端口的监听,当有客户连接,就为其分配一个SocketAsyncEventArgs 对象,为这个对象指定缓冲区。然后提交一个异步接受的操作。按照IOCP的原理。这个异步操作会等待到数据到达接受到,然后进队列等待线程到来,再处理接受到的数据。处理完这一轮接受操作后,就再次提交下一个异步操作。代码在 Server.cs 文件内,比较长,就不粘贴出来了。6.2 数据包加密解密功能对于客户端和服务器之间传输的数据,为了不让别人识别到。所以这里采用了加密的方案。具体方案是服务器先获得客户端的一个RSA的公钥,然后用这个公钥加密了一个对称加密算法的密钥,并发送给客户端。因为是使用客户端的公钥加密,所以只有客户端能够识别得到这个密钥。这时候服务器和客户端就有了一个商量好的对称加密算法的密钥,之后所传输的数据就用这个对称加密算法的密钥加密了再发送。这里对称加密算法使用DES加密(暂时不讨论DES64位密钥太短的问题)。DES加密解密代码如下public byte DESEncrpt(byte buf) MemoryStream msEncrypt = new MemoryStream(); CryptoStream csEncrypt = new CryptoStream( msEncrypt, des_.CreateEncryptor(bufDesKey_, bufDesIv_), CryptoStreamMode.Write); BinaryWriter bw = new BinaryWriter(csEncrypt); bw.Write(buf); bw.Close(); csEncrypt.Close(); return msEncrypt.ToArray(); public String DESDecrypt(byte buf, int offset, int len) byte bufTemp = new bytelen; for (int i = 0; i len; +i) bufTempi = bufoffset + i; MemoryStream msDecrypt = new MemoryStream(bufTemp); CryptoStream csDecrypt = new CryptoStream(msDecrypt, des_.CreateDecryptor(bufDesKey_, bufDesIv_), CryptoStreamMode.Read); StreamReader srDecrypt = new StreamReader(csDecrypt); String ret = srDecrypt.ReadLine(); srDecrypt.Close(); csDecrypt.Close(); msDecrypt.Close(); return ret; RSA加密解密代码如下 public byte RSAEncrpt(String des_key) return rsa_.Encrypt(Encoding.UTF8.GetBytes(des_key), false); public String RSADecrypt(byte buf,int offset,int len) byte bufTemp = new bytelen; for (int i = 0; i len; +i) bufTempi = bufoffset + i; return Encoding.UTF8.GetString(rsa_.Decrypt(bufTemp, false); .net平台下有现成的类供我们使用,所以代码比较简单6.3对象序列化和反序列化因为传输的数据都是以二进制数据,基本类型二进制的转换比较简单。如果要传输对象,就必须先对对象进行序列化。接收方进行反序列化,得到对象。这个功能比较简单,但是实现过程中,也碰到一些奇怪的问题,所以这里也将代码贴出来。 private byte ObjectToBytes(Object obj) BinaryFormatter bf = new BinaryFormatter(); MemoryStream ms = new MemoryStream(); bf.Serialize(ms, obj); byte b = ms.ToArray(); ms.Close(); return b; public static Object BytesToObject(byte buf) String ret = Encoding.UTF8.GetString(buf); BinaryFormatter bf = new BinaryFormatter(); bf.Binder = new UBinder(); MemoryStream ms = new MemoryStream(buf); Object obj = bf.Deserialize(ms); ms.Close(); return obj; public class UBinder : SerializationBinder public override Type BindToType(string assemblyName, string typeName) Assembly ass = Assembly.GetExecutingAssembly(); return ass.GetType(typeName); 6.4自动组卷这个功能的输入有平均难易度,选择题数,填空题数,简答题数。根据平均难易度和选择题数,该功能生成一个难易度的组合,使其平均值为平均难易度。例如,平均难易度为3,选择题数为5.那么就可能生成 1,2 ,3,4,5这样的难易组合代表 难度1的选择题 1道,难度2的选择题1道等等。有可能是 1,1,3,5,5, 代表 难度1的选择题2道,难度3的选择题1道,难度5的选择题2道。具体是怎么样的组合是随机的,但是组合一定满足平均难度值是我们指定的值。生成组合后,就去数据库取出指定难度的题目出来。填空题,简答题一样的原理。最后组合成一张试卷。具体实现代码如下: public int AutoPaper(int level, int num) List result = new List(); number = num; ret = new intnumber; _autoPaper(result, 1, 0, level * num); int count = new int6; for (int i = 0; i num; i+) countresult4i+; return count; private void _autoPaper(List result, int last, int step, int plus) if (step = ret.Length) if (plus = 0) int temp = new intnumber; for (int tt = 0; tt temp.Length; +tt) temptt = rettt; result.Add(temp); return; else return; else for (int i = last; i = 5; +i) if (plus - i) = (5 * (ret.Length - step - 1) retstep = i; _autoPaper(result, i, step + 1, plus - i); 7、实验结果讨论7.1系统实现服务器运行界面:服务器启动后的界面,能显示出系统当前状态。方便系统管理员对系统进行管理。当前不提供直接对服务器进行命令操作。登陆界面:教师和学生使用同一个登陆界面,系统根据用户名自行判断登陆的用户权限,所以界面上并没有用户身份的选择框。选择科目界面:因为试题都是对应某一个科目的,这是学生和教师登录后首先看到的界面。首先要选择大的类别,包括每个学院内部的专业课以及一些不同学院的学生都要修习的一些公共课。选择了对应的科目后,才能查看对应的题目或试卷。题目浏览界面:这是学生选择科目后能看到的界面,主要内容在右边的文本框中。内容为一套套的试卷。由之前的教师所出。在试卷内容的上面的红框部分是老师出题的时间以及题目的用处。试卷显示界面:这是学生选择试卷之后的试卷显示界面。试卷实现了自动排版,学生可以方便地浏览,直接做题。界面左上方红框标注处显示出了试卷对应的考试时间和整体的难度。方便学生自行进行模拟。教师登陆后的界面:这是教师选择科目后进入的界面。左边的红框部分是章节和知识点选择框。在里面进行选择后在右边中部的黑框里面的题目显示框里会显示相应知识点对应的题目。在在右上角绿色的选择框里选择对应的体型后在题目内容框里也会显示对应体型的题目。题目显示界面:这是教师选择题目后,显示题目详情的界面。左上角红框内饰题目的一些基本信息。信息框下面是题目的主要内容,注释和答案。7.2系统总结系统能够正确运行,基本功能都已经实现,完成基本的设计目标。(1)设计目标的完成情况系统已经基本完成设计目标,能正确实现基本功能,符合用户要求,并且可开发性大,系统的扩展性强,可根据需要添加新的功能模块,进行系统升级。是系统能够一直相符合用户需求的方向发展,功能将越来越齐全。(2)系统使用性评价系统功能合理,界面简单,易于用户使用,操作简便,可维护性好。数据库设计合理,可扩展性强。(3)系统整体评价系统整体完整,是一款功能比较完善的软件,能适合大多数用户的要求。运行速度快,占用空间小。系统存在的问题:系统的基本功能已经实现,但是系统上存在着一些不足,在管理员界面应该添加一个用户请求界面,当用户忘记密码以后
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数字化解决方案设计师岗位操作技能考核试卷及答案
- 安全培训标准化解读课件
- 安全培训暨消防应急演练课件
- 2024年湖南湘潭韶山旅游发展集团有限公司招聘考试真题及答案详解(网校专用)
- 云计算环境下的绿色计算应用研究-洞察及研究
- 机械设备安装调试操作规范
- 跨平台教程适配-洞察及研究
- 小学科学实验教学设计及案例分析
- 玻璃幕墙安装工程施工方案
- 高二散文鉴赏同步练习题库
- 住宅大门经典对联带横批100条-最佳大门风水对联
- SWITCH暗黑破坏神3超级金手指修改 版本号:2.7.4.84040
- 生产安全事故应急预案评审会议纪要范文
- 三年级上册劳动教案 福建教育出版社(已排版好,可直接打印)
- 呼吸机相关性肺炎预防护理课件
- 医疗机构药事管理与法规
- 服装加工企业公司级安全教育试题答案
- 职业卫生档案与职工个人职业健康监护档案模板
- 质量问题责任划分及处理对照表
- 特种设备日常检查记录表(压力容器)
- 时间管理培训(经典)
评论
0/150
提交评论