1.用户登录
(1)功能需求:在界面中填写用户号和密码并选择用户类型。如果用户名和密码存在,则提示登录成功;否则提示“用户名或密码错误”,此外如果是读者,还要判断用户是否过期。
(2)主要代码:
try { ……
int ident=reader.isSelected()? 0:1; //获取单选框身份:0为读者,1为管理员
……
if (ident==0) {//读者登录
//sql语句,寻找相关身份的用户名和密码
loginSql = "select * from reader where no='" + user + "' " + "and password='" + pass + "'";
rs=dbcon.executeQuery(loginSql); //执行sql语句
if (rs.next()) {//判断是否存在这条记录
// 创建调用存储过程的字符串
String callPro="{call pro_checklogin(?,?)}";
……
// 获取存储过程返回的值
int ch=cstmt.getInt(2);
if (ch==1){//ch为1时表示已过期
JOptionPane.showMessageDialog(null, "账户已过期");
}else {
JOptionPane.showMessageDialog(null, "登录成功");
readerframe rf = new readerframe(user);//打开新界面时传递参数
…… }
}
else
JOptionPane.showMessageDialog(null,"用户名或密码错误");
}else {//管理员登录
…… }}
--检查是否到期的存储过程
--需求:查看账户是否到期
create proc pro_checklogin @readerid char(10),@check int output
as
begin
declare @years int,@period int
--查看类型的有效期限
select @period=typeperiod from reader r,readertype rt where no=@readerid and r.typeno=rt.typeno
--查看从注册日期到现在的时间
select @years=datediff(YEAR,addate,getdate()) from reader where no=@readerid
--如果超过有效期限,则赋值为1,表示已过期
if(@years>@period)--如果超过有效期限,则赋值为1
begin
set @check=1
end
end
(3)程序结果如图1所示:
图1 用户登录
2.读者主界面
(1)功能需求:显示热门图书
(2)主要代码:
//查询借阅量前10的图书
ResultSet rs = dbcon.executeQuery("select * from view_book where no in (select top 10 bno from borrow group by bno order by count(*) desc)");
(3)程序结果如图1所示:
图2 用户主界面
3.借阅图书
(1)功能需求:借阅图书,界面查询图书即详情,并可以根据图书状态借阅图书。
(2)主要代码:
//查询功能
if(box.getSelectedItem().equals("编号")){
//模糊查询
String sql="select * from view_book where no like '%"+textField.getText()+"%'";
tableModel=getModel(sql);//获取表格模型
table.setModel(tableModel);//设置表格的表格模型
scroll.setWheelScrollingEnabled(true); //启用滚轮滚动功能
getContentPane().add(scroll,BorderLayout.CENTER); //更新面板
}……
--借书存储过程
--需求:借书功能,需识别读者种类,若读者已借阅的图书数量已达允许的借书数量,则不允许借阅
create proc pro_checkout @readerid char(10),@bookid char(5),@message varchar(20) output
as
begin
declare @num int,@count int
--查询该读者类型的借书数量
select @num=borrnum from reader r,readertype rt where no=@readerid and r.typeno=rt.typeno
--查询读者已借图书数量
select @count=count(*) from borrow where rno=@readerid group by rno having retime=null
--判断图书是否下架
if exists( select * from book where no=@bookid and status='已下架')
set @message ='该书已下架!'
else
begin
--判断借书数量是否达到上限
if(@count>=@num)
set @message ='借书数量已达上限!'
else
begin
--判断图书是否借出
if exists( select * from book where no=@bookid and status='未借出')
begin
insert into borrow(rno,bno,borrtime) values(@readerid,@bookid,getdate()) --添加借阅记录
update book set status='已借出' where no=@bookid --更改图书状态
set @message ='借书成功!'
end
else
set @message ='该书已借出!'
end
end
end
(3).程序结果如图3所示:
图3 借书界面
4.归还图书
(1)功能需求:归还图书界面,可以查询借阅记录,归还图书,查询到期时间。
(2)主要代码:
//查询功能
if(box.getSelectedItem().equals("未归还记录")){
//查询语句:查询未归还图书
String sql="select * from view_borrow where rtime is null and rno='"+USER+"'";
……
}……
--还书存储过程
--需求:还书时,识别读者种类,若图书借阅时间已超允许的借书期限,则提示超出借阅期限,计算罚金
create proc pro_checkin @readerid char(10),@bookid char(5),@message varchar(20) output
as
begin
declare @days int,@period int,@btime datetime,@price dec(5,1),@between int,@fee dec(5,1)
--查询图书价格
select @price=price from view_book where no=@bookid
--查询该读者类型允许的借书时间
select @period=borrperiod from reader r,readertype rt where no=@readerid and r.typeno=rt.typeno
--查询已借出的时间
select @days=datediff(day,borrtime,getdate()) from borrow where rno=@readerid and bno=@bookid and retime is null
if(@days>=@period) --判断是否逾期
begin
--设置罚金,上限为书价
set @between=@days-@period
set @fee=0.1*@between
if(@fee>@price)
set @fee=@price
--更新还书日期
update borrow set retime=getdate(),fine=@fee where rno=@readerid and bno=@bookid and retime is null
--更新图书状态
update book set status='未借出' where no=@bookid
set @message ='还书成功,已逾期'+CONVERT(char,@between)+'天,罚金为'+CONVERT(char,@fee)
end
else
begin
update borrow set retime=getdate() where rno=@readerid and bno=@bookid and retime is null
update book set status='未借出' where no=@bookid
set @message ='还书成功!'
end
end
--到期时间存储过程
--需求:查看到期时间,和所剩天数或逾期天数
create proc pro_maxdate @readerid char(10),@bookid char(5),@message varchar(40) output
as
begin
declare @days int,@period int,@btime datetime,@maxdate datetime
--查询借书时间
select @btime=borrtime from borrow where rno=@readerid and bno=@bookid and retime is null
--查询该读者类型允许的借书时间
select @period=borrperiod from reader r,readertype rt where no=@readerid and r.typeno=rt.typeno
--获取到期时间
set @maxdate=DATEADD(DAY,@period,@btime);
--查询已借出的时间
select @days=datediff(day,borrtime,getdate()) from borrow where rno=@readerid and bno=@bookid and retime is null
if(@days>=@period) --判断是否到期
set @message ='到期时间为'+CONVERT(char(10),@maxdate,111)+',已逾期'+CONVERT(char(3),@days-@period)+'天'
else
set @message ='到期时间为'+CONVERT(char(10),@maxdate,111)+',剩'+CONVERT(char(2),@period-@days)+'天'
end
--视图
create view view_borrow(rno,rname,bno,bname,btime,rtime,fine,note)
as
select rno,r.name,bno,p.name,borrtime,retime,fine,bw.note
from borrow bw,book bk,publish p,reader r
where bw.bno=bk.no and bk.isbn=p.isbn and bw.rno=r.no
(3).程序结果如图4所示:
图4 还书界面
5.图书信息管理
(1)功能需求:包括上架图书,下架图书,修改图书信息,查询图书,查看详情功能。
(2)主要代码:
//上架图书
try {……
//插入book表语句
String sql1="insert into book(no,isbn,note,indate) values(?,?,?,getDate())";
//插入publish表语句
String sql2="insert into publish values(?,?,?,?,?,?,?,?)";
//查找该类型中最大编号(用于生成图书编号)
String sql3="select top 1 * from view_book where type='"+type.getSelectedItem().toString()+ "'order by no desc";
//查找类型表中相应元组
String sql4="select * from booktype where typename='"+type.getSelectedItem().toString()+"'";
PreparedStatement prestate3=dbcon.preparedStatement(sql3);
ResultSet rs3=dbcon.executeQuery(sql3);
ResultSet rs4=dbcon.executeQuery(sql4);
rs4.next();
//获取类型编号
tno=rs4.getString("typeno");
//自动生成图书编号
if(!rs3.next()){ //如果该类型中不存在图书
int i4=Integer.parseInt(tno); //类型编号转换成整型
int i=i4/10; //获取位数
no=(int)(i4*Math.pow(10,4-i)+1); //生成5位图书号(前缀是类型号)
}else {
String s3=rs3.getString("no");//获取该类型最大图书号
int i3=Integer.parseInt(s3);
no=i3+1; //编号加1为新的图书号
}
PreparedStatement prestate1=dbcon.preparedStatement(sql1);
//在publish表中寻找与isbn号相同的行
String sql5="select * from publish where isbn='"+isbn.getText()+"'";
ResultSet rs=dbcon.executeQuery(sql5);
//如果结果集中第一个值不存在,则不存在isbn
if(!rs.next()){
//插入publish表
PreparedStatement prestate2=dbcon.preparedStatement(sql2);
……}
while (number >0) {//根据图书数量插入book表
prestate1.setString(1, String.valueOf(no++));//每次编号加1
……
number--;
}
//添加图书时,如果publish表中有该图书,只需添加ISBN,其他值自动添加
isbn.addFocusListener(new FocusAdapter() {//焦点事件监听器
public void focusLost(FocusEvent e) {//响应焦点失去的事件
lib_db dbcon=new lib_db();
//在publish表中寻找与isbn号相同的行
String sql="select * from publish where isbn='"+isbn.getText()+"'";
ResultSet rs= null;
try {
rs = dbcon.executeQuery(sql);
//如果结果集中第一个值存在,则存在isbn
if(rs.next()){
name.setText(rs.getString("name"));//传参
……
//取出版日期的年、月,并给组件赋值,实现传参
String pd=rs.getString("pubdate");
int p=0;
for(int i=0;i<pd.length();i++){
//取出字符串年的部分
if(pd.charAt(i)=='-'&& p==0){
String y=pd.substring(p,i);
p=i+1;
year.setText(y);
}
//取出月
else if (pd.charAt(i)=='-'&& p!=0){
String m=pd.substring(p,i);
p=i+1;
month.setSelectedItem(Integer.parseInt(m));
}
}
……} } }});
//修改图书的传参方法
public void setter(BookEntity book){
no.setText(book.getNo());//给组件赋值
……
}
(3)程序结果如图5所示:
图5 图书信息管理界面
标签:set,课设,no,--,server,图书,where,select From: https://blog.csdn.net/m0_74783598/article/details/142069834