JAVA课程设计图书管理系统.doc
一 可行性研究上个世纪90年代初美国科学家首次提出数字图书馆这一概念以来,全球开展数字图书馆研究与实践已近十几个年头。我国图书情报界、IT业界自1995年左右开始对这一领域跟踪研究,1998年开始全面升温,迄今无论是在对数字图书馆的认识,还是理论研究、关键技术准备方面,都取得了很大的进展。国内数字图书馆的实践活动大致可分为以下三种类型:资源服务型、服务研究型和联合建设型。虽然,从严格意义上讲,资源服务型不能算是数字图书馆,但它的网上信息服务目前已在大多数图书馆开展,是现阶段我国图书情报界提供网上数字服务的主要形式。 随着图书馆规模的不断扩大,图书数量也相应的增加,有关图书的各种信息量也成倍增加,面对着庞大的信息量,传统的人工方式管理会导致图书馆管理上的混乱,人力与物力过多浪费,图书馆管理费用的增加,从而使图书馆的负担过重,影响整个图书馆的运作和控制管理,因此,必须制定一套合理、有效,规范和实用的图书管理系统,对图书资料进行集中统一的管理。系统开发的总的设计目标是实现图书管理的系统化、规范化和自动化,实现对图书资料的集中统一的管理。通过该系统可以实现图书信息的检索、图书借阅管理、用户个人信息的管理等各种功能,实现图书管理的快捷、高效二 需求分析随着计算机应用的日益普及和深化,网上办公已经成为一种趋势。本项目要开发的是基于局域网和互联网的图书管理系统。由于学院藏书量大,借书的学生多,原来的人工工作方式不仅会造成办理时间的延误和人力资源的浪费,特别是在借书高峰期时这种冲突更加明显,而且存在着各种信息不易存放、易丢失、难以备份和查询等缺点。因此,实现一个将各种图书管理和服务功能集成起来的管理信息系统就显得十分必要,既可以节省资源,又可以有效存储、更新、查询信息,提高工作和服务效率。开发的系统要求界面友好,方便直观。既要方便管理员对图书信息进行添加、删除、修改、查询和统计等管理,又要方便学生借书、还书和续借等业务的办理。将数据库发布到互联网上,进行资源共享,方便学生可以在自己的权限内对图书信息进行访问,查询相关信息和进行续借操作。三 总体设计本图书管理系统软件的设计思想符合图书管理的规范工作流程,用户可以通过使用本图书管理系统,缩短管理图书所用的时间,提高了管理图书的效率,使用起来方便灵活。系统的设计包括了一般图书管理系统的主要几个模块,主要分为身份验证、借阅图书、归还图书,打印催还单,信息查询,系统维护,帮助,退出系统几大模块。身份验证主要完成的是管理员的身份验证,即此用户是否有使用该软件的权利;借阅图书模块主要完成借阅图书的一些信息情况;归还图书模块主要完成用户归还图书的情况;打印催还单模块主要完成催促用户归还图书情况,并行成资料库;信息查询模块主要完成对用户借阅信息的查询并形成历史记录,可供随时浏览;系统维护模块主要完成对系统的维护工作;帮助模块主要为用户提关于本系统的一些帮助信息;退出系统模块完成退出本系统工作。本系统不仅方便了用户,而且可以减少工作人员的工作量,提高了工作效率和工作质量。本系统具有以下特点:系统基于网络;操作界面友好,操作方便、快捷、一目了然,而且系统提供查询、添加、修改、删除等功能,方便用户和管理人员使用。四 系统实现具体实现功能如下: 1、安全管理:提供用户登录、注销及修改密码等功能。 2、用户个人信息管理:每个用户可以对自己的信息进行查看以及修改密码等操作,还可以查看当前借阅信息和历史借阅信息。 3、信息发布:用户可以查看当前最新图书信息。 4、图书信息管理:图书管理员可以对图书进行增加及更新操作。 5、图书借阅管理:图书管理员可以对图书进行借阅和归还操作。 6、图书查询:用户可以通过书名以及作者进行查询。主要功能:1登录身份验证 检测用户是否为合法用户,若为合法用户方可使用本系统。此模块还应包含修改用户密码和新增用户的功能。2 借阅图书功能在该模块中采用对图书进行编号,对用户进行编号方式来管理,管理人员点击借阅按钮后可以输入借阅人编号或姓名,系统将进行判断,如果系统的借阅人库中无该借阅人那么系统将给出提示;如果系统中确有其人,则显示借阅人姓名,借阅日期,借阅经手人等相关信息。然后输入借阅图书编码,系统自动判断,如果该书已全部借出,将提示用户;如果书库中尚有该书,将完成本次借阅操作。3 归还图书功能这部分主要完成的是用户归还图书的一些基本信息.在这个模块中点击还书或直接按回车键,光标定位于借阅人编码或姓名项,输入借阅图书的编码,系统考成绩自动判断.如果系统中无该借阅人的借阅信息,那么系统将提示用户;如果系统库中确有该借阅人的信息,那么系统从数据库中读出该借阅人的信息并添入借阅窗口,同时系统还将图书管理员信息,还书日期写入该窗口。4 打印催还单功能打印催还单功能用来显示未还书的用户,列出清单。如果需要打印全部应还书人员的信息,选区择全部打印。5 信息查询功能这部分主要完成个人借阅、催还书目浏览、图书分布情况查询、按关键字查询等几个方面的功能。可以通过个人借阅子菜单来了解个人借阅的一些相关信息;通过图书分布情况查子菜单可以得到关于图书的一些相关信息;也可以通过按关键字查询子菜单实现通过关键字来查询图书的一些相关内容。6 系统维护功能这部分主要是针对于维护系统而设置的,主要完成书库维护、借阅人库维护、管理员库维护、部门库维护以及设定默认还书期限等出个方面的功能。书库维护子菜单可以完对新书的入库以及查询和删除书目等;借阅人库维护子菜单可以实现借阅人的查询等功能;管理员库维护子菜单能够对管理员进行增加、修改、删除等;部门库维护子菜单可以对借阅人所在的部门进行增加、修改和删除;还可以通过默认还书期限子菜单对还书期限进行设置。7 帮助的功能这里主要完成对用户的一些帮助信息。8 退出功能主要完成退出系统的功能。五 软件系统结构分析管理员功能模块如图所示用户功能模块如图所示管理员数据流如图所示用户数据流如图所示六 系统实现主界面功能实现图书管理系统主界面用于管理员对书籍的管理,主要功能包括以下几个部分:图书入库、图书证管理、图书流通管理、统计查询、帮助。运行界面如下图所示:主要程序代码如下:package book;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.sql.*;public class BookInfo implements ActionListenerprivate JFrame frame;private Statement stmt;private Connection con;private JTable tableTest;private StringcolumnNames="书名","条形码","分类号","分类名","排架号","出版社","出版日期","入库日期","状态","简介"private ObjectrowData=new Object10010;private JButton btn;private JRadioButton rbtn1,rbtn2;private JTextField jtfd;public BookInfo()Font s=new Font("楷体",Font.PLAIN,12);UIManager.put("Component.font",s);UIManager.put("Label.font",s);UIManager.put("ComboBox.font",s);UIManager.put("Button.font",s);UIManager.put("Menu.font",s);UIManager.put("MenuItem.font",s);frame=new JFrame("图书信息查询");Container content=frame.getContentPane();btn=new JButton("查询");jtfd=new JTextField();JPanel pl=new JPanel();rbtn1=new JRadioButton("书名");rbtn2=new JRadioButton("条形码");rbtn1.setSelected(true);btn.addActionListener(this);ButtonGroup group=new ButtonGroup();group.add(rbtn1);group.add(rbtn2);pl.setLayout(new GridLayout(1,4,10,0);pl.add(rbtn1);pl.add(rbtn2);pl.add(jtfd);pl.add(btn);tableTest=new JTable(rowData,columnNames);tableTest.setRowHeight(20);tableTest.setPreferredScrollableViewportSize(new Dimension(500, 30);JScrollPane scrollPane=new JScrollPane(tableTest);content.add(pl,BorderLayout.NORTH);content.add(scrollPane,BorderLayout.CENTER);frame.pack();frame.setLocation(100,150);frame.setSize(850,300);frame.setVisible(true);tryClass.forName("sun.jdbc.odbc.JdbcOdbcDriver");con=DriverManager.getConnection("jdbc:odbc:library");stmt=con.createStatement();catch(ClassNotFoundException e)System.err.println(e.getMessage();catch(SQLException e)System.err.println(e.getMessage();public void actionPerformed(ActionEvent e)Object obj=e.getSource();ResultSet result;String sqlStr;int i=0;String str=jtfd.getText().trim();if(rbtn2.isSelected()sqlStr="select bookname,bannercode,kindnumber,kindname,positionnumber,"+"publishingcompany,publishtime,putintime,state,introduction from book where "+"bannercode="+"'"+str+"'"elsesqlStr="select bookname,bannercode,kindnumber,kindname,positionnumber,"+"publishingcompany,publishtime,putintime,state,introduction from book where "+"bookname like '"+str+"%'"tryif(obj=btn)if(str.equals("")JOptionPane.showMessageDialog(frame,"查询输入不能为空!");return;result=stmt.executeQuery(sqlStr);for(int j=0;j<rowData.length;j+)for(int k=0;k<10;k+)rowDatajk=null;tableTest.repaint();while(result.next()if(i<rowData.length)rowDatai0=result.getString("bookname");rowDatai1=result.getString("bannercode");rowDatai2=result.getString("kindnumber");rowDatai3=result.getString("kindname");rowDatai4=result.getString("positionnumber");rowDatai5=result.getString("publishingcompany");rowDatai6=result.getDate("publishtime");rowDatai7=result.getDate("putintime");rowDatai8=result.getString("state");rowDatai9=result.getString("introduction");i+;elseJOptionPane.showMessageDialog(frame,"please specify the bookname!");jtfd.setText("");catch(SQLException sqle)System.err.println(sqle);public static void main(Stringargs)new BookInfo();登录界面实现通过查询Access数据库里面看是否有没有输入的用户名和密码,从而是否允许进入该管理系统,运行界面如下图所示:主要程序代码如下:package book;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.sql.*;public class Login extends JFrameprivate static final long serialVersionUID = 1L;private JLabel JLb1;private JLabel JLb2;private JButton Ok_btn;private JButton Cancel_btn;private JTextField Jtfld1;private JPasswordField Jtfld2;private JFrame frame;private Connection con;private Statement stmt;public Login()JFrame.setDefaultLookAndFeelDecorated(true);frame=new JFrame("登陆");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Container content=frame.getContentPane();content.setLayout(new GridLayout(3,2,20,20);JLb1=new JLabel("用户名:");JLb2=new JLabel("密码:");Jtfld1=new JTextField();Jtfld2=new JPasswordField();Ok_btn=new JButton("确定");Cancel_btn=new JButton("取消");Ok_btn.addActionListener(new ActionHandler();Cancel_btn.addActionListener(new ActionHandler();content.add(JLb1);content.add(Jtfld1);content.add(JLb2);content.add(Jtfld2);content.add(Ok_btn);content.add(Cancel_btn);frame.pack();frame.setLocationRelativeTo(null);frame.setSize(300,200);frame.setVisible(true);tryClass.forName("sun.jdbc.odbc.JdbcOdbcDriver");con=DriverManager.getConnection("jdbc:odbc:library");stmt=con.createStatement();catch(ClassNotFoundException e)catch(SQLException ex)class ActionHandler implements ActionListenerSuppressWarnings("deprecation")public void actionPerformed(ActionEvent e)String str1,str2,username,sqlStr;Object obj=e.getSource();str1=Jtfld1.getText().trim();str2=Jtfld2.getText().trim();tryif(obj.equals(Ok_btn)if(str1.equals("")JOptionPane.showMessageDialog(frame,"用户名不能为空");return;sqlStr="select * from login where user_name="+"'"+str1+"'"+" and psw="+"'"+str2+"'"ResultSet result=stmt.executeQuery(sqlStr);if(result.next()username=result.getString("user_name");if(username.equals("管理员")JOptionPane.showMessageDialog(frame,"欢迎光临!");new MainFrame();elseJOptionPane.showMessageDialog(frame,"欢迎光临!");MainFrame mainFrame=new MainFrame();mainFrame.menuItem3.setEnabled(false);mainFrame.menuItem6.setEnabled(false);mainFrame.menuItem7.setEnabled(false);mainFrame.menuItem8.setEnabled(false);mainFrame.menuItem9.setEnabled(false);frame.dispose();stmt.close();con.close();elseJOptionPane.showMessageDialog(frame,"输入名或密码错误!");elseframe.dispose();stmt.close();con.close();catch(SQLException ex)System.err.println(ex);public static void main(Stringargs)javax.swing.SwingUtilities.invokeLater(new Runnable()public void run()new Login(););图书入库界面实现:图书入库是图书馆管理系统中不可缺少的部分,用于入库图书,通过界面中的文本框接收图书的信息,然后将此信息写入Accesss数据库的表中,在添加过程中判断图书号的位数,已确保图书的有效性。运行界面如下图所示:主要程序代码如下:package book;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.sql.*;import java.text.*;import java.math.*;public class Book implements ActionListenerprivate JButton btn1,btn2,btn3,btn4;private JTextField jtfd1,jtfd2,jtfd3,jtfd5,jtfd6,jtfd7,jtfd8,jtfd9,jtfd10;private JComboBox jcbx;private JTextArea jta;private Connection con;private PreparedStatement pstmt1,pstmt2;private JFrame frame;SuppressWarnings("static-access")public Book()Font s=new Font("楷体",Font.PLAIN,12);UIManager.put("Component.font",s);UIManager.put("Label.font",s);UIManager.put("ComboBox.font",s);UIManager.put("Button.font",s);UIManager.put("Menu.font",s);UIManager.put("MenuItem.font",s);frame=new JFrame("图书入库");Container content=frame.getContentPane();Toolkit tool=frame.getToolkit();SuppressWarnings("unused")Dimension wndsize=tool.getScreenSize();JLabel lb1=new JLabel(" 书名:");JLabel lb2=new JLabel(" 条形码:");JLabel lb3=new JLabel(" 分类号:");JLabel lb4=new JLabel(" 分类名:");JLabel lb5=new JLabel(" 排架号:");JLabel lb6=new JLabel(" 出版社:");JLabel lb7=new JLabel(" 出版日期:");JLabel lb8=new JLabel(" 入库日期:");JLabel lb9=new JLabel(" 价格:");JLabel lb10=new JLabel(" 作者:");JLabel lb11=new JLabel(" 简介:");jtfd1=new JTextField();jtfd2=new JTextField();jtfd3=new JTextField();String kindname="马克思列宁主义、毛泽东思想","综合性图书","哲学","社会科学总论","政治、法律","军事","经济","文化、科学、教育、体育","语言文字","文学","天文学、地球科学","生物科学","医药、卫生","农业科学","工业技术","艺术","历史、地理","数理化","自然科学总论","环境科学","航空航天","交通"jcbx=new JComboBox(kindname);/组合按钮,类似下拉列表jtfd5=new JTextField();jtfd6=new JTextField();jtfd7=new JTextField();jtfd8=new JTextField();jtfd9=new JTextField();jtfd10=new JTextField();jtfd8.addFocusListener(new FocusHandler();/内部类处理焦点事件jta=new JTextArea();/文本域jta.setLineWrap(true);/分配文本域btn1=new JButton("添加");btn2=new JButton("删除");btn3=new JButton("撤消");btn4=new JButton("退出");btn1.addActionListener(this);btn2.addActionListener(this);btn3.addActionListener(this);btn4.addActionListener(this);JPanel pl1=new JPanel();JPanel pl2=new JPanel();JPanel pl3=new JPanel();JPanel pl4=new JPanel();pl1.setLayout(new GridLayout(5,4,6,6);pl1.add(lb1);/书名pl1.add(jtfd1);pl1.add(lb2);/条形码pl1.add(jtfd2);pl1.add(lb10);/作者pl1.add(jtfd10);pl1.add(lb3);/分类号pl1.add(jtfd3);pl1.add(lb4);/分类名pl1.add(jcbx);pl1.add(lb5);/排架号pl1.add(jtfd5);pl1.add(lb6);/出版社pl1.add(jtfd6);pl1.add(lb7);/出版日期pl1.add(jtfd7);pl1.add(lb8);/入库日期pl1.add(jtfd8);pl1.add(lb9);/价格pl1.add(jtfd9);GridBagLayout gridbag=new GridBagLayout();GridBagConstraints constraints=new GridBagConstraints();pl2.setLayout(gridbag);constraints.weightx=constraints.weighty=10.0;constraints.fill=constraints.BOTH;gridbag.setConstraints(lb11,constraints);constraints.weightx=1;constraints.gridwidth=1;pl2.add(lb11,constraints);gridbag.setConstraints(jta,constraints);constraints.weightx=9;constraints.gridheight=3;constraints.gridwidth=3;constraints.insets=new Insets(10,15,10,20);pl2.add(jta,constraints);GridBagLayout gridbag1=new GridBagLayout();GridBagConstraints constraints1=new GridBagConstraints();constraints1.weightx=1.0;constraints1.fill=constraints1.BOTH;pl3.setLayout(gridbag1);constraints1.weighty=0.8;constraints1.gridwidth=constraints1.REMAINDER;pl3.add(pl1,constraints1);constraints1.weighty=0.2;constraints1.gridheight=constraints.REMAINDER;pl3.add(pl2,constraints1);pl4.setLayout(new GridLayout(1,4,6,0);pl4.add(btn1);pl4.add(btn2);pl4.add(btn3);pl4.add(btn4);content.setLayout(new BorderLayout();content.add(pl3,BorderLayout.CENTER);content.add(pl4,BorderLayout.SOUTH);frame.setBounds(100,100,550,400);frame.setResizable(false);frame.setVisible(true);tryString sqlStr1,sqlStr2;sqlStr1="insert into book (bookname,bannercode,kindnumber,kindname,"+"positionnumber,publishingcompany,publishtime,putintime,price,"+"state,introduction,author) values(?,?,?,?,?,?,?,?,?,'在架',?,?)"sqlStr2="delete from book where bannercode=?"Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");con=DriverManager.getConnection("jdbc:odbc:library");pstmt1=con.prepareStatement(sqlStr1);pstmt2=con.prepareStatement(sqlStr2);catch(ClassNotFoundException e)catch(SQLException sqle)class FocusHandler implements FocusListenerjava.util.Date today=new java.util.Date();DateFormat format=DateFormat.getDateInstance();String formatted=format.format(today);public void focusGained(FocusEvent e)Object obj=(JTextField)e.getSource();if(obj=jtfd8)jtfd8.setText(formatted);public void focusLost(FocusEvent e)public void actionPerformed(ActionEvent e)String str1,str2,str3,str4,str5,str6,str7,str8,str9,str10,str11;str1=jtfd1.getText().trim();/书名str2=jtfd2.getText().trim();/条形码str3=jtfd3.getText().trim();/分类号str4=(String)jcbx.getSelectedItem();/分类名str5=jtfd5.getText().trim();/排架号str6=jtfd6.getText().trim();/出版社str7=jtfd7.getText().trim();/出版日期str8=jtfd8.getText().trim();/入库日期str9=jtfd9.getText().trim();/价格str10=jtfd10.getText().trim();/作者str11=jta.getText().trim();/文本域int result;tryObject obj=(JButton)e.getSource();if(obj=btn1)if(str1.equals("")|str2.equals("")|str3.equals("")|str4.equals("")|str5.equals("")JOptionPane.showMessageDialog(frame,"不能为空!");return;if(str6.equals("")|str7.equals("")|str8.equals("")|str9.equals("")|str10.equals("")JOptionPane.showMessageDialog(frame,"不能为空!");return;java.sql.Date today1,today2;Big