职场文秘网

首页 > 条据书信 > 道歉信 / 正文

图书管理系统软件工程课程设计

2020-06-11 10:00:45

 XX大学

  课程名称:软件工程

 试题题目:图书管理系统

 姓

 名:

  学

 号:

  专

 业:

 计算机科学与技术

 学

 院:计算机与信息科学学院

 时

 间:20XX年X 月 X日

 目录

 一、 开发背景与目标

  1.1开发背景…………………………………………………………………….- 6-

 开发目标………………………………………………………………………...-6-

 二、需求分析说明书 -6-

 2.1系统介绍 -6-

 2.2系统面向的用户群体 -7-

 2.3系统的功能性需求 -7-

 2.4系统的非功能性需求 -8-

 2.4.1用户界面需求 -9-

 2.4.2软硬件环境需求 -9-

 2.4.3软件质量需求 -9-

 三、可行性分析报告 -9-

 3.1经济可行性分析 -9-

 3.2操作可行性分析 -9-

 3.3技术可行性分析 -10-

 3.4时间、设备可能性 -10-

 3.5系统工作量 -11-

 3.6文档要求 -11-

 四、开发环境与项目规划 -11-

 4.1开发环境 -11-

 4.2项目规划与管理 -11-

 4.2.1开发人员安排 -12-

 4.2.2开发进度安排 -12-

 五、结构化分析与设计 -13-

 5.1分析与设计方法:…………………………………………………………-13-

 5.2组织结构图……………………………………………………….………-13-

 5.3数据流程图………………………………………………………………-15-

 5.4数据字典……………………………………………………………….…-18-

 六、面向对象分析与设计 -20

 6.1分析与设计方法………………………………………………………….…-20

 6.2用况模型……………………………………………………………………-20-

 6.3活动图………………………………………………………………….…...-21-.

 6.4顺序图……………………………………………………………………....-22-

 七、数据库分析与设计 -23-

 7.1数据库环境说明 -23-

 7.2数据库命名标准与规范 -24-

 7.3数据库逻辑设计 -24-

 7.3.1逻辑设计步骤 -24-

 7.3.2逻辑设计图 -24-

 7.4数据库物理设计 -26-

 7.4.1数据库物理设计步骤 -26-

 7.4.2表、视图汇总 -30-

 7.4.3各表、视图设计详解 -30-

 八、 人机界面设计 -32-

 8.1界面设计原则 -32-

 8.2主界面设计 -32-

 8.3子界面设计 -32-

 九、项目系统实现 -35-

 9.1 实现环境与技术………………………………………………….……-35-

 9.2

 核心模块实现技术代码…………………………………………...…-36-

 十、软件测试分析报告 -61-

 10.1测试范围与主要内容 -61-

 10.2测试方法 -61-

 10.3测试过程 -61-

 10.3.1系统测试 -61-

 10.3.2单元系统 -63-

 10.3.3 集成测试 -64-

 十一、软件使用说明书 -64-

 11.1软件概述 -64-

 11.2使用说明 -64-

 11.2.1系统登陆 -65-

 11.2.2注册 -66-

 11.2.3 系统简介 -66-

 十二、系统开发评价……………………………………………………….….-67-

 12.1.功能方面…………………………………………………………..….-67

 12.2.性能方便…………………………………………………………….-67-

 12.3.课程知识运用方面………………………………………………..…-67-

 参考文献 -67-

 一、开发背景与目标

 1.1 开发背景

 随着计算机技术的不断发展,计算机已经深入到社会生活的各个角落,在知识爆炸的今天,各种各样的图书也越来越多,各图书馆的规模也在不断壮大,其管理也日臻完善,面对着庞大的信息量,依靠传统的方式对图书馆进行管理将耗费很大的人力物力,而且也不再能满足当今人们对图书管理的需要。所以对于图书馆的信息化管理已经越来越重要,因此,必须制定一套合理、有效,规范和实用的图书管理系统,对整个图书馆的资料进行集中统一的管理。所以为了方便管理人员对图书馆书籍、读者资料、图书借阅情况等进行高效的管理,并且在工作人员具备一定的计算机操作能力的基础上,如果采用图书管理系统可以提高图书馆的管理效率,减轻图书馆工作人员的工作负担。方便借阅者借阅和查找图书,使图书管理更加科学、有序。

  1.2 开发目标

 本次开发的目标是一个适合于中小型图书馆的图书管理系统,主要完成有关图书信息的管理和有关于读者及其借阅情况的管理,用信息化的管理方式代替传统人工的管理方式,可以方便工作人员的管理,省去繁琐的手工操作过程,改为计算机代为处理,也减少了由于人工操作所会带来的一些错误和不足,提高图书管理的效率。

 二、需求分析说明书

 2.1 系统介绍

 随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对图书馆信息进行管理,具有着手工管理所无法比拟的优点。这些优点能够极大地提高图书馆管理的效率,也是图书馆的科学化、正规化管理的重要条件。根据以上情况,决定实施建立图书管理系统, 因为图书信息管理是一个图书馆不可缺少的部分,所以图书管理系统应该能够为用户提供充足的信息和快捷的查询手段。可以解决一直以来人们使用传统人工的方式管理文件档案存在着的许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。随着计算机技术的飞速发展,计算机在企业管理中应用的普及,利用计算实现图书馆图书信息的管理势在必行。图书管理系统是现代图书馆管理工作不可缺少的一部分,是适应现代图书馆发展要求、推动图书馆图书信息管理走向科学化、规范化的必要条件。

  图书管理系统是针对图书馆拥有大量图书信息和读者借阅信息以及读者个人资料进行信息化管理的软件,所以他必须具有下功能:

  (1)、图书信息数据库集及表的操作,实现对图书信息的录入,删除。查询和管理工作(包括:图书号、书名、作者、出版社、出版日期、单价、图书类别、存放位置、入库日期、是否借出等)相关信息的维护。

  (2)、借阅者信息数据库及表的操作,实现对借阅者信息的增加、删除和日常信息的维护等管理工作(包括:借阅卡号、姓名、性别、身份证号、单位、家庭住址、联系电话、借阅者类别、办证日期、已借书数目、是否挂失等)相关信息的维护、

 (3)、借阅信息数据库及表的操作,实现对已借出图书信息的管理(包括:借阅卡号、图书号、姓名、书名、借出日期、实际归还日期、罚款金额等)相关信息的维护。

  2.2 系统面向的用户群体

 本图书管理系统主要面向的是中小型图书馆。图书管理人员使用其管理图书馆的图书,借阅人员可以通过本系统查阅相关信息。

  2.3 系统的功能性需求

 图书管理系统的完整功能需求如下:

  1、借阅者管理

 对于每一个通过资格审查的人员,可以办理一张借阅卡。需要说明的是,本系统面向中小型图书馆,这里的“资格审查”主要是通过申请人亲自到图书馆的指定部门去进行面对面的审查,如果审查通过,则可以办理借阅卡,并拥有自己的用户名和密码,成为注册用户,用户以后可以凭此登陆本系统;如果审查未通过,则不予办理。

  每个通过审查的人员(即注册用户)都可以拥有且仅可以拥有一张借阅卡,此借阅卡里包含该用户的所有个人信息,以后该用户的所有图书借阅活动都凭借此卡进行,知道该卡被注销或删除为止。

  因此,对借阅者的管理包括对借阅者相关信息的添加、修改、删除及检索功能。

  2、图书信息管理

 图书馆的管理中很大一部分就是对于馆藏图书的管理。这里主要涉及以下功能:

  A、新书的入库:为了方便以后的用户借阅、查询,对每本新到的图书都需要把他的详细信息加以记录,也就是登记入库后,方可对外借阅。

  B、图书的检索:作为一个图书馆,其馆藏的图书是非常丰富的,要想在数万甚至数十万的图书中迅速找到读者需要的图书,必须提供相关图书的快速检索查询功能。

  C、图书信息的修改:一般来说一本图书在入库时,其基本信息(比如,书名、作者、单价、出版社等)就已经确定的了,而且在以后的使用过程中永远都不会改变。因此,对于这些信息不需要提供相应的修改功能。但是对于图书的其他一些辅助信息(比如,存放位置、是否借出等),可能会发生变化,因此,需要提供对于这部分的图书信息的修改功能。

 D、图书信息的删除:有些书籍由于太过破旧要被淘汰,或者将被丢失,对于这些不再馆藏的书籍,能够从系统信息中删除它们。

  3、图书借阅信息管理

  本功能是系统的核心功能之一,作为一个图书管理系统,其最主要的功能就是对于图书的借出和归还。这主要涉及被借阅的图书和借阅者(借阅卡的持有者),即既要有被借图书的基本信息,还要有借阅者的部分信息以及借出和归还的日期等。

 具体来说,对于借书,要首先获得借阅者的信息,看其是否有权利借书,其次还要检查相关书籍信息,看该书是否可以被外借,在两者都满足的情况下,才能借阅;而还书时,同样也需要借阅者信息和图书信息才能还书,同时还要计算本次借阅是否超期,如果超期,还要计算出罚款金额,借阅者只有在交了足额的罚款后才能还书成功。此外,对于这些历史借还的记录,还要提供一定的查询功能;同时由于存储空间的限制,不可能永远保存所有的历史记录,同时还需要提供相应的删除记录的功能。

 需要说明的是所有的借还操作都是通过系统管理员来实现的。

 4、用户的登录

  该系统的用户主要有系统管理员和普通的注册用户(及借阅卡的持有者—借阅者)两种。系统管理员拥有系统的所有功能权限,而普通注册用户只能够管理自己的个人信息以及检索需要的图书信息(不然每本书都要依靠系统管理员检索,借阅的效率太低),对于系统的其它功能不具有权限。因此,系统需要对于各种用户进行管理,不同的用户给予不同的权限,为此给每一个合法用户一个用户名和密码,用户平次登录系统。这样,在满足不同类型系统用户操作需求的基础上,提高了系统的安全性。

 5.系统基本信息的管理

  系统基本信息的管理主要是对图书管理中涉及的一些基本信息的处理,包括

 A、对借阅者类别的设置:作为注册用户的借阅者,可以根据其不同的类别,设置最大借阅图书数量的不同上限。

  B、对于图书类别的设置:对于不同类型的图书,给予不同的借阅期限。一旦用户借阅超期 ,根据图书类型的不同也有不同的罚款金额。

  C、对系统用户的管理:正如前面所述,每一个使用系统的人员必须凭借自己的用户名和密码来登录使用系统,在本系统中,暂定有两类用户:系统管理员和普通的注册用户,不同的用户对于系统有不同的使用权限。

  2.4 系统的非功能性需求

 1、界面的更换

 用户可以根据自己爱好和审美要求更换皮肤颜色,可以自行搭配自己的空间,以及自行选择的界面模式,如最大化模式,窗口模式,迷你模式等等。

  2、系统的保护

 用户进入自己系统要进行注册和登录,并有用户名和密码。对用户的个人信息进行保护,其中用户可以自行修改自己的密码等。

  3、民主的交流

 用户可以在系统中的公共平台上进行对工作以及生活其他方面进行交流。和向各部门领导交流意见和建议,以及各种最新的通知。

  4、信息的存储

 用户可以在该系统中申请邮箱进行信息的存储和备份。

  2.4.1 用户界面需求

 本图书管理系统需要进行人机交互,在交互过程中需要有的界面有:用户登录界面、添加借阅者界面、查询借阅者界面、删除借阅者界面、添加图书界面、查询图书界面、删除图书界面、借书管理界面、还书管理界面、查询借还记录界面、删除借还记录界面等。

  2.4.2 软硬件环境需求

 本图书管理系统对于硬件没有特殊的要求,只要是一般的计算机都可以安装使用。对于软件本产品运行于Microsoft的Windows系列操作系统。

  2.4.3软件质量需求

  本软件是一个中小型图书馆的图书管理系统,完成关于图书信息以及借阅信息的管理,要求本产品安全可靠,便于操作,可以方便的进行系统的升级与维护工作。

 三、可行性分析报告

 3.1 经济可行性

 经济可行性研究是对系统投入使用后带来的经济效益进行评估,也包括对系统的投资预算。即要解决两个问题,资金可得性和经济合理性当前办公用PC机的普及使得 开发和应用管理系统在经济上成为可能。

  现在,计算机的价格已经十分低廉,性能却有了长足的进步,本系统的开发为

 为企业的工作效率带来了质的飞跃。为此主要表现为以下几个方面。

  1、本系统的运行可以代替人工进行许多繁杂的劳动;

 2、 本系统运行可以节省许多资源。如人力,财力,物力等方面;

 3、 本系统的运行可以大大地提高企业的工作效率;

 4、本系统可以使敏感文档更加安全,等等。

  另一方面,就企业自身来说,它也是需要这样一个系统的。我们在计算机还没有普及之前,信息都必须通过在纸上填写来实现,这样既浪费时间,又容易出错。随着信息时代的来临,

 我们的各项工作都要讲求效率,人事管理也补例外。这就为人事管理系统提供了使用人群,所以本系统在经济上是可行的。

  3.2 操作可行性

  图书管理一般是对图书基本信息的管理、对借阅者基本信息的管理以及对图书借阅情况的管理。所以在数据库模式定义中可以将图书基本信息定义在一个表中,这样对数据的增加、修改、删除、查询、统计操作处理起来都相对简单。统计报表的导出可以利用OLE(对象的连接与嵌入)这项成熟的技术来实现。打印功能完全可以根据开发工具自带的属性灵活的实现。用户账号权限的设置、管理可以在数据库中建立一张独立

 的表来实现,图书管理系统将根据用户不同的权限设置不同的操作功能。本系统的操作简单,有计算机基础的人无需培训即可使用,即使是没有计算机基础的人只需经过简单的培训就可熟练地使用本系统。系统运行后,就用户方面而言,由于用户使用本系统时,不会也不必关心系统内部的结构及实现方法,即对用户来说是透明的,所以本系统对用户而言是定位在界面友好,操作方便功能齐全的原则上的,用户只需用鼠标点击界面上的选项卡或按钮就能执行相应的功能。就管理者而言,关心的是如何处理各种数据只要把图书和借阅者的相关信息输入计算机,管理者就可以运行相应的后台程序进行处理。而以上的这些功能都能在所选择的开发环境中用所选择的开发工具来实现。所以说本系统在操作上是没有问题的。因此,他在操作上是可行的。

  3.3 技术可行性

 数据库技术在计算机软件领域研究中一项非常重要的主题,产于60年代,40多年来数据库技术得到了迅速发展,并已形成较为完整的理论系统和一大批使用系统。面向对象是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),其基本思想是使用对象,类、继承、封装、消息等基本概念进行程序设计。许多程序开发工具如VB,Java, Microsoft Visual Studio 2005等都支持面向对象的程序开发。

 系统的开发平台。我们选择了当前流行的WindowsXP操作系统,应用程序开发采用Microsoft公司的面向对象的Microsoft Visual C++ 6.0。Microsoft Visual C++ 6.0是一款可视化编程软件,为我们提供了一种方便快捷的Windows应用程序开发工具与普通的数据库系统相比用Microsoft Visual C++ 6.0作为数据库开发平台有简单、灵活、可扩充等特点,非常适合初学者快速掌握并用来开发数据库管理系统。

  数据库选择Microsoft Office Access 2007,Microsoft Office Access 2007是作为一种功能强大的MIS系统开发工具,它具有界面友好,易学易用,开发简单,接口灵活等特点,是一个典型的新一代数据管理和信息系统开发工具。与Microsoft的其他数据库产品如FOXPRO等相比,Access具有较独特的优势-提供了更强大的数据组织,用户管理,安全检查等功能。当前管理信息系统的开发大都基于数据库技术和面向对象软件开发技术。这些技术目前已经成熟。被广泛应用于各个领域。综上所述,人事管理系统的开发在技术上是可行的。

  3.4 时间、设备可行性

 目前,企业内部大多都实现了数字化办公,办公室的有线无线网路覆盖了情况也相当理想,企业良好的硬件设施为图书管理系统提供了坚实的基础。根据企业对系统一般期待运行的时间,我们开发小组现有的人力物力,以及对开发技术的掌握情况,可以在其要求的时间内完成开发任务。具体分析如下。

  系统的开发时间是从4月01日至6月30日。为期3个月(开发时间)

 开发过程最为重要的里程碑如下表

 第一周

 选定本次课程设计及报告的研究课题

 第二周

 选定本次课程设计及报告的研究课题

 第三周

 收集资料和参考文献

 第四周

 认真阅读和学习资料、文献并做出初步构思

 第五周

 制定出整个系统的设计构想、设计思路和方法

 第六周

 进行系统的设计、开发和编写程序代码

 第七周

 对系统进行测试和系统调试

 第八周

 完成整个系统的开发并进行系统维护

 第九周

 撰写课程设计报告

 第十周

 最终完成系统修改、论文撰写和表格填写

 在设备方面有计算机,服务器,网络和开发工具。等为该系统的开发提供了可能性。

  3.5 系统工作量

 在设计图书管理系统前我们小组进行了大量的研究,搜集了大量了资料和文献。并调查了一些大中小型图书馆的图书管理机制和方法。在图书管理系统设计完成时,进行系统测试和系统调试时,我们小组进行了大量的数据测试并在基础上进行了相应的修改。该图书管理系统可以同时满足多用户对系统的不同操作,如同时对图书信息的查询和对借阅信息的查询,因为系统采用桌面型的后台数据库在同一段时间多用户对数据库进行操作不会影响其他用户对数据库的维护。其数据库有很高地独立性。

  3.6 文档要求

 依据国家《计算机软件产品开发文件编制指南》和《现代软件工程》的理论与原则编制标准的软件技术文档。

  四、开发环境与项目规划

 4.1开发环境

  本系统选择Microsoft Visual C++作为开发语言。同其他编程环境相比Visual C++的效率是比较高的,并且提供了相当优秀的集成开发环境(Intergrated Developing Environment),集代码编辑、调试、向导、编译和可视化资源编辑功能于一体,其MFC基本类库对Windows API函数做了非常好的封装并扩展了功能,可以满足全部的基本功能需求,程序设计人员只需要简单的调用MFC封装的类函数就可以了。Visual C++也因为其超强的功能而享有“Windows环境下的外科手术刀之称”。

 同时,本系统选择Microsoft Access作为数据库管理系统。之所以选择它,是因为本系统主要面向的是中小型图书馆,需要处理的数据量并不大,而Access比较小,目前的办公自动化软件中一般都包含它,不需要另外安装软件;普通的个人计算机就可以调试程序,不需要联网等其他操作。

  4.2项目规划与管理

 (1)数据输入模块:该模块的主要功能是负责输入数据,所以该模块的设计出发点应从方便用户操作的角度出发,如:非法数据输入出现错误提示等,另外一些较固定数据可让用户从下拉框种选择,不必自己输入。

 (2) 数据查询模块:用户可以直接快速地查阅和打印系统中的图书信息(如书名、出版社、出版时间、书号、借阅情况等信息);也可以做出各种复杂的查询,用户可根据任意字段进行查询,包括多条件的与和或运算,为借阅者作出准确判断提供数据的支持。

 (3)数据删除修改模块:修改删除模块通常也是数据库中必须有的一个模块,因为在输入数据过程中难免会有出错的时候。当修改删除涉及到多个表时,本系统将做出判断并给出提示及相应处理,以保证数据的完整性及一致性。

 (4)数据统计分析模块:该模块将对数据进行统计,包括分组统计,二维表统计及饼图统计。各种统计结果都应该能够打印。

 (5)报表打印模块: 数据的打印也是系统不可或缺的模块,打印页面的大小及上下左右的边距应由用户自己自由设置。也可以将报表导入到word或者excel中,由用户自己设定打印方式。

  ( 6)账号管理模块:实现了对用户分组管理,并且可对用户的数据访问权限、功能操作权限进行设置,保证了操作的安全性、严谨性及保密性。

 (7)日志管理模块:系统将用户名,操作时间,操作内容都记录下来,然后写到数据库中。这样可以知道哪个用户什么时间作了什么操作,更好的维护了系统的安全性。

  4.2.1开发人员安排

 本次课程设计的需求分析和数据库设计是1个人单独完成的。

  王莹莹(20110514296)完成了基本数据的管理的功能和系统管理。完成了数据库备份与恢复的功能,图书信息管理和用户设置和系统退出的功能和报告的撰写。

  4.2.2开发进度

 序号

 设计(论文)各阶段名称

 地点

 起止日期

 1

 选定本次课程设计及报告的研究课题

 宿舍

 2

 选定本次课程设计及报告的研究课题

 宿舍

 3

 收集资料和参考文献

 图书馆

 4

 认真阅读和学习资料、文献并做出初步构思

 宿舍

 5

 制定出整个系统的设计构想、设计思路和方法

 宿舍

 6

 进行系统的设计、开发和编写程序代码

 实验室

 7

 对系统进行测试和系统调试

 实验室

 8

 完成整个系统的开发并进行系统维护

 宿舍

 9

 撰写课程设计报告

 宿舍

 10

 最终完成系统修改、论文撰写和表格填写

 宿舍

 11

 上交课程设计报告、系统答辩

 教学楼

 每一个进度所进行的时间都为一周左右

 五、结构化分析与设计

 5.1分析与设计方法:

  1、该系统分成几个相对独立的模块,但对这些模块进行集中式管理。

  2、整个系统采用模块化结构设计,作为应用软件有较强的可操作性和扩展性。

  3、在应用系统设计中,将相对独立的模块以数据流的方式相互连接,使各模块间的耦合性较低,方便系统运行。

  5.2组织结构图

 1、图书管理系统的软件结构图

 2、精化后的系统结构图

 5.3数据流程图

 1、图书管理系统的基本数据流图

 2、图书管理系统的功能级数据流图

 3、改进后的图书管理系统功能级数据流图

 4、改进后的系统数据流图

 5.4数据字典

 该图书管理系统的数据字典如下:

  对借阅者管理的请求=[添加借阅者|修改借阅者|删除借阅者|检索借阅者]

 对图书管理的请求=[添加图书|修改图书信息|删除图书信息|检索图书]

 图书借还管理请求=图书借阅管理请求

 图书借阅管理请求=[添加借阅信息|修改借阅信息|删除借阅信息|检索借阅信息]

 管理个人信息请求=[检索个人信息|修改个人信息]

 基本信息维护请求=[对借阅者类别信息的维护|对图书类别信息的维护|对登录用户的维护]

 对借阅者类别信息的维护=[对借阅者类别信息的添加|对借阅者类别信息的修改|对借阅者类别信息的删除|对借阅者类别信息的检索]

 对图书类别信息的维护=[对图书类别信息的添加|对图书类别信息的修改|对图书类别信息的删除|对图书类别信息的检索]

 对登录用户的维护=[对用户信息的添加|对用户信息的修改|对用户信息的删除|对用户信息的检索]

 时间=年+月+日

 借阅卡信息=借阅卡号+姓名+性别+身份证号+单位+家庭住址+联系电话+借阅者类别+办证日期+已借书数目+是否挂失

 借阅者=借阅卡信息

 读者=借阅者

 借阅卡号=8(数字)8

 性别=(男|女)

 身份证号=18(数字)18

 联系电话=(区号)+8(数字)8

 区号=4(数字)4

 借阅者类别=[一级读者|二级读者|三级读者]

 读者类别=借阅者类别

 描述:在本系统中,一级读者可借10本;而级读者可借5本;三级度者可借3 本

 办证日期=年+月+日

 已借书数目=[0|1|2|3|4|5|6|7|8|9|10]

 是否挂失=[挂失|没挂失]

 挂失=1

 没挂失=0

 图书信息=图书号+书名+作者+出版社+出版日期+单价+图书类别+存放位置+入库日期+是否借出

 图书=图书信息

 图书号=7(数字)7+同一本书副本编号

 同一本书副本编号=[0|1|2|3|4|5|6|7|8|9]

 出版日期=年+月+日

 图书类别=[一类图书|二类图书|三类图书|四类图书|五类图书|六类图书]

 入库日期=年+月+日

 是否借出=[借出|未借出]

 借出=1

 未借出=0

 借阅信息=借阅卡号+姓名+图书号+书名+借出日期+实际归还日期+罚款金额

  借还=借阅信息

 借出日期=年+月+日

 实际归还日期=年+月+日

 系统基本信息=[借阅者类别信息|图书类别信息|系统用户]

 借阅者类别信息=借阅者类别+能借书的数量

 借阅者类别=[一级读者|二级读者|三级读者]

 能借书的数量=[1|2|3|4|5|6|7|8|9]单位:本

 图书类别信息=图书类别+可借天数+图书超期每天罚款的金额

 图书类别=[一类图书|二类图书|三类图书|四类图书|五类图书|六类图书]

 可借天数=[10|20|30|40|50|60|70] 单位:天

 图书超期每天罚款的金额=[0.1|0.2] 单位:元

 系统用户=用户名+密码+是否是管理员

 用户名=1(字母|数字)16

 密码=1(字母|数字)8

 是否是管理员=[是管理员|不是管理员]

 是管理员=1

 不是管理员=0

 六、面向对象分析与设计

 6.1分析与设计方法

 本系统采用的是UML统一建模语言对系统进行的面向对象分析与设计,UML是一种定义良好易于表达、功能强大且普遍使用的结构化建模语言,融入了软件工程领域的新思想、新方法和新技术。是用面向对象的图形方式来描述系统。

  6.2用况模型

 6.3活动图

 6.4顺序图

 七、数据库分析与设计

 7.1数据库环境说明

 图书管理系统的数据库采用Microsoft Office Access2007

 数据库是一种存储数据并对数据进行操作的工具。数据库的作用在于组织和表达信息,简而言之,数据库就是信息的集合。计算机的数据库可以分为两类:非关系数据库(flat-file)和关系数据库(relational)。关系数据库中包含了多个数据表的信息,数据库含有各个不同部分的术语,象记录、域等。数据库之间的关系指明两个库之间共享一个共同的关键字值。一个连接是指一种虚拟的表,这种表是在当用户要求从相互关联的各个不同的表中获取信息时建立的,关键字段用于在相互连接的不同表中查找匹配的记录。一个更高级的连接形式称为自连接。这种连接是指一个表被连接到它自己的一个字段,或在不同的记录中由重复数据的组合字段。数据库中有三种不同类型的关键字:主关键字、组合关键字和外关键字。在表中使用的关键字类型用于描述库表示什么以及在数据库中如何与其它的库建立关系。

  Microsoft Access2007是在Windows环境下非常流行的桌面型数据库管理系统。使用Microsoft Access无需编写任何代码,只需通过直观的可视化操作就可以完成大部分数据管理任务。在Microsoft Access数据库中,包括许多组成数据库的基本要素。这些要素是存储信息的表、显示人机交互界面的窗体、有效检索数据的查询、信息输出载体的报表、提高

 应用效率的宏、功能强大的模块工具等。它不仅可以通过ODBC与其它数据库相连,实现数据交换和共享,还可以与Word、Excel等办公软件进行数据交换和共享,并且通过对象链接与嵌入技术在数据库中嵌入和链接声音、图像等多媒体数据。

  7.2数据库命名标准与规范

 1.数据库的命名:全部由英文字母组成。

  2.数据库表命名:表义名(可以使用缩写)

 如:英文单词首字母

 7.3数据库逻辑设计

 7.3.1逻辑设计步骤

 本系统的逻辑设计是将人事管理系统的数据库概念结构转化为Microsoft Office Access2007数据库系统所支持的实际数据模型,即:数据库的逻辑结构。采用自底向上的概念设计。此系统共建立六个数据表,如借阅者表、图书表、借阅表、借阅者类别表、图书类别表和系统用户表。

  7.3.2逻辑设计图

 1、图书管理系统E-R图

 2、图书管理系统详细E-R图

 7.4数据库物理设计

 7.4.1数据库物理设计步骤

 首先建立各表

 然后向各表中输入数据其各表信息如下

 1、借阅表

 2、借阅者表

 3、借阅者类别表

 4、 图书表

 5、 图书类别表

 6、 系统用户表

 7.4.2表、视图汇总

 视图/表名

 英文名

 类型

 说明

 借阅者表

 Borrower

 基本表

 存储借阅者信息

 图书表

 Book

 基本表

 存储图书信息

 借阅表

 BorrLend

 基本表

 存储被借阅的图书信息

 借阅者类别表

 BorrowerType

 基本表

 存储借阅者为普通用户还是管理员

 图书类别表

 BookType

 基本表

 不同的图书类别有不同的借阅天数

 系统用户表

 User

 基本表

 用户名和密码以及是否是管理员

 7.4.3各表、视图设计详解

 1、借阅者表

 字段中文名称

 英文名称

 是否关键字

 借阅卡号

 cardnum

 是

 姓名

 cardName

 否

 性别

 Sex

 否

 身份证号

 Personnum

 否

 单位

 Workplace

 否

 家庭住址

 Address

 否

 联系电话

 Phone

 否

 借阅者类别

 Type

 否

 办证日期

 Signdate

 否

 已借书数目

 Borrowernum

 否

 是否挂失

 Loss

 否

 2、图书表

 字段中文名称

 英文名称

 是否关键字

 图书号

 booknum

 是

 书名

 Bookname

 否

 作者

 Author

 否

 出版社

 Press

 否

 出版日期

 Pressdata

 否

 单价

 Price

 否

 图书类别

 Type

 否

 存放位置

 Site

 否

 入库日期

 Regdate

 否

 是否借出

 Islend

 否

 3、借阅表

 字段中文名称

 英文名称

 是否关键字

 借阅卡号

 Bl_cardnum

 是

 图书号

 Bl_booknum

 是

 姓名

 Bl_cardname

 否

 书名

 Bl_bookname

 否

 借出日期

 Borrowday

 否

 实际归还日期

 Returnday

 否

 罚款金额

 Fineminey

 否

 4、借阅者类别表

 字段中文名称

 英文名称

 是否关键字

 借阅者类别

 type

 是

 能借书数量

 Number

 否

 5、图书类别表

 字段中文名称

 英文名称

 是否关键字

 图书类别

 type

 是

 可借天数

 Daynum

 否

 图书超期每天罚款金额

 Punmoney

 否

 7、 系统用户表

 字段中文名称

 英文名称

 是否关键字

 用户名

 user

 是

 密码

 Passed

 是

 是否是管理员

 Isadmin

 否

 八、 人机界面设计

 8.1界面设计原则

  简单易用、简洁明了、兼容性好、标准、规范。

  8.2主界面设计

 主界面的设计采用标准系统登录样式,自上而下依次为:用户名、密码、选项、确定与取消等。所有系统用户拥有相似的主界面。主界面包含基本的或共享的功能,如图书馆介绍等。

  8.3子界面设计

 除系统中主要的、基本的功能之外,子系统或非共享功能的实现均采用子界面的设计来实现,如查询、添加图书信息、录入图书信息、密码初始化、修改密码、个人信息显示、删除图书、注销借阅者等。

  1、用户登录界面

 2、添加图书界面

 3、添加借阅者界面

 4、删除图书界面

 5、 删除借阅者界面

 6、 查询图书界面

 7、查询借阅者界面

 九、项目系统实现

 9.1 实现环境与技术

 在visual studio环境下启动系统后,将出现用户登录窗体,只有当用户以自己的身份并输入正确的用户名和密码,才能进入系统。当用户名或者密码错误连续达到三次以上者,便不能继续登录。

  设置三个RadioButton控件,供不同用户登录时选择用户权限,提高了数据库的安全性。

  两个文本框(textbox),用来输入用户名和密码。两个button按钮用来确定或者取消登录。

  当点击关闭按钮时,给出提示信息“你真的要退出吗?”,确定是否真的退出系统。

  9.2

 核心模块实现技术代码

 1.用户登录模块

 功能:本模块主要功能是实现对用户身份的鉴别。用户通过表单提供用户名、密码信息,系统根据用户提供的登录信息对用户进行身份查询鉴别。

  输入:用户名、密码、验证码。

  处理:

  (1)输入用户的登录信息。

  在页面提供的表单出输入用户的用户名、密码信息和验证码,点击“登录”按钮提交表单信息到身份验证页面。

  (2)从users表单获取输入数据。当用户单击“登录”按钮后,登录信息由form表单提交到check . asp进行处理。

  (3)用户身份进行验证。以输入数据“用户名”为查询条件创建数据集查看输入用户名是否存在。如果存在,继续检验密码是否正确。密码和用户名都正确,方能进入办公管理系统主页面;如果用户名不存在或密码不正确或验证码不正确,则给出登录失败的提示框,并返回首页重新登录。

  核心代码如下:

  void CloginDlg::OnOk()

 {

  CUserSet recordset;//创建系统用户记录集,其名字为CUserSet

  CString strSQL;

  ClibraryApp * ptheApp=(ClibraryApp *)AfxGetApp();

  UpdateData(TRUE);

  //检查用户是否输入

  if(m_strUser.Isempty())//如果用户没有输入

  {

 AfxMessageBox("请输入用户名");

 m_strUser.SetFocus();

 return;

  }

  if(m_strPass.IsEmpty())

  {

 AfxMessageBox("请输入密码");

 m_strPass.SetFocus();

 return;

  }

  //根据从控件中读出的用户名和密码在后台数据库中查找

  strSQL.Format("select * from user where user=%s and passwd=%s",m_strUser,m_strPass);

  if(!recordset.Open(AFX_DB_USE_DEFAULT,strSQL))//如果没能打开数据库

  {

 MessageBox("没能打开指定的数据库","数据库错误",MB_OK);

 return;

  }

  if(recordset.GetRecordCount()==0)//如果没能找到指定的用户

  {

 recordset.close();

 MessageBox("用户名或密码错误,请重新输入",MB_OK);

 m_strUser="";

 m_strPass="";

 m_strUser.SetFocus();

 UpdataData(False);

  }

  else

  {

 ptheApp->m_IsAdmin=recordset.m_isadimin;

 recordset.close();

 CDialog.OnOk();

  }

 }

 2、添加借阅者模块

 正如前面详细设计介绍的,当用户点击“添加借阅者”命令时,首先会显示一个对话框,这里供填写借阅者信息,当用户填写完成并点击“确定”以后,系统并不是立刻将用户填入的信息写入数据库,而是首先验证借阅卡号的合理性,对于不同的系统,借阅卡号的编码方式不同,本系统为方便起见,只对卡号是否大于零,进行验证,即只有卡号大于零的才是合法的借阅卡号,如果以后用户有对卡号的其他编码要求在进行添加,然后查找数据库验证卡号的唯一性,只有这个新加入的卡号与数据库中的卡号没有重复的才可以添加,另外需要说明的是,在本系统中,

 借阅者的办证日期不是手工输入的,而是通过读取系统时间获得的。具体代码如下。

  {

  CDfalong::OnInitDialog();

  CBorrowerTypeSet recordset;

  CString strSQL;

  UpdateData(TRUE);

  strSQL="select * from BorrowerType";

  if(!recordset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开借阅者类别表",MB_OK);

 return;

  }

  while(!recordset.IsEof())

  {

 dlg.m_sType.AddString(recordset.m_type);

 recordset.MoveNext();

  }

  recordset.Close();

  return true;

 }

 {

 CAddDlg dlg;

 if(dlg.DoModal==IDOK)

  {

  if(dlg.m_nID<=0)

 {

  MessageBox("用户的借阅卡号必须大于0",MB_OK);

  return;

 }

  if(m_BorrowerSet.IsOpen()==true)

  m_BorrowerSet.close();

  //下面要看此借阅卡号在原来的表中是否已有记录

  CString BFilter;

 BFilter.Format("借阅卡号-%d",dlg.m_nID);

 m_BorrowerSet.m_strFilter=BFilter;

 m_BorrowerSet.open();

  if(m_BorrowerSet.GetRecordCount()>0)//确实和已有的卡号冲突

 {

 MessageBox("此借阅卡号已经存在,请重新输入",MB_OK);

 m_BorrowerSet.close();

  return;

 }

 m_BorrowerSet.close();

 m_BorrowerSet.m_strFilter="";

 m_BorrowerSet.open();

  m_BorrowerSet.MovLast();

  //添加借阅卡记录

  m_BorrowerSet.AddNew();

 m_BorrowerSet.m_CardNum=dlg.m_nID;

 m_BorrowerSet.m_CardName=dlg.m_sName;

 m_BorrowerSet.m_sex=dlg/m_cSex;

 m_BorrowerSet.m_personNum=dlg.m_nperID;

 m_BorrowerSet.m_workplace=dlg.m_sWplace;

 m_BorrowerSet.m_address=dlg.m_sAddress;

 m_BorrowerSet.m_phone=dlg.m_nPhone;

 m_BorrowerSet.m_type=dlg.m_sType;

  int year=dlg.m_oleDate.GetYear();

 int monte=dlg.m_oleDate.GetMonth();

  int date=dlg.m_oleDate.Getdate();

 m_BorrowerSet.m_signdate=CTime(year,mouth,day,0,0,0);

  m_BorrowerSet.m_BorrowerNum=0;

  m_BorrowerSet.m_loss=0;

  m_BorrowerSet.Update();

  m_BorrowerSet.close();

  CDialog::OnOk();

  }

 }

 3、查询借阅者模块

 {

  CDfalong::OnInitDialog();

  //设置显示“借阅卡”信息的类表表头

  m_ctrList.InsertColumn(0,"借阅卡号");

  m_ctrList.InsertColumn(1,"姓名");

  m_ctrList.InsertColumn(2,"性别");

  m_ctrList.InsertColumn(3,"身份证号");

  m_ctrList.InsertColumn(4,"单位");

  m_ctrList.InsertColumn(5,"家庭住址");

  m_ctrList.InsertColumn(6,"联系电话");

  m_ctrList.InsertColumn(7,"借阅者类别");

  m_ctrList.InsertColumn(8,"办证日期");

  m_ctrList.InsertColumn(9,"已借书数目");

  m_ctrList.InsertColumn(10,"是否挂失");

  //设置没一列的宽度

 m_ctrList.SetColumnWidth(0,100);

  m_ctrList.SetColumnWidth(1,130);

  m_ctrList.SetColumnWidth(2,80);

  m_ctrList.SetColumnWidth(3,100);

  m_ctrList.SetColumnWidth(4,200);

  m_ctrList.SetColumnWidth(5,160);

  m_ctrList.SetColumnWidth(6,100);

  m_ctrList.SetColumnWidth(7,130);

  m_ctrList.SetColumnWidth(8,120);

  m_ctrList.SetColumnWidth(9,30);

  m_ctrList.SetColumnWidth(10,30);

  //用借阅者类别表里的信息填充查询控件

  CBorrowerTypeSet recordset;

  CString strSQL;

  UpdateData(TRUE);

  strSQL="select * from BorrowerType";

  if(!recordset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开借阅者类别表",MB_OK);

 return;

  }

  while(!recordset.IsEof())

  {

 dlg.m_sType.AddString(recordset.m_type);

 recordset.MoveNext();

  }

  recordset.Close();

  return true;

 }

 {

  m_ctrList.DeleteAllItems();

  m_ctrList.SetRedraw(FALSE);

  UpdateData(TRUE);

  //构造根据用户输入条件的SQL语句

  CString strSQL;

  if(m_strCardNum.IsEmpty()&&m_strType.IsEmpty())

  {

 strSQL="select * from borrower";

  }

  else if(m_strType.IsEmpty())

  {

 strSQL.Format("select * from borrower where cardnum='%s',//m_strCardNum);

  }

  else if(m_strCardNum.IsEmpty())

  {

 strSQL.Format("select * from borrower where type='%s',//m_strCardType);

  }

  else

  {

 strSQL.Format("select * from borrower where type='%s' and cardnum='%s',//m_strCardType,m_strCardNum);

  }

  if(!m_BorrowerSet.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开相应的数据库",MB_OK);

 return;

  }

  //将满足条件的借阅者信息显示在列表控件中

  int i=0;

  CString strTime;

  while(!m_BorrowerSet.IsEof())

  {

  m_ctrList.InsterItem(i,m_BorrowerSet.m_CardNum);

  m_ctrList.SetItemText(i,1,m_BorrowerSet.m_CardName);

 m_ctrList.SetItemText(i,2,m_BorrowerSet.m_sex);

  m_ctrList.SetItemText(i,3,m_BorrowerSet.m_personNum);

  m_ctrList.SetItemText(i,4,m_BorrowerSet.m_workplace);

  m_ctrList.SetItemText(i,5,m_BorrowerSet.m_address);

  m_ctrList.SetItemText(i,6,m_BorrowerSet.m_phone);

  m_ctrList.SetItemText(i,7,m_BorrowerSet.m_type);

 strTime.Format("%d-%d-%d",m_BorrowerSet.m_signdate.GetYear(),m_BorrowerSet.m_signdate.GetMouth(),m_BorrowerSet.m_signdate.GetDay());

  m_ctrList.SetItemText(i,8,strTime);

  m_ctrList.SetItemText(i,9,m_BorrowerSet.m_BorrowerNum);

  m_ctrList.SetItemText(i,10,m_BorrowerSet.m_loss);

 i++;

  }

  m_BorrowerSet.close();

 m_ctrList.setRedraw(TRUE);

 }

 4、删除借阅者模块

 {

  UpdateData();

  //获取用户需要删除的记录号

  int i=m_ctrList.GetSelectionMark();

  CString strSQL;

  strSQL.Format("select * from Borrower where cardnum='%s',m_ctrList.GetItemText(i,0)");

  if(!m_BorrowerSet.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开相应的数据库",MB_OK);

 return;

  }

  //检查该借阅者是否还有没还的书

  if(m_BorrowerSet.borrowerNum!=0)

  {

 MessageBox("此借阅者还有未还的图书,不能删除",MB_OK);

 m_BorrowerSet.close();

 return;

  }

  if(MessageBox("你是否真的确定要删除这条记录?",MB_OKCANCEL)==IDOK)

 {

 m_BorrowerSet.Delete();

 m_BorrowerSet.close();

 MessageBox("记录删除成功!",MB_OK);

 m_ctrList.DeleteItem();

 UpdateData(FALSE);

  }

  else

  {

  m_BorrowerSet.close();

 return;

  }

 }

 5、修改借阅者模块

 {

  //首先获取用户选择的记录号

  int i=m_ctrList.GetSelectionMark();

  if(i<0)

  {

 MessageBox("请选择一条记录进行修改",MB_OK);

 return;

  }

  //用用户选中的记录来填充数据编辑框的内容

  CEditDlg dlg;

  dlg.m_nID=m_ctrList.GetItemText(i,0);

  dlg.m_sName=m_ctrList.GetItemText(i,1);

  dlg.m_nSex=m_ctrList.GetItemText(i,2);

  dlg.m_nPerID=m_ctrList.GetItemText(i,3);

  dlg.m_sWplace=m_ctrList.GetItemText(i,4);

  dlg.m_sAddress=m_ctrList.GetItemText(i,5);

  dlg.m_nPhone=m_ctrList.GetItemText(i,6);

  dlg.m_sType=m_ctrList.GetItemText(i,7);

  dlg.m_sSigndate=m_ctrList.GetItemText(i,8);

  dlg.m_nBorrNum=m_ctrList.GetItemText(i,9);

  dlg.m_sLoss=m_ctrList.GetItemText(i,10);

  //如果用户点击ok

  if(dlg.DoModal()==IDOK)

  {

 CString strSQL;

  strSQL.Format("select * from Borrower where cardnum='%s',m_ctrList.GetItemText(i,0)");

 if(!m_BorrowerSet.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

 {

  MessageBox("无法打开借阅者表",MB_OK);

  return;

 }

 m_BorrowerSet.edit();

  m_BorrowerSet.m_workplace=dlg.m_sWplace;

  m_BorrowerSet.m_address=dlg.m_sAddress;

  m_BorrowerSet.m_phone=dlg.m_nPhone;

  m_BorrowerSet.m_type=dlg.m_sType;

  m_BorrowerSet.m_borrowerdNum=dlg.m_nBorrNum;

  m_BorrowerSet.m_loss=dlg.m_sLoss;

 m_BorrowerSet.update();

 m_BorrowerSet.close();

  Refreshdata();

  }

 }

 6、 添加图书

 {

  //下面的代码是当用户点击了确定按钮后的代码

  UpdateData();

  //检查各个输入项是否有空的

  if(m_strBookNum.IsEmpty())

  {

 MessageBox("图书号不能为空",MB_OK);

 return;

  }

  if(m_strBookName.IsEmpty())

  {

 MessageBox("图书名不能为空",MB_OK);

 return;

  }

  if(m_strBookAuthor.IsEmpty())

  {

 MessageBox("作者名不能为空",MB_OK);

 return;

  }

  if(m_strType.IsEmpty())

  {

 MessageBox("图书类别不能为空",MB_OK);

 return;

  }

  CBookSet recordset;

  CString strSQL;

  strSQL.Format("select * from Book where booknum='%s'",m_strBookNum);

  if(!recordset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开图书表",MB_OK);

 return;

  }

  if(recordset.GetRecordCount()!=0)

  {

 MessageBox("此图书号已经存在,请重新输入",MB_OK);

 recordset.Close();

 return;

  }

  recordset.Close();

  if(!recordset.open(AFX_DB_USE_DEFAULT_TYPE))

  {

 MessageBox("无法打开图书表",MB_OK);

 return;

  }

  //具体添加一个图书记录

  recordset.AddNew();

  recordset.m_bookNum=m_strBookNum;

  recordset.m_bookName=m_strBookName;

  recordset.m_author=m_strAuthor;

  recordset.m_press=m_strPress;

  recordset.m_pressdate=m_tmPressDate;

  recordset.m_price=m_strPrice;

  recordset.m_type=m_strType;

  recordset.m_site=m_strSite;

  recordset.m_regdate=m_tmRegDate;

  recordset.m_islend=m_strIslend;

  recordset.Update();

  recordset.Close();

  if(MessageBox("已经成功输入该图书,是否继续输入下一个图书?",MB_OKCANCEL)==IDOK)

 return;

  CDialog::OnOk;

 }

 7、 查询图书

 {

  //首先清空结果列表框

  m_ctrList.DeleteAllItems();

  m_ctrSetRedraw(FALSE);

  UpdateData(TRUE);

  //构造根据用户输入条件的sQl语句

  CString strSQL;

  if(m_strBookNum.IsEmpty()&&m_strType.IsEmpty())

  {

 strSQL="select * from book";

  }

  else if(m_strType.IsEmpty())

  {

 strSQL.Format=("select * from book where booknum='%s',m_strBookNum");

  }

  else

  {

 strSQL.Format=("select * from book where type='%s' and booknum='%s',m_strType,m_strBookNum");

  }

  if(!m_BorrowerSet.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开相应的数据库",MB_OK);

 return;

  }

  int i=0;

  CString strTime;

  while(!m_recordset.IsEof())

  {

 m_ctrList.InsertItem(i,m_recordset.m_bookNum);

 m_ctrList.SetItemText(i,1,m_recordset.m_bookName);

 m_ctrList.SetItemText(i,2,m_recordset.m_author);

 m_ctrList.SetItemText(i,3,m_recordset.m_press);

  strTime.Format("%d-%d-%d",m_recordset.m_pressdate.GetYear(),m_recordset.m_pressdate.GetMouth(),m_recordset.m_pressdate.GetDay());

 m_ctrList.SetItemText(i,4,strTime);

 m_ctrList.SetItemText(i,5,m_recordset.m_price);

 m_ctrList.SetItemText(i,6,m_recordset.m_type);

 m_ctrList.SetItemText(i,7,m_recordset.m_site);

  strTime.Format("%d-%d-%d",m_recordset.m_regdate.GetYear(),m_recordset.m_regdate.GetMouth(),m_recordset.m_regdate.GetDay());

 m_ctrList.SetItemText(i,8,strTime);

 m_ctrList.SetItemText(i,9,m_recordset.islend);

 i++;

 m_recordset.MoveNext;

  }

  m_recordset.Close();

  m_ctrList.seetRedraw(TURE);

 }

 8、删除图书模块

 {

  //首先获取用户选择的记录号

 int i=m_ctrList.GetSelectionMark();

  if(i<0)

  {

 MessageBox("请选择一条记录进行删除;",MB_OK);

 return;

  }

  CString strSQL;

  strSQL.Format=("select * from book where booknum='%s'",m_ctrList.GetItemText(i,0));

  if(!m_recordset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开图书表",MB_OK);

 return;

  }

  //检查图书是否被借出,如果被借出则不能删除该记录

  if(m_recordset.islend=1)

  {

 MessageBox("此图书正被借阅不能删除该图书",MB_OK);

 m_recordset.Close();

 return;

  }

  //再次询问该用户是否真的要删除此记录

  if(MessageBox("你是否真的确定要删除这条记录?",MB_OKCANCEL==IDOK))

  {

 m_recordset.Delete();

 m_recordset.Close();

 MessageBox("记录删除成功",MB_OK);

 m_recordset.DeleteItem(i);

 UpdateData(FALSE);

  }

  else

  {

 m_recordset.Close();

 return;

  }

 }

 9、修改图书模块

 //当用户点击了修改按钮后的代码为

 {

  //首先获取用户选择的记录号

 int i=m_ctrList.GetSelectionMark();

  if(i<0)

  {

 MessageBox("请选择一条记录进行修改;",MB_OK);

 return;

  }

  CString strSQL;

  dlg.m_strSite=m_ctrList.GetItemText(i,7);

  if(dlg.DoModal()==IDOK)

  {

 CString strSQL;

  strSQL.Format=("select * from book where booknum='%s'",m_ctrList.GetItemText(i,0));

  if(!m_recordset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

 {

  MessageBox("无法打开图书表",MB_OK);

  return;

 }

  }

  m_recordset.edit;

  m_recordset.msite=dlg.m_strSite;

  m_recordset.update();

  m_recordset.Close();

  Refreshdata();

 }

 10、借书管理模块

 //借阅卡信息的显示

 {

  //借书管理中读者信息的显示

  UpdateData();

  CBorrowerSet recordset;

  CString strSQL;

  strSQL.Format=("select * from Borrower where cardnum='%s',m_strCarNum");

  if(!recordset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开数据库",MB_OK);

 return;

  }

  if(recordset.GetRecordCount()==0)

  {

 MessageBox("此卡号没有对应记录",MB_OK);

 recordset.Close();

 return;

  }

  if(recordset.m_loss==1)

  {

 m_strLoss="已挂失";

 MessageBox("此借阅卡已挂失,不能再借书",MB_OK);

  recordset.Close();

 return;

  }

  m_strName=recordset.m_cardName;

  m_strType=recordset.m_type;

  m_mBorrNum=recordset.m_borrowerdNum;

  recordset.Close();

  //根据此借阅者的类型,获得此借阅卡最多可借阅的书的的数目

  CBorrowerTypeSet.Borr_typeset;

  strSQL.Format("select * from BorrowerType where type='%s'",m_strType);

  if(!Borr_typeset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开对应数据库",MB_OK);

 return;

  }

  if(Borr_typeset.GetRecordCount()==0)

  {

 MessageBox("目前读者类型为空,请输入读者类型",MB_OK);

 Borr_typeset.Close();

 return;

  }

  m_mMavnumber=Borr_typeset.m_number;

  Borr_typeset.Close();

  m+nUnBorr=m_mMavnumber-m_nBorrNum;

  UpdateData(FALSE);

 }

 //预借图书信息的显示

 {

  UpdateData();

  //根据图书号获得整个图书记录的信息

  CBookSet bookset;

  CString strSQL;

  strSQL.Format("select * from Book where booknum='%s'",m_strBookNum);

  if(!bookset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开对应数据库",MB_OK);

 return;

  }

  if(bookset.GetRecordCount()==0)

  {

 MessageBox("此图书号没有对应记录,请重新输入",MB_OK);

 bookset.Close();

 return;

  }

  if(m_IsLend)

  {

 MessageBox("此书籍已被借出",MB_OK);

 bookset.Close();

 return;

  }

  m+strBookName=bookset.m_bookName;

  m+strBookType=bookset.m_booktype;

  //根据图书类型查找并显示该图书可借阅天数

  CBookTypeSet booktypeset;

  strSQL.Format("select * from Booktype where type='%s'",m_strBookType);

  if(!booktypeset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开对应数据库",MB_OK);

 return;

  }

  if(booktypeset.GetRecordCount()==0)

  {

 MessageBox("此图书号没有对应记录,请重新输入",MB_OK);

 bookset.Close();

 return;

  }

  m_nDaynum=booktypeset.m_daynum;

  booktypeset.Close();

  UpdateData(FALSE);

 }

 //具体的借书处理

 {

  if(m_nUnBorr==0)

  {

 MessageBox("此借阅者已经借满书,不能再借!",MB_OK);

 return;

  }

  //修改对应的借阅者记录

  CBorrowerSet recordset;

  CString strSQL;

  strSQL.Format("select * from Borrower where cardnum='%s'",m_strCardNum);

  if(!recordset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开对应数据库",MB_OK);

 return;

  }

  if(recordset.GetRecordCount()==0)

  {

 MessageBox("此卡号没有对应记录,请重新输入",MB_OK);

 recordset.Close();

 return;

  }

  recordset.edit();

  recordset.m_borrowerdNum=recordset.m_borrowerdNum+1;

  recordset.Update();

  recordset.Close();

  //修改对应的图书信息记录

  CBookSet bookset;

  CString strSQL;

  strSQL.Format("select * from Book where booknum='%s'",m_strBookNum);

  if(!bookset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开对应数据库",MB_OK);

 return;

  }

  if(bookset.GetRecordCount()==0)

  {

 MessageBox("此图书号没有对应记录,请重新输入",MB_OK);

 bookset.Close();

 return;

  }

  bookset.edit();

  bookset.m_IsLend=1;

  bookset.Update();

  bookset.Close();

  //增加一条借阅记录

  CBorrLendSet borrlendset;

  CString strSQL;

  strSQL.Format("select * from BorrLend");

  if(!borrlendset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开对应数据库",MB_OK);

 return;

  }

  borrlendset.AddNew();

  borrlendset.m_bl_cardnum=m_strCardNum;

  borrlendset.m_bl_booknum=m_strBookNum;

  borrlendset.m_bl_cardname=m_strName;

  borrlendset.m_bl_bookname=m_strBookName;

  borrlendset.m_borrowday=CTime::GetCurrentTime();

  borrlendset.m_finemoney=0;

  borrlendset.Update();

  borrlendset.Close();

  UpdateData(FALSE);

  Refreshdata();

  //更新界面显示该借阅卡所有已经解约的记录信息

 }

 //函数的具体实现

 Refreshdata()

 {

  //第一步先清空列表框

  m_ctrList.DeleteAllItems();

  m_ctrList.SetRedraw(FALSE);

  UpdateData(TRUE);

  //此借阅者的信息已经显示在列表框中

  //这里只显示尚未归还的图书信息,已经归还的不予显示

  CString strSQL;

 strSQL.Format("select * from BorrLend where bl_cardnum='%s' and returnday is null,m_strCardNum");

  if(!borrlendset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开对应数据库",MB_OK);

 return;

  }

  int i=0;

  CString st_begin,st_end;

  CTime time_temp;

  while(!m_BorrLendSet.IsEof())

  {

 m_ctrList.InsterItem(i,m_BorrLendSet.m_bl_booknum);

 m_ctrList.SetItemText(i,1,m_BorrLendSet.m_bl_bookname);

 st_begin.Format("%d-%d-%d",m_BorrLendSet.m_borrowday.GetYear(),m_BorrLendSet.m_borrowday.GetMonth(),m_BorrLendSet.m_borrowday.GetDay());

 m_ctrList.SetItemText(i,2,st_begin);

 time_temp=m_BorrLendSet.m_borrowday+m_nDaynum*24*3600;

 st_end.Format("%d-%d-%d",time_temp.m_borrowday.GetYear(),time_temp.m_borrowday.GetMonth(),time_temp.m_borrowday.GetDay());

 m_ctrList.SetItemText(i,2,st_end);

 i++;

 m_BorrLendSet.MoveNext();

  }

  m_BorrLendSet.Close();

  m_ctrList.setRedraw(TURE);

 }

 11、还书管理模块

 {

  //根据图书号,查找并显示相关信息

  UpdateData();

  CString strSQL;

  strSQl.Format("select * from BorrLend where bl_booknum='%s' and returnday is null",m_strblbnum);

  if(!m_borrlendset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开对应数据库",MB_OK);

 return;

  }

  if(m_borrlendset.GetRecordCount()==0)

  {

 MessageBox("此图书没有借出,请重新输入",MB_OK);

 m_borrlendset.Close();

 return;

  }

  //显示相应的借还信息

  m_strblbname=m_borrlendset.m_bl_bookname;

  m_strblcnum=m_borrlendset.m_bl_cardname;

  m_strblcname=m_borrlendset.m_bl_cardname;

  m_tmblbdate=m_borrlendset.m_bl_borrowday;

  CTime should_return=m_BorrLendset.m_borrowday+m_nDaynum*24*3600;

  CTime return_day=CTime::GetCurrentTime();

  CString strDay;

  m_strreday=strDay.Format("%d-%d-%d",return_day.m_borrowday.GetYear(),return_day.m_borrowday.GetMonth(),return_day.m_borrowday.GetDay());

  if(return_day>should_return)

 m_nPunDay=(int)(return_day-should_return).GetDays();

  else

 m_nPunDay=0;

  //根据书名得到书的类别

  CBookSet book;

  CString strSQL;

  strSQl.Format("select * from Book where bl_booknum='%s'",m_strblbnum);

  if(!book.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开对应数据库",MB_OK);

 return;

  }

  //查找对应书类别的每天罚款额度

  CBookTypeSet rs;

  CString strSQL;

  strSQl.Format("select * from BookType where type='%s'",book.type);

  if(!rs.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开对应数据库",MB_OK);

 return;

  }

  book.Close();

  rs.Close();

  //根据超期天数和每天罚款额度,计算总的罚款金额,并显示在相应的控件上

  m_ftotalPun(float)(m_nPunDay*(atof(rs.punmoney)));

  m_borrlendset.Close();

  UpdateData(FALSE);

  //设置归还按钮为可点击状态

  m_bntReturn.EnableWindow(TURE);

 }

 //归还按钮的点击实现代码如下

 {

  UpdateData();

  CString strSQL;

  CBookSet bkset;

  strSQl.Format("select * from Book where booknum='%s'",m_strblbnum);

  if(!bkset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开对应数据库",MB_OK);

 return;

  }

  bkset.edit();

  bkset.m_islend=0;

  bkset.Update();

  bkset.Close();

  CBorrowerSet borrset;

  strSQl.Format("select * from Borrower where cardnum='%s'",m_strblcnum);

  if(!borrset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开对应数据库",MB_OK);

 return;

  }

  borrset.edit();

  borrset.m_borrowerNum=borrset.m_borrowerNum-1;

  borrset.Update();

  borrset.Close();

  //将实际借还日期和刚刚计算出的总罚款金额写入借还表的相应字段

  strSQl.Format("select * from BorrLend where bl_booknum='%s' and returnday is null",m_strblbnum);

  if(!m_borrlendset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开对应数据库",MB_OK);

 return;

  }

  m_borrlendset.edit();

  m_borrlendset.m_returnday=CTime::GetCurrentTime();

  char buffer[7[;

  gcvt(m_ftotalPun,7,buffer);

  m_borrlendset.m_finemoney=buffer;

  m_borrlendset.Update();

  m_borrlendset.Close();

  MessageBox("你已经成功地还了一本书",MB_OK);

  //返回还书界面,并将界面的各个控件清空

  OnButtonClear();

 }

 //如果用户想要放弃此次操作,点击取消按钮的实现代码为

 {

  //代码主要是将控件清空以便下次输入

  m_strblbnum=_T" ";

  m_strblbname=_T" ";

  m_strblcnum=_T" ";

  m_strblcname=_T" ";

  m_tmbibdate=m_borrlendset.m_borrowday;

  m_strreday=_T" ";

  m_nPunDay=0;

  m_ftotalPun=0.0;

  //设置归还按钮为不可点击状态

  m_bntReturn.EnableWindow(FALSE);

 }

 12、查询借还记录模块

 //点击了查询按钮后的实现代码如下

 {

  UpdateData(TRUE);

  CString strSQL;

  if(m_strborrnum.IsEmpty()&&m_strborbnum.IsEmpty())

  {

 strSQL="select * from BorrLend";

  }

  else if(m_strborrnum.IsEmpty())

  {

 strSQL.Format("select * from BorrLend where bl_booknum='%s'",m_strborbnum);

  }

  else

  {

 strSQL.Format("select * from BorrLend where bl_cardnum='%s' and bl_booknum='%s'",m_strborrnum,m_strborbnum);

  }

  if(!m_brset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开对应数据库",MB_OK);

 return;

  }

  int i=0;

  CString strTime;

  while(!m_m_brset.IsEof())

  {

 m_ctrList.InsertItem(i,m_brset.m_bl_cardnum);

 m_ctrList.SetItemText(i,1,m_brset.m_bl_booknum);

 m_ctrList.SetItemText(i,2,m_brset.m_bl_cardname);

 m_ctrList.SetItemText(i,3,m_brset.m_bl_bookname);

  strTime.Format("%d-%d-%d",m_brset.m_borrowday.GetYear(),m_brset.m_borrowday.GetMonth(),m_brset.m_borrowday.GetDay());

 m_ctrList.SetItemText(i,4,strTime);

  strTime.Format("%d-%d-%d",m_brset.returnday.GetYear(),m_brset.returnday.GetMonth(),m_brset.returnday.GetDay());

 m_ctrList.SetItemText(i,5,strTime);

 m_ctrList.SetItemText(i,6,m_brset.m_finemoney);

 i++;

 m_brset.MoveNext();

  }

  m_brset.Close();

  m_ctrList.setRedraw(TURE);

 }

 13、删除借还记录模块

 {

  //首先获得用户选择的记录号

  int i=m_ctrList.GetSelectionMark();

  if(i>0)

  {

 MessageBox("请选择某一条记录进行删除",MB_OK);

 return;

  }

  //检查要删除记录的借阅卡号,在借阅卡表中是否有记录

  //如果有,说明这个用户还在正常使用,则其借阅记录不能删除

  CString strSQL;

  strSQL.Format("select * from Borrower where booknum='%s'",m_strborrnum);

  if(!borr.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开对应数据库",MB_OK);

 return;

  }

  if(borr.GetRecordCount()==0)

  {

 MessageBox("此借阅卡仍在使用,不能删除对应的借还记录",MB_OK);

 borr.Close();

 return;

  }

  else

  {

  CString strSQL;

 strSQL.Format("selece * from BorrLend where bl_cardnum='%s' and bl_booknum='%s'",m_ctrList.GetItemText(i,0),m_ctrList.GetItemText(i,2));

 if(!borrlend.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

 {

  MessageBox("无法打开对应数据库",MB_OK);

 return;

 }

 if(MessageBox("你是否真的要删除这条记录",MB_OKCANCEL)==IDOK)

 {

  borrlend.Delete();

  borrlend.Close();

  MessageBox("记录删除成功",MB_OK);

  m_ctrList.DeleteItem(i);

  UpdateData(FALSE);

 }

 else

 {

  borrlend.Close();

  return;

 }

  }

 }

 14、添加新用户模块

 //此模块只能给管理员使用。

  {

  //下面的代码是用户点击了提交按钮后的相应代码

  UpdateData();

  //检查各个输入项是否有空的

  if(m_strUseNum.IsEmpty())

  {

 MessageBox("用户名不能为空",MB_OK);

 return;

  }

  if(m_strPasswd.IsEmpty())

  {

 MessageBox("密码不能为空",MB_OK);

 return;

  }

  if(m_strPasswd!=m_strRePasswd)

  {

 MessageBox("两次密码不一样,请重新输入密码",MB_OK);

 m_strPasswd="";

 m_strRePasswd="";

 m_ctrPasswd.SetFocus();

 UpdateData(FALSE);

 return;

  }

  CUserSet recordset;

  CString strSQL;

  strSQL.Format=("select * from ser where usename='%s',m_strUseName);

  if(!recordset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开系统用户表",MB_OK);

 return;

  }

  if(recordset.GetRecordCount()!=0)

  {

 MessageBox("此用户名已经存在,请重新输入",MB_OK);

 recordset.Close();

 return;

  }

  recordset.Close();

  if(!recordset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开系统用户表",MB_OK);

 return;

  }

  //具体添加一个系统用户

  recordset.AddNew();

  recordset.m_usename=m_strUsename;

  recordset.m_Passwd=m_strPasswd;

  recordset.m_isadmin=m_bIsAdmin;

  recordset.Update();

  MessageBox("已成功输入该用户,请记住用户名,密码",MB_OKCANCEL);

 recordset.Close();

  Refreshdata();

 }

 15、查询用户模块

 {

  //查询用户

  UpdateData(TRUE);

  CUserSet recordset;

 CString strSQL;

  strSQL.Format=("select * from ser where usename='%s',m_strDelName);

  if(!recordset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开系统用户表",MB_OK);

 return;

  }

  if(recordset.GetRecordCount()==0)

  {

 MessageBox("系统中没有该用户,请重新输入用户名",MB_OK);

 recordset.Close();

 return;

  }

  //显示用户的密码及其是不是管理员

  {

 m_strSearPasswd=recordset.m_Psaawd;

 m_strSearIsAdmin=m_recordset.m_isadmin;

 recordset.Close();

 UpdateData(FALSE);

  }

 }

 16、删除用户模块

 {

  //当用户点击删除按钮后

  UpdateData(TRUE);

  CUserSet recordset;

 CString strSQL;

  strSQL.Format=("select * from ser where usename='%s',m_strDelName);

  if(!recordset.open(AFX_DB_USE_DEFAULT_TYPE),strSQL)

  {

 MessageBox("无法打开系统用户表",MB_OK);

 return;

  }

  if(recordset.GetRecordCount()==0)

  {

 MessageBox("系统中没有该用户,请重新输入用户名",MB_OK);

 recordset.Close();

 return;

  }

  if(MessageBox("你是否真的确定要删除这条记录?",MB_OKCANCEL==IDOK))

  {

 recordset.Delete();

 recordset.Close();

 MessageBox("记录删除成功",MB_OK);

 UpdateData(FALSE);

  }

  else

  {

 recordset.Close();

 return;

  }

 }

 17、修改用户模块

 {

  //修改用户密码的实现代码

  recordset.edit();

  recordset.m_strUpName=m_strUpName;

  recordset.m_passwd=strUpPasswd;

  recordset.m_isadmin=m_bUpIsAdmin;

  recordset.update();

  MessageBox("用户记录修改成功,请记住用户名,密码",MB_OK);

  recordset.Close();

 }

 十、软件测试分析报告

 10.1测试范围与主要内容

 测试范围

 主要内容

 简要说明

 系统登陆验证

 验证用户身份,进行权限控制

 功能性测试

 信息检索功能测试

 测试数据库检索代码的健壮性

 功能性测试

 图书管理功能测试

 测试系统实用性、方便性

 功能性测试

 数据完整性测试

 测试登记失败时的数据完整性控制

 功能性测试

 核心代码复检

 检验核心代码的质量

 逻辑检错性测试

 10.2测试方法

 1、系统的测试方法

  针对本系统各个模块的功能集中于对数据库的处理以及对用户交互界面的的设计,系统内部并没有涉及复杂的算法和数据结构,因此制定的测试方法是以注重测试功能的黑盒测试为主如果需要的话,可以对个别重要的模块辅以白盒测试,以保证系统的正确性。

  2、系统的测试步骤

  先进行单元测试、在进行集成测试,遵循自底向上的策略,对于每一个测试用例都要考虑到合法和非法的测试情况。

  10.3测试过程

 10.3.1 系统测试

 根据前面的需求分析的功能描述,本系统主要有系统登录、借阅者管理图书管理、借阅管理、基本信息管理五部分。所以系统的测试主要围绕着这些模块展开,需要说明的是,在前面的编码中,为了使系统具有更好的交互性,在上述的每个模块里设置了相应的出错处理,对于这些出错处理的部分,也要给出相应的测试,这部分的测试可放在各个子模块里。

  测试1:系统登录测试

 测试系统的登录界面是否正确、合理。对于合法的用户是否能够转入正确的界面,对于非法的用户是否进行正确的处理。

  测试 2:借阅者管理测试

 根据前面的详细设计,可知该模块共有四个子模块,因此需对这四个子模块先分别进行单元测试,即测试“添加借阅者”、“修改借阅者”、“删除借阅者”、“查询借阅者”,然后在进行集成测试。

  测试2.1 添加借阅者测试

 首先需要测试当用户填写了正确的借阅者信息后,能否成功提交;还要测试当用户提交了含有错误的信息时,能否被拒绝,并正确的指出出错位置。

  测试2.2 修改借阅者测试

 首先需要测试是不是只有允许修改的字段才能修改,对于不允许修改的字段是不能修改的;对于允许修改的字段,先给正确的修改值,看能否正确提交,再给错误的修改值,看能否被拒绝,并给出正确的提示。

  测试2.3 删除借阅者测试

 要测试当用户确定要删除后,该记录是否真的被删除,以及当用户放弃删除时,该记录是否还在。

  测试2.4 查询借阅者测试

 首先需要测试当输入一个合法的条件时,能否给出满足条件的借阅者;其次需要测试当输入一个非法的条件时,能否给出正确的提示。

  需要说明的是,在“修改借阅者测试”、“删除借阅者测试”中,都可能要先调用“查询借阅者”来找到指定的借阅者,对于这些,在“修改”和“删除”中不予测试,而是把它放在“查询”中测试。在下面的其他测试中,也是类似,以后不再重复说明。

  测试3:图书管理测试

 根据前面的详细设计,可知该模块也有四个子模块,因此需对这四个子模块先分别进行单元测试,即测试“添加图书”、“修改图书”、“删除图书”、“查询图书”,然后在进行集成测试。

  测试3.1 添加图书测试

 首先需要测试当某些该填写的信息没有输入时,系统是否能够给出正确的提示;还需要测试当所有信息都填入但是新输入的图书号在后台表中已有时,能否给出正确的提示;最后需要测试当输入一个正确的记录时,能否成功提交。

  测试3.2 修改图书测试

  需要测试:当用户没有点击任何记录时,系统能否给出相应的提示,当用户选择了某条记录时,能否将满足条件的记录正确的显示在相应的编辑框中,用户修改后,能否正确的提交。

  测试3.3 删除图书测试

 首先需要测试当用户没有选中任何记录时,系统能否给出相应的提示,还需要测试当用户选中了某一条记录进行删除时,能否给出“是否确定删除”的提示,并且分别点击“确定”和“取消”能够进行正确的处理。

  测试3.4 查询图书测试

 首先需要测试当“图书号”和“图书类型”都不为空时,系统能否进行正确的处理。还需要测试当其中一个为空时,能否进行正确的处理;最后还要测试当二者都为空时,能否进行正确的处理。

  测试 4:借阅管理测试

 根据前面的详细设计,可知该模块也有四个子模块,因此需对这四个子模块先分别进行单元测试,即测试“借书”、“还书”、“删除借还信息”、“查询借还信息”,然后在进行集成测试。

  测试4.1 借书测试

 首先需要测试当输入正确的借阅卡号,能否正确显示该借阅卡的信息,以及当输入错误的借阅卡号时,能否给出相应的提示;接着需要测试当输入正确的图书号,能否正确显示该图书的信息,以及

 当输入错误的图书号时,能否给出相应的提示;最后需要测试当同时输入正确的借阅卡号和图书号时,能否进行正确的借书处理(包括可以借书以及不能借书都要测试)。

  测试4.2 还书测试

 首先需要测试当输入一个合法且已借出的图书号时,界面控件能否给出正确的图书信息,还需要测试当给出一个合法但没有借出的图书以及不合法的图书号时,能给出正确的提示,对于一个正确的输入,还要分别测试超期和没有超期的情况,对于超期的情况还要测试能否正确的计算罚款值。当用户点击了“归还”按钮后,测试对于各个记录是否进行了正确的处理,最后还要测试当用户点击了“放弃”按钮后,交互界面是否清空。

  测试4.3 删除借还信息测试

 首先需要测试当当需要删除的借还记录中的借阅卡号在“借阅卡”中有对应记录时,此时不能删除,并要给出正确的提示信息,还要测试当需要删除的借还记录中的借阅卡号在“借阅卡”中没有对应记录时,在删除时能否给出相应提示,当用户点击“确定”时能否正确删除,当用户点击“取消”时,记录应该还在。

  测试4.4 查询借还信息测试

 需要测试:当用户设置的两个条件-----“借阅卡号”和“图书号”都为空时,能否正确的处理,并将相应的结果显示在控件中;当其中一个为空时,能否正确的处理并显示结果;当两个都不为空时,能否正确的处理并显示结果。

  测试 5:基本信息管理测试

 它主要包含对“借阅者类别信息管理”、“图书类别信息管理”和“用户管理”3个子模块的测试,每个子模块也分别有“添加”、“删除”、“查询”、“修改”4个更细的子模块,这些测试都喝上面的“借阅着管理测试”的4个子模块完全类似,这里不再赘述。

  10.3. 2 单元测试

 从上面可以看出,本系统需要测试的模块较多,而很多模块的测试内容比较相似,对于单元测试,仅以系统借书管理为例,详细说明如何设计测试用例,对于其他模块,可类比本模块。

  对于每个单元测试,可采用的方法是黑盒测试。更具体地说,采取以等价类划分为主,辅以边界值分析法,力图发现系统的每一个错误。

  测试4.1 借书测试用例的设计

 (1) 等价类的划分

 这里主要包含对于有效等价类的划分以及无效等价类的划分

 有效的输入等价类有:

  A、 有效的借阅卡号且未被挂失的借阅卡号,而且借书数目没有超过该卡所能借的最大数目

 B、 有效的图书号且该图书未被借出

 有效的输出等价类有:

 Z、成功的借阅

 无效的输入等价类有:

 b、无效的借阅卡号

  c、有效的借阅卡号但被挂失的借阅卡号

  d、有效的借阅卡号且未被挂失的借阅卡号,但借书数目超过该卡所能借的最大数目。

 e、无效的图书号

  f、有效的图书号但该书已被借出

 无效的输出等价类有:

 z、提示借阅卡无效

  y、提示借阅卡被挂失

  x、提示借阅卡借书数额已满

  w、提示图书号无效

  v、提示该图书已经被借出

 (2)设计覆盖等价类的测试用例

 对于有效等价类,希望设计的测试用例覆盖的等价类越多越好对于无效等价类,为每一个设计一个测试用例,如表所示:

  有效性

 输入

 输出

 覆盖的等价类

 有效

 A、B

 Z

 A,B,Z

 无效

 b

 z

 b,z

 无效

 c

 y

 c,y

 无效

 d

 x

 d,x

 无效

 e

 w

 e,w

 无效

 f

 v

 f,v

 10.3.3 集成测试

 通过了单元测试后便可进行系统的集成测试,一般采用自底向上的集成的方法。下面以借阅管理模块为例阐述图书管理系统的集成测试

 测试 4:借阅管理测试

 在测试4、1借书、测试4、2还书、测试4、3删除借还信息、测试4、4查询借还信息四个子模块的单元测试完成以后,就可以进行“借阅管理”模块的集成测试。这里主要测试的是各个模块之间的接口,以及涉及的一些全局变量。其具体的设计步骤如下:

  1) 利用模块4、1完成某个借阅卡的一次借书,然后调用模块4、4来看看这次借书行为能否查询到。如果没有查询到则发现错误,否则进入下一步。

  2) 接着对这次借书行为调用模块4、2进行还书,如果可以进入下一步,否则发现错误。

  3) 调用模块4、4查询上述还书行为,如果查询到进入下一步,否则发现错误。

  4) 调用模块4、3删除上述借还记录,看看能否给出正确提示,如果给出则进入下一步,否则发现错误。

  5) 修改借阅卡的相关字段,以满足被删除的条件,再次调用模块4、3对借还记录进行删除,如果可以删除则此次测试成功,否则发现错误。

  十一、软件使用说明书

 11.1软件概述

 图书管理系统是面向各中小型图书馆的所有工作人员和读者,旨在为图书管理人员和借阅者提供方便、快捷的图书查询、图书借阅等功能。

  本系统采用设置普通用户与管理员的不同权限。普通用户可以查看图书信息、查询图书等,管理员在普通用户基础上,增加了信息管理这一权限。

  用户权限:

  (一)普通用户权限:查询图书、借阅图书、查询借阅者、密码修改、关闭系统。

  (二)管理员权限:注销、查询图书、借阅图书、查询借阅者、密码修改、添加图书、删除图书、添加借阅者、删除借阅者、信息管理、关闭系统。

  11.2使用说明

 11.2.1系统登陆

 通过登陆界面输入正确的用户名和密码即可登录到系统中,管理员名称为;admintor,密码为:123456.普通用户有elna,密码:124578;jake 密码:345678.

 1、登陆界面

 2、主界面

 下面以图书管理为例

 点击图书管理后进入图书管理界面

 图书查询界面

 11.2.2注册

 在注册页面添入相关信息,点击提交按钮即,记录下用户名和密码即可完成注册。注册之后就可以使用该用户名和密码进行登陆。

  11.2.3 系统简介

 本系统是一个中小型的图书管理系统,它主要具有图书管理、借阅者管理、和借阅管理三个模块。通过本系统可以实现对于图书馆工作的信息化管理。在图书管理模块有关于图书的添加、删除、修改等功能;对于借阅者管理模块有关于借阅者的注册、删除等功能;对于借阅管理模块有关于借书的处理、还书的处理以及关于相关借阅者信息的更改等功能。

  本系统的用户分为普通用户以及管理员,对于普通用户只能进行一些普通的借书以及查询等操作,对于一些操作只限于管理员才能进行,提高了系统的安全性。

  十二、系统开发评价

 12.1.功能方面

 本系统在功能方面实现了图书管理员在添加图书、删除图书、修改图书等方面的工作系统化,不但能使管理效率提高,还可以大大减省管理人员的工作量。在运行效果上有很好的人机交互界面,既有利于一般人员的学习,也有较好的可操作性。当然,我们的系统也存在一些功能欠缺问题,我们会在以后的学习过程中将本系统继续改进,使其成为一个实用、高效的图书管理系统。

  12.2.性能方面

 在安全性方面我们实现了系统数据库的备份管理,使得数据使用更具安全性,同时对登录人员的身份限制,使整个系统的使用更具安全性。本系统在性能上具有较快速的查询能力,为用户提供了图书的借阅。图书的查询等操作。且用户可以根据自己的要求修改密码等。具有良好的性能

 12.3.课程知识运用方面

 在课堂知识运用方面,本系统的开发设计的进程紧跟着课堂教学的内容,与课堂教学保持同步,充分的把课堂上所学的知识运用到了本系统的开发和设计过程之中。严格按照教材上的软件开发过程和步骤进行开发和设计。并且通过本次课程设计不仅对于软件工程方面的知识有了很好的运用和理解,对于其他课程的知识也有了更加深刻的认识,并且在实际的动手操作能力以及编程能力上也有里很大的提高。

  参考文献:

  Visual C++ 6.0 从入门到精通

  邱仲潘、柯渝、谢燕

 Access 2007数据库与程序设计

 蒋年德、全蕾、王志萍

 软件工程课程设计

 李龙澍、郑诚

 1. 要求1-2人一组,按照上述文档模板完成整个项目。每个组可根据项目特点需要适当增删一些模块。

  2. 整个项目的系统分析与设计要求用Visio2007和Power Designer软件;

 3. 项目完成后,每组要求上台给大家讲解项目,最后由老师和同学进行提问;

 4. 每组须提交WOED文档,代码,课程考核表,课堂运行讲解。WORD文档,课程考核表按模板完成。小组完成的项目WORD文档,代码可以相同,但课程考核表须各自分别填写。

 

Tags:

搜索
网站分类
标签列表