管理信息系统课程设计图书管理系统.doc
管理信息系统课程设计目录1设计题目22设计目的23设计任务24设计准备24.1 系统准备24.2 知识准备25系统分析25.1任务分析25.2功能分析35.3功能需求35.4 系统建设目标35.5 部分要求说明36系统设计36.1 体系结构36.2 功能框图46.3 数据库结构41. 读者类别表(ReaderType)42. 读者信息表(Reader)43. 图书信息表(Book)54. 借阅信息表(Borrow)56.4 功能模块51. 图书管理52. 读者管理53. 借阅管理64. 数据统计65. 系统管理66.5 界面设计61. 登录窗口62. 总体界面73. 菜单设计74. 查询图书信息75. 添加图书信息86. 添加读者信息97. 查询读者信息98. 添加读者类别信息99. 修改读者类别信息1010. 借书1011. 续借1012. 还书1113. 查询读者借阅信息1114. 按借阅统计信息1115. 按图书统计信息1116. 查询个人借阅信息1217. 用户管理127 系统实现127.1数据库部分主要代码127.2 数据库操作公共类147.3 业务实体类187.4 数据访问层207.5 业务逻辑层227.6 表示层268 小结351设计题目图书管理信息系统2设计目的通过对图书管理信息系统的系统分析、系统设计、编码和调试等工作的实践,了解管理信息系统的一般设计方法和实现思路,深入了解数据库设计的基本理论及方法。3设计任务要求完成一个具有一定实用价值的图书管理信息系统,主要任务包括: 在SQL Server 2000或SQL Server 2005环境下建立图书管理信息系统所使用的数据库,利用企业管理器或查询分析器建立各种数据库对象,包括:数据表、视图、约束、存储过程和触发器等; 了解数据库引擎技术,并掌握使用ADO.NET连接数据库服务器和客户端应用程序; 掌握使用C#或其他语言开发一个数据库系统的基本方法和步骤,应用程序的功能包括:数据的输入、修改和删除;数据的浏览和查询;数据的图形化、报表以及打印输出;系统的用户登录和权限管理; 了解多层C/S或B/S体系结构的数据库系统的开发过程:需求分析、系统设计、系统实现及文档的收集和整理。4设计准备4.1 系统准备操作系统:Windows xp数据库系统:SQL Server 2000 或 SQL Server 2005客户端开发工具:Visual Studio 2005或其他开发工具4.2 知识准备熟悉SQL Server 2000 或 SQL Server 2005的使用;熟悉C#、ASP.NET或其他语言进行数据库编程。5系统分析一直以来人们使用传统的人工方式管理图书馆的日常工作,对于图书馆的借书和还书过程,想必大家都已很熟悉。在计算机尚未在图书馆广泛使用之前,借书和还书过程主要依靠手工。一个最典型的手工处理还书过程就是:读者将要借的书和借阅证交给工作人员,工作人员将每本书上附带的描述书的信息的卡片和读者的借阅证放在一个小格栏里,并在借阅证和每本书贴的借阅条上填写借阅信息。这样借书过程就完成了。还书时,读者将要还的书交给工作人员,工作人员根据图书信息找到相应的书卡和借阅证,并填好相应的还书信息,这样还书过程就完成了。 以上所描述的手工过程的不足之处显而易见,首先处理借书、还书业务流程的效率很低,其次处理能力比较低,一段时间内,所能服务的读者人数是有限的。利用计算机来处理这些流程无疑会极大程度地提高效率和处理能力。我们将会看到排队等候借书、还书的队伍不再那么长,工作人员出错的概率也小了,读者可以花更多的时间在选择书和看书上。 5.1任务分析本系统主要用于学校教师和学生图书管理,主要任务是通过建立图书管理系统,完善学校图书录入、借还以及读者信息的管理,通过查询可立即定位该读者的相应的信息,可以对图书进行查询、增加、修改,读者可以预约已借图书,针对这些问题设计此系统。5.2功能分析通过建立图书管理系统,把图书馆的图书管理、读者管理、图书借阅管理等日常管理工作实行计算机统一管理,以提高工作效率和管理水平。这些管理包括:1、图书基本信息的管理,包括增加、修改、查询;2、读者基本信息的管理,包括增加、修改、查询管理;3、图书借阅的管理,包括借书、还书、续借;4、系统管理,主要是增加用户、修改维护用户信息。5.3功能需求通过以上的功能分析,该系统要完成以下的功能需求。1、管理员与读者用户登录后有不同的权限,管理员具有管理和查询全部的权限,读者用户只有查询权限。2、图书管理功能,用于实现添加和修改图书纪录。3、图书查询功能,用于查询借阅图书信息和统计借阅纪录。4、读者服务功能,用于添加和修改读者纪录及信息。5、图书借阅功能,主要用于图书借还。6、用户主要用于用户信息和密码修改。5.4 系统建设目标 (1)要解决的问题随着办公自动化水平的不断提高,现在学校管理学生信息也逐步从手工转到计算机自动化信息处理阶段。设计一个功能完整、操作简便、界面友好的学生信息管理系统已经是势在必行的了。 由于原先图书管理采用的人工系统,浪费人力物力财力,图书管理系统可以改善这种情况,只需一台电脑和一个管理员老师就能轻松完成。(2)系统开发的目的提高图书管理工作的效率,减少相关人员的工作量,使学校的图书管理工作真正做到科学、合理的规划,系统、高效的实施,提高对借阅图书以及读者信息管理的速度。减少人力的投入的同时提高了信息处理的精度和准确度,在输入无误的基础上可保证数据的正确性。(3)开发带来的好处改进了管理服务的质量,可由系统对图书进行自动分类、归类,读者信息整理、借阅情况登记入档。改进人员的利用率,减少了前台操作人员,更多的人员可用于为借阅者服务、更新图书等其他事物,节省人力资源。5.5 部分要求说明图书信息包括:每种图书都有书名、ISBN、一名或多名作者(译者)、出版社、定价和内容简介等;读者信息包括:借书证记录有借阅者的姓名、密码、类别和所在单位等;读者凭借书证借书,教师最多借书15本书,借书期限最长为90天,学生最多借书8本书,借书期限最长为30天。对于超期未还的读者不能继续借书,每本书每超期一天罚款0.05元。6系统设计6.1 体系结构要求使用多层(三层)C/S或B/S模式开发该系统。简单的客户/服务器体系结构的数据库应用系统开发周期短,能够适应大部分中小型数据库应用系统的要求(当客户端数量少于50时),但是,随着数据库应用的日益发展、数据容量的不断增加、客户端数量的不断增多,这种体系结构显示出了诸多缺陷。所谓三层体系结构,是在客户端与数据库之间加入了一个“中间层”。它是指逻辑上的三层结构,即使在一台机器上也可构成三层体系结构的应用系统。三层分别为表示层、业务逻辑层和数据访问层。表示层(USL):为客户提供对应用程序的访问,以Windows应用程序或Web应用程序的形式提供实现的功能。业务逻辑层(BLL):实现应用程序的业务功能,以类库的形式为表示层提供服务。数据访问层(DAL):实现整个系统所有的数据库连接、数据存取操作,以组件类库的形式为业务逻辑层提供服务。此外,实体类,简单地说是描述一个业务实体的类。业务实体直观一点的理解就是整个应用系统业务所涉及的对象,从数据存储来讲,业务实体就是存储应用系统信息的数据表,将数据表中的每一个字段定义成属性,并将这些属性用一个类封装,这个类就称为实体类。业务实体可以认为属于业务逻辑层,当然,可以将业务实体单独作为一层,称为业务实体层。表示层、业务逻辑层、数据访问层都依赖于业务实体。各层之间数据的传递主要是实体对象(业务信息封装在实体对象中)。 6.2 功能框图该系统主要由五大功能模块组成:图书管理、读者管理、借阅管理、数据统计和系统管理。各大功能模块又由一些子功能模块构成,其功能框图如下。6.3 数据库结构1. 读者类别表(ReaderType)字段名数据类型说明rdTypeSmallInt读者类别【主键】rdTypeNameVarchar(8)读者类别名称CanLendQtyInt可借书数量CanLendDayInt可借书天数CanContinueTimesInt可续借的次数PunishRateFloat罚款率(分/天/本)DateValidSmallInt证书有效日期2. 读者信息表(Reader)字段名数据类型说明rdIDInt读者序号【主键】rdNamevarchar(10)读者姓名rdPwdvarchar (10)读者密码,初值为“123”rdSexBit性别,0-男,1-女rdTypeSmallInt读者类别【外键】rdDeptChar(8)单位代码rdPhonevarchar(25)电话号码rdEmailvarchar(25)电子邮件rdDateRegsmalldatetime读者登记日期rdBorrowQtyInt已借书数量ldPunishMoneyMoney罚款金额3. 图书信息表(Book)字段名数据类型说明bkIDInt图书序号【主键】bkCodeChar(20)图书编号bkNameVarchar(50)书名bkAuthorVarchar(30)作者bkPressVarchar(50)出版社bkDatePressSmalldatetime出版日期bkISBNChar(15)书号bkCatalogVarchar(30)分类名bkLanguageSmallInt语言,0-中文,1-英文,2-日文,3-俄文,4-德文,5-法文bkPagesInt页数bkPriceMoney价格bkDateInSmallDateTime入馆日期bkBriefText内容简介bkCoverVarchar(100) 或image图书封面照片bkIsInLabChar(4)或bit是否在馆4. 借阅信息表(Borrow)字段名数据类型说明rdIDInt读者序号【主键】bkIDInt图书序号【主键】ldContinueTimesInt续借次数(第一次借时,记为1)ldDateOutSmallDateTime借书日期ldDateRetPlanSmallDateTime应还日期ldDateRetActSmallDateTime实际还书日期ldOverDayInt超期天数ldOverMoneyMoney超期金额lsHasReturnBit是否已经还书,缺省为0-未还OperatorLendVarChar(10)借书操作员OperatorRetVarChar(10)还书操作员6.4 功能模块1. 图书管理添加图书信息:图书管理员可以将新书添加到数据库中。查询图书信息:所有用户可以按指定的组合条件查询图书,查询结果可以显示、预览、打印、导出到Excel文件。对于图书管理员,可以删除图书和修改部分字段的内容。2. 读者管理读者管理员可以添加读者类别和修改读者类别。读者管理员可以添加读者信息,可以按指定的组合条件查询读者,查询结果可以显示、预览、打印和导出到Excel文件,还可以删除读者和修改部分字段的内容。读者可以修改个人信息、密码和查阅个人的借阅信息。3. 借阅管理读者管理员可以给读者借书和还书。还书时如果图书超期,提示超期的天数,并计算罚款,记录归还相关信息。读者管理员还可按读者信息查询指定期间内的历史借阅信息和当前未还信息,按图书信息查询指定期间内的历史借阅信息和当前借阅读者信息。查询结果可以显示、预览、打印和导出到Excel文件。4. 数据统计图书管理员和读者管理员可以做如下统计:按图书的个别属性进行分类统计(如:图书编号前几位、出版社、出版年、入馆日期年、是否在馆等);按借阅的个别属性进行分类统计(如:读者类型、单位代码、借阅天数等)。统计结果可以显示、预览、打印和导出到Excel文件。5. 系统管理系统管理员可以浏览、添加、修改和删除用户信息。6.5 界面设计1. 登录窗口所有用户只有正确登录后,方可进入该系统,登录窗口如下。Ø 用户ID指“用户“表中的用户ID或“读者”信息表中的读者ID。2. 总体界面用户进入系统后,总体界面如下,左边是菜单栏,右边是处理窗口。3. 菜单设计不同角色的用户登录后,有不同的菜单,每个菜单对应不同的功能。不同角色的菜单设计如下。4. 查询图书信息图书管理员、读者管理员和读者均可查询图书信息,如下图。Ø 输入查询条件:图书序号采用完全匹配;图书编号采用左匹配;图书名称、作者、出版社采用模糊匹配;出版日期、入馆日期、库存数量支持区间条件。Ø 区间条件采用“”作为区间分隔符,日期区域输入如:2007-1-12007-3-31表示日期大于等于2007-1-1且小于等于2007-3-31,2007-1-1表示日期大于等于2007-1-1,2007-3-31表示日期小于等于2007-3-31。数量区域输入如:1030,10,30。Ø 输入文本若为空,表示没有约束条件。Ø 按下“查询”按钮后,将满足各个输入框中的条件相与的记录显示到网格中。Ø 查询结果可以预览、打印和导出到指定的Excel文件。Ø 按下“明细”按钮,可以查看选定图书的详细信息。Ø 若用户角色为图书管理员,可以按下“修改”或“删除”按钮。n 按下“删除”按钮,可以删除选择的图书。n 按下“修改”按钮,将修改的结果保存到“图书信息表”,成功修改后,显示提示信息。5. 添加图书信息只有图书管理员可以添加图书信息,如下图。Ø 输入或选择相关图书的信息。Ø 起始序号是系统自动获得到的最后入馆图书的序号加1,然后根据图书本数,自动生成图书序号。Ø 图书封面从扫描的文件得到,上传后存储到数据库相应记录中。Ø 按下“添加”按钮,向“图书信息表”中添加1条记录,成功添加后,显示提示信息。6. 添加读者信息只有读者管理员才可以添加读者信息,如下图。Ø 输入或选择相关图书的信息。Ø 按下“添加”按钮,向“读者信息表”中添加1条记录。成功添加后,显示提示信息。Ø 按下“修改”按钮,将修改的结果保存到“读者信息表”中。成功修改后,显示提示信息。Ø 按下“删除”按钮,可以删除选定的读者信息。7. 查询读者信息图书管理员、读者管理员均可查询读者信息,如下图。Ø 输入查询条件:读者编号、性别、读者类别采用完全匹配;读者姓名采用模糊匹配; Ø 输入文本若为空,表示没有约束条件。Ø 按下“查询”按钮后,将满足各个输入框中的条件相与的记录显示到网格中。Ø 查询结果可以预览、打印和导出到指定的Excel文件。8. 添加读者类别信息只有读者管理员才可以添加读者类别信息,如下图。Ø 输入或选择相关读者类别的信息。Ø 按下“添加”按钮,向“读者类别信息表”中添加1条记录。成功添加后,显示提示信息。9. 修改读者类别信息只有读者管理员才可以修改读者类别信息。Ø 输入或选择相关读者的信息。Ø 按下“修改”按钮,修改“读者类别信息表”中相应的记录。成功修改后,显示提示信息。10. 借书读者管理员可以借书,如下图。Ø 输入读者编号后,系统自动显示读者姓名等信息;Ø 输入图书序号或图书名称,系统自动显示图书信息。Ø 按下“借书”按钮,向“借阅信息表”中添加1条记录(续借次数为0,计划还书日期为当前系统日期加上该读者可借书的最大天数,是否已经还书为0,借书操作员)。11. 续借读者管理员可以续借,如下图。Ø 输入读者编号后,系统自动显示读者信息以及该读者的所有借阅图书。Ø 选择要续借的图书,按下“续借”按钮,修改“借阅信息表”中对应记录的相关信息(续借次数加1,计划还书日期加上可以借书天数,超期金额,罚款金额,借书操作员)。成功续借后,显示提示信息。Ø 注:只能对满足以下条件的图书才能续借:离还书日期只有1个星期,若已超期需交罚款金额,续借次数不能超过读者类型指定的次数。12. 还书读者管理员可以还书,如下图。Ø 输入读者编号后,系统自动显示读者信息,同时显示改读者的所有借阅图书。Ø 选择要还的图书,按下“还书”按钮,修改“借阅信息表”中对应记录的相关信息(实际还书日期为当前系统日期,是否已经还书为1,超期金额,罚款金额,还书操作员)。成功还书后,显示提示信息。13. 查询读者借阅信息读者管理员读者的查询借阅信息,如下图。Ø 输入查询条件:读者类别采用完全匹配;Ø 按下“查询”按钮后,将记录显示到网格中。Ø 查询结果可以预览、打印和导出到指定的Excel文件。14. 按借阅统计信息图书管理员和读者管理员可以按借阅统计信息。Ø 按读者类型统计借阅情况:按读者类型分类汇总统计,统计结果可以预览、打印、导出到Excel文件,还可以显示统计圆饼图。Ø 按单位代码统计借阅情况:按单位代码分类汇总统计,统计结果可以预览、打印、导出到Excel文件,还可以显示统计柱状图。Ø 按借阅天数统计借阅情况:按借阅天数区间分类汇总统计,天数区间按7天一个间隔分为7、14、21、28、35、42、49、56、63、70、77、84、91、91以上,统计结果可以预览、打印、导出到Excel文件,还可以显示统计柱状图。15. 按图书统计信息图书管理员和读者管理员可以按借阅统计信息。Ø 按图书类型统计借阅情况:按图书类型分类汇总统计,统计结果可以预览、打印、导出到Excel文件,还可以显示统计柱状图。Ø 按出版社统计借阅情况:按出版社分类汇总统计,统计结果可以预览、打印、导出到Excel文件,还可以显示统计柱状图。Ø 按出版年统计借阅情况:按出版年区间分类汇总统计,出版年区间按近10年一年一个间隔,以后5年一个间隔,最多50年,统计结果可以预览、打印、导出到Excel文件,还可以显示统计柱状图。Ø 按入馆年统计借阅情况:按入馆年区间分类汇总统计,入馆年区间按近10年一年一个间隔,以后5年一个间隔,最多50年,统计结果可以预览、打印、导出到Excel文件,还可以显示统计柱状图。16. 查询个人借阅信息读者可以查询本人的借阅信息,界面见查询读者借阅信息,其中读者ID自动关联读者本人。17. 用户管理系统管理员可以进行用户管理,首先在网格中显示全部用户信息,如下图。 Ø 按下“添加”按钮,弹出“添加用户”对话框,如下图。² 按下“添加”按钮,向“用户信息表”中添加一条记录。成功添加后,显示提示信息。Ø 按下“修改”按钮,弹出“修改用户”对话框,如下图。 ² 按下“修改”按钮,修改“用户信息表”中对应记录。成功修改后,显示提示信息。7 系统实现7.1数据库部分主要代码- Description:获取罚款率<Description, ,>CREATE FUNCTION GetPunishRate(rdID int) RETURNS floatASBEGIN DECLARE rate floatSELECT rate=PunishRate FROM ReaderType WHERE rdType in (SELECT rdType FROM Reader WHERE rdID=rdID) RETURN rateEND- Description:添加图书<Description,>CREATE PROCEDURE dbo.usp_AddBookbkID int,bkCode char(20),bkName varchar(50),bkAuthor varchar(30),bkPress varchar(50),bkDatePress smalldatetime,bkISBN char(15),bkCatalog varchar(30),bkLanguage smallint,bkPages int,bkPrice money, bkDateIn smalldatetime,bkBrief text,bkCover image=null,bkIsInLab bit, bkNum intAS WHILE bkNum>0 BEGIN INSERT Book VALUES( bkID,bkCode, bkName, bkAuthor, bkPress, bkDatePress, bkISBN, bkCatalog, bkLanguage, bkPages, bkPrice, bkDateIn, bkBrief, bkCover, bkIsInLab) SET bkID=bkID+1 SET bkNum=bkNum-1 END- Description:添加读者<Description,>CREATE PROCEDURE dbo.usp_AddReader rdID int, rdName varchar(10), rdPwd varchar(10), rdSex char(2), rdTypeName varchar(5), rdDept varchar(15), rdPhone varchar(25), rdEmail varchar(25), rdDateReg smalldatetime, rdBorrowQty intAS INSERT Reader Values( rdID, rdName, rdPwd, rdSex, rdType, rdDept, rdPhone, rdEmail, rdDateReg, rdBorrowQty)- Description:还书更新<Description,>CREATE PROCEDURE dbo.usp_ReturnBookrdID int, bkID int, OperatorRet varchar(10)ASDECLARE overMoney moneySET overMoney=0SELECT ldOverMoney FROM BorrowWHERE rdID=rdID AND bkID=bkID AND IsHasReturn=0UPDATE Borrow SET ldDateRetAct=GETDATE(), IsHasReturn=1, OperatorRet=OperatorRetWHERE rdID=rdID AND bkID=bkID AND IsHasReturn=0UPDATE ReaderSET rdBorrowQty=rdBorrowQty-1, PunishMoney=PunishMoney-overMoneyWHERE rdID=rdIDUPDATE BookSET bkIsInLab=1WHERE bkID=bkID- Description:添加借阅记录<Description,>CREATE PROCEDURE dbo.usp_AddBorrowRecordrdID int, bkID int, OperatorLend varchar(10)ASDECLARE date smalldatetimeDECLARE days intSET date=GETDATE()SELECT days=CanLendDay FROM ReaderTypeWHERE rdType IN(SELECT rdType FROM Reader WHERE rdID=rdID)INSERT Borrow Values(rdID, bkID, 0, date, DATEADD(DAY,days,date), NULL, 0, 0, 0, OperatorLend, NULL)UPDATE ReaderSET rdBorrowQty=rdBorrowQty+1WHERE rdID=rdIDUPDATE BookSET bkIsInLab=0WHERE bkID=bkID- Description:更新借阅表、读者表<Description,>CREATE PROCEDURE dbo.usp_UpdateBorrowASDECLARE today smalldatetimeDECLARE pm moneySET today=GETDATE()UPDATE Borrow SET ldOverDay=DATEDIFF(DAY,ldDateRetPlan,today), ldOverMoney=DATEDIFF(DAY,ldDateRetPlan,today)*dbo.GetPunishRate(rdID)/100WHERE IsHasReturn=0 AND Today>ldDateRetPlanUPDATE ReaderSET PunishMoney=sumOverMoneyFROM dbo.Reader,(SELECT SUM(dbo.Borrow.ldOverMoney) AS sumOverMoney, dbo.Reader.rdID FROM dbo.Borrow INNER JOIN dbo.Reader ON dbo.Borrow.rdID = dbo.Reader.rdID WHERE (dbo.Borrow.IsHasReturn = 0)GROUP BY dbo.Reader.rdID)SumMoney WHERE SumMoney.rdID=Reader.rdID- Description:更新借阅表<Description,>CREATE PROCEDURE dbo.usp_UpdateBorrowASDECLARE today smalldatetimeDECLARE pm moneySET today=GETDATE()UPDATE Borrow SET ldOverDay=DATEDIFF(DAY,ldDateRetPlan,today), ldOverMoney=ldOverDay*dbo.GetPunishRate(rdID)/100WHERE IsHasReturn=0 AND Today>ldDateRetPlanUPDATE ReaderSET PunishMoney=sumOverMoneyFROM dbo.Reader,(SELECT SUM(dbo.Borrow.ldOverMoney) AS sumOverMoney, dbo.Reader.rdID FROM dbo.Borrow INNER JOIN dbo.Reader ON dbo.Borrow.rdID = dbo.Reader.rdID WHERE (dbo.Borrow.IsHasReturn = 0)GROUP BY dbo.Reader.rdID)SumMoney WHERE SumMoney.rdID=Reader.rdID7.2 数据库操作公共类数据库操作类SqlHelper主要实现的功能有:打开数据库连接、关闭数据库连接、执行带参数的SQL语句,执行存储过程等。 / <summary> / 数据库基础操作类 / </summary> class SQLHelper / <summary> / 数据库连接对象 / </summary> private static SqlConnection conn = new SqlConnection( Properties.Settings.Default.ConnectionString); private static DataSet ds = new DataSet(); private static SqlDataAdapter sda; / <summary> / 打开数据库连接 / </summary> private static void OpenConn() try if (ConnectionState.Closed = conn.State) conn.Open(); catch (Exception) throw new Exception("数据库连接失败!"); / <summary> / 关闭数据库连接 / </summary> private static void CloseConn() if (conn != null) if (ConnectionState.Open = conn.State) conn.Close(); #region 执行SQL非查询语句,返回受影响的行数 / <summary> / 执行不带参数的SQL非查询语句,返回受影响的行数 / </summary> / <param name="sql">要执行的sql语句</param> / <returns>返回受影响的记录数</returns> public static int ExecuteNonQuery(string sql) int rows = 0; try OpenConn(); SqlCommand cmd = new SqlCommand(sql, conn); rows = cmd.ExecuteNonQuery(); finally CloseConn(); return rows; / <summary> / 执行带参数的SQL语句,返回受影响的行数 / </summary> / <param name="sql">要执行的sql语句</param> / <param name="parameters">参数集合</param> / <returns>返回受影响的记录数</returns> public static int ExecuteNonQuery(string sql, SqlParameter parameters) int rows = 0; try OpenConn(); SqlCommand cmd = new SqlCommand(sql, conn); if (null != parameters) foreach (SqlParameter param in parameters) cmd.Parameters.Add(param); rows = cmd.ExecuteNonQuery(); catch (SqlException ex) throw ex; finally CloseConn();