2 需求分析
2.1 国内外研究的现状
在现代化的书店中,对图书销售工作运用现代化技术进行管理,是提高工作效率的
有效手段。图书销售管理是书店日常工作中非常重要的一个方面,越来越受到书店经营
者的重视。通过计算机管理系统对图书销售进行全面的统计与管理,全面解决了书店经
营过程中所遇到的各种问题,并且克服了传统管理方式中的易出错等问题。图书销售管
理系统成为书店管理的首选管理工具。
2.2 功能需求
2.2.1 待开发软件的功能需求
本系统是根据书店的实际需求而开发的,要求稳定、可靠的实现图书销售的自动化
管理,通过本系统可以达到以下目标:
1. 图书录入,包括图书的基本信息,如分类、进价、售价、作者等。
2. 图书销售,包括图书的售价、折扣、销售日期,并实现对库存量的修改。
3. 销售统计,包括按图书类型、书名、作者、出版社等进行统计。
4. 查询库存,对指定的某本图书剩余库存量进行查询。
5. 售完图书查询,对已售完图书进行查询。
2.2.2 待开发软件的功能
按照用户需求,要满足以上功能,我设计出了图书销售管理系统的系统功能图,如
图 2.1 所示。
-1-
图书销售管理系统
图
书
录
入
图
书
销
售
销
售
统
计
查
询
库
存
售
完
图
书
查
询
图 2.1 图书销售管理系统的系统功能图
2.3 数据描述
2.3.1 数据库概要说明
数据库中包括管理员信息表、图书基本信息表、图书类型表、图书销售记录表等 4
个数据表。
图 2.3 所示的即为本系统中数据库中的数据表结构图,该数据表结构图包含系统所
有数据表。可以清晰地反应数据库信息。
图 2.3 数据表结构图
2.3.2 主要数据表的结构
表 2.1 Pwd(管理员信息表)
字段名
ID
Password
数据类型
int
nvarchar
表 2.2 BookInfo(图书基本信息表)
字段名
BookID
BookName
CategoryID
数据类型
字段大小
int
nvarchar
int
-2-
4
50
4
字段大小
描述
4
50r
管理员帐号
密码
描述
图书编号
图书名称
图书类型编号
Author
Publisher
PublishDate
Purchase
Price
Stock
Discount
BarCode
nvarchar
nvarchar
smalldatetime
float
float
int
int
nvarchar
表 2.3 BookCategory(图书类型表)
字段名
CategoryID
CategoryName
数据类型
int
nvarchar
表 2.4 BookSale(图书销售记录表)
50
50
4
8
8
4
4
50
长度
4
8
作者
出版社
出版日期
进价
售价
库存本数
折扣
条形码
描述
图书类型编号
图书类型名称
字段名
ID
BookID
SalePrice
SaleDate
数据类型
长度
描述
int
int
float
smalldatetime
4
4
8
4
销售记录编号
图书编号
实际售价
销售日期
2.4 数据库描述
本软件采用SQL数据库。
3 概要设计
3.2 系统功能模块设计
在前面系统功能分析的基础上,结合 Visual C++程序编制的特点,得到如图 3.1
所示的系统功能模块图。
-3-
图书销售管理系统
管
理
员
登
录
模
块
M
1
)
(
图
书
录
入
模
块
M
2
)
(
图
书
销
售
模
块
M
3
)
(
销
售
统
计
模
块
M
4
)
(
查
询
库
存
模
块
M
5
)
(
售
完
图
书
查
询
模
块
M
6
)
(
图 3.1 图书销售管理系统功能模块图
各模块功能分配如下:
(1)用户登陆功能:管理员登陆模块(M1)。
(2)图书录入功能:图书录入模块(M2)。
(3)图书销售功能:图书销售模块(M3)。
(4)销售统计功能:销售统计模块(M4)。
(5)查询图书库存功能:查询库存模块(M5)。
(6)售完图书查询功能:售完图书查询模块(M6)。
3.3 系统处理流程
(1)系统启动,进入身份验证。
(2)初始化系统,导入数据库。
(3)录入图书信息。
(4)图书销售。
(5)统计图书销售信息。
(6)查询图书库存信息。
(7)查询已售完图书信息。
(8)退出系统。
-4-
4 详细设计
该系统采用 VC++6.0 中的 MFC 连接 SQL 数据库的方式,使用图形用户界面,主要实
现图书录入、图书销售等功能。下面具体对各模块进行介绍。
4.1 登录模块及主界面
在登录界面(如图 4.1 所示)中输入用户名和密码,登录成功后进入主界面。登陆
框流程图如图 4.2 所示,系统主界面如图 4.3 所示,单击某个按钮就能弹出某个功能的
界面。
图 4.1 系统登录界面
4.2 图书录入模块
4.2.1 实现目标
添加图书信息,图书录入对话框的设计如图 4.4 所示。“保存”按钮对应的方法为
RAddBookDlg::OnSave(),流程图如图 4.5 所示。
图 4.4 图书录入对话框
-5-
开始
输入图书基本信息
判 断 输 入 是 否 正
确且完整
否
是
添加该信息到关联表并写
入数据库
结束
图 4.5 RAddBookDlg::OnSave()方法的流程图
4.2.2 设计步骤
(1)向项目中添加一个新 Dialog 资源,资源 ID 为 IDD_ADDBOOK。在 IDD_YGTJK
对话框资源中单击鼠标右键,执行弹出快捷菜单的“Properties”菜单命令,打开“Dialog
Properties”对话框。在“Dialog Properties”对话框中选择 General 选项卡,更改其“Caption”
文本框内容为“图书信息录入”。
(2)从 Controls 面板上向 Dialog 资源中添加所需控件,更改资源的属性,并为资
源设置相对应的变量,如表 4.1 所示。
表 4.1 图书录入 Dialog 资源属性设置
ID
Properties
IDC_BK_CATEGORY
IDC_BK_NAME
IDC_BK_AUTHOR
IDC_BK_PUBLISHER
IDC_BK_DATE
默认
默认
默认
默认
默认
-6-
Member Variables
Type
文本
文本
文本
文本
Member
CategoryName
BookName
Author
Publisher
日期/时间
PublishDate
IDC_BK_PURCHASE
IDC_BK_PRICE
IDC_BK_PAYOFF
IDC_BK_STOCK
IDC_BK_BARCODE
IDC_BK_DISCOUNT
IDC_RESET
IDC_SAVE
IDCANCEL
4.2.3 代码分析
默认
默认
默认
默认
默认
默认
Caption 重填
Caption 添加
Caption 退出
数字
数字
数字
数字
文本
数字
Purchase
Price
Price
Stock
BarCode
Discount
(1)打开 ClassWizard 窗口,添加在 OnInitDialog 成员函数,向 OnInitDialog
添加代码如下:
BOOL RAddBookDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
GetBookGategory();
return TRUE;
// return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
(2)当用户单击“保存“按钮时,实现添加图书功能,其响应代码如下:
void RAddBookDlg::OnSave()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(!IsValidInput())
return ;
if(IDYES != AfxMessageBox("确定要保存吗?",MB_YESNO)) //放弃保存
return ;
if(SaveData())
-7-
AfxMessageBox("保存成功!");
//保存后重置数据
m_bHasNewBook = true;
OnReset();
GetDlgItem(IDC_BK_CATEGORY)->SetFocus();
{
}
else
AfxMessageBox("保存失败!");
}
(3)判断输入信息是否正确的函数是 IsValidInput(),其响应代码如下:
bool RAddBookDlg::IsValidInput()
{
CString str = "0123456789";
if(m_strBookCategory.IsEmpty() || m_strBookCategory.FindOneOf(str) != -1)
{
AfxMessageBox("输入有误!图书类型不能为空或包含数字。");
GetDlgItem(IDC_BK_CATEGORY)->SetFocus();
return false;
}
if(m_strBookName.IsEmpty())
{
AfxMessageBox("输入有误!书名不能为空。");
GetDlgItem(IDC_BK_NAME)->SetFocus();
return false;
}
if(m_strAuthor.IsEmpty() || m_strAuthor.FindOneOf(str) != -1)
{
AfxMessageBox("输入有误!作者名称不能为空或包含数字。");
GetDlgItem(IDC_BK_AUTHOR)->SetFocus();
-8-