图书管理系统数据库课程设计实验报告 下载本文

数据库课程设计实验报告

摘要

随着人类社会的不断进步,科学技术有了长足的发展,尤其是在当今中国知识经济时代,知识大爆炸带来了全球图书企业的飞速发展,这些书籍为科技的发展做出了巨大的贡献。人类短短的几十年创造了大量的书籍资源,但是图书数量之多,也使得其管理起来非常的繁琐,随着信息时代的到来,图书的信息化管理使得问题得以解决,图书馆管理系统的出现就显得水到渠成了。

本系统主要上可以分为两大模块:图书馆管理员模块和读者登录模块,并在这两大模块下分成多个子模块。图书的使用对象是借阅者,例如学生,教师,管理员;而管理者同时也是图书馆的管理者。

因此根据这些信息,本系统的主要功能就是:实现图书馆图书信息的管理和维护,如用户信息管理,管理员信息管理,图书浏览,书架管理信息,图书馆规则维护,新书入库,整理图书,修改图书信息和进行查询等;以及系统的图书信息查询,图书的借出和归还等功能 图书信息管理系统能够为用户提供充足的信息和快捷的查询手段.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。

目录:

第一章:需求分析

1,学生用户端 2,教师用户端

第二章:总体设计

1,系统分析 2,可行性分析

3,系统目标

4,系统功能设计 5,构建开发环境

第三章:数据库设计

1,数据库分析 2,项目E-R图

3,数据库表的设计

第四章:程序模块设计

1,用户登录模块 2,数据库操纵框架 3,登录界面实现 4,管理端界面的设计 5,查询图书界面模块 6,借阅预约图书功能模块 7,归还挂失图书功能 8,图书超期处理模块 9,学生用户管理模块 10,,管理员管理模块 11,超级管理员功能开发

第五章:主要模块界面 第六章:程序源代码 第七章:参考文献

1,需求分析

当决定要开发一个信息系统时,首先要对信息系统的需求进行分析,需求分析要做的工作是深入描述软件的功能和性能,确定软件设计的限制和软件同其他系统元素的接口细节,定义软件的其他有效性需求。

抽象出当前系统的逻辑模型。在理解当前系统“怎么做”的基础上,抽取其“做什么”的本质,从而从当前系统的物理模型抽象出当前系统的逻辑模型。在物理模型中有许多物理因素,随着分析工作的深入,有些非本质的物理因素就成为不必要的负担,因而需要对物理模型进行分析,区分出本质的物理因素就成为不必要的负担,因而需要对物理模型进行分析,区分出本质的和非本质的困素,去

掉那些非本质的困素即可获得反映系统本质的逻辑模型。

管理员登录过程:当管理员在登录页面输入正确的用户名和密码后,通过客户端和服务器的双重校验,并且检测数据库中的对应的用户名和密码是否正确,如果是正确的,则表示管理员登录成功并进入管理员操作页面

学生用户端:查询图书,学生用户可以进行简单的查询和高级查询,预约图书,当要借的的书不在馆时,可以提前预约。挂失图书,图书丢失要挂失,可以在学生用户端实现。

管理员端:学生用户管理,实现学生用户信息的修改,删减,添加,查询。图书管理,包括对图书的增加,删减,查询等。管理员管理:操作者包括超级管理员和普通管理员,超级管理员可以对普通管理员进行删减,查询等操作,而普通管理员只有修改自己密码的权限。 借阅管理:主要是学生借阅管理,归还图书和缴纳罚款的管理。

2,总体设计

系统不但要满足客户提出的要求,同时也要考虑其性能。因此,在项目开发之前,首先要进行需求分析和可行性研究,这就是进行项目开发的基础。

利用MVC设计模式,模块间实现高内聚,低耦合。界面设计美观大方,操作简单。 功能完善,结构清晰。

能够快速的进行图书馆信息,图书馆参数,书架,管理员等信息等系统的设置。

能够快速、准确的进行读者类型管理的相关功能,如读者类型增加、修改、删除。

能够快速、准确的进行读者档案管理的相关功能,如读者档案的详细信息的查看,读者档案的增加、修改、查询。

能够快速、准确的进行图书类型管理的相关功能,如图书类型的增加、修改、删除。

能够快速、准确的进行图书档案管理的相关功能,如图书档案的详细信息的查看,图书档案的增加、修改、删除。

能够快速、准确的进行图书借阅的相关功能,如图书借阅,图书借阅查询,图书归还,图书续借等。

能够快速准确的进行系统的相关功能查询,如图书借阅查询、图书到期查询、图书档案查询等。

能够快速、准确的进行管理员的相关功能,如管理员的增加、修改管理员密码、删除管理员。

能够快速、准确的进行管理员或者读者的登录。

能够快速、准确的让读者进行读者功能模块的浏览。

3,可行性研究

可行性分析是对项目的可行程度进行分析,以便管理层对资金以及技术的投入进行决策,包括技术可行性,经济可行性,营运可行性。对于本项目而言,图书是人类获取知识最重要的途径,随着读者的日益增加,对图书的管理要求也增大很多,从图书馆的需求以及现有的技术等方面研究该图书管理系统的可行性。

当前该图书馆的管理比较粗放,还有大部分需要手工操作,对信息的维护不仅费用高而且工作量大,而且信息的安全性很难得到保障,学校支出了适量的资金进行本系统的开发。使用本系统后大部分工作将实现自动化,图书馆只需花费很少的人力和物力进行系统的维护即可。

根据上述分析,公司为此项目结构清晰,功能合理,而且使用 JAVA SE技术能够进行开发,并实现客户的需求的全部功能,由于这是一个中小型系统,客户要求的开发时间完全充裕,利润与开发成本也比较高,这可在一定程度上提高了公司的效益,因此决定开发此项目。

系统功能结构

本系统包括学生端和管理员端,有借阅图书,预约图书,查询图书,挂失图书,超期交纳罚款等功能模块,结构如下:

3,数据库设计

数据库作为系统的基础,首先要保证其设计的合理性,在使用应用系统的时候,拥有设计合理的数据库往往可以起到事半功倍的效果,在系统的维护,功能拓展时,这一优点尤其得到很好的体现。

系统包含的实体主要有:图书、学生、管理员等,下面将分别介绍各实体及实体间的E-R图。通过其E-R图读者可以更好地理解各实体的属性关系。下面就以学生实体为例,来进行介绍,

学生E-R图 如图所示

管理员

管理员E-R图

数据库表的设计

主要有学生信息表和管理员信息表还有图书信息表为例

字段名称 数据类型 STUNO Int StuName Varchar StuAge Int StuSex Varchar Class Varchar Department Varchar Tel Char Permitted Varchar Password Varchar 学生用户信息表 字段名称 数据类型 mgNo Int Permitted Varchar Password Varchar 字段大小 N/A 50 N/A 50 50 50 11 50 20 是否主键 是 否 否 否 否 否 否 否 否 是否为空 否 是 是 是 是 是 是 是 是 说明 学号 姓名 年龄 性别 班级 院系 电话 借阅许可 密码 字段大小 N/A 50 50 是否主键 是 否 否 是否为空 否 否 否 说明 管理员ID 管理员权限 管理员密码

管理员信息表 字段名称 数据类型 BookNo BookName Auther Publishment ButTime Borrowed Ordered 图书基本信息表 字段名称 数据类型 BookNo int STUNO varchar BorrorTime varchar ReturnTime varchar Borrowed varchar Ordered varchar 借阅图书信息 字段名称 数据类型 StuNO Int BookNO Int BookName Varchar DelayTime varchar 超期图书信息表 字段名称 数据类型 BookNO Int StuName varchar Class varchar BookName varchar StuNO Int Auther varchar 预约图书表如上

字段大小 是否主键 是 否 否 否 否 否 否 是否为空 否 是 是 是 是 是 是 说明 图书ID 图书名称 图书作者 出版社 购进日期 是否借阅 是否预约 字段大小 N/A 50 50 50 50 50 是否主键 是 否 否 否 否 否 是否为空 否 否 是 是 是 是 说明 书号 学号 借阅时间 归还时间 是否借阅 是否预约 字段大小 N/a N/A 50 50 是否主键 是 否 否 否 是否为空 否 是 是 是 说明 学号 书号 书名 超期天数 字段大小 N/A 50 50 50 N/A 50 是否主键 是 否 否 否 否 否 是否为空 否 是 是 是 是 是 说明 书号 学生姓名 班级 书名 学生ID 作者 字段名称 LBNO BookNO BookName StuNO

数据类型 Int Int Varchar int 字段大小 N/A N/A 50 N/A 是否主键 是 否 否 否 是否为空 否 是 是 是 说明 挂失书号 书号 书名 学生ID 第四章:程序模块设计

1, 用户登录模块设计

用户登录界面的主要功能是验证登录者的身份和权限,只有学生用户或管理员才能登录与之对应的管理系统。在登录界面,通过对各项登录条件的验证,就可以确认用户的使用权限。下面将介绍登陆模块的具体开发。

登录界面开发 界面构造器的实现

管理员登录模块需要对管理员登录是输入的用户名和密码进行检验,当管理员输入用户名和密码后,系统需要对输入的参数与数据库中的所存储的参数进行

对比,当用户名和密码相对应且都正确时能能够成功登录到管理员的操作首页

Login.jsp是管理员的登录界面,主要功能是将管理员输入的用户名和密码提交到manager.action进行处理而且能够进行简单的客户端校验。Manager.action是对用户提交的用户名和密码进行服务器端的校验。当用户提交了数据后,manager.action将调用managerdao中的check()检测用户提交的数据是否匹配数据库中的数据,各代码如下所示

Login.jsp代码如下: package wyf.hxl;

import javax.swing.*;import java.awt.*;

import java.awt.event.*;import javax.swing.table.*; import javax.swing.event.*;import java.sql.*; import java.util.*;import java.util.Date;

public class Login extends JFrame implements ActionListener{ private JPanel jp=new JPanel();//创建JPanel对象 private JLabel []jlArray={//创建标签组

new JLabel(\用户IP\端口号\用户名\new JLabel(\密 码\};

private JButton[] jbArray={//创建按钮数组

new JButton(\学生登录\清空\管理员登录\};

private JTextField[] jtxtArray={ //创建文本框

new JTextField(\};

private JPasswordField jpassword=new JPasswordField(\创建密码框 String sql; DataBase db; public Login(){

jp.setLayout(null); //设置JPanel的布局管理器 for(int i=0;i<4;i++){ //对标签与按钮控件循环处理

jlArray[i].setBounds(30,20+i*50,80,25);//设置标签与按钮的大小和位置 jp.add(jlArray[i]);//将标签和按钮添加进JPanel容器中 }

for(int i=0;i<3;i++){//设置按钮的大小位置并为其添加事件监听器 jbArray[i].setBounds(10+i*120,230,100,25); jp.add(jbArray[i]);

jbArray[i].addActionListener(this); }

for(int i=0;i<3;i++){//设置文本框的大小位置并为其添加事件监听器 jtxtArray[i].setBounds(80,20+50*i,180,25); jp.add(jtxtArray[i]);

jtxtArray[i].addActionListener(this); }

jpassword.setBounds(80,170,180,25);//设置密码框的大小位置

jp.add(jpassword);//将密码框添加进JPanel容器 jpassword.setEchoChar('*');//设置密码框的回显字符 jpassword.addActionListener(this);//为密码框注册监听器

jlArray[4].setBounds(10,280,300,25);//设置用于显示登录状态的标签的大小位置 jp.add(jlArray[4]); //将标签添加进JPanel容器 this.add(jp);

Image image=new ImageIcon(\对logo图片进行初始化 this.setIconImage(image);

//设置窗体的大小位置及可见性 this.setTitle(\登录\this.setResizable(false);

this.setBounds(100,100,400,350); this.setVisible(true); }

//实现ActionListener接口中的方法

public void actionPerformed(ActionEvent e) {//事件源为文本框

String mgno=jtxtArray[2].getText().trim(); String mgIP=jtxtArray[0].getText().trim(); String port=jtxtArray[1].getText().trim(); String message=mgIP+\

DataBase.message=message;//将本方法椎谋淞孔魑问持蹈鳧ataBase方法的私有变量

DataBase.log=this;

if(e.getSource()==jtxtArray[0]){

jtxtArray[1].requestFocus();//切换输入焦点到密码框 }

if(e.getSource()==jtxtArray[1]){

jtxtArray[2].requestFocus();//切换输入焦点到密码框 }

if(e.getSource()==jtxtArray[2]) {

jpassword.requestFocus();//切换输入焦点到密码框 }

else if(e.getSource()==jbArray[1]){//事件源为清空按钮 //清空所有信息 jlArray[4].setText(\jtxtArray[2].setText(\jpassword.setText(\

//将输入焦点设置到文本框 jtxtArray[2].requestFocus(); }

else if(e.getSource()==jbArray[2]){//事件源为管理员登录按钮 //判断用户名和密码是否匹配 if(!mgno.matches(\

{//如果用户名格式输入有误

JOptionPane.showMessageDialog(this,\用户名格式错误!!!\信息\JOptionPane.INFORMATION_MESSAGE); return; }

if(jtxtArray[0].getText().trim().equals(\{//如果\用户IP\文本框为空,提示

JOptionPane.showMessageDialog(this,\用户IP不能为空!!!\信息\JOptionPane.INFORMATION_MESSAGE); return; }

if(jtxtArray[1].getText().trim().equals(\{//如果\端口号\文本框为空,提示

JOptionPane.showMessageDialog(this,\用户端口号不能为空!!!\信息\JOptionPane.INFORMATION_MESSAGE); return; }

sql=\db=new DataBase();

db.selectDb(sql);//以上三行是对用户名和密码进行查询,验证身份 try{

String mgNo=\String password=\

while(db.rs.next()){//取出结果集中数据并赋值 mgNo=db.rs.getString(1).trim(); password=db.rs.getString(2).trim(); }

if(jtxtArray[2].getText().trim().equals(mgNo)&&

String.valueOf(jpassword.getPassword()).equals(password)){//登录成功 jlArray[4].setText(\恭喜您,登录成功!!!\new Root(mgNo); this.dispose(); }

else{//登录失败

jlArray[4].setText(\对不起,登录失败!!!\} }

catch(Exception e1){e1.printStackTrace();} db.dbClose();//关闭数据库链接 }

else if(e.getSource()==jbArray[0]){//事件源为学生登录按钮 if(!jtxtArray[2].getText().trim().matches(\//若学号格式错误,输出提示对话框

JOptionPane.showMessageDialog(this,\输入有误,学号只能为数字!!!\

\消息\return; }

if(jtxtArray[0].getText().trim().equals(\若\用户IP\文本框输入为空,提示 JOptionPane.showMessageDialog(this,\用户IP不能为空!!!\信息\JOptionPane.INFORMATION_MESSAGE); return; }

if(jtxtArray[1].getText().trim().equals(\若\端口号\文本框输入为空,提示 JOptionPane.showMessageDialog(this,\用户端口号不能为空!!!\\信息\return; }

//查询学号文本中所输学号是否存在于STUDENT表中 sql=\+Integer.parseInt(jtxtArray[2].getText().trim()); db=new DataBase(); db.selectDb(sql); try{

if(!(db.rs.next())){//若学号错误,输出提示对话框

JOptionPane.showMessageDialog(this,\输入了错误的学号!!\\消息\}

else{//得到输入学号的学生的姓名和班级 String stuNO=db.rs.getString(1).trim(), password=db.rs.getString(2).trim();

if(jtxtArray[2].getText().trim().equals(stuNO)&&

String.valueOf(jpassword.getPassword()).equals(password)){//登录成功 jlArray[4].setText(\恭喜您,登录成功!!!\new StudentSystem(); this.dispose(); }

else{//登录失败

jlArray[4].setText(\对不起,登录失败!!!\} } }

catch(Exception ex) { ex.printStackTrace();} db.dbClose(); //关闭数据库链接 } }

public static void main(String[]args) {

new Login();

}

}登录失败:

登录成功:

学生端登录成功 2, 数据库操作类框架

3, public class DataBase 4, {

5, Connection con=null;//声明Connection引用 6, Statement stat; 7, ResultSet rs; 8, int count;

9, public static String message; //声明一个静态成员变量 10, public static Login log; 11, public DataBase(){

12, try{//加载MySQL的驱动类,并创建数据库连接 13, Class.forName(\);

14, //con=java.sql.DriverManager.getConnection(\localhost:3306/test\

15, con=DriverManager.getConnection(\+message+\

/test?useUnicode=true&characterEncoding=GBK\,\,\ghai\);

16, stat=con.createStatement();//创建Statement对象 17, }

18, catch(Exception e){//如果从Login类传的参数不对,则提示出错 19, JOptionPane.showMessageDialog(log,\用户IP或端口号错误!!!

\,

20, \信息\,JOptionPane.INFORMATION_MESSAGE); 21, } 22, }

23, public void selectDb(String sql){//声明select方法 24, try{

25, //sql = new String(sql.getBytes(),\ 26, rs=stat.executeQuery(sql); 27, }

28, catch(Exception ie){ie.printStackTrace();} 29, }

30, public int updateDb(String sql){//声明update方法 31, try{

32, sql = new String(sql);//转码 33, count=stat.executeUpdate(sql); 34, }

35, catch(Exception ie){ie.printStackTrace();} 36, return count; 37, }

38, public void dbClose(){//声明close方法 39, try{con.close();}

40, catch(Exception e){e.printStackTrace();} 41, } 42, }

这段代码主要实现了加载MYSQL的JDBC驱动。并且创建了数据库连接和STATEMENT对象

3,管理端界面的实现模块

管理端界面的实现,窗体左边是一个树状列表控件,右边是一个卡片布局的面板,实现代码如下:

package wyf.hxl; import java.awt.*;

import java.awt.event.*; import javax.swing.event.*; import javax.swing.*; import javax.swing.tree.*; import java.io.*;

public class Root extends JFrame {

//创建节点数组

DefaultMutableTreeNode[] dmtn=

{new DefaultMutableTreeNode(new NodeValue(\图书馆管理系统\new DefaultMutableTreeNode(new NodeValue(\学生用户管理\new DefaultMutableTreeNode(new NodeValue(\图书管理\new DefaultMutableTreeNode(new NodeValue(\查询图书\new DefaultMutableTreeNode(new NodeValue(\借阅预约图书\new DefaultMutableTreeNode(new NodeValue(\归还挂失图书\new DefaultMutableTreeNode(new NodeValue(\交纳罚款\new DefaultMutableTreeNode(new NodeValue(\管理员管理\new DefaultMutableTreeNode(new NodeValue(\退出\

DefaultTreeModel dtm=new DefaultTreeModel(dmtn[0]);//创建树模型,指定根节点为\学生管理系统\

JTree jt=new JTree(dtm);//创建包含dtm树模型的JTree对象 JScrollPane jsp=new JScrollPane(jt);//为JTree创建滚动窗体

private JSplitPane jsplr=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true);//创建分割窗体对象

private JPanel jp=new JPanel();//创建JPanel对象 Image image=new ImageIcon(\ImageIcon ii = new ImageIcon(image); private JLabel jlRoot=new JLabel(ii); private Manager mg;//登陆管理员名 String mgNo;//管理员ID

CardLayout cl=new CardLayout();//获取卡片布局管理器引用 public Root(String mgNo) {

this.mgNo=mgNo;//获得管理员ID

mg=new Manager(mgNo);//创建管理员管理面板 this.setManager();//设置管理员权限 this.initJp();//初始化卡片布局面板

this.addTreeListener();//为树节点注册事件监听器 for(int i=1;i<9;i++)

{//向根节点添加子节点

dtm.insertNodeInto(dmtn[i],dmtn[0],i-1); }

jt.setEditable(false);//设置该树中节点是可编辑的 this.add(jsplr);//将包含树的滚动窗口添加进窗体

jsplr.setLeftComponent(jt);//将包含树的滚动窗口添加进左边的子窗口 jp.setBounds(200,50,600,500);//为jp设置大小位置并添加进右边的子窗口 jsplr.setRightComponent(jp);

jsplr.setDividerLocation(200);//设置分隔条的初始位置 jsplr.setDividerSize(4);//设置分隔条的宽度

jlRoot.setFont(new Font(\jlRoot.setHorizontalAlignment(JLabel.CENTER); jlRoot.setVerticalAlignment(JLabel.CENTER);

//设置窗体的关闭动作,标题,大小,位置及可见性 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Image image=new ImageIcon(\this.setIconImage(image); this.setTitle(\图书管理系统\

//设置窗体首次出现的大小和位置--自动居中

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int centerX=screenSize.width/2; int centerY=screenSize.height/2; int w=500;//本窗体宽度 int h=400;//本窗体高度

this.setBounds(centerX-w/2,centerY-h/2-100,w,h);//设置窗体出现在屏幕中央 this.setExtendedState(JFrame.MAXIMIZED_BOTH);//窗体全屏 this.setVisible(true);//设置窗体可见

jt.setShowsRootHandles(true);//设置显示根节点的控制图标 }

public void setManager() {

String sql=\DataBase db=new DataBase();//创建数据库类对象 db.selectDb(sql);//执行查询 try {

db.rs.next();//结果集游标下移

String str=db.rs.getString(1).trim();//得到管理员权限 if(str.equals(\

{

mg.setFlag(false);//设置管理员权限 } }

catch(Exception e) {

e.printStackTrace(); } }

public void initJp() {

jp.setLayout(cl);//设置布局管理器为卡片布局 jp.add(jlRoot,\添加根结点显示信息

jp.add(new Student(),\添加学生管理模块界面

jp.add(new BookManage(),\添加图书管理模块界面 jp.add(new SearchBook(),\添加查找图书管理界面

jp.add(new BorrowBook(),\添加借阅预约图书模块界面 jp.add(new ReturnBook(),\添加归还挂失图书界面 jp.add(this.mg,\添加管理员管理模块界面 jp.add(new ExceedTime(),\添加罚款处理界面 }

public void addTreeListener() {

jt.addTreeSelectionListener(new TreeSelectionListener() {

public void valueChanged(TreeSelectionEvent e) {

DefaultMutableTreeNode cdmtn=//得到选中的节点对象

(DefaultMutableTreeNode)e.getPath().getLastPathComponent();

NodeValue cnv=(NodeValue)cdmtn.getUserObject();//得到自定义节点对象 if(cnv.value.equals(\图书馆管理系统\{//显示根结点信息 cl.show(jp,\}

if(cnv.value.equals(\学生用户管理\{//显示学生用户管理界面 cl.show(jp,\}

else if(cnv.value.equals(\图书管理\{//显示图书管理界面 cl.show(jp,\}

if(cnv.value.equals(\查询图书\

{//显示查询图书界面 cl.show(jp,\}

else if(cnv.value.equals(\借阅预约图书\{//显示借阅预约图书界面 cl.show(jp,\}

else if(cnv.value.equals(\归还挂失图书\{//显示归还挂失图书界面 cl.show(jp,\}

else if(cnv.value.equals(\交纳罚款\{//显示缴纳罚款界面 cl.show(jp,\}

else if(cnv.value.equals(\管理员管理\{//显示管理员管理界面 cl.show(jp,\}

else if(cnv.value.equals(\退出\{//显示退出界面

int i=JOptionPane.showConfirmDialog(Root.this,\是否退出系统?\\消息\if(i==JOptionPane.YES_OPTION) {//退出系统 System.exit(0); } } } }); }

public static void main(String args[]){new Root(\}

class NodeValue {

String value;//自定义节点对象字符属性 public NodeValue(String value) {//构造器

this.value=value; }

public String getValue() {//value的Get方法 return this.value; }

@Override

public String toString() {//重写toString方法 return value; } }

3, 查询图书功能实现模块

当学生用户在学生信息系统中,单击‘查询图书’节点时,就会进入查询图书界面,页面开发的详细代码如下: package wyf.hxl; import javax.swing.*; import java.awt.*;

import java.awt.event.*; import javax.swing.table.*; import javax.swing.event.*; import java.sql.*; import java.util.*; import java.util.Date;

public class SearchBook extends JPanel implements ActionListener{ int flag; String sql; DataBase db;

//创建分割方向为上下的JSplitePane对象

private JSplitPane jsp=new JSplitPane(JSplitPane.VERTICAL_SPLIT,true); private JPanel jpt=new JPanel();//创建JPanel对象 private JPanel jpb=new JPanel();

//创建表示下拉列表框数据模型的字符串数组

private String[] str={\书名\出版社\作者\购买时间\

private JComboBox jcb=new JComboBox(str);//创建下拉列表框 private JButton jb=new JButton(\提交\//创建按钮 private JLabel[] jlArray=new JLabel[]{ new JLabel(\ 书 名\new JLabel(\ 作 者\new JLabel(\出版社\};

private JTextField[] jtxtArray=new JTextField[]{//创建文本框 new JTextField(),new JTextField(), new JTextField(),new JTextField() };

private JRadioButton[] jrbArray={//创建单选按钮 new JRadioButton(\简单查询\new JRadioButton(\高级查询\};

private ButtonGroup bg=new ButtonGroup();//创建按钮组 Vector head = new Vector(); {//定义表头

head.add(\书号\书名\head.add(\作者\出版社\

head.add(\购进时间\是否借阅\head.add(\是否预约\}

Vector data=new Vector();//定义检索出的书的基本信息

DefaultTableModel dtm=new DefaultTableModel(data,head); //创建表格模型 JTable jt=new JTable(dtm); //创建Jtable对象

JScrollPane jspn=new JScrollPane(jt);//将JTable封装到滚动窗格 public SearchBook(){

this.setLayout(new GridLayout(1,1));//设置查询图书界面为网格布局 //设置整个RetrunBook界面上下部分均为空布局管理器 jpt.setLayout(null); jpb.setLayout(null);

//设置单选框的大小、位置,并添加事件监听器 jpt.add(jcb);

jcb.setBounds(160,20,150,20); jcb.addActionListener(this);

//添加JButton设置其大小位置并添加事件监听器 jpt.add(jb);

jb.setBounds(560,20,120,20); jb.addActionListener(this);

for(int i=0;i<2;i++){//对单选按钮进行设置 jrbArray[i].setBounds(20,20+i*40,100,20); jpt.add(jrbArray[i]);

jrbArray[i].addActionListener(this); bg.add(jrbArray[i]); }

for(int i=0;i<3;i++){//设置标签和文本框的坐标,并将其添加进JPanel jlArray[i].setBounds(120+i*200,60,80,20); jtxtArray[i].setBounds(200+i*180,60,120,20); jpt.add(jtxtArray[i]); jpt.add(jlArray[i]); }

for(int i=0;i<3;i++){//设置文本框为不可用 jtxtArray[i].setEditable(false); }

//设置文本框的坐标,并添加进jpt jtxtArray[3].setBounds(350,20,120,20); jpt.add(jtxtArray[3]);

jsp.setTopComponent(jpt);//把jpt设置到jsp的上部窗格 jsp.setBottomComponent(jspn); jsp.setDividerSize(4); this.add(jsp);

jsp.setDividerLocation(100);//设置jsp中分割条的初始位置 //设置窗体的大小位置及可见性 this.setBounds(3,10,600,400); this.setVisible(true); }

//为事件加载的监听器加上处理事件

public void actionPerformed(ActionEvent e){

if(jrbArray[0].isSelected()){//\简单查询\单选按钮被选中 jtxtArray[3].setEditable(true);

for(int i=0;i

if(jcb.getSelectedIndex()>=0&&jcb.getSelectedIndex()<4){ jtxtArray[3].requestFocus();

if(e.getSource()==jb){//如果事件源为\提交\按钮,则执行检索 String str=jtxtArray[3].getText().trim(); if(str.equals(\

JOptionPane.showMessageDialog(this,\请输入必要的信息!!!\\消息\return;

}

if(jcb.getSelectedIndex()==0){//根据书名进行查询 sql=\jtxtArray[3].setText(\}

else if(jcb.getSelectedIndex()==1){//根据出版社进行查询 sql=\jtxtArray[3].setText(\}

else if(jcb.getSelectedIndex()==2){//根据作者进行查询 sql=\jtxtArray[3].setText(\}

else{//根据购进时间进行查询

sql=\jtxtArray[3].setText(\}

db=new DataBase();; try{//进行转码

sql = new String(sql); }

catch(Exception ae){ae.printStackTrace();} db.selectDb(sql);

//从表中检索成功后,把查到的书的所有信息显示在界面下部分的表中 Vector vtemp = new Vector(); try{

int flag=0;

while(db.rs.next()) {//取到结果集 flag++;

Vector v = new Vector();

for(int i=1;i<=7;i++){//将每列添加到临时数组v String str1=db.rs.getString(i); str1=new String(str);//转码 v.add(str1); }

vtemp.add(v);//将各条记录添加到临时数组vtemp }

if(flag==0){//查询失败,提示

JOptionPane.showMessageDialog(this,\没有您要查找的内容!!!\\消息\return; } }

catch(Exception ea){ea.printStackTrace();}

dtm.setDataVector(vtemp,head); //更新table jt.updateUI(); jt.repaint(); db.dbClose(); } } }

if(jrbArray[1].isSelected()){//\高级查询\单选按钮被选中 jtxtArray[0].requestFocus(); //获得输入焦点 jtxtArray[3].setEditable(false);

for(int i=0;i

if(e.getSource()==jb){//点击\提交\按钮 int bz=this.seniorSearch(); if(bz!=0){return;} db=new DataBase(); db.selectDb(sql);

//从表中检索成功后,把查到的书的所有信息显示在界面下部分的表中 Vector vtemp = new Vector(); try{

int flag=0;

while(db.rs.next()){//取到结果集 flag++;

Vector v = new Vector();

for(int i=1;i<=7;i++){//将每列添加到临时数组v String str=db.rs.getString(i);

str=new String(str.getBytes(\v.add(str); }

vtemp.add(v);//将各条记录添加到临时数组vtemp }

if(flag==0){//查询失败,则弹出提示对话框

JOptionPane.showMessageDialog(this,\没有您要查找的内容!!!\\消息\return; } }

catch(Exception ea){ea.printStackTrace();} dtm.setDataVector(vtemp,head);//更新table jt.updateUI(); jt.repaint(); db.dbClose();

} } }

public int seniorSearch(){ int flag=0;//设置标志位

String str0=jtxtArray[0].getText().trim(); String str1=jtxtArray[1].getText().trim(); String str2=jtxtArray[2].getText().trim();

if(str0.equals(\文本框输入为空 JOptionPane.showMessageDialog(this,\请输入必要的信息!!!\\消息\flag++; }

if(((!str0.equals(\||((str0.equals(\||((str0.equals(\JOptionPane.showMessageDialog(this,\请使用简单查询!!!\\消息\flag++; }

if((!str0.equals(\书名和作者组合 sql=\jtxtArray[0].setText(\}

if((!str0.equals(\书名和出版社组合 sql=\jtxtArray[0].setText(\}

if((str0.equals(\作者与出版社组合 sql=\jtxtArray[1].setText(\}

if((!str0.equals(\三者组合 sql=\+\

jtxtArray[0].setText(\}

return flag; } }

界面如下:

(2)高级查询实现:

if(jrbArray[1].isSelected()){//\高级查询\单选按钮被选中 jtxtArray[0].requestFocus(); //获得输入焦点 jtxtArray[3].setEditable(false);

for(int i=0;i

jtxtArray[i].setEditable(true); }

if(e.getSource()==jb){//点击\提交\按钮 int bz=this.seniorSearch(); if(bz!=0){return;} db=new DataBase(); db.selectDb(sql);

//从表中检索成功后,把查到的书的所有信息显示在界面下部分的表中 Vector vtemp = new Vector(); try{

int flag=0;

while(db.rs.next()){//取到结果集 flag++;

Vector v = new Vector(); for(int i=1;i<=7;i++){//将每列添加到临时数组v String str=db.rs.getString(i);

str=new String(str.getBytes(\),\); v.add(str); }

vtemp.add(v);//将各条记录添加到临时数组vtemp }

if(flag==0){//查询失败,则弹出提示对话框

JOptionPane.showMessageDialog(this,\没有您要查找的内容!!!\, \消息\,JOptionPane.INFORMATION_MESSAGE); return;

} }

catch(Exception ea){ea.printStackTrace();} dtm.setDataVector(vtemp,head);//更新table jt.updateUI(); jt.repaint(); db.dbClose(); }

4,借阅与预约图书功能模块:

代码如下:

public class BorrowBook extends JPanel implements ActionListener{ //创建分割方向为上下的JSplitePane对象 private JSplitPane jsp1=new

JSplitPane(JSplitPane.VERTICAL_SPLIT,true); private JPanel jp2=new JPanel(); //创建按钮数组 int flag; String sql; DataBase db;

private JButton jb2=new JButton(\确定\);

private JLabel jl3=new JLabel(\您要借阅或预约的书号\); private JLabel jl4=new JLabel(\请输入您的学号\); //在jsp1添加文本框

private JTextField jtxt3=new JTextField(); private JTextField jtxt4=new JTextField(); //在jp2设置单选框

private JRadioButton[] jrbArray=

{new JRadioButton(\借阅图书\,true),new JRadioButton(\预约图书\)}; private ButtonGroup bg=new ButtonGroup();

Vector head = new Vector(); //创建标题 {

head.add(\书号\); head.add(\书名\); head.add(\作者\); head.add(\出版社\); head.add(\是否借阅\);

head.add(\是否预约\); }

Vector data=new Vector();//表格数据向量集合

DefaultTableModel dtm=new DefaultTableModel(data,head);//创建表格模型

JTable jt=new JTable(dtm); //创建Jtable对象

JScrollPane jspn=new JScrollPane(jt);//将JTable放进滚动窗体 public BorrowBook() {

this.setLayout(new GridLayout(1,1)); //把jsp2设置到jsp1的上部窗格 jsp1.setTopComponent(jp2); //设置jsp1的下部窗格

jsp1.setBottomComponent(jspn); //设置jsp1,jsp2中分割条的初始位置

jsp1.setDividerLocation(100);//设置分割控件位置 jsp1.setDividerSize(4);//设置分割控件宽度 jp2.setLayout(null);

jb2.setBounds(380,20,100,20);//设置按钮的大小与位置 //将按钮添加进JPanel jp2.add(jb2);

jb2.addActionListener(this); //设置JLabel的坐标

jl3.setBounds(80,60,130,20); jl4.setBounds(330,60,100,20); //把JLabel添加进JPanel jp2.add(jl3); jp2.add(jl4);

jtxt3.setBounds(220,60,100,20); jtxt4.setBounds(430,60,100,20); jp2.add(jtxt3); jp2.add(jtxt4);

for(int i=0;i<2;i++) {

jrbArray[i].setBounds(70+i*150,20,150,20); jp2.add(jrbArray[i]); bg.add(jrbArray[i]); }

this.add(jsp1);

//设置窗体的标题,大小位置及可见性 this.setBounds(10,10,800,600); this.setVisible(true); }

//为事件加载的监听器加上处理事件

public void actionPerformed(ActionEvent e){ if(e.getSource()==jb2){

if(jtxt4.getText().equals(\)){//为输入为空的情况进行处理

JOptionPane.showMessageDialog(this,\输入不能为空,请重新输入!!!\,

\信息\,JOptionPane.INFORMATION_MESSAGE); return; }

//查询学号文本中所输学号是否存在于STUDENT表中 sql=\

StuNO=\+Integer.parseInt(jtxt4.getText().trim()); db=new DataBase(); db.selectDb(sql);

Vector vtemp = new Vector(); try{

if(!(db.rs.next())){//若学号错误,输出提示对话框

JOptionPane.showMessageDialog(this,\输入了错误的学号\,\消息\, JOptionPane.INFORMATION_MESSAGE); }

else{//得到输入学号的学生的姓名和班级

String stuName=db.rs.getString(2).trim(); String classes=db.rs.getString(5).trim();

stuName = new String(stuName.getBytes(\),\); classes = new String(classes.getBytes(\),\); //若学号正确,则检查该学生是否有权限借书或预约

if(db.rs.getString(8).trim().equals(\否\)){//若无权限则输出提示对话框

JOptionPane.showMessageDialog(this,\您无此权限!!\,\消息\, JOptionPane.INFORMATION_MESSAGE); }

else{//若有权限,则查找所输入的书号是否存在于Book表中 sql=\

+Integer.parseInt(jtxt3.getText().trim()); db.selectDb(sql);

do{//str6存Book表中记录中第6项,str7存第7项 String str6=null; String str7=null;

//定义输入书号所对应书的书名和作者 String bookName=null; String author=null;

if(!(db.rs.next())){//若Book表中没有该书号,则输出提示对话框 JOptionPane.showMessageDialog(this,\没有您要查找的内容\, \消息\,JOptionPane.INFORMATION_MESSAGE); }

Vector v = new Vector();

for(int i=1;i<=7;i++){//顺序达到所搜到的结果中的各项记录 if(i==5){//

str6=db.rs.getString(i+1);

str6=new String(str6.getBytes(\),\); v.add(str6); }

if(i==6){//

str7=db.rs.getString(i+1);

str7=new String(str7.getBytes(\),\); v.add(str7); }

if(i==2){//

bookName=db.rs.getString(i).trim();

bookName=new String(bookName.getBytes(\),\); v.add(bookName); }

if(i==3){//

author=db.rs.getString(i).trim();

author=new String(author.getBytes(\),\); v.add(author); }

if(i==1){//

String str=db.rs.getString(i).trim();

str=new String(str.getBytes(\),\); v.add(str); }

if(i==4){//

String str=db.rs.getString(i).trim();

str=new String(str.getBytes(\),\); v.add(str); } }

vtemp.add(v);//更新结果框中的内容 dtm.setDataVector(vtemp,head); jt.updateUI(); jt.repaint();

if(jrbArray[0].isSelected()){//选择了借图书

if(str6.trim().equals(\是\)){//用户想借的书已经被借走,输出提示信息框

JOptionPane.showMessageDialog(this,

\此书已经被借\,\消息\,JOptionPane.INFORMATION_MESSAGE);

}

else if(str7.trim().equals(\是\)){//用户想借的书已被约不能借,提示 JOptionPane.showMessageDialog(this, \此书已经被预约,不能再借\,\消息

\,JOptionPane.INFORMATION_MESSAGE); }

else{// 创建日期对象,以获得当前日期来记录借书时间和应还时间- Date now =new Date();

sql=\是' where BookNO=\ +Integer.parseInt(jtxt3.getText().trim());

db.updateDb(sql);//成功,则设置该书的Borrowed项为\是\输出借书成功信息框

JOptionPane.showMessageDialog(this,

\借书成功\,\消息\,JOptionPane.INFORMATION_MESSAGE); sql=\

values(\+Integer.parseInt(jtxt3.getText().trim())+\

+Integer.parseInt(jtxt4.getText().trim())+\+(now.getYear()+1900)+\

+(now.getMonth()+1)+\+now.getDate()+\+\+(now.getYear()+1900)+\

+(now.getMonth()+2)+\+now.getDate()+\否','否')\; db.updateDb(sql);//将该书记录插入Record表中 } }

if(jrbArray[1].isSelected()){//选择了预约图书

if(str7.trim().equals(\是\)){ //该书已经被预约,输出提示信息框 JOptionPane.showMessageDialog(this,

\此书已经被预约\,\消息\,JOptionPane.INFORMATION_MESSAGE); }

else{//预约成功,设置预约项Ordered为是,表示该书已经被预约 sql=\是' where BookNO=\ +Integer.parseInt(jtxt3.getText().trim()); db.updateDb(sql); //输出预约成功信息框

JOptionPane.showMessageDialog(this,

\预约成功\,\消息\,JOptionPane.INFORMATION_MESSAGE); sql=\

values(\+Integer.parseInt(jtxt3.getText().trim()) +\+stuName+\+classes+\+bookName+\

+Integer.parseInt(jtxt4.getText().trim())+\+author+\; db.updateDb(sql); } } }

while(db.rs.next()); } } }

catch(Exception ex){ex.printStackTrace();} db.dbClose();//关闭数据库链接 } } }

5,归还挂失图书模块:

代码:

package wyf.hxl;

import javax.swing.*; import java.awt.*;

import java.awt.event.*; import javax.swing.table.*; import javax.swing.event.*; import java.sql.*; import java.util.*; import java.util.Date;

public class ReturnBook extends JPanel implements ActionListener {

DataBase db; String sql; String str;

//创建分割方向为上下的JSplitePane对象 private JSplitPane jsp=new

JSplitPane(JSplitPane.VERTICAL_SPLIT,true); //创建JPanel对象

private JPanel jpt=new JPanel(); private JPanel jpb=new JPanel(); //创建按钮数组

private JButton[] jbArray=new JButton[] {

new JButton (\挂失\new JButton (\归还\

new JButton (\确定\};

private JLabel jl=new JLabel(\请输入你的学号:\

private JTextField jtxt=new JTextField();

//创建标题

Vector head = new Vector(); {

head.add(\书号\head.add(\学号\head.add(\借阅时间\head.add(\还书时间\head.add(\是否过期\head.add(\是否预约\} //

Vector data=new Vector(); //创建表格模型

DefaultTableModel dtm=new DefaultTableModel(data,head); //创建Jtable对象

JTable jt=new JTable(dtm); //将JTable封装到滚动窗格

JScrollPane jspn=new JScrollPane(jt); public ReturnBook() {

this.setLayout(new GridLayout(1,1));

//设置整个RetrunBook界面上下部分均为空布局管理器 jpt.setLayout(null); jpb.setLayout(null); //设置Label的大小及位置 jl.setBounds(5,15,100,20); //将Jlabel添加到jpt面板上 jpt.add(jl);

//为JTextField设置大小及位置 jtxt.setBounds(105,15,300,20); //把JTextField添加到jpt jpt.add(jtxt);

//设置JBuuton的大小及位置

jbArray[0].setBounds(5,50,100,20); jbArray[1].setBounds(150,50,100,20); jbArray[2].setBounds(295,50,100,20); //添加JButton并给其添加事件监听器 for(int i=0;i<3;i++)

{

jpt.add(jbArray[i]);

jbArray[i].addActionListener(this); }

//把jpt设置到jsp的上部窗格 jsp.setTopComponent(jpt); //jpb.add(jspn);

jsp.setBottomComponent(jspn); jsp.setDividerSize(4); this.add(jsp);

//设置jsp中分割条的初始位置 jsp.setDividerLocation(80); //设置窗体的大小位置及可见性

this.setBounds(10,10,800,600); this.setVisible(true); }

public void actionPerformed(ActionEvent e) {

if(e.getSource()==jbArray[2]){//事件源为\确定\按钮

if(jtxt.getText().trim().equals(\学号输入为空,提示 JOptionPane.showMessageDialog(this,\请输入学号\\消息\return; }

else{//根据学号进行查询

sql=\db=new DataBase(); db.selectDb(sql);

Vector vtemp = new Vector(); try{//结果集进行异常处理 int k=0;

while(db.rs.next()){//取到结果集 k++;

Vector v = new Vector(); for(int i=1;i<7;i++){//将每列添加到临时数组v String str=db.rs.getString(i);

str=new String(str.getBytes(\v.add(str); }

vtemp.add(v);//将各条记录添加到临时数组vtemp //更新table

jt.clearSelection();

dtm.setDataVector(vtemp,head);

jt.updateUI(); jt.repaint(); }

if(k==0){//提示

JOptionPane.showMessageDialog(this,\输入了错误的学号或该学生没有借书记录\

\消息\return; } }

catch(Exception ea){ea.printStackTrace();} } }

if(e.getSource()==jbArray[1]){//当要归还图书 int row=jt.getSelectedRow();

if(row<0){//如果未选中下部表中的某些内容,进行提示

JOptionPane.showMessageDialog(this,\请选择要归还的书!!!\消息\JOptionPane.INFORMATION_MESSAGE); return; }

str=(String)jt.getValueAt(row,0);//得到书号

int sno=Integer.parseInt((String)jt.getValueAt(row,1)); int bno=Integer.parseInt(str);

int flag=checkTime(sno,bno); //判断是否超期

if(flag==-1){//如果图书超期,则将取消该同学的借书权限 db=new DataBase();

sql=\否' where StuNO=\db.updateDb(sql); db.dbClose(); }

if(flag==0){return;}//如果图书未超期,则进行归还操作

sql=\db=new DataBase(); db.updateDb(sql);

sql=\否' where BookNO=\

db.updateDb(sql);//更新了图书记录,设该书号的数为可借 db.dbClose(); updateTable(); }

if(e.getSource()==jbArray[0]){//需要挂失图书 int row=jt.getSelectedRow(); if(row<0){

JOptionPane.showMessageDialog(this,\请选择要挂失的书!!!\消息\JOptionPane.INFORMATION_MESSAGE); return; }

loseBook(row); updateTable(); } }

public void loseBook(int row){ String bname=\int lbno=0;

int bno=Integer.parseInt((String)jt.getValueAt(row,0));//得到丢失书的书号

String sno=(String)jt.getValueAt(row,1);//得到丢失书的人学号 sql=\db=new DataBase(); db.selectDb(sql); try{

if(db.rs.next()){

bname=db.rs.getString(1).trim();//得到丢失书的书名 } }

catch(Exception e){e.printStackTrace();} //找到最大的丢失记录号

sql=\db.selectDb(sql); try{

if(db.rs.next()){

lbno=db.rs.getInt(1);//得到最大的丢失记录号 lbno++; } }

catch(Exception ea){ea.printStackTrace();} sql=\

values(\向丢书记录表中插入记录

db.updateDb(sql);

sql=\检查预约表中是否预约该书,若有,删除 db.selectDb(sql); try{

while(db.rs.next()){//删除记录

sql=\

db.updateDb(sql); } }

catch(Exception e){e.printStackTrace();}

sql=\检查超期表中是否有该书,若有,删除 db.selectDb(sql); try{

while(db.rs.next()){//从超期表中删除记录

sql=\db.updateDb(sql); } }

catch(Exception e){e.printStackTrace();}

sql=\从借书表中将丢失图书的记录删除

db.updateDb(sql);

sql=\从图书表中将丢失的书删除

int i=db.updateDb(sql); db.dbClose();

if(i>0){//提示挂失成功

JOptionPane.showMessageDialog(this,\恭喜你,挂失成功!!!\消息\JOptionPane.INFORMATION_MESSAGE); return; }

else{//提示挂失失败

JOptionPane.showMessageDialog(this,\对不起,挂失失败!!!\\信息\return; } }

public void updateTable(){//实现界面下部表格的更新

sql=\db=new DataBase();

db.selectDb(sql);//将图书信息从数据库中取出 Vector vtemp = new Vector(); try{

while(db.rs.next()){

Vector v = new Vector(); for(int i=1;i<7;i++){//将每列添加到临时数组v String str=db.rs.getString(i);

str=new String(str.getBytes(\v.add(str);

}

vtemp.add(v);//将各条记录添加到临时数组vtemp }

db.dbClose(); }

catch(Exception ea){ea.printStackTrace();} jt.clearSelection();

dtm.setDataVector(vtemp,head);//更新table jt.updateUI(); jt.repaint(); }

public int checkTime(int sno,int bno)

{//-1代表超期没交罚款 0代表当天借的书 1代表正常还的书 -2表示超期交罚款 int day=0; int flag=0;

String bname=\

Date now=new Date(); String returntime=\

sql=\BookNO=\

db=new DataBase(); db.selectDb(sql); try{

if(db.rs.next()){

returntime=db.rs.getString(1);//获取归还时间 } }

catch(Exception e){e.printStackTrace();}

String[] strday=returntime.split(\这里使用了简单的正则式,规定了时间的格式

int ryear=Integer.parseInt(strday[0].trim()); int rmonth=Integer.parseInt(strday[1].trim()); int rday=Integer.parseInt(strday[2].trim());

day=(now.getYear()+1900-ryear)*365+(now.getMonth()+1-rmonth)*30+(now.getDate()-rday); if(day==-30)

{//表示当天借的书

JOptionPane.showMessageDialog(this,\今天借的书不能还!!!\\消息\flag=0; }

else if(day>0) {//代表超期了

int i=JOptionPane.showConfirmDialog(this,\该书已过期,应交罚款为\+day*0.1+\元,是否缴纳罚款?\消息\if(i==JOptionPane.YES_OPTION){

JOptionPane.showMessageDialog(this,\你已成功交费\元\\消息\flag=-2; } else

{//超期且没交费 flag=-1;

sql=\db.selectDb(sql); try{

if(db.rs.next()){bname=db.rs.getString(1).trim();} }

catch(Exception e){e.printStackTrace();}

sql=\values(\db.updateDb(sql); } } else

{//表示可以正常归还的书 flag=1; }

db.dbClose(); return flag; }

public static void main(String[] args) {

new ReturnBook(); } }

6,图书超期处理模块:

代码如下:

int day=0;//初始化天数变量 DataBase db=new DataBase();

String sno=(String)jtf.getText().trim();//定义文本框内容变量 if(sno.equals(\如果输入学号为空进行提示

JOptionPane.showMessageDialog(this,\学号不能为空!!!\\信息\return; }

if(sno.matches(\定义学号格式为数字组合

JOptionPane.showMessageDialog(this,\学号只能为数字!!!\\信息\return; }

String sql=\+Integer.parseInt(sno);

db.selectDb(sql);//查询图书超期天数 try{//对结果集进行异常处理 int flag=0;

while(db.rs.next()){//得到所借书的超期天数 flag++;

day+=db.rs.getInt(1); }

if(flag==0){//结果集为空给出提示

JOptionPane.showMessageDialog(this,\您所借的书没有超期,不需要还款!!\

\信息\return; } }

catch(Exception ex){ex.printStackTrace();} if(e.getSource()==jb1){//事件源为\查询欠款\按钮 if(day>0){//提示欠款数

JOptionPane.showMessageDialog(this,\您欠费\元!\\信息\return; }

else{//如果没有欠款,提示

JOptionPane.showMessageDialog(this,\您所借的书没有超期,不需要还款!!\

\信息\return; } }

else if(e.getSource()==jb){//事件源为\交费\按钮

if(jtf1.getText().trim().equals(\缴费金额为空的提示 JOptionPane.showMessageDialog(this,\请输入缴款金额!!\\消息\return; }

int k=JOptionPane.showConfirmDialog(this,\是否缴费?\\消息\

if(k==JOptionPane.YES_OPTION){//选择对话框,当选择\是\时,将提示操作步骤

int ii=Integer.parseInt(jtf1.getText().trim()); if(ii<(day*0.1)){

sql=\stuNO=\db=new DataBase();

int i=db.updateDb(sql);//更新表 if(i==1){//输出还应该缴费数的提示

JOptionPane.showMessageDialog(this,\你已成功交费\元,您还需缴纳\元\

\消息\return; }

else{//选择\否\,提示缴费失败

JOptionPane.showMessageDialog(this,\对不起,缴费失败!!!\\消息\return; } }

else{//提示缴费成功

JOptionPane.showMessageDialog(this,\你已成功交费\元\\消息\jtf.setText(\

sql=\from EXCEEDTIME where StuNO=\db.updateDb(sql);//缴纳了所有欠款,更新EXCEEDTIME表信息 sql=\是' where StuNO=\

db.updateDb(sql);//更新student表的借书权限

} } }

db.dbClose();//关闭数据库连接 } }

7,学生用户管理模块:

代码:

package wyf.hxl;

import javax.swing.*; import java.awt.*;

import java.awt.event.*; import javax.swing.table.*; import java.sql.*; import java.util.*; import java.util.Date;

public class Student extends JPanel implements ActionListener { //创建一个上下方向分割的JSplitPane对象 private JSplitPane jsp=new

JSplitPane(JSplitPane.VERTICAL_SPLIT); private JPanel jpt=new JPanel();

String[]str1=new String[7];//声明字符串数组 String sql; DataBase db;

private JLabel[] jlArray=new JLabel[]{//声明标签数组 new JLabel(\学 号\new JLabel(\姓 名\new JLabel(\性 别\new JLabel(\班 级\new JLabel(\院 系\new JLabel(\密 码\new JLabel(\借书权限\};

private JTextField[] jtxtArray=new JTextField[]{//声明文本框数组

new JTextField(),new JTextField(), new JTextField(),new JTextField(), new JTextField(),new JTextField() };

private String[] str={\是\否\创建下拉列表框数据模型的字符串数组

private JComboBox jcp=new JComboBox(str);//创建下拉列表框 private JButton[] jbArray={//设置JButton按钮的文本

new JButton(\添加学生信息\删除学生信息\new JButton(\修改学生信息\查找学生信息\};

Vector head = new Vector(); {//创建标题

head.add(\学号\姓名\head.add(\性别\班级\head.add(\院系\密码\head.add(\借书权限\}

Vector data=new Vector();//在下部子窗口中设置表格 DefaultTableModel dtm=new DefaultTableModel(data,head);//创建表格模型

JTable jt=new JTable(dtm);//创建JTable对象

JScrollPane jspn=new JScrollPane(jt);//将JTable封装到滚动窗格 public Student() {

this.setLayout(new GridLayout(1,1));//声明本界面为网格布局 jpt.setLayout(null);//设置面板的上部分为空布局管理器

jsp.setDividerLocation(130);//设置jspt中分割条的初始位置 jsp.setDividerSize(4);//设置分隔条的宽度 jsp.setTopComponent(jpt);

jsp.setBottomComponent(jspn);

for(int i=0;i<6;i++){//将文本框添加进上部面板 jpt.add(jtxtArray[i]); }

for(int i=0;i<7;i++){ jpt.add(jlArray[i]); if(i<3)

{//对界面上的第一行标签和文本框大小位置进行设置 jlArray[i].setBounds(20+i*200,10,100,20); jtxtArray[i].setBounds(120+i*200,10,120,20); jtxtArray[i].addActionListener(this); }

else if(i>2&&i<6)

{//对第二行标签和文本框大小位置进行设置

jlArray[i].setBounds(20+(i-3)*200,50,100,20); jtxtArray[i].setBounds(120+(i-3)*200,50,120,20); jtxtArray[i].addActionListener(this); } else

{//对最下面的显示标签进行设置

jlArray[i].setBounds(620,10,100,20); } }

this.add(jsp); jpt.add(jcp);

jsp.setBottomComponent(jspn);//设置下部子窗格 jcp.setBounds(720,10,100,20); for(int i=0;i<4;i++) {//将JButton添加进jpt jpt.add(jbArray[i]);

jbArray[i].setBounds(170+112*i,90,112,25);

jbArray[i].addActionListener(this);//设置监听器 }

//设置窗体的大小位置及可见性 this.setBounds(5,5,600,500); this.setVisible(true); }

public void actionPerformed(ActionEvent e) {//为文本框设置焦点

if(e.getSource()==jtxtArray[0]) {

jtxtArray[1].requestFocus(); }

if(e.getSource()==jtxtArray[1]) {

jtxtArray[2].requestFocus(); }

if(e.getSource()==jtxtArray[2]) {

jtxtArray[3].requestFocus(); }

if(e.getSource()==jtxtArray[3]) {

jtxtArray[4].requestFocus(); }

if(e.getSource()==jtxtArray[4]) {

jtxtArray[5].requestFocus();

}

//当点击\添加学生信息\按钮是将执行添加功能,将文本框的学生信息添加进STUDENT表中

if(e.getSource()==jbArray[0]) {

this.insertStudent(); }

//当点击\删除学生信息\按钮是将执行删除功能,将学号为学号框的学生信息从STUDENT表中删除

if(e.getSource()==jbArray[1]) {

this.deleteStudent(); }

//当点击\修改学生信息\按钮是将执行修改功能,将信息为学号框的学生信息在STUDENT表中更新

if(e.getSource()==jbArray[2]) {

this.updateStudent(); }

//当点击\查找学生信息\按钮是将执行查找功能,将从STUDENT表中查找学号为学号框的学生信息

if(e.getSource()==jbArray[3]) {

this.searchStudent(); } }

public void insertStudent(){

for(int i=0;i<6;i++){//声明文本框输入信息 str1[i]=jtxtArray[i].getText().trim(); }

if(str1[0].equals(\&&str1[3].equals(\{//当各文本框为空提示

JOptionPane.showMessageDialog(this,\学生信息不能为空!!!\\消息\return; }

if(!str1[0].equals(\\

&&!str1[3].equals(\))

{//当在文本框输入信息

str1[6]=jcp.getSelectedItem().toString(); sql=\into STUDENT(StuNO,StuName,StuSex,Class,Department,\

+\+ str1[2] + \

str1[4]+\db=new DataBase();

db.updateDb(sql);//插入学生信息

Vector v = new Vector();

for(int i=0;i<=6;i++){//将每列添加到临时数组v v.add(str1[i]);

if(i<6){jtxtArray[i].setText(\}

data.add(v);

dtm.setDataVector(data,head);//更新table并显示 jt.updateUI(); jt.repaint(); return; } }

public void deleteStudent(){

String stuno = jtxtArray[0].getText().trim(); if(stuno.equals(\当学号输入为空提示

JOptionPane.showMessageDialog(this,\学号不能为空!!!\\消息\return; }

sql=\* from STUDENT where StuNO=\db=new DataBase();

db.selectDb(sql);//查询学号为输入的学生验证其身份 try{//对结果集进行异常处理 if(db.rs.next()){

sql=\db=new DataBase();

db.updateDb(sql);//删除学号为输入内容的学生的信息

JOptionPane.showMessageDialog(this,\成功删除该生信息记录!!\\消息\return; }

else{//若Record表中有该学号,则输出提示对话框

JOptionPane.showMessageDialog(this,\不能删除该生信息他有书未还,请他还书!!\

\消息\} }

catch(Exception e){e.printStackTrace();}

sql=\

db.updateDb(sql);//若Record表中无此学生记录则删除该生信息 }

public void updateStudent(){ String str[]=new String[7];

int row = jt.getSelectedRow();//声明所选行号 if(row>=0){//选择了表格中的某行

for(int i=0;i<7;i++){str[i]=jt.getValueAt(row,i).toString();} sql=\

StuName='\

+str[3]+\word='\

+\db=new DataBase();

db.updateDb(sql);//更新学生信息

JOptionPane.showMessageDialog(this,\修改成功!!\\消息!!\return; }

if(row==-1){//当没有选择就点击'修改信息'按钮 ,提示

JOptionPane.showMessageDialog(this,\请点击'查找'按钮,在下部更改,再选中所改行,点击'修改信息'按钮\

\return; } }

public void searchStudent(){

if(jtxtArray[0].getText().equals(\

JOptionPane.showMessageDialog(this,\输入不能为空,请重新输入!!!\

\信息\return; }

sql=\

StuNO=\db=new DataBase();

db.selectDb(sql);//查询学号文本中所输学号是否存在于STUDENT表中 try{//对结果集进行异常处理 int k=0;

Vector vtemp = new Vector(); while(db.rs.next()){ k++;

Vector v = new Vector();

for(int i=1;i<=7;i++){//顺序达到所搜到的结果中的各项记录 String str = db.rs.getString(i).trim();

str = new String(str.getBytes(\v.add(str); }

vtemp.add(v);//更新结果框中的内容 }

if(k==0){//若Book表中没有该书号,则输出提示对话框

JOptionPane.showMessageDialog(this,\没有您要查找的内容\\消息\}

dtm.setDataVector(vtemp,head); jt.updateUI(); jt.repaint(); }

catch(Exception e){e.printStackTrace();} } }

7,图书管理模块:

代码如下:

package wyf.hxl;

import javax.swing.*; import java.awt.*;

import java.awt.event.*; import javax.swing.table.*; import java.sql.*; import java.util.*; import java.util.Date;

public class BookManage extends JPanel implements ActionListener {

private JSplitPane jsp=new

JSplitPane(JSplitPane.VERTICAL_SPLIT,true); private JPanel jpt=new JPanel(); String []str1=new String [7]; String sql; DataBase db;

private JLabel[] jlArray=new JLabel[] {

new JLabel(\书 号\new JLabel(\书 名\new JLabel(\作 者\new JLabel(\出 版 社\new JLabel(\购买日期\new JLabel(\已 预 约\new JLabel(\已 借 阅\};

private JTextField[] jtxtArray=new JTextField[] {

new JTextField(), new JTextField(), new JTextField(), new JTextField(), new JTextField() };

//设置JButton按钮的文本 private JButton[] jbArray= {

new JButton(\图书入库\new JButton(\删除图书\new JButton(\修改图书记录\new JButton(\查找图书\};

//创建标题

Vector head = new Vector(); {

head.add(\书号\head.add(\书名\head.add(\作者\head.add(\出版社\head.add(\购买日期\head.add(\是否借阅\head.add(\是否预约\}

//在下部子窗口中设置表格

Vector data=new Vector(); //创建表格模型

DefaultTableModel dtm=new DefaultTableModel(data,head); //创建Jtable对象

JTable jt=new JTable(dtm); //将JTable封装到滚动窗格

JScrollPane jspn=new JScrollPane(jt); //创建表示下拉列表框数据模型的字符串数组 private String[] str={\否\是\//创建下拉列表框

private JComboBox jcp1=new JComboBox(str); private JComboBox jcp2=new JComboBox(str); public BookManage() {

this.setLayout(new GridLayout(1,1)); //设置面板的上部分为空布局管理器 jpt.setLayout(null);

//设置jspt中分割条的初始位置 jsp.setDividerLocation(140); //设置分隔条的宽度

jsp.setDividerSize(4); jsp.setTopComponent(jpt);

jsp.setBottomComponent(jspn); for(int i=0;i<5;i++) {

jpt.add(jtxtArray[i]); }

for(int i=0;i<7;i++) {

jpt.add(jlArray[i]); if(i<3) {

jlArray[i].setBounds(15,10+30*i,100,20); jtxtArray[i].setBounds(115,10+30*i,150,20); }

else if(i>2&&i<5) {

jlArray[i].setBounds(265,10+30*(i-3),100,20); jtxtArray[i].setBounds(375,10+30*(i-3),120,20); } else {

jlArray[i].setBounds(495,10+30*(i-5),100,20); } }

for(int i=0;i<5;i++) {

jtxtArray[i].addActionListener(this); }

this.add(jsp); jpt.add(jcp1); jpt.add(jcp2); //设置下部子窗格

jsp.setBottomComponent(jspn); jcp1.setBounds(595,10,100,20); jcp2.setBounds(595,40,100,20); //将JButton添加进jpt for(int i=0;i<4;i++) {

jpt.add(jbArray[i]);

jbArray[i].setBounds(150+112*i,100,112,25); }

//设置监听器

for(int i=0;i<4;i++) {

jbArray[i].addActionListener(this); }

//设置窗体的大小位置及可见性 this.setBounds(5,5,600,500); this.setVisible(true); }

public void actionPerformed(ActionEvent e){ //设置鼠标焦点

if(e.getSource()==jtxtArray[0]){ jtxtArray[1].requestFocus(); }

if(e.getSource()==jtxtArray[1]){ jtxtArray[2].requestFocus(); }

if(e.getSource()==jtxtArray[2]){ jtxtArray[3].requestFocus(); }

if(e.getSource()==jtxtArray[3]){ jtxtArray[4].requestFocus(); }

if(e.getSource()==jbArray[0]){//添加图书 this.insertBook(); }

if(e.getSource()==jbArray[1]){//将书号为书号框的书从书库删除 this.deleteBook(); }

if(e.getSource()==jbArray[2]){//将书号为书号框的书信息进行修改 this.updateBook();

}

if(e.getSource()==jbArray[3]){//查询图书信息 this.searchBook(); } }

public void insertBook(){

for(int i=0;i<5;i++){//声明输入变量

str1[i]=jtxtArray[i].getText().trim(); }

if(str1[0].equals(\&&str1[3].equals(\当输入为空进行提示 JOptionPane.showMessageDialog(this,\图书信息不能为空!!!\\消息\return; }

if(!str1[0].equals(\\

&&!str1[3].equals(\将图书信息插入Book表

str1[5]=jcp1.getSelectedItem().toString(); str1[6]=jcp2.getSelectedItem().toString();

sql=\+ str1[2] + \

str1[4]+\db=new DataBase();

db.updateDb(sql);//数据插入

Vector v = new Vector();

for(int i=1;i<=7;i++){//将每列添加到临时数组v v.add(str1[i-1]); }

data.add(v);

dtm.setDataVector(data,head);//更新table jt.updateUI(); jt.repaint(); return; } }

public void deleteBook(){

String bookno = jtxtArray[0].getText().trim(); if(bookno.equals(\当书号输入为空,提示

JOptionPane.showMessageDialog(this,\书号不能为空!!!\\消息\return; }