当前位置:首页 >> >>

图书管理系统设计报告


中南大学
《课程设计 II》设计报告 》





图书管理系统

学生姓名 学 号

专业班级 指导老师

2010 年 1 月

图书管理系统
一、实验目的、内容 实验目的、 图书管理系统,此实验的主要内容及目的

是熟悉 VC++.net 的 C/S 结构,掌 握如何通过 MFC ODBC 访问数据库。 对于图书的借书和还书过程,相信我们每个学生对此过成已经很熟悉。在计 算及尚未在图书馆广泛使用之前,借书和还书主要是依靠手工过程。一个最典型 的手工处理过程就是,读者将要借的书和借阅证交给工作人员,工作人员将每本 书附带的描述书信息的信息卡和读者借阅证一起放在一个小格栏, 并在借阅证和 每本书上帖的节约条上填写借阅信息。这样借书过程就完成了。幻术师,读者将 要还的图书交给工作人员,工作人员根据图书信息找到相应书卡和借阅证,并填 写相应的还书信息。 以上所描述的手工过程的不足是显而易见的, 首先处理借书还书业务流程效 率很低,其次处理能力比较低。一段时间内,所能服务的读者人数是有限的。 利用计算机来处理这些流程无疑会极大程度的提高效率和处理能力。 我们将 会看到排队等候借书还书的队伍不那么长了,工作人员出错的概率也小了,读者 可以花更多的时间在选择书可看书上。 二、实验程序设计及结构 1、需求分析(功能、类、成员) 当决定开发一个信息系统时,首先要对信息系统的需求进行分析。需求分析 要做的工作是深入描述软件的功能和性能, 确定软件设计的限制和软件同其他元 素的接口细节, 定义软件的其他有效性需求。 其主要包括一下四个步骤(如下图:):

当前系统

模型化

物理模型

抽象化

逻辑模型
导出

目标系统

具体化

物理模型

实例化

逻辑模型

1)、获得当前系统的处理过程,在此首先假设当前系统是手工处理系统。 手工处理流程大致是这样的。读者将要借的书和借阅证交给工作人员,工作 人员将每本书上贴的借阅条上填写借阅信息。这样借书过程就完成了。还书时, 读者将要还的书交给工作人员,工作人员根据图书信息找到相应的书卡和借阅 证,并填写相应的还书信息。 2)、抽象出当前系统的逻辑模型;

在理解当前系统“怎么做的”的基础上,抽象取出“做什么”的本质,从 而当前系统的物理模型抽象出当前系统的逻辑模型。 在物理模型中有许多物理因 素,随着分析工作的深入,有些非本质的物理因素就成为不必要的负担,因而需 要对物理模型进行分析,区分出本质的和非本质的因素,去掉那些非本质的因素 即可反映系统本质的逻辑模型。 3)、建立目标系统的逻辑模型; 建立目标系统的逻辑模型,分析目标系统与当前系统逻辑上的差别,明确 目标系统到底要“做什么” ,从而从当前系统的逻辑模型导出目标系统的逻辑模 型。在对上述流程进行分析后,我们对新的图书处理流程进行整理,图书馆开架 借书还书过程如下: 借书过程: 读者从架上选到所需图书后,将图书和借书卡叫管理人员,管理人员用条码 阅读器将图书和借书卡上的读者条码信息读入处理系统。 系统根据读者条码从读 者文件和借阅文件中找到相应记录, 读者如果有下列情况之一将不予办理借书手 续;
1 ○读者所节约图书已超过该读者容许的最多借书数目; 2 ○该读者记录中有止借标志; 3 ○该读者还有超过归还日期而仍未归还的图书; 4 ○该图书暂停外借。 若读者符合所有借书条件时,予以借出。系统在借阅文件中增加一条记录记入读 者条码,图书条码、借阅日期等内容。 还书过程:还书时读者只要将书交给管理人员,管理员将书中的图书条码 读入系统,系统从借阅文件上找到相应的记录。同时系统对借还书日期进行计算 并判断是否超期。若不超期则结束过程,若超期则计算出超期天数,罚款数,并 打印罚款通知书,记入罚款文件。同时在读者记录上做止借标记。当读者交来罚 款收据后系统根据读者条码查罚款文件,将相应记录写入罚款历史文件,并从罚 款文件只删除该记录,同时去掉读者文件中的止借标记。 借书过程数据流图如下所示:

读者文件

借 阅 文

读者

检查读者情况

记录借阅情

检查读者情况

图书文件

还书过程数据流图如下:

借阅文件

借阅历史

罚 款 文

读者

核查

修 改 文件, 判 断

计算罚 款,打 印罚单

读者文件

、为了对图书管理系统做完善的描述,还需要对上面得到的逻辑模型做一 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 的比较来判断用户名和密码是否合法。用户登陆对话框如下图所示:

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

单击 EDIT CODE 按钮,参照程序:
void CLoginDlg::OnConfirm() { // TODO: Add your control notification handler code here CClerkDataSet mrsDataSet; CString mSqlStr; UpdateData(TRUE); if (m_strName.IsEmpty()) { /*判断用户名信息是否为空*/ /*声明记录集*/

AfxMessageBox("请输入用户名!"); return; } mSqlStr = "SELECT * FROM CLERK WHERE NAME='"; mSqlStr = mSqlStr + m_strName; mSqlStr = mSqlStr + "' AND PASSWORD='"; mSqlStr = mSqlStr + m_strPassword; mSqlStr = mSqlStr + "'"; if (!mrsDataSet.Open(AFX_DB_USE_DEFAULT_TYPE, mSqlStr)) { AfxMessageBox("CLERK表打开失败!"); return; } if (!mrsDataSet.IsEOF()) { // Open all function for user m_bSuccess = TRUE; m_strUSERID = mrsDataSet.m_CLERK_ID ; CDialog::OnOK(); } else { AfxMessageBox("登录失败!"); m_strUSERID = _T(""); return; } }

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

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

至此登录模块完成,通过对登录模块的实现,便了解了通过 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()) { m_strReaderID = ""; m_strReaderName = ""; m_strIDCard = ""; } else { if (m_rsDataSet.IsBOF()) { m_rsDataSet.MoveNext(); } else { if (m_rsDataSet.IsEOF()) { m_rsDataSet.MovePrev(); } } m_strReaderID = m_rsDataSet.m_READER_ID; m_strReaderName = m_rsDataSet.m_NAME;

m_strIDCard = m_rsDataSet.m_IDCARD; } UpdateData(FALSE); return TRUE; }

第三步,在 CReaderMDlg 类中加入成员函数 SetButtonState()。代码如下所示:
BOOL CReaderMDlg::SetButtonState() { CWnd *pWnd; 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; } }

上述代码中使用了函数 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() { CWnd *pWnd; if (m_bEdit) { pWnd = GetDlgItem(IDC_READER_NAME); pWnd->EnableWindow(TRUE); pWnd = GetDlgItem(IDC_READER_ID); if (m_bAdd) pWnd->EnableWindow(TRUE); else pWnd->EnableWindow(FALSE); pWnd = GetDlgItem(IDC_IDCARD); pWnd->EnableWindow(TRUE); } else { pWnd = GetDlgItem(IDC_READER_NAME); pWnd->EnableWindow(FALSE); pWnd = GetDlgItem(IDC_READER_ID); pWnd->EnableWindow(FALSE); pWnd = GetDlgItem(IDC_IDCARD); pWnd->EnableWindow(FALSE); } pWnd = GetDlgItem(IDC_READER_NAME_FOR_Q); pWnd->EnableWindow(TRUE); pWnd = GetDlgItem(IDC_READER_ID_FOR_Q); 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() { // TODO: Add your control notification handler code here UpdateData(TRUE); if (m_strIDCard.IsEmpty() || m_strReaderName.IsEmpty() || m_strReaderID.IsEmpty()) { AfxMessageBox("请输入相应数据!"); return; } if (m_bAdd) { m_rsDataSet.AddNew(); } else { m_rsDataSet.Edit(); } m_rsDataSet.m_IDCARD = m_strIDCard; m_rsDataSet.m_NAME = m_strReaderName; m_rsDataSet.m_READER_ID = m_strReaderID; // m_rsDataSet.m_FLAG_BORROW m_rsDataSet.Update(); m_rsDataSet.Requery(); m_bAdd = FALSE; m_bEdit = FALSE; DisplayRecord(); SetButtonState(); SetTextState(); } = "Y";

第十一步,在“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()) { m_rsDataSet.m_strFilter = ""; m_rsDataSet.Requery(); DisplayRecord(); SetButtonState(); return; } BOOL mAll = FALSE; if (!m_strReaderIDQ.IsEmpty()) { m_rsDataSet.m_strFilter = "READER_ID='" + m_strReaderIDQ ; m_rsDataSet.m_strFilter = m_rsDataSet.m_strFilter + "'"; mAll = TRUE; } if (!m_strReaderNameQ.IsEmpty()) { if (mAll) { m_rsDataSet.m_strFilter = m_rsDataSet.m_strFilter + " AND NAME='"; m_rsDataSet.m_strFilter = m_rsDataSet.m_strFilter + m_strReaderNameQ; m_rsDataSet.m_strFilter = m_rsDataSet.m_strFilter + "'"; } else { m_rsDataSet.m_strFilter = "NAME='" } } m_rsDataSet.Requery(); + m_strReaderNameQ; m_rsDataSet.m_strFilter = m_rsDataSet.m_strFilter + "'";

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月 附录 自己做的主要实验源代码:


相关文章:
图书管理系统设计报告
图书管理系统设计报告_生产/经营管理_经管营销_专业资料 暂无评价|0人阅读|0次下载|举报文档图书管理系统设计报告_生产/经营管理_经管营销_专业资料。目 录 目 录...
图书管理系统课程设计报告
图书管理系统课程设计报告_计算机软件及应用_IT/计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档 图书管理系统课程设计报告_计算机软件及应用_IT/计算机_专业...
图书管理系统的设计与实现
江苏农牧科技职业学院毕业论文(设计) 图书管理系统设计与实现作者 孙鑫 指导教师 朱帅 【摘要】图书馆借阅信息管理系统应该能够为用户提供充足的信息和快捷的查询 ...
程序设计报告图书管理系统
题目:图书管理系统 一、课题内容基于角色管理的简易图书管理系统 实现功能: 1.角色管理。设有图书管理员和普通用户两类角色,他们设有不同的权限, 各类用户进入系统...
C#图书管理系统课程设计报告
C#图书管理系统课程设计报告_总结/汇报_实用文档。C#图书管理系统课程设计报告 数据库课程设计说明书题 目: 系别: 专业: 学生姓名: 学号: 指导教师: 年 月 日 ...
数据库课程设计报告图书管理系统
数据库课程设计报告图书管理系统_管理学_高等教育_教育专区 暂无评价|0人阅读|0次下载|举报文档 数据库课程设计报告图书管理系统_管理学_高等教育_教育专区。数据库...
图书管理系统设计报告
图书管理系统设计报告_计算机软件及应用_IT/计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档图书管理系统设计报告_计算机软件及应用_IT/计算机_专业资料。课程...
图书馆管理系统数据库设计报告
图书管理系统数据库设计报告 课程设计名称: 班级: 专业: 图书管理系统 12 级 1 班 网络工程 许老师 任课教师: 学号: 姓名: 实验日期: 256438741 万里 ...
图书管理系统详细设计报告
图书管理系统详细设计报告_计算机软件及应用_IT/计算机_专业资料。实验 5 图书管理系统的详细设计 1.引言 1.1 编写目的编写本报告是为了在软件的实际开发过程中有...
数据库课程设计报告-图书管理系统
数据库课程设计报告-图书管理系统_工学_高等教育_教育专区。数据库课程设计报告网上图书管理系统课程名称 专班学姓业级号名 数据库课程设计 计算机科学与技术 191122...
更多相关标签:
图书管理系统设计 | 图书馆管理系统设计 | 图书管理系统 | 图书管理系统课程设计 | 图书馆管理系统 | 图书管理系统毕业论文 | processon | c语言图书管理系统 |