java图书信息管理系统课程设计报告(共26页).doc
精选优质文档-倾情为你奉上*实践教学*软件学院2014年春季学期Java课程设计 说明书题 目: 专业班级: 姓 名: 学 号: 指导教师: 成 绩: 专心-专注-专业目录摘要当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机网被广泛应用于管理信息系统的外部环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息处理,不仅提高了工作效率,而且大大的提高了其安全性。尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。计算机进行信息管理与管理信息系统的开发密切相关,系统的开发是系统管理的前提。本系统就是为了管理好图书馆信息而设计的。图书馆作为一种信息资源的集聚地,图书和用户借阅资料繁多,包含很多的信息数据的管理。关键词:系统管理,信息管理,信息数据 序言随着社会经济的迅速发展和科学技术的全面进步,计算机事业的飞速发展,以计算机与通信技术为基础的信息系统正处于蓬勃发展的时期。随着经济文化水平的显著提高,人们对生活质量及工作环境的要求也越来越高。书籍做为人类的精神食粮,在现代社会中越来越受到重视,大量的书籍出现在市场上,人们有了各种各样不同的选择。与此同时,为了管理大量的图书,图书管理系统也大量的出现,随着图书的大量增加,其管理难度也越来越大,如何优化管理也就成为了一个大众化的问题。 现已有的图书管理系统,其功能已十分强大,为了便于管理员对图书管理系统进行妥善的管理和读者的查询,图书管理系统为管理员提供了管理日志、管理员添加、管理员切换、读者添加、读者修改、读者查询、读者删除、新书入库等功能,为读者提供了书籍查询、读者借阅信息查询、图书网上续借等很多功能。 大学为我们提供了自由的学习环境,使我们有更多的时间到图书馆借阅书籍,让我们可以随时掌握各方面的知识,不断提高自我、充实自我,但由于图书馆藏书成千上万,我们很难一本一本的去查找自己感兴趣的书籍,因此我们会经常用到学校为我们提供的图书管理系统,用时间长了便对此产生了兴趣,正好本次课程设计为我们提供了良好的机会,让我们亲自设计并实现了图书管理系统的部分功能。 设计一个图书管理系统必不可少的必须对全管书籍进行分类汇总。而这就是我们所说的数据库设计的第一阶段:需求分析。在这一阶段除了对具体情况诸如实行对管理员的管理、对读者的管理、书籍管理、书籍的借阅与归还、借阅超时等功能的实现,还需要对用户的需求进行调查和分析,否则就失去了设计这个系统的意义了。 对于界面的设计我们应该追求的是:美观、易读性强、清晰度高;原则是:不能因为刻意追求美观而以整个界面的清晰度的牺牲作为代价,不能为了清晰度而抛弃对易读性的追求。再设计的过程中我们应该根据实际的情况进行设计,做到具体问题具体分析,不刻意追求原则。1、需求分析1.1功能需求1.1.1图书信息管理功能:u 查询:按作者、按图书名。u 增添:包括图书的书名、作者、出版社、价格、页数、出版时间等信息。u 删除:删除已添加的图书记录。u 修改:对图书信息的更改。1.1.2数据库图书基本信息:包括的数据项有:书名、作者、出版社、价格、页数、出版时间等信息。1.2可行性分析 由于本系统管理的对象单一,都是图书生,且每个数据内容具有较强的关联性,涉及的过程不是很复杂。因此,比较适合于采用数据库管理。在技术难度方面,由于有指导老师的指导和相关参考文献,因此完全可以实现。本系统的设计使用Java开发而成的。数据库是图书信息管理系统中的重要支持技术,在图书信息管理系统的开发过程中,如何选择数据库是一个重要的问题,本系统采用Microsoft Access数据库来进行图书信息的管理,采用Microsoft Access数据库的理由是由于本系统的开发是基于本地客户端的,仅仅利用数据库来进行数据的查询,增加,修改,删除,并不涉及数据库的高级操作,如触发器,存储过程,同时,由于本系统是基于本地化的,不涉及网络方面的应用,而Microsoft Access遵循SQL的语法,完全支持标准SQl的各种操作,完全满足上述需要。本系统数据量不是很大,不用使用大型的数据库来存储数据。 2、设计思路2.1工作原路图书信息管理系统图书信息删除图书信息修改图书信息查找图书信息添加2.2功能规划系统开发的总体任务是实现图书信息管理的系统化,规范化和自动化。 图书信息管理系统需要完成的功能主要有: 1. 图书信息的添加,信息书名、作者、出版社、价格、页数、出版时间等信息。 2. 图书信息的修改3. 图书信息的删除 对上述各功能进行集中、分块、按照结构化程序设计的要求。3、详细设计3.1数据分析系统设计的总体任务是实现图书信息管理的系统化,规范化和自动化。要求实现的功能有1.图书信息的输入,包括图书编号、书名、作者、出版社、出版日期、图书简介及图书类别等。2.图书信息的查询,包括根据用户的要求实现利用图书编号、书名、作者、出版社、出版日期、图书简介及图书类别等信息的查询。3.图书信息的修改,要求能包括根据用户的要求实现利用图书编号、书名、作者、出版社、出版日期、图书简介及图书类别等信息的修改等。3.1.1程序流程图选择操作开始退出系统图书信息添加图书信息修改图书信息删除改图书信息查询结束3.2算法思路首先,考虑到由于操作人员的计算机知识可能较差,要求有良好的人机界面,我决定使用图形界面的方式,采用Java Swing来提供一个表格将图书信息全部显示出来,这样方便用户浏览,当用户对其中的图书信息感兴趣时,可以用鼠标点击表格中的单元格,在表格的下面我提供了一个文件面板,上面放置了很多文本区域,将用户选择的信息全部显示在文本区域中,这样用户可以更加方便的对信息进行添加,修改,删除操作。利用图形界面,提供一个更加友好的方式。用户就不会面对黑乎乎的命令行界面,可以利用鼠标来实现图书信息的修改删除,这样的系统就可以降低对用户的要求,通过将系统的各种功能封装,只是提供给用户一个简单的按钮,用户通过简单的利用鼠标点击按钮,就可以实现各种复杂的操作,这样就可以,提高系统的可用性。 当然 复杂的实现过程对用户来说是不可以见的。 第二,考虑到使用图形界面的方式,当有很多数据时,就有必要使用数据库来保存数据了,使用数据库可以很好的利用数据库的海量存储功能,保存信息更加的方便。理由之二是由于本系统管理的对象图书,都是学生,且每个数据内容具有较强的关联性,涉及的过程不是很复杂。因此,比较适合于采用数据库管理。理由之三是因为当对数据进行各种修改操作时,使用数据库可以更加方便的保存用户的各种修改操作。理由之四是将数据库与图形界面向结合能提供一个更加友好的界面。第三,关于图书信息的录入功能,我是在表格下面提供一个面板,在面板上放置很多文本按钮,用户可以在文本区域中录入图书信息,考虑到本系统实现的只是一个很简单的图书信息管理。而对图书来说录入图书编号、书名、作者、出版社、出版日期、图书简介及图书类别就已经足够了,其他的信息对于图书来说就不必要了。在图书信息的录入时,考虑到图书信息的规范性,同时也考虑到实用性,对与图书来说,图书编号一般采用ISBN开头,所以用户在录入图书信息时,也要要求用户对图书额编号采用ISBN开头,ISBN后面的内容用户可以根据自己喜好进行自定义,系统不做具体要求,由于数据表Book采用图书编号作为主键,所以对于用户输入的图书编号必须保证唯一性,唯一性是通过查询数据库来实现的。当图书编号相同时,同时用户编号重复,要求用户重新输入。用户在修改图书信息时要求不能修改图书编号,因为图书编号是主键,在更新图书信息时,是采用判断图书编号信息的来实现图书信息的修改的,关于图书信息的删除,很简单,利用图书主键就可以很快的删除图书信息。最后一点是,在用户选择图书信息时,要求一次只能选择一条图书记录,因为选择多条图书记录不能确定到底显示哪一条数据的信息,这主要是通过设置表格的单选属性实现的。第四,图书信息中包含出版日期,而一般图书日期是采用YYYY-MM-DD的形式,很少采用YYYY-MM-DD-HH-MM-SS形式的,所以出版日期也采用YYYY-MM-DD的形式。而数据库在存储时间格式的数据时,会检测数据的有效性,如果数据错误,就会抛出异常,当出现这样的情况时,用户所做的所有操作将会全部撤销,而且当用户面对一堆错误信息时,往往不知道怎样处理,这样会导致用户的不满意,如果能在用户输入时就开始检测用户输入信息的有效性,就可以将错误消灭在萌芽状态。时间的正确与否是通过判断出版日期的年份,月份,日来实现的,一般来说首先就要判断是否为闰年,闰年的判断是通过判断如果能被四整除同时不能被100整除,或者能整除100,满足时则为闰年,为闰年判断二月天数是否超过29天,不为闰年时则判断2月的天数是否大于28天。其他月份则判断是否有31天这种情况,一般来说1月,3月,5月,7月,8月,10月,12月有31天,所以如果月份为上述值时,日期可以有31天,其他月份最大天数则为30天,同时还有判断用户输入的月份能是否合理,正常情况下,一年有12个月,所以必须判断用户输入的月份是否大于12,还有一种情况是年月日必须大于0,这也是一种对非正常情况的处理,防止恶意用户输入非法数据来实现非法目的,同时也能防止,用户无意间输入了非法数据。第五,判断日期是否正确具有普遍意义,以为在用户修改图书的出版日期,通过出版日期来实现图书信息的查询时,也要判断日期是否合理,所以可以将判断日期合理的功能封装为一个函数,在判断时,直接调用函数就可以了。其中在查询图书信息时,考虑到用户可能利用月份与日来查询信息,所以还必须通过一个利用月份与日来判断时间输入正确与否的函数,也与上面的函数极其相似。这里就不讨论了。第六,在查询图书信息时,要求能利用多种条件来实现复合查询,比如说利用出版时间与图书信息来查询,或者通过出版社与时间来查询,这就要求查询能灵活处理各种情况,既能够使用单关键字来查询,也能够使用多关键字来查询。首先要解决的时如何判断用户的到底是想用单关键字还是使用多关键字来查询,思路是通过提供给用户一个复选框,当用户想使用某个关键字时,可以勾选关键字前面的复选框,从而实现单关键字与多关键字的判断,第二是由于多关键字可以组合出很多中情况,如果一一实现是不可能,同时也是不必要的,所以必须通过通用的查询函数来实现多关键字的查询,思路是通过判断关键字是否为空来实现的,如果关键字不为空就可以增加一个条件来实现多关键字的查询。第七,在通过多关键字的查询时,要求在利用时间来查询时,能够查询小于 大于给点时间的记录,思路是提供一个组合框,将大于,小于,等于,大于等于,小于等于放入组合框中,通过监听组合框选项的变化得到用户的选择,从而实现查询大于,或者小于某个时间范围的记录,而默认查询是查询全部数据的。当然用户根据自己喜好利用多关键字实现复合查询操作第八,在表格中数据很多时,要求能利用表格某列数据为关键字实现对数据的排序,这是利用RowSorter<DefaultTableModel> sorter = newTableRowSorter<DefaultTableModel>(tablemodel);jTable1.setRowSorter(sorter);实现的。最后一点,是在进行图书信息的插入,修改,删除时,要求能显示执行结果,成功或者失败,在操作失败时要求能提供失败信息,主要是通过判断执行语句的返回值是否为真。为说明执行成功,为假则说明操作失败,这时系统会打印堆栈信息,同时提示用户操作失败。如果操作成功要求能自动刷新,将最新结果显示出来,这主要是通过refresh的事件监听实现的,当操作成功时,重新执行查询操作,查询数据库中最新的结果。并显示出来,以上是基本思路。3.3类设计l 图书类,主要提供setter与getter方法l 自定义画板类l 实现表格方法类l 封装连接 MySQL数据库与按条件进行数据库查询操作l 提供多种选择进行复合条件查询l 实现在复合条件查询下的SQL语句并将结果用表格显示出来l 主类:主要是提供增加,删除,修改,查询图书记录的功能3.4功能实现创建图书信息表Create table book(BID varchar(20) primary key,Bname varchar(20) not null ,Bauthor varchar(16) not null ,Press varchar(20) not null ,BInfo varchar(50) not null ,BDate date not null,Bclass varchar(20) not null ,);3.4.1主要代码及注释import java.awt.*;import java.awt.event.*;import java.io.*;public class LibraryInformation implements ActionListener Frame mainFrame;Frame inputFrame;Frame searchFrame;TextArea liInfo;Label lb = new Label7;Label lb2 = new Label2;TextField tf = new TextField7;TextField tf2 = new TextField2;Button btn = new Button3;Button btn2 = new Button2;Panel p1, p2, p3, p4;IOOperation ioo;Library li;Library library = new Library20; public LibraryInformation() /* 建立主类*/mainFrame = new Frame("图书信息管理系统");mainFrame.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0);); MenuItem item1 = new MenuItem("录入");MenuItem item2 = new MenuItem("查询");MenuItem item3 = new MenuItem("更改");MenuItem item4 = new MenuItem("结束");MenuItem item5 = new MenuItem("关于");item1.addActionListener(this);item2.addActionListener(this);item3.addActionListener(this);item4.addActionListener(this);item5.addActionListener(this); Font f=new Font("宋体",Font.PLAIN,18);Menu menu1 = new Menu("菜单"); menu1.setFont(f);menu1.add(item1);menu1.add(item2);menu1.add(item3);menu1.addSeparator();menu1.add(item4);Menu menu2 = new Menu("帮助"); menu2.setFont(f);menu2.add(item5);Menu menu3=new Menu("结束");MenuBar mb = new MenuBar();mb.add(menu1);mb.add(menu2);mainFrame.setMenuBar(mb);liInfo = new TextArea();liInfo.setFont(new Font("serif", Font.PLAIN,25);mainFrame.add(liInfo);mainFrame.setSize(400, 250);mainFrame.setLocation(400, 400);mainFrame.setVisible(true); mainFrame.setForeground(Color.red); mainFrame.setBackground(Color.red);/* 建立录入信息*/inputFrame = new Frame();inputFrame.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) inputFrame.setVisible(false););p1 = new Panel(new GridLayout(7, 2);p2 = new Panel();String lbname = "书号:", "书名:", "作者:", "出版社:","价格:", "页数:", "出版时间:"String btnname = "保存", "删除", " 退出 "for(int i=0; i<7; i+) lbi = new Label(lbnamei);tfi = new TextField(15);p1.add(lbi);p1.add(tfi);for(int i=0; i<3; i+) btni = new Button(btnnamei);btni.addActionListener(this);p2.add(btni);btn2.setActionCommand("输入");inputFrame.add(p1, BorderLayout.CENTER);inputFrame.add(p2, BorderLayout.SOUTH);inputFrame.pack();inputFrame.setLocationRelativeTo(mainFrame);/*建立查找信息*/searchFrame = new Frame("查询书名");searchFrame.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) searchFrame.setVisible(false););p3 = new Panel(new GridLayout(2, 2);p4 = new Panel();String lbname2 = "书号:", "书名:"String btnname2 = "查询", "退出"for(int i=0; i<2; i+) lb2i = new Label(lbname2i);tf2i = new TextField(15);p3.add(lb2i);p3.add(tf2i);for(int i=0; i<2; i+) btn2i = new Button(btnname2i);btn2i.addActionListener(this);p4.add(btn2i);btn21.setActionCommand("查询");searchFrame.add(p3, BorderLayout.CENTER);searchFrame.add(p4, BorderLayout.SOUTH);searchFrame.pack();searchFrame.setLocationRelativeTo(mainFrame);/* IO operation object*/ioo = new IOOperation();library = ioo.getAllLibrary();public void actionPerformed(ActionEvent e) if (e.getSource() instanceof MenuItem) MenuItem mi = (MenuItem) e.getSource();if (mi.getLabel().equals("录入") inputFrame.setTitle("录入");for(int i=0; i<7; i+)tfi.setText("");p2.remove(btn1);btn0.setActionCommand("输入");inputFrame.setVisible(true);else if (mi.getLabel().equals("查询") searchFrame.setVisible(true);else if (mi.getLabel().equals("更改") inputFrame.setTitle("更改");if(li != null) tf0.setText(li.getCode();tf1.setText(li.getName();tf2.setText(li.getWriter();tf3.setText(li.getPlace();tf4.setText(li.getMoney();tf5.setText(li.getAge() + "");tf6.setText(li.getTime() + "");p2.remove(btn2);p2.add(btn1);p2.add(btn2);btn0.setActionCommand("更改");inputFrame.setVisible(true); else if (mi.getLabel().equals("结束")System.exit(0);else if (mi.getLabel().equals("关于") final Dialog progInfo = new Dialog(mainFrame, "ProgInfo", true);progInfo.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) progInfo.dispose(););progInfo.setLayout(new FlowLayout();Font myFont=new Font("楷体_GB2312",Font.BOLD,40);Label l = new Label("图书信息管理系统");l.setFont(myFont);progInfo.add(l);progInfo.setSize(400,200);progInfo.setLocationRelativeTo(mainFrame);progInfo.setVisible(true);else Button btn = (Button)e.getSource();if(btn.getLabel().equals("保存") if(!tf0.getText().equals("") &&!tf1.getText().equals("") &&!tf2.getText().equals("") &&!tf3.getText().equals("") &&!tf4.getText().equals("") &&!tf5.getText().equals("") &&!tf6.getText().equals("") Library l = new Library(tf0.getText(),tf1.getText(),tf2.getText(),tf3.getText(),tf4.getText(),Integer.parseInt(tf5.getText(),Integer.parseInt(tf6.getText();if(btn.getActionCommand().equals("输入") for(int i=0; i<library.length; i+) if(libraryi = null) libraryi = l;break;ioo.write(library);else for(int i=0; i<library.length; i+) if(libraryi.equals(li) libraryi = l;break;ioo.write(library);inputFrame.setVisible(false);liInfo.setText("");else if(btn.getLabel().equals("删除") int index = 200;if(li != null) for(int i=0; i<library.length; i+) if(libraryi!=null && libraryi.equals(li) index = i;if(i != library.length-1)libraryi = libraryi+1;elselibraryi = null;if(i=index && libraryi+1=null)break;else if(i>index && i<library.length-1) libraryi = libraryi+1;if(i = library.length - 1)libraryi = null;ioo.write(library);li = null;inputFrame.setVisible(false);liInfo.setText("");/*for(int i=0; i<library.length; i+) if(libraryi!=null)System.out.println(i + " " + libraryi.getCode();*/else if(btn.getLabel().equals("查询") li = null;if(!tf20.getText().equals("") |!tf21.getText().equals("") String condition = ""if(!tf20.getText().equals("") condition = tf20.getText();elsecondition = tf21.getText();for(int i=0; i<library.length; i+) if (libraryi != null) if (libraryi.getCode().equals(condition) |libraryi.getName().equals(condition) li = libraryi;break;if(li != null) liInfo.setText("书号: " + li.getCode() + "n" +"书名: " + li.getName() + "n" +"作者: " + li.getWriter() + "n" +"出版社: " + li.getPlace() + "n" +"价格: " + li.getMoney() + "n" +"页数: " + li.getAge() + "n" +"出版时间: " + li.getTime() );searchFrame.setVisible(false);else if(btn.getLabel().equals(" 退出 ")if(btn.getActionCommand().equals("输入")inputFrame.setVisible(false);elsesearchFrame.setVisible(false);public static void main(String args) new LibraryInformation();/*图书信息接口*/class Library implements Serializable private String code;private String name;private String writer;private String place;private String money;private int Age;private int Time;public Library(String code, String name, String writer, String place,String money, int age, int time) super();this.code = code;this.name = name;this.writer = writer;this.place = place;this.money = money;Age = age;Time = time;public String getPlace() return place;public int getAge() return Age;public String getCode() return code;public int getTime() return Time;public String getName() return name;public String getWriter() return writer;public String getMoney() return money;public boolean equals(Object obj) if(obj != null && (obj instanceof Library)if(this.getCode().equals(Library)obj).getCode() &&this.getName().equals(Library)obj).getName() &&this.getWriter().equals(Library)obj).getWriter() &&this.getPlace().equals(Library)obj).getPlace() &&this.getMoney().equals(Library)obj).getMoney() &&this.getAge() = (Library)obj).getAge() &&this.getTime() = (Library)obj).getTime()return true;return false;/* class which is used to do I/O operation*/class IOOperation private File file = new File("C:liinfo.txt");public IOOperation() try if(!file.exists()file.createNewFile(); catch (IOException e) e.printStackTrace();/* 写菜单*/public void write(Library l) try FileOutputStrea