图书库存管理系统.docx
《图书库存管理系统.docx》由会员分享,可在线阅读,更多相关《图书库存管理系统.docx(26页珍藏版)》请在冰豆网上搜索。
图书库存管理系统
一、需求与功能分析2
二、系统总体框架2
三、逻辑设计3
四、类的设计与分析7
五、数据库表结构设计9
六、特色算法分析9
七、功能测试11
八、存在的不足与对策13
九、使用说明13
十、程序源代码14
一.需求与功能分析
本系统为图书库存管理系统。
其主要功能为让用户实现对图书库存的管理,包括查询
图书信息,添加新的图书,更新图书信息,删除旧的图书。
具体功能如下:
查询图书信息:
使用此功能,用户可以查看到所查图书的全部信息,包括图书编号,
图书名字,图书作者姓名,库存量。
添加新的图书:
使用此功能,用户可以向库存中插入新的图书,即向数据库中插入新的元组,包括输入图书编号,图书名字,图书作者姓名,库存量。
更新图书信息:
使用此功能,用户可以对图书的信息进行更新,即更新图书名字,图书作者姓名,库存量。
删除旧的图书:
使用此功能,用户可以删除旧的图书,该图书所在的元组将整个都被删除。
二、系统总体框架
图书库存管理系统
查询图书信息
添加新的图书
更新图书信息
删除旧的图书
三.逻辑设计
1.登陆系统
类图:
在该模块中,定义一个Ontijiao()函数来实现登陆进入图书库存管理系统。
其中登陆账号:
admin,登陆密码:
admin。
具体代码如下:
voidClogin:
:
Ontijiao()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringid,no;
CStringstr="admin";
m_id.GetWindowText(id);
m_no.GetWindowText(no);
if(id.Compare(str)==0&&no.Compare(str)==0)
{
Cchaxundilog=newCchaxun;
dilog.DoModal();
}
}
2.查询图书信息
类图:
在该模块中,定义一个Onselect()函数来实现对数据库中元组的查询,即查询图书信息.具体的代码如下:
voidCchaxun:
:
Onselect()
{
if(sql.m_db.IsOpen())
{
sql.m_db.Close();
}
CStringstrnum,vSQL,vSQL1,strname,strat,strrem,j,k;
inti;
j=m_result.GetItemCount();
if(j>=1)
{
m_result.DeleteAllItems();
}
m_num1.GetWindowText(strnum);
vSQL="DRIVER={SQLServer};SERVER=(local);Database=StuCou;UID=sa;PWD=";
k=m_result.GetHeaderCtrl()->GetItemCount();
if(k<4)
{
m_result.InsertColumn(0,"图书编号");m_result.InsertColumn(1,"图书名称");m_result.InsertColumn(2,"作者");m_result.InsertColumn(3,"库存量");
m_result.SetColumnWidth(0,100);m_result.SetColumnWidth(1,120);m_result.SetColumnWidth(2,110);m_result.SetColumnWidth(3,120);
}
sql.m_db.OpenEx(vSQL,0);
sql.rs.m_pDatabase=&sql.m_db;
vSQL1="select*frombookwherenum='"+strnum+"'";
sql.rs.Open(CRecordset:
:
snapshot,vSQL1,CRecordset:
:
readOnly);
while(!
sql.rs.IsEOF())
{
i=0;
sql.rs.GetFieldValue("num",strnum);
m_result.InsertItem(i,strnum);
sql.rs.GetFieldValue("bname",strname);
m_result.SetItemText(i,1,strname);
sql.rs.GetFieldValue("author",strat);
m_result.SetItemText(i,2,strat);
sql.rs.GetFieldValue("remain",strrem);
m_result.SetItemText(i,3,strrem);
sql.rs.MoveNext();
i++;
}
sql.rs.Close();
}
3.添加新的图书
类图:
在该模块中,定义一个Onadd()函数来实现向数据库中添加新的元组,即添加新的图书信息,包括图书编号,图书名字,作者名字,以及库存量.具体代码如下:
voidCchaxun:
:
Onadd()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(true);
CStringstrnum2,strname2,strat2,strrem2,vSQL2;
CStringadd,check;
m_num2.GetWindowText(strnum2);
m_name2.GetWindowText(strname2);
m_author2.GetWindowText(strat2);
m_remain2.GetWindowText(strrem2);
if(sql2.m_db.IsOpen())
{
sql2.m_db.Close();
}
vSQL2="DRIVER={SQLServer};SERVER=(local);Database=StuCou;UID=sa;PWD=";
sql2.m_db.OpenEx(vSQL2,0);
sql2.rs.m_pDatabase=&sql2.m_db;
sql2.rs.Close();
add="insertintobookvalues('"+strnum2+"','"+strname2+"','"+strat2+"','"+strrem2+"')";
sql2.m_db.ExecuteSQL(add);
if(sql2.m_db.CanUpdate())
{
AfxMessageBox("添加成功");
}
}
4.更新图书信息
类图:
在该模块中,定义了一个Onupdate()函数,用来实现对数据库中元组的更新,即对图书信息的更新,包括图书名字,作者名字,以及库存量的更新.具体代码如下:
voidCchaxun:
:
Onupdate()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringstrnum3,strname3,strat3,strrem3,vSQL3;
CStringupdate;
m_num3.GetWindowText(strnum3);
m_name3.GetWindowText(strname3);
m_author3.GetWindowText(strat3);
m_remain3.GetWindowText(strrem3);
if(sql3.m_db.IsOpen())
{
sql3.m_db.Close();
}
vSQL3="DRIVER={SQLServer};SERVER=(local);Database=StuCou;UID=sa;PWD=";
sql3.m_db.OpenEx(vSQL3,0);
update="updatebooksetbname='"+strname3+"',author='"+strat3+"',remain='"+strrem3+"'wherenum='"+strnum3+"'";
sql3.m_db.ExecuteSQL(update);
if(sql3.m_db.CanUpdate())
{
AfxMessageBox("更新成功");
}
}
5.删除旧的图书
类图:
在该模块中,定义了一个Ondelete()函数,用来实现对数据库中元组的删除,即删除某一图书,使用该功能时将删除该图书所在的整个元组.具体代码如下:
voidCchaxun:
:
Ondelete()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringstrnum4,vSQL4;
CStringdel;
m_num4.GetWindowText(strnum4);
if(sql4.m_db.IsOpen())
{
sql4.m_db.Close();
return;
}
vSQL4="DRIVER={SQLServer};SERVER=(local);Database=StuCou;UID=sa;PWD=";
sql4.m_db.OpenEx(vSQL4,0);
sql4.rs.m_pDatabase=&sql4.m_db;
del="deletefrombookwherenum='"+strnum4+"'";
sql4.m_db.ExecuteSQL(del);
if(sql4.m_db.CanUpdate())
{
AfxMessageBox("删除成功");
return;
}
}
四.类的设计与分析
在本系统中,一共有7个类:
CBOOKApp类、CBOOKDoc类、CBOOKView类、Cchaxun类、SQL类、Clogin类、CMainFrame类。
其中最核心类为Cchaxun类、SQL类、Clogin类.类Cchaxun用来实现对图书库存的管理,包括:
查询图书信息,添加新的图书,更新图书信息,删除旧的图书。
类SQL用来实现连接到数据库。
类Clogin用来实现用户登陆的功能。
1.Cchaxun类:
classCchaxun:
publicCDialog
{
public:
Cchaxun(CWnd*pParent=NULL);
voidOnselect();
voidOnadd();
voidOnupdate();
voidOndelete()
protected:
DECLARE_MESSAGE_MAP();
};
名称
属性
说明
Cchaxun()
成员方法
构造函数
Onselect()
成员方法
查询图书信息
Onadd()
成员方法
添加新的图书
Onupdate()
成员方法
更新图书信息
Ondelete
成员方法
删除图书
DECLARE_MESSAGE_MAP()
成员方法
VC已定义好的函数
2.SQL类:
classSQL{
public:
CDatabasem_db;
CRecordsetrs;
};
名称
属性
说明
m_db
数据成员
用来实现连接到数据库
rs
数据成员
用来实现连接到数据库
2.Clogin类:
classClogin:
publicCDialog
{
public:
Clogin(CWnd*pParent=NULL);
voidOntijiao();
protected:
DECLARE_MESSAGE_MAP()
};
名称
属性
说明
Clogin()
成员方法
构造函数
Ontijiao()
成员方法
用来实现用户登陆
DECLARE_MESSAGE_MAP()
成员方法
VC已定义好的函数
五.数据库表结构设计
book表结构如下:
book(numint,bnamechar(100),authorchar(50),remainint)
其中num:
图书编号,bname:
书名,author:
图书作者姓名,remian:
库存量
六.特色算法分析
Cchaxun类中的Onselect()方法
功能:
根据用户输入的图书编号,向数据库中搜索相应的元组,并显示出结果,即输出所查询的图书的图书信息。
算法思路:
首先先判断数据源是否开启,如果已经开启先关了它,这里用到IsOpen()函数和Close()函数。
然后用GetWindowText()函数获取用户输入的图书编号。
接下来连接数据库,用SQL语句来搜索找到相应元组,并将结果显示出来。
用到GetFieldValue()函数和SetItemText()函数等。
流程图:
代码:
voidCchaxun:
:
Onselect()
{
if(sql.m_db.IsOpen())
{
sql.m_db.Close();
}
CStringstrnum,vSQL,vSQL1,strname,strat,strrem,j,k;
inti;
j=m_result.GetItemCount();
if(j>=1)
{
m_result.DeleteAllItems();
}
m_num1.GetWindowText(strnum);
vSQL="DRIVER={SQLServer};SERVER=(local);Database=StuCou;UID=sa;PWD=";k=m_result.GetHeaderCtrl()->GetItemCount();
if(k<4)
{
m_result.InsertColumn(0,"图书编号");m_result.InsertColumn(1,"图书名称");m_result.InsertColumn(2,"作者");m_result.InsertColumn(3,"库存量");
m_result.SetColumnWidth(0,100);m_result.SetColumnWidth(1,120);m_result.SetColumnWidth(2,110);m_result.SetColumnWidth(3,120);
}
sql.m_db.OpenEx(vSQL,0);
sql.rs.m_pDatabase=&sql.m_db;
vSQL1="select*frombookwherenum='"+strnum+"'";
sql.rs.Open(CRecordset:
:
snapshot,vSQL1,CRecordset:
:
readOnly);
while(!
sql.rs.IsEOF())
{
i=0;
sql.rs.GetFieldValue("num",strnum);
m_result.InsertItem(i,strnum);
sql.rs.GetFieldValue("bname",strname);
m_result.SetItemText(i,1,strname);
sql.rs.GetFieldValue("author",strat);
m_result.SetItemText(i,2,strat);
sql.rs.GetFieldValue("remain",strrem);
m_result.SetItemText(i,3,strrem);
sql.rs.MoveNext();
i++;
}
sql.rs.Close();
}
七.功能测试
图7-1登陆界面测试图
图7-2查询图书信息测试图
图7-3添加图书测试图
图7-4更新图书测试图
图7-5删除图书测试图
八.存在的不足与对策
由于设计者水平有限及时间等方面的原因,该系统的功能比较简单,查错能力也不强,对于一些不正确的输入可能会造成一些难以预料的结果,因此,请不要故意输入错误信息。
这些不足请老师多多谅解。
今后设计者会更多的学习编程技巧,不断的提高程序设计水平。
1,在登陆本系统时,由于能力有限,暂时设计不出让用户自己注册账号的功能,所以用户要登陆时统一采用同一账号密码,其中账号:
admin,密码:
admin。
2,在添加新的图书时,由于系统存在漏洞,所以添加的新图书是可以出现相同编号的,为了避免混乱,请在输入时输入不同的编号,不同的图书信息。
3,在更新,删除图书时,如果输入不存在的图书编号,它还是会提示“更新成功”和“删除成功”,而实际上该操作是无效的,所以请输入确实在数据库中存在的图书编号。
九.使用说明
1.登陆账号:
admin,密码:
admin。
2.查询图书请输入确实存在的正确的图书编号,然后点击“查询”即可。
3.添加图书请添加不同于已经存在的图书的新图书信息。
4.更新图书则输入您要更新的图书编号和新的信息,然后点击“提交”即可。
5.删除图书则输入您要删除的图书编号,然后点击“删除”即可。
十.程序源代码
//login.h
#if!
defined(AFX_LOGIN_H__E4090B58_E195_42FA_9ADC_C346B139F6F0__INCLUDED_)
#defineAFX_LOGIN_H__E4090B58_E195_42FA_9ADC_C346B139F6F0__INCLUDED_
#if_MSC_VER>1000
#pragmaonce
#endif
classClogin:
publicCDialog
{
public:
Clogin(CWnd*pParent=NULL);protected:
DECLARE_MESSAGE_MAP()
};
#endif
//login.cpp
#include"stdafx.h"
#include"BOOK.h"
#include"login.h"
#include"chaxun.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
Clogin:
:
Clogin(CWnd*pParent/*=NULL*/)
:
CDialog(Clogin:
:
IDD,pParent)
{
}
voidClogin:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(Clogin,CDialog)
END_MESSAGE_MAP()
voidClogin:
:
Ontijiao()
{
CStringid,no;
CStringstr="admin";
m_id.GetWindowText(id);
m_no.GetWindowText(no);
if(id.Compare(str)==0&&no.Compare(str)==0)
{
Cchaxundilog=newCchaxun;
dilog.DoModal();
}
}
//lianjie.h
#include"afxdb.h"
classSQL{
public:
CDatabasem_db;
CRecordsetrs;
};
//chaxun.h
#if!
defined(AFX_CHAXUN_H__261FE414_5B2D_4D97_BB7D_00E6992FD7A0__INCLUDED_)
#defineAFX_CHAXUN_H__261FE414_5B2D_4D97_BB7D_00E6992FD7A0__INCLUDED_
#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
classCchaxun:
publicCDialog
{
public:
Cchaxun(CWnd*pParent=NULL);enum{IDD=IDD_manage};
CEditm_num4;
CEditm_remain3;
CEditm_author3;
CEditm_name3;
CEditm_num3;
CEditm_remain2;
CEditm_author2;
CEditm_name2;
CEditm_num2;
CListCtrlm_result;
CEditm_num1;
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);protected:
afx_msgvoidOnselect();
afx_msgvoidOnadd();
afx_msgvoidOnupdate();
afx_msgvoidOndelete();
DECLARE_MESSAGE_MAP()
};
//chaxun.ccp
#include"stdafx.h"
#include"BOOK.h"
#include"chaxun.h"
#include"lianjie.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
SQLsql,sql2,sql3,sql4;
Cchaxun:
:
Cchaxun(CWnd*pParent/*=NULL*/)
:
CDialog(Cchaxun:
:
IDD,pParent)
{
}
voidCchaxun:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
DDX_Control(pDX,IDC_EDIT10,m_num4);
DDX_Control(pDX,IDC_EDIT9,m_remain3);
DDX_Control(pDX,IDC_EDIT8,m_author3);
DDX_Control(pDX,IDC_EDIT7,m_name3);