Java程序设计说明书.docx_第1页
Java程序设计说明书.docx_第2页
Java程序设计说明书.docx_第3页
Java程序设计说明书.docx_第4页
Java程序设计说明书.docx_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

武汉理工大学Java语言程序设计A课程设计说明书目录图书荐购系统21.需求分析21.1问题描述21.2用例图22.概要设计32.1识别需求文档中的类32.2初步建模类及类间关系32.3初步的UML类图43.详细设计43.1将UML类图转换成Java代码框架43.2数据存储53.3算法设计83.4图形化界面94.调试分析184.1调试过程中遇到的问题及经验体会184.2经验和体会215.用户使用说明225.1用户登录225.2主菜单(征订书目荐购)225.3征订图书荐购2354我要新荐245.5重置密码255.6基本信息维护256参考文献26图书荐购系统1. 需求分析1.1问题描述目前高校都是多专业、多学科的综合性大学,需要的专业图书馆资料相对比较多,基本要覆盖到每一个学科。所以图书馆图书采购过程中主要存在的问题是再众多的图书资料中难以准确订购到有价值的专业图书资料。造成目前这种现象的主要原因是图书馆图书采购人员很难具备各学科、个专业的专业知识,要采购人员具备学校所开专业全部知识又不切实际。所以要掌握相关专业知识的读者、老师参与到图书荐购来。本人选择设计开发“图书馆图书荐购系统”来解决这一冲突。该系统有2种角色权限:读者、管理员。读者进行登录,荐购征订数目,添加图书,修改密码;管理员添加/修改征订数目、馆藏书目,添加/修改/删除读者信息。1.2用例图需求文档简要描述如下:需求:登录需求:读者荐购征订数目,新荐数目,修改密码需求:管理员登录,添加/修改征订数目、馆藏书目,添加/修改读者信息。用例的文字简要描述如下:用例:登录用例:读者服务:荐购征订数目,新荐数目,维护读者信息用例:基本信息管理:添加/修改征订数目、馆藏书目,添加/修改/删除读者信息图(1).图书荐购系统的用例图2. 概要设计2.1识别需求文档中的类1)对需求文档进行名词/名词短语分析,对名词/名词短语加下划线显示:需求:登录需求:读者荐购征订数目,新荐数目,查询馆藏书目,修改密码,退出系统需求:管理员添加/修改征订数目、馆藏数目,添加/修改读者信息。2)需求文档中的名词/名词短语,按照出现顺序,从左到右排列(不重复):读者、管理员、征订书目、馆藏书目、荐购书目而图书荐购系统中主要的对象是书,所以读者、管理员信息可以存在数据库中,通过直接通过条件查询语句来获取。2.2初步建模类及类间关系该系统的类有基类Book,馆藏类LibraryBook、征订书目类RecommendBook、荐购书目类JgBook类继承基类Book,但其子类又有其私有的实例变量和方法。以基类Book,馆藏类LibraryBook为例:Book类的实例变量: private String ISBN; private String bookName; private String press; private String author; private int catagory; private String detail;方法:public Book(String ISBN,String bookName)(2)public Book(String ISBN,String bookName,String press, String author,int catagory,String detail) public String toString() 私有实例变量的getter()/setter()馆藏类LibraryBook的实例变量:private String palce; 方法: public String getPalce() public LibraryBook(String ISBN,String bookName,String press, String author,int catagory,String detail,String palce)2.3初步的UML类图图(2)图书荐购系统的UML类图3. 详细设计 3.1将UML类图转换成Java代码框架根据Visual Paradigm for UML 11.0软件创建UML类图,设计好类图间的关系(继承、泛化、依赖)等,利用该软件工具栏的“程序代码”-“Java来回往返”-“程序代码生成”,完成后生成了相应的Java文件,对生成的Java文件进行适当的修改。3.2数据存储由于图书荐购系统中的数据量比较大且需要长久存储,对数据的存储不能仅仅局限的文件、集合、数组中,所以需要配置sql server数据源,将数据存储在数据库中,实现逻辑层和数据层的分离。本系统的数据库为SQL server2008,开发软件为Eclipse EE,以及画图工具Visual Paradigm for UML 11.0。3.2.1 SqlServer数据源的配置1)在“控制面板”-“系统和安全”“管理工具”中点击“数据源”,添加SQL server的数据源,同时在“SQL配置管理器”将所运行实例MSSQLSERVER的TCP/IP协议开启,并记下其端口1433.如下图(3)图(3)配置SQL数据源2)在windows官网上下载sqljdbc,并将sqljdbc中sqljdbc_auth.dll的文件放在C盘下的System32文件夹下,再通过Eclipse的build path将sqljdbc包导入到项目中。SqlServer的驱动: private static final String DRIVER=com.microsoft.sqlserver.jdbc.SQLServerDriver;连接数据库的URL(windows身份验证):private static final String URL=jdbc:sqlserver:/localhost:1433;DatabaseName=Book;integratedSecurity=TRUE;加载驱动的程序:public Connection getConnection() throws Exceptiontry Class.forName(DRIVER);/加载驱动conn=DriverManager.getConnection(URL);/建立数据库连接return conn; catch(ClassNotFoundException ex) throw new SQLException(驱动错误或数据库连接失败); 3.2.2数据表的关系本系统创建了6张数据表,依次是征订书目表Book_information、书的类别表Book_type、馆藏书目表Libarary_Book、管理员权限表Maneger_login、读者信息表Reader_login1、荐购信息表Recommand。数据库Book的表间的关系如下图(4):图(4)数据库关系图3.2.3 SQL语句本系统主要进行的是数据的增删查改操作,所以编写了DbHelper类来创建数据库对象,数据的增删查改方法。具体代码如下:package init;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class DbHelper private static final String DRIVER=com.microsoft.sqlserver.jdbc.SQLServerDriver;private static final String URL=jdbc:sqlserver:/localhost:1433;DatabaseName=Book;integratedSecurity=TRUE;private Connection conn=null; ResultSet rs=null; PreparedStatement pstmt=null;public Connection getConnection() throws Exceptiontry Class.forName(DRIVER);conn=DriverManager.getConnection(URL);return conn; catch(ClassNotFoundException ex) throw new SQLException(驱动错误或数据库连接失败); /查询语句public ResultSet executeQuery(String sql,String param)try pstmt=conn.prepareStatement(sql); if(pstmt!=null) for(int i=0;iparam.length;i+) pstmt.setString(i+1, parami); rs=pstmt.executeQuery(); catch (SQLException e) e.printStackTrace();return rs; /增删改操作public int executeUpdate(String sql,String param)int num=0;try pstmt=conn.prepareStatement(sql); if(pstmt!=null) for(int i=0;iparam.length;i+)pstmt.setString(i+1, parami); num=pstmt.executeUpdate(); catch (SQLException e) e.printStackTrace();return num;/关闭数据库,释放资源public void closeAll() throws SQLExceptionif(rs!=null)try rs.close(); catch (SQLException e) e.printStackTrace();if(pstmt!=null)pstmt.close();if(conn!=null)conn.close();3.3算法设计由于需要将数据库提取出来的结果集显示在Jlist中,而结果集的大小是不确定的,所以需要泛型ArrayList类型的集合来暂时存储结果集。1) 创建MyTableModel类,并在该类中声明一个返回类型为ArrayList的tabledata()方法,方法的作用是将征订书目表Book_information的ISBN和bookName字段的值查询出来,并存储在Book类型的集合中。方法体如下:public ArrayList tabledata() throws Exception DbHelper db=new DbHelper(); ResultSet rs= db.getConnection().createStatement().executeQuery(select ISBN,bookName from Book_information); ArrayList book=new ArrayList(); while(rs.next() Book bookinf=new Book(rs.getString(ISBN), rs.getString(bookName); book.add(bookinf); return book;2)将集合list添加到JList中显示出来。如JList将DefaultListModel模型填充进来,而DefaultListModel模型添加元素的方法是.addElement(),所以需要Iterator迭代器来遍历arraylist中的每个元素。方法体如下:ArrayList booklist=(new MyTableModel().tabledata(); DefaultListModel m=new DefaultListModel(); Iterator it=booklist.iterator(); while(it.hasNext() m.addElement(it.next().toString();JList list = new JList(m);list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);scrollPane.setRowHeaderView(list); 3.4图形化界面 3.4.1登录界面1)设计思路登录界面作为程序的人口,即只在登录界面中书写main()方法。登录界面有2种角色:读者、管理员。读者权限表和管理员权限表如下表(1)、表(2)表(1)读者权限表用户名密码姓名出生年月日类型荐购权值0121103490201 910812吴兆建19910812本科生50121103490202 930401庞文锵19930401本科生50121103490227 111刘文佳19911214研究生70121103490240 700101张骏19700101教师10表(2)管理员权限表用户名密码lily222sasasandy1112) 源代码由于图形用户界面控件的代码比较多,所以此处仅附上触发事件和方法。登录界面上有2个JRadioButton readerid,manager;2个JButton login,cancel; JRadioButton readerid,manager的触发事件代码如下: boolean mark=true;/mark为TRUE表示读者身份,反之为管理员身份ButtonGroup radiogroup=new ButtonGroup();radiogroup.add(readerid);radiogroup.add(manager); /读者身份readerid.addItemListener(new ItemListener() public void itemStateChanged(ItemEvent e) JRadioButton reader=(JRadioButton) e.getSource(); if (reader.isSelected() mark=true; );/管理员身份manager.addItemListener(new ItemListener() public void itemStateChanged(ItemEvent e) JRadioButton manager=(JRadioButton) e.getSource(); if (manager.isSelected() mark=false; );JButton login,cancel的触发事件如下:public void actionPerformed(ActionEvent event) Object source=event.getSource();if(source.equals(login)try login(); catch (Exception e) e.printStackTrace();else if(source.equals(cancel)cancel();login()的作用是验证用户身份的合法性,方法体如下:private void login() throws Exception, Exception String readersno=txtName.getText().trim();char s=txtpw.getPassword();String pw=(new String(s).trim();if(readersno.equals()|pw.equals()JOptionPane.showMessageDialog(this, 对不起,请输入用户名或密码,error,JOptionPane.ERROR_MESSAGE);else if(check(readersno,pw)this.dispose();if(mark=true) Master frame = new Master(readersno); frame.setVisible(true);else Manager frame = new Manager(); frame.setVisible(true);else JOptionPane.showMessageDialog(this, 对不起,用户名或密码错误,error,JOptionPane.ERROR_MESSAGE);private boolean check(String readersno, String pw) throws Exception boolean flag=false;String s=;DbHelper db=new DbHelper();db.getConnection();if(mark=true) s=select reader_Sno,password from Reader_login1 where reader_Sno=? and password=?;else s=select managerName,managerPw from Maneger_login where managerName=? and managerPw=?;ResultSet rs=db.executeQuery(s, new Stringreadersno,pw);if(rs!=null&rs.next()flag=true;return flag;cancel()是清空文本框,方法体如下:private void cancel() txtName.setText(); txtpw.setText();3.4.2.征订书目荐购界面(主界面)1)设计思路读者登录成功,将进入征订图书荐购界面。此界面是读者通过条件ISBN或书名来快捷检索JList中显示的所有荐购书目的图书来进行荐购操作。同时此界面也是主界面,合法用户可以通过菜单栏来跳转到不同界面。2)源代码由于图形用户界面的控件代码比较多,此处仅附上触发事件代码。此征订书目荐购界面有1个菜单栏JMenuBar menuBar,2个JButton select,buttonOk。菜单栏JMenuBar menuBar下的每个菜单项都注册了不同的方法,代码如下:JMenuItem zdmenuitem= new JMenuItem(征订图书荐购);zdmenuitem.addActionListener(new ActionListener() public void actionPerformed(final ActionEvent e) Master frame1 = null;try frame1 = new Master(username);/创建征订书目荐购的窗体 catch (Exception e1) e1.printStackTrace();frame1.setVisible(true););JMenuItem zjmenuitem = new JMenuItem(我要新荐);zjmenuitem.addActionListener(new ActionListener() public void actionPerformed(final ActionEvent e) NewRecom frame2 = null;try frame2 = new NewRecom(username);/创建我要新荐的窗体 catch (Exception e1) e1.printStackTrace(); frame2.setVisible(true););menubook.add(zdmenuitem);menubook.add(zjmenuitem);JMenuItem resetpwmenuitem = new JMenuItem(修改密码);resetpwmenuitem.addActionListener(new ActionListener() public void actionPerformed(final ActionEvent e) ResetPw frame3 = null;try frame3 = new ResetPw(username);/创建重置密码的窗体 catch (Exception e1) e1.printStackTrace(); frame3.setVisible(true); );JMenuItem exitmenuitem = new JMenuItem(退出);exitmenuitem.addActionListener(new ActionListener() public void actionPerformed(final ActionEvent e) int i=JOptionPane.showConfirmDialog(null,您即将退出应用程序,提示,JOptionPane.YES_NO_CANCEL_OPTION); if(i=JOptionPane.YES_OPTION) System.exit(0););/退出系统menureader.add(resetpwmenuitem);menureader.add(exitmenuitem);JButton select,buttonOk的触发事件代码如下:public void actionPerformed(ActionEvent e) Object source=e.getSource(); ResultSet rs; if(source.equals(select) String combobox=comboBox.getSelectedItem().toString().trim();/选择框取得值String querycondition=querycon.getText().trim(); if( querycondition.equals() JOptionPane.showMessageDialog(this, 检索关键字不能为空,error,JOptionPane.ERROR_MESSAGE); else try rs=select( combobox,querycondition);/调用征订书目条件查询语句 if(rs!=null&rs.next() String isbn=rs.getString(ISBN); String bookname=rs.getString(bookName);String press=rs.getString(press);String author=rs.getString(author);int catagory=rs.getInt(catagory);String detail=rs.getString(detail); /获得书籍的类别ResultSet rs1=db.getConnection().createStatement().executeQuery(select * from Book_type where typeId=+catagory+);rs1.next();zdbook=new Book(isbn,bookname,press,author,catagory,detail); int r=JOptionPane.showConfirmDialog(this, ISBN:+isbn+n+bookname+n+出版社:+press+n+作者:+author+n+类别:+rs1.getString(booktype)+n+详细介绍:+detail,荐购信息,JOptionPane.YES_NO_OPTION);if(r=JOptionPane.YES_OPTION) buttonOk.setEnabled(true); else JOptionPane.showMessageDialog(this, 征订数目中没有您所要荐购的书,error,JOptionPane.ERROR_MESSAGE); buttonOk.setEnabled(false); catch (Exception e1) e1.printStackTrace(); if(source.equals(buttonOk) String original=征订荐购; String param=zdbook.getISBN(),this.username, zdbook.getBookName(),original, zdbook.getPress(),zdbook.getAuthor(); int bookclass= zdbook.getCatagory(); SimpleDateFormat df = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss); String d = df.format(new Date(); String sql=insert into Recommand values(+param0+,+param1+,+param2+,+param3+,+d+,+param4+,+param5+,+bookclass+); try db.getConnection().createStatement().executeUpdate(sql);JOptionPane.showMessageDialog(this, 荐购成功!,error,JOptionPane.ERROR_MESSAGE); catch (SQLException e1) e1.printStackTrace(); catch (Exception e1) e1.printStackTrace(); 条件检索征订书目方法声明如下:select(String ,String)private ResultSet select(String combobox ,String querycondition) throws Exception ResultSet rs = null;String sql = ;if(combobox.equals(ISBN) sql=select * from Book_information where ISBN=? ;if(combobox.equals(书名) sql=select * from Book_information where bookName=? ; db.getConnection(); rs=db.executeQuery(sql, new Stringquerycondition); return rs;3.4.3我要新荐界面1)设计思路合法用户通过手动输入图书的相关信息如ISBN、题名、出版社、作者等来进行荐购。但前提是用户欲荐购的图书是没有馆藏的,如果有馆藏,将不能进行荐购。2)源代码我要新荐界面有2个JButton selectlib,clickok的按钮,selectlib的触发事件是查询馆藏,clickok的触发事件是提交荐购图书并写入数据表中。JButton selectlib,clickok的触发事件代码:查询馆藏标记为mark,初始值为FALSE(有馆藏)public void actionPerformed(ActionEvent event) Object source11=event.getSource();if(source11=selectlib)try selectlib(); catch (Exception e) e.printStackTrace();else if(source11.equals(clickok)String txtIsbn=isbn.getText().trim();/ISBN必填String user=this.uesername;String txtbookName=bookname.getText().trim();/书名必填String txtauthor=author.getText().trim();/作者String txtpress=press.getText().trim();/出版社int booktype=comboBox.getSelectedIndex();/获得选中项的索引String original=自荐; SimpleDateFormat df = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss); String insertsql=; DbHelper db=new DbHelper(); try db.getConnection(); catch (Exception e) e.printStackTrace(); try selectlib(); /查询馆藏 catch (Exception e1) e1.printStackTrace();if(flag=true)insertsql=insert into Recommand values (+txtIsbn+,+user+,+txtbookName+,+original+,+df.format(new Date()+,+txtpress+,+txtauthor+,+booktype+);try db.getConnection().createStatement().executeUpdate(insertsql);catch (Exception e) e.printStackTrace(); JOptionPane.showMessageDialog(this, 荐购成功!);else JOptionPane.showMessageDialog(this, 馆藏已有这本书,不能重复荐购,提示,JOptionPane.INFORMATION_MESSAGE);查询馆藏的语句selectlib()private void selectlib() throws Exception String txtIsbn=isbn.getText().trim();/ISBN必填String txtbookName=bookname.getText().trim();/书名必填if(txtIsbn.equals()|txtbookName.equals() JOptionPane.showMessageDialog(this, ISBN和书名不能为空,error,JOptionPane.ERROR_MESSAGE);else DbHelper db=new DbHelper(); db.getConnection(); String sql=select * from Libarary_Book where ISBN=?; ResultSet rs=db.executeQuery(sql,new String txtIsbn); if(rs.next() JOptionPane.showMessageDialog(this, rs.getString(place)+已有这本书,不能重复荐购,提示,JOptionPane.INFORMATION_MESSAGE); else flag=true;/没有馆藏 JOptionPane.showMessageDialog(this, 您可以直接荐购了,提示,JOptionPane.INFORMATION_MESSAGE); 3.4.4修改密码界面1)设计思路由于读者登录账号和密码是系统自动给定的,尤其是密码是取出生年月日的后6位,也就存在隐私的安全隐患,所以系统提供修改密码的功能。前提是上一个界面必须不通过session或cookies暂时存储登录账号,只能通过页面跳转时将用户名作为新建窗体的构造函数的参数传递。2)源代码public void actionPerformed(ActionEvent arg0) String updatesql=;String user=this.username;String oldpw=new String(passwordField.getPassword().trim();String newpw=new String(passwordField.getPassword().trim();if(oldpw.equals(newpw)&oldpw.equals();updatesql=update Reader_login1 set password=? Where reader_Sno= +user+;DbHelper db=new DbHelper();try db.getConnection(); catch (Exception e) e.printStackTrace();db.executeUpdate(updatesql, new Stringoldpw);this.dispose();LoginIn framelogin=new LoginIn();framelogin.setVisible(true);3.4.5基础数据管理1)设计思路因为读者服务中的征订书目、馆藏书目,读者信息的录入及维护都是由系统设定的管理员进行操作的,而由于时间有限,本功能正在维护中。2)源代码public class Manager extends JFrame private JPanel contentPane; public Manager() setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5); contentPane.setLayout(new BorderLayout(0, 0); setContentPane(contentPane); JDesktopPane desktopPane = new JDesktopPane(); contentPane.add(desktopPane, BorderLayout.CENTER); JLabel lblNewLabel = new JLabel(网站正在维护中。); lblNewLabel.setFont(new Font(华文彩云, Font.PLAIN, 30); lblNewLabel.setBounds(39, 84, 335, 73); desktopPane.add(lblNewLabel);4. 调试分析4.1调试过程中遇到的问题及经验体会1)问题:输出Book类型的对象时,出现诸如对象名哈希值的字符串,而非Book类型的实例变量组成的字符串。如图(5)图(5)征订书目的错误显示原因:所有的类都隐式继承超类Object,如果子类没有重写超类Object的公有方法,输出子类的对象时会隐式调用Object类的公有方法toString(),而Object类的toString()输出的是“对象名哈希值”的字符串。解决方法:在自创建的Book类中重写toString()方法,代码如下:public String toString() return 图书编号:+this.ISBN +书名:+this.bookName; 2)问题:按钮注册了addActionListener(this)监听器,并在actionPerformed()中书写了方法体。但点击按钮时,事件并没有被触发,也没有错误提示。如图(6)图(6)事件触发无效的错误显示原因:变量作用域的问题。以JButton select,buttonOk为例,在窗体程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论