资源描述
**交通大学信息科学与工程学院
《程序设计实训I》综合设计报告
图 书 销 售 系 统
学号:631206050***
姓名:***
专业:计算机科学与技术(软件开发)
班级:软件2班
实验室(中心):专业机房
指导老师:***
完成时间:2013年12月18日
目 录
一、任务书………………………………………………….4
二、需求分析……………………………………………….5
三、系统设计……………………………………………….6
四、编程与实现…………………………………………….14
五、测试内容与结果……………………………………….56
六、存在的问题与不足及对策…………………………….67
七、对这门课的建议……………………………………….68
八、参考文献……………………………………………….68
教师评阅意见:
签名: 年 月 日
成绩:
以下为设计报告正文内容
**交通大学信息科学与工程学院综合设计任务书
课 程
程序设计实训I
班级
软件二班
指导教师
***
题 目
图书销售系统
完成时间
2013年12月18日
主要内容
图书销售系统应主要包括以下一些内容:
1.用户信息管理;
2.图书信息管理;
3.客户信息管理;
4.销售信息管理;
5.统计信息;
设计报告要求
设计报告要求格式规范、内容完整。主要包括:
(1) 需求分析;
(2) 系统设计;
(3) 编程实现:本部分主要写实现的过程或步骤,以及关键代码(必须附上自己添加的源代码并加上注释)
(4) 测试与分析;
(5) 存在的问题与不足及对策;
(6) 对这门课的建议;
(7) 参考文献等
说明:设计报告要求打印上交。
版面要求
1. 题目用黑体三号,段后距18磅(或1行),居中对齐;
2. 标题用黑体四号,段前、段后距6磅(或0.3行);
3. 正文用小四号宋体,行距为1.25倍行距;
4. 标题按“一”、“㈠”、“1”、“⑴”顺序编号。
备注
原则上一人一题,部分题目允许多人一题,分工协作,独立完成。(多人协作完成,要注明分工情况)
每位同学单独演示自己的程序并现场回答提问。
成绩评定详见评分标准说明
二、需求分析
(一) 图书销售管理系统体系结构
图书销售管理系统是该系统软件的重要内容之一,该系统为书店的库存书籍的动态调整提供了决策依据,有利于及时对有大量需求的新书进行订货入库。它的主要功能包括:图书的管理,图书销售管理,图书退货管理和销售统计,退货统计以及进货商信息管理,顾客信息管理,用户信息管理等。
系统管理,帮助等功能。
(二)图书销售系统整体概述
1.图书信息管理
l添加图书信息
l修改图书信息
l查询图书信息
l删除图书信息
2.销售信息管理
l添加销售信息
l修改销售信息
l查询销售信息
l删除销售信息
3.退货信息管理
l添加退货信息
l修改退货信息
l查询退货信息
l删除退货信息
4.统计信息管理
l销售信息统计
l退货信息统计
l图书库存信息统计
5.顾客信息管理
l添加顾客信息
l修改顾客信息
l查询顾客信息
l删除顾客信息
6.供应商信息管理
l添加供应商信息
l修改供应商信息
l查询供应商信息
l删除供应商信息
7.用户信息管理
l添加用户信息
l修改用户密码
l退出系统
8.系统帮助
l图书销售系统简介
三、系统设计
(一)系统结构
1.系统总体结构图书销售系统
用户登录
用户信息管理
供应商信息管理
顾客信息管理
统计信息管理
退货信息管理
销售信息管理
图书信息管理
系统帮助
2.图书信息管理结构图
图书信息管理
查询图书信息
删除图书信息
修改图书信息
添加图书信息
按条件查询图书
查询所有图书
3.销售信息管理结构图
销售信息管理
查询销售信息
删除销售信息
修改销售信息
添加销售信息
4.退货信息管理
退货信息管理
查询退货信息
删除退货信息
修改退货信息
添加退货信息
5.统计信息管理
统计信息管理
退货信息统计
销售信息统计
库存信息统计
6.顾客信息管理
顾客信息管理
查询顾客信息
删除顾客信息
修改顾客信息
添加顾客信息
7.供应商信息管理
供应商信息管理
删除供应商信息
查询供应商信息
添加供应商信息
修改供应商信息
8.用户信息管理
用户信息管理
退出系统
修改用户密码
添加用户信息
(二)数据库设计
1.数据库结构设计
(1)图书信息E-R图
书 名
图书编号
作 者
价 格
图书信息
出版社
数 量
(2)销售信息E-R图
图书编号
书 名
销售代码
销售价格
顾客姓名
销售信息
销售日期
销售数量
销售总额
(3)退货信息E-R图
书 名
图书编号
备 注
退货代码
退货价格
顾客姓名
销售信息
退货日期
退货数量
退货总额
(4)顾客信息E-R图
顾客编号
顾客姓名
身份证号
年 龄
性 别
销售信息
注册日期
联系方式
(5)供应商信息E-R图
公司名称
供应商编号
公司地址
联系人
图书信息
联系方式
备 注
(6)用户信息E-R图
用户密码
用户名
用户信息
2.数据库关系模式
本系统的E-R图可转化为如下关系模式:
图书(图书编号、书名、作者、出版社、价格、数量)
顾客(顾客编号、姓名、性别、年龄、身份证号、联系方式、注册日期)
供应商(供应商编号、公司名称、公司地址、联系人、联系方式、备注信息)
图书销售(销售代码、图书编号、书名、顾客姓名、销售价格、销售数量、销售总额、销售日期)
图书退货(退货代码、图书编号、书名、退货价格、退货数量、销退货总额、退货日期、顾客姓名、备注信息)
用户(账号、密码)
库存(图书编号、书名、数量)
四、编程与实现
(一)创建单文档应用程序 BSMS
1. 用MFC AppWizard 创建一个单文档应用程序 BSMS,在向导步骤中将CBSMSView的基类由CView改为CListView。
2.在CBSMSView::PreCreateWindow函数添加下列代码,用来设置列表视图内嵌列表控件的风格:
BOOL CBSMSView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= LVS_REPORT;//报表风格
return CListView::PreCreateWindow(cs);
}
(二)图书信息管理实现
1.在BSMS中添加图书信息表的类CBookadd。
2.创建图书信息添加对话框。
为对话框类CAddbook添加背景图片,为CAddbook类添加成员函数OnPaint,并添加下列代码:
void CAddbook::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
CDC memdc;
memdc.CreateCompatibleDC(&dc);//创建兼容YDC
CBitmap bkg;
bkg.LoadBitmap(IDB_BITMAP11);//载入位图
BITMAP bkginfo;
bkg.GetBitmap(&bkginfo);//获取位图信息
memdc.SelectObject(&bkg);
RECT rect;
GetWindowRect(&rect);//获取对话框信息
dc.SetStretchBltMode(COLORONCOLOR);
dc.StretchBlt(0,0,rect.right-rect.left,rect.bottom-rect.top,&memdc,0,0,bkginfo.bmWidth,bkginfo.bmHeight,SRCCOPY);
// 不为绘图消息调用CDialogEx::OnPaint()
}
3.创建图书信息修改对话框。
为对话框类CChangebook添加背景图片,为CChangebook类添加成员函数OnPaint,并添加下列代码:
void Changebook::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
CDC memdc;
memdc.CreateCompatibleDC(&dc);//创建兼容YDC
CBitmap bkg;
bkg.LoadBitmap(IDB_BITMAP4);//载入位图
BITMAP bkginfo;
bkg.GetBitmap(&bkginfo);//获取位图信息
memdc.SelectObject(&bkg);
RECT rect;
GetWindowRect(&rect);//获取对话框信息
dc.SetStretchBltMode(COLORONCOLOR);
dc.StretchBlt(0,0,rect.right-rect.left,rect.bottom-rect.top,&memdc,0,0,bkginfo.bmWidth,bkginfo.bmHeight,SRCCOPY);
// 不为绘图消息调用CDialogEx::OnPaint()
}
4.实现图书添加、修改、查询、删除功能
(1)在CBSMSView类添加成员函数DeleteAllColumn(),用来删除列表视图的标题头,以便能在创建标题头显示不同的信息:
void CBSMSView::DeleteAllColumn(void)
{
CListCtrl& m_ListCtrl = GetListCtrl();
int nCount =0;
CHeaderCtrl* pHeaderCtrl = m_ListCtrl.GetHeaderCtrl();
if(pHeaderCtrl!=NULL)
nCount = pHeaderCtrl->GetItemCount();
for(int i=0;i<nCount;i++)
m_ListCtrl.DeleteColumn(0);
}
(2) 在CBSMSView类添加成员函数DispBookInfo,用来显示图书信息。
void CBSMSView::DispBookInfo(CString strFilter)
{
DeleteAllColumn();
CListCtrl& m_ListCtrl = GetListCtrl();
CString strHeader[]={_T("图书编号"),_T("书名"),_T("作者"),_T("价格"),_T("数量"),_T("出版社")};
for(int ncol=0;ncol<sizeof(strHeader)/sizeof(CString);ncol++)
m_ListCtrl.InsertColumn(ncol,strHeader[ncol],LVCFMT_LEFT,100);
m_ListCtrl.DeleteAllItems();//删除所有的列表项
CBookadd bSet;
bSet.m_strFilter = strFilter;
bSet.m_strSort = "bookno";
bSet.Open();
int nitem = 0;
CString str;
while(!bSet.IsEOF())
{
m_ListCtrl.InsertItem(nitem,bSet.m_bookno);
m_ListCtrl.SetItemText(nitem,1,bSet.m_bookname);
m_ListCtrl.SetItemText(nitem,2,bSet.m_bookauthor);
str.Format(_T("%4.2f"),bSet.m_bookprice);
m_ListCtrl.SetItemText(nitem,3,str);
str.Format(_T("%8d"),bSet.m_booksum);
m_ListCtrl.SetItemText(nitem,4,str);
m_ListCtrl.SetItemText(nitem,5,bSet.m_bookpublisher);
nitem++;
bSet.MoveNext();
}
bSet.Close();
}
(3)为CBSMSView类添加一个成员变量m_strFilter,类型为CString。
(4)用MFC ClassWizard在CBSMSView类中映射菜单ID_ADDBOOK的COMMAND消息,并添加下列代码:
void CBSMSView::OnAddbook()
{
// TODO: 在此添加命令处理程序代码
CAddbook dlg;
CBookadd bSet;
if(dlg.DoModal()!=IDOK) return;
bSet.Open();
bSet.AddNew();//在表的末尾增加新记录
bSet.SetFieldNull(&(bSet.m_bookno),FALSE);
//设定m_Bookadd_bookno不能为空
bSet.m_bookno = dlg.m_strbookid;
bSet.m_bookname = dlg.m_strbookname;
bSet.m_bookauthor = dlg.m_strauthor;
bSet.m_bookprice = dlg.m_dbookprice;
bSet.m_bookpublisher = dlg.m_strpublisher;
bSet.m_booksum = dlg.m_bookquantity;//输入新的字段值
bSet.Update(); //将新纪录存入数据库
bSet.Requery();//刷新记录集,这在快照集方式下是必须的
bSet.Close();
MessageBox(_T("图书信息添加成功!"),_T("特别提示"),MB_OK|MB_ICONINFORMATION);
m_strFilter.Format(_T("bookno = '%s'"),dlg.m_strbookid);
DispBookInfo(m_strFilter);
}
(5)在CBSMSView类添加成员函数DeleteAllColumn(),用来获取当前选择的列表项索引,其代码如下:
int CBSMSView::GetListCtrlCurSel(void)
{
CListCtrl& m_ListCtrl = GetListCtrl();
POSITION pos;
pos = m_ListCtrl.GetFirstSelectedItemPosition();
if(pos==NULL)
{
MessageBox(_T("您还没有选中列表项,请先选中列表项!"));
return -1;
}
return m_ListCtrl.GetNextSelectedItem(pos);
}
(6)用MFC ClassWizard在CBSMSView类中映射菜单ID_CHANGEBOOK的COMMAND消息,并添加下列代码:
void CBSMSView::OnChangebook()
{
// TODO: 在此添加命令处理程序代码
CChangebook1 dlg1;
if(dlg1.DoModal()==IDOK)
{
CBookadd bSet;
CChangebook2 dlg2;
UpdateData();
dlg1.m_strbookid.TrimLeft();
if(dlg1.m_strbookid.IsEmpty())
{
MessageBox(_T("请输入图书编号!"));
OnChangebook();
return;
}
bSet.m_strFilter.Format(_T("bookno = '%s'"),dlg1.m_strbookid);
bSet.m_strSort = "bookno";
if(bSet.IsOpen())
bSet.Close();
bSet.Open();
if(bSet.m_bookno.IsEmpty())
{
MessageBox(_T("要修改的图书信息不存在!"));
OnChangebook();
return;
}
else
{
dlg2.m_strauthor = bSet.m_bookauthor;
dlg2.m_strbookid = bSet.m_bookno;
dlg2.m_strbookname = bSet.m_bookname;
dlg2.m_strbookno = bSet.m_booksum;
dlg2.m_strprice = bSet.m_bookprice;
dlg2.m_strpublisher = bSet.m_bookpublisher;
if(dlg2.DoModal()==IDOK)
{
bSet.Edit();
bSet.m_bookauthor = dlg2.m_strauthor;
bSet.m_bookno = dlg2.m_strbookid;
bSet.m_bookname = dlg2.m_strbookname;
bSet.m_booksum = dlg2.m_strbookno;
bSet.m_bookprice = dlg2.m_strprice;
bSet.m_bookpublisher = dlg2.m_strpublisher;
bSet.Update();
UpdateData(FALSE);
MessageBox(_T("图书信息修改成功!"));
m_strFilter.Format(_T("bookno = '%s'"),dlg2.m_strbookid);
DispBookInfo(m_strFilter);
}
}
bSet.Close();
}
}
(7)用MFC ClassWizard在CBSMSView类中映射菜单ID_CONDITIONSEEKBOOK的COMMAND消息,并添加下列代码:
void CBSMSView::OnConditionseekbook()
{
// TODO: 在此添加命令处理程序代码
CCondtionseekbook dlg;
CBookadd bSet;
int a=1,b=2,c=4,d=8,n;
if(dlg.DoModal()==IDOK)
{
dlg.m_strbookid.TrimLeft();
dlg.m_strbookname.TrimLeft();
dlg.m_strauthor.TrimLeft();
dlg.m_strpublisher.TrimLeft();
if(dlg.m_strbookid.IsEmpty())
a=0;
if(dlg.m_strbookname.IsEmpty())
b=0;
if(dlg.m_strauthor.IsEmpty())
c=0;
if(dlg.m_strpublisher.IsEmpty())
d=0;
n=a+b+c+d;
switch(n)
{
case 0:MessageBox(_T("请输入要查询的条件!"));
OnConditionseekbook();return;
case 1:bSet.m_strFilter.Format(_T("bookno = '%s'"),dlg.m_strbookid);
bSet.m_strSort = "bookno";break;
case 2:bSet.m_strFilter.Format(_T("bookname = '%s'"),dlg.m_strbookname);
bSet.m_strSort = "bookname";break;
case 3:bSet.m_strFilter.Format(_T("bookno = '%s' AND bookname = '%s'"),dlg.m_strbookid,dlg.m_strbookname);
bSet.m_strSort = "bookno,bookname";break;
case 4:bSet.m_strFilter.Format(_T("bookauthor = '%s'"),dlg.m_strauthor);
bSet.m_strSort = "bookauthor";break;
case 5:bSet.m_strFilter.Format(_T("bookno = '%s' AND bookauthor = '%s'"),dlg.m_strbookid,dlg.m_strauthor);
bSet.m_strSort = "bookno,bookauthor";break;
case 6:bSet.m_strFilter.Format(_T("bookname = '%s' AND bookauthor = '%s'"),dlg.m_strbookname,dlg.m_strauthor);
bSet.m_strSort = "bookname,bookauthor";break;
case 7:bSet.m_strFilter.Format(_T("bookno = '%s' AND bookname = '%s' AND bookauthor = '%s'"),dlg.m_strbookid,dlg.m_strbookname,dlg.m_strauthor);
bSet.m_strSort = "bookno,bookname,bookauthor";break;
case 8:bSet.m_strFilter.Format(_T("bookpublisher = '%s'"),dlg.m_strpublisher);
bSet.m_strSort = "bookpublisher";break;
case 9:bSet.m_strFilter.Format(_T("bookno = '%s' AND bookpublisher = '%s'"),dlg.m_strbookid,dlg.m_strpublisher);
bSet.m_strSort = "bookno,bookpublisher";break;
case 10:bSet.m_strFilter.Format(_T("bookname = '%s' AND bookpublisher = '%s'"),dlg.m_strbookname,dlg.m_strpublisher);
bSet.m_strSort = "bookname,bookpublisher";break;
case 11:bSet.m_strFilter.Format(_T("bookno = '%s' AND bookname = '%s' AND bookpublisher = '%s'"),dlg.m_strbookid,dlg.m_strbookname,dlg.m_strpublisher);
bSet.m_strSort = "bookno,bookname,bookpublisher";break;
case 12:bSet.m_strFilter.Format(_T("bookauthor = '%s' AND bookpublisher = '%s'"),dlg.m_strauthor,dlg.m_strpublisher);
bSet.m_strSort = "bookauthor,bookpublisher";break;
case 13:bSet.m_strFilter.Format(_T("bookno = '%s' AND bookauthor = '%s' AND bookpublisher = '%s'"),dlg.m_strbookid,dlg.m_strauthor,dlg.m_strpublisher);
bSet.m_strSort = "bookno,bookauthor,bookpublisher";break;
case 14:bSet.m_strFilter.Format(_T("bookname = '%s' AND bookauthor = '%s' AND bookpublisher = '%s'"),dlg.m_strbookname,dlg.m_strauthor,dlg.m_strpublisher);
bSet.m_strSort = "bookname,bookauthor,bookpublisher";break;
case 15:bSet.m_strFilter.Format(_T("bookno = '%s' AND bookname = '%s' AND bookauthor = '%s' AND bookpublisher = '%s'"),dlg.m_strbookid,dlg.m_strbookname,dlg.m_strauthor,dlg.m_strpublisher);
bSet.m_strSort = "bookno,bookname,bookauthor,bookpublisher";break;
}
if(bSet.IsOpen())
bSet.Close();
bSet.Open();
if(bSet.m_bookno.IsEmpty()&&bSet.m_bookname.IsEmpty()&&bSet.m_bookauthor.IsEmpty()&&bSet.m_bookpublisher.IsEmpty())
{
MessageBox(_T("要查询的图书信息不存在!"));
OnConditionseekbook();
return;
}
else
DispBookInfo(bSet.m_strFilter);
bSet.Close();
}
}
(8)用MFC ClassWizard在CBSMSView类中映射菜单D_SEEKALLBOOK的COMMAND消息,并添加下列代码:
void CBSMSView::OnSeekallbook()
{
// TODO: 在此添加命令处理程序代码
DispBookInfo(_T(""));
}
(9)用MFC ClassWizard在CBSMSView类中映射菜单ID_DELETEBOOK的COMMAND消息,并添加下列代码:
void CBSMSView::OnDeletebook()
{
// TODO: 在此添加命令处理程序代码
int nitem = GetListCtrlCurSel();
if(nitem<0) return;
CListCtrl& m_ListCtrl = GetListCtrl();
CString stritem,str;
stritem = m_ListCtrl.GetItemText(nitem,1);
str.Format(_T("确实要删除书名为《%s 》的列表项(记录)吗?"),stritem);
if(IDOK != MessageBox(str,_T("确认删除"),MB_ICONQUESTION|MB_OKCANCEL))
return;
CString strbookid = m_ListCtrl.GetItemText(nitem,0);
CBookadd iSet;
iSet.m_strFilter.Format(_T("bookno = '%s'"),strbookid);
iSet.Open();
if(!iSet.IsEOF())
{
CRecordsetStatus status;
iSet.GetStatus(status);
iSet.Delete();
if(status.m_lCurrentRecord==0)
iSet.MoveNext();
else
iSet.MoveFirst();
}
if(iSet.IsOpen())
iSet.Close();
MessageBox(_T("图书信息删除成功!"));
DispBookInfo(_T(""));
}
(三)顾客信息管理实现
1.在BSMS中添加图书信息表的类CCustomer。
2.创建顾客信息添加对话框。
为对话框类CAddcustomer添加背景图片,为CAddcustomer类添加成员函数OnPaint,并添加下列代码:
void CAddcustomer::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
CDC memdc;
memdc.CreateCompatibleDC(&dc);//创建兼容YDC
CBitmap bkg;
bkg.LoadBitmap(IDB_BITMAP15);//载入位图
BITMAP bkginfo;
bkg.GetBitmap(&bkginfo);//获取位图信息
memdc.SelectObject(&bkg);
RECT rect;
GetWindowRect(&rect);//获取对话框信息
dc.SetStretchBltMode(COLORONCOLOR);
dc.StretchBlt(0,0,rect.right-rect.left,rect.bottom-rect.top,&memdc,0,0,bkginfo.bmWidth,bkginfo.bmHeight,SRCCOPY);
// 不为绘图消息调用CDialogEx::OnPaint()
}
3. 创建顾客信息修改对话框。
为对话框类CChangecustomer添加背景图片,为CChangecustomer类添加成员函数OnPaint,并添加下列代码:
void CChangecustomer::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
CDC memdc;
memdc.CreateCompatibleDC(&dc);//创建兼容YDC
CBitmap bkg;
bkg.LoadBitmap(IDB_BITMAP15);//载入位图
BITMAP bkginfo;
bkg.GetBitmap(&bkginfo);//获取位图信息
memdc.SelectObject(&bkg);
RECT rect;
GetWindowRect(&rect);//获取对话框信息
dc.SetStretchBltMode(COLORONCOLOR);
dc.StretchBlt(0,0,rect.right-rect.left,rect.bottom-rect.top,&memdc,
展开阅读全文