《windows课程设计 图书管理系统.doc》由会员分享,可在线阅读,更多相关《windows课程设计 图书管理系统.doc(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、中南民族大学计算机科学学院Windows系统编程课程设计报告题 目:图书管理系统 书库系统设计 专 业 08自动化 学 生 姓 名 何龙 班 级 学 号 指 导 老 师 郑波尽 完 成 日 期 图书管理系统 书库管理系统一、课题背景:随着社会信息量的与日俱增,作为信息存储的主要媒体之一图书,数量、规模比以往任何时候都大的多,不论个人还是图书管理部门都需要使用方便而有效的方式来管理自己的书籍。在计算机日益普及的今天,对个人而言若采用一套行之有效的图书管理系统来管理自己的书籍,会方便许多。对图书管理部门而言,以前单一的手工检索已不能满足人们的要求,为了便于图书资料的管理需要有效的图书管理软件。图书
2、管理系统软件是一套功能比较完善的数据管理软件,具有数据操作方便高效迅速等优点。该软件采用数据库软件开发工具进行开发,具有很好的可移植性,可在应用范围较广WINDOWS系列等操作系统上使用。二、课题目的:1. 进一步掌握利用Visual Studio进行程序设计的能力2. 基本掌握面向对象程序设计的基本思路和方法3. 加深对数据库的掌握和运用4. 掌握用VC+开发应用程序的的一般步骤和方法5. 进一步加强C+的编程能力和对程序结构的理解6. 学会调试一个较长程序的基本方法三、课题要求:根据所学知识,编写指定题目的程序,并规范地完成课程设计报告。通过课程设计,加深对Windows程序设计课程所学知
3、识的理解,学会编制结构清晰、风格良好、数据结构适当的Windows平台应用程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力。具体要求如下:1 了解Windows编程的基础知识,掌握MFC应用程序的基本知识;基本掌握面向对象程序设计的基本思路和方法;掌握用VC+开发应用程序的一般步骤和方法;系统以Windows标准菜单界面方式工作,运行界面友好,演示程序以用户和计算机的对话方式进行。2 采用界面选择与编辑框两种输入方式,输出结果直接显示在售票对话框中。输入的数据必须符合程序所规定的合法输入方式,对不合法的信息输入将提示无法处理。3 输入输出的要求 采用界面选择与编辑框两种输入方式,输
4、出结果直接显示在售票对话框中。输入的数据必须符合程序所规定的合法输入方式,对不合法的信息输入将提示无法处理。4 使用界面编程、网络、数据库、文件系统、线程和进程、异常处理等知识。特别是数据库的应用,用来存储数据和提供数据。对于网络主要进行网络通信,连接客户端和服务器端。四、开发工具介绍 1.总体介绍:Visual Studio 是一套完整的开发工具集,用于生成 ASP.NET Web 应用程序、XML Web Services、桌面应用程序和移动应用程序。Visual Basic、Visual C+、Visual C# 和 Visual J# 全都使用相同的集成开发环境 (IDE),利用此 I
5、DE 可以共享工具且有助于创建混合语言解决方案。另外,这些语言利用了 .NET Framework 的功能,通过此框架可使用简化 ASP Web 应用程序和 XML Web Services 开发的关键技术。2.功能介绍:创建满足关键性要求的多层次的智能客户端、Web、移动或基于Microsoft Office的应用程序。使用Visual Studio 2010, 专业开发人员能够: 使用改进后的可视化设计工具、编程语言和代码编辑器,享受高效率的开发环境。 在统一的开发环境中,开发并调试多层次的服务器应用程序。使用集成的可视化数据库设计和报告工具,创建SQL Server 2005解决方案。使
6、用Visual Studio SDK创建可以扩展Visual Studio IDE的工具。Microsoft为单独工作或在小型团队中的专业开发人员提供了两种选择,Visual Studio 2005 Professional Edition和用于Microsoft Office系统的Visual Studio 2005工具。每种版本都在标准版的特性上进行了扩展,包括用于远程服务程序开发和调试、SQL Server2005开发的工具,以及完整的、没有限制的开发环境。每种产品都可以单独购买或打包定购。专业开发人员喜欢自由的使用.NET Framework 2.0,它是一种稳健的、功能齐备的开发环境
7、,支持创建扩展Visual Studio集成开发环境的工具。3.主要部分运行库实际上在组件的运行时和开发时操作中都起到很大的作用,尽管名称中没有体现这个意思。在组件运行时,运行库除了负责满足此组件在其他组件上可能具有的依赖项外,还负责管理内存分配、启动和停止线程和进程,以及强制执行安全策略。在开发时,运行库的作用稍有变化;由于做了大量的自动处理工作(如内存管理),运行库使开发人员的操作非常简单,尤其是与今天的 COM 相比。特别是反射等功能显著减少了开发人员为将业务逻辑转变为可重用组件而必须编写的代码量。该框架为开发人员提供了统一的、面向对象的、分层的和可扩展的类库集 (API)。目前,C+
8、开发人员使用 Microsoft 基础类,而 Java 开发人员使用 Windows 基础类。该框架统一了这些完全不同的模型,还为 Visual Basic 和 JScript 程序员提供了对类库的访问。通过创建跨所有编程语言的公共 API 集,公共语言运行库使得跨语言继承、错误处理和调试成为可能。从 JScript 到 C+ 的所有编程语言具有对框架的相似访问,开发人员可以自由选择它们要使用的语言。ASP.NET 建立在 .NET Framework 的编程类的基础上,为 Web 应用程序模型提供了一组可简化 Web 应用程序生成的控件和基础结构。ASP.NET 包括可用于封装通用 HTML
9、 用户界面元素(如文本框、按钮和列表框)的一组控件。但这些控件在 Web 服务器上运行,并以 HTML 的形式将其用户界面呈现在浏览器中。在服务器上,这些控件公布面向对象的编程模型,该模型为 Web 开发人员提供面向对象编程的丰富功能。ASP.NET 还提供基础结构服务,如状态管理和进程回收,从而可以进一步减少开发人员必须编写的代码数量,并提高应用程序的可靠性。另外,ASP.NET 使用这些同样的概念使开发人员能够以服务的形式交付软件。使用 XML Web Services 功能,ASP.NET 开发人员可以编写他们的业务逻辑,并使用 ASP.NET 基础结构通过 SOAP 交付该服务。五、设
10、计思路整体思路分析: 1. 整个程序设计成以下几个大的模块:1系统管理,下属可以实现又分为:用户管理、注销/重新登录、退出系统三个功能。2.基础数据设置,下属可以实现:罚款设置、图书类别设置、读者类别设置三个功能。3.借阅管理,下属分为:借书、还书、借书查询、还书查询四个模块。4.书库管理,下属分为:新书入库、图书查询和图书挂失三个模块。5.读者管理,下属分为:读者登记、读者信息查询、读者注销三个功能。6.数据库管理,下属分为:数据库备份、数据库恢复两个模块书库管理模块在整体程程序中格的位置:用户管理数据库采用的是SQL Server数据库,建立用户权限表以及设备信息表,通过MFC ODBC方
11、式访问,使用类CRecordset的函数MoveFirst()、MoveLast()、MoveNext()、MovePrev()、IsBOF()、IsEOF()对设备信息表实现遍历操作,使用类CRecordset的函数AddNew增加设备或者函数Delete删除信息。并根据用户登录情况确定用户是否可以修改设备信息,以此实现后台数据与前台界面操作的一致。在帐户被通过后,用户可以使用它来登录系统,登录时系统自动查找用户表,判断帐户是否存在,存在则提示用户登录成功,并显示可以的操作;否则,提示不存在该用户,返回登录界面,让用户重新输入信息。另外,经过这个验证的过程,提醒用户牢记帐号和密码,防止他人盗
12、窃个人信息,从而提高用户信息的安全性。进行登录操作时,访问到了用户表(User)。在用户未成功登录时,个人资料功能是被禁止的。只有成功登录以后,用户才有资格修改自己的资料,包括基本信息的修改,帐户(昵称或密码)的更新,帐号是不可以更改的,一旦服务器分配以后,始终与帐户绑定。方便管理员管理帐户,也使得系统具有一定的稳定性。该模块访问到了用户表和个人信息表。 备注:当在修改密码时,系统会确认旧密码,如果输入的旧密码错误,系统会弹出出错信息,否则才允许更新密码。并且,如果修改昵称,系统会把修改后的昵称更新到两个表中,使得数据能够保持同步,方便管理员的管理和维护,提高了系统的可靠性。系统具有数据录入、
13、数据修改、记录查询、报表打印等功能。较全面满足了材料库存管理的各项工作。该系统采用模块化原理编程,做到了模块规模适中,本身相对独立。模块化使程序结构清晰,易于设计、易于理解,提高了系统的可靠性。用户的需求具体体现在各种信息的提供、保存、更新和查询统计,这就要求数据库结构能充分满足各种信息的输出和输入。收集基本数据、数据结构以及数据处理的流程,组成一份详尽的数据字典,为后面的详细设计打下基础。2.书库模块分析:书库管理需要实现三个功能,分别是新书入库、图书挂失和图书查询。模块主体设计如下:六、流程图(或功能模块图)总程序设计框图: 书库管理系统设计框图:七,实验各个模块代码及相关分析说明:书库管
14、理模块在整个程序中的位置1.新书入库模块先使用VS中的MFC控件建立如下框图然后再确定按钮添加以下对应函数#include stdafx.h#include Library.h#include NewBookDlg.h#include BookTypeSet.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CNewBookDlg dialogCNewBookDlg:CNewBookDlg(CWnd* pParent /*=NULL*/): CDialog(CNew
15、BookDlg:IDD, pParent)/AFX_DATA_INIT(CNewBookDlg)m_strBookType = _T();m_strBookCode = _T();m_strBookName = _T();m_strPrice = _T();m_strPress = _T();m_strWriter = _T();m_strBrief = _T();/AFX_DATA_INITvoid CNewBookDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CNewBookD
16、lg)DDX_Control(pDX, IDC_COMBO_BOOKTYPE, m_ctrBookType);DDX_Control(pDX, IDC_LIST1, m_ctrList);DDX_CBString(pDX, IDC_COMBO_BOOKTYPE, m_strBookType);DDX_Text(pDX, IDC_EDIT_BOOK_CODE, m_strBookCode);DDX_Text(pDX, IDC_EDIT_BOOK_NAME, m_strBookName);DDX_Text(pDX, IDC_EDIT_BOOK_PRICE, m_strPrice);DDX_Text
17、(pDX, IDC_EDIT_PRESS, m_strPress);DDX_Text(pDX, IDC_EDIT_WRITER, m_strWriter);DDX_Text(pDX, IDC_EDIT_BRIEF, m_strBrief);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CNewBookDlg, CDialog)/AFX_MSG_MAP(CNewBookDlg)ON_BN_CLICKED(IDC_BUTTON_NEW, OnButtonNew)ON_BN_CLICKED(IDC_BUTTON_ALL, OnButtonAll)ON_BN_CLICKED(IDC_B
18、UTTON_DELETE, OnButtonDelete)ON_NOTIFY(NM_CLICK, IDC_LIST1, OnClickList1)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CNewBookDlg message handlersBOOL CNewBookDlg:OnInitDialog() CDialog:OnInitDialog();/设置列表m_ctrList.InsertColumn(0,图书编号);m_ctrList.InsertColumn(1,图书名称);m_ctrList.InsertColumn(2,图书类别);m_ctrList.Inser
19、tColumn(3,作者);m_ctrList.InsertColumn(4,出版社);m_ctrList.InsertColumn(5,图书价格);m_ctrList.InsertColumn(6,登记日期);m_ctrList.InsertColumn(7,备注说明);m_ctrList.SetColumnWidth(0,60);m_ctrList.SetColumnWidth(1,120);m_ctrList.SetColumnWidth(2,80);m_ctrList.SetColumnWidth(3,80);m_ctrList.SetColumnWidth(4,80);m_ctrLi
20、st.SetColumnWidth(5,80);m_ctrList.SetColumnWidth(6,80);m_ctrList.SetColumnWidth(7,80);m_ctrList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);/初始化图书类型CBookTypeSet recordset ;if(!recordset.Open(AFX_DB_USE_DEFAULT_TYPE,select * from bookType)MessageBox(打开数据库失败!,数据库错误,MB_OK);return FALSE;whil
21、e(!recordset.IsEOF()m_ctrBookType.AddString(recordset.m_type);recordset.MoveNext();recordset.Close();return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSEvoid CNewBookDlg:OnButtonNew() / TODO: Add your control notification handler code h
22、ereUpdateData();if(m_strBookCode.IsEmpty()AfxMessageBox(请输入图书编号!);return;if(m_strBookType.IsEmpty()AfxMessageBox(请输入图书类型!);return;if(m_strBookName.IsEmpty()AfxMessageBox(请输入图书名称!);return;CString strSQL;CTime current=CTime:GetCurrentTime();strSQL.Format(select * from bookInfo where code = %s,m_strBoo
23、kCode);if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)MessageBox(打开数据库失败!,数据库错误,MB_OK);return ;if(m_recordset.GetRecordCount()!=0)m_recordset.Close();AfxMessageBox(该图书编号已经存在,请重新输入!);return;m_recordset.Close();if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE)MessageBox(打开数据库失败!,数据库错误,MB_OK);return ;
24、/添加图书记录m_recordset.AddNew();m_recordset.m_code=m_strBookCode;m_recordset.m_name =m_strBookName;m_recordset.m_type= m_strBookType;m_recordset.m_in_date =current;m_recordset.m_price=m_strPrice ;m_recordset.m_press=m_strPress ;m_recordset.m_writer=m_strWriter ;m_recordset.m_brief=m_strBrief ;m_recordse
25、t.m_isBorrow = FALSE;m_recordset.Update();m_recordset.Close();/更新列表CString strTime;m_ctrList.InsertItem(0,m_strBookCode);m_ctrList.SetItemText(0,1,m_strBookName);m_ctrList.SetItemText(0,2,m_strBookType);m_ctrList.SetItemText(0,3,m_strWriter);m_ctrList.SetItemText(0,4,m_strPress);m_ctrList.SetItemTex
26、t(0,5,m_strPrice);strTime.Format(%d-%d-%d,current.GetYear(),current.GetMonth(),current.GetDay();m_ctrList.SetItemText(0,6,strTime);m_ctrList.SetItemText(0,7,m_strBrief);/更新界面显示m_strBookType = _T();m_strBookCode = _T();m_strBookName = _T();m_strPrice = _T();m_strPress = _T();m_strWriter = _T();m_strB
27、rief = _T();UpdateData(FALSE);void CNewBookDlg:OnButtonAll() / TODO: Add your control notification handler code herem_ctrList.DeleteAllItems();m_ctrList.SetRedraw(FALSE);UpdateData(TRUE);CString strSQL;strSQL.Format( select * from bookInfo );if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)Messag
28、eBox(打开数据库失败!,数据库错误,MB_OK);return ;int i=0;CString strTime;while(!m_recordset.IsEOF()m_ctrList.InsertItem(i,m_recordset.m_code);m_ctrList.SetItemText(i,1,m_recordset.m_name);m_ctrList.SetItemText(i,2,m_recordset.m_type);m_ctrList.SetItemText(i,3,m_recordset.m_writer);m_ctrList.SetItemText(i,4,m_reco
29、rdset.m_press);m_ctrList.SetItemText(i,5,m_recordset.m_price);strTime.Format(%d-%d-%d,m_recordset.m_in_date.GetYear(),m_recordset.m_in_date.GetMonth(),m_recordset.m_in_date.GetDay();m_ctrList.SetItemText(i,6,strTime);m_ctrList.SetItemText(i,7,m_recordset.m_brief);i+;m_recordset.MoveNext();m_recordse
30、t.Close();m_ctrList.SetRedraw(TRUE);void CNewBookDlg:OnButtonDelete() / TODO: Add your control notification handler code hereint i = m_ctrList.GetSelectionMark();if(0i)AfxMessageBox(请选择一条记录进行删除!);return;CString strSQL;strSQL.Format(select * from bookInfo where code = %s ,m_ctrList.GetItemText(i,0);i
31、f(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)AfxMessageBox(打开数据库失败!);return ;m_recordset.Delete();m_recordset.Close();m_ctrList.DeleteItem(i);/更新界面显示m_strBookType = _T();m_strBookCode = _T();m_strBookName = _T();m_strPrice = _T();m_strPress = _T();m_strWriter = _T();m_strBrief = _T();UpdateDat
32、a(FALSE);void CNewBookDlg:OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) / TODO: Add your control notification handler code hereint i = m_ctrList.GetSelectionMark();m_strBookType = m_ctrList.GetItemText(i,2);m_strBookCode = m_ctrList.GetItemText(i,0);m_strBookName = m_ctrList.GetItemText(i,1);m_strPr
33、ice = m_ctrList.GetItemText(i,5);m_strPress = m_ctrList.GetItemText(i,4);m_strWriter = m_ctrList.GetItemText(i,3);m_strBrief = m_ctrList.GetItemText(i,7);UpdateData(FALSE);*pResult = 0;2.图书查询模块对查询按钮添加相应的函数如下:#include stdafx.h#include Library.h#include BorrowSearchDlg.h#ifdef _DEBUG#define new DEBUG_
34、NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CBorrowSearchDlg dialogCBorrowSearchDlg:CBorrowSearchDlg(CWnd* pParent /*=NULL*/): CDialog(CBorrowSearchDlg:IDD, pParent)/AFX_DATA_INIT(CBorrowSearchDlg)m_strBookCode = _T();m_strReaderCode = _T();/AFX_DATA_INITvoid CBorrowSearchDlg:DoDataExc
35、hange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CBorrowSearchDlg)DDX_Control(pDX, IDC_LIST1, m_ctrList);DDX_Text(pDX, IDC_EDIT_BOOKCODE, m_strBookCode);DDX_Text(pDX, IDC_EDIT_READERCODE, m_strReaderCode);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CBorrowSearchDlg, CDialog)/AFX_MSG_MAP(CBorrow
36、SearchDlg)ON_BN_CLICKED(IDC_BUTTON_SEARCH, OnButtonSearch)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CBorrowSearchDlg message handlersBOOL CBorrowSearchDlg:OnInitDialog() CDialog:OnInitDialog();m_ctrList.InsertColumn(0,读者编号);m_ctrList.InsertColumn(1,读者姓名);m_ctrList.InsertColumn(2,图书编号);m_ctrList.InsertColumn(3,
37、图书名称);m_ctrList.InsertColumn(4,图书类别);m_ctrList.InsertColumn(5,图书价格);m_ctrList.InsertColumn(6,借出日期);m_ctrList.InsertColumn(7,归还日期);m_ctrList.InsertColumn(8,操作员);m_ctrList.SetColumnWidth(0,60);m_ctrList.SetColumnWidth(1,60);m_ctrList.SetColumnWidth(2,80);m_ctrList.SetColumnWidth(3,100);m_ctrList.SetCo
38、lumnWidth(4,80);m_ctrList.SetColumnWidth(5,80);m_ctrList.SetColumnWidth(6,80);m_ctrList.SetColumnWidth(7,80);m_ctrList.SetColumnWidth(8,80);m_ctrList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pag
39、es should return FALSEvoid CBorrowSearchDlg:OnButtonSearch() / TODO: Add your control notification handler code hereUpdateData();CString strSQL;if(!m_strReaderCode.IsEmpty()&!m_strBookCode.IsEmpty()strSQL.Format(select * from borrowInfo where reader_code = %s and book_code = %s ,m_strReaderCode,m_st
40、rBookCode);else if(!m_strReaderCode.IsEmpty()strSQL.Format(select * from borrowInfo where reader_code = %s ,m_strReaderCode);else if(!m_strBookCode.IsEmpty()strSQL.Format(select * from borrowInfo where book_code = %s ,m_strBookCode);else strSQL=select * from borrowInfo;m_ctrList.DeleteAllItems();m_c
41、trList.SetRedraw(FALSE);if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)MessageBox(打开数据库失败!,数据库错误,MB_OK);return ;int i=0;CString strTime;while(!m_recordset.IsEOF()m_ctrList.InsertItem(i,m_recordset.m_reader_code);m_ctrList.SetItemText(i,1,m_recordset.m_reader_name);m_ctrList.SetItemText(i,2,m_re
42、cordset.m_book_code);m_ctrList.SetItemText(i,3,m_recordset.m_book_name);m_ctrList.SetItemText(i,4,m_recordset.m_price);m_ctrList.SetItemText(i,5,m_recordset.m_book_type);strTime.Format(%d-%d-%d,m_recordset.m_borrow_date.GetYear(),m_recordset.m_borrow_date.GetMonth(),m_recordset.m_borrow_date.GetDay();m_ctrList.SetItemText(i,6,strTime);strTime.Format(%d-%d-%d,m_recordset.m_return_date.GetYear(),m_recordset.m_return_date.GetMonth(),m_recordset.m_return_date.GetDay();m_ctrList.SetItemText(i,7,strTime);m_ctrList.SetItemText(i,8,m_record