圖書借閱子系統數據庫設計


南昌航空大學項目報告

0   21  12    4  

 

課程名稱:  數據庫原理    名稱:    圖書借閱子系統數據庫設計               

指導教師評定:                                      簽名:                      

 

一、 項目環境

1. Windows2000或以上版本;

2. SQLServer 2005或以上版本。

二、 項目目的

    掌握數據庫設計的基本方法,了解C/S與B/S結構應用系統的特點與適用場合,了解C/S與B/S結構應用系統的不同開發設計環境與開發設計方法,綜合運用前面實驗掌握的數據庫知識與技術設計某小型數據庫應用系統。 

三、 項目要求

完成實驗指導書中p255 (2)

四、 項目設計開發過程及參考源代碼

1、 需求分析

功能需求:

1.瀏覽功能

列出當前數據文件中的圖書信息,讀者信息,借閱信息,還書信息等記錄

2.查詢功能

書目匹配查詢

讀者匹配查詢

書目和讀者匹配查詢

3.添加功能

添加書目和讀者記錄及借還書記錄

添加系統設置相關信息

4.修改功能

修改書目和讀者記錄,提供相關確認機制

修改系統設置相關信息,提供相關確認機制

5.刪除功能

刪除拿出書目和讀者記錄,提供相關確認機制

刪除系統設置相關信息,提供相關確認機制

 

性能需求:

1.數據精確度

保證查詢的查全率和查准率為100%,所在相應域中包含查詢關鍵字的記錄都能查到,所有在相應域中不包含查詢關鍵字的記錄都不能查到。

2.適應性

滿足運行環境在允許操作系統之間的安全轉換和與其他應用軟件的獨立運行要求。

 

2、 數據庫概念結構設計

概念模型如下:

 

 

 

 

 

 

 

 

 

 

 

 

3、 數據庫邏輯結構設計

借書證表stu

屬性名

類型

備注

姓名sna

Varchar(20)

不允許空

系別sde

Varchar(20)

不允許空

專業ssp

Varchar(20)

不允許空

學號sid

Varchar(20)

不允許空,唯一

性別sex

Varchar(2)

男或女不允許空

借書上限sup

Int

4

借書證號sno

Varchar(20)

主鍵

聯系方式ste

Varchar(20)

不允許空

能否借書scan

Varchar(5)

能或不能

 

圖書表book1

屬性名

類型

 備注

書名bna

Varchar(50)

主鍵

類型bki

Varchar(20)

不允許空

出版社bpu

Varchar(50)

不允許空

出版日期bda

Varchar(20)

不允許空

存放位置bpl

Varchar(20)

不允許空

存放數量bum

Int

大於0

圖書詳細表book2

屬性名

類型

備注

書名bna

Varchar(50)

主鍵

借閱狀態byn

Varchar(5)

已借或未借不允許空

書編號bno

Varchar(20)

主鍵

 

 

圖書借閱表lend:

屬性

類型

備注

借書證號sno

Varchar(20)

主鍵

書名bna

Varchar(50)

不允許空

書編號bno

Varchar(20)

主鍵

借書時間lbo

Date time

不允許空

借書期限lda

Int

62

還書時間lre

Date time

允許空

 

超期處罰表punishment

屬性

類型

備注

借書證號sno

Varchar(20)

主鍵

書編號bno

Varchar(20)

主鍵

超出時間pda

Int

不允許空

罰款金額pmo

Money

不允許空

 

管理人員表manager

屬性

類型

備注

賬號mno

Varchar(20)

主鍵

姓名mna

Varchar(20)

不允許空

密碼mpa

Varchar(20)

不允許空

 

4、 表及視圖的創建代碼

創表:

create table stu

(

  sno varchar(20) primary key,

  sna varchar(20) not null,

  sde varchar(20) not null,

  ssp varchar(20) not null,

  sid varchar(20) not null unique,

  sex varchar(2)  check(sex='男' or sex='女') not null,

  sup int         default(4) not null,

  ste varchar(20) not null,

  scan varchar(5)  check(scan='能' or scan='不能') not null,

 

);

 

 

 

create table book1

(

 bna varchar(50) primary key,

 bki varchar(20) not null,

 bpu varchar(50) not null,

 bda varchar(20) not null,

 bpl varchar(20) not null,

 bnum int        check(bnum >=0)

);

 

 

 

create table book2

(

 bno varchar(20) primary key,

 bna varchar(50) not null,

 byn varchar(5)  check(byn='已借' or byn='未借') not null

);

 

 

 

 

create table manager

(

 mno varchar(20) primary key,

 mna varchar(20) not null,

 mpa varchar(20) not null

);

 

 

 

create table lend

(

  sno  varchar(20),

  bna  varchar(20), 

  bno  varchar(20),

  lbo  Datetime not null,

  lda  int default(62),

  lre  Datetime,

  primary key (sno,bno),

  foreign key (sno) references stu(sno),

  foreign key (bno) references book2(bno),

);

 

 

 

create table punishment

(

  sno  varchar(20),

  bno  varchar(20),

  pda  int not null,

  pmo  money not null,

  primary key (sno,bno),

  foreign key (sno) references stu(sno),

  foreign key (bno) references book2(bno),

);

 

 

 

 

創建視圖:

create view  Find_Book1

as

select *

from book1

where bnum>0;

 

create view  Find_Book2

as

select *

from book2

where byn='未借';

/*插入數據

insert into book1(bna,bki,bpu,bda,bpl,bnum)

values('數據庫系統概論','數據庫','高等教育出版社','2020年4月','A-1-3',3);

insert into book1(bna,bki,bpu,bda,bpl,bnum)

values('Java程序設計','編程語言','機械工業出版社','2020年11月','B-2-4',2);

insert into book1(bna,bki,bpu,bda,bpl,bnum)

values('Java程序設計2','編程語言','機械工業出版社','2020年11月','B-2-4',1);

 

insert into book2(bno,bna,byn)

values('000001','數據庫系統概論','未借');

insert into book2(bno,bna,byn)

values('000002','數據庫系統概論','未借');

insert into book2(bno,bna,byn)

values('000003','數據庫系統概論','未借');

insert into book2(bno,bna,byn)

values('000004','Java程序設計','未借');

insert into book2(bno,bna,byn)

values('000005','Java程序設計','未借');

insert into book2(bno,bna,byn)

values('000006','Java程序設計2','未借');

 

insert into stu(sno,sna,sde,ssp,sid,sex,sup,ste,scan)

values('000001','張三','軟件','物聯網工程','19207201','男','4','13109876543','能');

insert into stu(sno,sna,sde,ssp,sid,sex,sup,ste,scan)

values('000002','李紅','軟件','軟件工程','19201601','女','4','13199999999','能');

insert into stu(sno,sna,sde,ssp,sid,sex,sup,ste,scan)

values('000003','王五','軟件','軟件工程','19201602','男','4','13188888888','能');

*/

 

5、 存儲過程和觸發器的設計

借書觸發器:

create trigger t_lend

on lend for insert 

as 

declare @bna varchar(50),@bno varchar(20),@sno varchar(20)

select @bna=bna,@bno=bno,@sno=sno from inserted  

begin 

update book1 set bnum=bnum-1 where bna=@bna

update book2 set byn='已借' where bno=@bno

update stu set sup=sup-1 where sno=@sno 

End

例子:

insert into lend(sno,bna,bno,lbo)

values('000001','數據庫系統概論','000001','2005-12-16 23:32:48')

 

 

 

 

 

 

 

 

 

 

 

 

 

還書觸發器:

create trigger t_back

on lend for update 

as if update(lre) 

declare @bna varchar(50),@bno varchar(20),@sno varchar(20)

select @bna=bna,@bno=bno,@sno=sno from inserted  

begin 

update book1 set bnum=bnum+1 where bna=@bna

update book2 set byn='未借' where bno=@bno

update stu set sup=sup+1 where sno=@sno 

End 

例子:

update lend

set lre='2006-3-16 23:32:48'

where bno='000001' and sno='000001'

 

 

 

 

 

 

 

 

 

 

 

 

罰款觸發器:

create trigger t_punish

on lend for update 

as 

if update(lre) 

begin 

declare @lre datetime, 

@lbo datetime,

@lda int, 

@pda int, 

@days int, 

@pmo money, 

@sno varchar(20), 

@bno varchar(20) 

select @lre=lre from inserted

select @lbo=lbo from inserted

select @lda=lda from inserted

select 

@days=convert(int,@lre)-convert(int,@lbo) 

select @sno=sno from inserted

select @bno=bno from inserted

 

if @days>@lda

begin 

select @pda=@days-@lda

select @pmo=@pda*0.02

insert into 

punishment(sno,bno,pda,pmo) 

values(@sno,@bno,@pda,@pmo) 

end 

end 

例子:

上個還書的例子已經超時,結果如下:

 

 

 

 

是否能借書觸發器:

create trigger t_ifcanlend

on lend for insert 

as 

declare @sno varchar(10), 

@scan varchar(5),

@sup int 

select @sno=sno from inserted

select @scan=scan,@sup=sup from stu where sno=@sno

if @scan='不能' 

begin 

print ' 您有超期罰款! ' 

rollback transaction 

end

if @sup<0

begin 

print ' 超過最大借書上限! ' 

rollback transaction 

end

例子:

 

 

 

是否能刪除書籍:

create trigger t_deletebook

on book1 for delete 

as 

declare @bna varchar(20), 

@bno varchar(20)

select @bna=bna from deleted

select @bno

from book1,book2

where book1.bna=book2.bna and book1.bna=@bna and book2.byn='已借';

if @bno is null 

begin 

print ' 還有未歸還的書籍! ' 

rollback transaction 

end

例子:

insert into lend(sno,bna,bno,lbo)

values('000001','Java程序設計2','000006','2006-12-16 23:32:48');

delete from book1 where bna='Java程序設計2';

 

 

 

 

 

 

 

 

 

 

 

 

存儲過程:

借書:

create procedure p1

@sno varchar(20), 

@bna varchar(20), 

@bno varchar(20), 

@lbo datetime

as

begin

insert into 

lend(sno,bna,bno,lbo) 

values(@sno,@bna,@bno,@lbo) 

End

例子:

 

 

 

 

還書:

create procedure p2

@sno varchar(20), 

@bno varchar(20), 

@lre datetime

as

begin

update lend set lre=@lre where sno=@sno and bno=@bno

End

例子:

 

 

 

查詢書:

create procedure p3

@bna varchar(50) 

as

begin

select *

from book1

where bna=@bna

End

例子:

 

 

 

查詢學生正在借閱書籍的信息:

create procedure p4

@sno varchar(50)

as

begin

select sno 借閱編號,lend.bna 書名,lbo 借閱時間,book2.byn 歸還狀態

from lend,book2

where sno=@sno and book2.byn='已借' and lend.bno=book2.bno

End

例子:

 

 

 

 

 

 

 

6、 前台系統連接數據庫代碼

1.學生的增刪:

package 圖書管理系統;

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.sql.*;

 

public class UserAdd

    extends JFrame

    implements ActionListener {

  DataBaseManager db = new DataBaseManager();

  ResultSet rs;

  Container c;

  JPanel panel1, panel2;

  JLabel user_ID_Label,userLabel, passwordLabel, passwordConfirmLabel, loginPrivelegeLabel;

  JTextField user_ID_TextField,userTextField;

  JPasswordField passwordTextField, passwordConfirmTextField;

  JComboBox loginPrivelegeComboBox;

  JButton addBtn, cancelBtn;

  public UserAdd() {

    super("添加用戶");

    c = getContentPane();

    c.setLayout(new BorderLayout());

    user_ID_Label = new JLabel("用戶ID", JLabel.CENTER);

    userLabel = new JLabel("用戶名", JLabel.CENTER);

    passwordLabel = new JLabel("密碼", JLabel.CENTER);

    passwordConfirmLabel = new JLabel("確認密碼", JLabel.CENTER);

    loginPrivelegeLabel = new JLabel("登錄權限", JLabel.CENTER);

    user_ID_TextField = new JTextField(25);

    userTextField = new JTextField(25);

    passwordTextField = new JPasswordField(25);

    passwordConfirmTextField = new JPasswordField(25);

    loginPrivelegeComboBox = new JComboBox();

    loginPrivelegeComboBox.addItem("系統管理員");

    loginPrivelegeComboBox.addItem("書籍管理員");

    loginPrivelegeComboBox.addItem("學生");

    addBtn = new JButton("添加");

    cancelBtn = new JButton("取消");

    addBtn.addActionListener(this);

    cancelBtn.addActionListener(this);

    panel1 = new JPanel();

    panel1.setLayout(new GridLayout(5, 2));

    panel1.add(user_ID_Label);

    panel1.add(user_ID_TextField);

    panel1.add(userLabel);

    panel1.add(userTextField);

    panel1.add(passwordLabel);

    panel1.add(passwordTextField);

    panel1.add(passwordConfirmLabel);

    panel1.add(passwordConfirmTextField);

    panel1.add(loginPrivelegeLabel);

    panel1.add(loginPrivelegeComboBox);

    c.add(panel1, BorderLayout.CENTER);

    panel2 = new JPanel();

    panel2.add(addBtn);

    panel2.add(cancelBtn);

    c.add(panel2, BorderLayout.SOUTH);

    setSize(300, 300);

 

  }

 

  public void actionPerformed(ActionEvent e) {

    if (e.getSource() == cancelBtn) {

      db.closeConnection();

      this.dispose();

    }

    else if (e.getSource() == addBtn) {

      try {

        String strSQL = "select * from userTable where userName='" +

            userTextField.getText().trim() + "'";

        if (userTextField.getText().trim().equals("")) {

          JOptionPane.showMessageDialog(null, "用戶名不能為空!");

        }

        else if (new String(passwordTextField.getPassword()).trim().equals("")) {

          JOptionPane.showMessageDialog(null, "密碼不能為空!");

        }

        else if (!new String(passwordTextField.getPassword()).trim().equals(

            new String(passwordConfirmTextField.getPassword()).trim())) {

          JOptionPane.showMessageDialog(null, "兩次輸入的密碼不一致!");

        }

        else {

          if (db.getResult(strSQL).first()) {

            JOptionPane.showMessageDialog(null, "此用戶已經存在,請重新輸入用戶名!");

          }

          else {

            strSQL = "insert into userTable values('" +

             user_ID_TextField.getText().trim() + "','" +

                userTextField.getText().trim() + "','" +

                new String(passwordTextField.getPassword()).

                trim() + "','" + loginPrivelegeComboBox.getSelectedItem() +

                "')";

              this.dispose();

              rs = db.getResult(strSQL);

              JOptionPane.showMessageDialog(null, "添加用戶成功!");

          }

        }

      }

      catch (SQLException sqle) {

        System.out.println(sqle.toString());

      }

      catch (Exception ex) {

        System.out.println(ex.toString());

      }

    }

  }

}

 

 

 

 

package 圖書管理系統;

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.sql.*;

 

public class UserDelete

    extends JFrame

    implements ActionListener {

  DataBaseManager db = new DataBaseManager();

  ResultSet rs;

  JPanel panel1, panel2;

  Container c;

  JLabel userLabel, passwordLabel;

  JTextField userTextField;

  JPasswordField passwordTextField;

  JButton yesBtn, cancelBtn;

  public UserDelete() {

    super("刪除用戶");

    c = getContentPane();

    c.setLayout(new BorderLayout());

    userLabel = new JLabel("用戶名", JLabel.CENTER);

    passwordLabel = new JLabel("密碼", JLabel.CENTER);

    userTextField = new JTextField(25);

    passwordTextField = new JPasswordField(25);

    yesBtn = new JButton("確定");

    cancelBtn = new JButton("取消");

    yesBtn.addActionListener(this);

    cancelBtn.addActionListener(this);

    panel1 = new JPanel();

    panel1.setLayout(new GridLayout(2, 2));

    panel1.add(userLabel);

    panel1.add(userTextField);

    panel1.add(passwordLabel);

    panel1.add(passwordTextField);

    panel2 = new JPanel();

    panel2.add(yesBtn);

    panel2.add(cancelBtn);

    c.add(panel1, BorderLayout.CENTER);

    c.add(panel2, BorderLayout.SOUTH);

    setSize(300, 300);

  }

 

  public void actionPerformed(ActionEvent e) {

    try {

      if (e.getSource() == cancelBtn) {

        db.closeConnection();

        this.dispose();

      }

      else if (e.getSource() == yesBtn) {

        char[] password = passwordTextField.getPassword();

        String passwordSTR = new String(password);

        String strSQL = "select * from userTable where userName='" +

            userTextField.getText().trim() + "' and password='" +

            passwordSTR + "'";

        if (userTextField.getText().trim().equals("")) {

          JOptionPane.showMessageDialog(null, "用戶名不能為空!");

        }

        else if (passwordTextField.equals("")) {

          JOptionPane.showMessageDialog(null, "密碼不能為空!");

        }

        else if (db.getResult(strSQL).first()) {

          strSQL = "delete userTable where username='" +

              userTextField.getText().trim() + "'";

            db.getResult(strSQL);

            JOptionPane.showMessageDialog(null, "刪除成功!");

            this.dispose();

 

          db.closeConnection();

        }

        else {

          JOptionPane.showMessageDialog(null, "不存在此用戶或者密碼錯誤!");

        }

      }

    }

    catch (SQLException sqle) {

      System.out.println(sqle.toString());

    }

    catch (Exception ex) {

      System.out.println(ex.toString());

    }

  }

}

 

2.借書還書:

package 圖書管理系統;

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.sql.*;

import javax.swing.table.*;

import java.util.Vector;

 

public class BorrowBookList

    extends JFrame

    implements ActionListener {

  /**

 *

 */

private static final long serialVersionUID = 1L;

  DataBaseManager db = new DataBaseManager();

  ResultSet rs;

  Container c;

  JPanel panel1, panel2;

  JLabel bookNameLabel, studentNameLabel;

  JTextField bookNameTextField, studentNameTextField;

  JButton searchBtn, exitBtn;

  JTable table = null;

  DefaultTableModel defaultModel = null;

  public BorrowBookList() {

    super("借閱信息查詢!");

    c = getContentPane();

    c.setLayout(new BorderLayout());

    bookNameLabel = new JLabel("書名   ", JLabel.CENTER);

    studentNameLabel = new JLabel("借閱者", JLabel.CENTER);

    bookNameTextField = new JTextField(15);

    studentNameTextField = new JTextField(15);

    searchBtn = new JButton("查詢");

    exitBtn = new JButton("退出");

    searchBtn.addActionListener(this);

    exitBtn.addActionListener(this);

    Box box1 = Box.createHorizontalBox();

    box1.add(studentNameLabel);

    box1.add(studentNameTextField);

    box1.add(searchBtn);

    Box box2 = Box.createHorizontalBox();

    box2.add(bookNameLabel);

    box2.add(bookNameTextField);

    box2.add(exitBtn);

    Box boxH = Box.createVerticalBox();

    boxH.add(box1);

    boxH.add(box2);

    boxH.add(Box.createVerticalGlue());

    panel1 = new JPanel();

    panel1.add(boxH);

    panel2 = new JPanel();

    String[] name = {

        "借閱者ID", "借閱者","書籍ID", "書名", "借閱日期", "還入日期", "備注"};

    String[][] data = new String[0][0];

    defaultModel = new DefaultTableModel(data, name);

    table = new JTable(defaultModel);

    table.setPreferredScrollableViewportSize(new Dimension(600, 120));

    JScrollPane s = new JScrollPane(table);

    panel2.add(s);

    c.add(panel1, BorderLayout.NORTH);

    c.add(panel2, BorderLayout.SOUTH);

  }

 

  public void actionPerformed(ActionEvent e) {

    if (e.getSource() == exitBtn) {

      db.closeConnection();

      this.dispose();

    }

    else if (e.getSource() == searchBtn) {

//      String strSQL =

//          "select studentname,bookname,borrowdate,returndate,com from bookbrowse";

      String strSQL =

      "select ID,Username,BookID,BookName,borrowdate,returndate,com from Student_Borrow";

      String strSql = null;

      if (studentNameTextField.getText().trim().equals("") &&

          bookNameTextField.getText().trim().equals("")) {

        strSql = strSQL;

      }

      else if (studentNameTextField.getText().trim().equals("")) {

        strSql = strSQL + " where BookName='" +

            bookNameTextField.getText().trim() + "'";

      }

      else if (bookNameTextField.getText().trim().equals("")) {

        strSql = strSQL + " where Username='" +

            studentNameTextField.getText().trim() + "'";

      }

      else {

        strSql = strSQL + " where Username='" +

            studentNameTextField.getText().trim() + "'and bookName='" +

            bookNameTextField.getText().trim() + "'";

      }

      try {

        //首先要刪除table中的數據:

        int rowCount = defaultModel.getRowCount() - 1; //取得table中的數據行;

        int j = rowCount;

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

          defaultModel.removeRow(j); //刪除rowCount行的數據;

          defaultModel.setRowCount(j); //重新設置行數;

          j = j - 1;

        }

        rs = db.getResult(strSql);

        while (rs.next()) {

          Vector data = new Vector();

          data.addElement(rs.getString(1));

          data.addElement(rs.getString(2));

          data.addElement(rs.getString(3));

          data.addElement(rs.getString(4));

          data.addElement(rs.getString(5));

          data.addElement(rs.getString(6));

          data.addElement(rs.getString(7));

          defaultModel.addRow(data);

        }

        table.revalidate();

      }

      catch (SQLException sqle) {

        System.out.println(sqle.toString());

      }

      catch (Exception ex) {

        System.out.println(ex.toString());

      }

    }

  }

}

 

 

 

 

 

 

 

 

package 圖書管理系統;

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.sql.*;

 

public class ReturnBook

    extends JFrame

    implements ActionListener {

  DataBaseManager db = new DataBaseManager();

  ResultSet rs;

  JPanel panel1, panel2;

  Container c;

  JLabel returnedBookStudentLabel, returnedBookNameLabel,

      returnedDateLabel, returnedCommentLabel;

  JTextField returnedBookStudentTextField,

      returnedDateTextField, returnedCommentTextField;

  JButton clearBtn, yesBtn, cancelBtn;

  JComboBox bookNameComboBox = new JComboBox();

  public ReturnBook() {

    super("書籍還入");

    c = getContentPane();

    c.setLayout(new BorderLayout());

    returnedBookStudentLabel = new JLabel("還書者姓名", JLabel.CENTER);

    returnedBookNameLabel = new JLabel("書名", JLabel.CENTER);

    returnedDateLabel = new JLabel("日期", JLabel.CENTER);

    returnedCommentLabel = new JLabel("備注", JLabel.CENTER);

    returnedBookStudentTextField = new JTextField(15);

    returnedDateTextField = new JTextField(15);

    returnedCommentTextField = new JTextField(15);

    try {

      String s = "";

      String strSQL = "select bookName from bookBrowse where is_returned=''";

      rs = db.getResult(strSQL);

      while (rs.next()) {

        bookNameComboBox.addItem(rs.getString(1));

      }

    }

    catch (SQLException sqle) {

      System.out.println(sqle.toString());

    }

    catch (Exception ex) {

      System.out.println(ex.toString());

    }

    panel1 = new JPanel();

    panel1.setLayout(new GridLayout(4, 2));

    panel1.add(returnedBookStudentLabel);

    panel1.add(returnedBookStudentTextField);

    panel1.add(returnedBookNameLabel);

    panel1.add(bookNameComboBox);

    panel1.add(returnedDateLabel);

    panel1.add(returnedDateTextField);

    panel1.add(returnedCommentLabel);

    panel1.add(returnedCommentTextField);

    c.add(panel1, BorderLayout.CENTER);

    panel2 = new JPanel();

    panel2.setLayout(new GridLayout(1, 3));

    clearBtn = new JButton("清空");

    yesBtn = new JButton("確定");

    cancelBtn = new JButton("取消");

    clearBtn.addActionListener(this);

    yesBtn.addActionListener(this);

    cancelBtn.addActionListener(this);

    panel2.add(clearBtn);

    panel2.add(yesBtn);

    panel2.add(cancelBtn);

    c.add(panel2, BorderLayout.SOUTH);

  }

 

  public void actionPerformed(ActionEvent e) {

    if (e.getSource() == cancelBtn) {

      this.dispose();

    }

    else if (e.getSource() == clearBtn) {

      returnedBookStudentTextField.setText("");

      returnedDateTextField.setText("");

      returnedCommentTextField.setText("");

 

    }

    else if (e.getSource() == yesBtn) {

      if (returnedBookStudentTextField.getText().trim().equals("")) {

        JOptionPane.showMessageDialog(null, "請輸入還書者的姓名。。。");

      }

      else if (bookNameComboBox.getSelectedItem().equals("")) {

        JOptionPane.showMessageDialog(null, "圖書館沒有出借過書!");

      }

      else {

        try {

          String strSQL = "update bookBrowse set returnDate='" +

              returnedDateTextField.getText().trim() + "',com='" +

              returnedCommentTextField.getText().trim() +

              "',is_returned='' where studentName='" +

              returnedBookStudentTextField.getText().trim() + "'and bookName='" +

              bookNameComboBox.getSelectedItem() + "'";

            rs = db.getResult(strSQL);

            JOptionPane.showMessageDialog(null, "還書完成!");

            strSQL =

                "update books set borrowed_count=borrowed_count-1 where bookname='" +

                bookNameComboBox.getSelectedItem() + "'";

            db.getResult(strSQL);

            db.closeConnection();

            this.dispose();

          }

        catch (Exception ex) {

          System.out.println(ex.toString());

        }

      }

    }

  }

}

 

 

 

3.主界面設計代碼:

package 圖書借閱管理系統;

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

 

public class MainFrame

    extends JFrame

    implements ActionListener {

private static final long serialVersionUID = 1L;

  JPanel panel1;

  Container c;

  JMenuBar menuB;

  JMenu systemMenu, bookMGRMenu, borrowBookMenu, returnBookMenu,

      infoBrowseMenu, userMGRMenu,aboutMenu;

  JMenuItem adminLoginMenuItem, userLoginMenuItem, userAddMenuItem, userModifyMenuItem,

      userDeleteMenuItem, exitMenuItem, bookAddMenuItem, bookModifyMenuItem,

      bookDeleteMenuItem,

      borrowBookMenuItem, borrowInfoMenuItem, returnBookMenuItem,

      returnInfoMenuItem,

      bookListMenuItem, borrowBookListMenuItem, userListMenuItem,

      aboutMenuItem;

  public MainFrame() {

    super("圖書館管理系統");

    //--系統管理菜單--

    menuB = new JMenuBar();

    systemMenu = new JMenu("系統管理");

    userMGRMenu = new JMenu("用戶管理");

    adminLoginMenuItem = new JMenuItem("管理員登錄");

    userLoginMenuItem = new JMenuItem("用戶登錄");

    userAddMenuItem = new JMenuItem("添加用戶");

    userModifyMenuItem = new JMenuItem("修改密碼");

    userDeleteMenuItem = new JMenuItem("刪除用戶");

    exitMenuItem = new JMenuItem("退出");

    systemMenu.add(adminLoginMenuItem);

    systemMenu.add(userLoginMenuItem);

    userMGRMenu.add(userAddMenuItem);

    userMGRMenu.add(userModifyMenuItem);

    userMGRMenu.add(userDeleteMenuItem);

    systemMenu.add(userMGRMenu);

    systemMenu.add(exitMenuItem);

    adminLoginMenuItem.addActionListener(this);

    userLoginMenuItem.addActionListener(this);

    userAddMenuItem.addActionListener(this);

    userModifyMenuItem.addActionListener(this);

    userDeleteMenuItem.addActionListener(this);

    exitMenuItem.addActionListener(this);

    menuB.add(systemMenu);

    //---書籍管理菜單--

    bookMGRMenu = new JMenu("書籍管理");

    bookAddMenuItem = new JMenuItem("添加書籍");

    bookModifyMenuItem = new JMenuItem("修改書籍");

    bookDeleteMenuItem = new JMenuItem("刪除書籍");

    bookMGRMenu.add(bookAddMenuItem);

    bookMGRMenu.add(bookModifyMenuItem);

    bookMGRMenu.add(bookDeleteMenuItem);

    bookAddMenuItem.addActionListener(this);

    bookModifyMenuItem.addActionListener(this);

    bookDeleteMenuItem.addActionListener(this);

    menuB.add(bookMGRMenu);

    //--借書管理菜單--

    borrowBookMenu = new JMenu("借書管理");

    borrowBookMenuItem = new JMenuItem("書籍出借");

    borrowInfoMenuItem = new JMenuItem("出借信息修改");

    borrowBookMenu.add(borrowBookMenuItem);

    borrowBookMenu.add(borrowInfoMenuItem);

    borrowBookMenuItem.addActionListener(this);

    borrowInfoMenuItem.addActionListener(this);

    menuB.add(borrowBookMenu);

    //--還書管理菜單--

    returnBookMenu = new JMenu("還書管理");

    returnBookMenuItem = new JMenuItem("書籍還入");

    returnInfoMenuItem = new JMenuItem("書籍還入信息修改");

    returnBookMenu.add(returnBookMenuItem);

    returnBookMenu.add(returnInfoMenuItem);

    returnBookMenuItem.addActionListener(this);

    returnInfoMenuItem.addActionListener(this);

    menuB.add(returnBookMenu);

    //--信息一覽菜單--

    infoBrowseMenu = new JMenu("信息查詢");

    bookListMenuItem = new JMenuItem("書籍信息查詢");

    borrowBookListMenuItem = new JMenuItem("借閱信息查詢");

    userListMenuItem = new JMenuItem("用戶列表");

    infoBrowseMenu.add(bookListMenuItem);

    infoBrowseMenu.add(borrowBookListMenuItem);

    infoBrowseMenu.add(userListMenuItem);

    bookListMenuItem.addActionListener(this);

    borrowBookListMenuItem.addActionListener(this);

    userListMenuItem.addActionListener(this);

    menuB.add(infoBrowseMenu);

    //--關於菜單--

    aboutMenu=new JMenu("幫助");

    aboutMenuItem = new JMenuItem("關於");

    aboutMenuItem.addActionListener(this);

    aboutMenu.add(aboutMenuItem);

    menuB.add(aboutMenu);

    //----------------------------------

    setJMenuBar(menuB);

 

    c = getContentPane();

    c.setLayout(new BorderLayout());

    panel1 = new JPanel();

    panel1.setLayout(new BorderLayout());

 

    c.add(panel1, BorderLayout.CENTER);

 

    //--設置初始功能:--

    userMGRMenu.setEnabled(false);

    bookMGRMenu.setEnabled(false);

    borrowBookMenu.setEnabled(false);

    returnBookMenu.setEnabled(false);

    infoBrowseMenu.setEnabled(false);

    aboutMenu.setEnabled(false);

  }

 

  //--設置每個菜單點擊后出現的窗口和窗口顯示的位置--

  public void actionPerformed(ActionEvent e) {

  if (e.getActionCommand() == "管理員登錄") {

      

  AdminLogin AdminLoginFrame = new AdminLogin(this);//創建用例類實例對象

      Dimension FrameSize = AdminLoginFrame.getPreferredSize();//子窗口大小

      Dimension MainFrameSize = getSize();//主窗口大小

      Point loc = getLocation();//主窗口位置

      AdminLoginFrame.setLocation( (MainFrameSize.width - FrameSize.width) / 2 +

                                 loc.x,

                                 (MainFrameSize.height - FrameSize.height) / 2 +

                                 loc.y);//設置子窗口的位置位於主窗口的中央

      AdminLoginFrame.pack();

      AdminLoginFrame.show();

    }

  

    if (e.getActionCommand() == "用戶登錄") {

      

      UserLogin UserLoginFrame = new UserLogin(this);//創建用例類實例對象

      Dimension FrameSize = UserLoginFrame.getPreferredSize();//子窗口大小

      Dimension MainFrameSize = getSize();//主窗口大小

      Point loc = getLocation();//主窗口位置

      UserLoginFrame.setLocation( (MainFrameSize.width - FrameSize.width) / 2 +

                                 loc.x,

                                 (MainFrameSize.height - FrameSize.height) / 2 +

                                 loc.y);//設置子窗口的位置位於主窗口的中央

      UserLoginFrame.pack();

      UserLoginFrame.show();

    }

    else if (e.getActionCommand() == "添加用戶") {

      UserAdd UserAddFrame = new UserAdd();

      Dimension FrameSize = UserAddFrame.getPreferredSize();

      Dimension MainFrameSize = getSize();

      Point loc = getLocation();

      UserAddFrame.setLocation( (MainFrameSize.width - FrameSize.width) / 2 +

                               loc.x,

                               (MainFrameSize.height - FrameSize.height) / 2 +

                               loc.y);

      UserAddFrame.pack();

      UserAddFrame.show();

    }

    else if (e.getActionCommand() == "修改密碼") {

      UserModify UserModifyFrame = new UserModify();

      Dimension FrameSize = UserModifyFrame.getPreferredSize();

      Dimension MainFrameSize = getSize();

      Point loc = getLocation();

      UserModifyFrame.setLocation( (MainFrameSize.width - FrameSize.width) / 2 +

                                  loc.x,

                                  (MainFrameSize.height - FrameSize.height) / 2 +

                                  loc.y);

      UserModifyFrame.pack();

      UserModifyFrame.show();

    }

    else if (e.getActionCommand() == "刪除用戶") {

      UserDelete UserDeleteFrame = new UserDelete();

      Dimension FrameSize = UserDeleteFrame.getPreferredSize();

      Dimension MainFrameSize = getSize();

      Point loc = getLocation();

      UserDeleteFrame.setLocation( (MainFrameSize.width - FrameSize.width) / 2 +

                                  loc.x,

                                  (MainFrameSize.height - FrameSize.height) / 2 +

                                  loc.y);

      UserDeleteFrame.pack();

      UserDeleteFrame.show();

    }

    else if (e.getActionCommand() == "添加書籍") {

      BookAdd BookAddFrame = new BookAdd();

      Dimension FrameSize = BookAddFrame.getPreferredSize();

      Dimension MainFrameSize = getSize();

      Point loc = getLocation();

      BookAddFrame.setLocation( (MainFrameSize.width - FrameSize.width) / 2 +

                               loc.x,

                               (MainFrameSize.height - FrameSize.height) / 2 +

                               loc.y);

      BookAddFrame.pack();

      BookAddFrame.show();

    }

    else if (e.getActionCommand() == "修改書籍") {

      BookModify BookModifyFrame = new BookModify();

      Dimension FrameSize = BookModifyFrame.getPreferredSize();

      Dimension MainFrameSize = getSize();

      Point loc = getLocation();

      BookModifyFrame.setLocation( (MainFrameSize.width - FrameSize.width) / 2 +

                                  loc.x,

                                  (MainFrameSize.height - FrameSize.height) / 2 +

                                  loc.y);

      BookModifyFrame.pack();

      BookModifyFrame.show();

    }

    else if (e.getActionCommand() == "刪除書籍") {

      BookDelete BookDeleteFrame = new BookDelete();

      Dimension FrameSize = BookDeleteFrame.getPreferredSize();

      Dimension MainFrameSize = getSize();

      Point loc = getLocation();

      BookDeleteFrame.setLocation( (MainFrameSize.width - FrameSize.width) / 2 +

                                  loc.x,

                                  (MainFrameSize.height - FrameSize.height) / 2 +

                                  loc.y);

      BookDeleteFrame.pack();

      BookDeleteFrame.show();

    }

    else if (e.getActionCommand() == "書籍出借") {

      BorrowBook BorrowBookFrame = new BorrowBook();

      Dimension FrameSize = BorrowBookFrame.getPreferredSize();

      Dimension MainFrameSize = getSize();

      Point loc = getLocation();

      BorrowBookFrame.setLocation( (MainFrameSize.width - FrameSize.width) / 2 +

                                  loc.x,

                                  (MainFrameSize.height - FrameSize.height) / 2 +

                                  loc.y);

      BorrowBookFrame.pack();

      BorrowBookFrame.show();

    }

    else if (e.getActionCommand() == "出借信息修改") {

      BorrowInfo BorrowInfoFrame = new BorrowInfo();

      Dimension FrameSize = BorrowInfoFrame.getPreferredSize();

      Dimension MainFrameSize = getSize();

      Point loc = getLocation();

      BorrowInfoFrame.setLocation( (MainFrameSize.width - FrameSize.width) / 2 +

                                  loc.x,

                                  (MainFrameSize.height - FrameSize.height) / 2 +

                                  loc.y);

      BorrowInfoFrame.pack();

      BorrowInfoFrame.show();

    }

    else if (e.getActionCommand() == "書籍還入") {

      ReturnBook ReturnBookFrame = new ReturnBook();

      Dimension FrameSize = ReturnBookFrame.getPreferredSize();

      Dimension MainFrameSize = getSize();

      Point loc = getLocation();

      ReturnBookFrame.setLocation( (MainFrameSize.width - FrameSize.width) / 2 +

                                  loc.x,

                                  (MainFrameSize.height - FrameSize.height) / 2 +

                                  loc.y);

      ReturnBookFrame.pack();

      ReturnBookFrame.show();

    }

    else if (e.getActionCommand() == "書籍還入信息修改") {

      ReturnInfo ReturnInfoFrame = new ReturnInfo();

      Dimension FrameSize = ReturnInfoFrame.getPreferredSize();

      Dimension MainFrameSize = getSize();

      Point loc = getLocation();

      ReturnInfoFrame.setLocation( (MainFrameSize.width - FrameSize.width) / 2 +

                                  loc.x,

                                  (MainFrameSize.height - FrameSize.height) / 2 +

                                  loc.y);

      ReturnInfoFrame.pack();

      ReturnInfoFrame.show();

    }

    else if (e.getActionCommand() == "書籍信息查詢") {

      BookList BookListFrame = new BookList();

      Dimension FrameSize = BookListFrame.getPreferredSize();

      Dimension MainFrameSize = getSize();

      Point loc = getLocation();

      BookListFrame.setLocation( (MainFrameSize.width - FrameSize.width) / 2 +

                                loc.x,

                                (MainFrameSize.height - FrameSize.height) / 2 +

                                loc.y);

      BookListFrame.pack();

      BookListFrame.show();

    }

    else if (e.getActionCommand() == "借閱信息查詢") {

      BorrowBookList BorrowBookListFrame = new BorrowBookList();

      Dimension FrameSize = BorrowBookListFrame.getPreferredSize();

      Dimension MainFrameSize = getSize();

      Point loc = getLocation();

      BorrowBookListFrame.setLocation( (MainFrameSize.width - FrameSize.width) /

                                      2 + loc.x,

                                      (MainFrameSize.height - FrameSize.height) /

                                      2 + loc.y);

      BorrowBookListFrame.pack();

      BorrowBookListFrame.show();

    }

    else if (e.getActionCommand() == "用戶列表") {

      UserList UserListFrame = new UserList();

      Dimension FrameSize = UserListFrame.getPreferredSize();

      Dimension MainFrameSize = getSize();

      Point loc = getLocation();

      UserListFrame.setLocation( (MainFrameSize.width - FrameSize.width) / 2 +

                                loc.x,

                                (MainFrameSize.height - FrameSize.height) / 2 +

                                loc.y);

      UserListFrame.pack();

      UserListFrame.show();

    }

    else if (e.getActionCommand() == "退出") {

      this.dispose();

      System.exit(0);

    }

  }

 

  //--設置登錄用戶的權限--

  public void setEnable(String powerType) {

    if (powerType.trim().equals("系統管理員")) {

      userMGRMenu.setEnabled(true);

      bookMGRMenu.setEnabled(true);

      borrowBookMenu.setEnabled(true);

      returnBookMenu.setEnabled(true);

      infoBrowseMenu.setEnabled(true);

      userListMenuItem.setEnabled(true);

      aboutMenu.setEnabled(true);

    }

    else if (powerType.trim().equals("書籍管理員")) {

      userMGRMenu.setEnabled(false);

      bookMGRMenu.setEnabled(true);

      borrowBookMenu.setEnabled(false);

      returnBookMenu.setEnabled(false);

      infoBrowseMenu.setEnabled(true);

      userListMenuItem.setEnabled(false);

      aboutMenu.setEnabled(true);

    }

    else if (powerType.trim().equals("學生")) {

      userMGRMenu.setEnabled(false);

      bookMGRMenu.setEnabled(false);

      borrowBookMenu.setEnabled(true);

      returnBookMenu.setEnabled(true);

      infoBrowseMenu.setEnabled(true);

      userListMenuItem.setEnabled(false);

      aboutMenu.setEnabled(true);

    }

    else if (powerType.trim().equals("else")) {

      userMGRMenu.setEnabled(false);

      bookMGRMenu.setEnabled(false);

      borrowBookMenu.setEnabled(false);

      returnBookMenu.setEnabled(false);

      infoBrowseMenu.setEnabled(false);

      aboutMenu.setEnabled(false);

    }

  }

 

  public static void main(String args[]) {

    try {

      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

    }

    catch (Exception e) {

      e.printStackTrace();

    }

 

    MainFrame mainFrame = new MainFrame();

    mainFrame.setSize(500,400);

    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();

    mainFrame.setLocation( (d.width - mainFrame.getSize().width) / 2,

                      (d.height - mainFrame.getSize().height) / 2);

    mainFrame.show();

  }

}

 

 

  1. 登錄

package 圖書管理系統;

 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.sql.*;

 

public class AdminLogin

    extends JFrame

    implements ActionListener {

  MainFrame mainFrame;

  JPanel panel1, panel2;

  JLabel userLabel, passwordLabel;

  JTextField userTextField;

  JPasswordField passwordTextField;

  JButton yesBtn, cancelBtn;

  Container c;

  ResultSet rs;

  static String  username,passwordSTR;

  static Statement stmt;

  public AdminLogin(MainFrame mainFrame) {

    super("管理員登錄");

    this.mainFrame = mainFrame;

    userLabel = new JLabel("用戶名", JLabel.CENTER);

    passwordLabel = new JLabel("密碼", JLabel.CENTER);

    userTextField = new JTextField(20);

    passwordTextField = new JPasswordField(20);

    yesBtn = new JButton("確定");

    cancelBtn = new JButton("取消");

    yesBtn.addActionListener(this);

    cancelBtn.addActionListener(this);

    panel1 = new JPanel();

    panel1.setLayout(new GridLayout(2, 2));

    panel2 = new JPanel();

    c = getContentPane();

    c.setLayout(new BorderLayout());

    panel1.add(userLabel);

    panel1.add(userTextField);

    panel1.add(passwordLabel);

    panel1.add(passwordTextField);

    c.add(panel1, BorderLayout.CENTER);

    panel2.add(yesBtn);

    panel2.add(cancelBtn);

    c.add(panel2, BorderLayout.SOUTH);

    setSize(400, 400);

  }

 

  public void actionPerformed(ActionEvent e) {

    if (e.getSource() == cancelBtn) {

      mainFrame.setEnable("else");

      this.dispose();

    }

    else {     

      DataBaseManager1();

      char[] password = passwordTextField.getPassword();

      username = userTextField.getText().trim();

      passwordSTR = new String(password);

      if (userTextField.getText().trim().equals("")) {

        JOptionPane.showMessageDialog(null, "用戶名不可為空!");

        return;

      }

      if (passwordSTR.equals("")) {

        JOptionPane.showMessageDialog(null, "密碼不可為空!");

        return;

      }

      JOptionPane.showMessageDialog(null, "登陸成功");     

      mainFrame.setEnable("系統管理員");  

      this.dispose();

    }

  }

  

  public  static void DataBaseManager1() {

    try {

      String url = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=圖書管理系統";

      Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");      

  Connection con=DriverManager.getConnection(url,username,passwordSTR);//連接數據庫對象

      stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,

                                 ResultSet.CONCUR_UPDATABLE);

    }

    catch (SQLException sqle) {

      System.out.println(sqle.toString());

    }

    catch (ClassNotFoundException cnfex) {

      cnfex.printStackTrace();

    }

  }

}

 

 

 

package 圖書管理系統;

 

import java.sql.*;

 

public class DataBaseManager {

  Connection con = null;

  ResultSet rs = null;

  Statement stmt;

  

  public DataBaseManager() {

    try {

      String url = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=圖書管理系統";

      Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

  String user="DH";

  String password="123456";

  Connection con=DriverManager.getConnection(url,user,password);//連接數據庫對象

      stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,

                                 ResultSet.CONCUR_UPDATABLE);

    }

    catch (SQLException sqle) {

      System.out.println(sqle.toString());

    }

    catch (ClassNotFoundException cnfex) {

      cnfex.printStackTrace();

    }

  }

 

 

  

  public ResultSet getResult(String strSQL) {

    try {

      rs = stmt.executeQuery(strSQL);

      return rs;

    }

    catch (SQLException sqle) {

      System.out.println(sqle.toString());

      return null;

    }

 

  }

 

  public int updateSql(String strSQL) {

    try {   

     int i = stmt.executeUpdate(strSQL);

      con.commit();   

      return i;

    }

    catch (SQLException sqle) {

      System.out.println(sqle.toString());

      return -1;

    }

  }

 

  public void closeConnection() {

    try {

      con.close();

    }

    catch (SQLException sqle) {

      System.out.println(sqle.toString());

    }

  }

 

}

 

 

 

 

五、 項目總結

這個項目作業是對這個學期所的進行的一個檢測,從項目的分析設計再到具體實現,我一步步完善漏缺,一步步改進代碼,這不僅僅對這個項目作業進行了查漏補缺,更加對我自己所掌握的不足進行了查漏補缺。項目作業的主要難點我認為主要有以下幾個方面:一個是觸發器考慮是否周全,比如對書籍的刪除,你得在這里加上一個觸發器以防還有學生未進行還書;一個是表的設計,這個不僅難,還很重要,稍微有點錯,就得重新設計,寫好的代碼也要全部重改,我就經歷了一兩次,每次都感覺自己考慮的很全面但是寫到后面就突然發現這里那里的有點問題,一改動便是大改;最后還有一個便是與Java連接,光是折騰這個連接變花了我很多時間,碰到了很多問題,比如:“java:驅動程序無法通過使用安全套接字層(SSL)加密與 SQL Server 建立安全連接:”,按照百度教程試了很多方法都沒用,有個文件始終說不存在,最后還是重裝Java jdk和eclipse才解決,另外便是對Javafx使用不熟練,導致界面設計不好,因為和別人設計的表不同所以雖然參照着別人的Java代碼來設計但是改動起來還是很困難。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM