图书销售系统整理.docx
《图书销售系统整理.docx》由会员分享,可在线阅读,更多相关《图书销售系统整理.docx(43页珍藏版)》请在冰豆网上搜索。
图书销售系统整理
数据库原理课程设计
评语:
学院计算机工程班级计算1013
姓名陈高伟学号**********
成绩指导老师林颖贤
2021年1月9日
第一章引言
1.1课题研究背景与意义
现如今图书销售行业开展迅速,大大小小的书店到处可见,特别是一些开展较大的书城采用大规模的连锁经营方式。
随着规模的扩大传统的图书管理已经不能适应开展的需要。
图书管理工作繁琐,销售频繁,包含大量的信息数据,因此就需要一个完善的图书销售管理系统来实现对这些数据的有效管理。
本系统主要任务就是对书店、图书、顾客、销售信息、查询进行统一管理,满足各类用户的需求。
本系统在功能上要实现书店进货功能,图书统计功能,书店销售功能等。
我通过对世面上的书城如新华书店和学校里的小书店进行了初步的了解,发现其业务主要是集中在对图书的管理和图书的销售上。
对图书的管理工作量较大,采用手工的方式还容易出错,并且不能满足顾客对图书的详细的查询功能。
本系统在设计中考虑和克服了上诉的诸多问题,增强了实用性。
1.2本课题研究内容与目标
1.2.1研究内容
本课题是通过SQLServer和相应的面相对象语言来制作一个面相书店用户的图书销售管理系统。
1.2.2研究目标
本图书销售管理系统就是要求图书管理人员通过该系统对图书、顾客、管理员、购置信息等进行统一管理,从而实现功能上的销售图书、管理图书库存量、图书信息、顾客信息和用户信息以及相应信息查询。
这就要求管理人员能够对数据库熟悉操作,简单的表查询、触发器的建立、存储过程的建立以及用户自定义函数的建立等等这些管理数据库的方法都能对图书馆里系统的管理起到事半功倍的效果。
最后通过应用这些命令来建立一个完整的图书销售管理系统。
本图书销售管理系统的开发语言是JAVA,开发环境是,数据库采用SQLServer2021。
1.4体系结构设计
本次课程设计的图书销售管理系统采用了C/S体系结构设计,即采用了客户端和效劳器,这里的客户端主要是应用程序界面,效劳器是数据库后台。
通过对前台界面的操作,来实现相应的对数据库信息的增、删、改功能,如果操作正确那么将运行显示相应结果,对应修改后台数据库内容,信息一旦提交,将不能修改;前台页面也调用后台数据库编写好的存储过程和触发器,来实现操作,客户端也有很好的权限控制,这样是为了防止用户的恶意操作,比方说:
在登录界面,只有密码和登录名都正确才能进入系统,并且不同的方式将进入不同的操作页面。
第二章、需求分析
2.1信息要求
图2-1
2.2处理要求
2.3数据字典
2-1图书表
列名
中文名
数据类型
是否允许空
备注
Book_id
图书编号
varchar(13)
否
主键
Typeid
图书类型编号
varchar(13)
否
外键
Bookname
图书名称
varchar(40)
否
Writer
作者
varchar(21)
否
Translator
翻译者
varchar(30)
是
Publisher
出版社
varchar(50)
是
Date
出版时间
Datetime
是
Price
价格
Money
是
Insum
库存量
Int
是
2-2顾客表
列名
中文名
数据类型
是否允许空
备注
Reader_id
顾客编号
varchar(13)
否
主键
kname
顾客姓名
varchar(10)
否
Sex
性别
varchar
(2)
是
Age
年龄
Int
是
Identitycard
身份证号
varchar(30)
否
Tel
号码
varchar(50)
是
2-3购书信息表
列名
中文名
数据类型
是否允许空
备注
Id
订单编号
int
否
主键
Book_id
图书编号
varchar(13)
否
外键
Reader_id
顾客编号
varchar(13)
否
外键
Buynum
购置数量
int
是
默认为1
Buydate
购置日期
Datetime
否
默认为系统时间
Buybookname
图书姓名
varchar(40)
是
2-4管理员(用户)表
列名
中文名
数据类型
是否允许空
备注
Id
用户id
Int
否
主键
Yname
管理员姓名
varchar(20)
否
Sex
性别
varchar
(2)
是
Tel
号码
varchar(12)
是
Ypassword
管理员密码
varchar(10)
是
Ytype
管理员权限
varchar
(1)
是
2-5进货表
列名
中文名
数据类型
是否允许空
备注
Book_id
图书编号
varchar(13)
否
外键,唯一
Date
进货时间
Datetime
否
Number
进货量
Int
否
Operator
操作管理员
varchar(6)
否
Checkandaccept
是否验收
Int
否
Zk
折扣
Float
是
2-6图书类型表
列名
中文名
数据类型
是否允许空
备注
Id
图书类型编号
varchar(13)
否
主键
Typename
图书类型名称
varchar(20)
否
2.3.2、数据结构
图书表〔book_id,typeid,bookname,writer,translator,publisher,date,price,insum〕;
顾客表〔reader_id,kname,sex,age,identitycard,tel〕;
购书信息表〔id,book_id,reader_id,buynum,buydate,buybookname〕;
管理员(用户)表〔id,yname,sex,tel,ypassword,ytype〕;
进货表〔book_id,date,number,operator,checkandaccept,zk〕;
图书类型表〔id,typename〕。
2.3.3、数据流
编号
名称
来源
去向
组成
1
身份信息
系统管理员,一般管理员
应用系统
登录名+密码
2
授权信息
应用系统
系统管理员,一般管理员
3
错误身份信息
应用系统
系统管理员,一般管理员
4
查询请求
系统管理员,一般管理员
应用系统
查询对象识别符〔如book_id,reader_id等〕
5
查询结果
应用系统
系统管理员,一般管理员
被查询对象具体信息
6
管理请求
系统管理员,一般管理员
应用系统
识别符〔book_id等〕+类型
7
管理结果信息
应用系统
系统管理员,一般管理员
被管理对象处理结果
8
非法请求
应用系统
系统管理员,一般管理员
非法请求提示信息
9
修改请求
系统管理员,一般管理员
应用系统
被修改对象具体信息
2-6数据流表
2.3.4、数据存储
图书表:
用于存放图书信息;
顾客表:
用于存放顾客信息;
购书信息表:
用于存放图书销售报表;
管理员〔用户〕表:
用于存放管理员信息;
进货表:
用于存放图书进货信息;
图书类型表:
用于存放图书类型信息。
2.4平安性和完整性要求
系统具有较高的平安性能,在SQLServer中定义存储过程及相应的触发器来区分系统管理员与一般管理员的权限,实现平安性。
系统管理员登入名和密码输入正确后可才可进入系统,而且只有系统管理员〔书店店主〕在数据库中添加了一般管理员后,并且这些一般管理员登录名和密码的输入正确之后才能进入系统对销售系统进行操作,否那么系统将拒绝用户的非法访问,以保证系统的平安,并且系统也控制了普通用户和系统管理员的权限,防止用户恶意操作或者不是成心的操作导致后台数据库的不一致。
系统为了保证数据的完整性,在数据库里面写了许多触发器,比方当用户进行图书信息添加操作的时候,可以自动更改图书表里面的库存量;用户进行销售操作后通过触发器也可以修改图书表的对应图书的库存量等。
据此来维护数据库的数据完整性,并且在进行用户界面交互操作的时候,会判断输入的信息,如果信息有误或者无意义,系统将拒绝对后台数据库的更改,因此系统具有很强的数据完整性。
第三章、概念结构设计
总ER图
图3-1整体E-R图
第四章、逻辑结构设计
4.1关系模型
图4-1
4.2数据模型优化
1.图书类型表〔图书类型编号,图书类型名〕
函数依赖:
图书类型编号----->图书类姓名
从函数依赖图可以看出,该关系中不存在局部函数依赖、传递函数依赖,且只有图书类型编号能够确定其它各项。
所以该关系是BCNF范式。
2.图书表〔图书编号,图书类型编号,图书名称,作者名,译者名,出版社,出版日期,价钱,库存量〕
函数依赖:
图书编号------->图书名称,图书编号----->作者名,图书编号----->译者名,图书编号----->出版社,图书编号---->出版日期,图书编号---->价钱,图书编号---->库存量
从函数依赖图可以看出,该关系中不存在局部函数依赖、传递函数依赖,且只有图书编号能够确定其它各项。
所以该关系是BCNF范式。
3.顾客表〔顾客编号,顾客名称,性别,年龄,证件号码,号码〕
函数依赖:
顾客编号------>顾客名称,顾客编号------>性别,顾客编号------>年龄,顾客编号------>证件号码,顾客编号------>号码。
从函数依赖图可以看出,该关系中不存在局部函数依赖、传递函数依赖,且只有顾客编号能够确定其它各项。
所以该关系是BCNF范式。
4.订购信息表〔订单号,图书编号,客户编号,购置数量,销售时间,销售日期,图书名称〕
函数依赖:
订单号--->客户编号,订单号--->购置数量,订单号--->销售时间,订单号--->销售日期,订单号--->图书名称,订单号---->图书编号,图书编号--->图书名称。
从函数依赖图可以看出,该关系中不存在局部函数依赖,但存在传递函数依赖〔订单号---->图书编号,图书编号--->图书名称〕故需对表进行分表:
分表一〔订单号,图书编号,客户编号,购置数量,销售时间,销售日期〕
分表二〔图书编号,图书名称〕
经过分表后,实现了关系中不存在局部函数依赖、传递函数依赖,所以改后的关系是第三范式。
5.管理员表〔管理员编号,管理员名称,性别,号码,密码,管理员级别〕
函数依赖:
管理员编号----->管理员名称,管理员编号----->性别,管理员编号----->号码,管理员编号----->密码,管理员编号----->管理员级别
从函数依赖图可以看出,该关系中不存在局部函数依赖、传递函数依赖,且只有管理员编号能够确定其它各项。
所以该关系是BCNF范式。
6.进货表〔图书编号,进货日期,进货数量,操作员,是否验收,折扣〕
函数依赖:
图书编号----->进货日期,图书编号----->进货数量,图书编号----->操作员,图书编号----->是否验收,图书编号----->折扣。
从函数依赖图可以看出,该关系中不存在局部函数依赖、传递函数依赖,且只有图书编号能够确定其它各项。
所以该关系是BCNF范式。
第五章、数据的实施与维护
5.1存储过程设计
因为在设计系统的时候,数据库信息的增、删、改以及查询都是用Java直接在java语句里面嵌套SQL语句来实现功能,在数据库中存储过程的设计主要是针对数据库平安性、图书信息模糊查找和数据库备份恢复这块。
存储过程名
功能
入口参数
权限
proc_role_grant
创立一般管理员角色
所要创立的角色名
系统管理员、一般管理员
proc_模糊查找
实现图书信息的模糊查找
查找的字符模式串
系统管理员、一般管理员
sq_backup
实现备份数据库
数据库名
系统管理员
—创立一般管理员角色
参数—所要创立的角色名
存储过程名:
proc_role_grant
createprocproc_role_grant@rnamevarchar(20)
as
begin
declare@sqlstrvarchar(255)--sql语句的字符串
set@sqlstr='createrole'+@rname+'authorizationdbo'
exec(@sqlstr)
set@sqlstr='grantselect,insert,update,deleteonbookinfoto'+@rname
exec(@sqlstr)
set@sqlstr='grantselect,insert,update,deleteonbooktypeto'+@rname
exec(@sqlstr)
set@sqlstr='grantselect,insert,update,deleteonbuyto'+@rname
exec(@sqlstr)
set@sqlstr='grantselect,insert,update,deleteonordertto'+@rname
exec(@sqlstr)
set@sqlstr='grantselect,insert,update,deleteonreaderto'+@rname
exec(@sqlstr)
set@sqlstr='denyselect,insert,update,deleteonoperatorto'+@rname
exec(@sqlstr)
end
go
—实现图书信息的模糊查找
参数—查找的字符模式串
存储过程名:
proc_模糊查找
代码如下:
createprocedureproc_模糊查找
@模式串varchar(20)
as
begin
declare@posionint
declare@svarchar(30),@stringvarchar(30)
set@posion=1--初始化,求字串的起始位置
set@s='%'
while@posion<=len(@模式串)--当位置大于模式串长度相等的时候,退出循环
begin
select@string=substring(@模式串,@posion,1)--取字串
set@s=@s+@string+'%'--连接字符串
set@posion=@posion+1
end
print@s
select*frombookinfowherebooknamelike@s
end
go
—实现备份数据库
参数—数据库名
存储过程名:
sq_backup
代码如下:
createprocsq_backup@db_namevarchar(20)
as
begin
declare@strsqlvarchar(255)
set@strsql='sp_addumpdevice''disk'','''+@db_name+'备份设备'',''d:
\'+@db_name+'备份设备.bak'''
exec(@strsql)
set@strsql='backupdatabase'+@db_name+'to'+@db_name+'备份设备withname='''+@db_name+'_'+convert(varchar,getdate(),120)+''''
exec(@strsql)
end
go
5.2触发器设计
触发器名
功能
类型
作用表
operator_insert
用户插入触发创立对应数据库用户,并授予相关权限
insert
用户表〔operator〕
bookinfo_insert
触发器实现插入一条图书信息,库存量自动加1
insert
图书表〔bookinfo〕
bookinfo_update
创立更新触发器,库存量为0时提醒管理员订购新书
update
图书表〔bookinfo〕
buy_insert
触发器实现销售带动图书表库存量修改
insert
销售表〔buy〕
ordert_insert
触发器实现新书订购来补充对应图书库存量
Insert
进货表〔ordert〕
表5-1
代码:
--用户插入触发创立对应登录名和数据库用户,并授予相关权限-----------
createtriggeroperator_insert
onoperatorforinsert
as
begin
declare@sqlstrvarchar(255)--sql语句的字符串
declare@typevarchar
(1),@namevarchar(20)
select@type=ytype,@name=ynamefrominserted
set@sqlstr='createuser'+@name+'forlogincgwwithdefault_schema=dbo'
exec(@sqlstr)
if@type='1'
begin
execsp_addrolemember'db_owner',@name
end
else
begin
if@type='2'
begin
execsp_addrolemember'Role_Emp',@name
end
else
rollback
end
end
go
--触发器插入一个图书信息,库存量自动加-------
createtriggerbookinfo_insert
onbookinfoforinsert
as
begin
declare@bookidvarchar(13)
select@bookid=book_idfrominserted
ifexists(select*frombookinfowherebook_id=@bookid)
updatebookinfosetinsum=insum+1wherebook_id=@bookid
else
updatebookinfosetinsum=1wherebook_id=@bookid
end
go
--创立更新触发器,库存量为时提醒管理员订购新书------
createtriggerbookinfo_update
onbookinfoforupdate
as
begin
declare@sumint
select@sum=insumfrominserted
if@sum=0
begin
print'这本书的库存缺乏了,请及时补充!
'
end
end
go
--触发器实现销售带动图书表库存量修改----
createtriggerbuy_insert
onbuyforinsert
as
begin
declare@bookidvarchar(13)
select@bookid=book_idfrominserted
updatebookinfosetinsum=insum-1wherebook_id=@bookid
end
go
--触发器实现新书订购来补充对应图书库存量---
createtriggerordert_insert
onordertforinsert
as
begin
declare@in_numint,@bkidvarchar(13)
select@in_num=number,@bkid=book_idfrominserted
updatebookinfosetinsum=insum+@in_numwherebook_id=@bkid
end
go
5.3程序的模块设计
图5-1
注释:
管理员登录,输入的登录名和密码与管理员表里面的信息进行匹配,当两者都匹配成功才进入管理员操作界面。
关键代码如下:
privateclassBookLoginActionimplementsActionListener{
publicvoidactionPerformed(finalActionEvente){
user=Business.check(username.getText(),
newString(password.getPassword()));//调用business方法
if(user.getName()!
=null){//判断用户名是否为null
try{
Mainframe=newMain();//登陆成功,创立一个主窗体
frame.setVisible(true);//设置其可见
BookLogin.this.setVisible(false);//设置登录窗体为不显示
}catch(Exceptionex){
ex.printStackTrace();
}
}else{
JOptionPane.showMessageDialog(null,
"请输入正确的用户名和密码!
");//弹出提示框
username.setText("");//设置用户名输入框为空
password.setText("");//设置密码输入框为空
}
}
}}
图5-2
注释:
在java中创立一个Main类来显示系统操作界面。
关键代码如下:
packagemain;
importjava.awt.BorderLayout;
importjava.awt.Dimension;
importjava.awt.Toolkit;
importjava.awt.event.ComponentAdapter;
importjava.awt.event.ComponentEvent;
//import.URL;
importjavax.swing.ImageIcon;
importjavax.swing.JButton;
importjavax.swing.JDesk