报刊订阅管理系统 课程设计.docx
《报刊订阅管理系统 课程设计.docx》由会员分享,可在线阅读,更多相关《报刊订阅管理系统 课程设计.docx(29页珍藏版)》请在冰豆网上搜索。
报刊订阅管理系统课程设计
1.开发环境和相关技术介绍
1.1开发环境
数据库系统:
SQLServer2000
编程语言:
JAVA
数据库连接方式:
JDBC
开发工具:
Eclipse3.2
1.2相关技术介绍
MicrosoftSQLServer2000数据库管理系统支持并扩展了SQL语言标准,可以运用标准SQL语句对数据进行操作,也可以使用功能强大的GUI工具进行灵活的数据管理。
Eclipse:
功能强大的应用程序开发工具,主要支持基于Java语言的各种开发项目。
JDBC连接方式:
Java与数据库系统的一种连接方式,Java程序使用JDBCAPI与数据库进行通信,并用它操作数据库中的数据。
JDBCAPI使Java程序与具体数据库系统独立开来,保证了Java程序高度的可移植性。
2.需求分析
2.1系统需求和功能
设计一个报刊订阅应用系统,使系统满足以下功能和需求:
1)
a一个订户可订多种报刊;一种报刊可被多个用户订阅;订单只能订阅现有报刊目录内容;
b投递时,必须根据订单的情况进行投递,不得超出订单的订阅品种、数量;
2)、系统功能包括:
a订户管理:
订户添加、修改、删除、查询;
b 目录管理:
目录添加、修改、删除、查询;
c订单管理:
完成订户订阅数据的管理(包括添加、修改、删除、查询);
d统计查询:
按报刊目录统计各类报刊的订阅数量及金额;
e帐号管理:
增加管理帐号、删除帐号。
2.2数据字典
2.2.1数据结构
管理员用户=管理员帐户+管理员密码
订户=订户编号+订户名+联系电话+联系地址
目录=目录编号+目录名+单价+批注信息
订单=订单号+订户编号+下订日期
订单细节=订单号+目录编号+订户编号+订阅数量+订阅期数+单价+总价+下订日期
2.2.2数据项
表2.1数据项表
编号
标识符
类型
长度
所属表名
同义名
1
UName
Varchar
20
Login
管理员帐户
2
UPassword
Varchar
20
Login
管理员密码
3
Cid
Varchar
10
Customer,OrderDetail
订户编号
4
Cname
Varchar
20
Customer
订户名
5
Phone
Varchar
15
Customer
联系电话
6
Address
Varchar
50
Customer
联系地址
7
Did
Varchar
10
Diretory,OrderDetail
目录编号
8
Dname
Varchar
20
Diretory
目录名
9
UnitPrice
Float
8
Diretory、OrderDetail
目录单价
10
Ifo
Varchar
50
Diretory
批注信息
11
Ono
Varchar
10
Order,OrderDetail
订单编号
12
Quantity,
Int
4
OrderDetail
订阅数量
13
QiShu,
Int
4
OrderDetail
订阅期数
14
Total
Float
8
OrderDetail
订单项总价
15
Odate
Datetime
8
OrderDetail
下订日期
2.2.3数据流
表2.2数据流表
编号
名称
来源
去向
组成
1
身份信息
系统管理员
应用系统
管理员帐户+密码
2
授权信息
应用系统
系统管理员
3
错误身份信息
应用系统
系统管理员
4
查询请求
系统管理员
应用系统
待查询对象识别符(如Cid,Ono)
5
查询结果
应用系统
系统管理员
被查询对象具体信息
6
管理请求
系统管理员
应用系统
识别符(Cid,Ono等)+管理类型
7
管理结果信息
应用系统
系统管理员
被管理对象处理结果
8
非法请求
应用系统
系统管理员
非法请求提示信息
2.3安全性要求
访问数据库时需要输入登陆帐号和密码。
在数据库内设有管理员表,登陆系统时会要求输入管理员帐号和密码。
登陆模块根据输入帐号和密码查管理员表,查到匹配记录则允许其登陆系统。
管理员帐号和密码可以在系统中添加和修改。
2.4一致性要求
在管理系统相关的表之间,有较强的关联性。
为了实现一致性的需求,各个表之间均建立起了相应的一致性约束。
2.5完整性要求
数据库各个表设置了实体完整性、参照完整性。
防止了数据表中存在不正确的数据。
3.数据库设计
3.1设计方法和步骤
采用自底而上的设计方法。
先自顶向下地进行需求分析,对报刊订阅管理系统的需求进行逐步细化;然后再自底而上地设计概念结构,最终将各个局部应用的概念结构集合成为全局概念结构。
3.2概念结构E-R图
通过对局部应用的选择,逐一设计出分E-R图,并对各个分E-R图进行合并,生成初步E-R图,消除不必要的系统冗余,可以得出以下报刊订阅管理系统E-R图。
报刊订阅管理系统E-R图
4.逻辑结构设计
4.1关系模式设计与优化
4.1.1关系模式设计
根据概念结构的设计,可以将系统E-R图转换为以下关系模式:
Login(UName,UPassword)
Customer(Cid,Cname,Phone,Address)
Diretory(Did,Dname,UnitPrice,Ifo)
OrderDetail(Ono,Did,Cid,Quantity,QiShu,UnitPrice,Total,Odate)
Foreignkey:
Ono,Did
4.1.2优化分析
对上面关系模式进行分析可知:
表Customer、Diretory、Login都属于BCNF范式,在数据操作性能和存储空间的利用率上都比较高。
表OrderDetail:
(Ono,Did)Quantity,
(Ono,Did)QiShu,
(Ono,Did)UnitPrice,
(Quantity,QiShu,UnitPrice)Total,
(Ono,Did)Total.
将Total作为一个属性独立出来有利于统计和查询,减少反复运算操作。
4.2系统结构图
4.3系统完整性设计
Login(UName,UPassword)
其中(UName,UPassword)为主码。
Customer(Cid,Cname,Phone,Address)
其中:
Cid为主码,Cid,Cname,Phone,Address约束为非空
Diretory(Did,Dname,UnitPrice,Ifo)
其中:
Did为主码,Dname,UnitPrice,Ifo约束为非空
OrderDetail(Ono,Did,Cid,Quantity,QiShu,UnitPrice,Tota,Odate)
其中:
(Ono,Did)为主码,Cid和Did分别为外码(参照分别为:
Customer(Cid)和Diretory(Did)).
Quantity,QiShu,UnitPrice,Tota,Odate分别约束为非空
5.数据库物理设计
5.1索引的建立
由于系统可能要涉及大量数据的操作,所以索引的建立就成为一种必需。
本系统采用B+树索引方法,分别在各Customer,Diretory和OrderDetail各个表的主键上建立索引。
5.2数据存放位置
本系统所有数据和索引均存放在磁盘中。
5.3模块设计
5.3.1登录模块
5.3.2管理功能模块
5.3.3管理帐号模块
5.3.4查询模块
6.数据库实施
6.1各数据表说明
编号
数据表名称
类型
内容
01
Login
辅助表
记录管理员帐号,密码
02
Customer
主表
记录订户信息
03
Diretory
主表
记录目录信息
05
OrderDetail
主表
记录详细订单项信息
6.2数据库创建
6.2.1Powerdesigner建模
用powerdesigner根据E-R图建立概念模型。
转换成物理模型:
6.2.2SQLserver2000建立数据库
在SQLSERVER2000上新建一个数据库,再建立一个数据源,把数据源指向新建的数据库。
6.2.3powerdesigner连接数据库,建立数据表。
如图:
6.3数据库备份和恢复方案
6.3.1应用辅助工具进行备份和恢复
应用数据库进行备份,选择所需要备份的数据库和目标地址即可进行数据备份,恢复数据库只需要指定备份文件和需要恢复的数据库即可进行数据恢复。
6.3.2分离数据库法
在企业管理器中右击需要备份的数据库,选择“所有任务”,“分离数据库”,执行分析操作,拷贝数据库MDF文件和LDF文件。
恢复方案:
在企业管理器的控制台树中选择“数据库”节点,右击,“所有任务”,“附加数据库”,找到待恢复数据库的MDF文件,确定。
7.用户界面设计和应用程序代码
7.1用户界面设计
这个系统的用户界面运用了JavaSwing编写,由一个主界面跟五个辅助界面构成。
7.2类文件功能描述
NO
类名
类型
功能
01
myframe
Frame
主界面类,提供各个功能的接口
02
Connectdatabase
辅助类
调用该类连接数据库
03
SimpleTable
Frame
实现对目录的管理,包括增、删、改、查
04
DHTable
Frame
实现对订户的管理,包括增、删、改、查
05
DDxinxi
Frame
实现对订单的管理,包括增、删、改、查
06
LG
Frame
管理员登陆对话框,提供登陆界面,检查登陆信息
07
addadmin
Frame
添加一个管理帐号
08
deleteadmin
Frame
删除一个管理帐号
09
orderdetail
Frame
显示所有订户的订单,订单的详细信息
7.3主要代码分析(选取了三个类的主要代码)
//------------------------------------------------------------------------
//所属类:
Connectdatabase
//功能:
取得应用程序与数据库系统的连接
publicclassConnectdatabase{
privateConnectionconn;
publicStatementstmt;
publicStatementConnect(){
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn=DriverManager.getConnection("jdbc:
odbc:
BKDY","sa","");stmtconn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
}
catch(Exceptione){
System.out.println("异常:
"+e.getMessage());
}
returnstmt;
}
}
//------------------------------------------------------------------------
//所属类:
orderdetail
//功能:
显示所有订户的订单详细信息,
publicclassorderdetailextendsJFrame
{staticDefaultTableModeldata;
JTabletable;
publicorderdetail()
{super("订单统计列表");
setSize(800,500);
setVisible(true);
setResizable(false);
Containerc=getContentPane();
c.setLayout(newFlowLayout());
String[]s={"订单编号","目录名字","订户名字","订阅数量","订单总价","下定日期","订户电话","联系地址"};
data=newDefaultTableModel(s,0);
table=newJTable(data);
table.setEnabled(false);
table.setPreferredScrollableViewportSize(newDimension(700,400));
table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
JScrollPanesp=newJScrollPane(table);
c.add(sp);
try{
DatabaseDB=newDatabase();
DB.OpenConn();
Stringsql1="select*fromOrderDetail";
ResultSetrs1=DB.executeQuery(sql1);
while(rs1.next()){
Stringsql0="select*fromDiretorywhereDid='"+rs1.getString("Did")+"'";
ResultSetrs0=DB.executeQuery(sql0);
rs0.next();
Stringsql2="select*fromCustomerwhereCid='"+rs1.getString("Cid")+"'";
ResultSetrs2=DB.executeQuery(sql2);
rs2.next();
StringOno=rs1.getString("Ono");
StringDname=rs0.getString("Dname");
StringCname=rs2.getString("Cname");
StringQuantity=rs1.getString("Quantity");
StringOdate=rs1.getString("Odate");
StringPhone=rs2.getString("Phone");
StringAddress=rs2.getString("Address");
StringTotal=rs1.getString("Total");
String[]str={Ono,Dname,Cname,Quantity,Total,Odate,Phone,Address};
data.addRow(str);}
}
catch(Exceptione){
System.out.println(e);
}
setVisible(true);
setLocation(150,150);
}
}
//------------------------------------------------------------------------
//所属类:
myframe
//功能:
用户系统界面,提供各种功能的接口
publicclassmyframeextendsJFrameimplementsActionListener
{
MenuBarmb;
Menum1,m2,m3,m4,m5;
Labellb1=newLabel("报刊订阅管理系统",Label.CENTER);
Labellb4=newLabel("计算机06-2班组员:
周锦佩、邱沛志、朱荣辉",Label.CENTER);
Labellb3=newLabel("数据库课程设计",Label.CENTER);
MenuItemmi1,mi3,mi4,mi7,mi8,mi10,mi11;
myframe()
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("报刊订阅管理系统");
mb=newMenuBar();
m1=newMenu("目录管理");
m2=newMenu("订单管理");
m3=newMenu("订户管理");
m4=newMenu("帐号管理");
m5=newMenu("系统");
mb.add(m1);mb.add(m3);mb.add(m2);mb.add(m4);mb.add(m5);
mi1=newMenuItem("目录管理");mi3=newMenuItem("关于系统");
mi4=newMenuItem("订单管理");mi11=newMenuItem("订单统计");
mi7=newMenuItem("增加管理员");mi8=newMenuItem("删除管理员");
mi10=newMenuItem("订户管理");
m1.add(mi1);m3.add(mi10);m2.add(mi4);m2.add(mi11);
m4.add(mi7);m4.add(mi8);m5.add(mi3);
finalContainercon=this.getContentPane();
con.add(lb1);
con.add(lb3);con.add(lb4);
con.setLayout(newGridLayout(4,1,1,1));
lb1.setFont(newFont("黑体",Font.BOLD,40));
lb1.setForeground(Color.blue);
lb1.setBounds(newRectangle(16,13,93,28));
lb3.setFont(newFont("黑体",Font.BOLD,25));
lb3.setForeground(Color.black);
lb4.setFont(newFont("黑体",Font.BOLD,20));
lb4.setForeground(Color.black);
mi1.addActionListener(this);
mi3.addActionListener(this);
mi4.addActionListener(this);
mi7.addActionListener(this);
mi8.addActionListener(this);
mi10.addActionListener(this);
mi11.addActionListener(this);
this.setMenuBar(mb);
setBounds(300,300,460,300);
setVisible(true);
setResizable(false);
setSize(700,500);
setLocationRelativeTo(null);
}
////鼠标事件
publicvoidactionPerformed(finalActionEvente)
{
if(e.getSource()==mi1)//目录查询
{
newSimpleTable();
}
elseif(e.getSource()==mi3)//关于系统
{
JOptionPane.showMessageDialog(null,"系统名称:
报刊订阅管理系统","关于系统",JOptionPane.INFORMATION_MESSAGE);
}
elseif(e.getSource()==mi4)//订单查询
{newDDxinxi();
}
elseif(e.getSource()==mi7)//增加管理员
{
newaddadmin();
}
elseif(e.getSource()==mi8)
{
newdeleteadmin();//删除管理员
}
elseif(e.getSource()==mi10)///订户管理
{newDHTable();
}
elseif(e.getSource()==mi11){//订单统计
neworderdetail();
}
}
8.系统测试报告
8.1登录测试
双击可执行文件BKDY.jar打开应用系统,可见登陆界面;
当输入错误帐号密码时弹出错误对话框,只有输入了正确的帐号密码才能登录到主界面。
当输入空帐号空密码时则提示输入错误。
如下面两幅图:
8.2目录管理功能测试
8.2.1添加目录
在相应输入框内输入所要添加的目录的信息,点击“插入”,相关目录信息则插入到数据库中,并通过表格显示出来。
同时输入框清空,等待下次目录信息的添加。
如图:
8.2.2修改目录
在修改目录框中,输入要修改目录的编号,按“查询”即可把该目录所有信息查出来(如左图),点击“修改”即可对目录信息进行修改(如右图)。
最后确定,即可把修改后信息放进数据库中,并从表格显示出来,同时输入框清空,等待下次的修改:
8.2.3删除目录
如上图,输入目录编号查询可以查询所要删除目录的名字。
点击“删除”可以把该目录删除掉。
输入框清空等待下一次的删除操作:
8.2.4按目录编号查询
8.2.5按目录名字查询
输入要查询目录的名字,点击“查询”便可以显示出所查询目录的所有信息:
8.3订户管理功能测试
8.3.1添加订户(参考“目录管理”,操作基本类似,略)
8.3.2删除订户(参考“目录管理”,操作基本类似,略)
8.3.3修改订户(参考“目录管理”,操作基本类似,略)
8.3.4按编号查询订户(参考“目录管理”,操作基本类似,略)
8.3.5按名字查询订户(参考“目录管理”,操作基本类似,略)
订户管理界面如图:
订单管理界面:
8.4订单管