报刊订阅管理系统的设计与实现 您所在的位置:网站首页 报刊订阅的基本制度 报刊订阅管理系统的设计与实现

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

2024-07-17 14:22| 来源: 网络整理| 查看: 265

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) 新建数据表:

代码语言:javascript复制 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)新建查询:

代码语言:javascript复制 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类

代码语言:javascript复制 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类

代码语言:javascript复制 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源代码代码语言:javascript复制 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.互联网资源



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有