图书馆管理系统
1.课程设计的目的
目前,随着网络技术的飞速发展,各行各业都在追求信息化,以防在信息时代落伍,而普通高校也如此,图书馆是高校师生获得知识的一个重要渠道。因此一个健全的图书管理系统就必不可少,图书管理系统的使用大大的提高了图书馆的工作效率,很好的节省了大量的人力、物力和财力资源。管理信息系统的开发是一个开发周期长、技术要求高、影响因素多的复杂系统工程,因此制定一个完善、可行、合理的开发计划,不仅是系统开发成功的保证,而且可以提高效率、节省时间、降低成本。
由于在过去人们对信息管理的主要方式是基于文本、表格等纸质的手工处理之上的,而用手工进行图书借阅管理存在多种弊端,其中包括图书过于繁多,包含很多的信息数据的管理对于图书借阅情况如:借阅天数、超过限定借阅时间等等的统计和核实,往往采用对借阅卡的人工查询进行,对借阅天数等用人工计算、手抄进行。信息处理工作量大,容易出错;由于数据繁多,容易丢失,且不易查找。总的来说缺乏系统、规范的管理手段人们操控起来是很困难的;因此,使用电子化的管理手段将是大势所趋,建立一个图书管理系统也是图书管理部门提高工作效益的有效手段。系统能够合理高效地利用图书资源,使得图书借阅更加的科学合理。
2.设计方案论证
2.1需求分析
对于一个图书管理系统来说,图书的查询及数据的维护管理是其中的核心环节。在现现行的图书管理中存在几个共同的问题:
(1)图书种类过多,数据庞大;这是几乎所有图书馆都会遇到的共同问题,各种不同种类的图书馆为这些图书入库,进行添加于维护增加了很多的难题,对这些数据的反复输入,往往造成庞大的工作量和较低的效率。
(2)查询图书困难,每天的借阅情况,读者借阅的到期、还书情况,各项数据的汇总和统计情况必须由管理员统计上报,图书库总管理员才能考虑对图书馆的硬件如某类书的需求数量进行改变已向上级申报。
(3)图书毁坏及图书破损;在借阅过程中难免此类现象的发生,如何及时发现及事后对毁坏图书进行淘汰和更新也是个需要解决的问题。
(4)不能及时归还图书;经常有读者超过借阅期的情况发生,对此类读者的超期信息提示也是图书借阅管理工作中必须解决的问题之一。
本软件主要有以下几方面的功能
(1)系统部分:主要完成本系统工程的维护工作(包括:添加用户、添加员工、修改密码)
(2)图书管理部分:要完成图书基本信息的管理(包括:添加、修改、查询、删除图书基本信息)
(3)借阅管理部分:主要完成图书借阅的管理(包括:图书借阅、归还、查询等)2.2系统包含的类及类之间的关系
本系统共包括15个Java源文件和1个辅助文件。类之间的关系如图1所示。
图1 类关系图
(1)AppBook.java
该文件包含主函数入口,旨在创建登录界面对象并在屏幕中居中显示。
(2)FrLogin.java
该文件是登录界面的封装类,定义并设置了登录界面相关组件及显示效果,还定义了登录、退出按钮的事件监听。功能:点击登录按钮,对填写的信息进行验证并与数据库数据进行比对,匹配就登录成功进入主界面;取消按钮即可退出系统。
(3)FrMain.java
该文件是主界面的封装类,定义并设置了主界面相关组件及显示效果,还定义了菜单栏上面各菜单项的监听事件,有系统管理:修改管理员密码、退出,基本操作:添加新读者、新书入库、借书、还书、续借、读者管理、图书管理,帮助:关于等10个事件的监听。功能:点击对应的菜单栏就会弹出对应的对话框,并传递需要的参数。
(4)FrChange.java
该文件是修改用户密码界面的封装类,定义并设置了更改密码界面相关组件及显示效果,还定义了确定、取消按钮的事件监听。功能:点击确定按钮,对输入的信息进行验证并与数据库数据进行比对,匹配就更新数据库,下次登录使用新密码;取消按钮即关闭修改密码界面。
(5)FrAddreader.java
该文件是添加新读者界面的封装类,定义并设置了添加新读者界面相关组件及显示效果,还定义了提交、返回按钮的事件监听。功能:点击提交按钮,对输入的信息进行验证,通过就写入数据库然后返回读者的编号,不符合要求就提示重新输入;返回按钮即关闭添加新读者界面。
(6)FrAddBook.java
该文件是新书入库界面的封装类,定义并设置了新书入库界面相关组件及显示效果,还定义了提交、退出按钮的事件监听。功能:点击提交按钮,对输入的信息进行验证,通过就写入数据库然后返回图书添加成功消息,不符合要求就提示重新输入;退出按钮即关闭新书入库界面。
(7)FrBorrow.java
该文件是借书登记界面的封装类,定义并设置了借书登记界面相关组件及显示效果,还定义了确定、取消按钮的事件监听。功能:点击确定按钮,对输入的信息进行验证,若输入的信息满足要求且该读者没有借该图书就提示借书成功并将数据写入数据库,否则提示对应的不通过原因;取消按钮及关闭借书登记界面。
(8)FrReturn.java
该文件是还书登记界面的封装类,定义并设置了还书登记界面相关组件及显示效果,还定义了提交、取消按钮的事件监听。功能:点击提交按钮,对输入的信息进行验证并与数据库中数据比对,若输入的信息满足要求且与数据库中数据一致就提示还书成功并更新数据库,否则提示对应的不通过原因;取消按钮及关闭还书登记界面。
(9)FrKeep.java
该文件是续借登记界面的封装类,定义并设置了续借登记界面相关组件及显示效果,还定义了提交、取消按钮的事件监听。功能:点击提交按钮,对输入的信息进行验证并与数据库中数据比对,若输入的信息满足要求且与数据库中数据一致就提示续借成功并更新数据库,否则提示对应的不通过原因;取消按钮即关闭续借登记界面。
(10)FrAbout.java
该文件是关于界面的封装类,定义并设置了续借登记界面相关组件及显示效果,
还定义了确定按钮的事件监听。功能:显示系统的版权及开发工具等信息,点击确定按钮就关闭关于界面。
(11)FrReadermanage.java
该文件是读者管理界面的封装类,定义并设置了读者管理界面相关组件及显示效果,还定义了查找、修改、删除、刷新、关闭按钮的事件监听。功能:对读者的信息进行统一的管理,包括删、改、查等功能,其中选中列表中的一列然后点击修改按钮就会打开读者信息修改界面。
(12)FrRedit.java
该文件是读者信息修改界面的封装类,定义并设置了读者信息修改界面相关组件及显示效果,还定义了确定、取消按钮的事件监听。功能:对可以修改的信息修改后,点击确定按钮就更新对应数据库中的读者数据,取消按钮即关闭读者信息修改界面。
(13)FrBookmanage.java
该文件是图书管理界面的封装类,定义并设置了图书管理界面相关组件及显示效果,还定义了查找、修改、删除、刷新、关闭按钮的事件监听。功能:对图书的信息进行统一的管理,包括删、改、查等功能,其中选中列表中的一列然后点击修改按钮就会打开图书信息修改界面。
(14)FrBedit.java
该文件是图书信息修改界面的封装类,定义并设置了图书信息修改界面相关组件及显示效果,还定义了确定、取消按钮的事件监听。功能:对可以修改的信息修改后,点击确定按钮就更新对应数据库中的读者数据,取消按钮即关闭图书信息修改界面。
(15)DBC.java
该文件是数据库接口的类,定义了数据库的创建、连接、查找、更新等操作。功能:对数据库总的数据进行增、删、改、查等基本操作。
2.3系统设计
成员变量
表1成员变量
3.设计结果
运行AppBook.java文件,就会创建并显示登陆界面,具体界面如下:
图2 系统登录
输入正确的用户名和密码就会进入主窗口,否则会弹出相关提示,如图3。
图3 系统登录
进入系统主页面包含系统管理、基本操作、帮助三个选项及其对应下拉列表
图4 图书馆管理系统主界面
选中读者管理界面的列表中的一项,点击修改按钮,就会打开读者信息修改界面,具体图示如下图5所示:
图5 读者信息修改窗口
选中图书管理界面的列表中的一项,点击修改按钮,就会打开图书信息修改界面,具体图示如下所示。
图6 图书信息修改窗口
4.设计体会
通过为期一个星期的课程设计,将我们这学期所学的JAVA知识得到了巩固和应用,在设计的过程中我们也遇到了很多的问题,不过通过查阅资料及询问老师,问题都得到了解决,这次课程设计还让我们明白了写程序不能闭门造车,要努力扩展知识面,开阔视野,开阔思维,也学会了更加快速的查阅到自己所需要的资料。
短短的一个星期的课程设计过程使我们受益匪浅,不仅是在专业知识方面,最主要是在怎样去解决编程中出现的问题。遇到问题不能乱,要有条理的设计,找到不熟的方面,再细心的收集资料,比如做这个课程设计的过程中,我们就不是很熟悉菜单栏(JMenuBarbar)、菜单(JMenu)以及菜单项(JMenuItem)之间的关系以及事件的响应,最后通过查阅资料都得到了解决,还有很多很多的问题,这里就不一一列出了。
通过这次的课程设计,我们加深了对面向对象编程的理解,学会了JAVA中一些技术的使用,加深了对JAVA的理解。
另外,本系统还有一些不足之处,整个系统的可靠性、健壮性还有待进一步进行测试,系统安全性设计还不够完善。
5.参考文献
[1]仇宾.Java版井字棋的设计与实现[J].电脑编程技巧与维护,2013,09:75-80.
[2]明日科技.Java从入门到精通(第2版)[M].北京:清华大学出版社,2012.9:20-25
[3]梁勇.Java语言程序设计:基础篇[M],第2版.北京:机械工业出版社,2011:305-350
[4]李兴华.Java web开发实战经典基础篇[M].北京:清华大学出版社,2011.8:123-130
[5]魔乐科技软件实训中心.Java从入门到精通[M].北京:人民邮电出版社,2012.4:10-25
[6]布洛克.Effective Java中文版(第2版)[M].北京:机械工业出版社,2012,1:53-60
[7]诱明.Java技术[J].程序员,2005,06:11
[8]刘潇.基于JAVA的五子棋游戏设计与实现[J].电脑知识与技术,2011,06:1353-1354
[9]姜景根,李祥.基于Java的多线程并发服务器的设计与应用[J].电脑与信息技术,2012,01:15-17+42
[10]阮彤,李京,冯东雷.基于Java的应用服务器的设计与实现[J].计算机研究与发展,2011,08:939-946.
附录
FrMain.java
package mybook.book;
import java.awt.*;
import javax.swing.*;
import java.awt.Rectangle;
import javax.swing.BorderFactory;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.awt.BorderLayout;
import java.util.Calendar;
import java.io.IOException;
import mydbc.dbc.DBC;
import java.sql.ResultSet;
import java.sql.SQLException;
//该类为本程序主界面
public class FrMain extends JFrame{
//私有成员
JMenuBar jMenuBar1=new JMenuBar();
JMenu menuSysManage=new JMenu();
JMenuItem miChangePwd=new JMenuItem();
JMenuItem miExit=new JMenuItem();
JMenu menuBasic=new JMenu();
JMenuItem miAddReader=new JMenuItem();
JMenuItem miAddBook=new JMenuItem();
JMenuItem miBorrowBook=new JMenuItem();
JMenuItem miReturnBook=new JMenuItem();
JMenuItem miGoon=new JMenuItem();
JMenuItem miReaderManage=new JMenuItem();
JMenuItem miBookManage=new JMenuItem();
JMenu menuHelp=new JMenu();
JMenuItem miAbout=new JMenuItem();
JPanel palState=new JPanel();
JLabel lblSysName=new JLabel();
JLabel lblShow=new JLabel();
JLabel lblMainbg=new JLabel();
JLabel lblNowtime=new JLabel();
JLabel lblTime=new JLabel();
ImageIcon back=new ImageIcon("img/bookbg.jpg");
public FrMain(){
try{
jbInit();
}catch(Exception exception){
exception.printStackTrace();
}
}
private void jbInit()throws Exception{
getContentPane().setLayout(null);
this.setJMenuBar(jMenuBar1);
setSize(new Dimension(600,490));
this.setTitle("图书管理系统");
menuSysManage.setText("【系统管理】");
miChangePwd.setText("修改密码");
miChangePwd
.addActionListener(new FrMain_miChangePwd_actionAdapter(this));
miExit.setText("退出");
miExit.addActionListener(new FrMain_miExit_actionAdapter(this));
menuBasic.setText("【基本操作】");
miAddReader.setText("添加新读者");
miAddReader
.addActionListener(new FrMain_miAddReader_actionAdapter(this));
miAddBook.setText("新书入库");
miAddBook.addActionListener(new FrMain_miAddBook_actionAdapter(this));
miBorrowBook.setText("借书");
miBorrowBook.addActionListener(new FrMain_miBorrowBook_actionAdapter(
this));
miReturnBook.setActionCommand("还书");
miReturnBook.setText("还书");
miReturnBook.addActionListener(new FrMain_miReturnBook_actionAdapter(
this));
miGoon.setText("续借");
miGoon.addActionListener(new FrMain_miGoon_actionAdapter(this));
miReaderManage.setText("读者管理");
miReaderManage
.addActionListener(new FrMain_miReaderManage_actionAdapter(this));
miBookManage.setText("图书管理");
miBookManage.addActionListener(new FrMain_miBookManage_actionAdapter(
this));
menuHelp.setText("【帮助】");
miAbout.setText("关于");
miAbout.addActionListener(new FrMain_miAbout_actionAdapter(this));
palState.setBounds(new Rectangle(0,400,700,38));
palState.setLayout(null);
lblSysName.setText("图书管理系统");
lblSysName.setBounds(new Rectangle(3,3,85,31));
lblShow.setText("技术支持JAVA ECLIPSE");
lblShow.setBounds(new Rectangle(86,3,150,31));
lblMainbg.setIcon(back);
lblMainbg.setBounds(new Rectangle(0,0,699,431));
lblTime.setText("当前时间:");
lblTime.setBounds(new Rectangle(350,3,63,31));
lblNowtime.setBounds(new Rectangle(420,3,179,31));
jMenuBar1.add(menuSysManage);
jMenuBar1.add(menuBasic);
jMenuBar1.add(menuHelp);
menuSysManage.add(miChangePwd);
menuSysManage.addSeparator();
menuSysManage.add(miExit);
menuBasic.add(miAddReader);
menuBasic.add(miAddBook);
menuBasic.addSeparator();
menuBasic.add(miBorrowBook);
menuBasic.add(miReturnBook);
menuBasic.add(miGoon);
menuBasic.addSeparator();
menuBasic.add(miReaderManage);
menuBasic.add(miBookManage);
menuHelp.add(miAbout);
this.getContentPane().add(palState);
this.getContentPane().add(lblMainbg);
palState.add(lblSysName);
palState.add(lblShow);
palState.add(lblNowtime);
palState.add(lblTime);
Time time=new Time();
time.start();
}
//该方法用于被调用并初始化一个新Frame
public void NewFram(Frame x){
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize=x.getSize();
if(frameSize.height>screenSize.height){
frameSize.height=screenSize.height;
}
if(frameSize.width>screenSize.width){
frameSize.width=screenSize.width;
}
x.setLocation((screenSize.width-frameSize.width)/2,
(screenSize.height-frameSize.height)/2);
x.setVisible(true);
}
class Time extends Thread{
public void run(){
//以下用于同步显示时间
Calendar cal;
while(true){
try{
cal=Calendar.getInstance();
String now=cal.get(Calendar.YEAR)+"年"
+(cal.get(Calendar.MONTH)+1)+"月"
+cal.get(Calendar.DATE)+"日"
+cal.get(Calendar.HOUR)+"时"
+cal.get(Calendar.MINUTE)+"分"
+cal.get(Calendar.SECOND)+"秒";
lblNowtime.setText(now);
//每一秒钟循环一次
Thread.sleep(1000);
}catch(InterruptedException ex){
System.out.println(ex.getMessage());
}
}
}
}
//系统管理-》修改密码菜单下拉列表事件
public void miChangePwd_actionPerformed(ActionEvent e){
FrChange change=new FrChange();
NewFram(change);
}
//系统管理-》退出菜单下拉列表事件
public void miExit_actionPerformed(ActionEvent e){
System.exit(0);
}
//基本操作-》增加新读者菜单下拉列表事件
public void miAddReader_actionPerformed(ActionEvent e){
FrAddreader addreader=new FrAddreader();
NewFram(addreader);
}
//基本操作-》新书入库菜单下拉列表事件
public void miAddBook_actionPerformed(ActionEvent e){
FrAddbook addbook=new FrAddbook();
NewFram(addbook);
}
//基本操作-》借书菜单下拉列表事件
public void miBorrowBook_actionPerformed(ActionEvent e){
FrBorrow borrow=new FrBorrow();
NewFram(borrow);
}
//基本操作-》还书菜单下拉列表事件
public void miReturnBook_actionPerformed(ActionEvent e){
FrReturn returnbook=new FrReturn();
NewFram(returnbook);
}
//基本操作-》续借菜单下拉列表事件
public void miGoon_actionPerformed(ActionEvent e){
FrKeep keep=new FrKeep();
NewFram(keep);
}
//基本操作-》读者管理菜单下拉列表事件
public void miReaderManage_actionPerformed(ActionEvent e){
FrReadermanage rmanage=new FrReadermanage();
NewFram(rmanage);
}
//基本操作-》图书管理菜单下拉列表事件
public void miBookManage_actionPerformed(ActionEvent e){
FrBookmanage bmanage=new FrBookmanage();
NewFram(bmanage);
}
//帮助-》关于菜单下拉列表事件
public void miAbout_actionPerformed(ActionEvent e){
FrAbout about=new FrAbout();
NewFram(about);
}
//事件适配器的触发
//修改密码
class FrMain_miChangePwd_actionAdapter implements ActionListener{
private FrMain adapter;
FrMain_miChangePwd_actionAdapter(FrMain adaptee){
this.adapter=adaptee;
}
public void actionPerformed(ActionEvent e){
adapter.miChangePwd_actionPerformed(e);
}
}
¥29.8
¥9.9
¥59.8