目录1 需求分析 (1)2 概要设计 (3)3详细设计 (6)4调试分析 (14)5用户使用说明 (15)6测试结果 (22)7结论 (23)8致谢 (24)9附录 (25)10参考文献 (32)摘要随着社会发展的多元化、信息化,订阅报刊的管理已经成为一个令人头痛的事情。
由于现在报刊总类繁多,需求量大,交易速度快,如何在最短的时间内,对各种报刊进行有效的管理,已成为十分迫切的问题。
本系统是一个基于JAVA和数据库的企业报刊订阅管理系统。
系统是智能化的管理系统,它面向企业所有的部门的职业用户,但具有安全性。
它能够实现报刊订阅的基本功能,包括对用户、报刊信息的录入、统计、增删改查等操作。
用户合法注册后必须输入有效密码才能成功进入此系统,可以进行报刊订阅与退订,修改个人信息和订单信息等操作。
关键词:报刊订阅管理系统,JAVA,数据库引言随着社会不断的发展,人们的生活水平越来越高,对知识和时事的渴求也越来越高,人们希望能够方便快捷地订阅各种报刊杂志。
但是各种各样的报刊名目和详细信息以及订阅,为相关企业的管理造成很大的麻烦。
因此我们想到开发一个报刊订阅管理系统。
在本系统中,需要实现:管理员可以录入用户信息,报刊信息,同时可按用户名、报刊名、部门对系统进行相应的查询信息以及统计信息等功能;用户可以注册、更新自己的信息,同时还可以订阅、退订报刊和查询、修改订单。
1 需求分析一直以来,人们在企业单位中都是使用传统人工方式管理单位的报刊订阅,这种管理方式存在着许多缺点,譬如,效率低,保密性差,而且时间一长,将产生大量的文件和数据,难以归类整理,这对于查找、更新和维护都带来了不少的麻烦。
通过学习,了解了JAVA、数据库,并在本次课程设计中利用这些知识点,实现一个面向于企业的报刊订阅管理系统,能够通过计算机和数据库对本单位的报刊订阅进行一系列的管理,实现智能化管理,克服了传统人工管理方式的缺点以及弊端。
在报刊订阅管理系统中,要实现:管理员可以录入用户信息,报刊信息,同时可按用户名、报刊名、部门对系统进行相应的查询信息以及统计信息等功能;用户可以注册、更新自己的信息,同时还可以订阅、退订报刊和查询、修改订单。
订阅信息处理的特点是订阅信息处理量比较大,所管理的信息信息种类繁多,而且订阅单、编辑单的发生量特别大,关联信息多,查询和统计的方式各不相同。
因此在管理上实现起来有一定因难。
本系统在设计过程中,为了克服这些困难,需要使程序代码标准化,软件统一化,确保软件的可维护性和实用性;删除不必要的管理冗余,实现管理规范化、科学化;界面友好、简单化,做到实用、方便,尽量满足报刊订阅中员工的需要。
1.1任务与分析(1)界面需求:用户界面简洁明了,提供功能实用,按钮逻辑排列清晰,容易使用。
(2)登陆功能需求:通过数据库连接,对管理员ID和密码进行身份验证,进入报刊订阅管理系统界面。
(3)录入功能: 1)系统管理员可以录入新用户信息,,信息一旦提交就存入到后台数据库中;2) 系统管理员可以录入新报刊信息,,信息一旦提交就存入到后台数据库中。
(4)订阅功能:系统管理员可以代替用户订阅报刊,系统自动计算所需金额。
(5)查询功能:1) 管理员可以按人员查询信息。
2) 管理员可以按报刊查询信息。
3) 管理员可以按部门查询信息。
(6)统计功能:1) 管理员可以按人员统计信息。
2) 管理员可以按报刊统计信息。
3) 管理员可以按部门统计信息。
(7)注册:新用户可以注册新帐号,并且将新用户的数据提交到数据库中。
1.2测试数据(1)管理员:用户名(admin)、密码(admin)。
(2)录入报刊信息:报刊代号(1-3)、报刊名称(华西都市报)、出版社(华西都市报出版社)、出版日期(2016-05-10)、内容介绍(生活)、季度报价(45)。
(3)注册:用户帐号(3120130901506)、真实姓名(赵六)、用户密码(1234)、联系电话(183********)、部门名称(公关部)、部门号(0135)、用户联系地址(西华大学)。
(4)订阅报刊:用户帐号(3120130901506)、真实姓名(赵六)、报刊代号(1-3)、报刊名称(华西都市报)、部门名称(公关部)、部门号(0135)、订阅份数(2)。
2 概要设计报刊订阅管理系统功能结构图如下:本系统分为六大模块:(1)登录功能:登录系统为身份验证登录。
分为管理员登录和一般用户登录。
分别通过不同的用户名和密码进入报刊订阅管理界面,新的用户需要注册。
(2)录入新信息功能:录入报刊和用户信息,并能对报刊和用户信息进行增删改查。
(3)订阅功能:用户可以订阅报刊,系统自动计算所需金额,并显示在界面上。
(4)查询功能:按人员查询、按报刊查询、按部门查询有关订阅信息,对查询结果能进行预览和打印。
(5)统计功能:按报刊统计、按人员统计、按部门统计,对统计结果能进行预览和打印。
(6)系统维护:权限管理,管理员只能登录管理员界面,用户只能根据正确的用户名和密码登录用户界面。
E-R如下:数据库设计如下: admin管理员表book订单表users用户表newspaper报刊表3 详细设计3.1主函数的实现(1)连接数据库(Dbutils.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;public class Dbutils {private static String driver;private static String url;private static String user;private static String pwd;private static ResourceBundlerb=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.java 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();//释放当前窗口}}3.2数据录入实现录入报刊信息(录入用户信息和对用户、报刊、订单的增删改查与之类似) (1)LoggingdataNewspaper.javapublic 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);}}(2)InformationDaoImpl.java//添加报刊public void addNews(newspaper n){//定义一个空的连接对象Connection conn=null;//定义一个准备sql语句PreparedStatement ps=null;//自定义将要执行的sql语句String sql="insert intonewspaper(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) {// TODO 自动生成的 catch 块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=? ";//通过Dbutils得到数据库的连接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);}}4 调试分析(1)在按条件进行统计时,不能显示任何信息。