图书管理系统技术报告.docx
- 文档编号:29794944
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:34
- 大小:610.29KB
图书管理系统技术报告.docx
《图书管理系统技术报告.docx》由会员分享,可在线阅读,更多相关《图书管理系统技术报告.docx(34页珍藏版)》请在冰豆网上搜索。
图书管理系统技术报告
安徽工业大学
软件开发技术报告
课题名称
图书管理系统
学院
专业班级
组长
成员
摘要
摘要内容:
我们小组制作的图书管理系统需要实现的功能主要有四大块:
基本资料维护、日常维护、系统安全模块和读者查询模块。
其中日常维护和基本资料维护是整个系统的核心。
日常维护包括借书处理、还书处理和缴纳罚金。
基本资料维护包括对读者、员工和图书的信息的维护,主要有读者信息的增删改,对员工资料进行增删改和对图书资料进行增删改。
系统安全模块只是实现了最简单的系统登陆检查。
读者查询也只是实现了简单的读者查询功能。
关键词:
基本资料维护、日常维护、系统安全模块和读者查询模块
目录
1.绪论
1.1概述
1.2开发环境和开发工具
2.系统需求分析
2.1用户需求分析
2.1.1用户需求
2.1.2系统功能需求
2.1.3图书馆系统的数据分析
2.2系统E-R图
3.系统设计
3.1功能模块图及分模块功能描述
3.1.1系统的功能模块图
3.1.2系统功能模块简介
4.图书管理系统的具体实现
4.1建立数据库
4.2图书信息管理系统的整体介绍
4.3建立工程
4.4登录模块的实现
4.5登录模块的具体实现
4.6还书模块
5.系统测试
6.系统说明
6.1开发环境
6.2系统安装与配置
总结
参考文献
1.绪论
1.1概述
对于图书馆的借书还书过程,我们作为学生的都已经很熟悉。
在计算机还没有广泛使用之前,借书和还书主要依靠手工操作。
手工操作的种类也很不统一,其中一个最典型的过程就是,读者将要借的书和读者证交给图书馆的工作人员,工作人员将每本书附带的描述书信息的卡和读者的读者证一起放到一个小格里,并在读者证和每本书上贴的借阅条上填写借阅信息。
这样就完成了借书的过程。
还书时,读者将要还的书交给工作人员,工作人员根据图书信息找到相应的书卡和借阅证,并填写相应的还书信息。
很显然,这种业务流程的效率很低,处理能力也不强。
一定的时间里,能够得到服务的读者是有限的,远远满足不了今天的图书馆。
利用计算机来处理这些流程无疑会极大程度的提高效率和处理能力。
接下来的篇章里,就会介绍我们小组制作的一个简单的图书管理系统。
1.2开发环境与工具
开发环境:
VC++
开发工具:
ACCESS
2.系统需求分析
2.1用户需求分析
2.1.1用户需求
借书过程:
读者从架上选到所需图书后,将借的书和读者证交给图书馆的工作人员,工作人员将用条码阅读器将图书和读者证上的读者条码信息读入处理系统。
系统根据读者条码从读者文件和借阅文件中找到相关记录;根据图书上的条码从图书文件中找到相关记录。
若读者符合借书条件,予以借出,系统在借阅文件中增加一条记录,记入读者条码、图书条码、借阅日期等内容。
还书过程:
还书时读者只要将书交给工作人员,工作人员将树上的图书条码读入系统,系统从借阅文件上找到相应记录,填上还书日期后写入借阅历史文件,并从借阅文件上删去相应记录。
同时系统对借还书日期进行计算并判断是否超期,若不超期则结束过程,若超期则计算超期天数、罚款数、记入罚款文件。
同时在读者记录上作止借标记。
当读者交了罚款后,系统根据读者条码查看罚款文件,并将相应记录写入罚款历史文件,并从罚款文件中删除该记录,同时去掉读者文件中的止借标记。
2.1.2系统功能需求
简单的图书管理系统主要包括下面的功能:
借书:
完成读者借书;
还书:
完成读者还书;
罚款:
对读者借书超期的处理;
添加新书:
输入新的图书信息;
删除旧书:
删除图书的资料;
读者查询:
根据输入的读者号查询读者借阅图书的情况。
2.1.3图书馆系统的数据分析
通过对图书系统的分析,可以得出该系统涉及七个实体:
读者文件、图书文件、工作人员、借阅文件、借阅历史文件、罚款文件、罚款历史文件。
通过对个实体数据关系的整理,我们可以得到下面的E-R图。
这些实体以及涉及的数据项有:
读者文件(reader):
读者条码(reader_id),姓名(name),身份证号(IDCARD),最多借书数(maxnum_can_borrow),直接标志(flag_borrow);
图书文件(book):
图书条码(book_id),书名(book_nam),作者(author),出版社(press),出版日期(press_date),停借标志(flag_borrow)
职工文件(clerk):
职工ID(clerk_ID),姓名(name),身份证号(ID_Card),口令(Password),职务(office)
借阅文件(borrow):
读者条码(reader_ID),图书条码(book_id),借出日期(borrow_date),操作人员代码(B_Clerk_ID),ID
借阅历史文件(history):
读者条码(reader_id),图书条码(book_id),借出日期(borrow_date),归还日期(return_date),ID
罚款文件(fine):
读者条码(reader_id),罚款天数(days),罚款数(amount),罚款日期(finedate),操作人员(Clerk_ID),ID
罚款历史文件(fine_history):
读者条码(reader_id),罚款天数(days),罚款数(amount),罚款日期(finedate),解止日期(ok_date),ID
2.2系统E-R图
3.系统设计
3.1功能模块图及分模块功能描述
3.1.1系统的功能模块图
3.1.2系统功能模块简介
借书处理的主要功能是扫描读者条形码,扫描图书条形码,在数据库中插入一条借书记录,该记录包括读者条形码、图书条形码、借出日期。
还书处理的主要功能是扫描图书条形码,在借阅文件中找到相应的记录,将该记录的相应数据插入到还书记录中,同时将借书记录删除。
缴纳罚金的主要功能是输入读者条形码,显示读者的姓名、罚款金额和过期天数,如果读者交纳了罚金,则将读者文件的允许借阅标志直为“Y”。
删除罚款文件中该读者对应的记录,将这一条记录同时插入到罚款历史文件中。
读者查询:
允许读者根据自己的条形码或姓名查询自己的借书记录。
图书资料维护的功能包括读者信息的输入新书资料、删除旧书资料,修改图书资料等。
读者资料维护的功能包括读者信息的输入、修改和删除。
工作人员信息维护主要包括工作人员信息的输入、修改和删除。
注销读者:
将读者记录置止借标志,同时提供删除读者信息的功能。
系统登录:
是对用户名和输入密码进行检查,已确定登录用户是否合法。
用户名和密码的维护是在工作人员资料维护模块中实现的。
4.图书管理系统的具体实现
4.1建立数据库
根据2.1.3的数据项表,用access设计数据库,数据库名为library,共有7个表,分别是读者文件(reader)、图书文件(book)、职工文件(clerk)、借阅文件(borrow)、借阅历史文件(history)、罚款文件(fine)、罚款历史文件(fine_history)。
截图如下:
Book表如下:
4.2图书管理系统的整体介绍
整体窗口界面如下:
在“系统”菜单中有“登录”子菜单项,“登录”子菜单主要完成员工登录。
在这儿,只实现最简单的权限管理,只要是员工登录后,就可用进行所有的操作。
在“基本资料维护”菜单下,有“用户菜单维护”、“读者资料维护”、“图书资料维护”菜单项。
这些资料维护分别完成相应的基本资料的增、删、改。
日常工作的子菜单有借书、还书和缴纳罚单。
借书处理主要是通过输入读者ID、图书条形码,完成borrow数据库记录的插入。
还书处理通过输入图书条形码,判断石佛超期。
如果超期,则删除borrow数据库记录同时向history数据库插入记录。
缴纳罚款处理主要是通过输入读者ID,将其在fine数据库的记录删除同时插入一条记录fine_history数据库中。
“查询”菜单中有读者信息查询,主要实现根据读者ID寻找读者其他资料和借书罚款资料。
4.3建立工程
首先建立新工程,我们使用MFC AppWizard生成library.dsw工作空间。
其具体步骤如下:
1.从VisualC++的File菜单中选择New命令,然后在new对话框中打开project选项卡,出现如图的窗口。
选择MFCAppWizard(exe)选项,同时工程名写为library,点击OK按钮。
2.接着出现下面的对话框如图所示,选择“单文档”选项,单击“下一步”,再单击“完成”。
接着,开始编辑菜单。
在ResourseView的Menu文件夹中双击菜单资源菜单资源IDR_MAINFRAM,打开VisualC++MenuEditor(菜单编辑器)。
建立一个新菜单,将它命名为“系统”,子菜单有两项,分别为“登录”和“退出”。
按上述步骤建立其他菜单项,组后得到如下所示的菜单。
4.4登录模块的实现
下面开始介绍登录模块的实现,在ResourceView的Dialog文件夹中,右击Dialog文件夹,选择InsertDialog选项。
然后右击产生的新的对话框,选择“属性”,打开如下所示对话框。
修改ID和标题编辑框,接着关闭对话框。
登录模块是要根据用户输入的用户名和密码与数据库Cleck中的Username和Password的比较来判断用户名和密码是否合法。
4.5登录模块的具体实现
首先,建立ODBC数据源。
在控制面板上双击ODBC数据源图标,选择“系统DSN”选项,单击“添加”按钮。
在数据源驱动程序列表框上选择MicrosoftAccessDriver选项,然后单击完成按钮。
选择library.mdb数据库,单击“确定”按钮。
即完成了数据源library的添加。
接着,右击登录模块对话框选择“建立类向导”选项,在弹出的对话框中,单击NewClass按钮,接着弹出如下对话框。
安图所示输入记录集的名字和选择基类。
单击“OK”按钮,出现如下的对话框。
选择数据源library,单击OK。
出现对话框。
选择对应的表clerk,单击OK按钮,于是CcleckDataSet类的建立就算完成了。
第四步,编写登录对话框中的登录按钮的脚本。
右击对话框的“登录”按钮,选择“建立类向导”选项。
如图所示,双击Message列表框中的BN_CLCKED,然后确定弹出的对话框。
并按EDITCODE按钮,编辑代码。
代码如下:
voidCLoginDlg:
:
OnConfirm()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CClerkDataSetmrsDataSet;/*声明记录集*/
CStringmSqlStr;
UpdateData(TRUE);
if(m_strName.IsEmpty())/*判断用户名信息是否为空*/
{
AfxMessageBox("请输入用户名!
");
return;
}
mSqlStr="SELECT*FROMCLERKWHERENAME='";//数据库查询
mSqlStr=mSqlStr+m_strName;
mSqlStr=mSqlStr+"'ANDPASSWORD='";
mSqlStr=mSqlStr+m_strPassword;
mSqlStr=mSqlStr+"'";
if(!
mrsDataSet.Open(AFX_DB_USE_DEFAULT_TYPE,mSqlStr))
{
AfxMessageBox("CLERK表打开失败!
");
return;
}
if(!
mrsDataSet.IsEOF())
{
//Openallfunctionforuser
m_bSuccess=TRUE;
m_strUSERID=mrsDataSet.m_CLERK_ID;
CDialog:
:
OnOK();
}
else
{
AfxMessageBox("登录失败!
");
m_strUSERID=_T("");
return;
}
}
第五步,按照上述方式,建立“登录”选项的单击事件中“取消”代码。
代码如下:
voidCLoginDlg:
:
OnCancel()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CDialog:
:
OnCancel();
}
4.6还书模块
介绍这个模块主要目的是介绍在记录集中引入多表连接的技术。
因而,在这一节中,只简单罗列操作步骤,着重介绍记录集CBorrowSet的生成。
第一步,生成如下图的对话框。
第二步,设相应的编辑框的成员变量为变量名称(程序)。
第三步,生成记录集CBorrowSet.CBorrowSet的记录集的SQL语句为:
SELECTborrow.*,book.*fromborrow,readerwhereborrow.reader_id=bkkk.reader_id;
(1)首先使用ClassWizard生成第一个表Borrow的记录集。
绑定Borrow的字段。
(2)选择ClassWizard的updatecolumns的按钮,第二次打开数据源对话框,选择第二个表Reader,绑定第二个表Reader的字段。
最好得到的成员变量名如下所示:
//ReturnBookDlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"time.h"
#include"Library.h"
#include"ReturnBookDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CReturnBookDlgdialog
CReturnBookDlg:
:
CReturnBookDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CReturnBookDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CReturnBookDlg)
m_Book_ID=_T("");
m_BorrowDate=_T("");
m_Days=0;
m_ReaderName=_T("");
m_ReturnDate=_T("");
//}}AFX_DATA_INIT
}
voidCReturnBookDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CReturnBookDlg)
DDX_Text(pDX,IDC_EDITBook_ID,m_Book_ID);
DDX_Text(pDX,IDC_EDITBorrowDate,m_BorrowDate);
DDX_Text(pDX,IDC_EDITDays,m_Days);
DDX_Text(pDX,IDC_EDITReaderName,m_ReaderName);
DDX_Text(pDX,IDC_EDITReturnDate,m_ReturnDate);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CReturnBookDlg,CDialog)
//{{AFX_MSG_MAP(CReturnBookDlg)
ON_EN_KILLFOCUS(IDC_EDITBook_ID,OnKillfocusEDITBookID)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CReturnBookDlgmessagehandlers
intCReturnBookDlg:
:
QryBorrow()
{
intresult;
CTimem_ReturnDate_tmp;//存放还书日期临时变量
CStringm_strtmp;
CTimem_Current_Time=CTime:
:
GetCurrentTime();//获取当前时间
CTimeSpanm_TimeSpan_tmp(30,24,59,59);
UpdateData(true);
if(strcmp(m_Book_ID,"")==0)
return0;
m_rsDataSet.m_strFilter="reader.reader_ID=borrow.reader_IDandBOOK_ID='"+m_Book_ID+"'";
if(!
m_rsDataSet.Open())//打开记录集
{
AfxMessageBox("数据打开失败!
");
return-1;
}
m_rsDataSet.Requery();
if(m_rsDataSet.GetRecordCount()!
=0)
{
m_ReaderName=m_rsDataSet.m_ReaderName;
m_BorrowDate=m_rsDataSet.m_BORROW_DATE.Format("%Y,%B%d");
m_ReturnDate_tmp=m_rsDataSet.m_BORROW_DATE+m_TimeSpan_tmp;
m_ReturnDate=m_ReturnDate_tmp.Format("%Y,%B%d");
if(m_ReturnDate_tmp { m_TimeSpan_tmp=CTime: : GetCurrentTime()-m_ReturnDate_tmp; m_Days=m_TimeSpan_tmp.GetDays(); UpdateData(false); Insert_Fine(); result=1; } else { UpdateData(false); Insert_History();//正常还书 result=2; } m_rsDataSet.Close(); returnresult; } else { return0; } } voidCReturnBookDlg: : OnKillfocusEDITBookID() { intrs; CWnd*pWnd; CStringm_strtmp; rs=QryBorrow(); if(rs==1) { m_strtmp.Format("超期%d天,还书处理正常完成。 是否继续处理还书流程? ",m_Days); if(: : MessageBox(this->m_hWnd,m_strtmp,"提示",MB_YESNO)==IDYES) SetTxtNull(); else CDialog: : OnClose(); } elseif(rs==2) { if(: : MessageBox(this->m_hWnd,"还书处理正常完成","提示",MB_YESNO)==IDYES) SetTxtNull(); else CDialog: : OnClose(); } elseif(rs==0) { if(m_Book_ID=="") return; : : MessageBox(this->m_hWnd,"该书号信息不存在! ","警告",MB_OK); } //TODO: Addyourcontrolnotificationhandlercodehere pWnd=GetDlgItem(IDC_EDITBook_ID); pWnd->SetFocus(); } voidCReturnBookDlg: : OnCancel() { //TODO: Addextracleanuphere CDialog: : OnCancel(); } intCReturnBookDlg: : Insert_Fine() { CDatabasemdb; CStringm_strsql; CTimem_CurrentTime; m_CurrentTime=CTime: : GetCurrentTime(); m_strsql.Format("insertintofine(Reader_ID,amount,days,fine_date)values(\'%s\',%f,%d",m_rsDataSet.m_READER_ID,(m_Days*0.2),m_Days); m_strsql=m_strsql+",'"+m_CurrentTime.Format("%Y,%B%d")+"')"; if(! mdb.Open(_T("Library"))) { AfxMessageBox("数据库打开出错"); return0; } try { mdb.BeginTrans(); mdb.ExecuteSQL(m_strsql); m_strsql="UPDATEREADERSETFLAG_BORROW='N'WHEREREADER_ID='"+m_rsDataSet.m_READER_ID; m_strsql=m_strsql+"'"; mdb.ExecuteSQL(m_strsql); mdb.CommitTrans(); return1; } catch(CDBExceptione) { AfxMessageBox("数据库执行出错"); return0; } } intCReturnBookDlg: : Insert_History() { CDatabasemdb; CStringm_strsql; if(! mdb.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图书 管理 系统 技术 报告