JAVA数据库课程设计图书馆管理系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安郵電大学
数据库课程设计报告题目:图书管理系统
院系名称:计算机学院
专业名称:计算机科学与技术
班级:计科1006
学生姓名:郑波
学号(8位):04101198
指导教师:乔平安
设计起止时间:2012年10月8日~2012年10月19日
一问题的提出
一、开发背景
很多高校都拥有图书馆,图书馆可以为全校师生提供一个阅读,学习的空间。
近年来,随着生源不断增大,图书馆的规模也随之扩大,图书数量也相应地大量增加,有关图书馆各种信息成倍增加。
面对如此庞大的信息量,校领导决定使用一套合理,有效,规范,实用的图书馆管理系统,对校内图书资料进行统一,集中的管理。
本系统将会涉及到图书馆日常管理工作的基本常见细节,诸如新图书的入库登记,图书馆所有书籍的分类管理,图书的查询,图书的借阅、退还手续的登记,费旧图书的清理撤除等,本系统所要实现的这些功能基本上涵盖了图书馆的日常管理工作,基本能够满足校园图书馆的工作人员的管理需要。
在对本系统的具体开发过程当中,将采用Java语言进行开发,以Sql Server 实现后台数据库,本系统是完全基于图形化用户界面(GUI)的单机版本。
本系统的设计是在Windows7简体中文版操作系统环境下,使用Java中文版开发成功的。
数据库是MIS中的重要支持技术,在MIS开发过程中,如何选择数据库管理是一个重要的问题,目前,数据库产品较多,每种产品都具有各自的特点和适用范围,因此,在选择数据库时,应考虑数据库应用的特点及适用范围,本系统所使用的后台数据库是MS SQL2005数据库。
本系统选用的开发语言介绍如下:
选择了美国SUN公司推出的Java开发工具。
Java是第一个全面支持面向对象程序设计的数据库语言工具。
Java的主要特点有:
1、语言是简单的、小型的、结构中性的
2、强大的数据库开发功能
3、扩大了对SQL语言的支持
4、是面向对象的、高性能的、多线程的
5、是分布式的、面向网络
6、具有平台无关性
7、语言具有可移植性、是动态的
二、需求分析
图书馆管理系统是图书馆管理工作中补课缺少的部分,对于图书馆的管理者和使用者来说都非常重要,但长期以来,人们使用传统的手工方式或性能较低的图书馆管理系统管理图书馆的日常事务,操作流程比较繁琐,效率相当低。
而一个成功的图书馆管理系统应提供快速的图书馆信息检索功能,快捷的图书借阅,归还流程,为管理者提供充足的信息和快捷的数据处理手段。
从读者与图书馆管理员的角度出发,本着以读者借书,还书快捷,方便的原则,本系统有一下特点:①:具有良好的系统性能,友好的用户界面。
②:较高的处理效率,便于使用和维护。
③:采用成熟的技术开发,使系统具有较高的技术水平和较长的生命周期。
④:系统尽可能简化图书馆管理员的重复工作,提高工作效率。
⑤:简化数据查询,统计难度。
二:系统设计
一:系统目标
根据以上的需求分析及用户的沟通,该系统应达到以下目标:
①:界面设计友好,美观。
②:数据存储安全,可靠。
③:信息分类清晰,准确。
④:强大的查询功能,保证数据查询的灵活性。
⑤:操作简单易用,界面清晰大方。
⑥:系统安全稳定。
⑦:开发技术先进,功能完备,扩展性强。
⑧:占用资源少,对硬件要求低。
⑨:提供灵活,方便的权限设置功能,使整个系统的管理分工明确。
二:系统功能结构
图书馆管理系统分为四大功能模块,分为基础数据维护,图书借阅管理,新
书订购功能,系统维护。
本系统各个部分及其包括的功能模块如图:
图书馆管理
基础数据维护图书借阅管理新书订购管理系统维护
读者信息管理图
书
信
息
管
理
图
书
类
别
管
理
图
书
借
书
管
理
图
书
还
书
管
理
图
书
查
询
新
书
订
购
验
收
新
书
用
户
管
理
密
码
管
理
三:系统预览
图书馆管理系统有多多个程序界面组成,以下是几个典型界面
该界面用于将读者相关信息添加至数据库表中。
该界面用于展示读者相关信息,并且提供了参与删除读者信息。
该界面主要实现新书订购功能。
该界面主要实现新书验收功能。
四:文件组织结构
图书馆管理系统系统文件夹组织结构
图书馆管理系统
管理员登陆
管理
员基础数据维护
读者信息管理
图书信息管理
读者添加
读者修改与删
除
读书类别添加
类别修改
图书添加
图书修改
图书查询
读者相关信息
图书类别相关信息
图书相关信息
图书借阅图书归还
读者
新书订购管理
系统维护管理
新书订购
验收新书
更改密码
用户管理
订购相关信息
用户添加
用户修改与删
除
操作员相关信
息
图书类别管理
四:数据库设计
一:数据库概要说明
SQL Server2005具有很强的完整性与课伸缩性,具有较低的价格与较高的性能。
数据库的树形结构图如图所示:
二:数据库概念设计
根据以上对系统的需求分析,系统设计,本系统使用的数据库实体分别为图书
信息实体,图书分类实体,图书订购实体,读者信息实体,操作员信息实体,图
书借阅信息实体,库存信息实体
1:图书信息实体
图书信息实体包括图书编号,类别编号,书名,译者,出版社,价格,出版
时间等属性。
图书信息实体的E-R图如图所示。
图书编号类别编号书名作者
图书
价格出版时间出版社译者
2:读者信息实体
读者信息实体包括条形码,姓名,性别,年龄,电话,押金,生日,职业,证件类型,办证日期,最大借书量,证件号码等属性,E-R 图如图所示。
3:图书借阅信息实体
图书借阅信息实体包括编号,图书编号,读者编号,操作员编号,是否归还,借阅日期,归还日期等属性。
E-R 图如图所示。
读者
姓名
性别
年龄电话
押金
生日
条形码
职业
证件号码
最大借书量
办证日期
证件类型
图书借阅
编号
读者编号操作员编号
图书编号
是否归还
归还日期
借阅日期
4:图书分类实体
图书分类实体包括编号,类别名称等属性,E-R图如图所示。
编号类别名称
图书分类
可借天数罚款金额
5:图书订购实体
图书订购实体主要包括图书编号,订购日期,订购数量,操作员,是否验收和折扣等属性。
E-R图如图所示。
订购日期图书编号订购数量
图书订购
操作员是否验收折扣
6:操作员信息实体
操作员信息实体主要包括编号,姓名,性别,年龄,身份证号,工作日期,电话,是否为管理员和密码等属性。
E-R图如图所示。
7:库存信息实体
库存信息实体主要包括编号,库存数量等属性。
E-R 图如图所示。
五:数据库逻辑设计1:tb_bookInfo(图书信息表)
图书信息表包括图书编号,图书类别编号,书名,作者,译者,出版社,出版时间和价格等信息。
操作员
姓名性别年龄
电话
编号身份证号
是否为管理员工作日期密码
库存
编号
库存数量
2.tb_bookType(图书分类表)
图书分类表包括编号,类别名称,可借天数和罚款金额等信息。
3.tb_borrow(图书借阅表)
图书借阅表包括,图书编号,读者编号,操作员编号,是否归还,借阅日期,归还日期等信息。
4.tb_operator(操作员信息表)
操作员信息表主要包括编号,姓名,性别,年龄,身份证号,工作日期,电话,是否为管理员和密码等信息。
5.tb_order(图书订购表)
图书订购表主要包括图书编号,订购日期,订购数量,操作员,是否验收和折扣等信息。
图书订购表以图书编号与图书信息表建立了关系。
6.tb_reader(读者信息表)
读者信息表包括条形码,姓名,性别,年龄,电话,押金,生日,职业,证件类型,办证日期,最大借书数量,证件号码等信息。
7.tb_stockpile(库存信息表)
库存信息表主要包括编号,库存数量等信息。
库存信息表以库存编号与图书信息表建立了关系。
六:数据库建模
本系统数据库采用Power Designer软件建立数据库中各个表的关系,进行数据库的建模,以连接各个数据库,使数据库中各个实体间建立联系。
数据库中各个表间关系如图所示。
七:详细设计
一:公共模块设计
1:数据库连接及操作类的编写
数据库连接及操作类通常包括连接数据库的方法getConnection,执行查询语句的方法executeQuery(),执行更新操作的方法executeUpdate(),关闭数据库连接的方法close()
1:指定类Dao.java保存的包,并导入所需的类包。
关键代码如下:package com.wsy.dao;//指定类的包名称
//导入进行数据库连接时所使用的java.sql.Connection类
import java.sql.Connection;
//导入进行数据库连接时所使用的java.sql.DriverManager类
import java.sql.DriverManager;
//导入进行数据库表查询时所使用的java.sql.Resultset类
import java.sql.ResultSet;
//导入进行数据库操作时捕捉异常使用的java.sql.SQLException类
import java.sql.SQLException;
2:在Dao.java类的构造方法中创建数据库连接操作。
在此类中首先定义数据库连接驱动包名,数据库连接路径,数据库连接用户名,密码等静态变量,然后在构造函数中实现数据库连接操作。
在数据库连接代码中需要添加try...catch关键字,捕捉数据库连接时可能抛出的异常。
关键代买如下:
//定义驱动报名称
protected static String dbClassName= "com.microsoft.sqlserver.jdbc.SQLServerDriver";
protected static String dbUrl="jdbc:sqlserver://localhost:1433;"
+"DatabaseName=db_library;SelectMethod=Cursor";//定义数据库连接路径
protected static String dbUser="shining";//数据库连接用户名
protected static String dbPwd="1";//数据库连接密码
protected static String second=null;
private static Connection conn=null;//定义一个数据库连接
private Dao(){
try{//捕捉数据库连接异常
if(conn==null){//如果连接为空
Class.forName(dbClassName).newInstance();//装载SQl Server驱动
//获取数据库连接
conn=DriverManager.getConnection(dbUrl,dbUser,dbPwd);
}
Else//如果连接不为空
return;
}catch(Exception ee){//返回
ee.printStackTrace();//捕捉数据库连接异常
}
3.创建执行查询语句的方法executeQuery,其返回值为ResultSet结果集。
首先需要初始化Dao对象,调用构造函数,从而获取数据库连接。
executeQuery方法代码如下:private static ResultSet executeQuery(String sql){
try{
if(conn==null)
new Dao();
return
conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_U PDATABLE).executeQuery(sql);
}catch(SQLException e){
e.printStackTrace();
return null;
}finally{
}
}
4.创建执行更新操作的方法executeUpdate,它的返回值为int类型的整数,此返回值代表数据更新的操作是否成功,返回1代表称,不成功则返回-1,其关键代码如下:
private static int executeUpdate(String sql){
try{
if(conn==null)
new Dao();
return conn.createStatement().executeUpdate(sql);
}catch(SQLException e){
System.out.println(e.getMessage());
//if(e.getMessage().equals("[Microsoft][SQLServer2000Driver for JDBC][SQLServer]DELETE语句与COLUMN REFERENCE约束'FK_TB_BORRO_REFERENCE_TB_BOOKI'冲突。
该冲突发生于数据库'db_library',表'tb_borrow',column'bookISBN'。
"))
return-1;
}finally{
}
}
5.为了避免运行程序时资源浪费,优化项目的运行速度,需要在完成数据库操作后,关闭数据库连接,其关键代码如下:
public static void close(){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}finally{
conn=null;
}
}
二:MenuActions类的编写
通常激活同一个命令有多种方式,用户可以通过工具栏中的按钮或菜单选择特定的功能。
在本系统中命令就是弹出内部窗体
Swing包提供了一个非常有用的机制来封装命令,并将其连接到多个事件源,这种机制就是Action借口。
Action接口有如下方法:
Public void actionPerformed(ActionEvent e)
Public Object getValue(String key)
Public void putValue(String key,Object value)
Public boolean isEnabled()
Public void setEnabled(boolean b)
Pubilc void addPropertyChangeListener(PropertyChangeListener listener)
Pinlic void removePropertyChangeListener(PropertyListener listener))
在actinPerformed()方法执行“更改密码”窗体的弹出类中操作,关键代码如
下:
private static class PasswordModiAction extends AbstractAction{ /**
*
*/
private static final long serialVersionUID=1L;
PasswordModiAction(){
putValue(,"更改口令");
putValue(Action.LONG_DESCRIPTION,"修改当前用户密码");
putValue(Action.SHORT_DESCRIPTION,"更换口令");//在“更改口令”提示中显示的文字
//putValue(Action.SMALL_ICON,CreatecdIcon.add("bookAddtb.jpg"));
//将图标存储到动作对象中
//setEnabled(false);//使动作禁用
}
public void actionPerformed(ActionEvent e){
if(!frames.containsKey("更改密码")||frames.get("更改密码").isClosed()){
GengGaiMiMa iframe=new GengGaiMiMa();
frames.put("更改密码",iframe);
Library.addIFame(frames.get("更改密码"));
}
}
}
三:限制文本框长度类编写
在swing语言创建的窗体中,当JTextField组建创建时,可以指定文本框的宽度。
但在JTextfield的构造器中设定的宽度并不是用户输入的字符个数上限,用户可以在文本框中输入一个更长的字符串,此时需要限制用户输入字符串的长度。
创建此类的步骤如下:
1,。
创建MyDocument.java类,此类继承PlainDocument类。
关键代码如下:Public class Mydocument extends PlainDocument{
}
2.在Mydocument.java类中创建了两个构造函数,其中一个是又参数的,另一个是无参数的。
关键代码如下:
Public Mydocument(int newMaxLength{
Super();
Maxlength=newMaxlengyh;
}
Public MyDocument(){
This(10);
3.重载父类方法insertString(),在此方法中限定文本框允许输入字符串长度。
关键代码如下:
public void insertString(int offset,String str,AttributeSet a) Throws BadLocationException{
If(getLength()+str.length()>maxLength){
return;
}else{
super.insertString(offset,str,a);
}
}
4.在程序设计中,当需要限制用户输入字符串长度时,可以用如下代码JTextfield textfield=new JTextfield("请输入13位书号",13); Textfield.setDocument(new MyDocument(13));
四:描述组合框索引与内容类的编写
在程序编写的过程中,经常会遇到组合框组件的应用。
又是要在窗体中的组合框中显示具体内容,通常需要在数据库中存储此组合框的索引值,这时便需要使用一种数据结构将组合框中的内容与索引值联系在一起
1.创建组合框组件的索引值与其对应的内容Item.java类,这个类中不仅包含代表组合框索引的成员变量id和代表组合框内容的成员变量name,还包括两个成员变量的setXXX(),getXXX()方法。
关键代码如下:
package com.wsy.JComPz;
public class Item{
public String id;
public String name;
public String getId(){
return id;
}
public void setId(String id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
=name;
}
public String toString(){
return getName();
}
2.创建MapPz.java类,使用Map关联组合框的索引与组合框的具体内容。
关键代码如下:
package com.wsy.JComPz;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JComboBox;
import com.wsy.dao.Dao;
import com.wsy.model.BookType;
public class MapPz{
static Map map=new HashMap();
public static Map getMap(){
List list=Dao.selectBookCategory();
for(int i=0;i<list.size();i++){
BookType booktype=(BookType)list.get(i);
Item item=new Item();
item.setId(booktype.getId());
item.setName(booktype.getTypeName());
map.put(item.getId(),item);
}
return map;
}
}
3.上述代码中用到了Dao.java中的selectBookCategory()方法,此方法用于查询图书类别相关信息,首先将数据库查询的相关信息放入javaBean中,然后将javaBean对象添加到List集合中,最终将结果以List形式返回,关键代码如下:
public static List selectBookCategory(String bookType){
List list=new ArrayList();
String sql="select days from tb_bookType where typeName='"+bookType+"'";
ResultSet rs=Dao.executeQuery(sql);
try{
while(rs.next()){
BookType type=new BookType();
type.setDays(rs.getString("days"));
list.add(type);
}
}catch(Exception e){
e.printStackTrace();
}
Dao.close();
return list;
}
4.在JLable上添加图片类的编写
为了美化窗体,通常需要在窗体上添加图片,关键代码如下:
package com.wsy.util;
import .URL;
import javax.swing.ImageIcon;
import com.wsy.Library;
public class CreatecdIcon{
public static ImageIcon add(String ImageName){
URL IconUrl=Library.class.getResource("/"+ImageName);
ImageIcon icon=new ImageIcon(IconUrl);
return icon;
}
}
二:主窗体设计
主窗体的设计中,使用到JMenuBar类与JToolBar类来创建菜单栏与工具栏,菜单栏的创建比较简单,使用JMenuBar的构造函数初始化菜单栏即可。
例如:
JMenuBar menubar=new JMenuBar();//创建菜单栏
frame.setJMenu=new JMenu(menuBar);//将菜单栏放入顶层框架
JMenu editMenu=new JMenu("图书类别管理);//在菜单栏中创建顶层菜单menuBar.add(editzMenu);//将顶层菜单栏添加到菜单栏中
JMenuItem exit=new JMenuItem("退出");//在菜单栏中创建菜单项
editMenu.add(exit);//将菜单项添加到顶层菜单中
editMenu.addSeperator();//添加分隔符
JMenu.bookTypeAdd=new JMenu("图书添加");//创建子菜单
editMenu.add(bookTypeAdd);//在顶层菜单中添加子菜单
在主窗体中工具栏的创建也非常简单。
工具栏为系统提供了迅速访问常用命令的一系列按钮。
可以使用如下代码创建工具栏:
JToolBar bar=new JToolBar();
完成主窗体中工具栏的创建后同样需要添加MenuActions类对象实现工具栏事件,由于需要在工具栏中添加图标,所以将动作对象添加到按钮组件中,然后为按钮设置图标。
例如:
//将图书信息修改对象附加给按钮组件
JButton bookModiAndDelButton=new
JButton(MenuActions.BOOK_MODIFY);
//创建图标方法
ImageIcon bookmodiicon=CreatecdIcon.add("bookModiAndDeltb.jpg");
bookModiAndDelButton,setIcon(bookmodiicon);//为按钮设置图标
BookModiAndDelButton.setHideActionText(true);//使按钮文字隐藏
最后将按钮添加到工具栏中:
toolBar.add(bookModiAndDelButton);
主窗体的实现过程:
1:创建Library类,在它的构造函数中设置主窗体相关属性,如窗体大小,窗体标题等相关属性,还可以为窗体设置背景图片,并调用创建菜单栏与工具栏的方法,在主窗体中创建菜单栏与工具栏关键代码如下:
public Library(){
super();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
setLocationByPlatform(true);
setSize(800,600);
setTitle("图书馆管理系统");
JMenuBar menuBar=createMenu();//调用创建菜单栏的方法
setJMenuBar(menuBar);
JToolBar toolBar=createToolBar();//调用创建工具栏的方法
getContentPane().add(toolBar,BorderLayout.NORTH);
final JLabel label=new JLabel();
label.setBounds(0,0,0,0);
label.setIcon(null);//窗体背景
DESKTOP_PANE.addComponentListener(new ComponentAdapter(){ public void componentResized(final ComponentEvent e){
Dimension size=e.getComponent().getSize();
label.setSize(e.getComponent().getSize());
label.setText("<html><img width="+size.width+"height="
+size.height+"src='"
+this.getClass().getResource("/backImg.jpg")
+"'></html>");
}
});
DESKTOP_PANE.add(label,new Integer(Integer.MIN_VALUE));
getContentPane().add(DESKTOP_PANE);
}
2:编写创建菜单栏方法,可以初始化JMenuBar类对象创建顶层菜单,并在顶层菜单上添加相关菜单项与子菜单,然后为菜单栏添加图标,为菜单栏添加图标可以使用JMenu类中的setIcon()方法进行添加。
关键代码如下:
private JMenuBar createMenu(){//创建菜单栏的方法
JMenuBar menuBar=new JMenuBar();
JMenu bookOrderMenu=new JMenu();//初始化新书订购管理菜单
bookOrderMenu.setIcon(CreatecdIcon.add("xsdgcd.jpg"));
bookOrderMenu.add(MenuActions.NEWBOOK_ORDER);
bookOrderMenu.add(MenuActions.NEWBOOK_CHECK_ACCEPT);
JMenu baseMenu=new JMenu();//初始化基础数据维护菜单
baseMenu.setIcon(CreatecdIcon.add("jcsjcd.jpg"));
{
JMenu readerManagerMItem=new JMenu("读者信息管理");
readerManagerMItem.add(MenuActions.READER_ADD);
readerManagerMItem.add(MenuActions.READER_MODIFY);
JMenu bookTypeManageMItem=new JMenu("图书类别管理");
bookTypeManageMItem.add(MenuActions.BOOKTYPE_ADD);
bookTypeManageMItem.add(MenuActions.BOOKTYPE_MODIFY);
JMenu menu=new JMenu("图书信息管理");
menu.add(MenuActions.BOOK_ADD);
menu.add(MenuActions.BOOK_MODIFY);
baseMenu.add(readerManagerMItem);
baseMenu.add(bookTypeManageMItem);
baseMenu.add(menu);
baseMenu.addSeparator();
baseMenu.add(MenuActions.EXIT);
}
JMenu borrowManageMenu=new JMenu();//借阅管理
borrowManageMenu.setIcon(CreatecdIcon.add("jyglcd.jpg"));
borrowManageMenu.add(MenuActions.BORROW);//借阅
borrowManageMenu.add(MenuActions.GIVE_BACK);//归还
borrowManageMenu.add(MenuActions.BOOK_SEARCH);//搜索
JMenu sysManageMenu=new JMenu();//系统维护
sysManageMenu.setIcon(CreatecdIcon.add("jcwhcd.jpg"));
JMenu userManageMItem=new JMenu("用户管理");//用户管理
userManageMItem.add(ER_ADD);
userManageMItem.add(ER_MODIFY);
sysManageMenu.add(MenuActions.MODIFY_PASSWORD);
sysManageMenu.add(userManageMItem);
menuBar.add(baseMenu);//添加基础数据维护菜单到菜单栏
menuBar.add(bookOrderMenu);//添加新书订购管理菜单到菜单栏
menuBar.add(borrowManageMenu);//添加借阅管理菜单到菜单栏
menuBar.add(sysManageMenu);//添加系统维护菜单到菜单栏
return menuBar;
}
}
3:编写创建工具栏的方法,创建工具栏可以使用JToolBar类,创建工具栏后将所有的图标添加到工具栏中,可以为每个图标添加提示信息。
由于在创建MenuActions类时已经为每个内部窗体动作添加了提示信息,关键代码如下:
/**
*创建工具栏
*
*@return JToolBar
*/
private JToolBar createToolBar(){//创建工具栏的方法
JToolBar toolBar=new JToolBar();
toolBar.setFloatable(false);
toolBar.setBorder(new BevelBorder(BevelBorder.RAISED));
JButton bookAddButton=new JButton(MenuActions.BOOK_ADD);
//ImageIcon icon=CreatecdIcon.add("bookAdd.bmp");//创建图标方法
ImageIcon icon=new ImageIcon(Library.class.getResource("/bookAddtb.jpg"));//添加菜单栏图标bookAddButton.setIcon(icon);
bookAddButton.setHideActionText(true);
//bookAddButton.setToolTipText("fjdkjfk");//图片上提示字
toolBar.add(bookAddButton);
//toolBar.add(MenuActions.BOOK_MODIFY);
//在工具栏中添加图书修改与删除图标
JButton bookModiAndDelButton=new JButton(MenuActions.BOOK_MODIFY);
ImageIcon
bookmodiicon=CreatecdIcon.add("bookModiAndDeltb.jpg");//创建图标方法bookModiAndDelButton.setIcon(bookmodiicon);
bookModiAndDelButton.setHideActionText(true);
toolBar.add(bookModiAndDelButton);
JButton bookTypeAddButton=new JButton(MenuActions.BOOKTYPE_ADD);
ImageIcon
bookTypeAddicon=CreatecdIcon.add("bookTypeAddtb.jpg");//创建图标方法bookTypeAddButton.setIcon(bookTypeAddicon);
bookTypeAddButton.setHideActionText(true);
toolBar.add(bookTypeAddButton);
JButton bookBorrowButton=new JButton(MenuActions.BORROW);
ImageIcon bookBorrowicon=CreatecdIcon.add("bookBorrowtb.jpg");//创建图标方法
bookBorrowButton.setIcon(bookBorrowicon);
bookBorrowButton.setHideActionText(true);
toolBar.add(bookBorrowButton);
JButton bookOrderButton=new JButton(MenuActions.NEWBOOK_ORDER);
ImageIcon bookOrdericon=CreatecdIcon.add("bookOrdertb.jpg");//创建图标方法
bookOrderButton.setIcon(bookOrdericon);
bookOrderButton.setHideActionText(true);
toolBar.add(bookOrderButton);
JButton bookCheckButton=new JButton(MenuActions.NEWBOOK_CHECK_ACCEPT);
ImageIcon bookCheckicon=CreatecdIcon.add("newbookChecktb.jpg");//创建图标方法
bookCheckButton.setIcon(bookCheckicon);
bookCheckButton.setHideActionText(true);
toolBar.add(bookCheckButton);
JButton readerAddButton=new JButton(MenuActions.READER_ADD);
ImageIcon readerAddicon=CreatecdIcon.add("readerAddtb.jpg");//创
建图标方法
readerAddButton.setIcon(readerAddicon);
readerAddButton.setHideActionText(true);
toolBar.add(readerAddButton);
JButton readerModiAndDelButton=new JButton(MenuActions.READER_MODIFY);
ImageIcon
readerModiAndDelicon=CreatecdIcon.add("readerModiAndDeltb.jpg");//创建图标方法
readerModiAndDelButton.setIcon(readerModiAndDelicon);
readerModiAndDelButton.setHideActionText(true);
toolBar.add(readerModiAndDelButton);
JButton ExitButton=new JButton(MenuActions.EXIT);
ImageIcon Exiticon=CreatecdIcon.add("exittb.jpg");//创建图标方法
ExitButton.setIcon(Exiticon);
ExitButton.setHideActionText(true);
toolBar.add(ExitButton);
return toolBar;
}
4:最后在Library.java类中的主函数中调用登陆窗体,如果登入成功,初始化Library.java对象,如果登入失败,则弹出提示对话框,关键代码如下:
Public static void main(String[]args){
Try{
UManager.setLookAndFeel(UIManager
.getSystemLookAndFeelClassName());
}catch(Exception ex){
ex.printStackTrace();
}
}
登陆模块设计
登陆模块式图书馆管理系统的入口,在运行本系统后,首先进入的便是登陆窗体。
在该窗体中,系统管理员可以通过输入正确的管理员名称与密码登陆到系统,当用户没有输入管理员的名称或密码时,系统将会弹出相应地提示信息。
登陆模块的运行效果如图:
在本系统中,登陆模块窗体继承了JFrame类。
在设计登陆窗体前,需要初始化JPanel组件,然后设置JPanel的布局。
一句登陆模块的整体布局,在登陆窗体中使用了BorderLayout 布局管理器。
BorderLayout布局管理器是JFrame的默认布局管理器,它可以让程序员选择每个组件的摆放位置,例如:
Class Mypanel extendsJPanel{
setLayout(new BorderLayout());
add(button,BorderLayout.SOUTH);
}
中部的面板使用GridLayout布局管理器。
GridLayout布局管理器按照行和列来排行所以的组件例如:
Panel.setLayout(new GridLayout(5,4));//在初始化时分别指定网格的行数和列数在南部的面板中使用FlowLayout布局管理器。
中部面板放置用户名标签,用户名文本框与密码标签,密码文本框,其中用户名文本框使用JTextField组件,密码文本框使用JPasswordField组件,可以在初始化文本框指定时指定文本框时指定文本框的列数与文本框的初始值。
例如:
JTextField textField=new JTextField("Default input",20)//指定文本框列数和初始值
JPasswordField password=new JPasswordFiled(20);//初始化密码框
为了增加登陆窗体的美观,将密码框的回显字符设置为"*",可以用如下代码进行设置:password.setEchochar('*');
当窗体设计完成后,需要进行管理员登陆验证操作,这时需要为"登陆"按钮添加按钮监听事件。
可以讲按钮监听事件写入内部类中,它实现ActionListener借口,在内部类中重写actionPerformed()方法,实现登陆验证操作。
登陆模块实现过程
1.首先在BookLoginFrame类构造函数中设计登陆窗口的整体布局,包括添加窗体关闭按钮,最小化按钮,设置窗体大小等相关属性。
关键代码如下:
public BookLoginIFrame(){
super();
final BorderLayout borderLayout=new BorderLayout();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
borderLayout.setVgap(10);
getContentPane().setLayout(borderLayout);
setTitle("图书馆管理系统登录");
setBounds(100,100,285,194);
final JPanel panel=new JPanel();
panel.setLayout(new BorderLayout());
panel.setBorder(new EmptyBorder(0,0,0,0)); getContentPane().add(panel);
final JPanel panel_2=new JPanel();
final GridLayout gridLayout=new GridLayout(0,2); gridLayout.setHgap(5);
gridLayout.setVgap(20);
panel_2.setLayout(gridLayout);
panel.add(panel_2);
final JLabel label=new JLabel();
label.setHorizontalAlignment(SwingConstants.CENTER); label.setPreferredSize(new Dimension(0,0));
label.setMinimumSize(new Dimension(0,0));
panel_2.add(label);
label.setText("用户名:");
username=new JTextField(20);
username.setPreferredSize(new Dimension(0,0));
panel_2.add(username);
final JLabel label_1=new JLabel();
label_1.setHorizontalAlignment(SwingConstants.CENTER); panel_2.add(label_1);
label_1.setText("密码:");
password=new JPasswordField(20);
password.setDocument(new MyDocument(6));
password.setEchoChar('*');//设置密码框的回显字符password.addKeyListener(new KeyAdapter(){
public void keyPressed(final KeyEvent e){
if(e.getKeyCode()==10)
login.doClick();
}
});
panel_2.add(password);
final JPanel panel_1=new JPanel();
panel.add(panel_1,BorderLayout.SOUTH);
login=new JButton();
login.addActionListener(new BookLoginAction());
login.setText("登录");
panel_1.add(login);
reset=new JButton();
reset.addActionListener(new BookResetAction());
reset.setText("重置");
panel_1.add(reset);
final JLabel tupianLabel=new JLabel();
ImageIcon loginIcon=CreatecdIcon.add("login.jpg");
tupianLabel.setIcon(loginIcon);
tupianLabel.setOpaque(true);
tupianLabel.setBackground(Color.GREEN);
tupianLabel.setPreferredSize(new Dimension(260,60));
panel.add(tupianLabel,BorderLayout.NORTH);
//
setVisible(true);
setResizable(false);
//setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); }
2.为方便在登陆验证时取值与传值,需要创建一个对应于tb_operator表字段的JavaBean,这个类除了以数据表字段命名的成员变量之外,还创建与成员变量相对应的setXXX(),getXXX()方法,关键代码如下:
public class Operater{
private String id;
private String name;
private String grade;
private String password;
public String getGrade(){
return grade;
}
public void setGrade(String grade){
this.grade=grade;
}
public String getId(){
return id;
}
public void setId(String id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
=name;
}
public String getPassword(){
return password;
}
public void setPassword(String password){
this.password=password;
}
}
3:为了在其他窗体中取得当前登陆用户名称,需要在BookLoginIFrame.java类中创建一个Operator类型的成员变量,用户创建对应的setXXX()与getXXX()方法,关键代码如下:public static Operater getUser(){
return user;
}
public static void setUser(Operater user){
er=user;
}
}
4:分别为"登陆"按钮与"重置"按钮设置监听事件。
关键代码如下:
class BookLoginAction implements ActionListener{
public void actionPerformed(final ActionEvent e){
user=Dao.check(username.getText(),password.getText());
if(user.getName()!=null){
try{
Library frame=new Library();
frame.setVisible(true);
BookLoginIFrame.this.setVisible(false);
}catch(Exception ex){
ex.printStackTrace();
}
}else{
JOptionPane.showMessageDialog(null,"只有管理员才可以登录!");
username.setText("");
password.setText("");
}
}
}
5.在Dao类中创建登陆验证方法,在此方法中查询文本框中输入字符串是否与操作员数据表数据匹配,关键代码如下:
public static Operater check(String name,String password){
int i=0;
Operater operater=new Operater();
String sql="select*from tb_operator where name='"+name
+"'and password='"+password+"'and admin=1";
ResultSet rs=Dao.executeQuery(sql);
try{
while(rs.next()){
String names=rs.getString(1);
operater.setId(rs.getString("id"));
operater.setName(rs.getString("name"));
operater.setGrade(rs.getString("admin"));
operater.setPassword(rs.getString("password"));
if(names!=null){
i=1;
}
}
}catch(Exception e){
e.printStackTrace();
}
Dao.close();
return operater;
}
图书馆信息管理模块:
图书馆信息管理模块主要包括图书信息添加,图书信息修改两个功能。
在图书馆信息添加窗体中管理员可以录入图书相关信息,包括名称,类别,图书条形码
等。
图书信息添加窗体
图书信息修改窗体
图书信息管理模块实现过程:
1.首先创建图书信息添加窗体,关键代码如下:
public class BookAddIFrame extends JInternalFrame{ private;
private price;
private JFormattedTextField pubDate;
private JTextField translator;
private JTextField writer;
private JTextField ISBN;
private JTextField bookName;
private JComboBox bookType;
private JButton buttonadd;
private JButton buttonclose;
DefaultComboBoxModel bookTypeModel;
Map map=new HashMap();
public BookAddIFrame(){
super();
final BorderLayout borderLayout=new BorderLayout();
getContentPane().setLayout(borderLayout);
setIconifiable(true);//设置窗体可最小化---必须
setClosable(true);//设置窗体可关闭---必须
setTitle("图书信息添加");//设置窗体标题---必须
setBounds(100,100,396,260);//设置窗体位置和大小---必须
final JPanel panel=new JPanel();
panel.setBorder(new EmptyBorder(5,10,5,10));
final GridLayout gridLayout=new GridLayout(0,4);
gridLayout.setVgap(5);
gridLayout.setHgap(5);
panel.setLayout(gridLayout);
getContentPane().add(panel);
final JLabel label_2=new JLabel();
label_2.setText("图书编号:");
panel.add(label_2);
ISBN=new JTextField("请输入13位书号",13);
ISBN.setDocument(new MyDocument(13));//设置书号文本框最大输入值为13
ISBN.setColumns(13);
ISBN.addKeyListener(new ISBNkeyListener());
ISBN.addFocusListener(new ISBNFocusListener());
panel.add(ISBN);
final JLabel label=new JLabel();。