图书管理系统数据库设计实验报告
文章目录
更新日志
2020.7.11 修改了表的结构,表之间增加了外键联系,更加完整且符合第三范式。
数据库设计实验报告
1.概述
疫情期间,大家都只能够在家里,不能去到学校,此时需要在图书馆借书,就是只能通过网络来操作了。因此,网上图书馆就此诞生了,有了网上图书馆,学生通过网络来订阅图书是一件非常轻松的事情,只要在网上申请了书籍的借阅,管理员则可以通过快递把书籍寄给学生,并且学生在规定时间内再通过快递把书籍送还给学校图书馆。
本系统是一个针对学校的网上图书馆借还系统,通过网络,学生可以很轻松的查询某些书籍是否可以借到,并且还可以通过网络续借书籍。管理员可以通过该系统很容易的将书籍信息存储到数据库和查询学生的借还情况,并且通知那些逾期的学生尽快归还或者续借。超级管理员则对学生和管理员的信息进行修改,或者增加用户。用户必修用户名和密码相互匹配正确后才能登陆成功,然后在进行相应的操作。对于非法操作,该系统有识别作用。
2.需求分析
2.1需要实现的功能
登陆功能:登陆系统为身份验证登陆。分为学生登陆,管理员登陆,超级管理员登陆。不具备注册功能。
学生登陆后:显示该用户的基本信息。可以修改密码,修改密保问题,查看书籍并且预约书籍,查看已经借到的书籍的情况,还书的情况。
管理员登陆后:显示该用户的基本信息。可以修改密码,修改密保问题,查看书籍信息并且修改数据信息,添加书籍。查看学生的借还情况。
超级管理员登陆后:显示该用户的基本信息。可以修改密码,修改密保问题,查看,修改管理员的信息,添加新的管理员。添加用户学生,查看学生的情况。
修改密码:通过匹配密保问题的答案进行修改密码。
修改密保问题:通过匹配原密码进行修改密保问题。
预约书籍:查看书籍的具体信息后,可以对该书籍进行预约,预约到期时间1天后,如果一天后还没有借到该书籍,则自动取消预约。
查看借书情况:查看书籍的具体信息后,可以对该书籍进行续借,续借的有效时间是30天,只可以对同一书籍续借1次。
查看还书情况:查看书籍的具体信息后,可以对该书籍进行预约,预约和预约书籍功能一样。
修改书籍信息:查看书籍的具体信息后,可以对该书籍的信息进行修改。
增加书籍:增加书籍。
查看学生借还情况:查看学生的借还详细信息。
权限移交:只有超级管理员才有的功能。删除该管理员,新增加一个超级管理员。
增加管理员:增加一个新的管理员。
查看管理员信息:查看信息后,可以进行信息修改
查看学生信息:只能查看学生的信息,而不能进行修改
2.2业务流程图
2.2.1学生流程图
2.2.2管理员流程图
2.2.3超级管理员流程图
未命名文件 (2)
2.3功能需求分析
系统主要结构功能如下:
3.数据字典
名字:书籍信息表
描述:数据库中书籍信息表各字段的集合,包含编号,书名,作者,译者,出版社,库存,进货时间
名字:学生信息表
描述:数据库中学生信息表各字段的集合,包括学号,姓名,学院编号,性别,出生日期,身份证号码,手机号码
名字:学生账号信息
描述:数据库中学生账号信息表各字段的集合,包括学号,密码,密保问题,密保答案,剩余可以借次数
名字:学生预约
描述:数据库中学生预约表各字段的集合,包括学号,书籍编号,预约时间,到期时间
名字:学生借书
描述:数据库中学生借书表各字段的集合,包括学号,书籍编号,借书时间,到期时间
名字:学生还书
描述:数据库中学生还书表各字段的集合,包括学号,书籍编号,还书时间
名字:管理员信息
描述:数据库中管理员信息表各字段的集合,包括工号,名称,性别,手机号码,email,身份证号码
名字:管理员账号信息
描述:数据库中管理员账号信息表各字段的集合,包括工号,密码,密保问题,密保答案
名字:超级管理员信息
描述:数据库中超级管理员信息表各字段的集合,包括工号,姓名,性别,手机号码,身份证号码,email
名字:超级管理员账号信息
描述:数据库中超级管理员账号信息信息表各字段的集合,包括工号,密码,密保问题,密保答案
名字:用户信息
描述:数据库中账户信息以及账户类型,包括工号/学号,用户类型。
数据库关系图
4.概念模型
经过上述系统功能分析和需求总结,设计如下面所示的数据项和数据结构。
书籍表:存放书籍记录。包括编号,书名,作者,译者,出版社,库存,进货时间,分类
学生信息:存放学生信息。包括学号,姓名,班级编号,性别,出生日期,身份证号码,手机号码
学生账号信息:存放学生账号信息。包括学号,密码,密保问题,密保答案,剩余可以借的次数。
学生预约情况:学号,书籍编号,预约时间,预约到期时间
学生借书情况:学号,书籍编号,借书时间,借书到期时间
学生还书情况:学号,书籍编号,还书时间
管理员信息:存放管理员信息。包括工号,姓名,性别,手机号码,身份证号码,email。
管理员账号信息:工号,密码,密保问题,密保答案
超级管理员信息:工号,姓名,性别,手机号码,身份证号码,email
超级管理员账号信息:工号,密码,密保问题,密保答案
职工信息:工号/学号,职位
- R图:
书籍实体:
学生信息实体:
学生账号实体:
学生预约实体:
学生借书实体:
学生还书实体:
管理员信息实体:
管理员账号实体:
超级管理员信息实体:
超级管理员账号实体:
职工信息:
所有实体的联系:
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开发和数据库做的一个项目,整体代码质量不是很高。但是程序是能够完美运行的,而且不存在什么bug。要注意的修改与数据库连接的端口号,以及数据库的账号和密码。还有创建表的时候要注意表的信息完整性,不然会出现线程错误。
如果有什么不懂的地方,可以在底下的评论区留言,看见后会回复的。也可以去参考一下我博客的其他文章,对数据库的操作也有了很详细的介绍。
源码地址:
含数据库sql文件,使用myeclipse打开。
链接:https://pan.baidu.com/s/18wIivd4mz7Jlq120m7CwAA
提取码:sec7