1.1 系统基本功能描述
网上书店系统是依据网上书店能够在线出售图书和管理需求而进行设计的,目的是实现在线接受客户订单、书店信息管理的功能。
需要在线购买图书的客户能够通过网上书店系统查询所需要的图书是否有售并能够查询有售图书的基本信息(比如图书名称、作者、出版社等)。如果客户查询到所需并且有售的图书,能够在线下达订单,然后提交给数据库,并且客户能够查询自己的订单的处理情况。同时,客户应该能够维护自己的信息(比如修改自己的收货地址、联系方式等)。
网上书店系统应该至少拥有一个管理员。管理员能够维护在售图书的基本信息(比如图书信息的增加、删除、修改等),并且能够对图书进行分类管理。同时,管理员能够维护客户的信息,能够审核客户提交的订单以确认或删除订单。
1.2系统数据流图
通过对系统需求进行分析,我们尅有确定系统中有两类用户:管理员和客户。
各类用户的具体描述如下:
(1)管理员
描述:管理员负责后台管理。包括维护(增加、删除、修改)图书信息,对
图书进行分类管理;维护客户信息(增加和删除客户账号);审核订单并确认合法订单或删除非法订单。
(2)客户
描述:客户可以查询有售图书的基本信息;可以维护自己的信息;可以进行网上订书;可以查询订单的处理情况。
1.2.1数据流分析
根据分析,我们可以得到系统的数据流图。
(1)网上书店系统顶层数据流图如图1-1所示。
1.2.2 数据字典
根据数据流程分析,对系统数据进行分析和汇总,建立系统数据字典。下面
列出部分数据字典内容。
1.2.2.1 数据项
(1)管理员
① {管理员编号,每位管理员在系统中的唯一编号也是管理员登陆的账号名,char(7)}
② {管理员姓名,char(10)}
③ {管理员登陆密码,char(10)}
(2)客户
① {客户编号,每位客户在系统中的唯一编号,char(7)}
② {客户姓名,char(10)}
③ {地址编号,客户有多个地址时每个地址的编号,char(7)}
④ {地址,客户收货地址中某个具体地址,varchar(20)}
⑤ {联系方式,客户的电话号码,char(15)}
⑥ {账户余额,客户购书账户的余额,float(7)}
⑦ {登陆密码,char(10)}
(3)订单
① {订单号,唯一标识一张订单的编号,char(7)}
② {订单日期,生成订单的时间,datetime,取值为提交订单的时间}
③ {收货人姓名,查收图书的人的姓名,char(10),同客户姓名}
④ {收货人联系方式,收货人的电话号码,char(15),同联系方式}
⑤ {发货地址,图书送达的目的地,varchar(100),是客户收货地址中的一个}
⑥ {管理员编号,审核该订单的管理员的编号,char(7),同管理员编号}
(4)订单细则
① {细则号,唯一标识一个订单细则,char(7)}
② {图书编号,订单所包含的图书的编号,char(7),同图书信息中的图书编号}
③ {订购数量,购买同本图书的数量,smallint,取值不大于此本图书的库存余量}
④ {发货状况,已订购图书的发货情况,varchar(100)}
(5)图书信息
① {图书编号,唯一标识一款图书的编号,char(7)}
② {图书名,图书的题名,varchar(20)}
③ {作者,图书的作者,char(10)}
④ {出版社,图书的出版方,varchar(20)}
⑤ {图书类别,图书的分类,varchar(20)}
⑥ {库存余量,当前书店此款图书的剩余量,smallint,当前库存量=上次库存量-售出数量}
⑦ {图书价格,图书的售价,float(5),图书价格大于零}
1.2.2.2 数据结构
(1){图书信息,每本图书的具体信息,组成:{图书编号,图书名,作者,出版社,图书类别,库存余量,图书价格} }
(2){管理员,管理员的基本信息,组成:{管理员编号,管理员姓名} }
(3){客户,客户的基本信息,组成:{客户编号,客户姓名,收货地址,账户余额,联系方式} }
(4){收货地址,客户的收货地址,组成:{地址编号,地址} }
(5){订单,订单的信息,组成:{订单号,订单日期,订单细则,收货人姓名,
发货地址,管理员编号,收货人联系方式} }
(6){定单细则,订单的细节内容,组成:{细则号,图书编号,订购数量,发货状况} }
2 系统设计
2.1 数据库设计
2.1.1 概念结构设计
1.系统涉及到的实体
(1)管理员{管理员编号,管理员姓名}
(2)客户{客户编号,客户姓名,收货地址,账户余额,联系方式}
(3)图书{图书编号,图书名,作者,出版社,图书类别,库存余量,图书价格}
(4)订单{订单号,订单日期,订单细则,收货人姓名,发货地址,管理员编号,收货人联系方式}
(5)订单细则{细则号,图书编号,订购数量,发货状况}
(6)收货地址{地址编号,地址}
2. 系统E-R模型设计
A. 分E-R 模型设计
(1)每个客户可以拥有多个收货地址,这些地址只能被这个客户使用。因此,客户与收货地址之间是一对多关系。E-R图如下:
(2) 一个客户可以下达多个定单,一个订单只能属于一个客户。因此,客户与订单是一对多关系。E-R图如下:
(3)一份订单里可以包含若干个订单细则。因此,订单与订单细则之间是一对多关系。E-R图如下:
(4) 一个管理员可以审核多份定单,但是一份订单只能被一个管理员审核。因此,管理员与订单是一对多关系。E-R图如下:
(5) 一个订单细则可以包含多本图书,一本图书也可以包含在多份订单细则中。因此,图书与订单细则之间是多对多关系。E-R图如下:
B. 系统的总E-R图
合并以上E-R图即得系统总E-R图如下:
2.1.2 逻辑结构设计
根据以上的分析,将E-R模型转换成逻辑模型,设计出本系统的数据库。根据需要,设计了6个数据表,2个视图。如下所示:
●管理员信息表:该表记录了管理员的相关信息,包括管理员编号,登陆密码管理员姓名。
●客户信息表:该表记录了客户的相关信息,包括客户编号,登录密码,客户姓名,联系方式,账户余额。
●收货地址表:该表记录了客户的收货地址信息,包括地址编号,客户编号,地址。
●订单表:该表记录了订单的基本信息,包括订单号,客户编号,订单日期,收货人姓名,发货地址,收货人联系方式,管理员编号。
●订单细则表:该表记录了订单的细则信息,包括细则号,订单号,图书编号,订购数量,发货状况。
●图书信息表:该表记录了图书的基本信息,包括图书编号,图书名,作者,出版社,图书类别,库存余量,图书价格。
以上是在数据库中的基本表。在具体的查询过程中,如果全部直接从基
本表查询,则要建立多重的联合(内联)查询,这样用起来很不方便,也容易出错;同时影响系统效率。因此建立n个视图,方便查询。
(1)客户购书信息视图:包括图书名,作者,出版社,订购数量,订单日期,发货状况,账户余额。
(2)管理员订单审核视图:包括订单号,客户号,图书编号,订购数量。
根据上面的逻辑结构设计,设计相应的表结构如下所示。
1.管理员信息表(Ginfo)
该表记录了管理员的相关信息,包括管理员编号,管理员姓名。其结构如表2-1所示:
表2-1 Ginfo
字段 | 说明 | 类型(长度) | 备注 |
Gid | 管理员编号 | char(7) | 主键,不为空 |
Gcode | 登录密码 | char(10) | 不为空 |
Gname | 管理员姓名 | char(10) | 不为空 |
该表记录了客户的相关信息,包括客户编号,客户姓名,联系方式,账户余额。其结构如表2-2所示:
表2-2 Kinfo
字段 | 说明 | 类型(长度) | 备注 |
Kid | 客户编号 | char(7) | 主键,不为空 |
Kcode | 登录密码 | char(10) | 不为空 |
Kname | 客户姓名 | char(10) | 不为空 |
Kcontact | 联系方式 | char(15) | 不为空 |
Ksave | 账户余额 | float(7) | 不小于零 |
该表记录了客户的收货地址信息,包括地址编号,客户编号,地址。其
结构如表2-3所示:
表2-3 ADinfo
字段 | 说明 | 类型(长度) | 备注 |
ADid | 地址编号 | char(7) | 主键,不为空 |
Kid | 客户编号 | char(7) | 主键,外键,不为空 |
Add | 地址 | varchar(100) | 不为空 |
该表记录了订单的基本信息,包括订单号,客户编号,订单日期,收货人姓名,发货地址,收货人联系方式,管理员编号。其结构如表2-4所示:
表2-4 Dinfo
字段 | 说明 | 类型(长度) | 备注 |
Did | 订单号 | char(7) | 主键,不为空 |
Kid | 客户编号 | char(7) | 主键,外键,不为空 |
Dname | 收货人姓名 | char(10) | 不为空 |
Dadd | 发货地址 | varchar(100) | 外键,不为空 |
Dcontact | 收货人联系方式 | char(15) | 外键,不为空 |
Gid | 管理员编号 | char(7) | 外键,不为空 |
Ddate | 订单日期 | datetime | 不为空 |
该表记录了订单的细则信息,包括细则号,订单号,图书编号,订购数量,发货状况。其结构如表2-5所示:
表2-5 Xinfo
字段 | 说明 | 类型(长度) | 备注 |
Xid | 细则号 | char(7) | 主键,不为空 |
Did | 订单号 | char(7) | 主键,外键,不为空 |
Tid | 图书编号 | char(7) | 外键,不为空 |
Xnum | 订购数量 | smallint | 大于零 |
Xdetail | 发货状况 | varchar(100) | 默认未发货 |
该表记录了图书的基本信息,包括图书编号,图书名,作者,出版社,图书类别,库存余量,图书价格。其结构如表2-6所示:
表 2-6 Tinfo
字段 | 说明 | 类型(长度) | 备注 |
Tid | 图书编号 | char(7) | 主键,不为空 |
Tname | 图书名 | varchar(20) | 不为空 |
Twriter | 作者 | char(10) | 不为空 |
Tpub | 出版社 | varchar(20) | 不为空 |
Tnum | 库存余量 | smallint | 不小于零,不为空 |
Tprice | 图书价格 | float(5) | 不小于零,不为空 |
Tsort | 图书类别 | varchar(20) | 不为空 |
1.存储过程
(1)订单处理系统是整个网上书店系统的核心。它的功能是检查客户欲提交的订单细则数据的合法性。主要包括:检查图书的库存余量是否为零、检查客户的账户余额是否足够支付购书款。检查订单细则数据流程图如图3-1所示:
图3-1 检查订单数据流程图
存储过程检查接收到的订单细则数据是否产生冲突(冲突产生的原因是:订购数量大于图书的库存余量、购书的金额大于账户余额),如果没有冲突产生,则将数据插入订单细则表(Xinfo),否则返回冲突提示。其代码如下所示:
CREATE PROCEDURE Xdate_check
@kid char(7),
@tid char(7),
@xnum smallint
AS
IF((select tnum from tinfo where tid=@tid)-@xnum>=0)
BEGIN
IF((select ksave from kinfo where kid=@kid)
-(select tprice*@xnum from tinfo where tid=@tid)>=0)
BEGIN
insert into xinfo
values('','',@tid,@xnum,'未发货')/*订单号及细则号由系统自动生成*/
print'订单细则提交成功'
END
ELSE
BEGIN
print'账户余额不足!'
END
ELSE
BEGIN
print'库存量不足!'
END
END
(2)新加管理员账户及删除管理员账户的存储过程。
/*新增管理员信息*/
CREATE PROCEDURE add_G
@gid char(7),
@gcode char(10),
@gname char(10)
AS
insert into Ginfo
values(@gid,@gcode,@gname)
/*删除管理员信息*/
CREATE PROCEDURE dele_G
@gid char(7),
@gcode char(10)
AS
IF (exists(select * from ginfo where gid=@gid and gcode=@gcode))
delete from Ginfo where Gid=@gid
(3)新增用户信息及删除用户信息。
/*新增用户信息*/
CREATE PROCEDURE add_K
@kid char(7),
@kcode char(10),
@kname char(10),
@kcontact char(15)
AS
insert into Ginfo
values(@kid,@kcode,@kname,@kcontact,'','')
2.触发器
当每条订单细则提交后,图书的库存量和用户的账户余额应当相应的减少。
CREATE TRIGGER tri01 on Xinfo
for insert
AS
BEGIN
update Tinfo
set tnum=tnum-(select xnum from inserted)
where tid=(select tid from inserted)
update Kinfo
set ksave=ksave-(select tprice*(select xnum from inserted) from Tinfo where tid=(select tid from inserted))
where kid=(select kid from Dinfo where Did=
(select Did from inserted))
END
小结
由于设计MIS经验不足,时间有限,我虽然在有限时间里顺利的完成了网上书店系统的分析、设计和调试工作,但是本系统仍需进一步扩充和完善,使之更符合实际的应用。如在订单处理功能上应当增加处理功能,在图书管理上应当增加图书的仓储管理功能等。我充分体会到理论知识的重要性,但更加体会到实践的重要性。只有通过实践,我们才能发现并解决问题,才能真正掌握一项技术。我会在将来的软件设计、开发过程中进一步学习,不断提高自己的专业技能。