本文采用自顶向下的结构化的系统分析方法,阐述了一个功能全面的图书管理系统的开发过程、操作流程及其一些核心的技术。本文首先进行了项目概述,简单介绍了分析了企业的组织结构,系统开发的背景、系统开发的目的和系统开发的必要性;接下来是系统规划阶段,通过实际的业务流程调研,具体完成了图书管理系统的需求分析、可行性分析、现行业务流程分析,并通过对现行业务流程的优化,得出了系统的业务流程;之后是系统分析,具体完成了数据流分析和数据字典;系统设计阶段主要完成了功能模块的划分、数据库的设计和系统界面设计。该阶段对各个模块的功能进行了详细设计,形成了本系统的功能模块图,在此基础上选择了合适的开发模式;数据库的设计先进行了概念结构设计,之后进行了逻辑结构设计,最后完成了数据库表的设计。
根据前几个阶段的分析和设计,本系统使用C#技术进行基本页面的设计与功能实现,后台数据库选用SQL Server 2005数据库,系统在设计上采用C/S模式。本系统为图书管理提供了良好的基础。
关键词:图书管理系统 结构化分析 C#
I
The Information System and Management of AnShan Library
Abstract:In this paper, the top-down structured systems analysis methods, described the development process of a full-featured library management system, operational procedures, and some of its core technology. This article first overview of the project, a brief background of the organizational structure of the business, project development, the significance of the purpose of the project development and project development; followed by the system planning stage, through the actual process of business research, to complete a book management systems requirements analysis, feasibility analysis, analysis of existing business processes, and through optimization of existing business processes, and obtained the business processes of the system; followed by a systematic analysis of the specific data flow analysis and data dictionary; the system design phase completed the division of functional modules, database design and system interface design. Detailed design stage of the function of each module, forming a functional block diagram of this system on this basis, select the appropriate development model; database design is the first concept of structural design, followed by a logical structure design, and finally completed the design of the database table.
The first few stages of analysis and design of the system using C # basic page design and function to achieve the back-end database selected SQL Server 2005 database, the system design using C / S mode. This system provides a good foundation for the library management.
Keywords: Library Management system, structured analysis, C#
II
目 录
一、系统调查 ........................................................... 1 (一)鞍山市图书馆背景及组织结构 ...................................... 1 (二)系统开发的必要性 ................................................ 2 (三)系统开发目标 .................................................... 2 (四)系统开发的可行性分析 ............................................ 3 二、系统分析 ........................................................... 5 (一)需求分析 ........................................................ 5 (二)业务流程分析及业务流程图 ........................................ 5 (三)数据流程分析 .................................................... 6 (四)数据字典 ........................................................ 7 三、系统设计 ........................................................... 8 (一)功能结构设计 .................................................... 8 (二)代码设计 ....................................................... 12 (三)数据库设计 ..................................................... 13 (四)输入输出设计 ................................................... 14 四、系统实施 .......................................................... 16 (一)系统实施的任务 ................................................. 16 (二)系统实施的环境建设与设备购置 ................................... 16 (三)程序设计 ....................................................... 17 (四)系统调试与测试 ................................................. 18 (五)调试步骤 ....................................................... 19 结束语 ................................................................ 21 参考文献 .............................................................. 22 致谢 .................................................................. 23 附录A ................................................................. 24 附录B ................................................................. 41
III
一、系统调查
(一)鞍山市图书馆背景及组织结构
鞍山市图书馆前身为满铁鞍山图书馆,始建于1919年。1948年5月5日更名为鞍山市图书馆并正式开馆。1989年建立新馆,坐落在鞍山市铁东区胜利南路45号,建馆60周年,是国家一级图书馆。拥有藏书122万册,其中中文图书111万册、中文报刊10万余册、地方文献、满铁资料、电子文献2万余册、线装古籍2万6千册、CNKI大型数据库和万方数据库、自建数据库12个,数字资源丰富、数字图书馆已经启动。目前图书馆业务工作建立Interlib集成系统,采取藏、借、阅合一的开放式服务,馆藏文献全部向读者免费开放,实行全年无闭馆日的开馆时间,对外服务窗口有外借部、报刊部、地方文献部、电子阅览室、数字文献服务中心等。鞍山市图书馆的数字图书馆的服务功能:可以实现网上馆藏文献检索、查询、续借服务、网上课题咨询、跟踪服务;网上数字资源的查询、使用,下载服务,网上电子文献资料播放等。图书馆还以清代政、经、医、文等文献、地方文献、香港李国强文库、日本尼崎文库为馆藏特色,能够提供英文、日文等西文检索。数字图书馆藏有大型数据库和2万余种地电子图书等,广大读者可以网上资源,可以实现网上阅读、网上检索、网上续借等服务功能。图书馆还设有图书馆学会、读者协会、谱谍文化研究等群团组织。常年举办各种专题讲座、报告会、各种展览、培训班60余场、组织读书活动多达40余次,以其知识性和学术性工作服务于社会。图书馆于1998年晋升为“国家一级馆”,在业务工作方面建立了Interlib集成系统为主体的自动化管理,拥有现代化的多功能电子文献阅览室,外借、报刊、特色、信息咨询等多个服务窗口,提供信息开发、咨询服务,在省内市级馆中首批建立“全国文化信息资源共享工程”鞍山站,建有鞍山数字图书馆,馆藏文献丰富,文献利用率大幅提高。
鞍山市图书馆的高层管理有一名馆长、一名副馆长、一名办公室主任组成。一共分为7个部门,流通部、技术部、办公室、信息咨询部、期刊部、采编部、阅览部,具体的职能如下:
流通部主要职能是负责图书的典藏管理和图书的流通管理还有读者证件的管理。
技术部主要职能是负责局域网管理、网站的维护、业务系统管理、资源系统管理、员工们的技术培训。
办公室主要职能是负责行政管理、业务协调、文献复印管理、书刊的装订。 信息咨询部主要职能是负责科技的查新、馆际间的互借、信息检索服务、参考咨询服务、检索技术辅导。
1
期刊部主要职能是负责期刊的阅览管理和期刊的编目管理。
采编部主要职能是负责图书的采访和图书的编目,并编辑新书通告。 阅览部主要职能是负责图书的借还处理、图书的摆放及归位管理。 组织结构图如图1.1所示:
(二)系统开发的必要性
随着计算机产业的迅速发展,电子计算机已广泛的应用于信息管理、文字处理、辅助设计、辅助教学及人们的日常生活中。图书管理系统主要是针对图书信息的一系列相关工作的管理,本系统的建立使图书的管理更加规范化、系统化,查询手段更加便捷化。
随着我国市场经济的迅速发展和人们生活水平的不断提高,以前的人工管理方式已经不再适应现在的环境,为了更好的适应信息时代的高效性,一个利用计算机来实现图书管理工作的系统将必然诞生。计算机技术在现代管理中的应用,使计算机成为领导者和管理人员应用现代技术的重要工具。计算机辅助图书馆管理活动,可以极大地增强管理者采集、处理信息的能力,从而有利于管理者及时决策。计算机系统能根据管理过程的变化情况,将原始数据、资料等进行加工、保存,管理人员可以在解决具体问题需要信息资料时,随时进行检索查询,了解整个图书管理系统的动态情况,进行动态管理,从而有效的处理图书的管理工作,实现对图书信息管理的自动化,提高效率。图书管理工作面对大量的可模块化处理的信息,是当今信息革命的一个重要阵地。我开发图书管理信息系统就是采用现代化的信息管理方式代替手工管理方式,提高图书管理工作效率,作到信息的规范管理,科学统计和快速查询,让图书馆更好的为社会,学校乃至广大人民服务。图书管理系统的开发目的是使图书管理模式从手工记录转变成信息管理,为图书管理人员提供方便条件。对实际情况进行调研之后,进行详细的需求分析,对现有的管理模式进行改进,开发出一套新型的管理系统,从中领悟系统开发的思想,掌握系统开发的流程和方法。随着信息系统的不断完善,报名的管理将越来越依赖于信息化的管理。所以,系统开发将围绕图书馆管理工作的实际情况,使之能迅速适应需要。
(三)系统开发目标
图书管理系统是面向管理员以及广大读者使用的,要满足管理员和读者的需求。能够输入图书的综合情况以及对现有图书信息的一系列的操作,能够实现对读者档案进行查询和编辑的管理,能够实现罚款记录及查询功能,能够实现系统维护保密功能。基于系统需求分析需要满足的功能,系统开发的目标是:
1、由于操作人员的计算机知识普遍偏低,因此要求系统具有良好的人机界面,
2
操作流程简易、直接,不需要对操作人员做太多的培训。
2、如果系统的使用对象较多,则要求有较好的权限管理。读者在系统内有过记载的,有有效的证件号才能登陆。系统管理员可以对系统的密码做更正,能对系统进行及时的保密防范措施。
3、方便的数据查询,支持多条件查询,读者信息、图书信息一目了然。 4、数据计算自动完成,尽量减少人工干预,这样能够确保数据准确性,减少人为操作的错误。
(四)系统开发的可行性分析
可行性分析的任务,并不是所有问题都有简单明显的解决办法,事实上,许多问题不可能在预定的系统规模之内解决。如果问题没有可行的解,那么花费这项开发工程上的任何时间、资源、人力和经费都是无谓的浪费。
可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决。可行性研究的目的不是解决问题,而是确定问题是否值得去解。必须分析几种主要的可能解法的利弊,从而判断原定的系统目标和规模是否现实,系统完成后所能带来的效益是否大到值得投资开发这个系统的程度。
可行性研究实质上是要进行一次大大压缩简化了的系统分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。所以从以上的分析原则来看,我所设计的图书馆管理信息管理系统是一个规模不太大的系统,但是目标明确,清晰的描述了对目标系统的一切限制和约束。本系统几乎在所有的图书馆都能使用,当然它需要进一步的完善和更新。在使用过程中,要看它能不能带来效益,在现今社会效率是第一位的,如果不适合管理的要求,自然不能被采用。从现实看,这还是有一定的实用价值的,从另一个角度看,现实社会发展飞速,尊重科技势在必行,因此这也是开发本系统的一个非常重要的原因。21世纪是计算机的时代,它必然取代一部分人的工作,高科技的监控系统进入社会生活的方方面面是发展的趋势。新系统不仅能利用当前的软件开发技术和校园网建设成果,方便读者查询、借阅操作,而且能结合学校资金投入有限、图书需求量大等特点,对图书管理中各业务环节的加强管理。系统在实现时,实现传统的验收、编目、典藏、流通和管理。我从技术、经济、管理、操作四个方面对本系统的可行性进行分析和研究。
1、技术可行性
主要分析现有技术条件能否顺利完成开发工作,硬件、软件配置能否满足开发者的需要。图书馆管理系统的工作主要是在读者和图书馆之间架设一座桥梁,能相互沟通信息和处理信息。计算机硬件和软件技术的飞速发展,为系统的建设提供了技术条件。该系统拟采用成熟的数据库技术与系统开发技术,使用Microsoft
3
SQL2005和.NET技术。开发本系统在编写程序时,不需要输入繁琐的程序代码,这大大简化了应用系统的开发过程,并提高了系统的模块性和紧凑性。SQL Server 2005是Microsoft公司推出的基于客户/服务器(C/S)模式的数据库系列,它提供了强大的企业数据库管理功能,是目前世界上的几个主流数据库管理系统之一。在安全性、准确性、运行速度方面有绝对的优势,并且处理数据库量大,效率高。
因此,图书管理系统具有技术可行性。 2、经济可行性
经济可行性分析要估计项目的成本和效益,分析项目经济上是否合理。即进行成本效益分析,评估项目的开发成本,计算开发成本是否会保证项目预期的全部利润。
系统的开发基于本人对程序开发的实践学习而来,无需资金投入,并且系统对软件和硬件的投资要求都不高,在网络和外接设备上的投资也不高,并且实现系统实施后,节省了劳动力、提高了工作效率,并且提高了管理数据的及时性、准确性,有助于提升鞍山市图书馆的管理水平,降低管理成本。
因此,图书管理系统在经济上是可行的。 3、管理可行性
人们也对图书馆有所了解,所以对图书馆系统理解起来应该比较容易,很容易被人所接受。有利于管理效率的提高。为图书馆提供长期的、快速的、持续的服务。切实减轻管理人员的负担,实现各个图书馆管理的电子化、信息化。
因此,图书管理系统在管理上是可行的。 4、操作可行性
系统的开发符合Windows标准规范,系统的操作和界面均类同于Windows系统。系统使用者只需了解Windows的基本操作要领,经过短时间的培训即可熟练应用该系统,同时也降低了对操作员的培训成本。
因此,图书管理系统在操作上是可行的。
综上所述,系统的开发和实施无论从技术上,经济上还是操作上都是可行的,因此,可以进一步进行系统分析和设计,完成这个图书管理系统的开发工作。
4
二、系统分析
(一)需求分析
鞍山市图书馆管理系统必须提供读者信息、图书信息、图书超期提醒、图书排行信息等等的基础设计,提供精确查找和模糊查找信息的功能,可以分不同权限、不同用户对该系统进行操作,也就是说,图书管理员和读者都可以进入该系统来进行操作。另外,该系统还必须保证数据的安全性、完整性和准确性。
鞍山市图书馆管理信息系统的目标是实现读者和图书信息化管理,减少信息的冗余,减少员工的工作量。图书馆管理信息系统可以为鞍山市图书馆节省大量的人力资源,减少管理费用,节约时间,提高管理效率,具体功能需求如下:
1、图书分类管理,所以需要有图书类型信息,书架类型信息,出版社信息,且每种图书都必须属于一个图书类型,有相应的出版社和摆放在对应的书架上。
2、在涉及图书数量的地方,要给出相应的计量单位。 3、读者的管理要包括读者的各种详细信息。 4、图书超期要有相应的惩罚金额。
5、图书信息管理和读者信息管理要有相应的操作信息。 6、当进行借还操作后,能相应的更新库存。
7、只有图书管理员和读者使用正确的密码编号进入系统后,才可以使用系统。 8、在图书排行榜中,需列出图书的借阅次数,以此作为依据进行图书的排榜。
(二)业务流程分析及业务流程图
1、图书管理员业务流程描述:
当读者要借阅图书时,图书管理员对读者的资格进行审核,审核合格后,将书借给读者并同时修改图书的借阅信息。图书管理员接收到读者归还的图书时,对图书进行审核,检查图书是否有破损、是否有涂抹的痕迹,审核合格后,图书管理员接收归还的图书并修改图书归还信息。图书管理员接收到读者发送过来的图书续借单和图书预约单,对图书续借单和图书预约单进行审核,审核合格后,修改图书续借信息和图书预约信息。图书管理员可以随时修改读者的相关信息,根据读者信息中的超期信息向读者发出超期提醒及超期罚款通知单。图书管理员随时查看留言板的信息并根据留言板上读者的留言,及时给与读者回复,并可以在留言板上发布公告,例如:新书上架通知、图书馆规则的新编等等。读者管理员随时更改图书信息并将图书信息、图书预约信息和图书排行榜单发送给图书采购管理员,以便图书采购管理员以后采购图书时不会盲目地购进图书。将图书信息发送给图书库存管理员,以便图书库存管理员根据现有的图书信息的现状,及时将库存中的图书出库,
5
及时满足读者的需要。
2、读者业务流程描述:
读者根据自己的证件号可以登陆到自己的管理界面,可以随时参阅自己的相关信息,读者根据自己自身的情况向图书管理员发出图书续借单,等待图书管理员的审核,审核成功后,就会在自己的信息表中查阅到相关信息。读者可以参阅现有图书信息表并根据自身的需求向图书管理员发出图书预约单,等待图书管理员的审核,审核成功后,就会在自己的信息表中查阅到相关信息。读者可以查看到图书管理员发出的图书超期提醒和超期罚款通知单,根据通知单上的要求,读者去相关部门办理罚款手续。读者可以根据自己的需求和满意程度向图书馆提出意见和评价以留言的形式告诉图书管理员。
图书馆管理业务流程图如图2.1所示:
(三)数据流程分析
数据流程是指数据在系统中产生、传输、加工处理、使用、存储的全过程。信息原始数据经采集后,输入计算机系统,进行模式或统计运算,或按用户的特殊要求编制某种专门程序来加工处理数据,然后输出结果数据。数据流程分析是把数据在现行系统内部的流动抽象的独立起来,舍去了具体组织机构、信息载体、处理工具等,单从数据流动过程来考查实际业务的数据处理模式。数据流程分析主要包括对信息的流动、变换、存贮等的分析。其目的是要发现和解决数据流动中的问题,并找出加以解决的方法。
数据流程与数据流程分析是今后建立数据库系统和设计功能模块处理过程的基础。描述数据流程的工具是数据流程图以及其附带的数据字典、处理逻辑等图表。其中数据流程图是描述系统逻辑模型的主要工具,它以少数几种符号综合地反映出信息在系统中的流动、存储和传递。
在业务流程分析的基础上,对数据流进行了分析,从数据流动过程考察了鞍山市图书馆实际业务的数据处理模式。该系统的数据流图分为顶层、一层、二层。
顶层数据流图如图2.2所示:
该系统将设计成为支持多个管理员登陆以及读者可以多人登录的操作系统,为了确定系统主要信息的处理功能,将整个系统分解成图书查询、读者信息处理、图书借还处理、图书预订处理、图书续借处理、读者留言处理等部分确定每个处理的输入和输出的数据流以及与这些处理有关的数据存储。根据各处理和数据存储的输入与输出数据流的关系,将外部实体、各处理以及数据存储用数据流连接起来,为各个数据流和处理命名、编码。一层数据流程图如图2.3所示:
6
当对数据流图分层细化时必须保持信息连续性,当把一个处理分解为一系列处理时,分解前和分解后的输入输出数据流必须相同。
图书借还处理二层数据流程分析:图书借还处理数据流可以从图书归还和图书借阅两方面进行分析,图书管理员根据还书记录修改图书库和借阅库,图书管理员根据读者库里的信息检查读者是否注册,读者有效则查看图书库是否有现存,有现存则借阅成功,修改图书库和借阅库。图书借还处理二层数据流程图如图2.4所示:
图书查询处理二层数据流程分析:读者按图书编号及书名从图书库查询并将查询结果反馈给读者。图书查询处理二层数据流程图如图2.5所示:
图书预订处理二层数据流程分析:读者根据查询结果来预订图书,根据读者库里的读者信息检查读者是否已存在,验证有效后,进行图书预订处理。图书预订处理二层数据流程图如图2.6所示:
读者留言处理二层数据流程分析:读者留言存储在留言库中汇总在一起反馈给图书管理员,供图书管理员查看。读者留言处理二层数据流程图如图2.7所示:
(四)数据字典
为了对数据流程图中的各个元素做出详细说明,所以在此通过数据字典来描述数据流程图中的数据项、数据存储、数据流、外部实体和逻辑处理,见表2.1至2.5.
7
三、系统设计
系统设计是新系统的物理设计阶段。根据系统分析阶段所确定的新系统的逻辑模型、功能要求,在用户提供的环境条件下,设计出一个能在计算机网络环境上实施的方案,一句话概括就是把系统需求转换成用系统表示的过程。通过对目标系统的分析和研究,做出了图书管理系统的总体规划,这是全面开发系统的重要基础。在对图书管理系统全面分析调查的基础上,制定出图书管理系统的物理模型,物理模型主要解决怎样做的问题,这是系统设计的主要任务。系统设计的好坏直接影响系统功能能否实现的问题,所以系统设计是非常重要的,我在这里从功能模块设计、代码设计、数据库设计、输入输出设计四个方面进行对系统的设计。
(一)功能结构设计
根据系统的要求,这个图书馆管理系统的管理员的主要功能模块包括读者信息管理、图书管理、图书借还管理、系统查询、系统设置、排行榜、系统辅助工具、管理员留言板8个主要的功能模块。每个主功能模块中都包含各个小的模块。读者的主要功能模块包括读者信息查看、图书信息查看、读者操作和留言板4个主要的功能模块。
该系统的图书管理员功能模块图如图3.1所示: 该系统的读者功能模块图如图3.2所示:
图书管理员功能模块分析如下: 1、读者信息管理模块
读者信息管理这部分功能是提供管理员对读者的信息进行管理。当操作人员想添加读者信息时,会出现一个对话框,里面包括所必须填写的全部信息,填写完毕后点击确定,新添的读者信息会自动添加上显示在页面。每次添加时都会对读者的编号进行检测,当编号与现有人员的编号相同时,将会弹出一个提示信息,该编号以被人使用过。所以在这里,一个读者对应一个编号,这是原则,绝对不会出现重复的情况。当操作员想删除某一读者信息时,也会出现一个对话框询问是否确认删除,以防操作员失误误删了读者信息。当操作员想修改某一读者信息时,该读者的信息将以一个对话框的形式显示。操作员想修改哪一部片,就直接在对话框内做修改,但是读者的编号是不可以被修改的,那是被系统检测过的,读者永远都只是相同的一个。
2、图书管理模块 (1)图书类别设置
图书的类别设置是以一个对话框形式显示提供操作员对图书的类别进行设置,对话框的下边记载着总共的条数。添加、删除、修改等操作后必须进行保存操作,
8
不然数据将不被保存。这个功能模块必须要求图书管理员认真的填写,因为有关各个类别的图书借阅的天数不同,这直接影响读者对该书的可借阅的天数,也就是图书应还的天数。该对话框制作了退出按钮,点击退出按钮即可退出该对话框,回到主页面。 (2)书架管理
书架管理是以一个对话框形式显示的,提供操作者对书架的名称及编号进行管理。添加、删除、修改等操作后必须进行保存操作,不然数据将不被保存。该对话框制作了退出按钮,点击退出按钮即可退出该对话框,回到主页面。 (3)出版社设置
出版社设置是以一个对话框形式显示的,提供操作者对出版社的名称及ISBN进行设置。对话框的下边记载着总共的条数。添加、删除、修改等操作后必须进行保存操作,不然数据将不被保存。该对话框制作了退出按钮,点击退出按钮即可退出该对话框,回到主页面。 (4)图书信息管理
图书信息管理以一个页面显示的,图书管理员可以对图书的相关信息进行一系列的操作,选择添加,会弹出一个对话框,图书管理员可以对需添加的图书进行信息编写,编写的内容符合条件,选择保存,图书将被添加到列表中。选中某一图书,选择修改,又会弹出一个对话框,该书的信息将被显示在内,图书管理员可以对其进行修改,修改的内容符合条件时,点击保存,图书信息将被修改并显示出来。选中某一图书,选择删除,会弹出一个对话框:是否确认删除,选择删除,该书信息将在列表中消失。图书管理员可以根据图书的书名和类别对图书进行查询,输入查询的信息,点击查询,符合条件的图书将显示在列表中,如果没有符合条件的图书,列表将为空,在点击全部按钮,所有图书又会全部被显示出来。图书管理员结束自己的操作,点击退出,将退出到主页面。
3、图书借还管理模块
图书借还管理是提供图书管理员对读者借还、预约图书等信息的管理,图书管理员可以通过查询条件中读者编号和读者姓名把每个读者的信息调出来,在页面的上方可以显示出来。可以将该读者的借还和预约情况显示出来,也可以对读者的借还和预约情况进行操作。选中某个读者后,点击借阅,就会自动将所有的图书信息显示出来,在查询框中输入所要查询的图书的条件,点击查询,就能看到所查图书的相关信息,选中某个图书就能借阅了,当所选中的图书的现存量已经为零时,会弹出一个提示信息:“此书已没库存,是否预约该书”。选择取消,就会回到原页面,选择确定,就会预约这本书,在预约框中显示出这本书。但是,当这本书已经全部被别人所预约,则无法再预约该书。图书管理员在某读者的信息框中选中某本书,
9
选择续借,该书的续借情况就会被修改成功。同样在读者的信息框中选中某本书,选择还书,该书的归还情况就会被修改成功,在该读者的借阅信息的框中将不再显示这本书。在读者的预约框中,选中某本书,选中借阅预约,如果这本书现存量为零,则提示该书没有库存暂时无法借阅,如果这本书已经被其他的读者归还了,在借阅预约框中的现存量显示就不再为零时,则可以借阅该书并会显示借阅预约成功,在预约框中不会再显示出该书,但在该读者的借阅框中会显示出该书。在读者的借阅框中会显示出这本书的借阅时间,根据书的可借阅的时间,还会显示出书的应还时间。在读者的借阅预约框中,已经为读者设置了预约的期限,期限为15天,在15天内,该书被其他人归还则可以借阅,但在15天之后,该书仍没有被他人归还,则预约时间将超过预约期限,预约将失效,如果仍想预约借阅,则必须重新预约借阅。各个操作结束后点击退出,就会退出到主页面了。
4、系统查询模块 (1)图书档案查询
图书档案查询也是提供读者管理员对图书的信息进行管理,可以对图书进行一系列的操作,和前面的操作是一样的。 (2)图书借阅查询
图书借阅查询也是提供读者管理员对读者的借阅信息情况进行操作的,和图书借还管理的操作情况是一样的。 (3)读者档案查询
读者档案查询也是提供读者管理员对读者的各个信息进行操作,可以对读者的信息进行一系列的操作。 (4)超期提醒
超期提醒会提供读者管理员有关超期图书的相关信息,包括超期的图书的借阅时间以及借阅的应还时间的,借阅该书的读者的相关信息也会被显示出来,包括借阅者的编号、姓名、证件号、联系方式等等。超期罚款的金额是按从超期的第二天算起,每超一天多增加0.1元累计计算出来的。
5、系统设置 (1)更改密码
更改密码提供操作者对系统信息的保护。如果密码泄露,读者的各种信息被泄露出去,被不法分子所利用,将会对读者造成很大的伤害,对图书馆的声誉也有一定的影响。所以为了防患于未然,图书管理员的登陆密码的保护是十分关键的。更改密码的功能提供操作者随时可以对密码进行更改,我是比较建议每隔一段时间,就进行一次密码的更改。修改密码是以一个对话框显示出来的,输入管理员的用户名,再输入原密码,第三行是输入新密码,最后一行是再次确认密码。如果两次输
10
入的新密码不同,则会弹出一个提示:密码输入的不一致,请重新输入。这样设置的好处是为了防止管理员失误输入了一个错误的密码,而自己却全然不知,下次登录时却登录不上去了,才发现更改密码时新密码输入错误了,这就会造成很大的不必要的麻烦。如果原始的密码输入不正确,则密码更改仍是不能成功,这会防止不法分子随意篡改密码,造成不好的影响。正确的输入密码后,点击确认就会提示出密码修改成功的对话框。放弃修改,点击取消,就会回到主页面。 (2)退出系统
图书管理员的操作全部结束后,则选择退出系统,就会退出这个图书管理系统。
6、排行榜
这功能会提供图书管理员有关读者对图书的喜好情况作一个统计,这个功能是按某本书的借阅次数做一个统计并将此作为排行榜的依据,但是我认为应该将借阅的次数和图书的预约数都统计出来一起作为排行榜的依据,那样比较合理。排行榜这个功能可以清楚的显示出每本图书的受欢迎程度,能够让图书管理员在图书的采购数量及时间有一个很好的规划,防止图书管理员盲目的去采购,造成不必要的浪费。
7、系统辅助工具 (1)记事本
记事本是一个辅助工具,是连接到本机记事本的,是帮助图书管理员记录一些日常事情,类似与备忘录一样的。 (2)计数器
计数器也是一个辅助工具,也是连接到本机的计数器的,是帮助图书管理员完成一些简单的计算。
8、管理员留言板
图书管理员在留言板内可以看到各个读者的留言,并在此内为每个读者的留言进行回复,解答每个读者的问题。
读者功能模块分析如下: 9、读者信息查询模块
作为本系统注册过的读者,可以登陆到这个系统中,对自己的信息进行查询,包括自己的基本信息,是否有图书的超期罚款以及可以查看自己的借阅信息和自己的图书预约信息,及时查看图书的现存情况,及时的进行预约,查看自己的预约期限,以免过期。
10、图书信息查询模块
作为本系统注册过的读者,可以登陆到这个系统中,对图书的各个信息进行查
11
询,全部记载的图书都将显示在页面中,读者可以根据图书的书名和类别对想要借阅的图书信息进行查询,符合查询条件的图书将被调出来,点击全部,所以有图书将被显示出来。
11、读者操作模块 (1)读者借阅及预约操作
作为本系统注册过的读者,可以登陆到这个系统中,对图书相关的信息进行操作,读者可以预约图书。读者查到自己想要借阅的图书时,并且没有现存时,则会弹出一个对话框:此书没有现存是否预约,选择是,则会向读者管理员发出预约图书申请并等待读者管理员确认,确认后,读者会在读者信息功能界面中的图书预约部分看到。
(2)读者续借操作
作为本系统注册过的读者,可以登陆到这个系统中,对图书相关的信息进行操作,读者可以续借图书,当读者发现自己已借的图书快到借阅的期限但是自己还没有看完时,读者可以选择续借,以免因为图书超期而罚款,等待管理员确认,确认后,读者就成功的续借了图书。
12、留言板
读者登陆到该系统后,可以在留言板上留言,将自己想看的图书但图书信息表中并没有记载的图书以留言的形式告诉读者管理员。读者还可以将自己的建议和对图书馆的评价写在留言板内,点击发送,留言板的信息将被发送到图书管理员的留言板内。这样有助于图书管理员更好的为读者服务,也有助于提升鞍山市图书馆的形象。
(二)代码设计
设计一套良好的代码体系,对于系统开发及提高系统的处理效率,都具有十分重要的意义。代码是人为确定的用以代表客观事物(实体)名称、属性、或状态等的数字、字母等符号。代码是人和机器的共同语言,是系统进行信息分类、校对、统计和检索的依据,是数据的重要组成部分,它唯一标识实体,反映数据或信息之间的逻辑关系,节省存储单元,提高数据处理效率,便于数据的存储和检索。可见,好的代码设计对于提高系统运行效率和系统的可靠性都是十分必要的。
设计代码的原则是:唯一性、标准化与通用性、可扩充性、简单性、便于编码和识别、规范化。
本系统的代码设计,采用了顺序码、区间码、和助记码三种类型,充分利用了数据库的字段自行增加的特点和系统提供的数据。这样可以减少工作量,提高程序的效率。
12
1、图书编号的代码设计
图书编号分为两个部分,最前部分是图书拼音的前两个首字母t s;中间部分则为图书入库的年份,比如为2012,最后部分则为顺序的数字,以此类推。三者结合到一起,则成为完整的图书编号。如图3.3所示:
具体图示如下:
t s 2 0 1 2 0 0 0 0 0 0 0 0 0 1
图书入库年份 顺序号 图书首字母组合 图3.3 图书编号的代码设计图
2、读者编号的代码设计
读者编号的确定遵循理解上的编号方法,编号的前两位01表示图书管理员。00表示读者,00和有顺序的数字0001-000n两者组合成为读者的编号。在系统中,直接采用该方法,便于操作和识别。如图3.4所示:
具体图示如下: 0 0 0 0 0 1
顺序号
读者编号前两位为00
图3.4 读者编号的代码设计图
综上介绍,系统的其余的编号也是如此设置的。
(三)数据库设计
数据库是本系统的核心和基础。它设计的好坏直接影响着整个系统的质量。数据是一切系统设计的基础,好的数据库设计可以使系统能够有一个好的响应速度,数据库设计就像高楼大厦的根基一样,如果设计的不合理、不完善,将在系统开发过程中,甚至到后期的系统维护、功能变更和功能扩充时,引起较多问题,严重时甚至要重新设计,重做大量已完成工作。本系统采用SQL Server 2005 的数据库。根据分析阶段对实体和联系的分析结果,进行对表的结构设计,可以得到以下的数据表:
1、管理员信息表如表3.1所示,用于存放图书管理员的信息。
13
2、读者类型信息表如表3.2所示,用于存放读者类型的基本信息。 3、书架信息表如表3.3所示,用于存放书架的信息。 4、读者信息表如表3.4所示,用来存放读者的基本信息。 5、图书类型信息表如表3.5所示,用于存放图书类型的信息。 6、书库信息表如表3.6所示,用于存放图书的信息。 7、图书借阅信息表表3.7所示,用于存放图书借阅的信息。 8、图书归还信息表如表3.8所示,用于存放图书归还的信息。 9、图书预约信息表如表3.9所示,用于存放图书预约的信息
(四) 输入输出设计
输入输出设计部分主要负责系统与用户之间的交互,输入输出界面的质量直接关系到用户的使用效果。符合用户习惯,设计良好的输入输出界面,能够为用户建立良好的工作环境,方便用户操作,使目标系统易于为用户所接受。我所设计的图书馆管理信息系统各个界面都很干净、简洁,方便管理员操作,包含的内容很丰富,帮助管理员减少很多不确定性,方便管理员进行管理。
1、输入设计
输入界面是系统与用户之间交互的纽带,设计的任务是根据具体业务要求,确定适当的输入形式,使管理信息系统获取管理工作中产生的正确的信息。按照输入设计的原则,输入设计的过程要简单,过程要简化,其次输入的量要少,以控制减少输入错误,另外输入的延迟要短。输入的内容满足系统需要的各种要求。 (1)图书管理员登陆输入界面
此模块的主要功能是通过操作者输入用户名和密码来判断该操作者是否是本系统操作者和判断操作者权限的级别。系统会按照操作者提供的用户名和密码与数据库读出的数据来判断操作者。如图3.5所示: (2)读者信息输入界面
操作者正确的登陆到本系统后,就可以进行业务操作,图书管理员可以对读者信息进行管理。读者信息输入界面如图3.6所示: (3)图书信息输入界面
图书管理员正确的登陆到本系统后,可以对图书的各个信息进行管理。图书信息输入界面如图3.7所示:
2、输出设计
输出是系统产生的结果或提供的信息,系统的各种输出,是系统的使用者处理日常业务和进行经营决策所需要的信息。输出设计的目的是输出用户需要的有用信息。输出设计的出发点是必须保证系统输出的信息能够方便地为用户所使用,为用
14
户的管理活动提供有效的信息服务。 (1)图书借阅与归还输出界面
图书管理员正确的登陆到本系统后,可以对图书借还与预约的各种信息进行查询。图书借阅与归还输出界面如图3.8所示: (2)图书超期与提醒输出界面
图书管理员正确的登陆到本系统后,可以查看到系统输出的超期未还的图书的各种信息。图书超期与提醒输出界面如图3.9所示: (3)图书排行榜输出界面
图书管理员正确的登陆到本系统后,可以查看到系统输出的图书排行榜信息。图书排行榜输出界面如图3.10所示: (4)读者信息输出界面
当读者正确的进入到该系统以后,读者可以对自己的信息进行查看,自己所涉及的信息会全部显示出来。读者信息输出界面如图3.11所示: (5)图书信息输出界面
当读者正确的进入到该系统以后,读者可以对当前的图书进行查看,所有的图书信息将全部显示出来。图书信息输出界面如图3.12所示:
15
四、系统实施
(一)系统实施的任务
系统实施是投入大量的人力、物力及占用较长的时间进行物理系统的实施、程序设计、程序和调试、人员培训、系统转换、系统管理等一系列工作的过程,它既是成功地实现新系统,又是取得用户对新系统信任的关键阶段。
系统实施是一项复杂的工程,管理信息系统的规模越大,实施阶段的任务越复杂。一般来说,系统实施阶段主要有一下几方面的工作:
1、物理系统的实施。系统实施首先进行物理系统的实施,要根据计算机物理系统配置方案购买和安装计算机硬件、软件系统和通讯网络系统,还包括计算机机房的准备和设备安装调试等一系列活动,要熟悉计算机物理系统的性能和使用方法。
2、程序设计。它主要是指程序设计人员按照系统设计的要求和程序设计说明书的规定,选用某种语言去实现各模块程序的编制工作。
3、系统调试。指对系统的各项功能进行单调、分调和统调的工作。
4、基础数据的录入。将准备好的、符合系统格式需要的数据输入到计算机中。 5、系统人员培训。制定系统操作规程,对系统实施与运行中所需要的各类人员进行技术培训和操作培训。
6、系统转换。根据系统的特点选用某一种方式进行新旧系统的转换工作。 7、文档的建立与完善。对系统实施阶段的各项工作进行整理,形成各种相关文档,作为以后系统运行与维护的文档资料。
(二)系统实施的环境建设与设备购置
管理信息系统的运行,需要硬件系统的支持,在正式组织系统实施时必须先做好实施环境的建设。
1、设备购置
在系统分析及设计阶段,已经确定了系统所需设备的种类、数量等,在实施时首先要购置设备。包括计算机硬件设备、辅助设备及所需配备的各种软件、网络设备等。购置设备时要注意一下几点:
(1)质量可靠,价格合理。要选购质量可靠的产品,在保证质量的前提下尽量降低购置设备成本。购置设备前,要做好市场调查工作,要选择那些性能稳定、故障少的产品,产品的生产厂家要技术经济实力强、信誉好、服务好。
(2)资料齐全,手续完整。购置设备要求供货单位提供的设备资料必须齐全、售货手续必须完整,要签订相应的买卖合同,在合同中要详细约定设备的软硬件配
16
置情况,交货期限,交货方式、付款方式、所提供的服务等。
(3)计算机设备的兼容性和可维护性。为了满足今后系统扩展及性能提高的需要,在购置计算机设备时还必须要考虑它的兼容性和可维护性。兼容性好的设备,能满足不同机型之间的联网、通讯的要求,便于今后购买的硬件的接入。要选择那些维护、升级方便的设备。对于一些易损坏的部件,应该购置一些必要的备品备件以保证计算机设备的正常运行。
2、计算机机房的建设
计算机机房是指能够满足安放计算机设备所要求的各项环境指标,使其充分发挥功能的工作场地。计算机机房的建设要考虑计算机系统设备和用户对环境的要求,要计算好机房的面积。在建设时要依据所需容纳的计算机台数计算出机房的面积,要考虑电源的设置及今后联网布线的需要,如需预埋何种线路、需在哪里留有接口等。
3、设备的安装与调试
设备的安装是指将计算机系统设备按照总体设计方案中指定的位置所进行的设备组装工作。这项工作应该按照由里到外、从单机到多机的步骤,循环渐进地进行。
设备的调试是指在系统设备安装完毕后对其各项硬件和软件功能的调试。如计算机的运行速度、存储容量、显示器、打印机、系统软件的配置与运行等测试与调试。
设备安装完毕后,就可进行网络的测试,要对网络设备的通信处理能力、可靠性、可扩充性、开发性等进行测试;要测试网络的联通性、可靠性、响应时间、抗干扰能力、安全保密能力等。
系统环境的建设与系统的调试工作是密切相关的,要合理规划,使这两项工作协调进行。
(三)程序设计
程序设计是以程序设计说明书的数据存储结构设计为基础,选择某一种编程工具和方法,去实现系统功能模块的程序编制工作。编程的目的是为了实现开发者在系统分析和系统设计中所提出的管理方法和处理构想,编程不是系统开发的目的。在编程实现时,建议尽量利用已有的程序和各种开发工具,尽快地实现系统。
1、程序设计的基本要求
高质量的程序,必须符合以下基本要求:
(1)程序的功能必须按照规定的要求,正确地满足预期的需要。
(2)程序的内容清晰、明了,书写格式及变量的命名等都有统一的规范,便于
17
阅读和理解。
(3)程序的结构严谨、简洁,算法和语句选用合理,执行速度快,节省机时。 (4)程序和数据的存储、调用安排得当,节省存储时间。
(5)程序适应性强。程序交付使用后,若应用问题或外界环境有了变化时,调整和修改程序比较简便易行。
2、程序设计方法
我所采用的是结构化程序设计方法,结构化程序设计是一种设计程序的技术,它采用自顶向下逐步求精的设计方法和单入口单出口的控制技术。结构化程序设计的基本思想是按自顶向下逐步求精的方式,由三种标准控制结构反复嵌套来构造程序。结构化程序设计方法可以减轻程序设计的工作量。
3、编程工具
该系统是由C#进行编程的,C#是一种最新的、面向对象的编程语言,是微软在Microsoft .NET中推出的全新语言。这种全新的面向对象的语言使得开发者可以快速的构建从底层网站级到高层商业组件的不同应用。数据库系统采用的是SQL Server 2005 ,SQL Server 2005 是Microsoft 公司推出的SQL Server 数据库管理系统的最新版本。
(四)系统调试与测试
系统测试是在程序编程完成以后,在计算机上按照系统设计的要求,以各种可能的数据和操作条件对新开发实现的系统进行试验,找出系统内部存在的问题加以修改,使其真正达到设计要求。
在管理信息系统的开发过程中,面对着错综复杂的各种问题,人的主观认识不可能完全符合客观现实,开发人员之间的思想交流也不可能十分完善。所以,在管理信息系统开发周期各个阶段都不可避免地会出现差错。开发人员应力求在每个阶段结束之前进行认真、严格的技术审查,尽可能早的发现并纠正错误,否则等到系统投入运行后再回头来改正错误将在人力、物力上造成很大的浪费,有时甚至导致整个系统的瘫痪。对于一些较大规模的系统来说,系统调试的工作量往往占程序系统编制开发总工作量的40%以上。
1、调试的基本原则
测试的目的在于发现其中的错误并及时纠正,调试阶段应注意一些基本原则: (1)调试用例应该由“输入数据”和“预期的输出结果”组成。
(2)不仅要选用合理的输入数据进行调试,还应选用不合理的甚至错误的输入数据。
(3)除了检查程序是否做了它应该做的工作,还应检查程序是否做了它不应该
18
做的事情。
(4)应该长期保留所有的调试用例,甚至该系统被废弃不用为止。 2、测试的方法
系统测试的方法总体来说静态测试法和动态测试法两种。 (1)静态测试法
静态测试法不执行被测试软件,通过对需求分析说明书、程序设计说明书以及源程序以人工方式进行分析和测试来找出错误。 (2)动态测试法
动态测试法以执行程序并分析程序来查错。按照在设计测试用例时是否涉及程序的内部结构,动态测试方法可以分为白盒测试和黑盒测试两种方法。白盒测试时,测试者对被测试程序的内部结构是清楚的。黑盒测试的情况正好相反。此时,测试者把被测程序看成一个黑盒,完全用不着关心程序的内部结构。设计测试用例时,仅以程序的外部功能为根据。
3、 设计用例测试技术
由于不可能做到穷尽测试,因此必须设法用有限次的测试获得最大收益,用尽可能少的测试次数尽量多地找出程序中潜在的各个错误。设计测试用例是测试阶段的关键技术问题。设计测试用例最困难的问题是设计测试的输入数据。不同的测试数据发现程序错误的能力差别很大,为了提高测试效果、降低测试成本,应该选用少量、高效的测试数据,做到尽可能完备的测试。因此,设计测试用例的基本目标就是确定一组最可能发现多个错误或多类错误的测试数据。
已经研究出许多设计测试数据的技术,这些技术各有优缺点,没有哪一种是最好的,更没有哪一种可以代替其余所有技术;同一种技术在不同应用场合效果可能相差很大,因此,通常需要联合使用多种测试数据。常用的设计测试数据技术主要有:适用于黑盒测试的等价划分、边界值分析及错误推测法等;适用白盒测试的逻辑覆盖法等。
(五) 调试步骤
一个管理信息系统通常由若干子系统组成,每个子系统又由若干模块组成。所以,可以把调试工作分为模块调试、分调和总调三个层次,调试过程依次是模块调试、分调、总调。
1、模块调试。也称程序调试,其目的是保证每个模块本身能正常运行,在该步骤调试中发现的问题大都是程序设计或详细设计中错误。对于模块调试,要进行正确性调试,运行速度与存储空间的调试,使用简便性的调试。一般分为人工检错和上机调试两步进行。
19
2、分调。也称子系统调试,就是把经过调试的模块放在一起形成一个子系统来调试。主要是调试各模块之间的协调和通信,即重点调试子系统内各模块的接口。
3、总调。经过分调,已经把一个模块装配成若干子系统并经过充分调试。接着的任务是总调,也称系统调试,它是把经过调试的子系统装配成一个完整的系统来调试,用以发现系统设计和程序设计中的错误,包括对子系统之间的接口、数据通信、处理功能、资源共享以及系统遭到破坏后能否按要求恢复等问题的调试,验证系统的功能是否达到设计说明书的要求。
4、特殊测试。除了常规测试之外,还有一些必要的性能测试。这些测试往往不是针对程序在正常情况下运行的正确与否,而是根据系统需求选择进行的,主要有:峰值负载测试、容量测试、响应时间测试、恢复能力测试等。
20
结束语
通过几个月的努力,图书管理系统在指导老师的全心指导下,在同学的积极配合与帮助下,基本功能顺利完成。在数据库的开发方面,我学到了不少关于.NET和SQL2005的知识。开发时遇到了许多的困难,但是通过自己的努力,还有老师同学们的帮助,最终还是迎刃而解了。
这次毕业设计完全是按照软件工程学的方法来进行设计和开发的。在开发过程中,认真调查分析了用户的需求,及时准备了详细的文档资料,这让我在开发过程中少走了许多弯路。本次设计开发的系统较为庞大,涉及的用户较多,数据库设计比较复杂,使我深刻地体会到软件开发是一项集体项目,单靠一个人就想解决所有的问题是不太实际的。这对我以后的学习、工作有很大的帮助。
同时,在这次设计中,我也发现了自己的很多不足。首先,对.NET的掌握还不是很全面,对于数据库管理系统的操作运用也不够熟练,以至于在系统开发过程中经常碰到一些疑难问题不能快速的解决。其次,就是在准备系统设计文档时,没有反复推敲、验证,以至于在开发过程中出现几次由于数据库设计不合理,修改数据库,而几乎修改所有程序代码的情况。再者,是对整个软件开发的把握能力有待于进一步提高,以及对网页设计的诸多方面知识也待进一步学习,这些都是我今后应该注意和提高的。
21
参考文献
[1] 杜鹃 赵春艳.信息系统分析与设计. 清华大学出版社.2010.8 [2] 龙虹.管理信息系统.北京理工大学出版社.2007.3.
[3] 倪庆萍.现代管理信息系统.清华大学出版社.北京交通大学出版社.2006.6 [4] 郝杰忠.管理信息系统的开发与应用.机械工业出版社.2006.9.
[5] (英)Jhon Sharp著周靖译.Visual C# 2005 从入门到精通.清华大学出版社.2006.9
[6] 胡百敬,姚巧玫.SQL Server 2005 数据库开发详解.电子工业出版社.2006.6. [7] Karli Watson,Christian Nagel著,齐立波译.C#入门经典.清华大学出版社.2006.5.
[8] 陈佳.信息系统开发方法教程.清华大学出版社.2009.8. [9] 刘腾红等.信息系统分析与设计.科学出版社.2006. [10] 薛华成.管理信息系统.清华大学出版社.2007.10.
[11] 张智强,孙福兆,余健等.SQL Server 2005 课程设计案例精编.清华大学出版社.2008.8
[12] 闪四清.管理信息系统教程.清华大学出版社.2007.4. [13] 李一军,叶强.管理信息系统.清华大学出版社.2007.9.
[14] 欧立奇,康祥顺,马煜.Visual C#.NET案例开发集锦.北京:电子工业出版社.2005.
[15] 罗斌等.Visual C# 2005 数据库开发经典案例.中国水利水电出版社.2008.1 [16] Paul Wilton,John Colly著敖富江译.SQL入门经典.清华大学出版社.2006.6
22
致谢
在本次毕业设计过程中,得到了指导老师的指导与支持。在此特别感谢老师的大力帮助。指导老师的悉心指导和大力支持,在总体结构、功能的把握上给予了非常大的帮助,同时根我们提供了非常优越的设计环境,并对我在编程、数据库设计等细节工作上给予了耐心的指导,对于我们小组顺利完成这次毕业设计起到了关键性的作用。
在此我感谢我的母校,以及在大学四年生活中给予我关心和帮助的老师和同学,是他们教会了我专业的知识和做人的道理。通过这次毕业设计我还明白了作为一名信息管理专业的大学毕业生,我们要会的不仅仅是要有整体把握系统设计的能力,更重要的是能够编写代码。我会在以后的工作和学习中不断完善自己,为我最热爱的母校争光,为自己翻开辉煌的新篇章。
转眼间,大学生活即将结束,回首过去四年的大学生活,真是有苦也有乐,然而更多的则是收获,感谢母校的各位老师不但无私地传授给我们知识,也教会了我们如何做人。管理信息系统专业的毕业设计任务繁重,但正是在这几个月紧张而充实的设计中,我感到自己的知识得到了一次升华,我相信,我的毕业设计会给我的四年大学画上一个圆满的句号。
在新的世纪里,人们自然对未来有许多美好的愿望和设想。现代科学技术的飞速发展,改变了世界,也改变了世界的生活。作为新世纪的大学生,应当站在世界的发展前列,掌握现代科学技术知识,调整自己的知识结构和能力结构,以适应社会发展的要求。新世纪需要具有丰富现代科学知识、能够独立解决面临任务、有创新意识的新型人才。
23
附录A
馆长副馆长办公室主任流通部技术部办公室信息咨询部期刊部采编部阅览部图书馆主机房视听阅览室网络资源检索室打字复印室行政管理室过刊阅览室现刊阅览室文献采购部文献编目部借书台还书台图书阅览室
图1.1 组织结构图
24
图书库存管理员图书采购管理员图书信息图书借阅信息图书归还信息超期提醒及罚款通知单图书预约信息读者读者信息图书管理员图书续借信息图书预约单图书排行榜图书续借单读者留言 图2.1 业务流程图
图书查询读者信息查询读者信息管理图书信息管理图书借还图书预订图书续借读者留言汇总读者图书预订图书续借读者留言鞍山市图书馆管理信息系统图书管理员
图2.2 顶层数据流程图
25
P7P8读者查询处理编号及姓名查询查询反馈D1读者库修改读者信息读者信息处理P3编号及书名查询P1修改后的图书信息图书信息反馈图书查询处理D2图书信息处理读者信息图书信息图书库P2读者图书预定P4图书预定处理图书预定信息图书借还D3借阅库图书管理员图书借还处理预定读者信息验证图书续借读者留言P6图书续借处理续借读者信息验证D1读者库图书续借信息P5读者留言处理读者留言读者留言汇总D4留言库
图2.3 一层数据流程图
26
还书记录D3借阅库P2.1还书信息图书归还处理修改库存D2图书库图书管理员P2.2借阅信息P2.3有效P2.4有现存借阅记录检查读者编号检查图书是否有现存填写借阅信息修改图书信息现存记录D3借阅库D2图书库D1读者库D2图书库有库存可以预约没有库存则不可以预约
图2.4 图书借还处理二层数据流程图
P4图书预定处理图书编号及书名查询P3.1图书查询处理D2图书库读者图书查询结果
图2.5 图书查询处理二层数据流程图
27
P4.1P4.2读者身份检查P4.3图书预定处理填写预订信息读者预订信息预定信息输入D3借阅库P3图书查询处理D1读者库D2图书库
图2.6 图书预订处理二层数据流程图
P5.1读者读者留言P5.2D4留言库留言汇总留言管理留言汇总读者留言处理图书管理员查询留言
图2.7 读者留言处理二层数据流程图
表2.1 数据项条目表
编号 名称 数据类型 长度 S001 读者编号 Int 20 S002 读者姓名 Varchar 10 S003 读者类型 Int 4 S004 读者性别 Varchar 2 S005 读者出生日期 Datetime 8 S006 读者联系方式 Varchar 200 S007 图书ID Int 4 S008 图书书名 Varchar 100 S009 图书类别 Varchar 50 S010 作者 Varchar 200 S011 ISBN Varchar 20 S012 出版社 Varchar 50 S013 图书价格 Money S014 库存量 Int 6 S015 超期罚款 Money S016 简介 Varchar 200 S017 借出次数 Int 6 S018 入库日期 Datatime 8 S020 借阅时间 Datatime 8 S021 应还时间 Datatime 8 S022 可借天数 Int 4
说明 读者在系统中注册的代码标识 读者的姓名说明 读者的分类说明 读者的性别说明 读者出生日期说明 读者联系的说明 图书的标识 图书的名字说明 关于图书类别说明 图书作者说明 图书编号标识 图书出版社说明 图书单价说明 图书在库数量说明 图书因超期而罚款的金额 图书介绍说明 图书被借阅的次数说明 图书采购日期 图书被借阅的日期 图书应被归还的日期 图书可以被借阅的时间 28
编号 名称 D1 读者库 D2 图书库 D3 借阅库 D4 留言库
来源 P7 P1 P2 P5
表2.2 数据存储条目表
去向 组成 P8 读者编号、姓名、类别、联系方式 P3 图书编号、名称、库存数量、出版社、简介 P2 借阅数量、日期、操作员借阅人、图书编号 P5 读者姓名、编号、内容 简述 对读者信息的记录 对图书信息的记录 对借阅图书的信息的记录 留言信息的记录
表2.3 数据流条目表
编号 名称 F1 编号及姓名查询 F2 编号及书名查询 F3 图书预定 F4 来源 读者 去处 组成 读者读者编号,读者姓名 查询处理 图书图书编号、图书名称 查询处理 图书预定处理 图书借阅处理 图书预定处理 图书续借处理 读者信息处理 图书信息处理 说明 查询读者信息的条件 读者 查询图书信息的条件 读者 图书编号、图书名称、预订时预订图书的信息 间、读者姓名、读者编号 图书编号、图书名称、读者姓续借图书的信息 名、读者编号 图书编号、图书名称、预订时间、读者姓名、读者编号、操作员 图书编号、图书名称、读者姓名、读者编号、操作员 图书管理员对预定信息进行处理 图书管理员对续借信息进行处理 图书读者 续借 图书预订信息 图书续借信息 读者信息 图书管理员 图书管理员 图书管理员 F5 F6 F7 读者编号、姓名、性别、类型、图书管理员对读者出生日期、 信息进行处理 图书编号、书名、库存数量、图书管理员对图书单价、简介 信息进行处理 29
F8 图书图书管信息 理员
F9 F10 F11 图书图书管图书借还 理员 借还处理 读者读者 读者留言 留言处理 留言读者留图书汇总 言处理 管理员 查询反馈 图书信息反馈 修改后的读者信息 修改后的图书信息 预定读者信息验证 续借读者信息验证 图书编号、图书名称、读者姓图书管理员对借还名、读者编号、操作员、借还信息进行处理 日期 读者编号、姓名、内容、留言读者进行留言 日期 读者编号、姓名、内容、留言将读者的留言反馈日期 给图书管理员 根据读者库反馈读者信息 根据图书库反馈图书信息 F12 F13 读者库 读者 读者编号、姓名、类型、联系方式 图书库 读者 图书编号、书名、类型、简介、库存量 F14 读者信读者读者编号、姓名、类型、联系根据读者信息修改息处理 库 方式 读者库 F15 图书信图书图书编号、书名、类型、简介、根据图书信息修改息处理 库 库存量 图书库的信息 F16 读者库 图书读者编号、姓名、类型、联系根据读者信息验证预定方式 读者是否可以预定处理 图书 读者库 图书读者编号、姓名、类型、联系根据读者信息验证续借方式 读者是否可以续借处理 图书 F17
表2.4 外部实体条目表
编号 名称 简述 输入数据流 01 图书管理员 对图书的各种信息及读F11 者的各种信息进行管理 02 读者 查看图书及读者信息,进F1、F2 行预订和续借操作
30
输出数据流 F5、F6、F7、F8、F9 F3、F4、F10
表2.5 数据处理条目表
编号 名称 输入 输出 P1 图书信息处理 图书信息 图书库 P2.1 图书归还处理 还书信息 图书库、借阅库 P2.2 检查读者编号 读者库 有效 处理过程 根据图书信息修改图书库 根据还书信息修改图书库和借阅库 根据读者库的信息检查读者是否已存在 有现存 根据图书信息检查图书是否有现存 借阅库、有现存则借阅图书,修改图书库图书库 存量 根据查询条件,查看相关图书 P2.3 检查图书是否图书库 有现存 P2.4 填写借阅信息有现存 和修改图书信息 P3.1 图书查询处理 图书查询图书库、条件 查询结果 P4.1 预定信息输入 预定信息 读者身份检查 P4.2 读者身份检查 读者库 有效 P4.3 P5.1 P5.2 P6 P7 P8
图书预定处理 读者留言处理 留言管理 图书续借处理 读者信息处理 读者查询处理 根据图书库信息,选择预约的图书 根据读者库信息检查读者是否已存在 图书库 预定信息 填写预订信息,申请预订 读者留言 留言库 读者在留言库中留言 查询留言 留言汇总 留言汇总反馈给图书管理员 图书续借 借阅库 根据续借信息修改借阅库 读者信息 读者库 根据读者信息修改读者库 读者查询 读者库 根据读者库信息查询读者情况 31
读者信息管理读者信息管理图书类型设置图书管理书架管理出版社设置图书信息管理图书借还管理图书借还管理图书档案查询图书管理员模块系统查询图书借阅查询读者档案查询超期提醒系统设置密码更改退出系统排行榜图书排行榜记事本系统辅助工具计数器留言板
留言板管理图3.1 图书管理员功能模块图
32
读者读者信息查询图书读信者息操查作询图图书书预续约借
图3.2 读者功能模块图
33
留言板读者留言
表3.1 管理员信息表
编号 01 02 03 04 05 06 07 08 09 10 11
表3.2 读者类型信息表
编号 01 02 03
表3.3 书架信息表
编号 01 02 03 编号 01 02 03 04 05 06 07
字段名称 编号 名称 密码 图书管理 电子图表管理 读者管理 图书借还 系统设置 系统查询 排行榜 系统维护 数据结构 nvarchar(50) nvarchar(10) nvarchar(50) bit bit bit bit bit bit bit bit 说明 管理员编号 管理员名称 管理员登陆密码 管理员图书管理权限 管理员电子图表管理权限 管理员读者管理权限 管理员图书借还权限 管理员系统设置权限 管理员系统查询权限 管理员排行榜权限 管理员系统维护权限 字段名称 Id 类型名称 可借数量 数据结构 int nvarchar(50) int 说明 读者编号(主键) 读者类型 读者可借图书数量 字段名称 Id 编号 书架名称 数据结构 int nvarchar(10) nvarchar(100) 说明 书架ID(主键) 书架编号 书架名称 字段名称 ID 编号 姓名 性别 类型 出生日期 有效证件 表3.4 读者信息表 数据结构 说明 bigint 读者ID nvarchar(20) 读者编号(主键) nvarchar(10) 读者姓名 nvarchar(4) 读者性别 nvarchar(50) 读者的类型(外键) smalldatetime 读者出生日期 nvarchar(30) 读者有效证件类型 34
08 09 10 11 12 13 14 15 16 17 证件号码 联系方式 登记日期 操作员 备注 图书借阅次数 是否挂失 图书借阅押金 图书借阅超期罚款金额 密码 nvarchar(30) nvarchar(200) smalldatetime nvarchar(10) ntext int bit money money 读者证件号码 读者的联系方式 读者登记日期 操作员(外键) 对读者编写的备注 读者可借阅图书次数 读者证是否挂失 读者图书借阅押金 读者图书借阅超期罚款金额 编号 01 02 03 04 字段名称 Id 分类号代码 类型名称 可借天数 nvarchar(50) 读者的密码
表3.5 图书类型信息表 数据结构 说明 int 图书编号(主键) nvarchar(50) 图书分类号代码 nvarchar(50) 图书类型 int 图书可借天数
表3.6书库信息表 数据结构 说明 bigint 图书编号(主键) nvarchar(20) 图书条形码 nvarchar(50) 图书分类号 nvarchar(100) 图书的书名 nvarchar(50) 图书类型(外键) nvarchar(200) 图书作者 nvarchar(100) 图书译者 nvarchar(20) 图书SBN nvarchar(50) 图书的出版社 money 图书价格 int 图书的页码 nvarchar(100) 图书上架的名称 int 图书现存量 Int 图书库存总量 datetime 图书入库时间 nvarchar(10) 操作员 ntext 图书的简介 int 图书可借出次数 bit 图书是否注销 35
编号 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
字段名称 Id 条形码 分类号 书名 类型 作者 译者 ISBN 出版社 价格 页码 书架名称 现存量 库存总量 入库时间 操作员 简介 借出次数 是否注销
表3.7图书借阅信息表 字段名称 数据结构 说明 Id int 图书ID(主键) 图书编号 nvarchar(20) 图书编号(外键) 读者编号 nvarchar(20) 读者编号(外键) 借阅时间 datetime 图书借阅时间 应还时间 datetime 图书应还时间 操作员 nvarchar(10) 操作员(外键)
表3.8图书归还信息表 字段名称 数据结构 说明 Id int ID(主键) 图书编号 nvarchar(50) 图书编号(外键) 读者编号 nvarchar(50) 读者编号(外键) 归还时间 datetime 图书归还时间 受损赔偿 float 图书受损赔偿 操作员 nvarchar(50) 操作员(外键)
表3.9图书预约信息表 字段名称 数据结构 说明 Id int ID(主键) 图书编号 varchar(50) 图书编号(外键) 读者编号 nvarchar(50) 读者编号(外键) 预约时间 datetime 读者预约时间 预约过期时间 datetime 读者预约过期时间 编号 01 02 03 04 05 06 编号 01 02 03 04 05 06 编号 01 02 03 04 05
36
图3.5 图书管理员登陆输入界面
图3.6 读者信息输入界面
37
图3.7 图书信息输入界面
38
图3.8 图书借阅与归还输出界面
图3.9 图书超期与提醒输出界面
图3.10 图书排行榜输出界面
图3.11 读者信息输出界面
39
3.12
40
图图书信息输出界面
附录B
主要程序代码 登陆代码:
namespace BookManagerexe {
public partial class FrmDL : Form {
int i = 0;
public TextBox uid;
public static string userType; public static string userId; public static string password; public FrmDL(TextBox uid) {
this.uid = uid; InitializeComponent(); groupPanel1.Visible = false; }
private void FrmDL_Load(object sender, EventArgs e) {
// this.compurview.Text = \"系统管理员\"; }
private void btnOK_Click(object sender, EventArgs e) {
// userType = compurview.Text; userId = txtUID.Text;
bool flag = BLL.LoginUser.loginDuzhe(txtUID.Text, txtpasword.Text); if (flag) {
this.uid.Text = this.txtUID.Text; password = txtpasword.Text;
// MessageBox.Show(\"恭喜,登陆成功 欢迎\" +
41
this.compurview.Text + this.txtUID.Text, \"提示\MessageBoxIcon.Asterisk); this.Close(); }
Model.LoginUser m = new Model.LoginUser(); m.Book_Id = this.txtUID.Text.Trim();
m.Book_password = this.txtpasword.Text.Trim(); // m.Book_Name = this.compurview.Text.Trim(); DataSet ds = BLL.LoginUser.GetAll(m); // } }
private bool ValidateIput() {
if (this.txtUID.Text.Trim() == \"\") {
MessageBox.Show(\"请输入用户名\输入提示\MessageBoxButtons.OK, MessageBoxIcon.Asterisk); this.txtUID.Focus(); return false; }
else if (this.txtpasword.Text.Trim() == \"\") {
MessageBox.Show(\"请输入用户密码\输入提示\MessageBoxButtons.OK, MessageBoxIcon.Asterisk); this.txtpasword.Focus(); return false; }
//else if (this.compurview.Text.Trim() == \"\") //{
// MessageBox.Show(\"请选择登陆权限\输入提示\MessageBoxButtons.OK, MessageBoxIcon.Asterisk); // this.compurview.Focus(); // return false; //}
42
else {
return true; } }
private void btncancle_Click(object sender, EventArgs e) {
DialogResult dr = MessageBox.Show(\"确定退出吗?\提示\MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk); if (dr == DialogResult.OK) {
this.Close(); } }
private void button1_Click(object sender, EventArgs e) {
groupPanel1.Visible = true; }
private void button2_Click(object sender, EventArgs e) {
string intNO = BLL.LoginUser.returnID(textBox1.Text.Trim()); if (intNO == \"aaa\") {
MessageBox.Show(\"请输入正确的证件号\"); return; } else {
duzheyemian duzhezhuomian = new duzheyemian(intNO); duzhezhuomian.Show(); this.Hide(); }
43
}
private void label1_Click(object sender, EventArgs e) {
}
private void groupPanel1_Click(object sender, EventArgs e) { } } }
图书借还代码:
namespace BookManagerexe {
public partial class frmBorrow : Form {
private TextBox id = null; private DataSet ds = null; private DataSet ds1 = null; private DataSet ds2 = null; public frmBorrow(TextBox id) {
this.id = id;
InitializeComponent(); }
private void frmBorrow_Load(object sender, EventArgs e) {
this.cmbCondition.SelectedIndex = 0; string strSearchCondition = \"\"; initLoad(strSearchCondition); }
private void initLoad(string strSearchCondition) {
44
if (strSearchCondition.Length == 0) {
if (FrmDL.userType == \"读者\") {
ds = BLL.Pagination.SelectDuzhe(FrmDL.userId); } else {
ds = BLL.Pagination.SelectDuo(); } } else { ds =
BLL.Pagination.SelectDuzhe2(this.txbCondition.Text.Trim(), this.cmbCondition.SelectedIndex); }
if (ds.Tables[0].Rows.Count == 0) {
MessageBox.Show(\"无符合条件的信息\"); return; }
this.DgvPerson.DataSource = ds.Tables[0];
DataGridViewRow dr = this.DgvPerson.CurrentRow; Model.Person mp = new Model.Person(); string index = this.DgvPerson[0, DgvPerson.CurrentCell.RowIndex].Value.ToString(); mp.Id = index;
ds1 = BLL.BookJY.GetAll(mp);
this.DgvBooks.DataSource = ds1.Tables[0]; ds2 = BLL.BookJY.getYuyueingBook(index); this.dGdvYuyue.DataSource = ds2.Tables[0]; if (this.txt姓名.Text == \"\")
45
{
this.btnJie.Enabled = false; } else {
this.btnJie.Enabled = true; }
DataGridViewRow row = this.DgvPerson.CurrentRow; this.txt姓名.Text = row.Cells[0].Value.ToString(); this.txt性别.Text = row.Cells[1].Value.ToString(); this.txt可借数量.Text = row.Cells[2].Value.ToString(); this.txt借阅次数.Text = row.Cells[3].Value.ToString(); this.txt出生日期.Text = row.Cells[4].Value.ToString(); this.txt有效证件.Text = row.Cells[5].Value.ToString(); this.txt证件号码.Text = row.Cells[6].Value.ToString(); this.txt已押金额.Text =
row.Cells[7].Value.ToString();//5+1+a+s+p+x if (this.txt姓名.Text == \"\") {
this.btnJie.Enabled = false; } else {
this.btnJie.Enabled = true; }
if (FrmDL.userType == \"读者\") {
this.cmbCondition.Enabled = false; //查询选择 this.txbCondition.Enabled = false; //条件输入 this.btnSearch.Enabled = false; //查询按钮 this.btnJie.Enabled = false;//借阅 this.btnGui.Enabled = false;//归还 this.button1.Enabled = false;//续借
46
}
int count = this.ds1.Tables[0].Rows.Count; // this.txt借阅数量.Text = count.ToString(); DataGridViewRow d = this.DgvBooks.CurrentRow; //try //{
// this.DataTime借阅时间.Value = (DateTime)this.DgvBooks[7, DgvBooks.CurrentCell.RowIndex].Value;
// this.txt操作员.Text = this.DgvBooks[9, DgvBooks.CurrentCell.RowIndex].Value.ToString(); //}
// catch { } }
private void DgvPerson_MouseClick(object sender, MouseEventArgs e) { try {
DataGridViewRow row = this.DgvPerson.CurrentRow; Model.Person mp = new Model.Person(); string index = this.DgvPerson[0, DgvPerson.CurrentCell.RowIndex].Value.ToString(); mp.Id = index;
ds1 = BLL.BookJY.GetAll(mp);
this.DgvBooks.DataSource = ds1.Tables[0]; ds2 = BLL.BookJY.getYuyueingBook(index); this.dGdvYuyue.DataSource = ds2.Tables[0];
this.txt姓名.Text = row.Cells[0].Value.ToString(); this.txt性别.Text = row.Cells[1].Value.ToString(); this.txt可借数量.Text = row.Cells[2].Value.ToString();
47
this.txt借阅次数.Text = row.Cells[3].Value.ToString(); this.txt出生日期.Text = row.Cells[4].Value.ToString(); this.txt有效证件.Text = row.Cells[5].Value.ToString(); this.txt证件号码.Text = row.Cells[6].Value.ToString(); this.txt已押金额.Text = row.Cells[7].Value.ToString(); if (this.txt姓名.Text == \"\") {
this.btnJie.Enabled = false; } else {
this.btnJie.Enabled = true; }
int count = this.ds1.Tables[0].Rows.Count; // this.txt借阅数量.Text = count.ToString(); DataGridViewRow d = this.DgvBooks.CurrentRow;
// this.DataTime借阅时间.Value = (DateTime)this.DgvBooks[7, DgvBooks.CurrentCell.RowIndex].Value;
// this.txt操作员.Text = this.DgvBooks[9, DgvBooks.CurrentCell.RowIndex].Value.ToString(); btnGui.Enabled = true; } catch {
btnGui.Enabled = false; } }
private void btnJie_Click(object sender, EventArgs e) { //try //{
DataGridViewRow dr = this.DgvPerson.CurrentRow; //int i = int.Parse(this.DgvPerson[3,
48
DgvPerson.CurrentCell.RowIndex].Value.ToString()); int index = this.DgvBooks.Rows.Count; if (index <= 3) {
frmBooksBorrow frm = new frmBooksBorrow(this.DgvBooks, this.DgvPerson, this.dGdvYuyue, this.id); frm.ShowDialog(); } else {
MessageBox.Show(\"你已超出借阅的册数,请归还一部分在借\错误\ }
//} //catch //{
// MessageBox.Show(\"请选择一个借阅的读者\"); //} }
private void toolStripButton1_Click(object sender, EventArgs e) {
this.txt姓名.Text = \"\"; this.txt性别.Text = \"\"; this.txt出生日期.Text = \"\"; this.txt可借数量.Text = \"\"; this.txt借阅次数.Text = \"\"; this.txt已押金额.Text = \"\"; this.txt有效证件.Text = \"\"; // this.txt借阅数量.Text = \"0\"; this.txt证件号码.Text = \"\"; // this.txt押金.Text = \"0\";
// this.txt操作员.Text = \"超级用户\";
49
}
private void txtName_MouseHover(object sender, EventArgs e) {
}
private void DgvPerson_MouseDoubleClick(object sender, MouseEventArgs e) { try {
DataGridViewRow dr = this.DgvPerson.CurrentRow; int i = int.Parse(this.DgvPerson[3, DgvPerson.CurrentCell.RowIndex].Value.ToString()); int index = this.DgvBooks.Rows.Count; if (index <= i) {
frmBooksBorrow frm = new frmBooksBorrow(this.DgvBooks, this.DgvPerson, this.dGdvYuyue, this.id); frm.ShowDialog(); } else {
MessageBox.Show(\"你已超出借阅的册数,请归还一部分在借\\" 错误\ } }
catch { } }
private void DgvBooks_MouseClick(object sender, MouseEventArgs e) { try {
50
int count = this.ds1.Tables[0].Rows.Count; // this.txt借阅数量.Text = count.ToString(); DataGridViewRow d = this.DgvBooks.CurrentRow; // this.DataTime借阅时间.Value =
(DateTime)this.DgvBooks[7, DgvBooks.CurrentCell.RowIndex].Value; // this.txt操作员.Text = this.DgvBooks[9, DgvBooks.CurrentCell.RowIndex].Value.ToString(); btnGui.Enabled = true; } catch {
btnGui.Enabled = false; } }
private void btnGui_Click(object sender, EventArgs e) {
DataGridViewRow row = this.DgvBooks.CurrentRow; int count = this.ds1.Tables[0].Rows.Count; try {
if (count > 0) {
DialogResult sult = MessageBox.Show(\"确定要归还图书吗?\提示\ if (sult == DialogResult.Yes) {
Model.BookJY mb = new Model.BookJY(); mb.Thba = this.DgvBooks[0, DgvBooks.CurrentCell.RowIndex].Value.ToString();
string id = row.Cells[0].Value.ToString(); int days = BLL.BookJY.lenDays(mb, id); DialogResult drResult = DialogResult.OK; if (days < 0)
51
{
drResult = MessageBox.Show(\"图书归还超期(\" + days * -1 + \"天),请读者支付\" + days * 0.1 * -1 + \"元后点击【确定】,点击【取消】可稍后操作\付款提醒\MessageBoxIcon.Information); }
if (drResult == DialogResult.OK) {
BLL.BookJY.Execute(mb, id);
MessageBox.Show(\"归还成功\提示\MessageBoxButtons.OK, MessageBoxIcon.Asterisk); DataGridViewRow dr = this.DgvPerson.CurrentRow;
Model.Person mp = new Model.Person(); string index = this.DgvPerson[0, DgvPerson.CurrentCell.RowIndex].Value.ToString(); mp.Id = index;
ds1 = BLL.BookJY.GetAll(mp);
this.DgvBooks.DataSource = ds1.Tables[0]; // this.txt借阅数量.Text = count.ToString();
DataGridViewRow d = this.DgvBooks.CurrentRow; // this.DataTime借阅时间.Value = (DateTime)this.DgvBooks[7, DgvBooks.CurrentCell.RowIndex].Value; // this.txt操作员.Text = this.DgvBooks[9, DgvBooks.CurrentCell.RowIndex].Value.ToString(); btnGui.Enabled = true; } } } else {
btnGui.Enabled = false; }
52
} catch {
MessageBox.Show(\"请选择要归还的图书\错误\MessageBoxButtons.OK, MessageBoxIcon.Stop); } }
private void toolStripButton2_Click(object sender, EventArgs e) {
this.Close(); }
private void button1_Click(object sender, EventArgs e) {
DataGridViewRow row = this.DgvBooks.CurrentRow; int count = this.ds1.Tables[0].Rows.Count; try {
if (count > 0) {
DialogResult sult = MessageBox.Show(\"确定要续借图书吗?\提示\ if (sult == DialogResult.Yes) {
Model.BookJY mb = new Model.BookJY(); mb.Thba = this.DgvBooks[0, DgvBooks.CurrentCell.RowIndex].Value.ToString();
string id = row.Cells[0].Value.ToString(); int days = BLL.BookJY.lenDays(mb, id); DialogResult drResult = DialogResult.OK; if (days < 0) {
drResult = MessageBox.Show(\"图书归还超期(\" +
53
days * -1 + \"天),请读者支付\" + days * 0.1 * -1 + \"元后点击【确定】完成续借,点击【取消】可稍后操作\付款提醒\MessageBoxIcon.Information); }
if (drResult == DialogResult.OK) {
BLL.BookJY.xujieBook(mb, id); MessageBox.Show(\"续借成功\提示\MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
DataGridViewRow dr = this.DgvPerson.CurrentRow;
Model.Person mp = new Model.Person(); string index = this.DgvPerson[0, DgvPerson.CurrentCell.RowIndex].Value.ToString(); mp.Id = index;
ds1 = BLL.BookJY.GetAll(mp);
this.DgvBooks.DataSource = ds1.Tables[0]; } } } else {
btnGui.Enabled = false; } } catch {
MessageBox.Show(\"请选择要续借的图书\错误\MessageBoxButtons.OK, MessageBoxIcon.Stop); } }
private void button2_Click(object sender, EventArgs e)
54
{
DataGridViewRow row = this.DgvBooks.CurrentRow; int count = this.ds1.Tables[0].Rows.Count; try {
if (count > 0) {
DialogResult sult = MessageBox.Show(\"你确定该本图书已经丢失吗?\提示\ if (sult == DialogResult.Yes) {
Model.BookJY mb = new Model.BookJY(); mb.Thba = this.DgvBooks[0, DgvBooks.CurrentCell.RowIndex].Value.ToString();
string id = row.Cells[0].Value.ToString(); float price = BLL.BookJY.bookPrice(mb);
if (MessageBox.Show(\"图书价值为(\" + price + \"元),请读者支付\" + price + \"元后点击【确定】完成图书丢失,点击【取消】可稍后操作\付款提醒\DialogResult.OK)
{
DataGridViewRow dr = this.DgvPerson.CurrentRow;
Model.Person mp = new Model.Person(); string index = this.DgvPerson[0, DgvPerson.CurrentCell.RowIndex].Value.ToString(); mp.Id = index;
BLL.BookJY.diushiBook(mb, id, price, mp); MessageBox.Show(\"操作成功\提示\MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
ds1 = BLL.BookJY.GetAll(mp);
this.DgvBooks.DataSource = ds1.Tables[0];
55
} } } } catch {
MessageBox.Show(\"请选择丢失的图书\错误\MessageBoxButtons.OK, MessageBoxIcon.Stop); } }
//取消预约
private void button3_Click(object sender, EventArgs e) { try {
string yyId = this.dGdvYuyue[0, dGdvYuyue.CurrentCell.RowIndex].Value.ToString(); BLL.BookJY.quxiaoYuyue(yyId);
MessageBox.Show(\"操作成功\提示\MessageBoxIcon.Asterisk);
string index = this.DgvPerson[0, DgvPerson.CurrentCell.RowIndex].Value.ToString(); ds2 = BLL.BookJY.getYuyueingBook(index); this.dGdvYuyue.DataSource = ds2.Tables[0]; } catch {
MessageBox.Show(\"请选择要取消预约的图书\错误\MessageBoxButtons.OK, MessageBoxIcon.Stop); } }
//借阅预约
56
private void button4_Click(object sender, EventArgs e) { try {
string xcid = this.dGdvYuyue[6, dGdvYuyue.CurrentCell.RowIndex].Value.ToString(); string bid = this.dGdvYuyue[1, dGdvYuyue.CurrentCell.RowIndex].Value.ToString(); string yyid = this.dGdvYuyue[0, dGdvYuyue.CurrentCell.RowIndex].Value.ToString(); int xcCount = int.Parse(xcid); //现存量大于0 if (xcCount > 0) {
//string pid = this.DgvPerson[0, DgvPerson.CurrentCell.RowIndex].Value.ToString();
DataGridViewRow row = this.DgvPerson.CurrentRow; string pid = this.DgvPerson[0, DgvPerson.CurrentCell.RowIndex].Value.ToString(); string yyTime = this.dGdvYuyue[8, dGdvYuyue.CurrentCell.RowIndex].Value.ToString();
int flag = BLL.BookJY.countZaoYuyue(pid, bid, yyTime); if (flag < xcCount) {
BLL.BookJY.jieyueYue(yyid); MessageBox.Show(\"借阅成功\提示\MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } else {
MessageBox.Show(\"抱歉!该书现存\" + xcCount + \"本,共有\" + flag + \"人比你早预约了此书,因此你暂时无法借阅\错误\MessageBoxButtons.OK, MessageBoxIcon.Stop); }
57
} else {
MessageBox.Show(\"该书没有库存暂时无法借阅\错误\MessageBoxButtons.OK, MessageBoxIcon.Stop); } } catch {
MessageBox.Show(\"请选择要借阅的预约图书\错误\MessageBoxButtons.OK, MessageBoxIcon.Stop); } }
private void btnRefreshReadersInfos_Click(object sender, EventArgs e) {
initLoad(\"\"); }
private void btnSearch_Click(object sender, EventArgs e) {
if (this.txbCondition.Text.Trim().Length > 0) {
if (this.cmbCondition.SelectedIndex == 0) {
string strPattern = @\"^\\d+$\";
Regex regex = new Regex(strPattern);
if (!regex.IsMatch(this.txbCondition.Text.Trim())) {
this.txbCondition.Focus(); this.txbCondition.SelectAll();
MessageBox.Show(\"请正确输入读者ID\错误\
58
MessageBoxButtons.OK, MessageBoxIcon.Stop); } else {
initLoad(\"existCondition\"); } } else {
initLoad(\"existCondition\"); } } else {
MessageBox.Show(\"请输入查询条件!\"); }
}
private void txbCondition_Validating(object sender, CancelEventArgs e) { /*
if (this.cmbCondition.SelectedIndex == 0) {
string strPattern = @\"^\\d+$\";
Regex regex = new Regex (strPattern);
if (!regex.IsMatch(this.txbCondition.Text.Trim())) {
this.txbCondition.Focus(); this.txbCondition.SelectAll();
MessageBox.Show(\"请正确输入读者ID\错误\MessageBoxButtons.OK, MessageBoxIcon.Stop);
59
} } */ }
private void label3_Click(object sender, EventArgs e) { }
private void txt姓名_TextChanged(object sender, EventArgs e) { }
private void txt性别_TextChanged(object sender, EventArgs e) { }
private void label2_Click(object sender, EventArgs e) { }
private void label14_Click(object sender, EventArgs e) { } } }
图书信息代码:
namespace BookManagerexe {
public partial class frmUpdate : Form {
private bool a = true;
private DataGridView Dgv = null; private DataSet ds = null;
public frmUpdate(DataGridView DgvPerson, bool a) {
60
this.a = a;
this.Dgv = DgvPerson; InitializeComponent(); }
#region 窗体加载事件
private void frmUpdate_Load(object sender, EventArgs e) {
this.comSex.Items.Add(\"男\"); this.comSex.Items.Add(\"女\"); this.comSex.SelectedIndex = 0;
this.comAvailability.Items.Add(\"身份证\"); this.comAvailability.Items.Add(\"军官证\"); this.comAvailability.Items.Add(\"教师证\"); this.comAvailability.Items.Add(\"学生证\"); this.comAvailability.Items.Add(\"其他证件\");
if (this.a == false) {
this.txtId.ReadOnly = true;
DataGridViewRow row = this.Dgv.CurrentRow; this.Text = \"读者档案信息--修改\";
this.txtId.Text = row.Cells[0].Value.ToString(); this.txtName.Text = row.Cells[1].Value.ToString(); this.comSex.Text = row.Cells[2].Value.ToString(); this.comType.Text = row.Cells[3].Value.ToString(); this.DataTimeBirth.Text = row.Cells[4].Value.ToString(); this.comAvailability.Text = row.Cells[5].Value.ToString(); this.txtPapers.Text = row.Cells[6].Value.ToString(); this.txtNumber.Text = row.Cells[7].Value.ToString(); this.txtRemark.Text = row.Cells[8].Value.ToString(); this.DataTimeRegistration.Text = row.Cells[9].Value.ToString();
61
this.txtOp.Text = row.Cells[10].Value.ToString(); btnCheck.Visible = false; } }
#endregion #region 取消
private void btnClose_Click(object sender, EventArgs e) {
this.Close(); }
#endregion #region 修改
private void btnOk_Click(object sender, EventArgs e) {
if (txtPapers.Text.Trim() == \"\") {
MessageBox.Show(\"请输入证件号码!\"); return; }
if (this.a == false) {
if (this.DataTimeBirth.Value < this.DataTimeRegistration.Value) {
Model.Person p = new Model.Person();
p.Id = this.txtId.Text; p.Sex = this.comSex.Text; p.Cname = this.txtName.Text; p.Type = this.comType.Text; p.Birth = this.DataTimeBirth.Value;
p.Registration = this.DataTimeRegistration.Value; p.Availability = this.comAvailability.Text; p.Papers = this.txtPapers.Text;
62
p.Number = this.txtNumber.Text; p.Deposit = this.txtOp.Text; p.Remark = this.txtRemark.Text; BLL.Person.Update(p);
MessageBox.Show(\"修改成功!\提示\MessageBoxButtons.OK, MessageBoxIcon.None); this.Close();
ds = BLL.Person.SelectPerson(); this.Dgv.DataSource = ds.Tables[0]; } else {
MessageBox.Show(\"日期不合逻辑,请重新输入!\提示\MessageBoxButtons.OK, MessageBoxIcon.None); } }
else if (this.a == true) {
if (this.DataTimeBirth.Value < this.DataTimeRegistration.Value) {
if (txtId.Text.Trim() == \"\") {
MessageBox.Show(\"请输入学号/教师号!\提示\MessageBoxButtons.OK, MessageBoxIcon.Stop); return;
}
if (BLL.Person.ifHaveUserName(txtId.Text.Trim())) {
MessageBox.Show(\"该学号/教师号已被使用,请更换!\\"提示\ return; }
63
Model.Person p = new Model.Person(); p.Id = this.txtId.Text; p.Sex = this.comSex.Text; p.Cname = this.txtName.Text; p.Type = this.comType.Text; p.Birth = this.DataTimeBirth.Value;
p.Registration = this.DataTimeRegistration.Value; p.Availability = this.comAvailability.Text; p.Papers = this.txtPapers.Text; p.Number = this.txtNumber.Text; p.Op = \"\";
p.Remark = this.txtRemark.Text; p.Borrow = \"\"; p.Countermand = \"\";
p.Deposit = this.txtOp.Text; p.Amerce = \"\"; BLL.Person.Added(p);
MessageBox.Show(\"增加成功!\提示\MessageBoxButtons.OK, MessageBoxIcon.None); this.Close();
ds = BLL.Person.SelectPerson(); this.Dgv.DataSource = ds.Tables[0]; } else {
MessageBox.Show(\"日期不合逻辑,请重新输入!\提示\MessageBoxButtons.OK, MessageBoxIcon.None); } } }
#endregion
64
private void btnCheck_Click(object sender, EventArgs e) {
if (txtId.Text.Trim() == \"\") {
MessageBox.Show(\"请输入学号/教师号!\提示\MessageBoxButtons.OK, MessageBoxIcon.Stop); return;
}
bool flag = BLL.Person.ifHaveUserName(txtId.Text.Trim()); if (flag) {
MessageBox.Show(\"该学号/教师号已被使用,请更换!\提示\MessageBoxButtons.OK, MessageBoxIcon.Stop); } else {
MessageBox.Show(\"该学号/教师号可以使用!\提示\MessageBoxButtons.OK, MessageBoxIcon.Information); } } } }
65
因篇幅问题不能全部显示,请点此查看更多更全内容