1、闽江学院 课程设计说明书 题目: 图书馆管理系统 院 系: 计算机科学系 专业班级: 07计本2班 学 号: 120071101215 学生姓名: 刘思旭 指导教师: 谢储晖 2009年 1月7日 目录 1 绪论 1 1.1 开发背景 1 1.2 开发工具的选用及介绍 1 1.2.1 ASP简介 1 1.2.2 Dreamweaver简介 2 1.2.3 Microsoft SQL Server 2000简介 2 2 需求分析 3 2.1 系统
2、分析 3 2.2 系统目标 3 2.4系统模块流程图 5 2.4.1 系统登陆流程图 5 3 数据库设计 6 3.1概念结构设计 6 3.2 逻辑结构设计 7 3.3创建表的脚本文件 8 4 详细设计 10 4.1 用户登陆页面 10 4.2图书入库页面 11 4.3入库退货 14 4.4销售系统 15 4.5条件查询库存量 16 4.6销售统计 17 4.7帮助 19 5课程设计小结 22 6参考文献 22 1 绪论 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,计算机被广泛应用于B/S系统环境。计算机的好处在于它能够进行信息管理。使用计算机
3、进行信息控制,不仅提高了工作效率,而且大大的提高了安全性。 对于复杂的信息管理,计算机能够充分发挥它的优越性。计算机与信息管理系统的开发密切相关,系统的开发是系统管理的前提。本系统就是为了管理好图书信息而设计的。 1.1 开发背景 图书销售管理包括的图书的入库,出库,销售,包含很多的信息数据的管理,现今,有很多的图书管理销售系统都是初步开始使用,甚至尚未使用计算机进行信息管理。以前对信息管理的主要方式是基于文本、表格等纸介质的手工处理,对于图书销售,入库情况的统计和核实等往往采用对借书卡的人工检查进行。数据信息处理工作量大,容易出错;由于数据繁多,容易丢失,且不易查找。总的来说,缺乏系
4、统,规范的信息管理手段。尽管有的图书馆有计算机,但是尚未用于信息管理,没有发挥它的效力,资源闲置比较突出,这就是图书管理系统开发所要解决的问题。 基于这此问题,有必要建立一个图书销售管理系统,使图书管理工作规范化,系统化,程序化,避免图书管理的随意性,提高信息处理的速度和准确性,能够及时、准确、有效的进行查询和修改图书情况等图书管理操作。 1.2 开发工具的选用及介绍 1.2.1 ASP简介 Active Server Pages:是一套微软开发的服务器端脚本环境,ASP内含于IIS之中 , 通过ASP我们可以结合 HTML 网页、ASP 指令和 ActiveX元件建立动态、交互且高效
5、的WEB服务器应用程序。有了ASP你就不必担心客户的浏览器是否能运行你所编写的代码,因为所有的程序都将在服务器端执行,包括所有嵌在普通 HTML中的脚本程序。当程序执行完毕后,服务器仅将执行的结果返回给客户浏览器,这样也就减轻了客户端浏览器的负担,大大提高了交互的速度。 1.2.2 Dreamweaver简介 Dreamweaver是Macromedia公司最新推出的主页编辑工具。这是一个所见即所得主页编辑器,并带有站点管理功能,让你方便地设计和管理多个站点。而它最棒的地方就是支持最新的DHTML和CSS标准, 你可以用它设计出生动的DHTML动画、多层次的页面(layer)以及CSS样
6、式表。 1.2.3 Microsoft SQL Server 2000简介 SQL是英文(Structured Query Language)的缩写,意思为结构化查询语言。SQL语言的主要功能就是同各种数据库建立联系,进行沟通。SQL被作为关系型数据库管理系统的标准语言。SQL语句可以用来执行各种各样的操作,例如更新数据库中的数据,从数据库中提取数据等。目前,绝大多数流行的关系型数据库管理系统,如Oracle, Sybase, Microsoft SQL Server, Access等都采用了SQL语言标准。 SQL语言有以下几个优点: 1 非过程化语言 SQL是一个非过程
7、化的语言,因为它一次处理一个记录,对数据提供自动导航。SQL允许用户在高层的数据结构上工作,而不对单个记录进行操作,可操作记录集,所有SQL 语句接受集合作为输入,返回集合作为输出。SQL的集合特性允许一条SQL语句的结果作为另一条SQL语句的输入。 SQL不要求用户指定对数据的存放方法, 这种特性使用户更易集中精力于要得到的结果;所有SQL语句使用查询优化器,它是RDBMS的一部分,由它决定对指定数据存取的最快速度的手段,查询优化器知道存在什么索引,在哪儿使用索引合适,而用户则从不需要知道表是否有索引、有什么类型的索引。 2. 统一的语言 SQL可用于所有用户的DB活动模型,包括系
8、统管理员、数据库管理员、 应用程序员、决策支持系统人员及许多其它类型的终端用户。基本的SQL 命令只需很少时间就能学会,最高级的命令在几天内便可掌握。 3. 所有关系数据库的公共语言 由于所有主要的关系数据库管理系统都支持SQL语言,用户可将使用SQL的技能从一个RDBMS(关系数据库管理系统)转到另一个,所有用SQL编写的程序都是可以移植的。 2 需求分析 2.1 系统分析 一般的图书销售管理系统包括系统管理,进货管理,供应商信息管理,退货管理,销售管理,销售统计,库存管理等功能。以下介绍一下销售管理系统的一些必备功能,每个功能具有若干相关的子模块构成。 1基本信息管
9、理 主要是操作管理员信息管理,设置管理员密码登陆,以保障安全性。 2进货管理 包括供应商报价,根据报价选择供应商,更新进货记录于供应记录,显示进货记录等若干模块。 报价以外部输入的方式进行,一次可输入多种图书的多个供应商的报价,同种图书选择报价最低者进货,并将进货信息记录到进货记录中,进货表设置表示序列号,记录每次的进货情况,被选择的供应商信息将被记录到供应记录中,管理员可以查看所有的进货记录。 3退货管理 退货管理包括办理退货业务,以及显示历史退货记录,退货业务办理,一次办理一种图书的退货业务,业务办理完成及更新退货表,表中设置标识序列号,记录每次的退货业务记录。 4
10、销售统计 销售统计包括销售记录,日销售记录,以及销售量排行榜,销售记录记录每次图书销售的情况,设置标识序列号,日销售量对每天售出的图书情况进行统计,统计每种书的销售情况,销售排行榜按图书的销售量排行,查看时可取排名前若干名进行显示。 5销售管理 在销售模块首先是可以查看现有的库存图书情况,然后可根据需求选择图书添加到订单中,也可从订单中去掉不想购买的图书,确认购买时可以进行结算,如计算价格,更新库存表,销售表,销售量表等 2.2 系统目标 主要包括进货、退货、销售、统计功能。 进货:根据某种书籍的库存量及销售情况确定进货数量,根据供应商报价选择供应商。输出一份进货单并自动
11、修改库存量,把本次进货的信息添加到进货库中。 退货:顾客把已买的书籍退还给书店。输出一份退货单并自动修改库存量,把本次退货的信息添加到退货库中。 统计:根据销售情况输出统计报表。一般内容为每月的销售总额、销售量及排行榜。 销售:输入顾客要买书籍的信息,自动显示此书的库存量。如果可以销售,打印销售单并修改库存,同时把此次销售的有关信息添加到日销售库中。 查询:可以根据一个单体来查询整个数据库中符合要求的条款。 2.3系统模块流程图 2.3.1 系统登陆流程图 3 数据库设计 3.1概念结构设计 图书馆管理系统,总共含有三个实体:管理员,图书,读者,之间的关系
12、如下图的E-R图如下: 管理员 ID 密码 管理 图书 分类 作者 ISBN 进货时间 进货量 成本 书名 入库 销售 统计 销售排行 日销售量 销售记录 现有库存 记录供应商 入库信息登记 mmm n 序列号 分类查询 入库登记 3.2 逻辑结构设计 3.3创建表的脚本文件 关于创建数据库部分,可以通过SQL Server企业管理器来创建,也可以通过查询分析器来创建 4 详细设计 4.1 用户登陆页面 该页面用于用户登陆,包括游客,用户和管理员。成功登陆则取得用户的session用于以后的操作权
13、限认定。程序执行时首先判断用户类型,如果是游客则对session赋值为游客类型,然后直接进入主页;如果不是游客则执行查询语句,看数据库中是否存在这样的用户名和密码,根据选择用户类型的不同在不同的表中进行操作,成功则进入主页,否则提示输入错误。 截图如下: 图4.1.1 用户登陆 主界面 代码:BEGIN_MESSAGE_MAP(CLogin, CDialog) //{{AFX_MSG_MAP(CLogin) ON_BN_CLICKED(IDC_OK, OnCollate) ON_BN_CLICKED(IDC_QUIT, OnQuit) //}}AFX_MSG_M
14、AP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CLogin message handlers /* 登陆确认 */ void CLogin::OnCollate() { // TODO: Add your control notification handler code here UpdateData(TRUE); if(m_InputName.IsEmpty() || m_InputCode.IsEmpt
15、y()) { MessageBox("用户名或密码不能为空...","提示!"); return; } //搜索匹配的帐号... CString sql; sql.Format("select * from bm_OperaInfor where username='%s' and password='%s'", m_InputName,m_InputCode); m_pRs->raw_Close(); m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,adLockOpt
16、imistic,adCmdText); //匹配成功之后打开主界面... if(m_pRs->RecordCount > 0) { loginflag = TRUE; m_user = m_InputName; EndDialog(0); } else { MessageBox("用户名或密码错误...","错误!"); m_InputName.Empty(); m_InputCode.Empty(); UpdateData(FALSE); return; } } 4.2图书入库页面 图4.2.1
17、图书入库
代码:void CStockManage::OnSave()
{ if(!HasSupp)
{ MessageBox("请先生成供货信息","错误!");
return;
}
CString time,sql; GetDate(time); //获取当前时间并进行格式化
for(int i=0;i 18、time),supply[i].ISBN,supply[i].bookname,supply[i].author,
supply[i].bookconcern,supply[i].cost,supply[i].supplycount);
m_pRs->raw_Close();
m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);
//保存到进货表bm_BookStock
sql.Format("insert into bm_Book 19、Stock values (%d,%d,'%s','%s','%s','%s',%f,%d)",
str_to_int(time),supply[i].ISBN,supply[i].bookname,supply[i].author,
supply[i].bookconcern,"",supply[i].cost,supply[i].supplycount);
m_pRs->raw_Close();
m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adC 20、mdText);
//更新库存
sql.Format("select * from bm_BookStorage where ISBN='%d'",supply[i].ISBN);
m_pRs->raw_Close();
m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);
if(m_pRs->RecordCount > 0) //此书库中已有
{ int newcount = supply[i].supplycount + 21、str_to_int((TCHAR*)
(_bstr_t)m_pRs->GetFields()->GetItem((long)6)->Value);
sql.Format("update bm_BookStorage set storecount='%d',cost='%f' where ISBN='%d'",
newcount,supply[i].cost,supply[i].ISBN);
}
else //库中没有这本书,就插入信息
sql.Format("insert into bm_BookStorage values (%d,'%s', 22、'%s','%s','%s',%f,%d,%f)",
supply[i].ISBN,supply[i].bookname,supply[i].author,supply[i].bookconcern,
"",supply[i].cost*1.12,supply[i].supplycount,supply[i].cost);
m_pRs->raw_Close();
m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);
}
Me 23、ssageBox("完成...","提示!");
stockdlg1->m_StockList.DeleteAllItems();
stockdlg1->ShowStock(); //在第一个对话框中回显信息
}
2.//确认退货,并更新相关信息
void CRefundDlg1::OnRefundEnter()
{ UpdateData(TRUE);
if(m_ISBN.IsEmpty()||m_Count.IsEmpty())
{ MessageBox("ISBN或数量不能留空","提示!");
return;
}
CString sql;
24、sql.Format("select * from bm_BookSold where ISBN='%d'",str_to_int(m_ISBN));
m_pRs->raw_Close();
m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);
if(m_pRs->RecordCount < 1) //先在销售表中找,有的话再删减
{ MessageBox("本店未售出此书","错误!");
return;
} 25、 //寻找存储表中对应项
sql.Format("select * from bm_BookStorage where ISBN='%d'",str_to_int(m_ISBN));
m_pRs->raw_Close();
m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);
int tmp = str_to_int(m_Count) + str_to_int((TCHAR*)(_bstr_t)m_pRs->GetFields()->GetIte 26、m((long)6)->Value);
CString time; GetDate(time); //获取当前时间...
sql.Format("insert into bm_BookRefund values(%d,%d,'%s','%s','%s','%s',%d,%d)", //更新退货记录
str_to_int(time),
str_to_int(m_ISBN),
(TCHAR*)(_bstr_t)m_pRs->GetFields()->GetItem((long)1)->Value,
(TCHAR*)(_bstr_t)m_pRs->GetFi 27、elds()->GetItem((long)2)->Value,
(TCHAR*)(_bstr_t)m_pRs->GetFields()->GetItem((long)3)->Value,
(TCHAR*)(_bstr_t)m_pRs->GetFields()->GetItem((long)4)->Value,
str_to_int((TCHAR*)(_bstr_t)m_pRs->GetFields()->GetItem((long)5)->Value),
str_to_int(m_Count));
m_pRs->raw_Close();
m_pRs->Open 28、variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);
sql.Format("update bm_BookStorage set storecount='%d' where ISBN='%d'",tmp,str_to_int(m_ISBN));
m_pRs->raw_Close(); //更新库存
m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adC 29、mdText); MessageBox("完成退货","提示!");
OnRefundClear();
p_refund.refunddlg2->ShowRefund(); //重画报表
}
3.//在控件中显示销售信息
void CStasticDlg1::ShowVend()
{ m_pRs->raw_Close();
CString sql; sql.Format("select * from bm_BookSold");
m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,ad 30、LockOptimistic,adCmdText);
int index = 0;
m_VendList.DeleteAllItems();
while (!m_pRs->adoEOF)
{ index = m_VendList.InsertItem(m_VendList.GetItemCount(),
(TCHAR*)(_bstr_t)m_pRs->GetFields()->GetItem((long)0)->Value);
for(int col = 1;col <9;col++) m_VendList.SetItemText(index,col, 31、TCHAR*)(_bstr_t)m_pRs->GetFields()->GetItem((long)col)->Value);
m_pRs->MoveNext();
}
}
4.3入库退货
图4.3.1 入库退货
代码:
4.4销售系统
图4.4.1销售系统
代码:void CVendManage::OnPuche()
{ if(m_PucheList.GetItemCount() < 1)
{ MessageBox("请先选择书籍","提示!");
return;
}
CString sql; float cost = 0;
32、for(int i=0;i 33、CHAR*)(_bstr_t)m_pRs->GetFields()->GetItem((long)6)->Value)-
str_to_int(m_PucheList.GetItemText(i,6));
sql.Format("update bm_BookStorage set storecount='%d' where ISBN='%s'",
newcount,m_PucheList.GetItemText(i,0));
m_pRs->raw_Close(); m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr 34、),adOpenKeyset,adLockOptimistic,adCmdText);
CString time; GetDate(time); //更新销售表
sql.Format("insert into bm_BookSold values (%d,%d,'%s','%s','%s','%s',%f,%d)",
str_to_int(time),str_to_int(m_PucheList.GetItemText(i,0)),
m_PucheList.GetItemText(i,1),
m_PucheList.GetItemText(i,2),
35、
m_PucheList.GetItemText(i,3),
m_PucheList.GetItemText(i,4),
str_to_float(m_PucheList.GetItemText(i,5)),
str_to_int(m_PucheList.GetItemText(i,6)));
m_pRs->raw_Close(); m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);
sql.Format("sel 36、ect * from bm_BookSummry where ISBN='%s'",m_PucheList.GetItemText(i,0));
m_pRs->raw_Close(); //更新销售榜 m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText); if(m_pRs->RecordCount > 0) //已有出售记录,需更新销售量和销售额
{ int newcount = str_to_int((TCHAR*)(_bstr_t)m 37、pRs->GetFields()->GetItem((long)6)->Value)
+str_to_int(m_PucheList.GetItemText(i,6));
float newsummry = (float)(str_to_float((TCHAR*)(_bstr_t)m_pRs->GetFields()->GetItem
((long)5)->Value)*newcount);
sql.Format("update bm_BookSummry set soldcount='%d',soldsummry='%f' w 38、here ISBN='%s'",
newcount,newsummry,m_PucheList.GetItemText(i,0));
cost += (float)(str_to_float((TCHAR*)(_bstr_t)m_pRs->GetFields()->GetItem((long)5)->Value)
*str_to_int(m_PucheList.GetItemText(i,6)));
}
else //之前未曾卖过该书,则新插入一条记录
{float x = (float)(str_to_float(m_PucheList.Get 39、ItemText(i,5))*str_to_int(m_PucheList.GetItemText(i,6)));
cost += x;
sql.Format("insert into bm_BookSummry values (%d,'%s','%s','%s','%s',%f,%d,%f)",
str_to_int(m_PucheList.GetItemText(i,0)),
m_PucheList.GetItemText(i,1),
m_PucheList.GetItemText(i,2),
m_PucheList.GetItemT 40、ext(i,3),
m_PucheList.GetItemText(i,4),
str_to_float(m_PucheList.GetItemText(i,5)),
str_to_int(m_PucheList.GetItemText(i,6)),x);
}
m_pRs->raw_Close(); m_pRs->Open((_variant_t)sql,m_pCon.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);
}
m_StorageList.DeleteAllIte 41、ms();
ShowStorage(); //重新显示相关信息
sql.Format("%f",cost); sql.TrimRight();
MessageBox("交易成功...\n应付款为:"+sql+"元\n","提示!");
4.5条件查询库存量
图4.5.1条件查询库存量
代码:
void CVendManage::OnButtonFind()
{
UpdateData();
CString strSql;
strSql="select * from bm_BookStorage where bookname like '%"+m 42、strBookname+"%' and author like '%"+m_strAuthor
+"%' and bookconcern like '%"+m_strC+"%'";
// strSql="select * from bm_BookStorage where bookname='%"+m_strBookname+"%'";
m_pRs->raw_Close();
m_pRs->Open((_variant_t)strSql,m_pCon.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);
m 43、StorageList.DeleteAllItems();
int i=0;
while(!m_pRs->adoEOF)
{
m_StorageList.InsertItem(i,(TCHAR*)(_bstr_t)m_pRs->GetCollect("ISBN"));
m_StorageList.SetItemText(i,1,(TCHAR*)(_bstr_t)m_pRs->GetCollect("bookname"));
m_StorageList.SetItemText(i,2,(TCHAR*)(_bstr_t)m_pRs->GetCollect("author" 44、));
m_StorageList.SetItemText(i,3,(TCHAR*)(_bstr_t)m_pRs->GetCollect("bookconcern"));
i++;
m_pRs->MoveNext();
}
}
4.6销售统计
图4.6.1销售统计
代码如下:BOOL CStasticManage::OnInitDialog()
{
CDialog::OnInitDialog();
stasticdlg1 = new CStasticDlg1();
stasticdlg2 = new CStasticDlg2();
stast 45、icdlg3 = new CStasticDlg3();
//将对话框贴在标签上...
stasticdlg1->Create(IDD_STASTIC_DIALOG1,&m_StasticTab);
stasticdlg2->Create(IDD_STASTIC_DIALOG2,&m_StasticTab);
stasticdlg3->Create(IDD_STASTIC_DIALOG3,&m_StasticTab);
m_StasticTab.InsertItem(0,"销售记录",0);
m_StasticTab.InsertItem(1,"日销售量",1);
46、
m_StasticTab.InsertItem(2,"销售排行榜",2);
m_StasticTab.SetMinTabWidth(100);
m_StasticTab.SetCurSel(PID);
DoTab(PID);
return TRUE;
}
void CStasticManage::OnSelchangeStasticTab(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
int select = m_St 47、asticTab.GetCurSel();
if(select >= 0)
DoTab(select);
*pResult = 0;
}
void CStasticManage::SetDlgState(CWnd *pWnd, BOOL bShow)
{
pWnd->EnableWindow(bShow);
if(bShow)
{
pWnd->ShowWindow(SW_SHOW);
pWnd->CenterWindow();
}
else
pWnd->ShowWindow(SW_HIDE);
}
void CStastic 48、Manage::DoTab(int nPid)
{
if(nPid > 2) nPid = 2;
if(nPid < 0) nPid = 0;
BOOL iPid[3];
iPid[0]=iPid[1]=iPid[2]=FALSE;
iPid[nPid]=TRUE;
SetDlgState(stasticdlg1,iPid[0]);
SetDlgState(stasticdlg2,iPid[1]);
SetDlgState(stasticdlg3,iPid[2]);
}
void CStasticManage::OnExitStastic() 49、
{
// TODO: Add your command handler code here
EndDialog(0);
}
4.7帮助
5课程设计小结
通过本次课程设计,我深深体会到需求分析与系统分析规划的重要性,团队的合作以及知识面的拓宽,主动的学习实践,都是不可或缺的,总体来说,这次课程设计让我收获很大。最后要感谢曾在课程设计过程中给于我帮助的老师和同学。
6参考文献
[1] 王珊 萨师煊. 数据库系统概论(第四版).北京:高等教育出版社
[2] 求是科技. ASP数据库开发技术与工程实践[M] .北京:人民邮电出版社
[3] 刘意成.SQL实战演练[M] .北京:西安电子科技大学出版社
[4] 周绪.SQL Server 2000中文版入门与提高[M] .北京:清华大学出版社
[5] 李存斌.数据库应用技术[M] .北京:中国水利水电出版社
[6] 罗运模. SQL Server 2000数据仓库应用与开发[M] .北京:人民邮电出版社
21 / 22






