圖書管理系統(Java實現,十個數據表,含源碼、ER圖,超詳細報告解釋,2020.7.11更新)


圖書管理系統數據庫設計實驗報告

 

更新日志

2020.7.11 修改了表的結構,表之間增加了外鍵聯系,更加完整且符合第三范式。

數據庫設計實驗報告

1.概述

疫情期間,大家都只能夠在家里,不能去到學校,此時需要在圖書館借書,就是只能通過網絡來操作了。因此,網上圖書館就此誕生了,有了網上圖書館,學生通過網絡來訂閱圖書是一件非常輕松的事情,只要在網上申請了書籍的借閱,管理員則可以通過快遞把書籍寄給學生,並且學生在規定時間內再通過快遞把書籍送還給學校圖書館。

本系統是一個針對學校的網上圖書館借還系統,通過網絡,學生可以很輕松的查詢某些書籍是否可以借到,並且還可以通過網絡續借書籍。管理員可以通過該系統很容易的將書籍信息存儲到數據庫和查詢學生的借還情況,並且通知那些逾期的學生盡快歸還或者續借。超級管理員則對學生和管理員的信息進行修改,或者增加用戶。用戶必修用戶名和密碼相互匹配正確后才能登陸成功,然后在進行相應的操作。對於非法操作,該系統有識別作用。

2.需求分析

2.1需要實現的功能

  1. 登陸功能:登陸系統為身份驗證登陸。分為學生登陸,管理員登陸,超級管理員登陸。不具備注冊功能。

  2. 學生登陸后:顯示該用戶的基本信息。可以修改密碼,修改密保問題,查看書籍並且預約書籍,查看已經借到的書籍的情況,還書的情況。

  3. 管理員登陸后:顯示該用戶的基本信息。可以修改密碼,修改密保問題,查看書籍信息並且修改數據信息,添加書籍。查看學生的借還情況。

  4. 超級管理員登陸后:顯示該用戶的基本信息。可以修改密碼,修改密保問題,查看,修改管理員的信息,添加新的管理員。添加用戶學生,查看學生的情況。

  5. 修改密碼:通過匹配密保問題的答案進行修改密碼。

  6. 修改密保問題:通過匹配原密碼進行修改密保問題。

  7. 預約書籍:查看書籍的具體信息后,可以對該書籍進行預約,預約到期時間1天后,如果一天后還沒有借到該書籍,則自動取消預約。

  8. 查看借書情況:查看書籍的具體信息后,可以對該書籍進行續借,續借的有效時間是30天,只可以對同一書籍續借1次。

  9. 查看還書情況:查看書籍的具體信息后,可以對該書籍進行預約,預約和預約書籍功能一樣。

  10. 修改書籍信息:查看書籍的具體信息后,可以對該書籍的信息進行修改。

  11. 增加書籍:增加書籍。

  12. 查看學生借還情況:查看學生的借還詳細信息。

  13. 權限移交:只有超級管理員才有的功能。刪除該管理員,新增加一個超級管理員。

  14. 增加管理員:增加一個新的管理員。

  15. 查看管理員信息:查看信息后,可以進行信息修改

  16. 查看學生信息:只能查看學生的信息,而不能進行修改

2.2業務流程圖

2.2.1學生流程圖

未命名文件

2.2.2管理員流程圖

未命名文件 (1)

2.2.3超級管理員流程圖

未命名文件 (2)

2.3功能需求分析

系統主要結構功能如下:

未命名文件 (3)

3.數據字典

名字:書籍信息表

描述:數據庫中書籍信息表各字段的集合,包含編號,書名,作者,譯者,出版社,庫存,進貨時間

名字:學生信息表

描述:數據庫中學生信息表各字段的集合,包括學號,姓名,學院編號,性別,出生日期,身份證號碼,手機號碼

名字:學生賬號信息

描述:數據庫中學生賬號信息表各字段的集合,包括學號,密碼,密保問題,密保答案,剩余可以借次數

名字:學生預約

描述:數據庫中學生預約表各字段的集合,包括學號,書籍編號,預約時間,到期時間

名字:學生借書

描述:數據庫中學生借書表各字段的集合,包括學號,書籍編號,借書時間,到期時間

名字:學生還書

描述:數據庫中學生還書表各字段的集合,包括學號,書籍編號,還書時間

名字:管理員信息

描述:數據庫中管理員信息表各字段的集合,包括工號,名稱,性別,手機號碼,email,身份證號碼

名字:管理員賬號信息

描述:數據庫中管理員賬號信息表各字段的集合,包括工號,密碼,密保問題,密保答案

名字:超級管理員信息

描述:數據庫中超級管理員信息表各字段的集合,包括工號,姓名,性別,手機號碼,身份證號碼,email

名字:超級管理員賬號信息

描述:數據庫中超級管理員賬號信息信息表各字段的集合,包括工號,密碼,密保問題,密保答案

名字:用戶信息

描述:數據庫中賬戶信息以及賬戶類型,包括工號/學號,用戶類型。

數據庫關系圖

4.概念模型

經過上述系統功能分析和需求總結,設計如下面所示的數據項和數據結構。

書籍表:存放書籍記錄。包括編號,書名,作者,譯者,出版社,庫存,進貨時間,分類

學生信息:存放學生信息。包括學號,姓名,班級編號,性別,出生日期,身份證號碼,手機號碼

學生賬號信息:存放學生賬號信息。包括學號,密碼,密保問題,密保答案,剩余可以借的次數。

學生預約情況:學號,書籍編號,預約時間,預約到期時間

學生借書情況:學號,書籍編號,借書時間,借書到期時間

學生還書情況:學號,書籍編號,還書時間

管理員信息:存放管理員信息。包括工號,姓名,性別,手機號碼,身份證號碼,email。

管理員賬號信息:工號,密碼,密保問題,密保答案

超級管理員信息:工號,姓名,性別,手機號碼,身份證號碼,email

超級管理員賬號信息:工號,密碼,密保問題,密保答案

職工信息:工號/學號,職位

  1. R圖:

書籍實體:

學生信息實體:

未命名文件 (10)

學生賬號實體:

學生預約實體:

學生借書實體:

未命名文件 (11)

學生還書實體:

管理員信息實體:

管理員賬號實體:

超級管理員信息實體:

超級管理員賬號實體:

職工信息:

未命名文件 (2)

所有實體的聯系:

5.數據模型

將E-R圖轉換成的關系模式如下:

書籍信息(編號,書名,作者,譯者,出版社,庫存,進貨時間,分類)

學生信息(學號,姓名,校區編號,性別,出生日期,身份證號碼,手機號碼)

學生賬號信息(學號,密碼,密保問題,密保答案,剩余可以借次數)

學生預約(學號,書籍編號,預約時間,到期時間)

學生借書(學號,書籍編號,借書時間,到期時間)

學生還書(學號,書籍編號,還書時間)

管理員信息(工號,名稱,性別,手機號碼,email,身份證號碼)

管理員賬號信息(工號,密碼,密保問題,密保答案)

超級管理員信息(工號,姓名,性別,手機號碼,身份證號碼,email)

超級管理員賬號(工號,密碼,密保問題,密保答案)

職工信息(工號/學號,職位)

6.建表代碼與界面展示

6.1表創建:

(書籍表)

create table book ( Bno smallint primary key not null, Bname varchar(50) not null, Bauthor varchar(50) not null, Btranslator varchar(50), Bpublish varchar(50) not null, Bsort varchar(50) not null, BinTime date not null, Bstock smallint not null, Bacount int not null ) (學生信息表) create table studentimfornation ( Sno varchar(20) primary key not null, Sname varchar(20) not null, no smallint not null, Ssex nchar(1) not null, Sbirthday date , Sid varchar(20) not null, Sphone varchar(13), Sno foreign key references studentsacount(sno) ) (學生賬號表) create table studentaccount ( sno varchar(20) primary key not null, Spassword varchar(18) not null, Squestion varchar(50) , Sanswer varchar(20), Sstats smallint not null, ) (學生預定表) create table studentorder ( sno varchar(20) primary key not null, bno smallint not null, sorder date not null, soverdue date not null, Bno foreign key references book(Bno) Sno foreign key references studentacount(sno) ) (學生借書表) create table studentborrow ( sno varchar(20) primary key not null, Bno smallint not null, Sborrow date not null, soverdue date not null Bno foreign key references book(Bno) Sno foreign key references studentacount(sno) ) (學生還書表) create table studentreturn ( sno varchar(20) primary key not null, bno smallint not null, sreturn date not null, Bno foreign key references book(Bno) Sno foreign key references studentacount(sno) ) (管理員信息表) create table admitinformation ( ano varchar(20) primary key not null, Aname varchar(20) not null, Asex char(2) not null, Aphone varchar(13) not null, Aid varchar(20) not null, Aemail varchar(50) , sno foreign key references superadmitinformation(sno) ) (管理員賬號表) create table AdmitAccount ( ano varchar(20) primary key not null, Apassword varchar(18) not null, Aquestion varchar(20), Aanswer varchar(20) sno foreign key references studentacount(sno) ) (超級管理員信息表) create table superadmitinformation ( sano varchar(20) primary key not null, sname varchar(20) not null, ssex char(2) not null, sphone varchar(13) not null, sid varchar(20) not null, semail varchar(50) , sno foreign key references superadmitacount(sano) ) (超級管理員賬號表) create table superadmitAccount ( sano varchar(20) primary key not null, spassword varchar(18) not null, squestion varchar(20), sanswer varchar(20) no foreign key references superadmitacount(sano) no foreign key references admitacount(ano) no foreign key references studentacount(sno) ) (職工信息表) create table staff ( no varchar(20) primary key not null, Type varchar(20), ) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221

6.2界面顯示及服務端用到的查詢代碼:

(摘抄部分服務器端代碼,並且經過刪改挑選,只放出關鍵部分以及sql語句。不然文檔內容過多)

6.2.1登錄界面

登錄界面

(Login)

HandleClient

(對應login)

//獲取密碼 "select spassword from StudentAcount where sno='"+ num+"'" "select apassword from AdmitAcount where ano='"+num+"'" "select spassword from superadmitacount where sno='"+num+"'" HandleClient2 (對應admit,student,superadmit) //查詢學生、管理員、超級管理員信息,返回給客戶端 select sname,ssex,sstats " \+ "from studentinformation,studentacount " \+ "where (studentinformation.sno=studentacount.sno) and studentacount.sno='" \+num+"'" "select aname,asex " \+ "from admitinformation " \+ "where ano='" \+num+"'" "select sname,ssex " \+ "from superadmitinformation " \+ "where sno='" \+num+"'" 忘記密碼界面 (ForgetLoading) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

(ForgetPassword)

HandlePassword

HandleQuestion

//獲取密保問題,用於顯示 **if** (i == 1) { String num = fromClient.readUTF(); ResultSet res = stat .executeQuery("select squestion,sanswer from studentacount where sno='" \+ num + "'"); **if** (res.next()) { String question = res.getString(1); String answer = res.getString(2); **if** (question == **null** \|\| question.isEmpty()) { toClientData.writeUTF("未設置密保問題,不需要填寫答案"); toClientData.writeUTF(""); } **else** { toClientData.writeUTF(question); toClientData.writeUTF(answer); } } **else** { toClientData.writeUTF("未設置密保問題,直接修改密碼"); toClientData.writeUTF(**null**); } res.close(); } //更新密碼 **else** { **try** { String num = fromClient.readUTF(); String password = fromClient.readUTF(); PreparedStatement pre = con.conn .prepareStatement("update studentacount set spassword=?" \+ " where sno=?"); pre.setString(1, password); pre.setString(2, num); pre.executeUpdate(); toClientData.writeInt(0); pre.close(); // res.close(); } **catch** (IOException e) { // **TODO**: handle exception toClientData.writeInt(2); } **catch** (SQLException e) { // **TODO** Auto-generated catch block // e.printStackTrace(); toClientData.writeInt(2); } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93

6.2.2學生界面

查詢書籍

(Student,StudenOrder)

HandleOrder

String sql = "select \* from book where "; //熱門度 **if** (i == 1) { **if** (type.equals("書名")) { sql += "bname like '%" + key \+ "%' order by bacount desc"; } **else if** (type.equals("作者")) sql += "bauthor like '%" + key \+ "%' order by bacount desc"; **else if** (type.equals("類型")) sql += "bsort like '%" + key \+ "%' order by bacount desc"; **else if** (type.equals("譯者")) sql += "btranslator like '%" + key \+ "%' order by bacount desc"; **else if** (type.equals("出版社")) sql += "bpublish like '%" + key \+ "%' order by bacount desc"; **else if** (type.equals("編號")) sql += "bno like '%" + key + "%' order by bacount desc"; **else if** (type.equals("時間")) sql += "bintime like '%" + key + "%' order by bacount desc"; ResultSet res = stat.executeQuery(sql); ArrayList\<book\> list = **new** ArrayList\<book\>(); **while** (res.next()) { book book = **new** book(); book.setNo(res.getString(1)); book.setName(res.getString(2)); book.setAuthor(res.getString(3)); book.setPublis(res.getString(5)); book.setStock(res.getInt(8)); book.setTime(res.getDate(7)); book.setSort(res.getString(6)); book.setTranslator(res.getString(4)); book.setAcount(res.getInt(9)); list.add(book); } toClient.writeObject(list); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77

雙擊預約:HandleAppointment

預約情況

(StudentAppointment)

HandleAppointment

//查看預約情況 **else if** (i == 2) { ObjectOutputStream toClientOb = **new** ObjectOutputStream( socket.getOutputStream()); Statement stat = c.conn.createStatement(); String sql = "select sno,book.bno,sorder,bname,bauthor,bpublish,bsort,btranslator,soverdue " \+ "from studentorder,book where book.bno=studentorder.bno and sno='" \+ sno + "' " + "order by sorder desc"; ResultSet res = stat.executeQuery(sql); ArrayList\<book\> list = **new** ArrayList\<book\>(); **while** (res.next()) { book b = **new** book(); b.setNo(res.getString(2)); b.setTime(res.getDate(3)); b.setName(res.getString(4)); b.setAuthor(res.getString(5)); b.setPublis(res.getString(6)); b.setSort(res.getString(7)); b.setTranslator(res.getString(8)); b.setOrderTime(res.getString(9)); list.add(b); } toClientOb.writeObject(list); 取消預約 HandleCancle sql = "select \* from studentorder where sno='" + sno \+ "' and bno='" + bno + "' "; Statement stat = con.conn.createStatement(); ResultSet res = stat.executeQuery(sql); //已經取消預約了 **if** (!res.next()) { toClient.writeInt(2); } //取消預約 **else** { sql = "begin tran ss " \+ "delete from studentorder where sno= ? and bno= ? " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update book set bstock=bstock+1 where bno= ? end " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update studentacount set sstats=sstats+1 where sno= ? end commit tran " \+ "if \@\@error!=0 rollback tran ss"; PreparedStatement pre = con.conn.prepareStatement(sql); pre.setString(1, sno); pre.setString(2, bno); pre.setString(3, bno); pre.setString(4, sno); pre.executeUpdate(); toClient.writeInt(1); pre.close(); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102

借書情況

(StudentBorrow)

HandleBorrow

//查詢借書情況 **if** (i == 1) { String sql = "select book.bno,bname,bauthor,btranslator,bpublish,bsort,sborrow,soverdue " \+ "from studentborrow,book where studentborrow.bno=book.bno and sno='" \+ num + "' order by sborrow desc"; Statement stat = con.conn.createStatement(); ResultSet res = stat.executeQuery(sql); ArrayList\<book\> list = **new** ArrayList\<book\>(); **while** (res.next()) { book book = **new** book(); book.setNo(res.getString(1)); book.setName(res.getString(2)); book.setAuthor(res.getString(3)); book.setTranslator(res.getString(4)); book.setPublis(res.getString(5)); book.setSort(res.getString(6)); book.setTime(res.getDate(7)); book.setOrderTime(res.getString(8)); list.add(book); } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

還書情況

(StudentReturn)

HandleReturn

**if** (i == 1) { String bno = fromClient.readUTF(); String time = fromClient.readUTF(); Statement stat = c.conn.createStatement(); String sql = "select sno from studentorder where sno='" + sno \+ "' and bno='" + bno + "'"; ResultSet res = stat.executeQuery(sql); **if** (res.next()) { **int** te = 2;//已經預約 toClient.writeInt(te); } //更新預約 **else** { sql = "insert into studentorder(sno,bno,sorder) values(?,?,?) "; PreparedStatement pre = c.conn.prepareStatement(sql); pre.setString(1, sno); pre.setString(2, bno); pre.setString(3, time); pre.executeUpdate(); sql = "begin tran ss " \+ "update book set bstock=bstock-1 where bno=? " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update book set bacount=bacount+1 where bno=? end " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update studentacount set sstats=sstats-1 where sno=? end commit tran " \+ "if \@\@error!=0 rollback tran ss "; pre = c.conn.prepareStatement(sql); pre.setString(1, bno); pre.setString(2, bno); pre.setString(3, sno); pre.executeUpdate(); toClient.writeInt(1); pre.close(); } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

預約書籍

(BookInformation)

HandleAppointment

(對應studentappointment)

sql = "select sstats from studentacount where sno='" +sno+ "' ";//查詢剩余可借次數 sql = "select bstock from book where bno='" + bno + "'";//查詢書籍庫存 sql = "select sno from studentorder where sno='" + sno+ "' and bno='" + bno + "'";//查詢學生id sql="select \* from book where bno='"+bno+"'";//查詢書籍 sql = "select sno from studentborrow where sno='" + sno+ "' and bno='" + bno + "'";//查詢學生借書情況 sql = "insert into studentorder(sno,bno,sorder,soverdue) values(?,?,?,?)";//插入預約情況 sql = "begin tran ss " + "update book set bstock=bstock-1 where bno=? " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update book set bacount=bacount+1 where bno=? end " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update studentacount set sstats=sstats-1 where sno=? end commit tran " \+ "if \@\@error!=0 rollback tran ss ";//更新書本庫存信息、學生可借次數信息,書本被借次數。 String sql = "select sno,book.bno,sorder,bname,bauthor,bpublish,bsort,btranslator,soverdue "+ "from studentorder,book where book.bno=studentorder.bno and sno='"+ sno + "' " + "order by sorder desc";//查詢預約情況 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

取消預約

(BookInformation)

HandleCancel

(對應bookimformation)

//查詢預約信息 sql = "select \* from studentorder where sno='" + sno+ "' and bno='" + bno + "' "; //取消預約 sql = "begin tran ss " \+ "delete from studentorder where sno= ? and bno= ? " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update book set bstock=bstock+1 where bno= ? end " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update studentacount set sstats=sstats+1 where sno= ? end commit tran " \+ "if \@\@error!=0 rollback tran ss"; 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

6.2.3管理員界面

管理員端界面

(Admit)

HandleClient2

ResultSet res = stat .executeQuery("select aname,asex " \+ "from admitinformation " \+ "where ano='" \+num+"'"); HandleOrder **if** (i == 1) { **if** (type.equals("書名")) { sql += "bname like '%" + key \+ "%' order by bacount desc"; } **else if** (type.equals("作者")) sql += "bauthor like '%" + key \+ "%' order by bacount desc"; **else if** (type.equals("類型")) sql += "bsort like '%" + key \+ "%' order by bacount desc"; **else if** (type.equals("譯者")) sql += "btranslator like '%" + key \+ "%' order by bacount desc"; **else if** (type.equals("出版社")) sql += "bpublish like '%" + key \+ "%' order by bacount desc"; **else if** (type.equals("編號")) sql += "bno like '%" + key + "%' order by bacount desc"; **else if** (type.equals("時間")) sql += "bintime like '%" + key + "%' order by bacount desc"; ResultSet res = stat.executeQuery(sql); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

添加書籍、修改書籍、刪除書籍:

(ChangBookInformation)

HandleBook

//刪除書籍 **if** (i == 1) { String bno = fromClient.readUTF(); sql = "delete from book where bno=?"; PreparedStatement pre = con.conn.prepareStatement(sql); pre.setString(1, bno); pre.executeUpdate(); toClient.writeInt(1); pre.close(); } //更新書籍 **else if** (i == 2) { String bstock = "" + book.getStock(); sql = "begin tran ss update book set bname=? where bno=? " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update book set bauthor=? where bno=? end " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update book set btranslator=? where bno=? end " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update book set bsort=? where bno=? end " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update book set bpublish=? where bno=? end " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update book set bintime=? where bno=? end " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update book set bstock=? where bno=? end commit tran " \+ "if \@\@error!=0 rollback tran ss "; PreparedStatement pre = con.conn.prepareStatement(sql); pre.setString(1, bname); pre.setString(2, bno); pre.setString(3, bauthor); pre.setString(4, bno); pre.setString(5, btranslator); pre.setString(6, bno); pre.setString(7, bsort); pre.setString(8, bno); pre.setString(9, bpublish); pre.setString(10, bno); pre.setString(11, bintime); pre.setString(12, bno); pre.setString(13, bstock); pre.setString(14, bno); pre.executeUpdate(); toClient.writeInt(1); pre.close(); } //增加書籍 **else if** (i == 3) { sql = "insert into book(bname,bauthor,bpublish,bstock,bintime,bsort,btranslator) values(?,?,?,?,?,?,?)"; PreparedStatement pre = con.conn.prepareStatement(sql); pre.setString(1, bname); pre.setString(2, bauthor); pre.setString(3, bpublish); pre.setString(4, bstock); pre.setString(5, bintime); pre.setString(6, bsort); pre.setString(7, btranslator); pre.executeUpdate(); toClient.writeInt(1); pre.close(); } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124

管理學生界面

(StudentInformation)

Mstudent

//刪除所有預約過期 sql = "select sno,bno from studentorder where soverdue\<CONVERT(varchar(100),GETDATE(),23)"; res = stat.executeQuery(sql); **while** (res.next()) { String sno = res.getString(1); String bno = res.getString(2); sql = "begin tran ss " \+ "delete from studentorder where sno= ? and bno= ? " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update book set bstock=bstock+1 where bno=? end " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update studentacount set sstats=sstats+1 where sno=? end commit tran " \+ "if \@\@error!=0 rollback tran ss "; PreparedStatement pre = con.conn.prepareStatement(sql); String type = fromClient.readUTF(); String key = fromClient.readUTF(); String sorder = " and book.bno=Studentorder.bno and soverdue\<CONVERT(varchar(100),GETDATE(),23) order by soverdue desc "; String sborrow = " and book.bno=Studentborrow.bno order by sborrow desc "; String sborrow2 = " and book.bno=Studentborrow.bno and soverdue\<CONVERT(varchar(100),GETDATE(),23) order by soverdue desc "; String sreturn = " and book.bno=StudentReturn.bno order by sreturn desc "; //單個查詢過期 **if** (i == 1) { sql = "select \* from studentorder,book,StudentInformation " \+ "where StudentInformation.sno=studentorder.sno and "; } **else if** (i == 2 \|\| i == 4) { sql = "select \* from studentborrow,book,StudentInformation " \+ "where StudentInformation.sno=studentborrow.sno and "; } **else if** (i == 3) { sql = "select \* from studentreturn,book,StudentInformation " \+ "where StudentInformation.sno=studentreturn.sno and "; } **if** (type.equals("學生學號")) { sql += "StudentInformation.sno like '%" + key + "%' "; } **else if** (type.equals("學生姓名")) { sql += "sname like '%" + key + "%'"; } **else if** (type.equals("書籍名稱")) { sql += "bname like '%" + key + "%' "; } **else if** (type.equals("書籍作者")) sql += "bauthor like '%" + key + "%' "; **else if** (type.equals("書籍類型")) sql += "bsort like '%" + key + "%' "; **else if** (type.equals("書籍譯者")) sql += "btranslator like '%" + key + "%' "; **else if** (type.equals("書籍出版社")) sql += "bpublish like '%" + key + "%' "; // System.out.println("type"); **else if** (type.equals("書籍編號")) sql += "book.bno like '%" + key + "%' "; **else if** (type.equals("進貨時間")) sql += "bintime like '%" + key + "%' "; ArrayList\<MstudentBean\> list = **new** ArrayList\<MstudentBean\>(); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106

詳情頁面

(Mstudent)

HandleStudent

(對應StudentInformation)

String sno=fromClient.readUTF(); String bno=fromClient.readUTF(); String sql="select \* from StudentInformation " \+ "where sno="+sno+""; Statement stat=con.conn.createStatement(); sql="select \* from book where bno='"+bno+"'"; 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

6.2.4超級管理員界面

超級管理員界面

(superAdmit)

添加、修改管理員信息

(information)

HandleInformation

(對應superadmit,yijiaoquanxian,information)

//查詢學生基本信息: sql = "select \* from studentinformation,class,xi,studentacount " \+ "where studentinformation.no=class.no and class.cno=xi.cno and studentinformation.sno=studentacount.sno "; **if** (type.equals("學號/工號")) sql += "and studentinformation.sno like '%" + key \+ "%'"; **else if** (type.equals("姓名")) sql += "and sname like '%" + key + "%'"; //查詢管理員基本信息: sql = "select \* from admitinformation "; **if** (type.equals("學號/工號")) sql += "where ano like '%" + key + "%' "; **else if** (type.equals("姓名")) sql += "where aname like '%" + key + "%' "; //修改信息 sql = "begin tran ss " \+ "update admitinformation set aname=? where ano=? " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update admitinformation set asex=? where ano=? end " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update admitinformation set aemail=? where ano=? end " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update admitinformation set aphone=? where ano=? end " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "update admitinformation set aid=? where ano=? end commit tran " \+ "if \@\@error!=0 rollback tran ss "; //添加學生賬戶: sql = "select sid from studentinformation where sno='" \+ no + "'" sql = "insert into studentacount(sno,spassword) values(?,?)"; //添加管理員: "begin tran "+ "insert into admitinformation(ano,aname,asex,aphone,aid,aemail) values(?,?,?,?,?,?) " \+ "if \@\@error!=0 rollback tran ss else begin " \+ "insert into admitacount(ano,apassword) values(?,?) end commit tran "; //查看賬戶密碼: sql = "select \* from studentacount where sno='" + no + "'"; sql = "select \* from admitacount where ano='" + no + "'"; 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79

移交權限

(yijiaoquanxian)

sql = "begin tran " \+ "insert into superadmitinformation(sno,sname,ssex,sphone,sid,semail) values(?,?,?,?,?,?) " \+ "if \@\@error!=0 rollback tran " \+ "else begin " \+ "insert into superadmitacount(sno,spassword) values(?,?) " \+ "if \@\@error!=0 rollback tran " \+ "else begin " \+ "delete superadmitinformation where sno='"+oldid+"' end " \+ "end commit tran "; HandleOrder (對應Studentorder) 熱門度 select \* from book where "bname like '%" + key+ "%' order by bacount desc"; 編號 "select \* from book where "bname like '%" + key + "%'"; 時間 select \* from book where "bname like '%" + key+ "%' order by bintime desc 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

6.2.5修改密碼與密保

修改密碼

(changepassword)

HandlePassword

(對應changpassword)

修改密碼:

分別對應學生,管理員,超級管理員

"update studentacount set spassword=?"+ " where sno=?" "update admitacount set apassword=?"+ " where ano=?" "update superadmitacount set spassword=?"+ " where sno=?" 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

修改密保

(changequestion)

HandleQuestion

(對應changQuestion)

此處只列舉了修改學生

"begin tran sav update studentacount set squestion=? where sno=? " \+ "if \@\@error!=0 rollback tran sav else begin " \+ "update studentacount set sanswer=? where sno=? end commit tran "+ "if \@\@error!=0 rollback tran sav " 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

7.項目總結

7.1數據庫設計

首先需要對數據庫進行需求分析。在這一步的時候,要詳細考慮到各個功能的實現,以及不同成員之間的聯系。一定要考慮周到,不然在之后的過程會有很大的困難。在這一步中,參考了某些圖書館的網上圖書管理系統,分析他們的需求與功能。再結合當下疫情實際情況分析,最后給出總需求,畫出各部分流程圖以及系統流程圖。

設計概念結構,對用戶的需求進行綜合,歸納與抽象,形成一個獨立於具體DBMS的概念模型。畫出ER圖。

根據ER圖轉換成關系模式。在SQLSERVER中建立對應的數據庫以及數據表。詳情請見建表代碼。

7.2程序客戶端設計

剛設計的時候還不確定采用什么語言,什么方法去實現這個客戶端。最后選擇了java
,並且運用jdbc去操控數據庫。在客戶端GUI界面設置時,開始是打算利用比較新的javafx去完成界面。但是我的系統與javafx不兼容導致安裝一直失敗,並且javafx對應的scenebuilder也在打開fxml文件時一直報錯。無奈只能選擇舊一點的swing去編寫界面。一開始單純的通過代碼去編寫GUI界面,后面發現這樣效率並不是特別高,於是找到了一種新的方法,使用windowsbuilder插件能夠可視化GUI界面,再與代碼相結合,能使GUI界面設計事半功倍。想要整體界面達到一個美觀的布局,需要很多時間去一點點調試,這一部分花的時間也是特別長的。設計完GUI界面后,就是要用事件監聽去調用服務端的類方法,實現與數據庫的鏈接操作。在這一部第一次嘗試查閱了非常多的資料與實例,參考了別人如何實現這一部分的調用。其中MVC三層架構的組織模塊方法是本項目中一個很重要的方法。將多個界面都需要用到的模塊封裝在公共類中,通過這樣組織,使代碼結構更加合理,也更容易理解。

7.3程序服務端設計

服務端的主要問題就是在於如何與客戶端建立起socket連接,並且實現各種不同需求的監聽處理。在每一個處理中,要和數據庫進行連接,並且采用sql語句對數據庫進行修改。主要使用Statement或者PreparedStatement接口執行sql語句。這一部分加深了我對jdbc的理解,以及學會了它的使用方法。

服務器界面:

下面的服務器端的部分代碼:

與客戶端建立連接並處理請求:

鏈接數據庫:

查詢信息:

7.4 Bug調試

因為代碼質量比較一般,因此大大小小的bug其實有挺多的。最常見的bug就是sql語句的錯誤,導致的服務端崩潰。因為sql語句有很多引號,以及查詢條件什么的不清楚,導致數據庫無法查詢就會引起崩潰。

還有一點是在插入學生賬戶或者管理員賬戶的時候,一定要對應插入相關學生或管理員信息。否則會在登錄的時候引發線程錯誤導致系統崩潰。

更多的bug就是在GUI界面設計的時候的一些文字格式,文本框大小,各個按鈕等的整體布局。如果沒有調試好會導致部分不顯示之類的bug。

8.使用的參考資料

徐雲彪編著.數據庫原理與技術[M].浙江:浙江大學出版社,2002:23-59.

陸晶編著.Java程序設計[M].北京:清華大學出版社,2002:10-136.

孫元編著.Java語言 SQL接口[M].北京:清華大學出版社,1997:3-59.

苗春義著.Java項目開發全程實錄[M].北京:清華大學出版社,2008:45-159.

希爾伯沙茨著.數據庫系統概念[m].北京:機械工業出版社,2012:28-157

JavaGUI:https://blog.csdn.net/qq_42035966/article/details/82258199

https://www.bilibili.com/video/BV1DJ411B75F?from=search&seid=14703146074566371012

Java JDBC:https://www.runoob.com/w3cnote/jdbc-use-guide.html

Java 身份證驗證:https://www.cnblogs.com/thatme/p/10213972.html

Java
驗證碼:https://blog.csdn.net/sinat_32133675/article/details/77247892?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

總結和源碼下載

這個項目是初學Java開發和數據庫做的一個項目,整體代碼質量不是很高。但是程序是能夠完美運行的,而且不存在什么bug。要注意的修改與數據庫連接的端口號,以及數據庫的賬號和密碼。還有創建表的時候要注意表的信息完整性,不然會出現線程錯誤。

如果有什么不懂的地方,可以在底下的評論區留言,看見后會回復的。也可以去參考一下我博客的其他文章,對數據庫的操作也有了很詳細的介紹。

源碼地址:

含數據庫sql文件,使用myeclipse打開。
鏈接:https://pan.baidu.com/s/18wIivd4mz7Jlq120m7CwAA
提取碼:sec7


免責聲明!

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



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