1、课程设计报告课程名称:面向对象程序设计C+设计题目: 图书管理系统 专业: 计算机科学与技术 姓名: 学号: 指导教师: 李晓虹 2015年12月30日目录 一、系统背景31.1 摘要31.2 背景和目的31.3 关键字3二、操作分析32.1 关于使用者4三、需求分析63.1 产品透视图63.2 产品功能63.3 流程7四、界面设计84.1 软件图标84.2 主界面94.3 借阅用户界面94.4 图书管理员界面104.5 借还登记人员界面10五、系统具体功能的实现115.1 数据源配置115.2 导入ADO库文件155.3 连接数据库165.4 主界面和注册功能实现185.5 登录功能实现24
2、5.6 借阅用户功能实现功能实现275.7 图书管理员功能实现375.8 登记人员功能实现44六、结束语446.1 心得体会44一、系统背景【摘要】随着信息技术的发展,对于数据库的应用日益深入到人们的生活,本组的数据库项目是关于建立图书管理系统。对图书管理系统功能的扩展将友好化所有操作界面,使使用者更加轻松掌握借阅、管理、查询图书等操作。 【背景及目的】身处于信息高速发展的时代,信息资源当之无愧是世界最宝贵的资源之一。与此同时,信息作为一种虚拟资源,数量繁多且冗杂,资源类型繁多。热爱书物者学生,教育者,繁忙的上班族居多,图书管理系统将庞大的资源进行系统化的分类,动态地操作信息资源的流动。图书管
3、理系统使人们的生活更加的便捷,高效。 【关键字】使用者;需求分析;设计界面;C+;MFC;SQL server;二、操作分析 2.1、关于使用者 将图书管理系统分为了四类,分别为:一般用户、借阅读者、借阅还书办理人员、图书管理人员。一般用户指不需经过注册和登录但可以使用图书管理系统给该身份提供的基本查询和浏览功能的用户,借阅读者即是需要注册和登录后才能进行图书借阅等功能的用户,借阅还书办理人员即是为借阅者提供服务的人员,包括借阅用户借阅和归还书刊登记的操作及相关信息查询。图书管理员是对图书基本信息、借阅用户信息管理,分类等操作的人员。因此界面的操作上应该包含这四类的使用者。图书管理系统的打开界
4、面(如图2-1),点击“用户登录”。进入登录界面图2-1用户登录界面(如图2-2) 图2-2用户可以看到关于登录人员的分类,随即进行接下来的操作。对于没有借阅过的新用户,点击借阅用户注册按钮,弹出注册界面: 经过调试,该界面是用户友好界面,方便使用者的操作和注册。三、关于需求的分析3.1系统功能已注册用户登录功能;新用户注册功能;图书基本信息检索功能;已注册用户自身基本信息和借阅信息查询及书刊续借功能;图书管理员查询与修改借阅用户基本信息和借阅信息功能,图书信息更新功能。3.2系统E-R图(如图3-2) 图3-23.3功能流程前面我们组确定了对图书管理系统的使用对象的定位,需求分析是根据适用对
5、象而定的,要求操作界面友好,操作方便,便于使用者进行登录,注册,图书查询,图书借阅的操作一体化,流程清楚明了,便于理解与使用。下图1是关于一般用户,借阅者,图书借阅管理员及图书管理员操作流程。3.4功能流程图(如图3-4) 图3-4上图是图书管理系统的建模过程,下面是该系统的使用者对向对系统的使用需求:1) 图书基本情况的录入、修改、删除等基本操作。2) 实现借书功能。3) 实现还书功能。4) 能方便的对图书进行查询。5) 续借。6) 借还情况登记。对实验的要求:图书编号可参考国家统一的图书编码方法,再完成基本功能模块的情况下,尽量使系统能具有通用性。从上述陈诉中可以发现以下元素:使用对象:1
6、. 一般用户2. 借阅者3. 图书管理员4. 借还登记人员 基本用例:1.注册:新用户账号注册2.登录:老用户的系统登录3.图书查询:对需要搜索图书的查询4.图书借阅:已注册用户对图书的相关借阅5.图书数据更新:图书管理员对新图书数据的添加6.图书归还:已借阅图书的归还四、设计界面软件的界面是用户与计算机进行信息数据交流的媒介,一个软件设计界面的人性化,友好与否将决定该软件的受欢迎度。所以在软件的界面设计方面做了很多次实验。软件图标(如图4-1): 图4-1软件登录主界面设计(如图4-2) 图4-2借阅用户界面(如图4-3) 图4-3图书管理员界面(如图4-4) 图4-4借阅登记人员界面(如图
7、4-5) 图4-5软件产品的美观与否,与本组设计的图书管理系统受欢迎程度息息相关!五、模块实现C+和数据库的操作本系统采用VC+MFC创建应用程序框架,使用ADO实现应用程序对数据库的连接和操作,SQL server 2005作为数据库驱动器。其中ADO对数据库的连接和操作步骤如下:5.1在本机上配置ODBC数据源由于ADO是微软推出的数据库接口新标准,到现在为止已经成为最通用最流行和操作性很好的一个数据库接口标准。首先仍然需要在服务器上配置数据源,本系统以本机作为服务器配置数据源。操作如下:在 开始控制面板管理工具ODBC数据源,之后操作(如图5-1) 图5-1 点击添加,运行(如图5-2)
8、 图5-2选择需要添加的数据源驱动程序,本系统为SQL server。选择好驱动器后点击完成(如图5-3) 图5-3自己任意填写一个数据源名称,选择好服务器,该服务器名与登录SQL server时使用的服务器名一致即可。然后点击下一步(如图5-4) 图5-4根据提示选好登录方式和信息以后点击下一步(如图5-5) 图5-5选择需要连接的数据库点击下一步(如图5-6) 图5-6点击完成后如下图,点击测试连接,若成功(如图5-7) 图5-7以上边配置好了数据源。下面进行数据源与程序的连接1、利用windows系统自带的ADO库文件实现应用程序与数据源的连接通常首先可在C:Program FilesC
9、ommon FilesSystemado目录下找到msado15.dll(不同安装目录可能路径不一样,操作系统版本的不同可能相应的msado15.dll文件版本不同),找到后复制粘贴到自建的应用程序目录下,和debug路径相同。本系统是基于对话框的程序,因此可在FileView的头文件里找到stdfax.h文件,将ADO用如下代码导入到程序(键入到stdfax.h里):#if defined(ADO2_OLD)#pragma message( Using ADO2 TLB ) #import no_namespace rename(EOF, adoEOF) #else #pragma mess
10、age( Using Latest ADO ) #import msado15.dll no_namespace rename(EOF, adoEOF) #endif(如图5-7) 图5-71、 ADO库导入后便可利用ADO库里提供的接口开始进行链接和操作数据库,具体代码如下:_ConnectionPtr PConnection;/定义指向数据库的指针(对象)_RecordsetPtr PRecordset;/定义指向结果集的指针(对象):CoInitialize(NULL);/COM接口初始化tryUpdateData();/初始化和刷新程序窗口数据 PConnection.CreateIn
11、stance(ADODB.Connection);PConnection-Mode=adModeReadWrite;/数据库打开模式设置PConnection-ConnectionString = _T(Data Source=KAY-PC;Provider=SQLOLEDB.1;Initial Catalog=指定数据库名);/设置连接字符串 HRESULT hr1=PConnection-Open(_T(),_T(sa),_T(qwe123),adAsyncConnect); /PConnection指向数据库对象AfxMessageBox(请稍后!);if(SUCCEEDED(hr1)/
12、测试连接是否成功AfxMessageBox(连接数据库成功!);return;catch(_com_error &e)/捕捉错误信息AfxMessageBox(e.ErrorMessage();return;操作结果集的代码如下:try PRecordset.CreateInstance(ADODB.Recordset); CString result;result.Format(SQL语句);/将SQL语句用一个字符串表示 /打开记录集,PRecordset指针指向结果集 PRecordset-Open(_bstr_t)result,PConnection.GetInterfacePtr()
13、,adOpenKeyset,adLockOptimistic,adCmdText);/打开结果集if(PRecordset-BOF)&(PRecordset-adoEOF)/表中无记录AfxMessageBox(无查询结果!);if(PRecordset!=NULL)PRecordset-Close();/关闭结果集 PConnection-Close();/关闭数据库连接return;else/对结果集的操作if(PRecordset!=NULL)PRecordset-Close();/关闭结果集 PConnection-Close();/关闭数据库连接return; catch(_com_
14、error &e)AfxMessageBox(e.ErrorMessage();return;5.2数据库设计5.2.1读者信息表(如表5.1) 表5.15.2.2管理员登录表(如表5.2) 表5.25.2.3借还人员登记表(如表5.3) 表5.35.2.4借阅信息表(如表5.4) 表5.45.2.5图书信息表(如表5.5) 表5.5六、详细设计6.1主界面(如图6-1) 图6-1主要代码如下:书刊检索:void CBMSDlg:Ongosearch() / TODO: Add your control notification handler code here/删除列定义for(int i
15、=0;iMode=adModeReadWrite;/连接数据库PConnection-ConnectionString = _T(Data Source=KAY-PC;Provider=SQLOLEDB.1;Initial Catalog=BMSDATABASE);/PConnection指向数据库对象 HRESULT hr1=PConnection-Open(_T(),_T(sa),_T(qwe123),adAsyncConnect);AfxMessageBox(正在查询!);if(SUCCEEDED(hr1)/AfxMessageBox(连接数据库成功!);/return;catch(_c
16、om_error &e)AfxMessageBox(e.ErrorMessage();return;try PRecordset.CreateInstance(ADODB.Recordset); _bstr_t bstrSQL;CString result;result.Format(select * from books_basic_information where book_no=%s,m_search);/从编辑框获取值m_name及对应的sql语句 /打开记录集,PRecordset指针指向结果集 PRecordset-Open(_bstr_t)result,PConnection.
17、GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);if(PRecordset-BOF)&(PRecordset-adoEOF)/表中无记录AfxMessageBox(无检索结果!);if(PRecordset!=NULL)PRecordset-Close(); PConnection-Close();return;elsewhile(!PRecordset-adoEOF)m_datalist.InsertItem(0,);m_datalist.SetItemText(0,0,(char*)(_bstr_t)PRecordset
18、-GetCollect(book_no);m_datalist.SetItemText(0,1,(char*)(_bstr_t)PRecordset-GetCollect(book_name);m_datalist.SetItemText(0,2,(char*)(_bstr_t)PRecordset-GetCollect(writer);m_datalist.SetItemText(0,3,(char*)(_bstr_t)PRecordset-GetCollect(ISBN);m_datalist.SetItemText(0,4,(char*)(_bstr_t)PRecordset-GetCo
19、llect(pressdate);m_datalist.SetItemText(0,5,(char*)(_bstr_t)PRecordset-GetCollect(sum_num);m_datalist.SetItemText(0,6,(char*)(_bstr_t)PRecordset-GetCollect(remain);PRecordset-MoveNext();if(PRecordset!=NULL)PRecordset-Close(); PConnection-Close();return; catch(_com_error &e)AfxMessageBox(e.ErrorMessa
20、ge();return;注册:void CBMSDlg:Oncheckin() /界面跳转函数/ TODO: Add your control notification handler code hereReadercheckin *pDlg=new Readercheckin; pDlg-Create(IDD_readercheckin,this); pDlg-ShowWindow(SW_SHOW);/将注册信息保存到数据库void Readercheckin:OnOK() / TODO: Add extra validation here/CDialog:OnOK();try:CoInit
21、ialize(NULL);/接口初始化UpdateData();/数据更新if(m_name.GetLength()=0|m_password.GetLength()=0)AfxMessageBox(用户名或密码不能为空!);return;_bstr_t bstrSQL;CString result;_ConnectionPtr PConnection;_RecordsetPtr PRecordset;PConnection.CreateInstance(_uuidof(Connection);/创建实例PRecordset.CreateInstance(_uuidof(Recordset);
22、 /:CoInitialize(NULL);/接口初始化PConnection-Mode=adModeUnknown; /连接数据库PConnection-ConnectionString = _T(Data Source=KAY-PC;Provider=SQLOLEDB.1;Initial Catalog=BMSDATABASE);/PConnection指向数据库对象 PConnection-Open(_T(),_T(sa),_T(qwe123),adAsyncConnect);AfxMessageBox(注册成功!);/打开记录集,PRecordset指针指向结果集 /HRESULT h
23、r=PRecordset-Open(bstrSQL,PConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); /从编辑框获取值m_name及对应的sql语句result.Format(insert into user_account(Username,Password) values(%s,%s),m_name,m_password);/执行sql语句HRESULT hr=PConnection-Execute(_bstr_t)result,NULL,adCmdText);if(SUCCEEDED(hr)/
24、AfxMessageBox(注册成功!);if(PConnection-State)/如果连接数据库有效 PConnection-Close();/关闭数据库 PConnection = NULL;/指针值为空:CoUninitialize();DestroyWindow();return;catch(_com_error &e)AfxMessageBox(e.ErrorMessage();:CoUninitialize();return;登录界面(如图6-2) 图6-2 实现代码:void Readerlogin:OnOK() /登录函数/ TODO: Add extra validatio
25、n here/CDialog:OnOK(); :CoInitialize(NULL);/接口初始化_ConnectionPtr PConnection;_RecordsetPtr PRecordset;tryUpdateData(); if(m_sno.GetLength()=0|m_password.GetLength()=0)AfxMessageBox(用户名或密码不能为空!);ShowWindow(SW_HIDE); return; PConnection.CreateInstance(ADODB.Connection);PConnection-Mode=adModeReadWrite;
26、/连接数据库PConnection-ConnectionString = _T(Data Source=KAY-PC;Provider=SQLOLEDB.1;Initial Catalog=BMSDATABASE);/PConnection指向数据库对象 HRESULT hr1=PConnection-Open(_T(),_T(sa),_T(qwe123),adAsyncConnect);AfxMessageBox(正在验证身份信息!);/关键作用catch(_com_error &e)AfxMessageBox(e.ErrorMessage();:CoUninitialize();/关闭re
27、turn; try PRecordset.CreateInstance(ADODB.Recordset); _bstr_t bstrSQL;CString result;result.Format(select * from user_account where Username=%s and Password=%s,m_sno,m_password);/从编辑框获取值m_name及对应的sql语句 /打开记录集,PRecordset指针指向结果集 PRecordset-Open(_bstr_t(result),PConnection.GetInterfacePtr(),adOpenKeyse
28、t,adLockOptimistic,adCmdText); if(PRecordset-BOF)&(PRecordset-adoEOF)/表中无记录AfxMessageBox(用户名或密码错误或该用户不存在!);:CoUninitialize();/关闭return;elseif(PConnection-State)/如果连接数据库有效 PConnection-Close();/关闭数据库 PConnection = NULL;/指针值为空:CoUninitialize();/关闭/DestroyWindow();ShowWindow(SW_HIDE);Readermain *pDlg=ne
29、w Readermain;/建立非模态对话框 pDlg-Create(IDD_readermain,this); pDlg-ShowWindow(SW_SHOW);return; catch(_com_error &e) AfxMessageBox(e.ErrorMessage();:CoUninitialize();/关闭return; 借阅用户界面(如图6-3) 图6-3实现代码:void Readermain:Onbooksearch() /查询书刊信息/ TODO: Add your control notification handler code here/建显示表/CListCt
30、rl:DeleteColumn();for(int i=0;iMode=adModeReadWrite;/连接数据库PConnection-ConnectionString = _T(Data Source=KAY-PC;Provider=SQLOLEDB.1;Initial Catalog=BMSDATABASE);/PConnection指向数据库对象 HRESULT hr1=PConnection-Open(_T(),_T(sa),_T(qwe123),adAsyncConnect);AfxMessageBox(正在查询!);if(SUCCEEDED(hr1)/AfxMessageBox
31、(连接数据库成功!);/return;catch(_com_error &e)AfxMessageBox(e.ErrorMessage();return;try PRecordset.CreateInstance(ADODB.Recordset); _bstr_t bstrSQL;CString result;result.Format(select * from books_basic_information where book_no=%s,m_booksearch);/从编辑框获取值m_name及对应的sql语句 /打开记录集,PRecordset指针指向结果集 PRecordset-O
32、pen(_bstr_t)result,PConnection.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);if(PRecordset-BOF)&(PRecordset-adoEOF)/表中无记录AfxMessageBox(无检索结果!);if(PRecordset!=NULL)PRecordset-Close(); PConnection-Close();return;elsewhile(!PRecordset-adoEOF)m_list.InsertItem(0,);m_list.SetItemText(0,0,(ch
33、ar*)(_bstr_t)PRecordset-GetCollect(book_no);m_list.SetItemText(0,1,(char*)(_bstr_t)PRecordset-GetCollect(book_name);m_list.SetItemText(0,2,(char*)(_bstr_t)PRecordset-GetCollect(writer);m_list.SetItemText(0,3,(char*)(_bstr_t)PRecordset-GetCollect(ISBN);m_list.SetItemText(0,4,(char*)(_bstr_t)PRecordset-GetCollect(pressdate);m_list.SetItemText(0,5,(char*)(_bstr_t)PRecordset-GetCollect(sum_num);m_list.SetItemText(0,6,(char*)(_bstr_t)PRecordset-GetCollect(remain);PRecordset-MoveNext();if(PRecordset!=NULL)PRecor