首页 > 数据库 >数据库课设--图书管理系统一些主要功能的实现(sql server)

数据库课设--图书管理系统一些主要功能的实现(sql server)

时间:2024-09-09 21:54:23浏览次数:9  
标签:set 课设 no -- server 图书 where select

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

相关文章

  • 【图像去噪】实用小技巧 | 使用matlab将.mat格式的图像转成.png格式的图像,适用于DnD数
    请先看【专栏介绍文章】:【图像去噪(ImageDenoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中)图像形式的DND数据集(.png格式)下载链接见本文底部,订阅专栏免......
  • 【自动化】BB自动化获取视频和音频地址并下载
    fromDrissionPage._pages.chromium_pageimportChromiumPagepage=ChromiumPage()page.listen.start('video/BV1qu411b7EY')page.get('https://www.bilibili.com/video/BV1qu411b7EY/?p=7')resp=page.listen.wait()info=resp.response.body......
  • Numba最近邻插值(CPU+ GPU + Z轴切块 + XYZ轴切块 + 多线程)
    文章目录最近邻插值(加速方法)(1)scipy.ndimage.zoom(2)Numba-CPU加速(3)Numba-GPU加速(4)Numba-CPU加速(Z轴切块)(5)Numba-CPU加速(XYZ轴切块)(6)Numba-CPU加速(XYZ轴切块)+多线程输入数据插值倍数时耗scipy.ndimage.zoom(1024,1024,512)4172.16sNumba-CPU(1024,1024,512)456.58sN......
  • cuda block之间的同步测试
    cudablock之间的同步测试一.小结二.复现过程三.输出本文测试了cudablock之间的同步行为一.小结1.cuda没有提供block之间的同步机制2.本文通过一个计数器,实现同步(while判断全局变量计数是否等于总的线程数)3.当GPU可以容纳所有的线程时A.while循环中为空,ker......
  • 搬桌子最多时间
    描述丁爸信奥培训中心最近在浙江中小企业大厦租了一层楼,这层楼的形状如下:由图可见,这层楼中间是走廊,两侧各有200个房间,编号如上图。最近,丁爸信奥培训中心做了内部机构的调整,需要把一些桌子从一个房间搬到另外的房间。因为走廊很窄,但是桌子很大,所以同一段走廊每次只能通......
  • MySQL——视图(二)视图管理(7)删除视图
            当视图不再需要时,可以将其删除,删除视图时,只能删除视图的定义,不会删除数据。删除一个或多个视图可以使用DROPVIEW语句,删除视图的基本语法格式如下所示:DROPVIEWIIEEXISTS]view_name[,view_name1]...[RESTRICT|CASCADE]        在上述......
  • 最多可完整看完多少节目
    输入输入数据包含多组测试数据,每组测试数据的第一行包含一个整数n(n<=100),表示你喜欢看的节目的总数。然后是n行数据,每行包括两个数据TSi,TEi(1<=i<=n),分别表示第i个节目的开始和结束时间。为了简化问题,每个时间都用一个正整数表示。n为0表示输入结束,不做处理......
  • MySQL——视图(三)应用实例——视图的应用
            本节将通过一个应用案例让读者熟练掌握在实际开发中创建并使用视图的完整过程。1.案例的目的        掌握视图的创建、查询、更新和删除操作。        假如有来自河北和山东的三个理科学生报考北京大学(PekingUniversity)和清华大学(Tsinghua......
  • 常见概念 -- OPA与插损预置
    OPA基本原理        OPA功能,即光功率调节(OpticalPowerAdjust),在新建光层业务时使用。        ​单板正常工作后,在网管上创建单站光交叉时,可以创建自动模式的光交叉,即启动OPA功能。OPA功能通过软件计算,自动调节交叉路径上可调单板内部的可调光衰,使得OTU单......
  • 案例分析:如何用设计模式优化性能1
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......