报刊订阅管理系统的设计与实现
Posted chenqiwei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了报刊订阅管理系统的设计与实现相关的知识,希望对你有一定的参考价值。
课程设计(论文)任务书(文章末尾--源文档下载)
软件 学院 软件工程 专业 2016 -7 班
一、课程设计(论文)题目 综合课程设计2
二、课程设计(论文)工作自 2018 年 1月 1 日起至 2018 年 1月 12 日止。
三、课程设计(论文) 地点:软件工程实训中心一部
四、课程设计(论文)内容要求:
1.本课程设计的目的
(1)使学生熟练掌握数据库基本原理;
(2)使学生熟练掌握数据库的分析和设计能力;
(3)培养学生熟练使用常见的数据库管理系统;
(4)培养学生使用Java语言进行面向对象设计的能力;
(5)培养学生熟练使用Java语言进行数据库应用程序设计的能力;
(6)提高学生的科技论文写作能力。
2.基本要求:
课程设计题目:报刊订阅管理系统
设计主要内容:设计一个报刊订阅应用系统,使系统满足以下功能和需求:
1)一个订户可以订多种报刊;一种报刊可被多个用户订阅;订单只能订阅现有报刊目录
投递时,必须根据订单的情况进行投递,不得超出订单的订阅品种,数量;
2)订阅管理:订户添加,修改,删除;
目录管理:目录添加,修改,删除;
订单管理:完成订户订阅数据的管理(包括添加,修改,删除)
订单查询:按订户或者订单号查询订单详细情况;
统计查询:按报刊目录统计各类报刊的订阅数量和金额;
3.课程设计论文编写要求
(1)要按照书稿的规格打印誊写课设报告;
(2)报告分为封面、任务书(本文档)、正文、课程设计体会和参考文献四部分;
学生签名:
2018年1月 1日
课程设计(论文)评审意见
(1)题目分析 (20分):优( )、良( )、中( )、一般( )、差( );
(2)流程分析 (30分):优( )、良( )、中( )、一般( )、差( );
(3)数据定义 (30分):优( )、良( )、中( )、一般( )、差( );
(4)代码编写 (10分):优( )、良( )、中( )、一般( )、差( );
(5)创新能力 (10分):优( )、良( )、中( )、一般( )、差( );
(6)格式规范性、设计态度及考勤是否降等级:是( )、否( )
评阅人: 职称:讲师
2018年 1 月 12 日
正 文
一、 数据设计
1. 实体
实体1:部门
属性1:部门号
属性2:部门名
实体2:用户
属性1:用户名
属性2:密码
属性3:真实姓名
属性4:性别
属性5:部门号
属性6:联系电话
属性7:联系地址
属性8:订阅报刊种类数
实体3:管理员
属性1:管理员名
属性2:密码
实体4:报刊
属性1:报刊代号
属性2:报刊名
属性3:类型
属性4:出版报社
属性5:出版周期
属性6:半年订阅价
属性7:全年订阅价
实体5:订阅
属性1:用户名
属性2:报刊代号
属性3:订阅年限
属性4:订阅数量
属性5:所需金额
|
结构功能图:
联系
本设计中实体之间的联系如下(E-R图):
|
系统E-R图:
1
|
n
m n
各实体E-R 图:
|
部门:
用户:
|
管理员:
报刊:
关系表E-R 图:
二、 数据库设计
1. 关系模式
本设计中的关系模式如下:
部门(部门号,部门名)关系主键:部门号;外键:无
用户(用户名,密码,真实姓名,性别,部门号,联系电话,联系地址,订阅报刊种类数)关系主键:用户名;外键:部门号
管理员(管理员名,密码)关系主键:管理员名;外键:无
报刊(报刊代号,报刊名,类型,出版报社,出版周期,半年订阅价,全年订阅价)
关系外键:报刊代号;外键:无
订阅(订阅号,报刊代号,订阅年限,订阅数量,所需金额)
关系主键:订阅号;外键:报刊代号
2. 数据表
本设计中创建的数据库名为:
数据表分别为
表1:部门表
表2:用户表
表3:管理员表
表4:报刊表
表5;订阅表
2. 数据库关系图为:
三、 数据库实现
设计中实现数据库操作的SQL 语句如下:
1) 新建数据表:CREATE TABLE [dbo].[Customer](
[Cid] [char](10) COLLATE Chinese_CI_AS NOT NULL,
[Cname] [char](20) COLLATE Chinese_CI_AS NULL,
[Phone] [char](15) COLLATE Chinese_CI_AS NULL,
[Address] [char](50) COLLATE Chinese_CI_AS NOT NULL)
ON [PRIMARY]
GO
CREATE TABLE [dbo].[Login](
[Uname] [char](20) COLLATE Chinese_CI_AS NOT NULL,
[Upassword][char](20) COLLATE Chinese_CI_AS NOT NULL)
ON [PRIMARY]
GO
CREATE TABLE [dbo].[Diretory](
[Did] [char](10) COLLATE Chinese_CI_AS NOT NULL,
[Dname] [char](20) COLLATE Chinese_CI_AS NULL,
[Unitprice][float] NOT NULL,
[Ifo][char](50) COLLATE Chinese_CI_AS NULL)
ON [PRIMARY]
GO
CREATE TABLE [dbo].[Order](
[Ono] [char](10) COLLATE Chinese_CI_AS NOT NULL,
[Cid][char](10) COLLATE Chinese_CI_AS NOT NULL,
[Odate] [datetime] NULL)
ON [PRIMARY]
GO
CREATE TABLE [dbo].[OrderDetail](
[Ono] [char](10) COLLATE Chinese_CI_AS NOT NULL,
[Cid][char](10) COLLATE Chinese_CI_AS NOT NULL,
[Quantity] [int] NOT NULL,
[Qishu][int] NOT NULL,
[Unitprice][float] NOT NULL,
[Total][float] NULL)
ON [PRIMARY]
GO
2)新建查询:
select *
from view_1 where 报刊编号 in";
"(select news_id from 订阅信息表 where reader_id=‘023’)
select *
from view_1 where 部门 in";
"(select 部门号 from 用户 where 用户名=’肖总’)
四、 程序设计
1) 类
设计中定义的Java类如下:
2) Dbutils类,表示设计连接数据库。
3) Main类,表示设计中添加面板,页面跳转,是JFrame的子类。
2) 类设计
1、Dbutils类
public class Dbutils
private static String driver;
private static String url;
private static String user;
private static String pwd;
private static ResourceBundle rb=ResourceBundle.getBundle("com.jdbc.utils.jdbc");
static
driver=rb.getString("driver");
url=rb.getString("url");
user=rb.getString("user");
pwd=rb.getString("pwd");
try
Class.forName(driver);
catch (ClassNotFoundException e)
// TODO
自动生成的catch块
e.printStackTrace();
private Dbutils()
public static Connection getConnection()
Connection conn=null;
try
conn=DriverManager.getConnection(url,user,pwd);
catch (SQLException e)
// TODO
自动生成的catch块
e.printStackTrace();
return conn;
public static void
close(Connection
conn,Statement
stmt,ResultSet
rs)
try
if(conn!=null)conn.close();
if(stmt!=null)stmt.close();
if(rs!=null)rs.close();
catch (SQLException e)
// TODO
自动生成的catch块
e.printStackTrace();
public static void main(String [] args)
System.out.println(getConnection());
2、Main类
class Main extends JFrame implements ActionListener
JRadioButton manager,users;
JLabel label,label1,label2;
JTextField userName;
JPasswordField password;
JButton login,register,exit;
JPanel p1,p2,p3;
public Main()
init();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
void init()
setLayout(new FlowLayout());
setSize(390,260);
p1=new JPanel();
p2=new JPanel();
p3=new JPanel();
label=new JLabel("欢迎使用报刊管理系统");
Font font=new Font("隶书",Font.PLAIN,30);
label.setFont(font);
p1.add(label);
ButtonGroup group=new ButtonGroup();
manager=new JRadioButton("管理员");
users=new JRadioButton("用户");
group.add(manager);
group.add(users);
p2.add(manager);
p2.add(users);
label1=new JLabel("用户名");
p3.add(label1);
userName=new JTextField(10);
p3.add(userName);
label2=new JLabel("密码");
p3.add(label2);
password=new JPasswordField(10);
p3.add(password);
add(p1,BorderLayout.CENTER);
add(p2,BorderLayout.CENTER);
add(p3,BorderLayout.CENTER);
login=new JButton("登录");
register=new JButton("注册");
exit=new JButton("退出");
add(login);
add(register);
add(exit);
userName.addActionListener(this);
login.addActionListener(this);
register.addActionListener(this);
exit.addActionListener(this);
public static void main(String[] args)
Main f=new Main();
f.setTitle("报刊订阅管理系统");
public void actionPerformed(ActionEvent e)
// TODO
自动生成的方法存根
if(e.getSource()==register) //注册(登录、退出类似)
new UsersRegister();//过渡到新的窗口
Menu;
this.dispose();//释放当前窗口
五、 Java源代码
package com.jdbc.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;
InformationDaoImpl.java//添加报刊信息
public static void main(String[] args) //录入报刊信息(录入用户信息和对用户,报刊,订单的增删改查与之类似
LoggingdataNewspaper f=new LoggingdataNewspaper();
f.setTitle("报刊信息");
public void actionPerformed(ActionEvent e) // TODO 自动生成的方法存根
if(e.getSource()==button5) // 退出
new ManagerHome();//过渡到新的窗口Menu;
this.dispose();//释放当前窗口
if(e.getSource()==button1) // 添加
//定义一个空的newspaper对象
newspaper news=new newspaper();
//将数据封装到news中
news.setNewsNo(text1.getText().trim());
news.setNewsName(text2.getText().trim());
news.setPublish(text3.getText().trim());
news.setPubPeriod(text4.getText().trim());
news.setContent(text5.getText().trim());
news.setPrice(Float.parseFloat(text6.getText().trim()));
System.out.println(news);
//定义一个控制对象
InformationDaoImpl ifd=new InformationDaoImpl();
//执行添加用户操作
ifd.addNews(news);
if(e.getSource()==button2) // 删除
//定义一个空的newspaper对象
newspaper delnews=new newspaper();
//将数据封装到delnews中
delnews.setNewsNo(text1.getText().trim());
delnews.setNewsName(text2.getText().trim());
System.out.println(delnews);
//定义一个控制对象
InformationDaoImpl ifd=new InformationDaoImpl();
//执行添加用户操作
ifd.deleteNews(delnews);
if(e.getSource()==button3) // 查询
//定义一个空的newspaper对象
newspaper n=new newspaper(); //将数据封装在n中
String news=text1.getText().trim(); //定义一个控制对象
InformationDaoImpl ifd=new InformationDaoImpl();
n=ifd.FindNewsByNewspaper(news);
System.out.println(n);
text2.setText(n.getNewsName());
text3.setText(n.getPublish());
text4.setText(n.getPubPeriod());
text5.setText(n.getContent());
text6.setText(String.valueOf(n.getPrice()));
if(e.getSource()==button4) // 修改
//定义一个空的users对象
newspaper news=new newspaper(); //将数据封装到u当中
news.setNewsNo(text1.getText().trim());
news.setNewsName(text2.getText().trim());
news.setPublish(text3.getText().trim());
news.setPubPeriod(text4.getText().trim());
news.setContent(text5.getText().trim());
news.setPrice(Float.parseFloat(text6.getText().trim())); //定义一个控制对象
InformationDaoImpl ifd=new InformationDaoImpl(); //执行修改用户信息操作
ifd.updateNewspaper(news);
System.out.println(news);
public void addNews(newspaper n) //定义一个空的连接对象
Connection conn=null; //定义一个准备sql语句
PreparedStatement ps=null; //自定义将要执行的sql语句
String sql="insert into
newspaper(newsNo,newsName,publish,pubPeriod,content,price)
values(?,?,?,?,?,?)"; //通过Dbutils得到数据库的连接
conn=Dbutils.getConnection();
System.out.println(conn);
try //将sql语句传给ps(接收sql语句的容器)
ps=conn.prepareStatement(sql); //将news的各个属性值添加到?处
ps.setString(1, n.getNewsNo());
ps.setString(2, n.getNewsName());
ps.setString(3, n.getPublish());
ps.setString(4, n.getPubPeriod());
ps.setString(5, n.getContent());
ps.setFloat(6, n.getPrice()); //执行sql语句(相当于在数据库中执行sql语句)
ps.executeUpdate();
catch (SQLException e)
e.printStackTrace();
finally //释放连接,同时释放资源
Dbutils.close(conn, ps, null);
//通过报刊号和报刊名删除报刊
public void deleteNews(newspaper dn) // TODO 自动生成的方法存根
Connection conn=null;
PreparedStatement ps=null;
conn=Dbutils.getConnection();
String sql="delete from newspaper
where
newsNo=?
and
newsName=?";
try
ps=conn.prepareStatement(sql);
ps.setString(1, dn.getNewsNo());
ps.setString(2, dn.getNewsName());
ps.executeUpdate();
catch (SQLException e) // TODO 自动生成的catch 块
e.printStackTrace();
finally
Dbutils.close(conn, ps, null);
//通过报刊代号查找报刊
public newspaper FindNewsByNewspaper(String ne)
newspaper news= new newspaper();
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
conn=Dbutils.getConnection();
String sql="select * from newspaper where newsNo=?";
try
ps=conn.prepareStatement(sql);
ps.setString(1, ne);
rs=ps.executeQuery();
if(rs.next())
news.setNewsNo(rs.getString("newsNo"));
news.setNewsName(rs.getString("newsName"));
news.setPublish(rs.getString("publish"));
news.setPubPeriod(rs.getString("pubPeriod"));
news.setContent(rs.getString("content"));
news.setPrice(rs.getFloat("price"));
catch (SQLException e) // TODO 自动生成的 catch 块
e.printStackTrace();
finally
Dbutils.close(conn, ps, rs);
return news; //更新报刊信息
public void updateNewspaper(newspaper news) // TODO Auto-generated method stub
//定义一个空的连接对象
Connection conn=null;//定义一个准备sql语句
PreparedStatement ps=null; //自定义将要执行的sql语句
String sql="update newspaper
set
publish=?
,pubPeriod=?,
content=?, price=? where newsNo=? and newsName=? "; //通过Dbutil得到数据库的连接
conn=Dbutils.getConnection();
System.out.println(conn);
try //将sql语句传给ps(接收sql语句的容器)
ps=conn.prepareStatement(sql); //将user的各个属性值添加到?处
ps.setString(1, news.getPublish());
ps.setString(2, news.getPubPeriod());
ps.setString(3, news.getContent());
ps.setFloat(4, news.getPrice());
ps.setString(5,news.getNewsNo());
ps.setString(6, news.getNewsName()); //执行update SQL语句
ps.executeUpdate();
catch (SQLException e) // TODO 自动生成的 catch 块
e.printStackTrace();
finally //释放连接,同时释放资源
Dbutils.close(conn, ps, null);
六、 实验结果
点击管理员,输入管理员用户名(admin)和密码(admin),点击“登录”,进入
图1-1 报刊订阅管理系统登入界面
点击“录入报刊信息”按钮,进入录入报刊信息界面
图2-2管理员主界面
图3-3 报刊管理
图 5-5订阅管理
七、 实验小结
1. 数据库设计小结
SQL数据库的使用,让我对数据库概念及逻辑和物理结构设计有了更清晰的了解,这里我所选课题的概念结构设计即详细的E-R图,逻辑结构设计就是将E-R图转换为数据库的逻辑结构,并进行优化,而物理结构设计即选定实施环境,确定系统数据库的存储结构和存取方法等。还有就是数据实施维护,用DBMS建立数据库结构,加载数据,实现各种查询,链接应用程序,设计库中触发器,存储过程等对象,并能对数据库做简单的数据维护。
2. Java应用小结
通过这次的课程设计,让我从之前学Java时的懵懵懂懂到现在理解了不少,学会了不少语法的连接,怎么在整个系统中使用到这部分,并且表达出来等等,都需要好好学习并熟悉里面的每个知识点和语法,及使用方法等等,面向对象的设计
3. 需完善之处
由于是初次综合使用SQL和Java来做东西,并且时间有限,不足之处不可避免。本系统的功能还不够强大,较真正的管理系统还有很多不足, 安全功能也有不足,比如用户真实姓名没有纠错,应该把所有的部门的职工全都输入到表中,当注册的时候,输入真实姓名,如果相关部门没有此人,则不允许注册,此功能尚未实现,将在以后的时间继续完善。
课程设计体会
这次课程设计的主要目的是掌握数据库应用系统分析设计的基本方法,基本掌握SQL和Java的使用,进一步提高分析解决问题的综合能力。通过这次课程设计,我基本掌握了以上要求。但只有2周的课程设计时间,时间比较仓促,所以开发的系统不是很完善,有一些功能未实现,但是报刊订阅的基本功能均已实现。以前对数据库还有Java的很多知识认识都不深刻,做过这次课程设计之后,我对这些都有个基本的系统了解,比如:对表内一些字段的约束,关系等的运用以及比较熟练。
但是由于第一次真正的全系统运用,所以运用的不是很熟练。刚开始的时候,对于SQL和Java的语法,用法等一系列知识都不熟悉,经过对这个系统的开发,在开发过程中遇到但也解决了很多问题,所以说我们要迎难而上,不断地去学习,自己才有所成长,有所发展。
参考文献
1.数据库系统概论(第5版)王珊 萨师煊编著 高等教育出版社 2014年9月
2.Java语言程序设计(第2版)丁振凡 编著 清华大学出版社2014年9月
3.李刚.Java程序员之旅--Java数据库技术详解[J].化学工业出版社.2011.4
4.姜中华、刘小春.Java 数据库应用程序设计[J].机械工业出版社.2008.4
5.软件开发技术联盟.Java Web开发实践[J].清华大学出版社.2013.9
Leszek A.Maciaszek.需求分析与系统设计[J]中信出版社.2003
6.互联网资源
公众号回复--“报刊”
以上是关于报刊订阅管理系统的设计与实现的主要内容,如果未能解决你的问题,请参考以下文章
架构设计:系统存储(16)——Redis事件订阅和持久化存储