面向对象课程设计
图书馆管理系统
院(系)别 信息工程系 班 级 学 号 姓 名 指导教师 时 间
课 程 设 计 任 务 书
题 目 图书管理系统C++语言
课程设计 系 (部) 信息工程系
专 业 信息管理与信息系统
班 级
学生姓名
学 号
10 月 10 日至 10 月 21 日 共 2 周
指导教师(签字)
系 主 任(签字)
年 月 日
成 绩 评 定 表
目 录
摘要····························· 2
1.图书管理系统概述················3
1.1图书管理系统总体设计思想·····3
1.2总体设计流程图···············4
2.图书管理系统详细设计·············5
2.1新建数据库(SQL server)········5
2.2 创建数据源···················5
2.3 C++中MFC应用程序编程·····5
2.3.1 建立基本对话框并与数据库连
接································5
2.3.2主要功能函数源代码········7
3.课程设计总结和体会··············19
1
摘要
图书馆管理系统创建基于MFC APPWizard[exe],利用SQLSERVE2000和MFC ODBC进行数据库的连接,在可视化的界面上进行用户名、图书及借书卡的查询、添加、修改、删除,对数据库表内的信息列表进行操作。
图书馆管理系统主要完成了用户登录功能、新建/删除用户功能、用户管理功能,对数据库内图书、借书卡和用户信息进行查询、添加、删除、修改功能。
图书馆管理系统设计是有下列几步完成的:首先对整体功能进行分析,开始是用户登录,登陆成功后显示主界面,其分为图书资料、读者资料、借书管理、还书管理和退出五个菜单;第二步是对五个菜单继续划分成具体的类进行实现;第三步是根据课程设计的要求在数据库内的建立具体的表,并且进行连接,及对数据库数据库内容的操作,与此同时完成界面的退出操作;第四步是对图书馆管理系统进行的全面优化,修改不足。
关键词:MFC,数据库,图书,管理
2
1.图书管理系统概述
1.1图书管理系统总体设计思想
图书馆管理系统的功能为读者提供借书、 还书和查询所需图书及图书、读者卡的管理等功能。
图书馆管理系统的功能模块有:
(1)登录界面 只有管理员才能使用全部功能,更好的保护图书馆内的一些信息不被破坏。
(2)读者资料 能实现对读者的显示、读者信息增加、读者查询、读者信息修改和读者信息删除功能。
(3)图书资料 能实现对图书显示、图书信息增加、图书查询、图书信息修改和图书信息删除功能。
(4)借书管理 可与数据库中的图书信息表连接实现借书的功能。
(5)还书管理 可与数据库中的图书信息表连接实现还书的功能
(6)退出 退出程序,结束运行。
通过SQL server建立一个图书馆管理系统的数据库,在控制面板的管理工具上用手动方式添加数据源进行连接。而与数据表的连接采用记录集的形式一一建立连接,可以进行图书资料和读者资料的管理,图书资料管理包括图书信息增加、图书查询、图书信息修改和图书信息删除四项,读者资料管理管理包括读者信息增加、读者查询、读者信息修改和读者信息删除。
用ODBC语言将数据库与C++连接起来,首先是登录界面,只有管理员才可进入。登陆成功后,管理员可在系统界面进行读者资料、图书资料、借书管理、还书管理等功能,通过对话框的跳转实现借书、还书、图书新增、查询等功能。在每个对话框都可实现新增、查询、删除、修改等功能顺利的对图书馆进行管理。
程序分为多个小模块,通过调用实现各种功能,增强了程序的可建设性。
1.2总体设计流程图
3
4
2.图书管理系统详细设计
2.1新建数据库(SQL server)
新建数据库名为library,然后在数据库下建立五个表,分别为BOOK、BORROW、CLERK、HISTORY、READER。其中,BOOK是存放图书信息的,BORROW是存放借书信息的,CLERK是存放管理员信息的,READER是存放读者信息的。然后设计各个表中的字段,并定义主键,然后输入数据即可。
2.2 创建数据源
此次课程设计用ODBC语言将数据库与C++连接,在连接之前应创建数据源。在控制面板上打开管理工具,可以找到数据源(ODBC),添加数据源,可以创建不同类型的数据库,此次设计用到了SQL Server,便选择其,打开SQL Server中的服务管理器可找到服务器的名称,将默认数据库改为自己的数据库。点下一步直至完成。这样,数据源创建成功了。
2.3 C++中MFC应用程序编程
2.3.1 建立基本对话框并与数据库连接
其步骤如下所示
1双击新建的对话框或建立类向导,如下图:
○
5
2点击OK,则如下图所示: ○
3在所示对话框中输入Name,然后Base class中选择CRecordset,点击OK,○
出现下图:
6
4既连接数据源,注意选择记录集类型为Dynaset。点击OK,出现下图: ○
5选择要连接的数据库表(此例选择dbo.BOOK),点击OK,就完成了与数据库○
表的连接。其他对话框同此例。
2.3.2主要功能函数源代码
1登录函数 ○
void CLoginDlg::OnConfirm() //登录函数
{
// TODO: Add your control notification handler code here
7
CClerkDataSet mrsDataSet; /*声明记录集*/ CString mSqlStr; UpdateData(TRUE); //将相应控件上的值反应到变量上 if (m_strName.IsEmpty()) /*判断用户名信息是否为空*/ { AfxMessageBox("请正确输入用户名!"); return; }
mSqlStr = "SELECT * FROM CLERK WHERE NAME='"; //查询数据库
中表CLERK中名字是输入的
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 CDialog::OnOK(); } else { AfxMessageBox("登录失败,请重新输入!"); return; } }
登录界面为
8
登录成功为
2图书资料中的查询函数 ○
void CBookDlg::OnEnquery() {
// TODO: Add your control notification handler code here UpdateData(TRUE); if (m_strBookIDQ.IsEmpty() && m_strBookNameQ.IsEmpty()) {
9
} m_rsDataSet.m_strFilter = ""; m_rsDataSet.Requery(); DisplayRecord(); SetButtonState(); return; } BOOL mAll = FALSE; if (!m_strBookIDQ.IsEmpty()) { m_rsDataSet.m_strFilter = "BOOK_ID='" + m_strBookIDQ ; m_rsDataSet.m_strFilter = m_rsDataSet.m_strFilter + "'"; mAll = TRUE; } if (!m_strBookNameQ.IsEmpty()) { if (mAll) { } else { } } m_rsDataSet.Requery(); DisplayRecord(); SetButtonState(); m_rsDataSet.m_strFilter = "BOOK_NAME='" + 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 + "'"; BOOK_NAME='"; m_strBookNameQ; m_strBookNameQ; m_rsDataSet.m_strFilter = m_rsDataSet.m_strFilter + "'";
10
3图书资料中的修改函数 ○
void CBookDlg::OnEdit() {
}
4图书资料中的删除函数 ○
void CBookDlg::OnDelete() {
}
5图书资料中的增加函数 ○
void CBookDlg::OnNew() {
// TODO: Add your control notification handler code here m_strBookID = ""; m_strBookName = ""; m_strAuthor = ""; m_strPress = ""; m_strFlag = "Y"; UpdateData(FALSE); m_bEdit = TRUE; m_bAdd = TRUE; SetButtonState(); SetTextState(); // TODO: Add your control notification handler code here m_rsDataSet.Delete(); DisplayRecord(); SetButtonState(); // TODO: Add your control notification handler code here m_bEdit = TRUE; SetButtonState(); SetTextState(); CWnd *pWnd; pWnd = GetDlgItem(IDC_BOOKNAME); pWnd->SetFocus();
11
} CWnd *pWnd; pWnd = GetDlgItem(IDC_BOOKID); pWnd->SetFocus();
6图书资料中的保存函数 ○
void CBookDlg::OnSave() //保存书籍 {
// TODO: Add your control notification handler code here UpdateData(TRUE); if (m_strBookID.IsEmpty() || m_strBookName.IsEmpty()) { } if (m_bAdd) { } else { } m_rsDataSet.m_AUTHOR = m_strAuthor; m_rsDataSet.m_BOOK_NAME = m_strBookName; m_rsDataSet.m_BOOK_ID = m_strBookID; m_rsDataSet.m_PRESS = m_strPress; m_rsDataSet.m_FLAG_BORROW = m_strFlag; m_rsDataSet.m_PRESS_DATE=m_strPressDate; m_rsDataSet.Update(); m_rsDataSet.Requery(); m_bAdd = FALSE; m_bEdit = FALSE; DisplayRecord(); SetButtonState(); m_rsDataSet.Edit(); m_rsDataSet.AddNew(); AfxMessageBox("请输入相应数据!"); return;
12
SetTextState();
}
图书资料界面如下图所示:
读者资料界面如下图:
读者资料中的函数与图书资料中的函数基本一致。 7借书函数 ○
void CBorrowDlg::OnConfirm()
{
13
// TODO: Add your control notification handler code here
BOOL m_bCanBorrow;
BOOL m_bCanLendOut;
m_bCanBorrow = FALSE;
m_bCanLendOut = FALSE;
CString mSqlStr;
UpdateData(TRUE);
if (!m_rsReaderDataSet.Open(AFX_DB_USE_DEFAULT_TYPE))
{
AfxMessageBox("数据表打开错误!");
return;
}
m_rsReaderDataSet.m_strFilter = "READER_ID='" + m_strReaderID; m_rsReaderDataSet.m_strFilter = m_rsReaderDataSet.m_strFilter "'";
m_rsReaderDataSet.Requery();
if (!m_rsReaderDataSet.IsEOF())
{
if (m_rsReaderDataSet.m_FLAG_BORROW == "Y")
{
mSqlStr = "SELECT * FROM BORROW WHERE READER_ID= '" m_strReaderID;
mSqlStr = mSqlStr + "'";
if (!m_rsDataSet.Open(AFX_DB_USE_DEFAULT_TYPE,mSqlStr))
{
m_rsReaderDataSet.Close();
AfxMessageBox("数据表打开错误!");
return;
}
m_bCanBorrow = TRUE;
m_rsDataSet.Close();
}
}
m_rsReaderDataSet.Close();
if (!m_bCanBorrow)
14
+ +
{ } mSqlStr = "SELECT * FROM BOOK WHERE BOOK_ID='" + m_strBookID; mSqlStr = mSqlStr + "'"; if(!m_rsBookDataSet.Open(AFX_DB_USE_DEFAULT_TYPE, mSqlStr)) { } if (!m_rsBookDataSet.IsEOF()) { } else { } m_rsBookDataSet.Close(); CString m_strUserID; m_strUserID = theApp.m_strUserName ; COleDateTime m_CurrentTime=COleDateTime::GetCurrentTime(); CString strTime; AfxMessageBox("无此书!"); m_rsBookDataSet.Close(); return; if (m_rsBookDataSet.m_FLAG_BORROW == "Y") { } else { } AfxMessageBox("此书不外借! "); m_rsBookDataSet.Close(); return; m_bCanLendOut = TRUE; AfxMessageBox("数据表打开错误!"); return ; AfxMessageBox("读者不能借书!"); return; 15
} int y=m_CurrentTime.GetYear(); int m=m_CurrentTime.GetMonth(); int d=m_CurrentTime.GetDay(); strTime.Format("%d-%d-%d",y,m,d); mSqlStr = "INSERT INTO BORROW (READER_ID, BOOK_ID,BORROW_DATE, mSqlStr = mSqlStr + m_strReaderID; mSqlStr = mSqlStr + "','"; mSqlStr = mSqlStr + m_strBookID; mSqlStr = mSqlStr + "','"; mSqlStr = mSqlStr + strTime; mSqlStr = mSqlStr +"','"; mSqlStr = mSqlStr + m_strUserID; mSqlStr = mSqlStr + "')"; CDatabase mDB; if (!mDB.Open(_T("Library"))) { } try { } catch(CDBException e) { } mDB.Close(); AfxMessageBox("操作成功!"); AfxMessageBox("执行错!"); return; mDB.ExecuteSQL(mSqlStr); AfxMessageBox("无法打开数据库!"); return; B_CLERK_ID) VALUES('";
void CBorrowDlg::OnCancel() {
// TODO: Add your control notification handler code here 16
} CDialog::OnCancel();
借书界面
8还书函数 ○
void CReturnDlg::OnConfirm() {
int rs; CWnd *pWnd; CString m_strtmp; rs=QryBorrow(); if(rs==1) {
m_strtmp.Format("超期%d天,确认还书?",m_Days); if(::MessageBox(this->m_hWnd,m_strtmp,"提示",MB_YESNO)==IDYES) { } else { } } return; Insert_History(); Delete_Borrow(); SetTxtNull(); 17
}
} else if(rs==2) { if(::MessageBox(this->m_hWnd,"{ } else { } return; Insert_History(); Delete_Borrow(); SetTxtNull(); 确认还书?","提示",MB_YESNO)==IDYES) else if(rs==0) { if (m_Book_ID == "") return; ::MessageBox(this->m_hWnd,"该书号信息不存在!","警告",MB_OK); } pWnd=GetDlgItem(IDC_BOOK_ID); pWnd->SetFocus();
还书界面
18
8退出函数 ○
void CLibraryDlg::OnButtonGoodbye()
{
// TODO: Add your control notification handler code here
}
退出界面 int nResponse=MessageBox("真得要离开吗?","退出提示",MB_YESNO); if(nResponse==IDYES) { } OnOK();
3.课程设计总结和体会
在此次图书管理课程设计过程中,有很多东西值得我们思考并总结。
设计过程大体可分为以下几个步骤:
(1)思考总体设计方案:总体结构和模块外部设计,功能分配。思考要实现整个程序大体需要的几个模块和其中用到的Visual C++语言基本操作符、语句等。
(2)画出总体设计方案流程图:用流程图的形式展现你的基本编程思想。
(3)流程图具体化:即将流程图中的几大模块的具体实现思考清楚,可以用流程图的形式展现.并想好实现的关键代码。
19
(4)编辑程序代码:这是一个至关重要复杂而且需要反复修改的环节,在此环节中你将发现总体设计和模块思想会存在很多问题,需不断改进.如何实现各函数功能,达到预期效果也将是一项繁复的工作。
(5)代码的调试:在Visual C++6.0环境下输入代码并进行调试和正确运行。在调试过程中会遇到很多需要精化的地方,需要十足的耐心与细心,不断改进完善程序。
通过对图书馆系统利用,我们对数据库和MFC编程有了更深刻的认识,深刻认识到需求分析的重要性,更加了解了一个系统各部门的工作流程细节。对概念设计的步骤掌握的更加清晰,促进了对分析过程中的原则要求及所得到的数据结果的原因认识。逻辑设计阶段中,由于整个系统数据复杂性和实际应用的交叉性,发现我们在理论和实际的操作中无论是关系模型设计还是vc++中功能的实现都有很多不足。
总之,通过此次课程设计,让我更加明白了主动学习是最好的方法。主动动手去做,广泛查阅资料,多次进行修改和完善,只有这样,才能有好的设计呈现出来。
20
高级语言程序设计课程设计报告设计题目高校图书馆信息管理系统姓专班指导老师20xx年01月01日摘要绪论问题定义或系统分析总体设计与…
面向对象课程设计图书馆管理系统院系别信息工程系班级学号姓名指导教师时间课程设计任务书题目图书管理系统C语言课程设计系部信息工程系专…
经济管理学院本科课程设计论文数据库开发与应用课程设计学号姓名班级专业系别指导教师20xx年12月24日吉林目录第一章引言3第一节课…
管理信息系统实习报告专业班级学生姓名指导教师时间成绩评语王桃群20xx32320xx313一课程设计题目图书管理系统二系统需求1系…
课程设计实验报告课程名称数据库课程设计系院数学与计算机学院班级20xx级计算机科学与技术指导教师欧方平摘要随着人类社会的发展人类对…
课程设计报告基于JSP的图书管理系统专业班级计科姓名XXX学号123456指导老师XXXX20xx年1月1日第一章绪论11课题的研…
滨江学院Java程序设计实习课程设计题目图书管理系统学生姓名张立檑学号20xx2346035院系滨江学院专业年级11网络工程1指导…
课程设计实验报告课程名称数据库课程设计系院数学与计算机学院班级20xx级计算机科学与技术指导教师欧方平摘要随着人类社会的发展人类对…
开题报告课题名称图书管理系统一立项依据1课题的目的及意义本次毕业设计所从事的课题题目是基于VB的图书管理系统的设计与实现课题的目的…
第三章图书管理系统的设计与实现3.1系统的需求分析图书登记管理系统作为一个应用软件将为学校的老师和学生提供一个对学校图书馆深入了解…
数据结构课程实验实验报告实验四图书管理系统专业班级姓名学号完成日期目录一题目描述3二需求分析3三概要设计4四详细设计10五调试分析…