报刊订阅管理系统的设计与实现
1.本课程设计的目的
(1)使学生熟练掌握数据库基本原理;
(2)使学生熟练掌握数据库的分析和设计能力;
(3)培养学生熟练使用常见的数据库管理系统;
(4)培养学生使用Java语言进行面向对象设计的能力;
(5)培养学生熟练使用Java语言进行数据库应用程序设计的能力;
(6)提高学生的科技论文写作能力。
2.基本要求:
课程设计题目:报刊订阅管理系统
设计主要内容:设计一个报刊订阅应用系统,使系统满足以下功能和需求:
1)一个订户可以订多种报刊;一种报刊可被多个用户订阅;订单只能订阅现有报刊目录
投递时,必须根据订单的情况进行投递,不得超出订单的订阅品种,数量;
2)订阅管理:订户添加,修改,删除;
目录管理:目录添加,修改,删除;
订单管理:完成订户订阅数据的管理(包括添加,修改,删除)
订单查询:按订户或者订单号查询订单详细情况;
统计查询:按报刊目录统计各类报刊的订阅数量和金额;
3.课程设计论文编写要求
(1)要按照书稿的规格打印誊写课设报告;
(2)报告分为封面、任务书(本文档)、正文、课程设计体会和参考文献四部分;
正 文
一、 数据设计
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) 新建数据表:
1 CREATE TABLE [dbo].[Customer](
2
3 [Cid] [char](10) COLLATE Chinese_CI_AS NOT NULL,
4
5 [Cname] [char](20) COLLATE Chinese_CI_AS NULL,
6
7 [Phone] [char](15) COLLATE Chinese_CI_AS NULL,
8
9 [Address] [char](50) COLLATE Chinese_CI_AS NOT NULL)
10
11 ON [PRIMARY]
12
13 GO
14
15 CREATE TABLE [dbo].[Login](
16
17 [Uname] [char](20) COLLATE Chinese_CI_AS NOT NULL,
18
19 [Upassword][char](20) COLLATE Chinese_CI_AS NOT NULL)
20
21 ON [PRIMARY]
22
23 GO
24
25 CREATE TABLE [dbo].[Diretory](
26
27 [Did] [char](10) COLLATE Chinese_CI_AS NOT NULL,
28
29 [Dname] [char](20) COLLATE Chinese_CI_AS NULL,
30
31 [Unitprice][float] NOT NULL,
32
33 [Ifo][char](50) COLLATE Chinese_CI_AS NULL)
34
35 ON [PRIMARY]
36
37 GO
38
39 CREATE TABLE [dbo].[Order](
40
41 [Ono] [char](10) COLLATE Chinese_CI_AS NOT NULL,
42
43 [Cid][char](10) COLLATE Chinese_CI_AS NOT NULL,
44
45 [Odate] [datetime] NULL)
46
47 ON [PRIMARY]
48
49 GO
50
51 CREATE TABLE [dbo].[OrderDetail](
52
53 [Ono] [char](10) COLLATE Chinese_CI_AS NOT NULL,
54
55 [Cid][char](10) COLLATE Chinese_CI_AS NOT NULL,
56
57 [Quantity] [int] NOT NULL,
58
59 [Qishu][int] NOT NULL,
60
61 [Unitprice][float] NOT NULL,
62
63 [Total][float] NULL)
64
65 ON [PRIMARY]
66
67 GO
2)新建查询:
1 select *
2
3 from view_1 where 报刊编号 in";
4
5 "(select news_id from 订阅信息表 where reader_id=‘023’)
6
7 select *
8
9 from view_1 where 部门 in";
10
11 "(select 部门号 from 用户 where 用户名=’肖总’)
四、 程序设计
1) 类
设计中定义的Java类如下:
2) Dbutils类,表示设计连接数据库。
3) Main类,表示设计中添加面板,页面跳转,是JFrame的子类。
2) 类设计
1、Dbutils类
1 public class Dbutils {
2
3 private static String driver;
4
5 private static String url;
6
7 private static String user;
8
9 private static String pwd;
10
11 private static ResourceBundle rb=ResourceBundle.getBundle("com.jdbc.utils.jdbc");
12
13 static
14
15 {
16
17 driver=rb.getString("driver");
18
19 url=rb.getString("url");
20
21 user=rb.getString("user");
22
23 pwd=rb.getString("pwd");
24
25 try {
26
27 Class.forName(driver);
28
29 } catch (ClassNotFoundException e) {
30
31 // TODO
32
33 自动生成的catch块
34
35 e.printStackTrace();
36
37 }
38
39 }
40
41 private Dbutils()
42
43 public static Connection getConnection()
44
45
46
47 {
48
49 Connection conn=null;
50
51 try {
52
53 conn=DriverManager.getConnection(url,user,pwd);
54
55 } catch (SQLException e) {
56
57 // TODO
58
59 自动生成的catch块
60
61 e.printStackTrace();
62
63 }
64
65 return conn;
66
67 }
68
69 public static void
70
71
72
73 close(Connection
74
75
76
77 conn,Statement
78
79
80
81 stmt,ResultSet
82
83
84
85 rs)
86
87
88
89 {
90
91 try {
92
93
94
95 if(conn!=null)conn.close();
96
97
98
99 if(stmt!=null)stmt.close();
100
101
102
103 if(rs!=null)rs.close();
104
105
106
107 } catch (SQLException e) {
108
109
110
111 // TODO
112
113
114
115 自动生成的catch块
116
117
118
119 e.printStackTrace();
120
121
122
123 }
124
125
126
127 }
128
129 public static void main(String [] args) {
130
131 System.out.println(getConnection());
132
133 }}
2、Main类
1 class Main extends JFrame implements ActionListener{
2
3 JRadioButton manager,users;
4
5 JLabel label,label1,label2;
6
7 JTextField userName;
8
9 JPasswordField password;
10
11 JButton login,register,exit;
12
13 JPanel p1,p2,p3;
14
15 public Main(){
16
17 init();
18
19 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
20
21 setVisible(true); }
22
23 void init(){
24
25 setLayout(new FlowLayout());
26
27 setSize(390,260);
28
29 p1=new JPanel();
30
31 p2=new JPanel();
32
33 p3=new JPanel();
34
35 label=new JLabel("欢迎使用报刊管理系统");
36
37 Font font=new Font("隶书",Font.PLAIN,30);
38
39 label.setFont(font);
40
41 p1.add(label);
42
43 ButtonGroup group=new ButtonGroup();
44
45 manager=new JRadioButton("管理员");
46
47 users=new JRadioButton("用户");
48
49 group.add(manager);
50
51 group.add(users);
52
53 p2.add(manager);
54
55 p2.add(users);
56
57 label1=new JLabel("用户名");
58
59 p3.add(label1);
60
61 userName=new JTextField(10);
62
63 p3.add(userName);
64
65 label2=new JLabel("密码");
66
67 p3.add(label2);
68
69 password=new JPasswordField(10);
70
71 p3.add(password);
72
73 add(p1,BorderLayout.CENTER);
74
75 add(p2,BorderLayout.CENTER);
76
77 add(p3,BorderLayout.CENTER);
78
79 login=new JButton("登录");
80
81 register=new JButton("注册");
82
83 exit=new JButton("退出");
84
85 add(login);
86
87 add(register);
88
89 add(exit);
90
91 userName.addActionListener(this);
92
93 login.addActionListener(this);
94
95 register.addActionListener(this);
96
97 exit.addActionListener(this);
98
99 }
100
101 public static void main(String[] args)
102
103 {
104
105 Main f=new Main();
106
107 f.setTitle("报刊订阅管理系统");
108
109 }
110
111 public void actionPerformed(ActionEvent e) {
112
113 // TODO
114
115 自动生成的方法存根
116
117 if(e.getSource()==register) //注册(登录、退出类似)
118
119 {
120
121 new UsersRegister();//过渡到新的窗口
122
123 Menu;
124
125 this.dispose();//释放当前窗口
126
127 } }
五、 Java源代码
1 package com.jdbc.utils;
2 import java.sql.Connection;
3
4 import java.sql.DriverManager;
5
6 import java.sql.ResultSet;
7
8 import java.sql.SQLException;
9
10 import java.sql.Statement;
11
12 import java.util.ResourceBundle;
13
14 InformationDaoImpl.java//添加报刊信息
15
16
17
18 public static void main(String[] args) //录入报刊信息(录入用户信息和对用户,报刊,订单的增删改查与之类似
19
20 {
21
22 LoggingdataNewspaper f=new LoggingdataNewspaper();
23
24 f.setTitle("报刊信息");
25
26 }
27
28 public void actionPerformed(ActionEvent e) { // TODO 自动生成的方法存根
29
30 if(e.getSource()==button5) // 退出
31
32 {
33
34 new ManagerHome();//过渡到新的窗口Menu;
35
36 this.dispose();//释放当前窗口
37
38 }
39
40 if(e.getSource()==button1) // 添加
41
42 {
43
44 //定义一个空的newspaper对象
45
46 newspaper news=new newspaper();
47
48 //将数据封装到news中
49
50 news.setNewsNo(text1.getText().trim());
51
52 news.setNewsName(text2.getText().trim());
53
54 news.setPublish(text3.getText().trim());
55
56 news.setPubPeriod(text4.getText().trim());
57
58 news.setContent(text5.getText().trim());
59
60 news.setPrice(Float.parseFloat(text6.getText().trim()));
61
62 System.out.println(news);
63
64 //定义一个控制对象
65
66 InformationDaoImpl ifd=new InformationDaoImpl();
67
68 //执行添加用户操作
69
70 ifd.addNews(news);
71
72 }
73
74 if(e.getSource()==button2) // 删除
75
76 {
77
78 //定义一个空的newspaper对象
79
80 newspaper delnews=new newspaper();
81
82 //将数据封装到delnews中
83
84 delnews.setNewsNo(text1.getText().trim());
85
86 delnews.setNewsName(text2.getText().trim());
87
88 System.out.println(delnews);
89
90 //定义一个控制对象
91
92 InformationDaoImpl ifd=new InformationDaoImpl();
93
94 //执行添加用户操作
95
96 ifd.deleteNews(delnews);
97
98 }
99
100 if(e.getSource()==button3) // 查询
101
102 { //定义一个空的newspaper对象
103
104 newspaper n=new newspaper(); //将数据封装在n中
105
106 String news=text1.getText().trim(); //定义一个控制对象
107
108 InformationDaoImpl ifd=new InformationDaoImpl();
109
110 n=ifd.FindNewsByNewspaper(news);
111
112 System.out.println(n);
113
114 text2.setText(n.getNewsName());
115
116 text3.setText(n.getPublish());
117
118 text4.setText(n.getPubPeriod());
119
120 text5.setText(n.getContent());
121
122 text6.setText(String.valueOf(n.getPrice()));
123
124 }
125
126 if(e.getSource()==button4) // 修改
127
128 { //定义一个空的users对象
129
130 newspaper news=new newspaper(); //将数据封装到u当中
131
132 news.setNewsNo(text1.getText().trim());
133
134 news.setNewsName(text2.getText().trim());
135
136 news.setPublish(text3.getText().trim());
137
138 news.setPubPeriod(text4.getText().trim());
139
140 news.setContent(text5.getText().trim());
141
142 news.setPrice(Float.parseFloat(text6.getText().trim())); //定义一个控制对象
143
144 InformationDaoImpl ifd=new InformationDaoImpl(); //执行修改用户信息操作
145
146 ifd.updateNewspaper(news);
147
148 System.out.println(news);
149
150 }
151
152 }
153
154 public void addNews(newspaper n){ //定义一个空的连接对象
155
156 Connection conn=null; //定义一个准备sql语句
157
158 PreparedStatement ps=null; //自定义将要执行的sql语句
159
160 String sql="insert into
161
162 newspaper(newsNo,newsName,publish,pubPeriod,content,price)
163
164 values(?,?,?,?,?,?)"; //通过Dbutils得到数据库的连接
165
166 conn=Dbutils.getConnection();
167
168 System.out.println(conn);
169
170 try { //将sql语句传给ps(接收sql语句的容器)
171
172 ps=conn.prepareStatement(sql); //将news的各个属性值添加到?处
173
174 ps.setString(1, n.getNewsNo());
175
176 ps.setString(2, n.getNewsName());
177
178 ps.setString(3, n.getPublish());
179
180 ps.setString(4, n.getPubPeriod());
181
182 ps.setString(5, n.getContent());
183
184 ps.setFloat(6, n.getPrice()); //执行sql语句(相当于在数据库中执行sql语句)
185
186 ps.executeUpdate();
187
188 } catch (SQLException e) {
189
190 e.printStackTrace();
191
192 }
193
194 finally{ //释放连接,同时释放资源
195
196 Dbutils.close(conn, ps, null);
197
198 }
199
200 }//通过报刊号和报刊名删除报刊
201
202 public void deleteNews(newspaper dn) { // TODO 自动生成的方法存根
203
204 Connection conn=null;
205
206 PreparedStatement ps=null;
207
208 conn=Dbutils.getConnection();
209
210 String sql="delete from newspaper
211
212 where
213
214 newsNo=?
215
216 and
217
218 newsName=?";
219
220 try {
221
222 ps=conn.prepareStatement(sql);
223
224 ps.setString(1, dn.getNewsNo());
225
226 ps.setString(2, dn.getNewsName());
227
228 ps.executeUpdate();
229
230 } catch (SQLException e) { // TODO 自动生成的catch 块
231
232 e.printStackTrace();
233
234 }finally
235
236 {
237
238 Dbutils.close(conn, ps, null);
239
240 }
241
242 } //通过报刊代号查找报刊
243
244 public newspaper FindNewsByNewspaper(String ne) {
245
246 newspaper news= new newspaper();
247
248 Connection conn=null;
249
250 PreparedStatement ps=null;
251
252 ResultSet rs=null;
253
254 conn=Dbutils.getConnection();
255
256 String sql="select * from newspaper where newsNo=?";
257
258 try {
259
260 ps=conn.prepareStatement(sql);
261
262 ps.setString(1, ne);
263
264 rs=ps.executeQuery();
265
266 if(rs.next())
267
268 {
269
270 news.setNewsNo(rs.getString("newsNo"));
271
272 news.setNewsName(rs.getString("newsName"));
273
274 news.setPublish(rs.getString("publish"));
275
276 news.setPubPeriod(rs.getString("pubPeriod"));
277
278 news.setContent(rs.getString("content"));
279
280 news.setPrice(rs.getFloat("price"));
281
282 }
283
284 } catch (SQLException e) { // TODO 自动生成的 catch 块
285
286 e.printStackTrace();
287
288 }finally
289
290 {
291
292 Dbutils.close(conn, ps, rs);
293
294 }
295
296 return news; //更新报刊信息
297
298 public void updateNewspaper(newspaper news) { // TODO Auto-generated method stub
299
300 //定义一个空的连接对象
301
302 Connection conn=null;//定义一个准备sql语句
303
304 PreparedStatement ps=null; //自定义将要执行的sql语句
305
306 String sql="update newspaper
307
308 set
309
310 publish=?
311
312 ,pubPeriod=?,
313
314 content=?, price=? where newsNo=? and newsName=? "; //通过Dbutil得到数据库的连接
315
316 conn=Dbutils.getConnection();
317
318 System.out.println(conn);
319
320 try { //将sql语句传给ps(接收sql语句的容器)
321
322 ps=conn.prepareStatement(sql); //将user的各个属性值添加到?处
323
324 ps.setString(1, news.getPublish());
325
326 ps.setString(2, news.getPubPeriod());
327
328 ps.setString(3, news.getContent());
329
330 ps.setFloat(4, news.getPrice());
331
332 ps.setString(5,news.getNewsNo());
333
334 ps.setString(6, news.getNewsName()); //执行update SQL语句
335
336 ps.executeUpdate();
337
338 } catch (SQLException e) { // TODO 自动生成的 catch 块
339
340 e.printStackTrace();
341
342 }
343
344 finally{ //释放连接,同时释放资源
345
346 Dbutils.close(conn, ps, null);
347
348 }
349
350 }
六、 实验结果
点击管理员,输入管理员用户名(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.互联网资源
- Spring Cloud(三)服务提供者 Eureka + 服务消费者(rest + Ribbon)
- Spring Cloud(二)Consul 服务治理实现
- Spring Cloud(一)服务的注册与发现(Eureka)
- Shard 分片集群
- 面试官最爱的volatile关键字
- 玩转 WebView ,突破系统限制,让缓存更简单,更灵活
- Mycat 读写分离 数据库分库分表 中间件 安装部署,及简单使用
- 50道Java线程题
- Jrebel6.3.3破解,配置图文教程
- Spring Cloud(十一)高可用的分布式配置中心 Spring Cloud Bus 消息总线集成(RabbitMQ)
- Keras中带LSTM的多变量时间序列预测
- Spring Cloud(十)高可用的分布式配置中心 Spring Cloud Config 中使用 Refresh
- Hibernate 的性能优化的时候碰到了"抓取策略",有四种
- 基于 Spring Cloud 完整的微服务架构实战
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Kotlin之在Gradle中无参(no-arg)编译器插件的使用详解
- android实现常驻通知栏遇到的问题及解决办法
- Android仿微信键盘切换效果
- Android实现WIFI和GPRS网络的切换
- 在VS2010里快要疯掉的hello world
- gh0st源码分析与远控的编写(三)
- Android自定义View实现五星好评效果
- Android通过ViewModel保存数据实现多页面的数据共享功能
- Android自定义View实现炫酷进度条
- OpenSSL的VC编程 - MD5
- 详解AndroidStudio中代码重构菜单Refactor功能
- Android自定义View仿QQ运动步数效果
- Kotlin类型安全构建器的一次运用记录
- 两个surfaceView实现切换效果
- AndroidStudio4.0 New Class的坑(小结)