《图书销售系统.docx》由会员分享,可在线阅读,更多相关《图书销售系统.docx(36页珍藏版)》请在三一办公上搜索。
1、集美大学计算机工程学院数据库原理 课程设计评语: 学 院 计算机工程 班 级 计算1013 姓 名 陈高伟 学 号 2010810070 成 绩 指导老师 林颖贤 2013年 1 月9日目录第一章 引言21.1 课题研究背景与意义21.2 本课题研究内容与目标21.3 开发环境21.4体系结构设计2第二章 需求分析42.1 信息要求42.2 处理要求.42.3 数据字典.52.4 安全性和完整性要求.7第三章 概念结构设计83.1 总图8第四章逻辑结构设计94.1 关系模型94.2 数据模型优化9第五章 数据库的实施和维护115.1 存储过程设计115.2 触发器设计125.3模块设计15结术
2、语35参考文献35第一章 引言1.1 课题研究背景与意义现如今图书销售行业发展迅速,大大小小的书店到处可见,特别是一些发展较大的书城采用大规模的连锁经营方式。随着规模的扩大传统的图书管理已经不能适应发展的需要。图书管理工作繁琐,销售频繁,包含大量的信息数据,因此就需要一个完善的图书销售管理系统来实现对这些数据的有效管理。本系统主要任务就是对书店、图书、顾客、销售信息、查询进行统一管理,满足各类用户的需求。本系统在功能上要实现书店进货功能,图书统计功能,书店销售功能等。我通过对世面上的书城如新华书店和学校里的小书店进行了初步的了解,发现其业务主要是集中在对图书的管理和图书的销售上。对图书的管理工
3、作量较大,采用手工的方式还容易出错,并且不能满足顾客对图书的详细的查询功能。本系统在设计中考虑和克服了上诉的诸多问题,增强了实用性。1.2 本课题研究内容与目标 1.2.1 研究内容本课题是通过SQL Server和相应的面相对象语言来制作一个面相书店用户的图书销售管理系统。1.2.2 研究目标 本图书销售管理系统就是要求图书管理人员通过该系统对图书、顾客、管理员、购买信息等进行统一管理,从而实现功能上的销售图书、管理图书库存量、图书信息、顾客信息和用户信息以及相应信息查询。这就要求管理人员能够对数据库熟悉操作,简单的表查询、触发器的建立、存储过程的建立以及用户自定义函数的建立等等这些管理数据
4、库的方法都能对图书馆里系统的管理起到事半功倍的效果。最后通过应用这些命令来建立一个完整的图书销售管理系统。1.3开发环境本图书销售管理系统的开发语言是JAVA,开发环境是MyEclipse 8.6,数据库采用SQL Server 2008。 1.4 体系结构设计 本次课程设计的图书销售管理系统采用了C/S体系结构设计,即采用了客户端和服务器,这里的客户端主要是应用程序界面,服务器是数据库后台。通过对前台界面的操作,来实现相应的对数据库信息的增、删、改功能,如果操作正确则将运行显示相应结果,对应修改后台数据库内容,信息一旦提交,将不能修改;前台页面也调用后台数据库编写好的存储过程和触发器,来实现
5、操作,客户端也有很好的权限控制,这样是为了防止用户的恶意操作,比如说:在登录界面,只有密码和登录名都正确才能进入系统,并且不同的方式将进入不同的操作页面。登陆系统登陆验证yn用户管理提示错误管理员信息图书销售管理系统一般用户信息图书信息添加图书信息管理图书信息修改进货管理顾客信息添加顾客信息管理顾客信息修改销售管理关闭系统退出直接退出 第二章、需求分析2.1 信息要求 图2-12.2 处理要求图书销售管理系统用户登录图书入库信息用户信息修改用户信息添加顾客信息修改顾客信息添加图书销售信息图书信息查询图书信息删除图书信息添加图书信息修改2.3 数据字典 2.3.1数据项 2-1图书表列名 中文名
6、 数据类型是否允许空 备注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性别
7、varchar(2) 是Age年龄Int 是Identitycard身份证号 varchar(30) 否 Tel电话号码 varchar(50) 是 2-3购书信息表列名 中文名 数据类型是否允许空 备注Id订单编号 int 否主键Book_id图书编号 varchar(13) 否外键Reader_id顾客编号 varchar(13) 否外键Buynum购买数量 int 是默认为1Buydate购买日期Datetime否默认为系统时间Buybookname图书姓名 varchar(40) 是 2-4管理员(用户)表列名 中文名 数据类型是否允许空 备注Id用户idInt 否主键Yname管理员
8、姓名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) 否主键Type
9、name图书类型名称 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,
10、zk);图书类型表(id,typename)。2.3.3、数据流编号名称来源去向组成1身份信息系统管理员,一般管理员应用系统登录名+密码2授权信息应用系统系统管理员,一般管理员3错误身份信息应用系统系统管理员,一般管理员4查询请求系统管理员,一般管理员应用系统查询对象识别符(如book_id,reader_id等)5查询结果应用系统系统管理员,一般管理员被查询对象具体信息6管理请求系统管理员,一般管理员应用系统识别符(book_id等)+类型7管理结果信息应用系统系统管理员,一般管理员被管理对象处理结果8非法请求应用系统系统管理员,一般管理员非法请求提示信息9修改请求系统管理员,一般管理员应用
11、系统被修改对象具体信息2-6 数据流表 2.3.4、数据存储图书表:用于存放图书信息;顾客表:用于存放顾客信息;购书信息表:用于存放图书销售报表;管理员(用户)表:用于存放管理员信息;进货表:用于存放图书进货信息;图书类型表:用于存放图书类型信息。2.4 安全性和完整性要求2.4.1安全性系统具有较高的安全性能,在SQLServer中定义存储过程及相应的触发器来区分系统管理员与一般管理员的权限,实现安全性。 系统管理员登入名和密码输入正确后可才可进入系统,而且只有系统管理员(书店店主)在数据库中添加了一般管理员后,并且这些一般管理员登录名和密码的输入正确之后才能进入系统对销售系统进行操作,否则
12、系统将拒绝用户的非法访问,以保证系统的安全,并且系统也控制了普通用户和系统管理员的权限,防止用户恶意操作或者不是故意的操作导致后台数据库的不一致。 2.4.1完整性 系统为了保证数据的完整性,在数据库里面写了许多触发器,比如当用户进行图书信息添加操作的时候,可以自动更改图书表里面的库存量;用户进行销售操作后通过触发器也可以修改图书表的对应图书的库存量等。据此来维护数据库的数据完整性,并且在进行用户界面交互操作的时候,会判断输入的信息,如果信息有误或者无意义,系统将拒绝对后台数据库的更改,因此系统具有很强的数据完整性。 第三章、概念结构设计3.1总ER图图3-1整体E-R图 第四章、逻辑结构设计
13、.1 关系模型 图4-142数据模型优化1.图书类型表(图书类型编号,图书类型名)函数依赖:图书类型编号 - 图书类姓名从函数依赖图可以看出,该关系中不存在部分函数依赖、传递函数依赖,且只有图书类型编号能够确定其它各项。所以该关系是BCNF范式。2.图书表(图书编号,图书类型编号,图书名称,作者名,译者名,出版社,出版日期,价钱,库存量)函数依赖:图书编号-图书名称, 图书编号-作者名,图书编号-译者名, 图书编号 -出版社,图书编号-出版日期,图书编号-价钱,图书编号-库存量从函数依赖图可以看出,该关系中不存在部分函数依赖、传递函数依赖,且只有图书编号能够确定其它各项。所以该关系是BCNF范
14、式。3. 顾客表(顾客编号,顾客名称,性别,年龄,证件号码,电话号码)函数依赖:顾客编号-顾客名称,顾客编号-性别,顾客编号-年龄,顾客编号-证件号码,顾客编号-电话号码。从函数依赖图可以看出,该关系中不存在部分函数依赖、传递函数依赖,且只有顾客编号能够确定其它各项。所以该关系是BCNF范式。4. 订购信息表(订单号,图书编号,客户编号,购买数量,销售时间,销售日期,图书名称)函数依赖:订单号-客户编号,订单号-购买数量,订单号-销售时间,订单号-销售日期,订单号-图书名称,订单号-图书编号,图书编号-图书名称。 从函数依赖图可以看出,该关系中不存在部分函数依赖,但存在传递函数依赖(订单号-图
15、书编号,图书编号-图书名称)故需对表进行分表:分表一(订单号,图书编号,客户编号,购买数量,销售时间,销售日期)分表二(图书编号,图书名称)经过分表后,实现了关系中不存在部分函数依赖、传递函数依赖,所以改后的关系是第三范式。5. 管理员表(管理员编号,管理员名称,性别,电话号码,密码,管理员级别)函数依赖:管理员编号-管理员名称,管理员编号-性别,管理员编号-电话号码,管理员编号-密码,管理员编号-管理员级别 从函数依赖图可以看出,该关系中不存在部分函数依赖、传递函数依赖,且只有管理员编号能够确定其它各项。所以该关系是BCNF范式。6.进货表(图书编号,进货日期,进货数量,操作员,是否验收,折
16、扣)函数依赖:图书编号-进货日期,图书编号-进货数量,图书编号-操作员,图书编号-是否验收,图书编号-折扣。从函数依赖图可以看出,该关系中不存在部分函数依赖、传递函数依赖,且只有图书编号能够确定其它各项。所以该关系是BCNF范式。 第五章、数据的实施与维护51存储过程设计 因为在设计系统的时候,数据库信息的增、删、改以及查询都是用Java直接在java语句里面嵌套SQL语句来实现功能,在数据库中存储过程的设计主要是针对数据库安全性、图书信息模糊查找和数据库备份恢复这块。存储过程名功能入口参数权限proc_role_grant创建一般管理员角色所要创建的角色名系统管理员、一般管理员proc_模糊
17、查找实现图书信息的模糊查找查找的字符模式串系统管理员、一般管理员sq_backup实现备份数据库数据库名系统管理员 1.功能创建一般管理员角色 参数所要创建的角色名 存储过程名:proc_role_grantcreate proc proc_role_grant rname varchar(20)asbegindeclare sqlstr varchar(255) -sql语句的字符串set sqlstr=create role +rname+ authorization dboexec (sqlstr)set sqlstr=grant select,insert,update,delete
18、on bookinfo to +rnameexec (sqlstr) set sqlstr=grant select,insert,update,delete on booktype to +rnameexec (sqlstr) set sqlstr=grant select,insert,update,delete on buy to +rnameexec (sqlstr) set sqlstr=grant select,insert,update,delete on ordert to +rnameexec (sqlstr) set sqlstr=grant select,insert,u
19、pdate,delete on reader to +rnameexec (sqlstr)set sqlstr=deny select,insert,update,delete on operator to +rnameexec (sqlstr)endgo2.功能实现图书信息的模糊查找 参数查找的字符模式串 存储过程名:proc_模糊查找 代码如下:create procedure proc_模糊查找模式串 varchar(20)as begin declare posion int declare s varchar(30),string varchar(30) set posion=1-初
20、始化,求字串的起始位置 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 go3.功能实现备份数据库 参数数据库名 存储过程名:sq_backup 代码如下:create proc sq_backup db_name varchar(20)as
21、begindeclare strsql varchar(255)set strsql=sp_addumpdevice disk,+db_name+备份设备,d:+db_name+备份设备.bakexec (strsql)set strsql=backup database +db_name+ to +db_name+备份设备with name=+db_name+_+convert(varchar,getdate(),120)+exec (strsql)endgo52 触发器设计 触发器名功能类型作用表operator_insert用户插入触发创建对应数据库用户,并授予相关权限insert用户表
22、(operator)bookinfo_insert触发器实现插入一条图书信息,库存量自动加1insert图书表(bookinfo)bookinfo_update创建更新触发器,库存量为0时提醒管理员订购新书update图书表(bookinfo)buy_insert触发器实现销售带动图书表库存量修改insert销售表(buy)ordert_insert触发器实现新书订购来补充对应图书库存量Insert进货表(ordert) 表5-1代码:-用户插入触发创建对应登录名和数据库用户,并授予相关权限-create trigger operator_inserton operator for inser
23、t asbegindeclare sqlstr varchar(255) -sql语句的字符串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=dboexec (sqlstr)if type=1begin exec sp_addrolemember db_owner,nameendelse beginif type=2 begin exec sp_ad
24、drolemember Role_Emp,name endelse rollbackendendgo -触发器插入一个图书信息,库存量自动加-create trigger bookinfo_inserton bookinfo for insertasbegin declare bookid varchar(13)select bookid=book_id from insertedif exists(select * from bookinfo where book_id=bookid) update bookinfo set insum=insum+1 where book_id=booki
25、delse update bookinfo set insum=1 where book_id=bookidendgo-创建更新触发器,库存量为时提醒管理员订购新书-create trigger bookinfo_updateon bookinfo for updateasbegin declare sum intselect sum=insum from insertedif sum=0 begin print 这本书的库存不足了,请及时补充! endendgo-触发器实现销售带动图书表库存量修改-create trigger buy_inserton buy for insertasbeg
26、indeclare bookid varchar(13)select bookid=book_id from insertedupdate bookinfo set insum=insum-1 where book_id=bookid endgo-触发器实现新书订购来补充对应图书库存量-create trigger ordert_inserton ordert for insertasbegindeclare in_num int,bkid varchar(13)select in_num=number,bkid=book_id from insertedupdate bookinfo set
27、 insum=insum+in_num where book_id=bkid endgo 53 程序的模块设计 图5-1注释:管理员登录,输入的登录名和密码与管理员表里面的信息进行匹配,当两者都匹配成功才进入管理员操作界面。关键代码如下:private class BookLoginAction implements ActionListener public void actionPerformed(final ActionEvent e) user = Business.check(username.getText(), new String(password.getPassword();
28、/调用business方法if (user.getName() != null) /判断用户名是否为nulltry Main frame = new Main();/登陆成功,创建一个主窗体frame.setVisible(true);/设置其可见BookLogin.this.setVisible(false);/设置登录窗体为不显示 catch (Exception ex) ex.printStackTrace(); else JOptionPane.showMessageDialog(null, 请输入正确的用户名和密码!);/弹出提示框username.setText();/设置用户名输
29、入框为空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.event.ComponentEvent;/import .URL;import javax.swing.ImageIcon;import javax.swing
30、.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.JToolBar;import javax.swing.UIManager;import javax.swing.WindowConstants;import javax.swing.border.Be
31、velBorder;import form.BookLogin;import tool.Icon;/* * 主窗体 * */public class Main extends JFrame private static final JDesktopPane DESKTOP_PANE = new JDesktopPane();/桌面窗体public static void main(String args) /入口方法try UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName();/设置系统界面外观new BookLo
32、gin();/登录窗口 catch (Exception ex) ex.printStackTrace();public static void addIFame(JInternalFrame iframe) / 添加子窗体的方法DESKTOP_PANE.add(iframe);/新增子窗体public Main() super();setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);/设置关闭按钮处理事件Toolkit tool = Toolkit.getDefaultToolkit();/获得默认的工具箱?Dimension sc
33、reenSize = tool.getScreenSize();/获得屏幕的大小setSize(800, 600);/设置窗体大小setLocation(screenSize.width - getWidth() / 2,(screenSize.height - getHeight() / 2);/设置窗体位置setTitle(图书销售管理系统);/设置窗体标题JMenuBar menuBar = createMenu(); /调用创建菜单栏的方法setJMenuBar(menuBar);/设置菜单栏JToolBar toolBar = createToolBar(); / 调用创建工具栏的方
34、法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(final ComponentEvent e) Dimension size = e.
35、getComponent().getSize();/获得组件大小label.setSize(e.getComponent().getSize();/设置标签大小label.setText();/设置标签文本,设置窗口背景);DESKTOP_PANE.add(label,new Integer(Integer.MIN_VALUE);/将标签添加到桌面窗体?getContentPane().add(DESKTOP_PANE);/将桌面窗体添加到主窗体中/* * 创建工具栏 * * return JToolBar */private JToolBar createToolBar() / 创建工具栏的
36、方法JToolBar toolBar = new JToolBar();/初始化工具栏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);/添加菜单栏图标bookAddButton.set
37、Icon(icon);/设置按钮图标bookAddButton.setHideActionText(true);/显示提示文本toolBar.add(bookAddButton);/添加到工具栏中JButton bookModiAndDelButton=new JButton(MenuActions.BOOK_MODIFY);/图书信息修改按钮ImageIcon bookmodiicon=Icon.add(bookModiAndDeltb.jpg);/创建图标方法bookModiAndDelButton.setIcon(bookmodiicon);/设置按钮图标bookModiAndDelBu
38、tton.setHideActionText(true);/显示提示文本toolBar.add(bookModiAndDelButton);/添加到工具栏中/JButton bookTypeAddButton=new JButton(MenuActions.BOOKTYPE_ADD);/图书类别添加按钮ImageIcon bookTypeAddicon=Icon.add(bookTypeAddtb.jpg);/创建图标方法bookTypeAddButton.setIcon(bookTypeAddicon);/设置按钮图标bookTypeAddButton.setHideActionText(t
39、rue);/显示提示文本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.