图书管理系统设计报告

                          图书管理系统

系统设计目的和内容

图书管理系统主要目的是对图书馆种类繁多的书籍进行管理,并且合理管理好用户的借还信息。提高图书馆的工作效率,降低管理成本。其开发主要包括后台数据库的建立和维护,以及前端应用程序的开发。前者要求建立起数据一致性各完整性强、数据安全性好的数据库。而后者则要求应用程序具有功能完备、易用等特点。因此本系统结合开放式图书馆的要求,采用.NET技术

系统需求分析

图书馆在正常运营中面对大量书籍、读者信息,以及两者间相互产生的借书信息、还书信息。现有的人工记录方法即效率低又错误过多,大大影响了图书馆的正常管理工作。因需要对书籍、读者资源、借书信息、还书信息进行管理,及时了解各个环节中信息的变更,有利于管理效率的提高。对于图书馆管理系统,需求分析是数据库信息管理系统开发的第一步也是最重要的一步。可以将需求分析分为两个过程,一是理解需求,二是分析需求。

理解需求

(1)在进入系统之后首先是登录系统,根据用户输入的内容判断用户的合法身份。合法用户分为普通用户和系统管理员,其中系统用户拥有所有权限而普通用户没有用户管理的权限。

(2)进入读者信息维护界面可以进行读者信息的增加、删除、改变和查询,以及遍历记录。

(3)进入图书信息维护界面可以进行图书信息的增加、删除、改变和查询,以及遍历记录。

(4) 进入出版社信息维护界面可以进行出版社信息的增加、删除、改变和查询,以及遍历记录。

(5)进入读者借还书界面可以实现读者借书、还书和查询读者借阅记录的功能,并在读者借还书过程中同步实现相应数据库数据的变动。

(6)进入打印报表界面可以根据用户的选择,以报表形式打印出用户选择的数据表所有的记录。

(7)进入综合查询界面可以通过用户选择的数据表和相应的查询条件来显示查询到的结果。

(8)系统客户端运行在Windows平台下,服务端可以运行在Windows平台或者Unix平台下。系统还应该有一个较好的图形用户界面。

(9)系统应该有很好的可扩展性。

需求分析

需求分析就是描述系统的需求,通过定义系统中的关键类来建立模型。分析的根本目的是在开发者和提出需求的人之间建立一种理解和沟通的机制,因此,图

书馆管理系统的需求分析也应该是开发人员和用户或者客户一起完成的。需求分析的第一步是描述图书馆管理系统的功能,即定义用例,以此确定系统的需求。和用例相关的是系统的角色,图书馆管理系统的角色是读者、普通用户和系统管理员。读者借书和还书,系统管理员拥有所有的权限而普通用户没有用户管理的功能 。

图书馆管理系统的用例包括:

读者信息维护用例

出版社信息管理用例

读者借还书用例

综合查询用例

报表显示用例

其中借/还书信息管理用例包括:

借阅图书、归还图书、查询借阅信息

读者信息维护的用例包括:

增加读者信息、删除读者信息、修改读者信息、查询读者信息、遍历读者信息

同理,图书、出版社、用户信息管理用例也被分为增加、删除、修改、查询和遍历5个用例。

系统功能图

整个系统的结构以及各部分功能如下:

以下整个图书管理系统的各模块图

  系统功能结构图

(1)图书借阅系统完成用户的借书过程其数据流图如图所示。

1

  借阅系统的数据流图

(2)还书系统完成图书的归还过程其数据流图如图所示。

2

归还系统的数据流图

    (3)图书档案管理系统为用户提供图书档案信息其数据流图如图所示。

3  图书档案管理数据流图

(4)读者档案系统用于记录读者的详细信息其数据流图如图所示。

5

  读者档案管理数据流图

系统流程图

图书管理系统的流程是用户先输入自己的帐号密码及系统显示的验证码进入系统如有一项不符合则不能进入系统,成功登陆系统后系统根剧登陆的帐号信息从数据库中的数据进行对比判断是读者还是管理员,如果是读者则能进行信息查询,及修改自己的相关信息,查询到自己所需要的图书就能通过管理员进行借阅图书、归还图书也是通过管理员完成的。如果不是读者而是管理员,那管理员可以进行相关信息的查询、添加删除图书及读者的所有信息、设置相应的权限、为图书更新排行榜的信息、以及完成读者的图书借阅与归还。图书管理系统的系统流程图如图3-6所示。

图3-6  图书管理系统的流程图

数据总体结构设计

数据库概念结构设计

数据库概念结构设计是在需求分析的基础上,设计出能够满足用户需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计打下基础。这个阶段不用考虑所采用的数据库管理系统、操作系统类型、机器类型等问题。这阶段可用的工具很多。用的最多的是E-R图(Entity-Relation,实体-关系图),另外还有许多计算机辅助工具(Computer Aided Software Engineering, CASE)可以帮助进行设计。本系统采用了E-R图的方法进行数据库概念结构设计。E-R图是描述数据实体关系的一种直观描述工具。这种图中有:

  数据库逻辑结构设计

概念结构是独立于实际数据模型的信息结构,必须将其转化为逻辑结构后才能进行数据库应用的设计。也就是要将概念上的结构转化为数据库系统所支持的实际数据模型。

    第一种转化是将实体转化为关系表。这种转化较简单,需要将实体的属性定义为表的属性即可。

    第二种转化是联系的转化。即将各个实体之间的联系转化为表格之间的关系,如外部键的定义。

    在上面工作的基础上归纳出人员管理数据库表格的组成之间的联系等等。

  图书管理系统的系统E-R图

图书管理系统的系统E-R图如图4-5所示。

图4-5  图书管理系统的系统E-R图

登入模块分析

当用户输入用户名、密码,系统自动将输入的信息和相关数据表中的内容进行比较,如果该用户输入的内容和数据表中的内容相符,则通过验证,此次登录成功;否则登录失败。比较的过程是由浏览器将指令,数据发送到Web服务器,Web服务器通过对数据库进行查询将结果返回到浏览器,从而端显示成功的消息,用户只有成功登陆系统后才能进行一系列的操作,如下图所示。

登陆界面

  图书管理系统登陆界面

系统登陆验证码的实现

在学校图书管理系统的开发过程中,怎么样防止某些人利用某些恶意的软件对图书管理系统进行恶意的登陆来攻击系统,增加图书管理系统的安全性是一个重要的问题。在图书管理系统的登陆模块中加入一个验证码的功能,即用户除了要输入帐号和密码还要输入系统为用户提供的验证码。验证码可以很好的解决了怎样防止恶意用户利用恶意软件对系统页面的疯狂提交、以及暴力破解密码进行登陆的问题。因此,设置一个随机函数在数字0~9和英文字母A~Z中随机抽取四个,在用户打开登陆界面的时候,系统通过随机生成器随机生成4个数字或字母或数字加字母存放在缓存内,并出现在界面上顺序是随机的,当用户登陆时输入的验证码要与缓存中的进行对比符合就进入,不符合就不能登陆。系统在提供验证码时候要加入一些干扰的条件的,不过这些人的肉眼是很容易分辨,但机器人程序不能分辨,很好的防止某人利用机器人程序对系统的恶意操作增加了系统的安全性。验证码实现的关键代码如下:

private string GenerateCheckCode()

    {

        int number;

        char code;

        string checkCode = String.Empty;

        System.Random random = new Random();

        for (int i = 0; i < 4; i++)

        {

            number = random.Next();

            if (number % 2 == 0)

                code = (char)('0' + (char)(number % 10));

            else

                code = (char)('A' + (char)(number % 26));

            checkCode += code.ToString();

        }

        Response.Cookies.Add(new HttpCookie("CheckCode", checkCode));

        return checkCode;

    }

private void CreateCheckCodeImage(string checkCode)

    {

        if (checkCode == null || checkCode.Trim() == String.Empty)

            return;

        System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22);

        Graphics g = Graphics.FromImage(image);

        try

        {

            //生成随机生成器

            Random random = new Random();

            //清空图片背景色

            g.Clear(Color.White);

            //画图片的背景噪音线

            for (int i = 0; i < 2; i++)

            {

                int x1 = random.Next(image.Width);

                int x2 = random.Next(image.Width);

                int y1 = random.Next(image.Height);

                int y2 = random.Next(image.Height);

                g.DrawLine(new Pen(Color.Black), x1, y1, x2, y2);

            }

维护读者信息时序图,维护读者信息可以分为对读者信息的增加、删除、修改和查询操作,还可以在报表界面 显示读者报。维护图书、出版社信息时序图同理。

 借还书信息维护时序图,当用户操作读者的借还书信息时,不但要同时修改借阅记录从而显示现在的借阅状态,还要同时修改读者信息中的借阅图书数量这个属性,以及修改图书的库存量这个属性。

时序图设计完成后,开始进行图书管理系统的架构设计和细节设计。在架构设计中,将定义包(子系统)、包间的相关性和基本的通信机制。当然,要得到清晰简单的架构,架构中的相关性要尽可能的少。在详细设计中,应该将应用逻辑和技术逻辑分割。应用逻辑是需要编码设计的,而技术逻辑,主要包括用户接口。数据库或者通信,一般是已经有的。图书管理系统中的层(或者称为子系统、包)有如下几个

 界面层(User Interface Level):界面层可以简单地看成是将来用户要操作的界面,及界面上的各个控件和它们对应的事件。

 业务规则层(Business Rules Level):业务规则层包含前面设计的分析模型的类。业务对象包同数据层协同完成任务。

结论

经过几个月的设计和开发,学校图书管理系统基本开发完毕。其功能基本符合用户需求。对于数据的一致性的问题也通过程序进行了有效的解决。但是该系统还有许多不尽如人意的地方,在今后有待进一步改善。通过这次毕业设计真切地体会到毕业设计的目的并不止于自己单纯任务的完成,而在于学习新的知识并掌握具体的方法,如何具体使用和具体应用你所学所用的语言。从而获得一种本领:就是融会贯通各种语言。回首整个开发设计过程,我学到了很多书本上学不到的东西。比如以前开发软件的时候,一般做的就是编码工作,实现比较简单的功能。但是这次毕业设计,我要负责图书管理系统的整个开发过程,包括系统可行性分析、系统需求分析、系统概要设计、系统详细设计等方面的工作。在每个设计阶段我都能学到一些新知识,对我的动手能力提高很大。在整个毕业设计过程中,我基本上完成了图书管理系统各个模块的功能,达到了毕业设计的要求。页面设计还有进一步改善的地方,我会在今后的学习工作中着重加强这方面的锻炼。

在以后的工作中,还会遇到很多类似的情况,此次毕业设计为我以后的工作积累了很多宝贵的经验。这几个月中,从接到设计课题到具体设计再到完成系统开发,是一个不断地遇到问题与解决问题的过程。其中包括:分析各种需求、完善各种功能、增加必要环节、对各部分及整体进行检测与维护。当然仍存在许多问题不能解决地尽善尽美,还需不断地继续与探索。在结束设计的同时也感到了劳动的艰辛与劳动成果的来之不易,明白了毕业设计是给自己提供了一个锻炼、升华、提高、完善的机会。

主要研究内容及成果

介绍学校图书管理系统根据实际的需求及发展情况进行设计与开发情况,及介绍本系统设计应用平台及技术支持讲述本系统设计理念及具体设计情况,讲解本系统具体制作方法及核心代码。开发的图书管理系统基本上能完成预期的目标,大致能满足读者和管理员的要求。不过也有一些不足之处需要好好改进。

今后进一步研究方向

(1) 对页面进行美化,使界面变的更美观一点。

(2) 增加数据转换接口,使得本系统能与学校图书管理系统数据库进行无缝连接。

(3) 添加系统功能,本系统只有让读者知道还书的期限,当图书超期而读者也没注意要自己所借图书超期了,就无法及时的还书了,因此增加图书到期催还功能,能让读者在自己信息查询时候就能看到系统对自己所借图书的超期提醒以方便读者的图书归还。

参考文献

 

第二篇:.net图书管理系统设计报告

题 目 图书管理系统

图书管理系统

一、实验目的、内容

图书管理系统,此实验的主要内容及目的是熟悉VC++.net的C/S结构,掌握如何通过MFC ODBC访问数据库。

对于图书的借书和还书过程,相信我们每个学生对此过成已经很熟悉。在计算及尚未在图书馆广泛使用之前,借书和还书主要是依靠手工过程。一个最典型的手工处理过程就是,读者将要借的书和借阅证交给工作人员,工作人员将每本书附带的描述书信息的信息卡和读者借阅证一起放在一个小格栏,并在借阅证和每本书上帖的节约条上填写借阅信息。这样借书过程就完成了。幻术师,读者将要还的图书交给工作人员,工作人员根据图书信息找到相应书卡和借阅证,并填写相应的还书信息。

以上所描述的手工过程的不足是显而易见的,首先处理借书还书业务流程效率很低,其次处理能力比较低。一段时间内,所能服务的读者人数是有限的。

利用计算机来处理这些流程无疑会极大程度的提高效率和处理能力。我们将会看到排队等候借书还书的队伍不那么长了,工作人员出错的概率也小了,读者可以花更多的时间在选择书可看书上。

二、实验程序设计及结构

1、需求分析(功能、类、成员)

当决定开发一个信息系统时,首先要对信息系统的需求进行分析。需求分析要做的工作是深入描述软件的功能和性能,确定软件设计的限制和软件同其他元素的接口细节,定义软件的其他有效性需求。其主要包括一下四个步骤(如下图:):

net图书管理系统设计报告

1)、获得当前系统的处理过程,在此首先假设当前系统是手工处理系统。

手工处理流程大致是这样的。读者将要借的书和借阅证交给工作人员,工作人员将每本书上贴的借阅条上填写借阅信息。这样借书过程就完成了。还书时,读者将要还的书交给工作人员,工作人员根据图书信息找到相应的书卡和借阅证,并填写相应的还书信息。

2)、抽象出当前系统的逻辑模型;

在理解当前系统“怎么做的”的基础上,抽象取出“做什么”的本质,从而当前系统的物理模型抽象出当前系统的逻辑模型。在物理模型中有许多物理因素,随着分析工作的深入,有些非本质的物理因素就成为不必要的负担,因而需要对物理模型进行分析,区分出本质的和非本质的因素,去掉那些非本质的因素即可反映系统本质的逻辑模型。

3)、建立目标系统的逻辑模型;

建立目标系统的逻辑模型,分析目标系统与当前系统逻辑上的差别,明确目标系统到底要“做什么”,从而从当前系统的逻辑模型导出目标系统的逻辑模型。在对上述流程进行分析后,我们对新的图书处理流程进行整理,图书馆开架借书还书过程如下:

借书过程:

读者从架上选到所需图书后,将图书和借书卡叫管理人员,管理人员用条码阅读器将图书和借书卡上的读者条码信息读入处理系统。系统根据读者条码从读者文件和借阅文件中找到相应记录,读者如果有下列情况之一将不予办理借书手续;

1读者所节约图书已超过该读者容许的最多借书数目; ○

2该读者记录中有止借标志; ○

3该读者还有超过归还日期而仍未归还的图书; ○

4该图书暂停外借。 ○

若读者符合所有借书条件时,予以借出。系统在借阅文件中增加一条记录记入读者条码,图书条码、借阅日期等内容。

还书过程:还书时读者只要将书交给管理人员,管理员将书中的图书条码读入系统,系统从借阅文件上找到相应的记录。同时系统对借还书日期进行计算并判断是否超期。若不超期则结束过程,若超期则计算出超期天数,罚款数,并打印罚款通知书,记入罚款文件。同时在读者记录上做止借标记。当读者交来罚款收据后系统根据读者条码查罚款文件,将相应记录写入罚款历史文件,并从罚款文件只删除该记录,同时去掉读者文件中的止借标记。

借书过程数据流图如下所示:

net图书管理系统设计报告

net图书管理系统设计报告

net图书管理系统设计报告

还书过程数据流图如下:

net图书管理系统设计报告

net图书管理系统设计报告

4)、为了对图书管理系统做完善的描述,还需要对上面得到的逻辑模型做一些补充。首先采用图形的方式描述图书管理系统的用户界面,这样做的目的是保证整个系统的用户界面的一致性,同时也有助于后续开发人员更好的理解系统需要实现的功能。

2、设计结构(包括总体结构和数据结构)

通过对图书馆的需求分析可以独处该系统涉及三个实体:读者、图书、工作人员。

这些实体涉及的数据项有:

读者:读者条码,姓名,身份证号,最多借书数,止借标志

图书:图书条码,书名,作者,出版社,出版日期,数量,停借标志 工作人员:ID,姓名,身份证号,密码职务

实体之间涉及的数据项有:

借阅文件:读者条码,图书条码,借出日期,归还日期,操作人员ID

罚款文件:读者条码,罚款天数,罚款数,罚款日期,截止日期,操作人员ID

图书管理系统需要实现的功能主要有四大模块:基本资料维护,日常维护,系统安全模块和读者查询模块。其中日常维护和基本资料维护是整个系统的核心。日常维护包括借书处理,还书处理和缴纳罚金。基本资料维护包括对读者,员工和图书等信息的维护,主要有读者信息的增删改,对员工资料进行增删改,

对员工资料进行增删改和对图书资料进行增删改。系统安全模块只是实现了最简单的系统登陆检查。读者查询也只实现了简单的查询功能。下面对具体的模块进行具体的介绍。、

借书处理的主要功能是扫描读者条形码,在数据库中插入一条借书记录,该记录包括读者条形码,提升机条形码,借出日期。

还书处理的主要功能是扫描图书条形码,在借阅文件中找到相应的记录将该记录的相应数据插入到还书记录中,同时将结束记录删除。

缴纳罚金的主要功能是输入读者条形码,显示该读者的姓名,罚款金额和过期天数,如果读者缴纳了罚金,则将读者文件的允许标志设置为“Y”删除罚款文件中该读者对应的记录,将这一条记录同时插入到罚款历史文件中。

读者查询:允许读者根据自己的条形码或姓名查询自己的

借书记录;

图书资料维护的功能包括输入新书资料,删除救赎资料,修改图书资料等。 读者资料维护的功能包括读者信息的输入,修改和删除。

工作人员信息维护主要包括工作人员信息的输入,修改和删除;

注销读者:将读者记录置止记标志,同时提供删除读者信息的功能;

系统登陆:是对用户名和输入的密码进行检查,已确定登陆用户是否合法,用户名和密码的维护是在工作人员资料维护模块中实现的。

三、设计过程

1、 建立数据库

此图书管理系统使用的后台数据库服务器为Access。做此系统所使用的所有的代码均在一下操作环境下运行通过:

操作系统:Windows XP

数据库服务器:Microsoft office Access 2007

开发工具:Microsoft Visual Studio 2008

该图书管理系统所需的库结构为:

读者文件(reader):

读者条码(reader_id)、姓名(name)、身份证号(IDCARD)、最多借书数(maxnum_can_borrow)、止借标志(flag_borrow)

图书文件(book):

图书条码(book_id)、书名(book_name)、作者(author)、出版社(press)、出版日期(press_date)、停借标志(flag_borrow)

职工文件(clerk):

职员ID(Clerk_ID)、姓名(name)、身份证号(ID_Card)、口令(Password)、职务(office)

借阅文件(borrow):

读者条码(reder_ID)、图书条码(book_id)、借出日期(borrow_date)、操作人员(B_Clerk_ID) 、ID

借阅历史文件(history):

读者条码(reader_id)、图书条码(book_id)、借出日期(borrow_date)、归还日期(return_date)、借书操作人员(B_Clerk_ID)、还书操作人员(R_Clerk_ID) 、ID

罚款文件(fine):

读者条码(reader_id)、罚款天数(days)、罚款数(amount)、罚款日期(dine_date)、操作人员(Clerk_ID)、ID

罚款历史文件(fine_history):

读者条码(reader_id),罚款天数(days),罚款数(amount),罚款日期(fine_date),解止日期(ok_date),ID

一般在设计数据库结构时,我们常常在每个表上尤其是一些存放业务流程数据的表上增加一个对用户来说没有意义的字段。这个字段一般是长整形,并设其为自动加1的identity类型,这个字段主要是为了在业务流程数据表中唯一标识一条记录。

建立数据库有很多种方式,一种是直接使用Access图形界面建立相应的数据库,这种方式的好处是操作简单,但不适用于大型系统的开发。第二种是使用辅助数据库设计的工具直接建立数据库,修改数据库。第三种是写SQL语句,将整个系统涉及的数据表,视图、触发器等用SQL语句写在一个.sql的文本文件中,再用数据库支持的批量处理SQL语句的命令执行这个文件,这种方式比较普遍。在此系统中用的是第一种方式。

3、建立工程

首先建立新工程,在此使用的是MFC App Wozard生成library.dsw工作区间,具体步骤像建立一般MFC程序一样,在此不再赘述。

建立好工程之后,开始编辑菜单。在Resource视图下的Menu文件夹中双击菜单资源菜单资源IDR_MAINFRAME,打开菜单编辑器,建立一个新的菜单,命名为“系统”,子菜单有两项,分别为“登录”和“退出”。按上述步骤建立其他菜单项,最后得到如如下图所示的菜单。

登录模块的实现:

在Resource View的Dialog文件中有机Dialog文件夹,选择Insert Dialog选项,然后右击产生的新的对话框,选择Properties,设置对话框的各个属性值。登录模块是要根据用户输入的用户名和密码与数据库Clerk中的Username和Password的比较来判断用户名和密码是否合法。用户登陆对话框如下图所示:

net图书管理系统设计报告

在资源视图中右击对话框的“登录”按钮,选择classwozard选项。双击Messages列表框的BN_CLICKED,然后确定弹出的对话框。如果要编辑代码,则单击EDIT CODE按钮,参照程序:

void CLoginDlg::OnConfirm()

{

if (!mrsDataSet.Open(AFX_DB_USE_DEFAULT_TYPE, mSqlStr)) { } if (!mrsDataSet.IsEOF()) { } else { AfxMessageBox("登录失败!"

net图书管理系统设计报告

); // Open all function for user m_bSuccess = TRUE; m_strUSERID = mrsDataSet.m_CLERK_ID ; CDialog::OnOK(); AfxMessageBox("CLERK表打开失败!"); return; mSqlStr = "SELECT * FROM CLERK WHERE NAME='"; mSqlStr = mSqlStr + m_strName; mSqlStr = mSqlStr + "' AND PASSWORD='"; mSqlStr = mSqlStr + m_strPassword; mSqlStr = mSqlStr + "'"; if (m_strName.IsEmpty()) /*判断用户名信息是否为空*/ { } AfxMessageBox("请输入用户名!"); return; UpdateData(TRUE); // TODO: Add your control notification handler code here CClerkDataSet mrsDataSet; /*声明记录集*/ CString mSqlStr;

} } m_strUSERID = _T(""); return;

按照以上步骤,在菜单的“登录”选项中单击事件编写程序如下:

void CMainFrame::OnLoginIn()

{

// TODO: Add your command handler code here CLoginDlg mDlg; if (mDlg.DoModal() == IDOK) { } else { } CString Name; Name = "当前用户:" + m_strUserName; m_wndStatusBar.SetPaneText(0,Name);

} m_bLogin = FALSE; m_strUserName = _T(""); m_strUserID = _T(""); m_bLogin = TRUE; m_strUserName = mDlg.m_strName ; m_strUserID = mDlg.m_strUSERID;

至此登录模块完成,通过对登录模块的实现,便了解了通过MFC ODBC操作数据库的基本方式。

读者资料维护模块的实现:

第一步,生成对话框IDD_READER_MAITAIN,同时生成CreaderMDlg类以及相应的空间如下所示:

对应于编辑框的成员变量设为如下名称:

enum { IDD = IDD_READER_MAINTAIN };

CString CString CString CString CString m_strReaderIDQ; m_strReaderID; m_strReaderName; m_strReaderNameQ; m_strIDCard;

第二步,在“第一笔”按钮的事件脚本中插入如下代码:

void CReaderMDlg::OnFirst()

{

// TODO: Add your control notification handler code here if(!m_rsDataSet.IsBOF())

{

}

} m_rsDataSet.MoveFirst(); DisplayRecord(); SetButtonState();

这个函数的目的是将记录集移动到第一条记录,在CReaderMDlg类中加入成员函数DisplayRecord(),程序如下:

BOOL CReaderMDlg::DisplayRecord()

{

if (m_rsDataSet.IsEOF() && m_rsDataSet.IsBOF()) { } else {

net图书管理系统设计报告

if (m_rsDataSet.IsBOF()) { } else m_rsDataSet.MoveNext(); m_strReaderID = ""; m_strReaderName = ""; m_strIDCard = "";

} } { } m_strReaderID = m_rsDataSet.m_READER_ID; m_strReaderName = m_rsDataSet.m_NAME; m_strIDCard = m_rsDataSet.m_IDCARD; if (m_rsDataSet.IsEOF()) { } m_rsDataSet.MovePrev(); UpdateData(FALSE); return TRUE;

第三步,在CReaderMDlg类中加入成员函数SetButtonState()。代码如下所示: BOOL CReaderMDlg::SetButtonState()

{

if(!m_rsDataSet.IsOpen()) { pWnd = GetDlgItem(IDC_FIRST); pWnd->EnableWindow(FALSE); pWnd = GetDlgItem(IDC_NEXT); pWnd->EnableWindow(FALSE); pWnd = GetDlgItem(IDC_PRIOR); pWnd->EnableWindow(FALSE); pWnd = GetDlgItem(IDC_LAST); pWnd->EnableWindow(FALSE); pWnd = GetDlgItem(IDC_NEW); pWnd->EnableWindow(FALSE); pWnd = GetDlgItem(IDC_EDIT); pWnd->EnableWindow(FALSE); pWnd = GetDlgItem(IDC_ENQUERY); pWnd->EnableWindow(FALSE); pWnd = GetDlgItem(IDC_DELETE); pWnd->EnableWindow(FALSE); pWnd = GetDlgItem(IDC_SAVE); pWnd->EnableWindow(FALSE); pWnd = GetDlgItem(IDC_CANCEL_REC); pWnd->EnableWindow(FALSE); return TRUE; CWnd *pWnd;

} }

上述代码中使用了函数GetDlgItem(),它是实现在制定的对话框或窗口中搜索指定的控件或子窗口。

第四步,在“Prior”按钮插入如下事件脚本:

void CReaderMDlg::OnPrior()

{

} // TODO: Add your control notification handler code here if(!m_rsDataSet.IsBOF()) { } m_rsDataSet.MovePrev(); DisplayRecord(); SetButtonState();

第五步,在“Next”按钮如下事件脚本:

void CReaderMDlg::OnNext()

{

} // TODO: Add your control notification handler code here if(!m_rsDataSet.IsEOF()) { } m_rsDataSet.MoveNext(); DisplayRecord(); SetButtonState();

第六步,在“Last”按钮插入如下事件脚本:

void CReaderMDlg::OnLast()

{

} // TODO: Add your control notification handler code here if(!m_rsDataSet.IsEOF()) { } m_rsDataSet.MoveLast(); DisplayRecord(); SetButtonState();

第七步,在“New”按钮插入如下事件脚本:

void CReaderMDlg::OnNew()

{

} // TODO: Add your control notification handler code here m_strReaderID = ""; m_strReaderName = ""; m_strIDCard = ""; UpdateData(FALSE); m_bEdit = TRUE; m_bAdd = TRUE; SetButtonState(); SetTextState(); CWnd *pWnd; pWnd = GetDlgItem(IDC_READER_ID); pWnd->SetFocus();

第八步,在CreaderMDlg类中加入成员函数SetTextState(): BOOL CReaderMDlg::SetTextState()

{

} pWnd = GetDlgItem(IDC_READER_NAME_FOR_Q); pWnd->EnableWindow(TRUE); pWnd = GetDlgItem(IDC_READER_ID_FOR_Q); } else { pWnd = GetDlgItem(IDC_READER_NAME); pWnd->EnableWindow(FALSE); pWnd = GetDlgItem(IDC_READER_ID); pWnd->EnableWindow(FALSE); pWnd = GetDlgItem(IDC_IDCARD); pWnd->EnableWindow(FALSE); if (m_bEdit) { pWnd = GetDlgItem(IDC_READER_NAME); pWnd->EnableWindow(TRUE); pWnd = GetDlgItem(IDC_READER_ID); if (m_bAdd) pWnd->EnableWindow(TRUE); pWnd->EnableWindow(FALSE); else pWnd = GetDlgItem(IDC_IDCARD); pWnd->EnableWindow(TRUE); CWnd *pWnd;

} pWnd->EnableWindow(TRUE); return TRUE;

第九步,在“Edit”按钮插入如下事件脚本: void CReaderMDlg::OnEdit()

{

} // TODO: Add your control notification handler code here m_bEdit = TRUE; SetButtonState(); SetTextState(); CWnd *pWnd; pWnd = GetDlgItem(IDC_READER_NAME); pWnd->SetFocus();

第十步,在“Save”按钮插入如下事件脚本: void CReaderMDlg::OnSave()

{

// m_rsDataSet.m_FLAG_BORROW = "Y";

m_rsDataSet.Update(); m_rsDataSet.Requery(); m_bAdd = FALSE; m_bEdit = FALSE; DisplayRecord(); // TODO: Add your control notification handler code here UpdateData(TRUE); if (m_strIDCard.IsEmpty() || m_strReaderName.IsEmpty() || { } if (m_bAdd) { } else { } m_rsDataSet.m_IDCARD = m_strIDCard; m_rsDataSet.m_NAME = m_strReaderName; m_rsDataSet.m_READER_ID = m_strReaderID; m_rsDataSet.Edit(); m_rsDataSet.AddNew(); AfxMessageBox("请输入相应数据!"); return; m_strReaderID.IsEmpty())

} SetButtonState(); SetTextState();

第十一步,在“Cancel”按钮插入如下事件脚本: void CReaderMDlg::OnCancelRec()

{

} // TODO: Add your control notification handler code here m_bAdd = FALSE; m_bEdit = FALSE; DisplayRecord(); SetButtonState(); SetTextState();

第十二步,在“Query”按钮插入如下事件脚本: void CReaderMDlg::OnEnquery()

{

// TODO: Add your control notification handler code here UpdateData(TRUE); if (m_strReaderIDQ.IsEmpty() && m_strReaderNameQ.IsEmpty()) { } BOOL mAll = FALSE; if (!m_strReaderIDQ.IsEmpty()) { } if (!m_strReaderNameQ.IsEmpty()) { if (mAll) { } m_rsDataSet.m_strFilter = m_rsDataSet.m_strFilter + " AND m_rsDataSet.m_strFilter = m_rsDataSet.m_strFilter + m_rsDataSet.m_strFilter = m_rsDataSet.m_strFilter + "'"; m_rsDataSet.m_strFilter = "READER_ID='" + m_strReaderIDQ ; m_rsDataSet.m_strFilter = m_rsDataSet.m_strFilter + "'"; mAll = TRUE; m_rsDataSet.m_strFilter = ""; m_rsDataSet.Requery(); DisplayRecord(); SetButtonState(); return; NAME='"; m_strReaderNameQ;

} } else { } m_rsDataSet.m_strFilter = "NAME='" + m_strReaderNameQ; m_rsDataSet.m_strFilter = m_rsDataSet.m_strFilter + "'"; m_rsDataSet.Requery(); DisplayRecord(); SetButtonState();

第十三步,在“Delete”按钮插入如下事件脚本:

void CReaderMDlg::OnDelete()

{

} // TODO: Add your control notification handler code here m_rsDataSet.Delete(); DisplayRecord(); SetButtonState();

第十四步,在“Exit”按钮插入如下事件脚本:

void CReaderMDlg::OnExit()

{

} // TODO: Add your control notification handler code here CDialog::OnOK();

到此已经实现了用户登录模块和读者资料维护模块已经实现,这几个模块设计了通过MFC ODBC访问数据库的主要技术细节。其他模块的实现方式与这几个模块类似。余下主要实验源代码见附录。

四、设计的特点和结果

包括实验处理结果和设计心得。指出实验结果运行的操作系统和平台。

参考文献

1、杨小平,VC++项目实践攻关,科学出版社,2002年6月

附录

自己做的主要实验源代码:

相关推荐