1、 数据库原理 课程设计 评语: 学 院 计算机工程 班 级 计算1013 姓 名 陈高伟 学 号 2010810070 成 绩 指导老师 林颖贤 2013年 1 月9日 目录 第一章 引言 2 1.1 课题研究背景与意义 2 1.2 本课题研究内容与目标 2 1.3 开发环境 2 1.4体系结构设计 2 第二章 需求分析 4 2.1 信息要求 4 2.2 处理要求. 4
2、 2.3 数据字典. 5 2.4 安全性和完整性要求. 7 第三章 概念结构设计 8 3.1 总ER图 8 第四章 逻辑结构设计 9 4.1 关系模型 9 4.2 数据模型优化 9 第五章 数据库的实施和维护 11 5.1 存储过程设计 11 5.2 触发器设计 12 5.3 模块设计 15 结术语 35 参考文献 35 第一章 引言 1.1 课题研究背景与意义 现如今图书销售行业发展迅速,大大小小的书店到处可见,特别是一些发展较大的书城采用大规模的连锁经营方式。随着规模的扩大传统的图书管理已经不能适应发展的需要。图书管理工作繁
3、琐,销售频繁,包含大量的信息数据,因此就需要一个完善的图书销售管理系统来实现对这些数据的有效管理。本系统主要任务就是对书店、图书、顾客、销售信息、查询进行统一管理,满足各类用户的需求。本系统在功能上要实现书店进货功能,图书统计功能,书店销售功能等。我通过对世面上的书城如新华书店和学校里的小书店进行了初步的了解,发现其业务主要是集中在对图书的管理和图书的销售上。对图书的管理工作量较大,采用手工的方式还容易出错,并且不能满足顾客对图书的详细的查询功能。本系统在设计中考虑和克服了上诉的诸多问题,增强了实用性。 1.2 本课题研究内容与目标 1.2.1 研究内容 本课题是通过SQL Ser
4、ver和相应的面相对象语言来制作一个面相书店用户的图书销售管理系统。 1.2.2 研究目标 本图书销售管理系统就是要求图书管理人员通过该系统对图书、顾客、管理员、购买信息等进行统一管理,从而实现功能上的销售图书、管理图书库存量、图书信息、顾客信息和用户信息以及相应信息查询。这就要求管理人员能够对数据库熟悉操作,简单的表查询、触发器的建立、存储过程的建立以及用户自定义函数的建立等等这些管理数据库的方法都能对图书馆里系统的管理起到事半功倍的效果。最后通过应用这些命令来建立一个完整的图书销售管理系统。 1.3开发环境 本图书销售管理系统的开发语言是JAVA,开发环境是MyEclipse 8
5、6,数据库采用SQL Server 2008。 1.4 体系结构设计 本次课程设计的图书销售管理系统采用了C/S体系结构设计,即采用了客户端和服务器,这里的客户端主要是应用程序界面,服务器是数据库后台。通过对前台界面的操作,来实现相应的对数据库信息的增、删、改功能,如果操作正确则将运行显示相应结果,对应修改后台数据库内容,信息一旦提交,将不能修改;前台页面也调用后台数据库编写好的存储过程和触发器,来实现操作,客户端也有很好的权限控制,这样是为了防止用户的恶意操作,比如说:在登录界面,只有密码和登录名都正确才能进入系统,并且不同的方式将进入不同的操作页面。 登陆
6、系统 登陆验证 y n 用户管理 提示错误 管理员信息 图书销售管理系统 一般用户信息 图书信息添加 图书信息管理 图书信息修改 进货管理 顾客信息添加 顾客信息管理 顾客信息修改 销售管理 关闭系统 退出 直接退出 第二章、需求分析 2.1 信息要求 图2-1 2.2 处理要求
7、 图书销售管理系统 用户登录 图书入库 信息 用户信息修改 用户信息添加 顾客信息修改 顾客信息添加 图书销售信息 图书信息查询 图书 信息删除 图书 信息添加 图书信息修改 2.3 数据字典 2.3.1数据项 2-1图书表 列名 中文名 数据类型 是否允许空 备注 Book_id 图书编号 varchar(13) 否 主键 Typeid 图书类型编号 varchar(13) 否 外键 Bookname 图书名称
8、 varchar(40) 否 Writer 作者 varchar(21) 否 Translator 翻译者 varchar(30) 是 Publisher 出版社 varchar(50) 是 Date 出版时间 Datetime 是 Price 价格 Money 是 Insum 库存量 Int 是 2-2 顾客表 列名 中文名 数据类型 是否允许空 备注
9、 Reader_id 顾客编号 varchar(13) 否 主键 kname 顾客姓名 varchar(10) 否 Sex 性别 varchar(2) 是 Age 年龄 Int 是 Identitycard 身份证号 varchar(30) 否 Tel 电话号码 varchar(50) 是 2-3购书信息表 列名 中文名 数据类型 是否允许空 备注 Id 订单编号 in
10、t 否 主键 Book_id 图书编号 varchar(13) 否 外键 Reader_id 顾客编号 varchar(13) 否 外键 Buynum 购买数量 int 是 默认为1 Buydate 购买日期 Datetime 否 默认为系统时间 Buybookname 图书姓名 varchar(40) 是 2-4管理员(用户)表 列名 中文名 数据类型 是否允许空 备注 Id 用户id Int 否 主键 Yname 管理员姓名 varc
11、har(20) 否 Sex 性别 varchar(2) 是 Tel 电话号码 varchar(12) 是 Ypassword 管理员密码 varchar(10) 是 Ytype 管理员权限 varchar(1) 是 2-5进货表 列名 中文名 数据类型 是否允许空 备注 Book_id 图书编号 varchar(13) 否 外键,唯一 Date 进货时间 Datetime 否 Number 进货量 I
12、nt 否 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,da
13、te,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 身份信息 系统管理员,一般管理员 应用系统
14、 登录名+密码 2 授权信息 应用系统 系统管理员,一般管理员 3 错误身份信息 应用系统 系统管理员,一般管理员 4 查询请求 系统管理员,一般管理员 应用系统 查询对象识别符(如book_id,reader_id等) 5 查询结果 应用系统 系统管理员,一般管理员 被查询对象具体信息 6 管理请求 系统管理员,一般管理员 应用系统 识别符(book_id等)+类型 7 管理结果信息 应用系统 系统管理员,一般管理员 被管理对象处理结果 8 非法请求 应用系统 系统管理员,一般管理员 非法请求提示信息 9 修改请
15、求 系统管理员,一般管理员 应用系统 被修改对象具体信息 2-6 数据流表 2.3.4、数据存储 图书表:用于存放图书信息; 顾客表:用于存放顾客信息; 购书信息表:用于存放图书销售报表; 管理员(用户)表:用于存放管理员信息; 进货表:用于存放图书进货信息; 图书类型表:用于存放图书类型信息。 2.4 安全性和完整性要求 2.4.1安全性 系统具有较高的安全性能,在SQLServer中定义存储过程及相应的触发器来区分系统管理员与一般管理员的权限,实现安全性。 系统管理员登入名和密码输入正确后可才可进入系统,而且只有系统管理员(书店店主)在数据库中添加了
16、一般管理员后,并且这些一般管理员登录名和密码的输入正确之后才能进入系统对销售系统进行操作,否则系统将拒绝用户的非法访问,以保证系统的安全,并且系统也控制了普通用户和系统管理员的权限,防止用户恶意操作或者不是故意的操作导致后台数据库的不一致。 2.4.1完整性 系统为了保证数据的完整性,在数据库里面写了许多触发器,比如当用户进行图书信息添加操作的时候,可以自动更改图书表里面的库存量;用户进行销售操作后通过触发器也可以修改图书表的对应图书的库存量等。据此来维护数据库的数据完整性,并且在进行用户界面交互操作的时候,会判断输入的信息,如果信息有误或者无意义,系统将拒绝对后台数据库的更改
17、因此系统具有很强的数据完整性。 第三章、概念结构设计 3.1总ER图 图3-1整体E-R图 第四章、逻辑结构设计 4.1 关系模型 图4-1 4.2数据模型优化 1.图书类型表(图书类型编号,图书类型名) 函数依赖:图书类型编号 -----> 图书类姓名 从函数依赖图可以看出,该关系中不存在部分函数依赖、传递函数依赖,且只有图书类型编号能
18、够确定其它各项。所以该关系是BCNF范式。 2.图书表(图书编号,图书类型编号,图书名称,作者名,译者名,出版社,出版日期,价钱,库存量) 函数依赖:图书编号------->图书名称, 图书编号----->作者名,图书编号----->译者名, 图书编号 ----->出版社,图书编号---->出版日期,图书编号---->价钱,图书编号---->库存量 从函数依赖图可以看出,该关系中不存在部分函数依赖、传递函数依赖,且只有图书编号能够确定其它各项。所以该关系是BCNF范式。 3. 顾客表(顾客编号,顾客名称,性别,年龄,证件号码,电话号码) 函数依赖:顾客编号------>顾客名称,
19、顾客编号------>性别,顾客编号------>年龄,顾客编号------>证件号码,顾客编号------>电话号码。 从函数依赖图可以看出,该关系中不存在部分函数依赖、传递函数依赖,且只有顾客编号能够确定其它各项。所以该关系是BCNF范式。 4. 订购信息表(订单号,图书编号,客户编号,购买数量,销售时间,销售日期,图书名称) 函数依赖:订单号--->客户编号,订单号--->购买数量,订单号--->销售时间,订单号--->销售日期,订单号--->图书名称,订单号---->图书编号,图书编号--->图书名称。 从函数依赖图可以看出,该关系中不存在部分函数依赖,但存在传递函
20、数依赖(订单号---->图书编号,图书编号--->图书名称)故需对表进行分表: 分表一(订单号,图书编号,客户编号,购买数量,销售时间,销售日期) 分表二(图书编号,图书名称) 经过分表后,实现了关系中不存在部分函数依赖、传递函数依赖,所以改后的关系是第三范式。 5. 管理员表(管理员编号,管理员名称,性别,电话号码,密码,管理员级别) 函数依赖:管理员编号----->管理员名称,管理员编号----->性别,管理员编号----->电话号码,管理员编号----->密码,管理员编号----->管理员级别 从函数依赖图可以看出,该关系中不存在部分函数依赖、传递函数依赖,且只有
21、管理员编号能够确定其它各项。所以该关系是BCNF范式。 6.进货表(图书编号,进货日期,进货数量,操作员,是否验收,折扣) 函数依赖:图书编号----->进货日期,图书编号----->进货数量,图书编号----->操作员,图书编号----->是否验收,图书编号----->折扣。 从函数依赖图可以看出,该关系中不存在部分函数依赖、传递函数依赖,且只有图书编号能够确定其它各项。所以该关系是BCNF范式。 第五章、数据的实施与维护 5.1存储过程设计 因为在设计系统的时候,数据库信息的增、删、改以及查
22、询都是用Java直接在java语句里面嵌套SQL语句来实现功能,在数据库中存储过程的设计主要是针对数据库安全性、图书信息模糊查找和数据库备份恢复这块。 存储过程名 功能 入口参数 权限 proc_role_grant 创建一般管理员角色 所要创建的角色名 系统管理员、一般管理员 proc_模糊查找 实现图书信息的模糊查找 查找的字符模式串 系统管理员、一般管理员 sq_backup 实现备份数据库 数据库名 系统管理员 1.功能—创建一般管理员角色 参数—所要创建的角色名 存储过程名:proc_role_grant create pr
23、oc proc_role_grant @rname varchar(20) as begin declare @sqlstr varchar(255) --sql语句的字符串 set @sqlstr='create role '+@rname+' authorization dbo' exec (@sqlstr) set @sqlstr='grant select,insert,update,delete on bookinfo to '+@rname exec (@sqlstr) set @sqlstr='grant select,insert,update,delete
24、on booktype to '+@rname exec (@sqlstr) set @sqlstr='grant select,insert,update,delete on buy to '+@rname exec (@sqlstr) set @sqlstr='grant select,insert,update,delete on ordert to '+@rname exec (@sqlstr) set @sqlstr='grant select,insert,update,delete on reader to '+@rname exec (@sqlstr) s
25、et @sqlstr='deny select,insert,update,delete on operator to '+@rname exec (@sqlstr) end go 2.功能—实现图书信息的模糊查找 参数—查找的字符模式串 存储过程名:proc_模糊查找 代码如下: create procedure proc_模糊查找 @模式串 varchar(20) as begin declare @posion int declare @s varchar(30),@string varchar(30) set @posion=
26、1--初始化,求字串的起始位置 set @s='%' while @posion<=len(@模式串)--当位置大于模式串长度相等的时候,退出循环 begin select @string=substring(@模式串,@posion,1)--取字串 set @s=@s+@string+'%'--连接字符串 set @posion=@posion+1 end print @s select * from bookinfo where bookname like @s end go 3.功能—实现备份数据库
27、 参数—数据库名 存储过程名:sq_backup 代码如下: create proc sq_backup @db_name varchar(20) as begin declare @strsql varchar(255) set @strsql='sp_addumpdevice ''disk'','''+@db_name+'备份设备'',''d:\'+@db_name+'备份设备.bak''' exec (@strsql) set @strsql='backup database '+@db_name+' to '+@db_name+'备份设备with n
28、ame='''+@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 图书表(bo
29、okinfo) buy_insert 触发器实现销售带动图书表库存量修改 insert 销售表(buy) ordert_insert 触发器实现新书订购来补充对应图书库存量 Insert 进货表(ordert) 表5-1 代码: --用户插入触发创建对应登录名和数据库用户,并授予相关权限----------- create trigger operator_insert on operator for insert as begin declare @sqlstr varchar(255) --sql语
30、句的字符串 declare @type varchar(1),@name varchar(20) select @type=ytype,@name=yname from inserted set @sqlstr='create user '+@name+' for login cgw with default_schema=dbo' exec (@sqlstr) if @type='1' begin exec sp_addrolemember 'db_owner',@name end else begin if @type='2' begin
31、exec sp_addrolemember 'Role_Emp',@name end else rollback end end go --触发器插入一个图书信息,库存量自动加------- create trigger bookinfo_insert on bookinfo for insert as begin declare @bookid varchar(13) select @bookid=book_id from inserted if exists(select * from bookinfo where book_id=@boo
32、kid) update bookinfo set insum=insum+1 where book_id=@bookid else update bookinfo set insum=1 where book_id=@bookid end go --创建更新触发器,库存量为时提醒管理员订购新书------ create trigger bookinfo_update on bookinfo for update as begin declare @sum int select @sum=insum from inserted if @sum=0
33、 begin print '这本书的库存不足了,请及时补充!' end end go --触发器实现销售带动图书表库存量修改---- create trigger buy_insert on buy for insert as begin declare @bookid varchar(13) select @bookid=book_id from inserted update bookinfo set insum=insum-1 where book_id=@bookid end go --触发器实现新书订购来补充对应图书库存量
34、 create trigger ordert_insert on ordert for insert as begin declare @in_num int,@bkid varchar(13) select @in_num=number,@bkid=book_id from inserted update bookinfo set insum=insum+@in_num where book_id=@bkid end go 5.3 程序的模块设计 图5-1 注释:管理员登录,输入的登录名和密码与管理员表里面的
35、信息进行匹配,当两者都匹配成功才进入管理员操作界面。 关键代码如下: private class BookLoginAction implements ActionListener { public void actionPerformed(final ActionEvent e) { user = Business.check(username.getText(), new String(password.getPassword()));//调用business方法 if (user.getName() != null) {//判断用户名是否为null
36、 try { Main frame = new Main();//登陆成功,创建一个主窗体 frame.setVisible(true);//设置其可见 BookLogin.this.setVisible(false);//设置登录窗体为不显示 } catch (Exception ex) { ex.printStackTrace(); } } else { JOptionPane.showMessageDialog(null, "请输入正确的用户名和密码!");//弹出提示框
37、 username.setText("");//设置用户名输入框为空 password.setText("");//设置密码输入框为空 } } } } 图5-2 注释:在java中创建一个Main类来显示系统操作界面。 关键代码如下: package main; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ComponentAdapter; import java.awt.ev
38、ent.ComponentEvent; //import .URL; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing
39、JToolBar; import javax.swing.UIManager; import javax.swing.WindowConstants; import javax.swing.border.BevelBorder; import form.BookLogin; import tool.Icon; /** * 主窗体 * */ public class Main extends JFrame { private static final JDesktopPane DESKTOP_PANE = new JDesktopPane()
40、//桌面窗体 public static void main(String[] args) { //入口方法 try { UIManager.setLookAndFeel(UIManager .getSystemLookAndFeelClassName());//设置系统界面外观 new BookLogin();//登录窗口 } catch (Exception ex) { ex.printStackTrace(); } } public static void addIFame(JInternalFrame ifram
41、e) { // 添加子窗体的方法 DESKTOP_PANE.add(iframe); //新增子窗体 } public Main() { super(); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);////设置关闭按钮处理事件 Toolkit tool = Toolkit.getDefaultToolkit(); //获得默认的工具箱? Dimension screenSize = tool.getScreenSize(); //获得屏幕的大小 setSize(800,
42、600); //设置窗体大小 setLocation((screenSize.width - getWidth()) / 2, (screenSize.height - getHeight()) / 2); //设置窗体位置 setTitle("图书销售管理系统"); //设置窗体标题 JMenuBar menuBar = createMenu(); //调用创建菜单栏的方法 setJMenuBar(menuBar); //设置菜单栏 JToolBar toolBar = createToolBar(); //
43、 调用创建工具栏的方法 getContentPane().add(toolBar, BorderLayout.NORTH);//设置工具栏 final JLabel label = new JLabel(); //创建一个标签,用来显示图片 label.setBounds(0, 0, 0, 0); //设置窗体的大小和位置 label.setIcon(null); // 窗体背景 DESKTOP_PANE.addComponentListener(new ComponentAdapter() { public void componentResized(
44、final ComponentEvent e) {
Dimension size = e.getComponent().getSize();//获得组件大小
label.setSize(e.getComponent().getSize());//设置标签大小
label.setText("
45、'>");//设置标签文本,设置窗口背景
}
});
DESKTOP_PANE.add(label,new Integer(Integer.MIN_VALUE));//将标签添加到桌面窗体?
getContentPane().add(DESKTOP_PANE);//将桌面窗体添加到主窗体中
}
/**
* 创建工具栏
*
* @return JToolBar
*/
private JToolBar createToolBar() { // 创建工具栏的方法
JToolBar toolBar = new JToo
46、lBar(); //初始化工具栏 toolBar.setFloatable(false); //设置是否可以移动工具栏 toolBar.setBorder(new BevelBorder(BevelBorder.RAISED));//设置边框 JButton bookAddButton=new JButton(MenuActions.BOOK_ADD);//图书信息添加按钮 ImageIcon icon=new ImageIcon(Main.class.getResource("/bookAddtb.jpg"));//添加菜单栏图标
47、 bookAddButton.setIcon(icon);//设置按钮图标 bookAddButton.setHideActionText(true);//显示提示文本 toolBar.add(bookAddButton);//添加到工具栏中 JButton bookModiAndDelButton=new JButton(MenuActions.BOOK_MODIFY);//图书信息修改按钮 ImageIcon bookmodiicon=Icon.add("bookModiAndDeltb.jpg");//创建图标方法 bookModiAndDelBut
48、ton.setIcon(bookmodiicon);//设置按钮图标 bookModiAndDelButton.setHideActionText(true);//显示提示文本 toolBar.add(bookModiAndDelButton);//添加到工具栏中 //////////////////////////////////////////////////////////////////////////////////////////// JButton bookTypeAddButton=new JButton(MenuActions.BOOKTYPE_ADD
49、);//图书类别添加按钮 ImageIcon bookTypeAddicon=Icon.add("bookTypeAddtb.jpg");//创建图标方法 bookTypeAddButton.setIcon(bookTypeAddicon);//设置按钮图标 bookTypeAddButton.setHideActionText(true);//显示提示文本 toolBar.add(bookTypeAddButton);//添加到工具栏中 JButton bookBorrowButton=new JButton(MenuActions.BORROW); //图书借阅按钮 ImageIcon bookBorrowicon=Icon.add("bookBorrowtb.jpg");//创建图标方法 bookBorrowButton.setIcon(bookBorrowicon);//设置按钮图标 bookBorrowButton.setHideActionText(true);//显示提示文本 toolBar.add(bookBorrowButton);//添加到工具栏中 JButton bookOrderButton=new JButton(MenuActions.NEWBOOK_ORDER






