首页 软件工程设计实验报告

软件工程设计实验报告

举报
开通vip

软件工程设计实验报告软件工程设计实验报告 图书馆图书管理系统 一、 设计目的 (1)系统设计目的 1.1目的 功能和性能的要求,重点描述了图书馆图该文档是关于用户对图书馆图书流通系统的 书流通系统的功能需求,是概要设计阶段的重要输入。 本文档的预期读者是: ?设计人员 ?开发人员 ?项目管理人员 ?测试人员 ?用户 1.2范围 该文档是借助于当前系统的逻辑模型导出目标系统的逻辑模型的,解决整个项目系统的“做什么”的问题。在这里,没有涉及到开发技术,而主要是通过建立模型的方式来描述用户的需求,为客户、用户、开发...

软件工程设计实验报告
软件工程设计实验报告 图书馆图书管理系统 一、 设计目的 (1)系统设计目的 1.1目的 功能和性能的要求,重点描述了图书馆图该文档是关于用户对图书馆图书流通系统的 书流通系统的功能需求,是概要设计阶段的重要输入。 本文档的预期读者是: ?设计人员 ?开发人员 ?项目管理人员 ?测试人员 ?用户 1.2范围 该文档是借助于当前系统的逻辑模型导出目标系统的逻辑模型的,解决整个项目系统的“做什么”的问题。在这里,没有涉及到开发技术,而主要是通过建立模型的方式来描述用户的需求,为客户、用户、开发方等不同参与方提供一个交流的平台。 1.3缩写说明 UML,Unified Modeling Language(统一建模语言)的缩写,是一个标准的建模语言。 1.4术语定义 无 1.5引用标准 [1]<<企业文档格式标准>>,北京长江软件有限公司软件工程过程化组织 [2]<<需求规格说明书格式标准>>,北京长江软件有限公司软件工程过程化组织 1.6参考资料 [1]《UML说明》,北京长江软件有限公司 [2]《需求规格报告格式标准》,北京长江软件有限公司软件工程过程化组织 (2)系统定义 分别分析一下项目的来源、背景、项目的用户特点和项目的目标。 2.1项目来源及背景 本项目是为某图书馆开发的一个图书馆图书流通系统,由于图书馆的图书条目和数量非常庞大,对于系统管理员和图书管理员带来了很繁重的工作量。为此希望有一个自动化的图书流通系统能够给他们带来工作的便利,提高工作效率,同时能够给图书管理员和借阅者提供一个方便快捷的平台。 为方便管理图书,现开发了图书流通系统。当图书采购员购入图书后,由系统管理员登记、编目、记入总账(即编入书目)后,按类分别送入各图书室(库)。借阅者凭借书证到相应的图书室查找所需借阅的图书后,交给图书管理员办理借书手续;若所需借阅的图书已被他人借阅,可办理预约登记,待书归还后,图书管理员将 通知 关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知 预约者前来办理借阅手续;还书者将借书证和图书,交给管理员,经审查合格后,办理还书手续;若不合格,在办理还书手续的同时,做出相应的处罚。图书管理员定期对借阅情况进行清点,发现借阅超期者发催还通知;定期对书库进行盘点,当图书丢失(或严重损坏或过时)需从分类账(即书籍信息)中删除,总账中做出说明。 2.2用户的特点 本系统的用户共有三类:一类为系统管理员,他们是图书馆内部人员,对系统很熟悉,一类为图书管理员他们对业务管理非常熟悉;一类为借阅者,他们的差异较大,有的对借阅流程非常熟悉,有的对借阅流程不是很清楚。 2.3项目目标 本项目的目标如下: ?系统能够提供友好的用户界面,使操作人员的工作量最大限度的减少; ?系统具有良好的运行效率,能够达到提高生产率的目的; ?系统应有良好的可扩充性,可以容易地加入其他系统的应用; ?平台的设计具有一定超前性,灵活性,能够企业生产配置的变化 ?通过这个项目可以锻炼自己,提高自己的开发能力和项目管理能力 (3)应用环境 根据对系统的需求描述,可以确定本项目分为客户端和管理端,客户端的主要功能是为借阅者办理借书手续、预约手续、还书手续等;管理端的功能是提供系统管理员的图书书目管理、借阅者信息管理,图书管理员的图书借阅管理、图书预约管理等。它们的关系如下图1所示: 图书书目信息Administers图书书目管理 预约书籍Borrower 借阅者信息借阅者信息管理 网 络借阅书籍数 据借阅信息图书借阅管理Liberians库 归还书籍 预约信息图书预约管理 图1 3.1系统运行的网络环境 本系统的网络运行图如下图2所示.无论是管理端的系统管理员、图书管理员还是客户端的借阅者都可以通过网络登录到本系统中。借阅者可以进行借书、还书、预约登记;图书管理员通过网络处理书籍借阅、归还、预约管理;系统管理员通过网络处理图书书目和书籍信息、借阅者账号信息。 3.2系统运行的硬件环境 本系统的硬件环境如下: 客户机:普通PC ?CPU P4 1.8GHz以上 ?内存:256MB以上 ?能够运行IE5.0以上或者Netscape 4.0以上版本的机器 ?分辨率:推荐使用1024*768像素 Web服务器 ?CPU:P4 2.0GHz ?内存:1GB以上 ?硬盘:80GB以上 ?网卡:KMb/s速度 数据库服务器 ?CPU:P4 2.0GHz ?内存:1GB以上 ?硬盘:80GB以上 3.3系统运行软件环境 本系统的软件环境如下: ?操作系统:UNIX/Linux/Windows 2000或以上版本 ?数据库:SQL Server 2000 ?开发工具:Microsoft Visual C++ 6.0 二、设计说明 (1)需求分析 1(功能规格(功能需求) 系统的功能需求包括以下几个方面: (1) 借阅者可以通过网络进行图书查询和预约 (2) 借阅者能够借阅书记和还书。 (3) 图书管理员能够处理借阅者的借阅和还书请求。 (4) 系统管理员可以对系统的数据进行维护,如增加、删除和更新书目,增加、删 除和更新借阅者账户,增加和删除书籍。 我们采用面向对象分析作为主要的系统建模方法,使用UML(Unified Modeling Language)作为建模语言。UML为建模活动提供了从不同角度观察和展示系统的各种特征的方法。在UML中,从任何一个角度对系统所做的抽象都可能需要几种模型来描述,而这些来自不同角度的模型图最终组成了系统的映像。 用例描述角色(用户、外部系统以及系统处理)是如何来与系统交互完成工作的。用例模型提供了一个非常重要的方式来界定边界以及定义系统功能,同时,该模型将来可以派生出动态对象模型。 设计用例时,遵循下列步骤: 1)识别出系统的角色。角色可以是用户、外部系统,甚至是外部处理,通过某些途径与系统交互。重要的是着重从系统外部执行者的角度来描述系统需要提供哪些功能,并指明这些功能的执行者(角色)是谁,尽可能地确保所有角色都被完全识别出来。 2)描述主要的用例。可以采取不断问自己“这个角色究竟想通过系统做什么,”里准确地描述用例。 3)重新审视每个用例,为它们下个详尽的定义。 1.1确定系统涉及的总体信息 图书馆流通系统是对书籍及读者进行统一管理的系统,具体包括读者的借书、还书、书籍预约;图书管理员的书籍接触处理、书籍归还处理、预约信息处理;还有系统管理员的系 统维护,包括增加书目、删除和更新书目、增加书籍、减少书籍、增加读者账户信息、删除或更新读者账户信息、书籍查询信息、读者查询信息等。系统的总体信息确定以后,就可以分析系统的参与者,确定系统的用例了。 1.2确定系统的参与者 确定系统的参与者首先需要分析系统所涉及的问题领域和系统运行的主要任务:分析使用该系统主要功能的是哪些人,谁需要该系统的支持一完成其工作,还有系统的管理者和维护者。 根据图书馆流通系统的需求分析,可以确定如下几点: 1)作为一个图书馆流通系统,首先需要读者(借阅者)的参与,读者可以登录到系统查询所需要的书籍,查到所需书籍后可以考虑预约,当然最重要的还是借书、还书的操作。 2)对于系统来说,读者发起的借书、还书等操作最终还需要图书管理员来处理,他们可以负责图书的预约和取消预约。 3)对于图书馆流通系统来说,系统的维护操作也是相当重要的,维护操作主要包括增加书目、删除及更新书目、增加书籍、减少书籍等操作。 由以上分析可以得出,系统的参与者主要有3类:读者(也可以称为借阅者)、图书馆管理员、图书馆系统管理员。 1.3确定系统用例 用例是系统参与者与系统在交互过程中所需要完成的事务,识别用例最好的方法就是从分析系统的参与者开始,考虑每个参与者是如何使用系统的。由于系统存在借阅者、图书管理员、系统管理员3个参与者,所以在识别用例的过程中,可以将系统分为3个用例图分别考虑。 1)借阅者请求服务的用例 借阅者请求服务的用例图包括如下用例: (1)登录系统; (2)查询自己的借阅信息; (3)查询书籍信息; (4)预约书籍; (5)借阅书籍; (6)归还书籍; 2)图书管理员处理借书、还书等的用例 图书馆管理员处理借书、还书包含如下用例: (1)处理书籍借阅; (2)处理书籍归还; (3)删除预约信息; 3)系统管理员进行系统维护的用例 系统管理员进行系统维护包含如下用例: (1)查询借阅者信息; (2)查询书籍信息; (3)增加书目; (4)删除或更新书目; (5)增加书籍; (6)删除书籍; (7)增加借阅者账户; (8)删除或更新借阅者账户; 1.4系统中的用例图 下面给出系统中所涉及到的3个用例图。 1)借阅者请求服务的用例图 <> Reserve the book Search for bookLogon the system <> Query Info Return with fine Borrow the book<>Borrower Return the book 【用例图说明】 (1)Search for Book:书籍查询用例 (2)Reserve the book:书籍预约用例 (3)Logon the system:登录系统 (4)Query Info:查询借阅信息 (5)Borrow the book:借阅书籍 (6)Return the book:归还书籍 (7)Return With Fine:还书时缴纳罚金 其中,用例Query Info与Reserve the book都与Logon the system之间存在<> (使用)关系;用例Return the book与Return With Fine之间存在<>(扩展) 关系。 2)图书馆管理员处理借书、还书等的用例图 <> Get bookGet with fine <> Lend bookCheck user account <> Library Remove Reservation 【用例图说明】 (1)Get book:书籍归还处理 (2)Lend book:书籍借阅处理 (3)Remove Reservation:删除书籍预约处理 (4)Get with fine:还书时收取罚金 (5)check user count:检查用户借阅凭证的合法性 其中,用例Lend book和Remove Reservation至今存在<>(使用)关系,用例 Get book和Get with fine之间存在<>(扩展)关系,用例Lend book和check user count之间存在<>(包含)关系。 3)系统管理员进行系统维护时的用例图 Remove or Update Title Add bookAdd Title Query Book InfoRemove Book Query Borrower Info Add borrower Remove or Update Borrower Administrator 【用例图说明】 (1)Query Borrower Info:查询读者信息 (2)Query Book Info:查询书籍信息 (3)Add Title:增加书目 (4)Remove or Update Title:删除或更新书目 (5)Add Book:增加书籍 (6)Remove Book:删除书籍 (7)Add Borrower:增加借阅者账户 (8)Remove or Update Borrower:删除或更新借阅者账户 2(性能需求、 根据用户对本系统的需求,确定系统在响应时间、可靠性、安全性等方面有较高的性能要求。 2.1界面需求 系统的界面需求如下: 1)页面内容:主题突出,页面定义、术语和行文格式统一、 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 、明确,栏目、菜单设置和布局合理,传递的信息准确、及时。内容丰富,文字准确,语句通顺,专用术语规范,行文格式统一规范。 2)导航结构:页面具有明确的导航指示,且易于理解,方便用户使用。 3)技术环境:页面大小适当,支持在windows的各种环境下运行。 2.2响应时间需求 无论是客户端还是管理端,当用户登录,进行任何操作时,系统应该及时的进行反映。系统能监视出各种非正常的情况,如与数据库的通信终端,无法连接数据库服务器等,以避免出现长时间等待甚至无响应。 2.3系统安全性需求 系统有严格的权限管理功能,各功能模块需有相应的权限方能进入。系统需能够防止各类误操作可能造成的数据丢失、破坏。防止用户非法获取其中内容。 (2)总体设计 1.系统体系结构分析 系统的总体设计遵循如下的原则。 1)系统应具有良好的适应性:能适应用户对系统的软件环境、管理内容、模式和界面的要求; 2)系统应具有可靠性:采用成熟的技术方法和软件开发平台,以保证系统在以后的应用中安全、可靠; 3)系统应具有较好的安全性:应提高安全机制和用户权限限制机制的完善程度,确保数据的受限访问; 4)系统应具有良好的可维护性:系统应易于维护、安装; 5)系统应具有良好的可扩展性:系统应适应未来信息化的要求,能方便地进行功能扩展,以建立完善的信息集成管理体系。 2.界面设计 本系统的部分界面设计如下: (1) 用户登录界面 用户登录界面是为了让工作人员或图书馆管理员按照用户名和密码进行登录,如下图: (2)信息管理主界面 登录系统后,即进入图书管理的主界面,如下: (3)新书入库和查询主界面 (4)借书还书管理界面 其余设计界面详见程序. 4. 系统数据库设计 1)概念设计 在概念设计阶段中,设计人员从用户的角度看待数据及处理要求和约束,产生一个反映用户观点的概念模式。然后再把概念模式转换成逻辑模式。将概念设计从设计过程中独立开来,使各阶段的任务相对单一化,设计复杂程度大大降低,不受特定DBMS的限制。 利用ER方法进行数据库的概念设计,可分成三步进行:首先设计局部ER模式,然后把各局部ER模式综合成一个全局模式,最后对全局ER模式进行优化,得到最终的模式,即概念模式。 (1) 设计局部ER模式 实体和属性的定义: 图书(图书编号,图书名称,作者,出版社,出版日期,备注,价格,数量,) 借阅者(借书证号,姓名,性别,身份证,联系电话,密码) 身份(身份编号,身份描述,最大借阅数) 图书类别(图书类别编号,类别描述) ER模型的“联系”用于刻画实体之间的关联。一种完整的方式是对局部结构中任意两个实体类型,依据需求分析的结果,考察局部结构中任意两个实体类型之间是否存在联系。若有联系,进一步确定是1:N,M:N,还是1:1等。还要考察一个实体类型内部是否存在联系,两个实体类型之间是否存在联系,多个实体类型之间是否存在联系,等等。 (2)设计全局ER模式 所有局部ER模式都设计好了后,接下来就是把它们综合成单一的全局概念结构。全局概念结构不仅要支持所有局部ER模式,而且必须合理地表示一个完整、一致的数据库概念结构。 1.确定公共实体类型 为了给多个局部ER模式的合并提供开始合并的基础,首先要确定各局部结构中的公共实体类型。在这一步中我们仅根据实体类型名和键来认定公共实体类型。一般把同名实体类型作为公共实体类型的一类候选,把具有相同键的实体类型作为公共实体类型的另一类候选。 2.局部ER模式的合并 合并的原则是:首先进行两两合并;先和合并那些现实世界中有联系的局部结构;合并 从公共实体类型开始,最后再加入独立的局部结构。 3.消除冲突 冲突分为三类:属性冲突、结构冲突、命名冲突。 设计全局ER模式的目的不在于把若干局部ER模式形式上合并为一个ER模式,而在于消除冲突,使之成为能够被所有用户共同理解和接受的同一的概念模型。 4.全局ER模式的优化 在得到全局ER模式后,为了提高数据库系统的效率,还应进一步依据处理需求对ER模式进行优化。一个好的全局ER模式,除能准确、全面地反映用户功能需求外,还应满足下列条件:实体类型的个数要尽可能的少;实体类型所含属性个数尽可能少;实体类型间联系无冗余。 综上所述,“图书管理系统”的ER模式如下图所示。 借书ID 借阅者ID 借阅者ID 姓名 书籍ID 书名 借书 作者 书籍ID 性别 出版社 借出时间 出生日期 借阅者 图书 单价 地址 罚金 入库时间 现存量 身份证号码 总量 罚款 罚单ID 电话号码 返还时间 现借书总量 书籍ID 借阅者ID 借出时间 2) 数据库的实现 我选用Microsoft SQL Server2000(企业版)数据库来进行数据库的逻辑设计。首先创建七个基本数据库表如下表所示,然后根据全局ER图,建立各个表之间的联系,如下图所示。 表1 系统管理员表的结构(Admin_Info) 字段名称 数据类型 可否为空 约束条件 备注 User_Name Nvarchar(24) Not null 无 用户名 Password Nvarchar(24) Not null 无 密码 WorkID Integer Not null 主键 成员ID 表2 图书信息表的结构(Book_Info) 字段名称 数据类型 可否为空 约束条件 备注 Book_ID Varchar(10) Not null 主键 书籍ID Book_name Varchar(50) Not null 无 书名 Writer Varchar(10) Not null 无 作者 Press Varchar(50) Not null 无 出版社 Price float Not null 无 单价 InLibrary_Date date Not null 无 入库时间 Total_Amount integer not null 无 书的总量 Now_Amount integer Not null 无 现存量 表3 借阅情况信息表的结构(Borrow_Info) 字段名称 数据类型 可否为空 约束条件 备注 BorrowID integer Not null 主键 借书ID Proof_ID Varchar(10) Not null 外键(Proof_Info) 借阅卡ID Book_ID Varchar(10) Not null 外键(Book_Info) 书籍ID Borrow_Date date Not null 无 借出时间 表4 借阅者身份信息表的结构(Proof_Info) 字段名称 数据类型 可否为空 约束条件 备注 Proof_ID Varchar(10) Not null 主键 借阅卡ID Name Varchar(10) Not null 无 姓名 Sex Varchar(6) Not null 无 性别 Brith_Time Date Not null 无 出生日期 Address Varchar(50) Not null 无 地址 ID_Number Varchar(20) Not null 无 身份证号码 Tel_Number Varchar(15) Not null 无 电话号码 Now_Borrow_Amount Integer Not null 无 现借书总量 表5 借阅处罚信息表的结构(Owner) 字段名称 数据类型 可否为空 约束条件 备注 Puni_ID Integer Not null 主键 罚单ID Proof_ID Varchar(10) Not null 外键 借阅卡ID Book_ID Varchar(10) Not null 外键 书籍ID Borrow_Date Date Not null 无 借出时间 Return_Date Date Not null 无 返还时间 Puni_Money integer Not null 无 罚金 (3)关键模块的功能、结构 系统主要包括以下几个基本模块。 (1) 基本数据维护模块。基本数据维护模块提供了使用者录入、修改并维护基本数 据的途径。例如对借阅者的、书籍的各项信息的更改与修改。 (2) 基本业务模块。基本业务模块要用于实现用户借书与还书的管理,例如借阅者 可以登录系统预约书籍,图书管理员可以取消书籍的预约,当然还可以进行借 书还书等操作。 (3) 数据库管理模块。在系统中,所有书籍的信息以及借阅者的账户信息都要统一 管理,书籍的借阅情况、预约情况也要进行详细的 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 ,所以要用统一的数据 库平台进行管理。 (4) 信息查询模块。信息查询模块主要用于查询书籍的信息和借阅者的信息。 下图3即表示图书馆图书流通系统的功能需求: 图书馆图书流通系统 基 数 本基据信 数本库息 据业管查 维务理询 护模模模 模块 块 块 块 图3 基本数据维护模块包括如下图4所示的几个方面。 基本数据维护模块 添修添修添删 加改加改加除 借更书更书书 阅新目新籍籍 者借信书信信 信阅息 目息 息 息 者信 信息 息 图4 (1) 添加借阅者信息。系统管理员可以添加借阅者账户。 (2) 修改更新借阅者信息。系统管理员可以修改更新借阅者信息。 (3) 添加书目信息。系统管理员可以添加书目。 (4) 修改更新书目信息。系统管理员可以修改和更新书目信息。 (5) 添加书籍信息。系统管理员可以添加书籍。 (6) 删除书籍信息。系统管理员可以删除书籍。 基本业务模块包括如图5所示的几个方面。 基本业务模块 借还书取 书 书 籍消 预书 约 籍 预 图5 约 (1) 借书。处理借书业务。 (2) 还书。处理还书业务。 (3) 书籍预约。借阅者可以通过网络进行书籍预约。 (4) 取消书籍预约。图书馆管理员可以根据情况取消书籍预约,如果借阅者已经借 了此书或者借阅者要求取消预约都涉及此项业务。 数据库模块包括如图6所示的几个方面。 数据库模块 借书账书 阅籍户籍 信信信预 息息息约 管管管信 理 理 理 息 管 理 图6 (1) 借阅信息管理。书籍借阅信息包括书的书名、ISBN以及借书的时间等。 (2) 书籍信息管理。书籍信息包括书籍的名字、ISBN、作者、入库时间以及出版社, 出版日期,页数,开本,价格,备注等。 (3) 账户信息管理。账户信息管理包括借阅者的账户ID、姓名,性别,出生日期, 所在部门,职务,允许借书数等。 (4) 书籍预约信息管理。负责管理书籍预约信息。 信息查询模块主要是查询数据库中的相关信息,如图7所示。 信息查询模块 查查 询询 书借 籍阅 信者 息 信 息 图7 (1) 查询书籍信息。负责书籍信息的查询。 (2) 查询借阅者信息。负责借阅者信息的查询。 (4)详细设计 1.连接数据库 当系统启动之后,就要连接数据库了,需要3个参数:ODBC数据源名称、数据库用 户名称,数据库用户密码。其中数据源名称为Library。数据库用户的名称和密码均为 dbaccess。 登录到主界面之前,首先调用管理员登录模块。从数据库中读入Admin_Info表的 内容,,判断用户输入的用户名和密码是否正确。主要代码如下: void CLibraryDlg::OnOK() { UpdateData(); if(m_strUsername.IsEmpty()) { MessageBox("Please input your username!","登录系统",MB_OK|MB_ICONEXCLAMATION); m_strUsername.Empty(); UpdateData(FALSE); return; } if(!m_database.IsOpen()) { //连接数据源 if(!m_database.Open(_T("Library"))) { MessageBox("连接数据库失败!","图书管理系统",MB_OK|MB_ICONINFORMATION); return; } } CLoginSet *m_pLogset=new CLoginSet(&m_database); //编写SQL语句 CString strSQL; strSQL.Format("select * from Admin_Info where User_Name='%s' AND Password='%s'",m_strUsername,m_strPassword); //编写SQL语句结束 m_pLogset->Open(AFX_DB_USE_DEFAULT_TYPE,strSQL); if(m_pLogset->GetRecordCount()==0) { if(count<5) { MessageBox("登录失败!","图书管理系统",MB_OK|MB_ICONERROR); count++; m_strPassword.Empty(); m_strUsername.Empty(); UpdateData(FALSE); } else{ m_database.Close(); MessageBox("您登录失败超过5次,请与管理员联系!","图书管理系统"); OnOK(); } } else { m_database.Close(); *b_Login = 0; CDialog::OnOK(); } } 2.图书管理模块设计 书库管理包括新书登记、借书/还书、书籍挂失、图书信息查询和借书信息查询5个部分,下面只介绍新书登记和借书/还书这2个部分的功能以及实现过程。 1)新书登记 新书登记管理包括新书入库、查询图书和现实所有图书的功能。为了方便添加图书和查询所有图书的基本信息,可以创建一个对话框。添加对话框类的名称为CnewBookDlg,资源ID为IDD_DIALOG_NEW_BOOKS,对话框名称为“新书登记入库”。 “新书登记入库”对话框的控件类型、ID及说明如下表所示。 控件类型 ID 属性 变量或函数 Label IDC_STATIC 书号 无 Edit Box IDC_EDIT_BOOK_NO 无 Cstring类型变量m_strBookID Label IDC_STATIC 书名 无 Edit Box IDC_EDIT_BOOK_NAME 无 Cstring类型变量m_strBookName Label IDC_STATIC 作者 无 Edit Box IDC_EDIT_WRITER 无 Cstring类型变量m_strWriter Label IDC_STATIC 单价 无 Edit Box IDC_EDIT_PRICE 无 Cstring类型变量m_strPrice Label IDC_STATIC 出版社 无 Edit Box IDC_EDIT_PRESS 无 Cstring类型变量m_strPress Label IDC_STATIC 总量 无 Edit Box IDC_EDIT_TOTAL 无 Long类型变量m_lTotal Label IDC_STATIC 现存量 无 Edit Box ID_EDIT_NOW 无 Long类型变量m_lNow Button IDC_BUTTON_IN 入库 函数OnButtonIn() Button IDC_BUTTON_CHECK_BOOKS 查询 函数OnButtonCheckBooks() Button IDC_BUTTON_CHECK_ALL 显示全部书籍 函数OnButtonCheckAll() Button IDC_BUTTON_BACK 返回 函数OnButtonBack() List Control IDC_LIST_RESUIT 无 列表控件类型变量m_ctrList ?入库 入库数图书馆管路系统中最重要的功能之一,是图书馆管理系统不可缺少的。入库的实 现过程首先要输入书籍的各种信息,包括书的书名、作者、出版社、价钱、总量、现存量等, 这里书的数量有两个变量来记录,总量代表图书馆中这种书的总量,现存量是目前正在图书 馆中的量,两者之差就是被读者借出去的数量。其中每个信息不能有遗漏或者格式不正确, 因为这是每一本书的基本信息,在函数的实现过程中有检验的功能。 然后判断图书馆中是否存在这种图书,如果存在,那么只是简单地把库存的数量加上新 加入的数量,如果不存在,那么就要新建记录。函数为CnewBooksDlg::OnButtonIn(),代码 如下: void CNewBooksDlg::OnButtonIn() { UpdateData(); if(m_strBookID.Compare("")==0) { MessageBox("请正确填写要求的数据","新书入库登记"); return; } if(!m_database.IsOpen()) { if(!m_database.Open(_T("Library"))) { MessageBox("Cannot access database!","新书登记"); return; } } CBookSet *m_pset=new CBookSet(&m_database); //判断书库中是否有该书,进行相应操作;有,把数量加到库中 CString strSQL; strSQL.Format("select * from Book_Info where Book_ID='%s'",m_strBookID); m_pset->Open(AFX_DB_USE_DEFAULT_TYPE,strSQL); if(m_pset->GetRecordCount()!=0) { m_pset->Edit(); m_pset->m_Total_Amount=m_pset->m_Total_Amount+m_lTotal; m_pset->m_Now_Amount=m_pset->m_Now_Amount+m_lNow; m_pset->Update(); m_pset->Requery(); m_pset->Close(); m_database.Close(); MessageBox("Adding new books successfully!","新书入库登记"); OnButtonCheckBooks(); return; } m_pset->Close(); if(m_strBookID==""||m_strBookName==""||m_strWriter=="" ||m_strPress==""||m_dPrice==0||m_lTotal==0 ||m_lNow==0) { MessageBox("请正确填写要求的数据~","新书登记入库"); m_database.Close(); return; } strSQL.Format("select * from Book_Info"); m_pset->Open(AFX_DB_USE_DEFAULT_TYPE,strSQL); m_pset->AddNew(); m_pset->SetFieldNull(&(m_pset->m_Book_ID),FALSE); m_pset->m_Book_ID=m_strBookID; m_pset->SetFieldNull(&(m_pset->m_Book_Name),FALSE); m_pset->m_Book_Name=m_strBookName; m_pset->SetFieldNull(&(m_pset->m_Writer),FALSE); m_pset->m_Writer=m_strWriter; m_pset->SetFieldNull(&(m_pset->m_Press),FALSE); m_pset->m_Press=m_strPress; m_pset->SetFieldNull(&(m_pset->m_Price),FALSE); m_pset->m_Price=m_dPrice; m_pset->SetFieldNull(&(m_pset->m_Total_Amount),FALSE); m_pset->m_Total_Amount=m_lTotal; m_pset->SetFieldNull(&(m_pset->m_Now_Amount),FALSE); m_pset->m_Now_Amount=m_lNow; CTime curTime=CTime::GetCurrentTime(); m_pset->SetFieldNull(&(m_pset->m_InLibrary_Date),FALSE); m_pset->m_InLibrary_Date=curTime; m_pset->Update(); m_pset->Requery(); m_pset->Close(); m_database.Close(); MessageBox("Adding new books successfully!","新书入库登记"); OnButtonCheckBooks(); m_strBookID.Empty(); m_strBookName.Empty(); m_strPress.Empty(); m_strWriter.Empty(); m_lNow=0; m_lTotal=0; m_dPrice=0.0; UpdateData(FALSE); return; } 这里需要用到CbookSet类,所以要在NewBooksDlg.cpp文件的开始处引用BookSet.h 文件,方法如下: #include”BookSet.h” OnButtonIn函数首先调用UpdateData(),完成从控件到对话框成员变量的数据交换, 然后判断是否输入了书号,如果输入为空,将不能正确地将新书入库,函数返回错误。判断 数据库是否打开,如果没有打开,那么重新打开数据库。生成新的CbookSet实例,与数据 库绑定,输入SQL语句,查找数据库书库中是否有该书,进行相应操作,如果有,把数量加 到库中;如果没有,那么要在数据库中建立新的图书记录。 ?查询 查询也是很重要的一个功能,在很多地方会被用到,也是显示数据的一个功能函数。实 现的过程,也是首先检查数据库是否打开,以及要查询的书号是否为空。函数为 CnewBooksDlg::OnButtonIn(),代码如下。 void CNewBooksDlg::OnButtonCheckBooks() { UpdateData(); if(m_strBookID=="") { MessageBox("请正确填写信息,(书号?)","新书登记"); return; } if(!m_database.IsOpen()) { if(!m_database.Open(_T("Library"))) { MessageBox("Cannot access the database!","新书登记"); return; } } CBookSet *m_pset=new CBookSet(&m_database); CString strSQL; strSQL.Format("select * from Book_Info where Book_ID='%s'",m_strBookID); m_pset->Open(AFX_DB_USE_DEFAULT_TYPE,strSQL); if(m_pset->GetRecordCount()==0) { MessageBox("No this book in the database!","新书登记"); m_database.Close(); return; } //处理表格 m_ctrList.DeleteAllItems(); m_pset->MoveFirst(); char buf[50]; CDBVariant varValue; int i=0; CString strBookName; while(!m_pset->IsEOF()) { m_ctrList.InsertItem(i,buf); m_ctrList.SetItemText(i,0,m_strBookID); m_pset->GetFieldValue(1,strBookName); m_ctrList.SetItemText(i,1,strBookName); m_pset->GetFieldValue(2,strBookName); m_ctrList.SetItemText(i,2,strBookName); m_pset->GetFieldValue(3,strBookName); m_ctrList.SetItemText(i,3,strBookName); m_pset->GetFieldValue(4,varValue); sprintf(buf,"%.2f",varValue.m_dblVal); m_ctrList.SetItemText(i,4,buf); m_pset->GetFieldValue(5,varValue); sprintf(buf,"%d-%d-%d",varValue.m_pdate->year,varValue.m_pdate->month, varValue.m_pdate->day); m_ctrList.SetItemText(i,5,buf); m_pset->GetFieldValue(6,varValue); sprintf(buf,"%d",varValue.m_lVal); m_ctrList.SetItemText(i,6,buf); m_pset->GetFieldValue(7,varValue); sprintf(buf,"%d",varValue.m_lVal); m_ctrList.SetItemText(i,7,buf); i++; m_pset->MoveNext(); UpdateData(FALSE); } m_pset->Close(); m_database.Close(); } OnButtonCheckBooks函数开始部分与新书入库函数类似,都是首先进行数据交换,然后判断输入书号是否为空,判断数据库是否正常打开,生成新的BookSet实例。以上函数处理时,注意在数据库的数据取出来之后,CbookSet类的实例m_pset通过GetFieldValue函数来取得每个字段的值。在这里需要的值都是Cstring类型,故而直接使用GetFieldValue就可以了。如果有别的类型,比如整型,实型等,就需要将得到的结果进行类型转换。 ?显示全部书籍 显示全部书籍部分的处理函数跟查询的基本相似,相应的SQL语句为“select * from Book_Info”,然后依次插入列表控件中,这部分代码省略。 2)借书/还书 借书/还书管理是图书馆管理系统中最重要的模块,包括了查询书籍、查询借阅者信息和借书还书等功能。为了方便管理,可创建一个对话框。添加的对话框类名称为CborrowDlg,资源ID为IDD_DIALOG_BORROW,对话框名称为“借书/还书管理”。 “借书/还书管理”对话框中的控件类型、ID及说明如下表所示。 控件类型 ID 属性 变量或函数 Button IDC_BUTTON_CHECK_BOOKS 查询书籍 函数OnButtonCheckBooks() Button IDC_BUTTON_CHECK_BORROW 查询借书信息 函数OnButtonCheckBorrow() Button IDC_BUTTON_BACK 返回 函数OnButtonBack() Label IDC_STATIC 借阅证号 无 Edit Box IDC_EDIT_PROOF 无 CString类型变量 m_strProofID Label IDC_STATIC 图书号码/条形码 无 Edit Box IDC_EDIT_BOOK 无 Cstring类型变量m_strBookID Button IDC_BUTTON_OK 借书 函数OnButtonOk() Button IDC_BUTTON_RETURN 还书 函数OnButtonReturn() Button IDC_BUTTON_RESET 重置 函数OnButtonReset() List Control IDC_LIST_SHOW 无 列表控件变量m_ctrList ?查询书籍 查询书籍的处理函数为CborrowDlg::OnButtonCheckBooks(),代码如下: void CBorrowDlg::OnButtonCheckBooks() { CCheckBooksDlg m_dlg; m_dlg.DoModal(); } 为了方便处理,新建一个对话框,添加的对话框类名称为CcheckBooksDlg,资源ID为 IDD_DIALOG_CHECK_BOOKS,对话框名称为“图书查询”。 “图书查询”对话框的控件类型、ID及说明如下表所示。 控件类型 ID 属性 变量或函数 Label IDC_STATIC 书号 无 Edit Box IDC_EDIT_BOOK_NO 无 Cstring类型变量 m_strBookID() Button IDC_BUTTON_CHECK 查询 函数OnButtonCheck() Button IDC_BUTTON_CHECK_ALL 查询全部 函数OnButtonCheckAll() List Control IDC_LIST_RESULT 无 列表控件类型变量m_ctrList 查询和查询全部的实现代码跟新书入库部分的查询功能的实现类似,这里就不赘述。 ?查询借阅信息 查询借阅信息的处理函数为CborrowDlg::OnButtonCheckBorrow(),代码如下。 void CBorrowDlg::OnButtonCheckBorrow() { CCheckBorrowDlg dlg; dlg.m_strProofID=m_strProofID; dlg.DoModal(); } 查询的实现函数为CcheckBorrowDlg::OnButtonRequery(),首先是检查数据库是否 正常打开,否则重新连接数据库,然后从数据库中查找待查找的借书号的所有借书信息,最 后在列表框中显示查询到的借书信息。函数实现代码这里省略。 ?借书 借书是图书光管理系统中最基本的功能,处理函数为CborrowDlg::OnButtonOk(), 代码如下: void CBorrowDlg::OnButtonOk() { UpdateData(); if(m_strProofID==""||m_strBookID=="") { MessageBox("输入的域不完整,请重新输入~","借书管理",MB_ICONERROR); m_strProofID.Empty(); m_strBookID.Empty(); UpdateData(FALSE); return; } if(!m_database.IsOpen()){ if(!m_database.Open(_T("Library"))){ MessageBox("Cannot access the database!","借书管理"); return; } } CString strSQL; //判断借书人是否有资格 strSQL.Format("select * from Proof_Info where Proof_ID='%s'", m_strProofID); CProofSet *m_pProof=new CProofSet(&m_database); m_pProof->Open(AFX_DB_USE_DEFAULT_TYPE,strSQL); if(m_pProof->GetRecordCount()==0) { MessageBox("数据库中没有这个人的信息","借书/还书 ",MB_ICONINFORMATION); m_pProof->Close(); m_database.Close(); return; } CDBVariant varValue; m_pProof->GetFieldValue(7,varValue); if(varValue.m_iVal==4) { //如果不满足条件 MessageBox("你不能借书超过4本!","借书/还书 ",MB_OK|MB_ICONINFORMATION); m_pProof->Close(); m_database.Close(); return; } //满足条件 借书量加一 m_pProof->Edit(); m_pProof->m_Now_Borrow_Amount++; m_pProof->Update(); m_pProof->Requery(); m_pProof->Close(); //Book_Info表中,现存数量减一 strSQL.Format("select * from Book_Info where Book_ID='%s'",m_strBookID); CBookSet *m_pBook=new CBookSet(&m_database); m_pBook->Open(AFX_DB_USE_DEFAULT_TYPE,strSQL); if(m_pBook->GetRecordCount()==0) { MessageBox("对不起,图书馆现在没有这本书!","借书/还书 ",MB_ICONINFORMATION); m_pBook->Close(); m_database.Close(); return; } m_pBook->Edit(); m_pBook->m_Now_Amount--; m_pBook->Update(); m_pBook->Requery(); m_pBook->Close(); //将借书信息存入借书信息表中 strSQL.Format("select * from Borrow_Info"); CBorrowSet *m_pBorrow=new CBorrowSet(&m_database); m_pBorrow->Open(AFX_DB_USE_DEFAULT_TYPE,strSQL); if(m_pBorrow->GetRecordCount()==0) { MessageBox("数据库中没有借书信息!","借书/还书",MB_OK|MB_ICONINFORMATION); } m_pBorrow->AddNew(); m_pBorrow->SetFieldNull(&(m_pBorrow->m_Proof_ID),FALSE); m_pBorrow->m_Proof_ID=m_strProofID; m_pBorrow->SetFieldNull(&(m_pBorrow->m_Book_ID),FALSE); m_pBorrow->m_Book_ID=m_strBookID; CTime curTime=CTime::GetCurrentTime(); m_pBorrow->SetFieldNull(&(m_pBorrow->m_Borrow_Date),FALSE); m_pBorrow->m_Borrow_Date=curTime; m_pBorrow->m_BorrowID=m_pBorrow->GetRecordCount(); m_pBorrow->Update(); m_pBorrow->Requery(); m_pBorrow->Close(); m_database.Close(); MessageBox("借书成功!","借书/还书",MB_OK|MB_ICONINFORMATION); RefreshData(); } 在以上借书部分的实现代码中,首先检查借书证号和所要借的书名是否输入正确,然后检查数据库是否保持连接。如果没有正确连接数据库,那么重新连接。然后从数据库中读入该读者的借书信息,看他所借的图书数量是否达到了图书馆要求的最大借书量,最后在列表框中显示借书信息。在这里有两点注意:一是借书之前,先检查该读者是否还能借书;另一是成功借出图书后,不是把图书馆数据库中所借图书的总量减一,而是把现存量减一。 ?还书 还书的处理函数为CborrowDlg::OnButtonReturn(),实现过程与借书类似,就是借书的逆过程。 ?重置 重置的功能就是清空输入项中的内容,重新输入待输入的各种参数。处理函数为 CborrowDlg::OnButtonReset(),代码如下: void CBorrowDlg::OnButtonReset() { m_strProofID.Empty(); m_strBookID.Empty(); UpdateData(FALSE); } 三、调试说明 (1)调试情况 测试概述: WINDOWS在系统开发过程中采用了多种措施保证软件质量,但是实际开发过程中还是不可避免地会产生差错,系统中通常可能隐藏着错误和缺陷,未经周密测试的系统投入运行,将会造成难以想象的后果,因此系统测试是系统开发过程中为保证软件质量必须进行的工作。大量统计资料表明,系统测试的工作量往往占系统开发总工作量的40%以上。因此,我们必须重视测试工作。 由于程序中隐藏的缺陷只在特定的环境中才有可能显露,系统缺陷通常是由于对某些特定情况考虑不周造成的。因此测试不是为了表明程序正确:成功的测试也不是没有发现错误的测试。有意义的软件测试应该是从“破坏“软件系统的角度出发,精心设计最有可能暴露程序系统缺陷的测试 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 。因此软件测试的目标应该是以尽可能少的代价和时间找出软件系统中潜在的错误和缺陷。 系统测试是管理信息系统开发期间中一个十分重要而漫长的阶段。其重要性体现在它是保证系统质量与可靠性的最后关口。且对整个系统开发过程包括系统分析、系统设计和系统实现的最终审查 调试过程分为三个阶段:分调、联调、总调。 1.分调也称模块程序调试,是调试工作的基础工作,目标是发现并纠正程序设计阶段产生的错误。具体做法是对每一个模块进行调试。调试时着重检查了如下几方面: (1)模块运行是否正常、无死机。包括检查有无语法错误(例如打错语句、语句不配对等)、逻辑错误(例如文件或变量找不到、变量类型错误等)和流程模块错误(例如模块内的功能调度、模块的进入与退出失败等)。 (2)模块的功能是否符合设计要求。 包括检查功能有无多余或丢失,功能是否准确无误,算法是否正确,格式是否合理等。 (3)模块的技术性能如何。包括检查对输入的响应,数据检索、统计与输出的速度等。 (4)界面是否友好。包括检查画面是否清晰美观,对话是否适度,操作是否方便。 2.联调是指子系统中各程序模块之间的联合调试,目的是发现并纠正系统设计过程中产生的错误。具体做法逐个子系统进行调试。调试时特别检查了如下几方面: (1)子系统内模块功能的调度是否正确。包括模块间的进退是否自如有无问题等。 (2)子系统的功能是否符合设计的要求。包括功能是否齐全无错漏。 (3)子系统内的数据组织是否符合功能的需要。包括基本数据项是否完整,数据文件间的关系是否正确,数据接口设计是否合理等。 3.总调是对整个程序系统以及人工过程与环境的总调试,目标是发现并纠正系统分析阶段产生的错误。具体做法是对由各个子系统结合而成的程序系统以及配合系统运行而所需的人工过程或操作环境(例如数据采集、录入操作和设置等)进行统一的综合调试。总调的重点应检查了如下几方面: (1)系统的整体调度功能是否正常。包括主程序与各级菜单之间的进入与返回,口令输入等是否都能正确执行。 (2)系统的功能是否符合系统分析和总体设计的要求。包括系统的功能和结构有无错漏,功能的分配与模块的分解是否合理等。 (3)系统的数据组织与存储是否符合设计的要求。包括检查数据的总容量,文件或数据库与子系统之间的数据联系等。 调试的关键是发现错误,因为只要发现错误,纠正就不难做到。为了有效地发现错误,我采用了两种调试方法:静态调试法、动态调试法 (1) 静态调试法 对文档、程序、数据等资料进行审核,找出其中的错误。这种方法不用运行程序,完全靠调试从文字资料的字里行间中进行检查,检查出其中最基本的错误进行改正。 (2) 动态调试法: 通过程序系统的运行,在程序的“动态”执行中检查和发现错误。我在正确掌握程序的功能要求的情况下,采用该测试犯法对程序进行了一系列的调整。 我采用了静态调试和动态调试相结合的方法,经历了分调、联调和总调阶段,运用适当的测试用例,对系统进行了测试。经过系统测试,程序运行中出现的一些问题和难点在老师的大力帮助下已经一一得到解决,程序基本上实现了图书的管理要求。 测试方法 一般来说,对程序测试有两种测试方法:如果已经知道了软件系统应具有的功能,可通过测试来看每个功能是否都能正常使用;如果知道程序的内部工作过程,可以通过测试来检测程序每步是否按照规格说明书的规定正常运行。前一种方法称为黑盒测试,后一种方法称为白盒测试。黑盒测试又成为 功能测试,白盒测试又称为结构测试。 因为此次软件较小,而且时间较短,我采用的是模块测试方法。 测试方案 添加系统用登陆 借书 还书 户 输入的用户名=小张用户名=选择查询图书按读者信息或者图书信息 信息 /密码=aa 张强/密的方式后点确查询要还的书,点确定 确认密码=aa 码=aa 定 预期结出现“添加用进入编目弹出“借书”窗弹出“确定要还这本书 果 户成功”的提模块 口 吗,”的窗口提示 示信息 输入结出现“添加用进入编目弹出“借书”窗出现“确定要还这本书 果 户成功”的提模块 口 吗,”的提示信息 示信息 (2) 心得体会 决胜全面小康心得体会学党史心得下载党史学习心得下载军训心得免费下载党史学习心得下载 历经大半个学期的努力,我的图书管理系统终于如期完成了。此次做系统给我最大的感触有两个。第一个就是有了一个利用本专业所学到的知识,来练习,实践的机会。以前我也学了VC++语言等编程语言,但那时我做的仅是用一些零零碎碎的知识,简简单单的语句 来解决一些小问题而已。此次做系统却给了我一个机会,一个需要将所学到的有关数据库,管理信息系统以及VC++编程三方面的所有的知识结合起来,用自己的汗水浇灌,并最终结出甜美果实的机会。 通过进行图书馆管理系统的开发,进一步明确了研制一个管理信息系统的方法和思路,将系统开发的各阶段的基本活动贯穿起来,使我更加形象、具体的了解了管理信息系统。系统开发的过程是一个巩固以前所学的计算机软件开发知识,掌握新技能的过程。我从这一阶段工作中收益非浅,通过前段时间的毕业设计,我能够融会贯通这几年所学的专业基础知识和专业理论知识,对当前计算机软、硬件技术的发展有了进一步地了解和认识,培养我们综合运用专业知识分析问题、解决问题的能力及运用工具软件的能力。不仅弄清了以前对系统开发的一些模糊的认识,而且提高了软件开发的水平,培养了严谨的工作作风,为今后在工作岗位上用好管好计算机打下了坚实的基础。 在做系统的过程中,我遇到的最大的困难是调程序方面的。在运行程序的过程中经常会出现程序自行中断,需要进行调试的信息。这些信息使得我不得不反复看书,琢磨程序。在一遍一遍的调试之下,程序终于被调通了。那时,我终于可以上上的舒一口气了。 我的系统规模比较小同时由于我的时间和能力等多方面的因素影响,我们的系统也存在一定的缺陷。比如系统的界面不够美观,有的功能不够完善等。对此还请老师给与批评指教,使我能过了解到我系统中所存在的缺陷与不足。
本文档为【软件工程设计实验报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_633423
暂无简介~
格式:doc
大小:145KB
软件:Word
页数:42
分类:互联网
上传时间:2017-10-27
浏览量:60