资源描述
目 录
[摘要] ………………………………………………………………………………1
引言 ………………………………………………………………………………1
一、 需求分析 …………………………………………………………………2
1.系统总功能 …………………………………………………………………2
2. 数据字典 …………………………………………………………………5
3.系统总体框图…………………………………………………………………7
二、 概念设计 …………………………………………………………………8
1.系统E-R图……………………………………………………………………8
2.各表详细设计…………………………………………………………………10
三、 逻辑设计 …………………………………………………………………12
1.实体属性设计 …………………………………………………………12
2.插入测试数据 …………………………………………………………13
3.存储过程及触发器 …………………………………………………………13
4.与数据库连接 ……………………………………………………………17
5.java界面设计 ……………………………………………………………18
四、 心得体会 ………………………………………………………………24
一、 需求分析
(1).图书销售管理系统总功能包括以下几点:
a.录入图书信息功能
b.录入书店信息功能
c.录入顾客信息功能
d.录入供货商功能
e.订购图书相关功能
f.退货订购图书相关功能
g.进货相关功能
h.退货相关功能
i.统计相关功能
(2).数据描述
a.系统数据流图如下所示:
1、 系统顶层数据流图:
图:1-1
2、 系统1层数据流图:
图:1-2
b.数据项:
数据项名
数据类型
取值范围
数据含义
逻辑关系
图书编号(ISBN)
varchar
0-13
图书编号
主键
出版社(Bpress)
char
0-60
出版社
单价(Bprice)
float
图书的单价
图书名字(Bname)
char
0-60
图书的名字
作者(Bauther)
char
0-60
图书的作者
数量(Bnum)
int
库存量
顾客编号(Cno)
varchar
0-13
顾客编号
主键
顾客名字(Cname)
char
0-60
顾客名字
顾客地址(Cadd)
char
0-60
顾客地址
顾客电话(Ctel)
char
0-60
顾客电话
书店编号(Sno)
Varchar
0-13
图书编号
主键
书店名字(Sname)
Char
0-60
图书名字
书店地址(Sadd)
char
0-60
书店地址
书店电话(Stel)
char
0-60
书店电话
供货商编号(Pno)
varchar
0-13
顾客编号
主键
供货商姓名(Pname)
char
0-60
顾客姓名
供货商地址(Padd)
char
0-60
顾客地址
供货商电话(Ptel)
char
0-60
顾客电话
订单号(Ono)
varchar
0-13
订单号
主键
图书编号(ISBN)
varchar
0-13
外键
图书名字(Bname)
char
0-60
外键
顾客编号(Cno)
Varchar
0-13
外键
书店编号(Sno)
varchar
0-13
外键
订购数量(Oname)
int
订购数量
订购价格(Oprice)
float
订购价格
退书号(Rno)
Varchar
0-13
退书号
主键
图书编号(ISBN)
Varchar
0-13
外键
图书名字(Bname)
char
0-60
外键
顾客编号(Cno)
varchar
0-13
外键
书店编号(Sno)
varchar
0-13
外键
退书数量(Rnum)
Int
退书数量
退书价格(Rprice)
float
退书价格
进货编号(Jno)
varchar
0-13
进货编号
主键
供应商编号(Pno)
Varchar
0-13
外键
进货数量(Jnum)
int
进货数量
进货金额(Jprice)
float
进货价格
退货编号(Tno)
varchar
0-13
退货编号
主键
供应商编号(Pno)
varchar
0-13
供应商编号
外键
退货数量(Tnum)
int
退货数量
退货金额(Tprice)
float
退货价格
统计编号(Ano)
varchar
0-13
统计单编号
主键
图书编号(ISBN)
Varchar
0-13
外键
图书名字(Bname)
char
0-60
外键
库存数量(Bnum)
int
图书数量
外键
销售数量(Anum)
Int
销售数量
c.描述相关的数据字典
1.数据结构及数据项
数据结构:book
含义说明:图书信息表
组 成:图书编号,出版社,单价,图书名字,作者,数量
数 据 项:ISBN
含义说明:唯一标识用户
类型: varchar
长度: 13
取值范围:0到13
取值含义:
与其他数据项的逻辑关系:
数 据 项:Bpress
含义说明:出版社
类型: char
长度: 60
取值范围:
取值含义:
与其他数据项的逻辑关系:
数 据 项: Bprice
含义说明:单价
类型: int
长度:
取值范围:
取值含义:
与其他数据项的逻辑关系:
数 据 项: Bname
含义说明:图书名字
类型: char
长度: 60
取值范围:
取值含义:
与其他数据项的逻辑关系:
数 据 项: Bauther
含义说明:作者
类型: char
长度: 60
取值范围:
取值含义:
与其他数据项的逻辑关系:
数据结构:customer
含义说明:顾客信息表
组 成:顾客编号,姓名,地址,电话
数 据 项:Cno
含义说明:唯一标识用户
类型: varchar
长度: 13
取值范围:0到13
取值含义:
与其他数据项的逻辑关系:
数 据 项:Cname
含义说明:顾客姓名
类型: char
长度: 60
取值范围:
取值含义:
与其他数据项的逻辑关系:
数 据 项: Cadd
含义说明:地址
类型: char
长度:
取值范围:
取值含义:
与其他数据项的逻辑关系:
数 据 项: Ctel
含义说明:电话
类型: char
长度: 60
取值范围:
取值含义:
与其他数据项的逻辑关系:
2.数据流
数据流:订单数据
说明:
数据流来源:客户
数据流去向:订单处理
组成:
平均流量:
高峰期流量:
数据流:出库数据流
说明:
数据流来源:仓库
数据流去向:统计
组成:
平均流量:
高峰期流量:
3.处理过程
(1) 库存查询
加工逻辑:根据要查询的库存信息,检索出库存信息明细表
输入流:库存信息查询,发出库存信息请求
输出流:库存信息清单,进货信息请求
(2) 销售信息更新
加工逻辑:根据销售信息更细销售清单
输入流:前台销售信息,库存信息
输出流:更新库存清单
(3) 进货查询
加工逻辑:根据要查询的进货信息,检索出进货信息明细表
输入流:进货信息查询,发出进货/进货清单查询
输出流:库存信息清单,已进货信息,新供货商信息,进货单信息清单,进货单,进货信息请求,进货/进货清单检索结果
(4) 进货更新
加工逻辑:根据进货信息更新进货清单
输入流:进货信息请求,进货单
输出流:发出进货/进货清单查询
(5) 供货商查询
加工逻辑:根据输入要查询的职工信息或供货商信息,检索出相应的结果
输入流:职工信息查询,供货商信息查询,发出职工/供货商清单查询
输出流:已有供货商信息,供货商信息清单,职工信息清单,职工/供货商清单检索结果
(8)供货商更新
加工逻辑:根据输入的职工信息或新供货商信息更新相应的职工清单或供货商清单
输入流:职工信息,新供货商信息清单,职工/供货商清单检索结果
(3).系统设计总体框图:
图书销售管理系统
书 店
库存管理
订购图书
退货订购图书
销售管理
供货商管理
供货单位
图书名称
购货人员
库存增加
进购图书
退货订购图书
库存减少
销售订购图书
退货图书
统计库存图书
顾 客
统计销售图书
图:1-3
电话
二、概念设计
(1).系统E-R图:
顾 客
图 书
供货商
书 店
订购
退书
进货
姓名啊
地址
书名
书编号
作者
单价
编号
姓名
m
n
m
m
书名
电话
书编号
出版社
属于
退货
地址
数量
书编号
书名
退货数量
退货金额
进货数量
进货金额
电话
库存图书量
顾客编号
书店编号
店名
书店地址
订购数量
订购价格
退书价格
退书数量
n
n
n
m
n
m
销售数量
(2).各表及数据库详细设计:
新建数据库:
create datebase book_sales
go
use book_sales
新建表:
图书信息表:
create table book(
ISBN varchar(13)primary key,
Bpress char(60),
Bprice float,
Bname char(60),
Bauther char(60),
Bnum int
);
顾客信息表:
create table customer(
Cno varchar(13)primary key,
Cname char(60),
Cadd char(60),
Ctel char(11)
);
书店信息表:
create table store(
Sno varchar(13)primary key,
Sname char(60),
Sadd char(60),
Stel char(11)
);
供货商信息表:
create table provider(
Pno varchar(13)primary key,
Pname char(60),
Padd char(60),
Ptel char(11)
);
进货信息表:
create table jinhuo(
Jno varchar(13) primary key,
ISBN varchar(13),
Bname char(60),
Sno varchar(13) foreign key (Sno) references store(Sno),
Pno varchar(13) foreign key (Pno) references provider(Pno),
Jnum int,
Jprice float
);
退货信息表:
create table tuihuo(
Tno varchar(13) primary key,
ISBN varchar(13),
Bname char(60),
Sno varchar(13),
Pno varchar(13),
Tnum int,
Tprice float,
foreign key (Sno) references store(Sno),
foreign key (Pno) references provider(Pno)
);
统计信息表:
create table accord(
Ano varchar(13) primary key,
ISBN varchar(13),
Bname char(60),
Bnum int,
Anum int,
foreign key (ISBN) references book(ISBN)
);
订购图书信息表:
create table orders(
Ono varchar(13) primary key,
ISBN varchar(13),
Bname char(60),
Sno varchar(13),
Cno varchar(13),
Onum int,
Oprice float,
foreign key (Sno) references store(Sno),
foreign key (Cno) references customer(Cno)
);
退货订购图书信息表:
create table returned(
Rno varchar(13) primary key,
ISBN varchar(13),
Bname char(60),
Sno varchar(13),
Cno varchar(13),
Rnum int,
Rprice float
foreign key (Sno) references store(Sno),
foreign key (Cno) references customer(Cno)
);
截图:
三、逻辑设计
(1).实体属性设计
图书信息表book:(书编号ISBN,出版社Bpress,单价Bprice,书名Bname,作者Bauther,数量Bnum)
顾客信息表customer:(顾客编号Cno,顾客姓名Cname,地址Cadd,电话Ctel)
书店信息表store:(书店编号Sno,店名Sname,书店地址Sadd,书店电话Stel)
供货商信息表provider:(供货商编号Pno,供货商姓名Pname,供货商地址Padd,供货商电话Ptel)
订购图书信息表orders:(订单编号Ono,书编号ISBN,书名Bname,顾客编号Cno,书店编号Sno,订购数量Onum,订购价格Oprice)
退货订购图书信息表returned:(退书编号Rno,书编号ISBN,书名Bname,顾客编号Cno,书店编号Sno,退书数量Rnum,退书价格Rprice)
进货信息表jinhuo:(进货编号Jno,书编号ISBN,书名Bname,书店编号Sno,供货商编号Pno,进货数量Jnum,进货金额Jprice)
退货信息表tuihuo:(退货编号Tno,书编号ISBN,书名Bname,书店编号Sno,供货商编号Pno,退货数量Tnum,退货金额Tprice)
统计属于信息表accord:(统计编号Ano,书编号ISBN,书名Bname,库存图书量Bnum,销售数量Anum)
(2).插入测试数据:
insert into book values('0000000000001','龙门',10.0,'语文','王源',10)
insert into customer values('00001','小凯','重庆','')
insert into store values('0001','书吧','重庆','')
insert into provider values('001','千千','重庆','')
insert into orders values('O01','0000000000001','语文','00001','0001',1,10.0)
insert into returned values('R01','0000000000001','语文','00001','0001',1,10.0)
insert into jinhuo values('J01','0000000000001','语文','0001','001',10,100.0)
insert into tuihuo values('T01','0000000000001','语文','0001','001',5,50.0)
insert into accord values('A01','0000000000001','语文',10,0)
(3).索引:
create unique index ISBN on book(ISBN);
create unique index Cname on customer(Cname);
create unique index Sname on store(Sname);
create unique index Pname on provider(Pname);
create unique index Ono on orders(Ono);
create unique index Rno on returned(Rno);
create unique index Jno on jinhuo(Jno);
create unique index Tno on tuihuo(Tno);
create unique index Ano on accord(Ano);
(4).创建部分存储过程及触发器:
a.进货信息表创建名为inserted存储过程,该存储过程功能是向进货表中插入一条图书记录:
create procedure inserted @Jno varchar(13),@ISBN varchar(13), @Bname char(60),@Sno varchar(13),@Pno varchar(13),@Jnum int,@Jprice float
as insert into jinhuo(Jno, ISBN, Bname, Sno,Pno,Jnum,Jprice)
values(@Jno, @ISBN, @Bname, @Sno,@Pno,@Jnum,@Jprice)
go
exec inserted 'J02','0000000000001','语文','0001','001',10,100.0
截图:
b.进货表创建存储过程,当输入进货号时,输出进货单:
create procedure JHXX @Jno varchar(13)
as
declare @Jnum int
select *
from jinhuo
where Jno=@Jno
go
execute JHXX @Jno='J01'
截图:
c.为进货表创建触发器Trigger_J_insert,当进货表中增加一条记录时触动触发器,更新库存图书中的图书数量信息:
Create trigger Trigger_J_insert
On jinhuo
for insert
as
declare @Bnum int,@Jnum int,@Ano varchar(13)
select @Jnum=Jnum
from inserted
update accord
set Bnum=Bnum+@Jnum
where Ano=@Ano
测试:
insert into jinhuo values('J03','0000000000001','语文','0001','001',10,100.0)
截图:
d.为退货订购图书表创建触发器Trigger_R_insert,当退货表中增加一条信息时,触动触发器,更新图书中库存量相关信息:
create trigger Trigger_R_insert
on returned
for insert
as
declare @ISBN varchar(13),@Bnum int,@Rnum int
select @ISBN=ISBN,@Rnum=Rnum
from inserted
update book
set Bnum=Bnum+@Rnum
where ISBN=@ISBN
测试:
insert into returned values('R02','0000000000001','语文','00001','0001',1,10.0)
截图:
e.为统计表创建存储过程ACCXX,当输入相应图书及数量时,若库存图书量能满足顾客所需,则更新库存图书数量及销售数量,并在订购图书信息表插入订购信息,若库存图书量不足,则输出库存不足,剩余库存量:
create procedure ACCXX @Ono varchar(13),@ISBN varchar(13),@Onum int
as
declare @Bnum int,@Anum int,@Bname char(60),@Sno varchar(13),@Oprice float,@Cno varchar(13),@Ano varchar(13),@Bprice float
if(select Bnum From book where ISBN=@ISBN)>=@Onum
begin
update book
set Bnum=Bnum-@Onum
where ISBN=@ISBN
update accord
set Anum=Anum+@Onum
where Ano=@Ano
select @Bname=Bname,@Bprice=Bprice
from book
where ISBN=@ISBN
insert into orders values(@Ono, @ISBN, @Bname, @Cno, @Sno, @Onum, @Oprice)
end
else
begin
select @Bnum=Bnum
from book
where ISBN=@ISBN
print('库存不足'+cast(@Bnum as varchar)+'本')
end
go
execute ACCXX 'O02','0000000000001',5
截图:
(4).建立与数据库的连接
package b;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
public class ConnectionDemo{
public static void main(String[] args)
{
Connection conn;
Statement stmt;
ResultSet rs;
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException ex){
System.out.println("数据库驱动加载失败");
}
String url="jdbc:odbc:hehe;";
String sql="select * from jinhuo";
try{
//连接数据库
conn = DriverManager.getConnection(url);
//建立Statement对象
stmt=conn.createStatement();
//执行数据库查询语句
rs=stmt.executeQuery(sql);
while(rs.next())
{
String jno=rs.getString("进货编号");
String isbn=rs.getString("书编号");
String bname=rs.getString("书名");
String sno=rs.getString("书店编号");
String pno=rs.getString("供货商编号");
String jnum=rs.getString("进货数量");
String jprice=rs.getString("进货金额");
System.out.println("进货编号:"+jno+"书编号:"+isbn+"书名"+bname+"书店编号"+sno+"供货商编号"+pno+"进货数量"+jnum+"进货金额"+jprice);
}
if(rs!=null){rs.close();rs=null;}
if(stmt!=null){stmt.close();stmt=null;}
if(conn!=null){conn.close();conn=null;}
}
catch(SQLException e)
{
e.printStackTrace();
System.out.println("数据库连接失败");
}
}
}
(5).基于java的界面设计(注:这里以进货表为例进行操作演示)
a.界面设计:
package b;
import javax.swing.*;
import java.awt.event.*;
import java.sql.*;
public class jiemian{
public static void main(String arg[]){
try{
Class.forName("sun.jdbc.odbc.JdbcOdbeDriver");
}
catch(ClassNotFoundException e){System.out.println(""+e);}
DatabaseWin win=new DatabaseWin();
}
}
class DatabaseWin extends JFrame implements ActionListener{
JMenuBar menubar;
JMenu menu;
JMenuItem itemShow,itemInsert;
ShowRecord showRecord;
InsertRecord insertRecord;
DatabaseWin(){
menubar=new JMenuBar();
menu=new JMenu("图书销售管理系统");
itemShow=new JMenuItem("按进货编号查询");
itemInsert=new JMenuItem("新添进货信息");
itemShow.addActionListener(this);
itemInsert.addActionListener(this);
menu.add(itemShow);
menu.add(itemInsert);
menubar.add(menu);
showRecord=new ShowRecord("按进货编号查询");
insertRecord=new InsertRecord("新添进货信息");
setJMenuBar(menubar);
setBounds(100,100,500,500);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==itemShow)
showRecord.setVisible(true);
else if(e.getSource()==itemInsert)
insertRecord.setVisible(true);
}
}
截图:
b.插入信息界面:
package b;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.border.*;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class InsertRecord extends JDialog implements ActionListener {
JLabel hintLable;
Object name[]={"进货编号","书编号","书名","书店编号","供货商编号","进货数量","进货金额"};
Object a[][]=new Object[1][7];
JTable table;
JButton enterInsert;
Connection con;
Statement sql;
ResultSet rs;
String num;
InsertRecord(String s){
setTitle(s);
hintLable=new JLabel("输入进货编号信息:");
table=new JTable(a,name);
enterInsert=new JButton("新添进货信息");
setLayout(null);
Box baseBox=Box.createHorizontalBox();
baseBox.add(hintLable);
baseBox.add(new JScrollPane(table));
baseBox.add(enterInsert);
add(baseBox);
baseBox.setBounds(10,40,600,38);
enterInsert.addActionListener(this);
setBounds(120,160,700,200);
}
public void actionPerformed(ActionEvent e){
try{
con=DriverManager.getConnection("jdbc:odbc:hehe","","");
sql=con.createStatement();
int k=sql.executeUpdate("insert into jinhuo values('"+a[0][0]+"','"+a[0][1]+"','"+a[0][2]+"','"+a[0][3]+"','"+a[0][4]+"','"+a[0][5]+"','"+a[0][6]+"')");
if(k==1)
JOptionPane.showMessageDialog(this, "插入记录成功","成功",JOptionPane.PLAIN_MESSAGE);
con.close();
}
catch(SQLException ee){
JOptionPane.showMessageDialog(this, "插入记录失败","失败",JOptionPane.PLAIN_MESSAGE);
}
}
}
截图:
c.显示信息界面:
package b;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class ShowRecord extends JDialog implements ActionListener {
JTable table;
Object a[][];
Object name[]={"进货编号","书编号","书名","书店编号","供货商编号","进货数量","进货金额"};
JButton showRecord;
Connection con;
Statement sql;
ResultSet rs;
ShowRecord(String title){
setTitle(title);
showRecord=new JButton("按进货编号查询");
showRecord.addActionListener(this);
add(showRecord,BorderLayout.NORTH);
setBounds(200,60,600,600);}
public void actionPerformed(ActionEvent e){
try{
con=DriverManager.getConnection("jdbc:odbc:hehe","","");
sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs=sql.executeQuery("select * from jinhuo");
rs.last();
展开阅读全文