南昌航空大學項目報告
二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();
}
}
- 登錄
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代碼來設計但是改動起來還是很困難。
