《报刊订阅管理系统——课程设计说明书.doc》由会员分享,可在线阅读,更多相关《报刊订阅管理系统——课程设计说明书.doc(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、报刊订阅管理系统目 录 1 需求分析12 概要设计33详细设计64调试分析145用户使用说明156测试结果227结论238致谢249附录2510参考文献32摘 要 随着社会发展的多元化、信息化,订阅报刊的管理已经成为一个令人头痛的事情。由于现在报刊总类繁多,需求量大,交易速度快,如何在最短的时间内,对各种报刊进行有效的管理,已成为十分迫切的问题。本系统是一个基于JAVA和数据库的企业报刊订阅管理系统.系统是智能化的管理系统,它面向企业所有的部门的职业用户,但具有安全性。它能够实现报刊订阅的基本功能,包括对用户、报刊信息的录入、统计、增删改查等操作.用户合法注册后必须输入有效密码才能成功进入此系
2、统,可以进行报刊订阅与退订,修改个人信息和订单信息等操作.关键词:报刊订阅管理系统,JAVA,数据库 引 言随着社会不断的发展,人们的生活水平越来越高,对知识和时事的渴求也越来越高,人们希望能够方便快捷地订阅各种报刊杂志。但是各种各样的报刊名目和详细信息以及订阅,为相关企业的管理造成很大的麻烦。因此我们想到开发一个报刊订阅管理系统。在本系统中,需要实现:管理员可以录入用户信息,报刊信息,同时可按用户名、报刊名、部门对系统进行相应的查询信息以及统计信息等功能;用户可以注册、更新自己的信息,同时还可以订阅、退订报刊和查询、修改订单。1 需求分析 一直以来,人们在企业单位中都是使用传统人工方式管理单
3、位的报刊订阅,这种管理方式存在着许多缺点,譬如,效率低,保密性差,而且时间一长,将产生大量的文件和数据,难以归类整理,这对于查找、更新和维护都带来了不少的麻烦。通过学习,了解了JAVA、数据库,并在本次课程设计中利用这些知识点,实现一个面向于企业的报刊订阅管理系统,能够通过计算机和数据库对本单位的报刊订阅进行一系列的管理,实现智能化管理,克服了传统人工管理方式的缺点以及弊端。在报刊订阅管理系统中,要实现:管理员可以录入用户信息,报刊信息,同时可按用户名、报刊名、部门对系统进行相应的查询信息以及统计信息等功能;用户可以注册、更新自己的信息,同时还可以订阅、退订报刊和查询、修改订单。订阅信息处理的
4、特点是订阅信息处理量比较大,所管理的信息信息种类繁多,而且订阅单、编辑单的发生量特别大,关联信息多,查询和统计的方式各不相同。因此在管理上实现起来有一定因难。本系统在设计过程中,为了克服这些困难,需要使程序代码标准化,软件统一化,确保软件的可维护性和实用性;删除不必要的管理冗余,实现管理规范化、科学化;界面友好、简单化,做到实用、方便,尽量满足报刊订阅中员工的需要。1.1任务与分析 (1)界面需求:用户界面简洁明了,提供功能实用,按钮逻辑排列清晰,容易使用。(2)登陆功能需求:通过数据库连接,对管理员ID和密码进行身份验证,进入报刊订阅管理系统界面。(3)录入功能: 1)系统管理员可以录入新用
5、户信息,信息一旦提交就存入到后台数据库中;2) 系统管理员可以录入新报刊信息,,信息一旦提交就存入到后台数据库中。(4)订阅功能:系统管理员可以代替用户订阅报刊,系统自动计算所需金额. (5)查询功能:1) 管理员可以按人员查询信息。2) 管理员可以按报刊查询信息。3) 管理员可以按部门查询信息.(6)统计功能:1) 管理员可以按人员统计信息。2) 管理员可以按报刊统计信息。3) 管理员可以按部门统计信息。(7)注册:新用户可以注册新帐号,并且将新用户的数据提交到数据库中。1。2测试数据 (1)管理员:用户名(admin)、密码(admin)。(2)录入报刊信息:报刊代号(1-3)、报刊名称(
6、华西都市报)、出版社(华西都市报出版社)、出版日期(20160510)、内容介绍(生活)、季度报价(45)。(3)注册:用户帐号(3120130901506)、真实姓名(赵六)、用户密码(1234)、联系电话(18394842934)、部门名称(公关部)、部门号(0135)、用户联系地址(西华大学)。(4)订阅报刊:用户帐号(3120130901506)、真实姓名(赵六)、报刊代号(1-3)、报刊名称(华西都市报)、部门名称(公关部)、部门号(0135)、订阅份数(2)。2 概要设计 报刊订阅管理系统功能结构图如下:登录用户查询、修改信息订阅、退订报刊查询、修改订单按用户查询按报刊查询管理员统
7、计录入用户信息(增删改查)报刊信息(增删改查)查询按部门查询注册按用户统计按报刊统计按部门统计本系统分为六大模块:(1)登录功能:登录系统为身份验证登录。分为管理员登录和一般用户登录。分别通过不同的用户名和密码进入报刊订阅管理界面,新的用户需要注册。(2)录入新信息功能:录入报刊和用户信息,并能对报刊和用户信息进行增删改查.(3)订阅功能:用户可以订阅报刊,系统自动计算所需金额,并显示在界面上。(4)查询功能:按人员查询、按报刊查询、按部门查询有关订阅信息,对查询结果能进行预览和打印。(5)统计功能:按报刊统计、按人员统计、按部门统计,对统计结果能进行预览和打印.(6)系统维护:权限管理,管理
8、员只能登录管理员界面,用户只能根据正确的用户名和密码登录用户界面。ER如下:数据库设计如下:admin管理员表字段名称字段类型允许空说明adminUser(主码)Char(20)否管理员用户名adminPassChar(10)否管理员密码book订单表字段名称字段类型允许空说明userNoChar(10)否用户帐号userNameChar(20)是真实姓名newsNoChar(10)否报刊代号newsNameChar(40)否报刊名称orderAmountInt(4)否订阅份数totalPriceFloat(8)是订阅总额users用户表字段名称字段类型允许空说明userNo(主码)Char(
9、20)否用户帐号userNameChar(20)是真实姓名passwordChar(10)否用户密码phoneChar(20)是联系电话depNameChar(50)是部门名称depNumberChar(10)否部门号addressChar(150)是用户联系地址newspaper报刊表字段名称字段类型允许空说明newsNo(主码)Char(10)否报刊代号newsNameChar(40)否报刊名称publishChar(150)是出版报社pubPeriodChar(30)是出版日期contentChar(200)是内容介绍priceFloat(8)否季度报价3详细设计3。1主函数的实现(1)
10、连接数据库(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 st
11、atic 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) / TO
12、DO 自动生成的 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 st
13、mt,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。javaclass Main extends JFrame imp
14、lements ActionListenerJRadioButton 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,
15、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(
16、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
17、 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(报刊订
18、阅管理系统);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 Loggin
19、gdataNewspaper(); 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().
20、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 InformationDaoImp
21、l();/执行添加用户操作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();/
22、执行添加用户操作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.s
23、etText(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。setP
24、ublish(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)InformationD
25、aoImpl.java/添加报刊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
26、(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.ex
27、ecuteUpdate(); 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 newspap
28、er 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();finallyDbutils.close(conn, ps, null);/通过报刊代号查找报刊public newspaper FindNewsByNewspaper(
29、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.getStrin
30、g(”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();finallyDbutils。close(conn
31、, ps, rs);return news;/更新报刊信息public void updateNewspaper(newspaper news) / TODO Autogenerated method stub/定义一个空的连接对象Connection conn=null;/定义一个准备sql语句PreparedStatement ps=null;/自定义将要执行的sql语句String sql=”update newspaper set publish=? ,pubPeriod=?, content=?, price=? where newsNo=? and newsName=? ;/通过D
32、butils得到数据库的连接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。g
33、etNewsNo());ps。setString(6, news。getNewsName();/执行update SQL语句ps。executeUpdate(); catch (SQLException e) / TODO 自动生成的 catch 块e.printStackTrace();finally/释放连接,同时释放资源Dbutils.close(conn, ps, null);4 调试分析(1)在按条件进行统计时,不能显示任何信息.解决方案:添加刷新面板语句:JPTable。revalidate()。(2)在注册新用户时,用户帐号太长,所以出现了以下错误com。mysql。jdbc.M
34、ysqlDataTruncation: Data truncation: Data too long for column userNo at row 1解决方案:将userNo char(10)改为userNo char(20)。(3)在查询报刊信息时,FindNewsByNewspaper方法类型不匹配,所以出现了以下错误。类型不匹配:不能从 void 转换为 newspaper 解决方案:将FindNewsByNewspaper方法从 void 转换为 newspaper,并添加返回类型.(4)在出现订单时,遇见的错误类型。类型 JTextComponent 中的方法 setText(S
35、tring)对于参数(int)不适用类型 JTextComponent 中的方法 setText(String)对于参数(float)不适用解决方案:因为orderAmount是int类型,而totalPrice是float类型,因此要通过转换才能变为String型。将text7。setText( b.getOrderAmount());text8。setText(b.getTotalPrice());改为:text7.setText(String.valueOf(b.getOrderAmount());text8。setText(String.valueOf(b。getTotalPrice(
36、)));将bo。setOrderAmount(rs.getString(orderAmount);bo.setTotalPrice(rs。getString(price));改为:bo.setOrderAmount(rs。getInt(”orderAmount”));bo.setTotalPrice(rs.getFloat(price));5用户使用说明(小三黑体)1 主界面1.1点击管理员,输入管理员用户名(admin)和密码(admin),点击“登录,进入管理员主界面。1.1.1 点击“录入报刊信息”按钮,进入录入报刊信息界面。1.1.1.1 填写相关信息,点击“添加“,录入报刊信息,并将
37、报刊信息保存到数据库。1.1.1.2 输入报刊代号,点击“查询“,通过报刊代号查找报刊。1.1.1.3 填写需要修改的信息,点击“修改“,修改报刊信息(报刊代号不能修改)。修改出版日期1。1。1.4输入报刊名和报刊代号,点击“删除“,通过报刊号和报刊名删除报刊,同时删除数据库里面的报刊信息.1.1。1。5点击“返回“,返回管理员界面。1。1.2点击“录入用户信息”,进入录入用户信息(与录入报刊信息操作相同)。1。1.3点击“统计”,进入统计界面。1.1。3.1选择统计条件,并输入信息,点击预览。1.1.3。2点击打印。1.1.3。3点击“返回”,返回管理员界面.1。1.4点击“查询”,进入查询
38、系统。(与统计界面操作相同)。1.1.5点击“退出”,返回主界面。1.2 点击“注册”,进入注册界面。1.2.1 填写相关信息,点击“注册,新用户注册成功,跳转到主界面,并将新用户的数据存到数据库。1.2.2 点击“退出”,返回主界面。1。3点击“用户”,填写用户名和密码,点击登录,进入用户界面。1.3。1 订阅报刊界面。1。3。1。1 填写信息(除“订阅总额外),点击“确定”,自动计算订阅总额。1.3.1。2 点击“订阅,数据传入数据库。1.3.1。3输入用户帐号和报刊号,点击查询,通过用户帐号和报刊号查找订单。1.3.1.4填写需要修改的信息,点击修改,修改订单信息(用户帐号和报刊代号不能
39、修改)。修改订阅份数1.3.1.5点击“退订”, 通过用户帐号和报刊代号删除订单。1。3.1.6点击返回,返回用户界面。1。3.2 点击“修改用户信息”,进入修改用户信息界面。1.3。2.1 点击“查询”, 根据用户帐号查询用户信息.1.3.2.2 点击“修改”,修改用户信息(用户帐号不能修改)。修改电话号码1.3。3 点击“退出”,返回用户界面。6测试结果整个系统基本上实现了所有要求,用户可以订阅报刊、退订报刊,查看和修改自己的订单信息,也可修改自己的信息,除了用户帐号。管理员方面,可以添加、删除、修改、查询用户的信息。管理订单方面,管理员可以按人员、按部门、按报刊查询和统计所有的订单信息,
40、并打印出来。本系统的特色在于,用户订阅报刊非常方便,用户只需要输入所要订阅的报刊名和订阅份数,系统会自动计算出这次订阅所需要的金额。由于是初次用JAVA做系统,难免有些不足之处。比如:用户在选择“按报刊统计”,点击预览和打印后,会显示出相应的信息。但是如果你想换个条件进行统计,如“按用户统计”,就必须先点击“退出,再进入统计系统,进行统计。以上是该系统的不足之处,我想在以后继续学习的过程中,我会找到解决的方法。结 论这次课程设计的主要目的是掌握JAVA数据库网络综合程序设计,进一步提高分析解决问题的综合能力.通过这次课程设计,我基本掌握了以上要求。但由于时间比较仓促,所以开发的系统不是很完善,
41、有一些功能还有一些缺陷,但是报刊订阅的基本功能均已实现。以前对JAVA和数据库的很多知识认识都不深刻,做过这次课程设计之后,我对JAVA和数据库的知识有了一个更加深入的了解;比如:对数据的增删改查等的运用已经比较熟练.这个课程设计使我巩固了JAVA和数据库的知识。当我基本完成此系统开发的时候,我发现其实也没有那么难,在未做之前我还害怕做不出来。经过对这个系统的开发,在开发过程中遇到但也解决了很多问题,所以说我们不能惧怕有困难而不去接触认识它,我们要知难而上,只有这样我们才能成长,才能有所发展。 我会继续学习JAVA的知识,学习数据库的知识,只有通过不断的学习充实自己,才能让自己有所得。只有了知识的积淀,才能为自己的发展铺平道路。致 谢 经过将近一个月的努力,此次的课程设计终于画上了圆满的句号,有一种如释重担的感觉。刚拿到了这个题目,完全不知道从何入手。直到老师对我们说要先对题目进行分析,知道你要做什么,再把E-R图画出来,思路要清晰,才让我进入佳境.但是在具体实现的过程中还是遇到了不少的挫折,不过通过老师和同学的支持,我还是努力的把它完成了。通过这次的毕业设计,我的能力有了很大的提高,比如如何使用JAVA对数据库里面的数据进行增删改查等等。这期间得到了很多人的帮助,在此我表示由衷的感谢。没有他们的帮助,我也无法顺利完成这次设
限制150内