|
图书馆信息管理系统的设计与实现
摘 要
管理信息系统是一个不断发展的新型科学,任何一个单位要生存要发展,要高效率的把内部活动有机的组织起来,就必须建立与自身特点相适应的管理信息系统。图书馆信息管理系统是典型的信息管理系统,其主要开发包括后台数据库的建立和维护,以及前端应用程序的开发两个方面。本系统能对图书实行分类管理,并能按客户端登录用户实行三级权限管理:读者、图书管理员和超级管理员。
关键词:图书管理系统;需求分析;总体设计;实现
目 录
摘要 1
第1章 绪论 2
1.1 系统开发背景 2
1.2 设计目标 3
1.3 系统设计原则 3
第2章 环境系统开发工具及相应技术简介 3
2.1 Visual C++ 简介和数据库开发技术 3
2.1.1 Visual C++ 简介 3
2.1.2 常用开发技术比较 4
2.1.3 SQL SERVER 2000简介 5
2.1.4 ODBC的基本思想与体系结构 6
2.1.5 客户机/服务器结构(C/S) 7
2.1.6 使用MFC ODBC 7
2.2 系统运行环境 12
2.2.1 服务器软硬件要求 12
2.2.2 客户机软硬件要求 13
第3章 需求分析 13
3.1 功能需求 13
3.2 数据流图(DFD) 13
3.3 数据字典 17
第4章 系统设计 23
4.1 系统总体结构 23
4.2 各功子系统功能划分 24
第5章 数据库结构设计 24
5.1 数据库设计定义系统表的结构 24
5.2 建立触发器,存储过程 26
第6章 系统的实现 28
6.1 登录子系统 28
6.2 查询子系统 29
6.3 借还子系统 30
6.4 管理子系统 31
结语 33
参考文献 35
第1章 绪论
1.1 系统开发背景
在现代社会中管理的作用越来越显得重要和突出。一般来讲,管理通过计划、组织、指导和领导、控制等手段,为组织制定目标,应用组织的各种要素,以实现组织的目标。对学校来说,按照一定的资料计划、资料资源,对学生信息、教师信息、课程信息、资料信息等加以接话和协调,以达到预期的目的,即称为学校管理。传统的学校管理活动中,把人、才、物作为学校的主要资源。但是随着社会化大生产的不断扩大和社会对产品多样化的需求,人们越来越重视信息在生产经营及学校管理中的作用,并把它当作学校的一种极其重要的资源,人们称之为“信息资源”,信息资源的处理已经成为当今世界一项重要的社会活动
本世纪以来,由于社会生产力的迅速发展和科学技术的突飞猛进,人们进行信息交流的深度和广度不断增加,管理所需的信息量急剧增长,同时对信息的处理要求及时、准确,这导致了传统的信息处理方法和手段已不能适应现代管理的所需;电子计算机的诞生和在信息处理中的应用,标志这一个崭新时代——“信息时代”的开始,它使学校管理现代化成为可能。
1.2 设计目标
针对以上情况,决定组建一个基于客户机/服务器结构的图书管理系统,要求该系统能对登录后的用户实行权限管理。在系统启动后,读者能在客户端根据自已的需要查询图书,而图书管理员能在服务器端根据读者提供的身份信息及图书编号办理借书或还书手续,通过自动查询功能判断读者是否还能借书。如果读者没有逾期未还图书情况及所借图书没超过可借图书数量,则可继续办理借书手续,否则不予办理。另外,图书管理员能根据需要通过该系统的服务端自行修改图书信息,增加或删除图书书目等。
该系统设有超级用户,当管理员以超级用户登录服务器时,图书管理员有着最大的权限,能通过管理界面设置图书借阅期限、查询逾期未还图书信息和读者信息,并能有效地管理图书分类、读者信息及图书管理员的登录帐目等。
该系统要求能在WIN7及WINXP环境下运行。
1.3 系统设计原则
 实用性原则:
适合于中小型图书馆及高校系部图书管理,用户界面友好,操作使用方便,具有高效的数据处理能力。
 先进性原则:
采用目前先进的计算机软硬件技术,使系统具有较高的技术水平和较长的生命周期,便于系统的升级和维护。
 开放性,安全性,可靠性及可扩展性原则。
 兼容性原则:
对于所选软硬件系统及平台,能很好地适应开发和使用的需要。
 规范性原则:
软件设计过程严格按照“软件工程”的规定,系统编码、文档、操作系统平台以及开发方法采用相应的国际标准、国家标准和行业标准。
第2章 环境系统开发工具及相应技术简介
2.1 Visual C++ 简介和数据库开发技术
2.1.1 Visual C++ 简介
这个系统前台所用的开发工具是Visual C++ 6.0,它是Microsoft 公司开发的基于C/C++的集成开发工具,是Visual Studio中功能最为强大,代码效率最高的开发工具。
Visual C++ 6.0跟以前的版本相比,它的编译器,调试器,连接器,编辑器,资源编辑器都有所加强,在编辑器中还提供了自动语句生成功能,编辑器会像Visual Basic那样自动提示函数的参数,对象成员。另外, Visual C++ 6.0还提供了许多的向导.在MFC中新增了一些类,提供了更加强大的数据访问功能.
程序员可以利用Visual C++ 6.0以基于Windows API的C编程方式或基于MFC的C++编程方式,也可混合编程,使工作效率相对提高,开发工作量减少,源代码效率高.从面使Visual C++ 6.0成为目前开发Windows应用程序最好、最高效的开发工具之一。同时在数据库系统开发方面也有很大的优势。
2.1.2 常用开发技术比较
Visual C++提供了许多访问数据库的技术,主要包括下面这些数据库访问接口:
.ODBC(Open DataBase Connectivity)
.MFC ODBC(Microsoft Foundation Classes ODBC)
.DAO(Data Access Objects)
.OLE DB(Object Link Embedding DataBase)
.ADO(ActiveX Data Objects)
这些技术在访问数据库时无论是易用程度还是运行性能上都是各有千秋,其情况如下:
1.ODBC
ODBC是为客户应用程序访问关系数据库时提供的一个标准的接口,对于不同的数据,ODBC提供了统一的API,使应用程序可以诮所提供的API来访问任何提供了ODBC驱动程序的数据库。而且,ODBC已经成为一种标准,所以,目前几乎所有的关系数据库都提供了了ODBC驱动程序,这使ODBC的应用十分广泛,基本上可有于所有的关系数据库。其优点是,ODBC API可能使客户应用程序能够从从底层设置和控制数据库,完成一些高层数据库技术无法完的事,但是其不足之处是要编写大量的代码,增加了程序的编制的难度。
2. MFC ODBC
由于直接使用ODBC API要编制大量的代码,在Visual C++中提供了MFC ODBC类,封装了ODBC API,这使得利用MFC来创建ODBC的应用程序非常简便。
它的下面几个优点:其一是编程比API要简单一些,是属于Visual C++数据库接口中的高层访问技术。其二是他能与ODBC API想结合完成对数据源底层的操作与控制。
3.DAO
DAO与提供了一种通过程序代码创建和操场纵的数据库的机制。多个DAO构成一个体系结构,在这个结构中,各个DAO对象可以同时工作,MFC DAO是Microsoft公司提供的用于访问Microsoft Jet数据库文件的强的力的数据开发工具,通过DAO进行封装,向程序员提供了DAO丰富的操作数据库手段。
4.OLE DB
OLE DB是Visual C++开发数据库应用中提供的新技术,它基于COM接口,因此,OLE DB对所有的文件系统包括关系数据库和非关系数据都提供了统一的接口,这些特性使得OLE DB技术比传统的数据库访问技术更加优越。
5.ADO
ADO技术是基于OLE DB的访问接口,它是Visual C++中提供的面向对象的OLE DB技术。它继承了OLE DB技术的优点,并且,ADO对OLE DB的接口作了封装,定义了ADO的对象,使程序开发变了简化.ADO技术属于数据库技术的高层接口。
2.1.3 SQL SERVER 2000简介
系统的服务器采用的是Microsoft的SQL SERVER 2000,这是一个最新开发的大型的关系数据库管理系统(DBMS),具有非常强大的关系数据库创建,开发,设计及管理功能。
与以前的几个版本相比,SQL Server 2000有如下几个特点:
1.与Internet的紧密结合
SQL Server 2000的数据库引擎集成了对XML的支持,同进以可扩展,易于使用和安全,成为建设大型WEB站点最好的数据存储设备之一。SQL Server 2000的编程模式在很在程度上与专用于开发WEB应用的Windows DNA 架构相集成。同时,SQL Server 2000所携带的诸如英语查询以及Microsoft查询服务等为开发的Web应用提供了友好面强大的查询界面。
2.可扩展性和可用性
为了兼顾各种配置计算机的使用,SQL Server 2000的数据库引擎可以运行在装有Windows 98的台式机,笔记本电脑到安装Windows 2000数据中心的多处理器计算机上。SQL Server 2000企业版具有聪明服务器,视图索引以及超大规模的内存支持等特征,完全可以满足最大规模的Web站点的性能需求。
SQL Server 2000所支持的联盟数据库服务器特性允许用户在多个数据库服务器上水平划分数据表,从而使得服务器彼此合作提供相似于集群服务器所能提供的强大性能。
2.简单友好的操作方式
SQL Server 2000包含一整套的管理和开发工具,这些工具都具有非常友好的用户界面,在提供强大功能的同时,易于安装,使用和发布。用户可以把更多的精力放在自己的业务问题上,可以非常迅速地建立并发布强大而复杂的数据库应用系统。
3.数据仓库支持
SQL Server 2000为了满足现代企业对大规模数据进行有效分析和利用的要求,包含了一系列提取,分析,总结数据的工具从面使联机分析处理成为可能。同时,SQL Server 2000提供了英语查询工具和编程接口,使得以英语为基础设计和管理,查询数据库成为了可能。
2.1.4 ODBC的基本思想与体系结构
ODBC(Open Database Connectivity)是由微软公司提出的一个用于访问数据库的统一界面标准,随着客户机/服务器体系结构在各行业领域广泛应用,多种数据库之间的互连访问成为一个突出的问题,而ODBC成为目前一个强有力的解决方案。ODBC之所以能够操作众多的数据库,是由于当前绝大部分数据库全部或部分地遵从关系数据库概念,ODBC看待这些数据库时正是着眼了这些共同点。虽然支持众多的数据库,但这并不意味ODBC会变得复杂,ODBC是基于结构化查询语言(SQL),使用SQL可大大简化其应用程序设计接口(API),由于ODBC思想上的先进性,而且没有同类标准或产品与之竞争,因而越来越受到众多厂家和用户的青睐。目前,ODBC已经成为客户机/服务器系统中的一个重要支持技术。
ODBC基本思想是提供独立程序来提取数据信息,并具有向应用程序输入数据的方法。由于有许多可行的通信方法、数据协议和DBMS能力,所以ODBC方案可以通过定义标准接口来允许使用不同技术,这种方案导致了数据库驱动程序的新概念-动态链接库(DDL)。应用程序可按请求启动动态链接库,通过特定通信方法访问特定数据源,同时ODBC提供了标准接口,允许应用程序编写者和库提供者在应用程序和数据源之间交换数据。
为了保证标准性和开放性,ODBC的结构分为四层:应用程序(Application)、驱动程序管理器(Driver Manager)、驱动程序(Driver)、数据源(Data Source)。驱动程序管理器与驱动程序对于应用程序来说都表现为一个单元,它处理ODBC函数调用。
图2.1 结构图
所示为基于客户机/服务器的ODBC体系结构。
* 应用程序(Application)
应用程序本身不直接与数据库打交道,主要负责处理并调用ODBC函数,发送对数据库的SQL请求及取得结果。
* 驱动程序管理器(Driver Manager )
驱动程序管理器是一个带有输入程序的动态链接库(DLL),主要目的是加载驱动程序,处理ODBC调用的初始化调用,提供ODBC调用的参数有效性和序列有效性。
* 驱动程序(Driver)
驱动程序是一个完成ODBC函数调用并与数据之间相互影响的DLL,当应用程序调用。
* 数据源(Data Source)
包括用户想访问的数据以及与其相关的操作系统、DBMS和用于访问DBMS的网络平台。
ODBC接口的优势之一为互操作性,程序设计员可以在不指定特定数据源情况下创建ODBC应用程序。从应用程序角度方面,为了使每个驱动程序和数据源都支持相同的ODBC函数调用和SQL语句集,ODBC接口定义了一致性级别,即ODBC API一致性和ODBC SQL语法一致性。一致性级别通过建立标准功能集来帮助应用程序和驱动程序的开发者,应用程序可以很容易地确定驱动程序是否提供了所需的功能,驱动程序可被开发以支持应用程序选项,而不用考虑每个应用程序的特定请求。
2.1.5 客户机/服务器结构(C/S)
二层的C/S结构是指以单一的服务器和局域网为核心,能通过客户端与用户进行直接对话。主要有二大功能:一是它用于检查用户从键盘等输入的数据,显示应用输出的数据。为使用户能直观地进行操作,一般要使用图形用户接口(GUI),操作简单、易学易用。在变更用户接口时,只需改写显示控制和数据检查程序,而不影响其他。检查的内容也只限于数据的形式和值的范围,不包括有关业务本身的处理逻辑。另一个是确认用户对应用和数据库存取权限的功能以及记录系统处理日志。
典型的C/S结构有以下特点:
。服务器负责数据管理及程序处理
。客户机负责界面描述和界面显示
。客户机向服务器提出处理要求
。服务器响应将处理结果返回客户机
。使网络数据流量最少
近几年,客户机/服务器体系日益成熟而且应用越来越广泛,许多图书馆管理系统都用这种结构进行设计。开放式数据库互连(ODBC)技术成为这一体系中数据库之间管理和应用程序开发的强大工具。
2.1.6 使用MFC ODBC
因为本系统主要用到MFC ODBC编程,所以详细的介绍其使用方法:
1.常用类
VisualC++的MFC类库定义了几个数据库类。在利用ODBC编程时,经常要使用到CDatabase(数据库类),CRecordSet(记录集类)和CRecordView(可视记录集类)。 其中:
CDatabase类对象提供了对数据源的连接,通过它你可以对数据源进行操作。
CRecordView类对象能以控制的形式 显示数据库记录。这个视图是直接连到一个CRecordSet对象的表视图。
CRecordSet类对象提供了从数据源 中提取出的记录集。CRecordSet对象通常用于两种形式: 动态行集(dynasets)和快照集(snapshots)。动态行集能保 持与其他用户所做的更改保持同步。快照集则是数据的一个静态视图。每一种形式在记录集被打开时都提供一组记录,所不同的是,当你在一个动态行集里滚 动到一条记录时,由其他用户或是你应用程序中的其他记录集对该记录所做的更改会相应地显示出来。
Visual C++提供了几种记录集,可以用来定制应用程序的工作方式。查看这些不同选项的最快方式要兼顾速度和特征。你会发现,在很多情况下,如果想添加特征,就必须付出程序执行速度降低的代价。下面告诉你一些可以自由支配的记录集选项。更重要的是,要告诉你从这个选项可以获得更快的速度还是更多的特征。
1)、Snapshot(快照) 这个选项要Visual C++在一次快照中下载整个查询。换言之,及时快速地给数据库内容拍照,并把它作为未来工作的基础。这种方法有三个缺点。第一,你看不到别人在网络上做的更新,这可能意味着你的决定是建立在老信息的基础上。第二,一次就下载所有这些记录,这意味着在下载期间给网络增加了沉重的负担。第三,记录下载时用户会结束等待,这意味着网络的呼叫性能变得更低。然而这种方法也有两个优点。第一,记录一旦被下载,该工作站所需的网络活动几乎就没有了棗这为其它请求释放了带宽。总之,你会看到网络的吞吐量增大了。第二,因为所有被申请的记录都在用户的机器上,所以用户实际上会得到应用程序更佳的总体性能。你可能想把快照的方法限制在较小的数据库上使用,原因在于快照适用于用户请求信息而不适用于数据编辑会话。
2)、Dynaset(动态集) 使用这个选项时,Visual C++创建指向所请求的每个记录的实际指针。另外,只有填充屏幕时实际需要的记录是从服务器上下载来的。这种方法的好处很明显。几乎马上就能在屏幕上看到记录。而且还会看到其它用户对数据库所做的更改。最后,其它用户也会看到你做的更改,因为动态集在你更改记录时被上载到服务器上。很明显,这种方法要求对服务器的实时访问,它减小了网络总吞吐量并降低了应用程序的性能。这个选项适合于创建用户要花费很多时间来编辑数据的应用程序。同时,它也是大型数据库的最佳选择,原因在于只需下载用户实际需要的信息。
2.ODBC需导出类
可以应用AppWizard来建立一个ODBC的应用程序框架,也可以直接使用ODBC来进行数据库编程,这时,应包括头文件afxdb.h。
应用ODBC编程两个最重要的类是CDatabase和CRecordSet,但在应用程序中,不应直接使用CRecordSet类,而必须从CRecordSet类产生一个导出类,并添加相应于数据库表中字段的成员变量。随后,重载CRecordset类的成员函数DoFieldExchange,该函数通过使用RFX函数完成数据库字段与记录集域数据成员变量的数据交换,RFX函数同对话框数据交换(DDX)机制相类似,负责完成数据库与成员变量间的数据交换。
3.数据库连接
在CRecordSet类中定义了一个成员变 量m_pDatabase:
CDatabase *m_pDatabase;
它是指向对象数据库类的指针。如果在CRecordSet类对象调用Open()函数之前,将一个已经打开的CDatabase类对象指针传给m_pDatabase,就能共享相同 的CDatabase类对象。如:
CDatabase m_db;
CRecordSet m_set1,m_set2;
m_db.Open(_T("Super_ES"));// 建 立ODBC 连 接
m_set1.m_pDatabase=&m_db;//m_set1 复 用m_db 对 象
m_set2.m_pDatabse=&m_db;// m_set2 复 用m_db 对 象
或如下:
Cdatabase db;
db.Open(“Database”); //建立ODBC连接
CrecordSet m_set(&db); //构造记录集对象,使数据库指向db
4.查询记录
查询记录使用CRecordSet::Open()和 CRecordSet::Requery()成员函数。在使用CRecordSet类对象之前,必须使用 CRecordSet::Open()函数来获得有效的记录集。一旦已经使用过CRecordSet::Open() 函数,再次查询时就可以应用CRecordSet::Requery()函数。在调 用CRecordSet::Open()函数时,如果已经将一个已经打开的CDatabase 对象指针传给CRecordSet类对象的m_pDatabase成员变量,则使 用该数据库对象建立ODBC连接;否则如果m_pDatabase为空指 针,就新建一个CDatabase类对象并使其与缺省的数据源 相连,然后进行CRecordSet类对象的初始化。缺省数据源 由GetDefaultConnect()函数获得。你也可以提供你所需要的SQL 语句,并以它来调用CRecordSet::Open()函数,例如:m_Set.Open(AFX_DATABASE_USE_DEFAULT,strSQL);如果没有指定参数,程序则使 用缺省的SQL语句,即对在GetDefaultSQL()函数中指定的SQL语 句进行操作:
CString CTestRecordSet::GetDefaultSQL()
{return _T("[BasicData],[MainSize]");}
对于GetDefaultSQL()函数返回的表名, 对应的缺省操作是SELECT语句,即:
SELECT * FROM BasicData,MainSize
查询过程中也可以利用CRecordSet的 成员变量m_strFilter和m_strSort来执行条件查询和结果排序。m_strFilter 为过滤字符串,存放着SQL语句中WHERE后的条件串;m_strSort 为排序字符串,存放着SQL语句中ORDERBY后的字符串。 如:
m_Set.m_strFilter="TYPE='电动机'";
m_Set.m_strSort="VOLTAGE";
m_Set.Requery();
对应的SQL语句为:
SELECT * FROM BasicData,MainSize
WHERE TYPE='电动机'
ORDER BY VOLTAGE
除了直接赋值给m_strFilter以外,还 可以使用参数化。利用参数化可以更直观,更方便地 完成条件查询任务。使用参数化的步骤如下:
(1).声明参变量:
Cstring p1;
Float p2;
(2).在构造函数中初始化参变量
p1=_T("");
p2=0.0f;
m_nParams=2;
(3).将参变量与对应列绑定
pFX->SetFieldType(CFieldExchange::param)
RFX_Text(pFX,_T("P1"),p1);
RFX_Single(pFX,_T("P2"),p2);
完成以上步骤之后就可以利用 参变量进行条件查询了:
m_pSet->m_strFilter="TYPE=?ANDVOLTAGE=?";
m_pSet->p1="电动机";
m_pSet->p2=60.0;
m_pSet->Requery();
参变量的值按绑定的顺序替换 查询字串中的“?”适配符。
如果查询的结果是多条记录的 话,可以用CRecordSet类的函数Move(),MoveNext(),MovePrev(),MoveFirst() 和MoveLast()来移动光标。
5.增加记录
增加记录使用AddNew()函数,要求数据库必须是以允许增加的方式打开:
m_pSet->AddNew();//在表的末尾增加新记录
m_pSet->SetFieldNull(&(m_pSet->m_type),FALSE);
m_pSet->m_type="电动机";
...//输入新的字段值
m_pSet->Update();//将新记录存入数据库
m_pSet->Requery();//重建记录集
6.删除记录
直接使用Delete()函数,并且在调用Delete() 函数之后不需调用Update()函数:
m_pSet->Delete();
if(!m_pSet->IsEOF())
m_pSet->MoveNext();
else
m_pSet->MoveLast();
7.修改记录
修改记录使用Edit()函数:
m_pSet->Edit();//修改当前记录
m_pSet->m_type="发电机";//修改当前记录字段值
...
m_pSet->Update();//将修改结果存入数据库
m_pSet->Requery();
8.统计记录
统计记录用来统计记录集的总数。可以先声明一个CRecordset对象m_pSet。再绑定一个变量m_lCount,用来统计记录总数。执行如下语句:
m_pSet->Open(“Select Count(*) from 表名 where 限定条件”);
RecordCount=m_pSet->m_lCount;
m_pSet->Close();
RecordCount即为要统计的记录数。
或如下:
CRecordset m_Set(&db); //db 为CDatabase对象
CString strValue;
m_Set.Open(Select count(*) from 表名 where 限定条件”);
m_pSet.GetFieldValue((int)0,strValue);
long count=atol(strValue);
m_set.Close();
count为记录总数。
9.执行SQL语句
虽然通过CRecordSet类,我们可以完成 大多数的查询操作,而且在CRecordSet::Open()函数中也可以 提供SQL语句,但是有的时候我们还想进行一些其他操 作,例如建立新表,删除表,建立新的字段等等,这 时就需要使用到CDatabase类的直接执行SQL语句的机制。通过调用CDatabase::ExecuteSQL()函数来完成SQL语句的直接执行:
如下代码所示
BOOL CDB::ExecuteSQLAndReportFailure(const CString& strSQL)
{
TRY
{
m_pdb->ExecuteSQL(strSQL);//直接执行SQL语句
}
CATCH (CDBException,e)
{
CString strMsg;
strMsg.LoadString(IDS_EXECUTE_SQL_FAILED);
strMsg+=strSQL;
return FALSE;
}
END_CATCH
return TRUE;
}
应当指出的是,由于不同DBMS提 供的数据操作语句不尽相同,直接执行SQL语句可能会破坏软件的DBMS无关性。
2.2 系统运行环境
2.2.1 服务器软硬件要求
软件:
MS SQL Server 2008
TCP/IP协议
硬件:
CPU: Intel Xeon E3-1230 v22及以上
内存:2GB以上
硬盘:1Tb以上
2.2.2 客户机软硬件要求
软件:
Windows XP/7/10
TCP/IP协议
硬件:
CPU: Intel 酷睿i3 3225及更高档的PC
内存: 1GB以上
硬盘:500GB以上
第3章 需求分析
如同任何生物一样,软件也有一个诞生、成长、衰亡的生存过程。我们称为软件的生存期。根据这一思想,可以得到软件生存期六个步骤,即制定计划、需求分析、软件设计、程序编码、测试及运行维护。
软件需求分析工作是软件生存期中重要一步,也是决定性一步。只有通过需求分析才能把软件功能和性能的总体要领描述为具体的软件需求规程说明,从而奠定软件开发的基础
3.1 功能需求
根据自己调查图书馆的业务情况,从实际应用的角度出发,确定为用户提供和实现以下功能:
1.登录功能。
2.读者:主要提供直接查询(包括模糊查询)和多条件分类查询功能。
3.图书管理员:主要提供借书,还书,图书管理。
4.超级管理员:主要提供图书管理员登录数据库管理,图书类管理,读者管理.逾期未还图书的信息管理。
5.打印功能:打印逾期示还图的信息或读者。
6.联机帮助功能:能帮助用户在最短的时间使用本系统。
3.2 数据流图(DFD)
通过对系统需求的调查分析,细化软件功能,把系统划分几四个子系统,明确每个子系统所要完的主要逻辑功能,采用以图形的方式描绘数据在系统中流动和处理的数据流图来表示系统的逻辑模型。
顶层图:
图 3.1 顶层图
一层图:
图 3.2 一层图
注:
D1 图书数据库
D2 读者数据库
D3 管理员数据库
D4 图书分类数据库
D5 借书记录数据库
F1-F3 登录信息
F4,F5图书信息
F6 各种管理信息 F7 图书信息
二层图:
图3.3 二层图
图3.4 层级图
图3.5 总图
3.3 数据字典
为了使各数据流,数据处理过程,存储过程不能反映其中的数据成,数据项目,数据特性,所以用数据字典来对数据流图中的各成份进行具体的定义,为系统的分析,设计及以后的实现搞供有关元素一致性定义和详细的描述:
数据流字典
数据流名称:读者登录 标志符:F1
别名:无
来源:读者
去向:查询处理过程(P2)
数据组成:编号+姓名+密码+登录权限
数据流名称:管理员登录(P3) 标志符:F2
别名:无
来源:管理员
去向:借还处理过程
数据组成:编号+姓名+密码+登录权限
数据流名称:超级管理员登录 标志符:F3
别名:无
来源:超级管理员
去向:系统管理处理过程(P4)
数据组成:编号+姓名+密码+登录权限
数据流名称:图书查询 标志符:F4
别名:无
来源:读者
去向: 查询处理过程(P2)
数据组成:图书编号|图书书名|图书作者|图书出版社
数据流名称:直接图书查询 标志符:F4.1
别名:无
来源:读者
去向: 直接查询处理过程(P2.1)
数据组成:图书编号|图书书名|图书作者|图书出版社
数据流名称:多条件图书查询 标志符:F4.2
别名:无
来源:读者
去向: 多条件查询处理过程(P2.2)
数据组成:图书编号+图书书名+作者+出版社+图书所属大类+图书属小类
数据流名称:图书借还 标志符:F5
别名:无
来源:管理员
去向: 借还处理过程(P3)
数据组成:图书编号+读者编号+借书日期+逾期标识
数据流名称:图书查询 标志符:F6
别名:无
来源:查询处理过程(P2)
去向:读者
数据组成:图书编号+图书书名+图书作者+图书出版社+现在库数据数量
数据流名称:系统管理 标志符:F7
别名:无
来源:超级管理员
去向: 查询处理过程(P4)
数据组成:各种管理信息,详情见F7.1-F7.5
数据流名称:书类管理 信息 标志符:F7.1
别名:无
来源:超级管理员
去向: 书类管理处理过程(P4.2)
数据组成:图书大类名+0{图书类名}30
数据流名称:图书管理信息 标志符:F7.2
别名:无
来源:超级管理员
去向: 图书管理处理过程(P4.3)
数据组成:书编号+书名+库存数据量+作者+所属书大类+所属图书小类|出版社|价格
数据流名称:逾期图书管理信息 标志符:F7.3
别名:无
来源:超级管理员
去向: 逾期图书管理处理过程(P4.4)
数据组成:借书期限
数据流名称:读者管理信息 标志符:F7.4
别名:无
来源:超级管理员
去向: 书类管理处理过程(P4.5)
数据组成:读者编号 + 读者姓名 + 可借书数 + 已借书数+ 逾期未还书数+性别+职务+工作单位+联系电话
数据流名称:管理员管理信息 标志符:F7.5
别名:无
来源:超级管理员
去向: 管理员管理处理过程(P4.6)
数据组成:管理员编号+管理员姓名+登录密码+授权等级
数据存储字典:
数据存储名称:图书数据库 标志符:D1
描述:图书的详细资料
流入数据流:F7.2
涉及处理:P4.2,P2.2,P2.3,P3.2,P3.3,P4.4
数据组成:图书编号+图书书名+作者+出版社+图书所属大类+图书属小类
数据存储名称:读者数据库 标志符:D2
描述:读者的详细资料
流入数据流:F7.4
涉及处理:P4.4,P2.2,P2.3,P3.2,P3.3,P4.4
数据组成:读者编号 + 读者姓名 + 可借书数 + 已借书数+ 逾期未还书数+性别+职务+工作单位+联系电话
数据存储名称:管理员数据库 标志符:D3
描述:管理员的详细资料
流入数据流:F7.5
涉及处理:P1,P4.5
数据组成:管理员编号+管理员姓名+登录密码+授权等级
数据存储名称:借书记录数据库 标志符:D4
描述:借书所记录的详细资料
流入数据流:F7.3
涉及处理:P4.4,P2.2,P2.3,
数据组成:图书编号+读者编号+借书日期+逾期标识
数据存储名称:图书分类数据库 标志符:D5
描述:图书分类的详细资料
流入数据流:F7.1
涉及处理:P4.1,P2.2,
数据组成:图书大类名+0{图书类名}30
数据处理字典:
数据处理名称:用户登录 标志符:P1
处理定义:登录系统
激发条件:所输入的编号和密码正确
输入:F1,F2,F3
输出:P2,P3,P4
数据处理名称:读者查询标志符:P2
处理定义:查询图书信息
激发条件:所输入图书信息找到
输入:F4
输出:F6
数据处理名称:查询选择标志符:P2.1
处理定义:选择查询方式
激发条件:已选择查询方式
输入:F4
输出:P2.2,P2,3
数据处理名称:多条件查询标志符:P2.2
处理定义:查询图书信息
激发条件:所输入图书信息找到
输入:F4.1
输出:F6
数据处理名称:直接查询标志符:P2.3
处理定义:直接查询图书信息
激发条件:所输入图书信息找到
输入:F4.2
输出:F6
数据处理名称:借还书标志符:P3
处理定义:借书和还书
激发条件:所输入图书信息找到
输入:F5
输出:D4
数据处理名称:选择标志符:P3.1
处理定义:选择借书还是还书
激发条件:选择
输入:F5
输出:P3.2,P3.3
数据处理名称:借书标志符:P3.2
处理定义:借书
激发条件:图书编号
输入:P5
输出:D4
数据处理名称:直接查询标志符:P3.3
处理定义:直接查询图书信息
激发条件:所输入图书信息找到
输入:F4.2
输出:D4
数据处理名称:管理系统标志符:P4
处理定义:管理系统和各种信息
激发条件:选择管理子功能
输入:F7
输出:F7.1-f7.5
数据处理名称:管理选择标志符:P4.1
处理定义:选择管理功能
激发条件:选择
输入:F7
输出:P4.2-P4.6
数据处理名称:图书分类管理标志符:P4.2
处理定义:图书分类增加,修改,删除
激发条件:输入图书分类信息
输入:F7.1
输出:D3
数据处理名称:图书管理标志符:P4.3
处理定义:图书信息增加,修改,删除
激发条件:输入各种图书信息
输入:F7.2
输出:D1
数据处理名称:图书逾期管理标志符:P4.4
处理定义:查询逾期图书的编号或读者
激发条件:选择查询方式
输入:F7.3
输出:D4,D2
数据处理名称:读者管理标志符:P4.5
处理定义:读者信息增加,修改,删除
激发条件:输入各种读者信息
输入:F7.4
输出:D2
数据处理名称:管理员登录管理标志符:P4.6
处理定义:管理员信息增加,修改,删除
激发条件:输入各种管理员信息
输入:F7.5
输出:D3
第4章 系统设计
4.1 系统总体结构
在软件需求分析阶段,已搞清了软件“做什么” 的问题,并描述出了系统的逻辑模型。在系统设计阶段,主要要解决软件“怎么做”的问题,所以需要描述软件的总的体系结构既系统总体结构。
本系统是一个图书管理系统,那么它具备用户登录:读者图书查询:管理员借还书,增加书:图书超级管理员管理系统信息四大基本功能,从这个基本功能出发,确定了本系统所应包含的五个子系统分成十个子模块,即:
登录模块,查询模块,借还书模块,系统管理模块,帮助子系统。其结构如下:
系统基本构架:
图4.1 系统框架图
图4.1 系统总体框架图
4.2 各功子系统功能划分
在确定本系统的基本结构后,本系统划分的五个子系统的功能如下:
登录子系统:
它主要提供用户登录功能,并按各用户的权限使用本系统。本系统分三类用户:读者权限公查询,管理员的权限是借还书和管理书,超级管理员的权限是管理读者,管理图书分类,管理管理员登录帐户,管理逾期图书。
查询子系统:
主要用于读者查询图书,其中直接查询包括按图书编号直接查询,按书名查询,按作者查询,按出版社查询(可选模糊查询)。多条件查询可以按读者的要求选取所需要的图书。
借还子系统:
主要由图书管理员进行借书还书记录的登记和清除。
管理子系统:
由图书管理员和超级管理员管理系统,分别是由图书管理员管理图书(包括图书信息的修改,新图书的增加,旧图书的删除),超级管理员管理图书分类,管理读者信息,管理管理员登录帐户,管理逾期未还图。
帮助子系统:
主要提供用户的使用本系统的操作手册。
第5章 数据库结构设计
5.1 数据库设计定义系统表的结构
系统数据库命名为Library_Data,5个数据表分别为BOOK(图书表)、READER(读者表)、BOOKCLASS(图书分类表)、LEND_RECORD(借还记录表)、MANAGE(管理员登录表),如下图所示。
 定义图书表(BOOK)
表5.1 图书表
字段 数据类型 长度 能否为空
BOOK_ID CHAR 10 NOT NULL
BOOK_NAME CHAR 30 NOT NULL
CLASS_NAME CHAR 20 NOT NULL
CLASS_SUB CHAR 20 NOT NULL
AUTHOR CHAR 10 NOT NULL
PUB_HOUSE CHAR 30 NULL
PRICE FLOAT 4 NOT NULL
BOOK_TOTAL INT 4 NOT NULL
CURRENT_TOTAL INT 4 NULL
 定义读者
表5.2 读者表
字段 数据类型 长度 能否为空
READER_ID CHAR 8 NOT NULL
READER_NAME CHAR 10 NULL
READER_SEX CHAR 2 NULL
READER_JOB CHAR 8 NULL
NUMBER INT 4 NULL
CUR_NUMBER INT 4 NULL
OVERDUE_NUMBER INT 4 NULL
READER_CLASS CHAR 16 NULL
READER_ADDRESS CHAR 26 NULL
READER_TELPHONE CHAR 16 NOT NULL
 定义图书分类表
表5.3 图书分类表
字段 数据类型 长度 能否为空
CLASS_NAME CHAR 20 NOT NULL
CLASS_SUB1 CHAR 20 NULL
… … … …
CLASS_SUB31 CHAR 20 NULL
 定义借还记录表
表5.4 借还记录表
字段 数据类型 长度 能否为空
BOOK_ID CHAR 10 NOT NULL
READER_ID CHAR 8 NOT NULL
LEND_DATA TIME 16 NULL
OVERTADA INT 4 NULL
 定管理员登录表
表5.5 管理员表
字段 数据类型 长度 能否为空 注释
MANAGE_ID CHAR 4 NOT NULL 管理员编号
MANAGE_NAME CHAR 10 NOT NULL 管理员姓名
MANAGE_GREADE CHAR 1 NOT NULL 管理员级别
MANAGE_PASSWORD CHAR 10 NOT NULL 管理员密码
5.2 建立触发器,存储过程
--------------建立借书记录存贮过程
CREATE PROCEDURE SP_LENDBOOK @BOOK_ID CHAR(10),
@READER_ID CHAR(8)
AS
INSERT INTO LEND(BOOK_ID,READER_ID,LEND_DATA,OVER_DATA)
VALUES(@BOOK_ID,@READER_ID,GETDATE(),0)
GO
-------------建立还书记录存贮过程
CREATE PROCEDURE SP_BACKBOOK @BOOK_ID CHAR(10),@READER_ID CHAR(8)
AS
DELETE FROM LEND
WHERE BOOK_ID=@BOOK_ID AND READER_ID=@READER_ID
GO
-------------建立检查逾期图书,读者存贮过程
CREATE PROCEDURE SP_OVERDATE @DATE_N INT=30
AS
UPDATE LEND
SET OVER_DATA=0
UPDATE LEND
SET OVER_DATA=1
WHERE DATEADD(DAY,@DATE_N,LEND_DATA)<GETDATE()
UPDATE READER
SET OVERDATE_NUMBER=0
DECLARE CHECKFLAT CURSOR FOR--------定义游标修改READER表,
SELECT READER_ID
FROM LEND
WHERE OVER_DATA=1
OPEN CHECKFLAT
DECLARE @READER_ID CHAR(8)
FETCH NEXT FROM CHECKFLAT INTO @READER_ID
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE READER
SET OVERDATE_NUMBER=OVERDATE_NUMBER+1
WHERE READER_ID=@READER_ID
FETCH NEXT FROM CHECKFLAT INTO @READER_ID
END
CLOSE CHECKFLAT
DEALLOCATE CHECKFLAT
GO
-------------建立借书记录表增加触发器
CREATE TRIGGER [TR_ADDLEND] ON [dbo].[LEND]
FOR INSERT
AS
update BOOK
set CURRENT_TOTAL=CURRENT_TOTAL-1
WHERE BOOK_ID IN (SELECT BOOK_ID
FROM inserted)
UPDATE READER
SET CUR_NUMBER=CUR_NUMBER+1
WHERE READER_ID IN (SELECT READER_ID
FROM inserted)
-------------建立还书记录删除触发器
CREATE TRIGGER [TR_DELLEND] ON [dbo].[LEND]
FOR DELETE
AS
update BOOK
set CURRENT_TOTAL=CURRENT_TOTAL+1
WHERE BOOK_ID IN (SELECT BOOK_ID
FROM deleted)
UPDATE READER
SET CUR_NUMBER=CUR_NUMBER-1
WHERE READER_ID IN (SELECT READER_ID
FROM deleted)
第6章 系统的实现
系统分为五个子系统,分别是登录子系统,查询子系统,借还子系统,管理子系统,帮助子系统。下面分别介绍其实现的方法:
6.1 登录子系统
它主要提供用户登录功能,并按各用户的权限使用本系统。本系统分三类用户:读者权限公查询,管理员的权限是借还书和管理书,超级管理员的权限是管理读者,管理图书分类,管理管理员登录帐户,管理逾期图书。
图6.1 管理员登录
实现过程:
我是在应用程序类(CLMApp)中的InitInstance()定义一个登录类(CloginDlg)对象实现的。
6.2 查询子系统
图6.2 查询
主要用于读者查询图书,其中直接查询包括按图书编号直接查询,按书名查询,按作者查询,按出版社查询(可选模糊查询)。多条件查询可以按读者的要求选取所需要的图书(图6.2)中现所选的右边为直接查询和模糊查询,左边为多条件查询)。
实现过程:
1)直接查询:
当选直接查询时,初始一个下拉框,可选择直接查询的一项,如图书名,作者,或图书编号。在这里我是在“查询”确认键的响应函数中定义记录集的过滤器m_StrFilter,然后视图调用Requery()重建记录集。在视图中运行GetDocument()->UpdateAllViews(this);在下面的ListView中显示所查询的图书信息。具体实现请看附录部分的CLMView类和CbookListView.
2)模糊查询
在进行直接查询时,因为进行的是精确查询,所以为了提高读者查询所知图书资料不是太清楚时,可选用“使用模糊查询”复选框。在这个视图中我定义了一个标量,当为0时,其运算符为“=”号,为1时为“ LIKE ”,并定义了二种形式,一种是:“查询条件%”,另一种是“%查询条件”,所以这样查询查找的范围要大多了,具体实现请看附录部分的CLMView类和CbookListView.
3) 多条件查询
当读者只有一个想找一本什么的书时,很难用直接查找或模糊查找去找到一本书,那么,分步的多条件查找就能满足读者的要求,能根据读者所选的大类小类,和其它信息如出版社,作者而将读者要查询的书显示在下面的LISTVIEW中,这是利用四个下拉框实现的,在所选大类时,定义了一个图书类记录集指针,在读者选多条件查询单框时,初始化大类下拉框,使所的大类都显示出来,让读者选择,当读者选了大类时,又初始化小类下拉框,显示所有小类,这样一步步的按读者要求选择完之后,用定义多条件过滤器,然后调用GetDocument()->UpdateAllViews(this);在下面的ListView中显示所查询的图书信息。具体实现请看附录部分的CLMView类和CbookListView.
6.3 借还子系统
主要由图书管理员进行借书还书记录的登记和清除,它分别由二个界面:借书操作界面和还书界面构成,下面分别介绍其实现过程:
6.3.1 借书模块
借书的操作十分简便,只要填入读者提供的图书编号和读者编号,只要移开输入点,就会显示图书的信息和读者的信息,(如图)并能自动检查是否有书,读者是否能借书而显示“确定”键OnKillfocusLbookid()和OnKillfocusLreaderid()是主要实现这些功能的函数,同时,我在后台编写了借书记录表的INSERT 触发器,能自动实现修改图书表中这本书的现存书数的减少。
图6.3 借书
和读者记录表中的已借书。只具体实现请看ClendDlg类和数据库实现中的建立借书记录表增加触发器。
6.3.2 还书模块
还书模块的实现还书功能,其设计主要用存储过程来实现。直接调用台编写的还书记录存储过程:先从前台界面上得到国书编号,在读者下拉框中将显示所有借阅这本书的读者,然后管理员选择这个还书读者编号,确定调用带有这二个参数的还书记录存储过程。具体的实现请看数据库中建立存储过程和CbackBook类。
图6.4 还书
6.4 管理子系统
由图书管理员和超级管理员管理系统,分别是由图书管理员管理图书(包括图书信息的修改,新图书的增加,旧图书的删除),超级管理员管理图书分类,管理读者信息,管理管理员登录帐户,管理逾期未还图。因其数据库的操作大都相同,所以只着重介绍管理逾期未还书管理(主要利用存储过程实现)和图书管理二个难度较大的模块:
6.4.1 图书管理模块
图6.5 图书管理
图书管理是本系统中实行的最基本的管理之一,它涉及到二个记录集的操作,一个是图书记录集,一个图书类记录集,每一本书除了其基本的信息外必需是属于那个大类中的那一个小类,这样做适合读者查询图书,其难点每本图书所属类型要与二个显示大小类的下拉框显示同步,我的实现比较原始,是在CMBookDlg::OnInitDialog()中初始化大类,再根据每本图的所属大类初始化小类下拉框,再根据所属小类找到相应的一项。大类下拉框应用一个WM_Selchange消息,每次选择都要用SelchangeClassname()初始化小类下拉框。其它如增加,删除,修改都是利用记录集中提供的函数实现的,只是在其中自大增加了一个界面控制标量,用来控制用户对些操作的专一性:也就是当击增加或其它按键时,其它都失效,只有一个确定和取消二个按健。具体实现过程请看CMBookDlg类。
6.4.2 逾期未还书管理
逾期未还书管理主要的功能是设置借阅天数和查看那些读者没有还书,那些书没有还,图6.5是显示未还书的读者,这个功能的主要实现是存储过程,当设置好借阅天数确定后将执行一个存储过程——“建立检查逾期图书,读者存贮过程”,其参数是设置的天数,它将执行检查借书记录表中那些图书过了阅读期,过了的增加想应读者的未还书数,写入读者记录表,查年有逾期书的读者时,将其显示在listCtrl中,同时也可选查看逾期未还书,将显示所有逾未还的图书。具体的实现过程请看CcheckDlg类。
图6.6 逾期未归还管理
6.4.3 其它管理
其它管理如读者管理,图书分类管理,管理员登录帐户管理都实行的是在对话框中利用相应记录集进行修改,增加,删除等操作,其设计思想在前二个管理中都有此实现,在此不再累述。
结语
目前,在高校系部图书管理中,师生查找图书都是采用传统的查询方法,让读者在图书分类架上一本本地去查找,这样不仅很难找到自己所需要的图书,而且费时费力。而图书管理员在办理借书登记、查询读者借书记录时,管理人员必须在借书记录上一个个去查找,而要找到借书记录并删除该记录是件很麻烦的事情。每当新书入库时,图书管理员既要填写新书入库卡片,又要填写新书入库帐目,不仅工作量大,而且,在新书入库后要经历较长的时间方能借出。另外,有的系部因图书数量有限,必须对图书实行限量借阅,因此,要实施弹性借书方法是件很困难的事。
为提高图书查询效率,减少系部图书管理员的工作负担,有必要开发一个小型图书管理软件来对系部图书实施有效管理。该系统必须具备以下功能:1、能对各类图书实行分类管理;2、提供必要的读者信息;3、能进行各种高级查询(如未还书目的查询;已还书目的查询等);4、具有图书检索功能;5、能管理登录系统的图书管理员等。这样不仅能较好地帮助读者在最短的时间内找到自己所需要的图书书目、编号,而且能让图书管理员以最高的效率办理借阅手续。
参考文献:
[1]张亿军,羊照生. 图书管理系统设计研究[J]. 信息技术与信息化,2014,(03):47-49.
[2]贾帆,马燕,王节,陈美莲. 应用Web技术的图书管理系统[J]. 重庆理工大学学报(自然科学),2013,(08):76-79.
[3]吕琦英. UML对基于B/S模式的图书管理系统的分析与设计[J]. 中国管理信息化,2012,(10):113-114.
[4]赵庆海. 浅谈图书管理系统的意义及作用[J]. 黑龙江科技信息,2012,(11):123.
[5]王福生,杨洪勇. 图书管理系统中的借阅行为分析[J]. 复杂系统与复杂性科学,2012,(01):55-58.
[6]李春雷,陈萍. 基于.net平台的图书管理系统[J]. 职大学报,2011,(04):84-85.
[7]邓玉娇,王欣. 图书管理系统设计与实现[J]. 软件,2011,(02):36-38+55.
[8]唐明伟,卞艺杰,陶飞飞. RESTful架构下图书管理系统的研究与实现[J]. 现代图书情报技术,2010,(09):84-89.
[9]方玲玉,李念. 电子商务基础与应用:学用做一体化教程(第3版).电子工业出版社. 2015.8
[10]宫小全. 高等院校信息管理与信息系统专业系列教材:电子商务基础教程(第2版).2017.2
[11]宫小全. 电子商务系统分析与设计(第3版).清华大学出版社. 2017.11
[12]乔春源,樊天岳. 《信息技术》,江苏科学技术出版社,2011.7
[13]郭路生,杨选辉. 《Java Web编程技术》,清华大学出版社,2016.12
[14]岳耀明,呼斯勒,白双成,郝喜凤. 多民族语言图书管理系统的研究及设计[J].图书情报工作,2015.10
[15]胡志惠. 图书管理系统的设计与实现[J]. 改革与开放,2013,(12):172
|
|