报刊订阅管理系统的设计与实现

时间:2022-07-22
本文章向大家介绍报刊订阅管理系统的设计与实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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.互联网资源