基于Java和Sql Server的C/S架构图书管理系统

Smilelove

发布日期: 2019-03-14 10:30:10 浏览量: 1061
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

1 系统设计目标

1.1 应用背景

图书管理系统是各图书馆都需要使用的系统,它能帮助图书管理员更好地管理海量图书,尤其是在图书馆藏数量和读者数量都很大的图书馆,我们无法用手写的方式录入、管理图书信息和借阅信息,必须借助图书管理系统来完成这些工作。

1.2 总体目标

系统的使用者分为管理员和读者。管理员负责新书的录入、旧书的清理、借书审核、还书审核,以及日常的维护,有权限增删图书的信息;读者要能够根据书名查找图书,并选择中意的图书进行借阅,读完以后还可以还书;读者没有权限修改图书的信息,他对图书的操作仅限于借、还。这就是一个简单的图书管理系统的大致功能。

2 需求分析

系统总体功能需求列表如下表所示。

功能编号 功能名称 功能描述 权限
1 录入图书信息 将新的书籍信息录入系统 管理员
2 删除图书信息 将损坏的图书从系统删除 管理员
3 修改图书信息 更新图书信息 管理员
4 审核还书申请 审核读者的还书请求,检查图书损坏情况并开出罚单 管理员
5 审核借书申请 审核读者是否有罚金未交,确定读者是否可借阅书籍 管理员
6 查找书籍 通过书名查找书籍信息 读者
7 查询个人信息 读者查询个人信息 读者
8 查询借书记录 读者查询借书记录 读者
9 借书 读者选择书籍进行借阅 读者
10 还书 归还借阅的书籍 读者
11 续借 继续借阅到期的书籍 读者
12 交款 缴纳罚金 读者

性能需求上,要求所有的操作都没有明显的延迟,这对于现在的计算机来说不算难事,所以是不用刻意考虑性能方面的因素的。

数据完整性,具体在数据库设计中说明。

系统的数据流图如下图所示。

3 总体设计

系统采用C/S模式实现,没有为服务器设计专门的客户端,实际上服务器就是数据库,用户是读者和管理员。主要分为两大功能板块:管理员和读者。

实际的图书管理系统要配合扫描仪等设备进行使用,我们的系统显然不能连接外设,适当信息需要手动输入。

系统的总体结构图如下图所示。

3.1 管理员

3.1.1 图书信息管理

具体又分为两个部分:新书上架,也就是将新书的各项信息录入到数据库;查询维护,通过索书号、书名、作者等信息进行查询,得到查询结果后,可以选中并删除图书,这主要是方便管理员查找图书,找到以后还可以精准地删除图书。

3.1.2 读者信息管理

与图书信息管理类似,可以录入、查找并修改或注销读者信息。

3.1.3 借阅管理

分为借书和还书两部分。读者想要借书时,发出一个借书请求,管理员收到该请求后,查看该读者是否还存在有罚金未交的情况,若是,则拒绝读者的借书请求;否则,同意借书。读者还书时也发出还书请求,管理员收到后,查看该读者是否延期还书,或者图书损坏,若是,则开出罚单,等待读者缴费,若图书损坏,则将图书标记为损坏,否则,进行还书登记。

3.2 读者

3.2.1 借阅

分为借书、还书和续借。借书时,可以根据关键字在数据库中进行查找,选择借书,此时发出借书申请,等图书管理员审核通过后才能成功借书;还书时,从借阅列表中选择尚未归还的书籍,发出还书请求,等待管理员审核,若审核发现图书有损坏,则会收到罚单;续借是将当前正在借阅的书籍再延长一个借书周期。

3.2.2 查看报表

读者可以查看个人信息、借阅信息、罚单。

4 数据库设计

4.1 ER图

用Microsoft Visio2010与SQL server连接,生成的实体关系图如下图所示。

4.2 权限控制

图书馆的访问者主要是管理员和读者,所以设置两个用户。管理员有所有表的所有权限,读者的权限则要受到限制。

在上图的6个表中,读者有权限访问馆藏表、图书表和作者表,因为读者需要查询图书;读者有权限访问读者信息表,因为他需要查看自己的个人信息;读者有权限查询和更新借阅表,因为他需要查看自己的借书记录,此外,发起借书请求时会向借阅表中增加一条记录,所以需要更新权限;读者有权限查询和更新罚单表,与前者同理,读者需要查看罚单,并且缴纳罚金时会修改罚单状态,所以需要更新权限。读者没有删除任何一个表的权限,有查询所有表的权限和修改部分表的权限。

4.3 数据库逻辑结构设计

数据库主要分成三大部分:图书信息、借阅信息和读者信息,其中借阅信息和读者信息分别可用一个表实现,但是图书信息相对较复杂。在了解了学校图书馆的图书管理系统以后,发现每一本书都有一个索书号,一个索书号可以对应该书的多本实体,每个实体只用索书号是无法区分的,图书馆采用条码进行区分,所以需要增设馆藏信息表来存放每本实体书的条码号和馆藏地点、馆藏状态等。

同样的,一本书也可能有多个作者,所以也需要用一个单独的表来存放作者,这里我们暂不考虑作者同名的情况,所以没有给作者设置编号。出版社在一般情况下不会同名,也不设置单独的表。

借阅信息用于存放读者的借阅记录,由于借阅过程存在罚款,所以还有一个罚款表。

最终图书管理系统的数据库共有6个表:图书信息表、作者信息表、馆藏信息表、借阅信息表、罚款信息表、读者信息表和罚单表,表项分别如下:

  • 图书信息表:题名,索书号,出版社,发行时间,版本。主码为索书号,题名也不能为空

  • 馆藏信息表:条码,索书号,馆藏地点,状态。主码为条码,索书号为外码,来自图书信息表,馆藏状态不能为空

  • 作者信息表:索书号,作者。索书号为外码,来自图书信息表

  • 借阅信息表:条码,读者编号,借阅日期,归还日期,借阅编号,状态。主码为借阅编号,条码为来自馆藏信息表的外码,读者编号为来自读者信息表的外码

  • 读者信息表:编号,姓名。编号为主码

  • 罚款信息表:罚单号,罚金,罚款原因,状态,借阅编号。主码为罚单号,借阅编号为来自借阅信息表的外码

除了基本表外,还需要若干个视图来实现系统的功能。

  • 图书视图:题名,索书号,作者,出版社,发行时间,版次,条码,馆藏地点,状态。该视图用于管理员和读者查询图书的结果显示,是图书信息表、馆藏信息表和作者表三者的连接

  • 借阅记录视图:借阅编号,条码,书名,读者编号,读者姓名,借阅时间。该视图用于管理员对读者的借书请求进行处理,视图中包含所有读者的所有借阅记录,是借阅信息表、图书信息表和读者信息表的连接

  • 借阅统计:借阅申请次数、借阅成功次数、还书申请次数、还书破损册数。该视图用于管理员的统计查询,对一段时间内的借书、还书信息进行统计

  • 借阅排行:索书号,书名,借阅次数。用于管理员统计一段时间内借阅次数排名前列的书籍,了解图书馆最受欢迎的书籍情况

4.4 数据库物理设计

图书表设计如下表所示:

字段名 类型 主键/外键 为空 索引 取值 备注
索书号 char(20) 主键
书名 char(100)
出版社 char(30)
发行时间 date 合法日期
版本 tinyint 正整数

馆藏信息表设计如下表所示:

字段名 类型 主键/外键 为空 索引 取值 备注
条码 int 主键 从1起自增
索书号 char(20) 外键 来自图书表
馆藏地点 char(100)
状态 tinyint 0、1、2 1-在馆 2-借出 0-损坏

著作表设计如下表所示:

字段名 类型 主键/外键 为空 索引 取值 备注
索书号 char(20) 外键 来自图书表
作者 char(20)

读者表设计如下表所示:

字段名 类型 主键/外键 为空 索引 取值 备注
编号 int 主键 从1自增
姓名 char(10)
密码 char(20)

借阅表设计如下表所示:

字段名 类型 主键/外键 为空 索引 取值 备注
借阅编号 int 主键 从1自增
条码 int 外键 来自馆藏表
读者编号 int 外键 来自读者表
借阅日期 datetime
归还日期 datetime
状态 tinyint 0-4 1-申请借阅 2-在借 3-申请归还 4-已归还 0-失效

罚单表设计如下表所示:

字段名 类型 主键/外键 为空 索引 取值 备注
罚单号 int 主键 从1自增
借阅编号 int 外键 来自借阅表
罚金 int
罚款原因 bit 0、1 0-过期归还罚款 1-损坏图书罚款
状态 bit 0、1 0-用户未交罚金 1-罚金已付

5 详细设计与实现

系统用Java语言实现,通过jdbc与SQL server进行连接,获取数据库中的数据。对管理员和用户分别提供了客户端,图形界面用Javafx实现。

5.1 读者-搜索图书

5.1.1 流程图

算法的业务流程图如下图所示。借书功能与搜索功能是密不可分的,一般都是先搜索再借书。程序初始化时就从数据库中查找出所有的图书信息,并显示到表格上,用户可以直接选择从表中选取某一项,然后进行借阅;如果图书信息过多,直接选取较为困难,可以在输入框中输入关键字搜索,再选择图书进行操作。

5.1.2 算法说明

图书的状态,如在馆、借出等,在数据库中是用int型存储的,所以向管理员展示时,必须用汉字直观地打出,所以要将int转换成字符串;

由于每本书都可能有多个作者,所以要对作者进行特别处理,当多条记录的索书号相同而作者不同时,要合并为一条记录,把各个作者拼接成一个字符串,中间用分号隔开;

此外,在数据库中,如果某个字段是长度为20的字符类型,而实际只用了8个字符,那么后面12个字符会用空格填充,这虽然不影响查询的结果,但是在表格中显示时,空格也会占用空间,所以需要用Java中String.trin()去除多余的空格。

5.1.3 数据库实现

sql语句如下,其中index是搜索的关键字,关键字可以是图书的索书号的一部分、书名的一部分或者图书作者的一部分,即只要有部分字段匹配即可搜索处结果,所以where子句中用“like”进行匹配。

  1. sql = "select * from dbo.图书 t,dbo.馆藏 t2,dbo.著作 t3 where t.索书号=t2.索书号 "
  2. + " and t3.索书号=t.索书号 and (t.索书号='"+index
  3. +"' or t.题名 like '%"+index+"%' or t2.条码='"+index+"' or t3.作者 like "
  4. + "'%"+index+"%') order by t2.条码,t.索书号,t3.作者";

5.2 读者-借书

5.2.1 流程图

图书搜索功能中,在选中了图书并申请借阅以后,要进行一系列判断审核,流程图如下图所示。

5.2.2 算法说明

从选中表项中获取该的条码号,实际上从表中可以直接获取图书的馆藏状态,但是考虑到表中数据可能未及时更新,该书在数据库中可能已经改变状态,所以不能用表中的状态。

根据条码号从数据库中查询该书状态,如果已经借出或者已经损坏,则提示用户借书失败;否则,可以生成借阅信息,插入到借阅信息表中,并提示用户借书请求成功。这不意味着真正地借书成功,还要等待管理员审核。

5.2.3 数据库实现

插入借阅信息sql语句如下,借阅时间是当前时间,借阅编号自动生成。

  1. sql = "insert into dbo.借阅(条码,读者编号,借阅时间,状态,"
  2. + "借阅编号) values("+barcode+",'"+Main.getUser()+"',"
  3. + "'"+df.format(new Date())+"',1,"+(count+1)+")";

5.3 读者-续借/还书

5.3.1 流程图

算法流程图如下图所示。续借和还书都是以借阅记录表为基础的。虽然在需求分析中,这些功能是相互独立的,但在实际实现时,我们要把他们充分联系起来,这也是为了用户的使用方便。

从数据库中获取该读者所有的借阅记录,读者可以选中任意一条记录,选择续借或者归还该书籍。

5.3.2 算法说明

读者查看借阅记录时,借阅记录表已经初始化好,从数据库中选取了该读者的所有历史借阅记录,记录的状态分为在借、已归还。

读者选中某条记录后,若选择续借,则首先要判断是不是在借记录,不是则无法续借,然后还要判断该书是否过期未还,借书期限为一个月,超过期限的书是不可以续借的,若上述条件都满足,则续借成功,将数据库中的借阅时间更新为当前时间,还书期限重新计时。

若读者选择归还,则先判断该记录是否为在借记录,若不是,则无法归还,若是,则直接申请归还,这不需要新增一条借阅记录,只需要将借阅记录中的状态从在借修改为申请还书,管理员看到以后会进行审核。

5.4 读者-查看个人信息

该选项只能查看信息,不可进行其他操作,功能简单。

获取读者在借册数的sql语句如下:

  1. sql = "select count(*) total from dbo.借阅 t where t.读者编号"
  2. + "='"+usernum+"' and t.状态=2";

获取读者总罚金数的sql语句如下:

  1. sql = "select sum(t.罚金) total from dbo.罚单 t,dbo.借阅 t2 "
  2. + "where t.借阅编号=t2.借阅编号 and t2.读者编号='"+usernum+"' and t.状态=1";

5.5 读者-查看罚单

该选项只能查看信息,功能简单。获取罚单的sql语句如下:

  1. sql = "select t.罚单号,t.罚金,t.罚款原因,t.状态,t.借阅编号,t4.题名,"
  2. + "t3.借阅时间,t3.归还时间" +
  3. " from dbo.罚单 t,dbo.馆藏 t2,dbo.借阅 t3,dbo.图书 t4 " +
  4. "where t.借阅编号=t3.借阅编号 and t3.条码=t2.条码 and "
  5. + "t2.索书号=t4.索书号 and t3.读者编号='"+Main.getUser()+"'";

5.6 管理员-查询图书

管理员查询图书与读者查询图书的流程基本相同,不再赘述。

5.7 管理员-下架旧书

5.7.1 流程图

算法流程图如上图所示。

5.7.2 算法说明

由于管理员看到的图书信息实际上是由图书信息表和馆藏信息表连接生成的,所以在进行图书下架时,既涉及到馆藏信息的删除,又有图书信息的删除。有些书籍没有馆藏信息,只有图书信息,则只需要删除图书信息表,否则只要删除馆藏信息表,不能删除图书信息表,因为该图书可能存在其他实体,我们只能一次删除馆藏信息中的一个实体,如果把图书信息也一并删除,则馆藏信息的外键引用会出错。

5.8 管理员-录入图书

5.8.1 流程图

算法流程图如下图所示。

5.8.2 算法说明

录入图书时,索书号和条码号绝对不能为空,须在所有操作之前检查。录入的情况分两种:首先是索书号已经存在的,也就是说,这本书以前就在图书馆中存在,现在又购置了该种书的一批新书,所以图书信息不需要再插入,直接插入馆藏表即可;

第二种是该书原本不存在的情况,图书馆第一次购置该种书,则需要先插入图书信息表,然后再插入馆藏信息表,不可改变插入顺序,否则外键引用出错。

5.8.3 数据库实现

插入图书信息:

  1. sql = "insert into dbo.图书(题名,索书号,出版社,"
  2. + "发行时间,版本) " +
  3. "values ("+bname+","+isbn+","+press+","+ymd+","+version+")";

插入馆藏信息:

  1. sql = "insert into dbo.馆藏(条码,索书号,馆藏地点,"
  2. + "状态) " +
  3. "values ("+barcode+","+isbn+","+store+",1)";

5.9 管理员-查询读者

5.9.1 流程图

算法流程图如下图所示:

5.9.2 算法说明

搜索框的输入可以是读者编号、读者姓名的一部分,在数据库中的读者信息表中查找符合要求的项,这样的项可能有多个,循环取出,依次查找他们的在借册数和罚金数额,都添加到结果表格中显示。

5.10 管理员-修改读者

5.10.1 算法说明

管理员选中读者表中的某个以后,选择修改该读者的信息,由于Javafx中的表格直接修改不太方便,所以用弹窗的方式修改。将原来的读者信息在弹窗中显示,管理员选择修改,点击确认以后,将修改后的信息写入到数据库中该读者对应的条目。

5.11 管理员-注销读者

5.11.1 流程图

算法流程图如上图所示。

5.11.2 算法说明

管理员选中某个读者,选择注销该读者,先判断读者是否有在借书籍,如果有,则不能注销,否则该读者无法还书;再判断该读者是否有罚金未交,如果有,则不可注销,否则会造成图书馆的亏损。若上述情况都没有,则直接将其从读者信息表中删除,其他在外键中引用了该读者的表项也会被触发器一并删除。

5.12 管理员-审核借书

5.12.1 流程图

算法流程图如下图所示:

5.12.2 算法说明

审核读者的借书申请时,首先要检查读者已经借了多少册书,若达到上限,则不允许继续借书;然后检查该读者的罚单,如果有罚金未交,也不允许借书;再检查该读者在借记录,若有书过期未还,不允许借书。

以上情况均不存在,则读者有借书资格,然后检查该书是否在馆,因为该书可能被前面的读者借走了,若在馆则允许借书,审核通过,否则失败。

5.13 管理员-审核还书

5.13.1 流程图

算法流程图如下图所示:

5.13.2 算法说明

管理员审核还书时,先要看图书是否损坏,判断以后填写,如果损坏,则需要生成书籍损坏的罚单,还要将该图书的馆藏信息状态修改为损坏。然后再判断读者是否未按时归还该书籍,若是,则需要生成延期的罚单。最后将归还日期写入数据库,审核完成。

5.14 数据库事务实现

在进行书籍的录入时,先要向图书信息表添加数据,然后再向馆藏信息表添加数据,这两者是分两步进行的。在一般情况下,两步都会成功。但是,特殊情况下,可能插入图书信息成功,而插入馆藏信息失败,这是不应该的。为此我们要添加数据库事务,目的是,对于连续的几个数据库操作,要使其成为原子操作,也就是,要么全都执行成功,要么全都不执行。假如第一条成功了,而第二条失败了,那么要将第一条的结果回滚,部分代码如下所示:

  1. stmt.executeUpdate(sql_1);
  2. stmt.execteUpdate(sql_2);
  3. conn.commit();
  4. //若所有结果执行完成,则执行提交事务
  5. ps.close();
  6. conn.close()
  7. catch(ClassNotFoundException e){
  8. e.printStackTrace();
  9. }catch(SQLException e){
  10. e.printStackTrace();
  11. try{
  12. //只要有一个sql语句错误,则事务回滚
  13. conn.rollback();
  14. }catch(SQLException e){
  15. e.printStackTrace();
  16. }
  17. }

5.15 触发器-删除空白书籍

5.15.1 触发器说明

书籍的信息是存放在图书信息、馆藏信息两个表中的,在录入某种书籍时,先在图书信息表种录入一条数据,再在馆藏信息表中录入多条数据,表示该种书的多个实体。假如该种书全都损坏,则馆藏表中关于该书的条目全都被删除,此时图书信息表中还残留有该书的信息,这条信息已经无效了,需要删除。为了避免手动删除,使用触发器来实现,每次更新或者删除馆藏信息后,检测图书信息表中是否有某条记录已经没有馆藏书籍,将它从图书信息表中删除。

5.15.2 触发器实现

触发器功能部分如下:

  1. ALTER TRIGGER [dbo].[delete_emptybook]
  2. ON [dbo].[馆藏]
  3. AFTER DELETE,UPDATE
  4. AS
  5. BEGIN
  6. SET NOCOUNT ON;
  7. delete from 图书 where 0=(select count(*) from 馆藏 where 馆藏.索书号=图书.索书号)
  8. END

15.16 触发器-设置图书损坏

5.16.1 触发器说明

当读者还书时,管理员需要判定该书是否损坏,如果鉴定为损坏,则需要开具罚单,罚单中有一项表示罚款的原因是书籍损坏还是迟还,如果该项填写为书籍损坏,则自动将馆藏表中对应的书籍馆藏状态设置为损坏,省去了手动设置。

5.16.2 触发器实现

触发器功能部分实现如下:

  1. ALTER TRIGGER [dbo].[set_bookbroken]
  2. ON [dbo].[罚单]
  3. AFTER INSERT,DELETE,UPDATE
  4. AS
  5. BEGIN
  6. update 馆藏 set 状态=0 where exists
  7. (select * from inserted,(select * from 借阅)t where inserted.罚款原因=1 and inserted.借阅编号=t.借阅编号
  8. and t.条码=馆藏.条码)
  9. END

5.17 触发器-设置罚金

5.17.1 触发器说明

在开具罚单时,管理员只需要填写罚款原因,而罚款金额有数据库生成,规定过期还书罚款1元,书籍损坏罚款5元,自动设置罚款的触发器根据罚款原因进行罚金的设置。

5.17.2 触发器实现

触发器功能部分实现如下:

  1. ALTER TRIGGER [dbo].[set_fine]
  2. ON [dbo].[罚单]
  3. AFTER INSERT,DELETE,UPDATE
  4. AS
  5. declare @sake bit;
  6. BEGIN
  7. select @sake = 罚款原因 from 罚单;
  8. if @sake=0 begin
  9. update 罚单 set 罚金=1 where exists(select * from inserted where 罚单.罚单号=inserted.罚单号)
  10. end
  11. else begin
  12. update 罚单 set 罚金=5 where exists(select * from inserted where 罚单.罚单号=inserted.罚单号)
  13. end
  14. END

5.18 触发器-修改读者信息

5.18.1 触发器说明

管理员有一项功能是修改读者的信息,如果只是修改了读者姓名、密码等,那么只需要修改读者表这一个表,而如果修改了读者编号,即修改了主码,那么与该读者有关的借阅信息表中存有的该读者的编号也要进行修改,这一操作不能让管理员执行,需要用触发器实现。

5.18.2 触发器实现

触发器功能部分实现如下:

  1. ALTER TRIGGER [dbo].[update_aboutuser]
  2. ON [dbo].[读者]
  3. AFTER UPDATE
  4. AS
  5. declare @old char(10)
  6. declare @newuser char(10)
  7. BEGIN
  8. select @old=t.编号 from deleted t
  9. select @newuser =t.编号 from inserted t
  10. update dbo.借阅 set 读者编号=@newuser where 借阅.读者编号=@old
  11. END

6 系统测试

6.1 管理员-图书查询测试

6.1.1 测试说明

可以在选择框输入索书号、作者或者是书名,均可查询出结果。

6.1.2 测试过程

管理员的图书查询维护界面如下图所示,未执行查询时会显示所有的图书信息。

查询可以根据索书号、书名、作者这三个关键字的全部或者部分进行查询,根据索书号查询结果如下图所示。

根据书名查找结果如下图所示。

根据作者查询结果如下图所示。

查询失败结果如下图所示,书库中暂无该书。

若输入框为空,则查询结果为所有书籍。

6.2 管理员-图书下架测试

6.2.1 测试说明

任务书中要求管理员可以进行旧书下架,旧这个概念比较模糊,没法严格定义,所以我们把一本书是否已经“旧”了的决策权交给管理员,也就是说,管理员可以删除任何他认为算作旧书的书籍,所以管理员可以选择任何书籍进行删除,除非该书已借出,不在馆。

6.2.2 测试过程

选中已经借出的书籍《大卫•科波菲尔》,选择下架,弹出窗口警告该书已借出,不可删除,如下图所示。

选择在馆图书《夏洛的网》,点击下架,结果如下图所示,删除成功。

《夏洛的网》只有一本实体书,删除以后,馆藏信息表中已经没有该书,而图书信息表中还有该书,此时触发器检测到该书没有馆藏信息,在图书信息表中将其自动删除。

6.3 管理员-新书上架测试

6.3.1 测试说明

新书上架界面如下图所示,其中索书号一栏用的是下拉框,既可以选择又可以输入,这样设计是因为,录入图书时,有两种情况:其一,图书馆购置了一批最新的书籍,馆中没有这种书,那么索书号必须要新分配,所以要输入索书号;其二,馆中已经有的书,最近又增购了一些,录入这些书籍时,就可以直接从列表中选择索书号了,我们的测试也分这两种情况进行。书籍的条码号不需要手动填写,数据库会自增生成。

6.3.2 测试过程

首先选择录入已经存在的书籍,从索书号列表中选择一个索书号,如下图所示,书名、作者等项会自动填充,且不可编辑,只有条码号和馆藏地点可以填写。

填写好以后,点击录入,录入成功,结果如下图所示,最后一行是《兄弟》新录入的馆藏本,条码号为168。

再测试录入馆中没有的书籍,我们录入一本计算机丛书《编译原理》,索书号为cs3,其他各项信息如下图所示。

确定录入,录入成功,结果如下图所示,最后一行是刚录入的书籍。

测试异常情况,不填写索书号直接录入,弹出窗口警告;不填写馆藏地点直接录入,也提示错误。

6.4 管理员-读者查询

6.4.1 测试说明

读者信息查询可以根据读者编号、读者姓名的一部分或全部进行,但不能通过用户密码进行查询,因为涉及到密码的操作不太安全,实际上这里将用户密码直接显示也是不太好的,只不过我们认为管理员有一切权限,所以可以查看用户密码。

6.4.2 测试过程

读者查询维护界面初始化如下图所示,表中显示了所有的读者。

根据读者姓名查询,在搜索框输入“张”,查询结果如下图所示。

根据读者编号进行查询,结果如下图所示。

查询异常情况,输入的关键字不匹配,查询结果为空,如下图所示。

6.5 管理员-录入读者信息

6.5.1 测试说明

读者录入分为正常录入、读者编号重复异常、信息不全异常。

6.5.2 测试过程

录入一名读者,如下图所示。

录入以后,在读者列表中可以看到刚刚录入的读者信息;将读者姓名、密码之中的任意一项空缺,点击录入,将提示信息填写不全

6.6 管理员-修改读者信息

6.6.1 测试说明

管理员可以选择一条用户信息,选择修改。修改后点击确定,即可修改成功。不允许修改主码读者编号,因为该项是自增的,不可编辑,可以任意修改读者姓名和登录密码。

6.6.2 测试过程

选择读者“张三”,点击修改,弹出窗口如图 4 36所示。将读者姓名修改为“李四”,密码改为“lisi”,点击确定。

6.7 管理员-注销用户

6.7.1 测试说明

管理员有权限删除任何一个用户,只是也要受一些限制。如果读者有借书还未归还,则不能删除;如果读者有罚金未交,则不能删除。只有读者与图书馆不存在利益关系时才可注销账户。

6.7.2 测试过程

选择3号用户蔡韬,点击删除,注销成功。

6.8 管理员-查看报表

统计报表的功能较为简单,如下图所示是借阅统计报表,可以选择开始时间和结束时间,统计该段时间内的总借阅申请、借阅成功、还书申请、还书成功数目。

如下图所示是借阅排行榜,可以选择开始时间和结束时间,统计该段时间内,图书馆的书籍借出次数,降序排列,便于管理员掌握受欢迎的书籍种类。

6.9 借书/还书综合测试

6.9.1 测试说明

由于读者的借书和管理员的借书审核、读者的还书和管理员的还书审核,互相之间是密不可分的,所以测试也不能孤立地进行,我们将读者和管理员的借书、还书操作混合交替进行,以达到测试借书、还书的目的。

管理员审核读者的借出请求时,首先要判断读者在借册数是否超标,再判断是否有在借的书过期未还,最后判断是否有罚金还未交,以上三种情况都拒绝借书,否则审核通过,借书成功。

借书测试计划是,先让一个用户连续申请借书4次,管理员进行审核,由于用户借书上限是3本,所以该用户的前三次请求均能通过,属于正常情况,第4次被拒绝,属于异常中的借书册数超标。然后读者申请还书,管理员很合还书时将该书鉴定为损坏,对读者开罚单,读者收到罚单后再次借书会失败,这是借书异常中的罚款未交异常。再将读者借书日期修改为超过1个月以前,这样读者再次借书也会失败,属于借书异常中的有书过期未还异常。

6.9.2 测试过程

读者请求借书,连续申请4次。在管理员一端可以看到读者“张鑫”的4次借书请求,如下图所示。

管理员进行借书审核,读者借书成功;审核到第4本书时,系统检测到该读者已经借书3本,不可继续借书,所以弹窗警告,借书失败;紧接着,读者申请还书;管理员审核还书,管理员填写鉴定图书是否损坏,默认为正常,可以下拉选择损坏;选择损坏并点击确定,图书损坏需要罚款5元。

由于该读者还书时被鉴定为损坏图书,所以他已经被取消了借阅资格,只有缴纳了罚金以后才会被取消限制,现在该读者再次尝试借书,管理员审核时检测到他有罚金未交,拒绝了借书请求。要恢复还书资格,读者必须缴纳罚款,读者成功缴纳5元罚金,重获借书资格并再次申请借书。管理员再次审核读者的借书请求,借书成功。

最后一种异常情况,就是读者借书过期未还时,不可继续借书。我们设置的借书期限是一个月,考虑到测试时生成的借阅记录都是今天的,所以短时间内不会超过借书期限,为了完成测试,我们直接到SQL server中将借阅事件修改到两个月以前,这样一来,这条借阅记录就一定过期了。如下图所示,最后一条借阅记录时间为4月12日。

该读者有书过期未还,现在再次申请借书,管理员审核借书信息时,检测到他有书过期未还,拒绝借书。读者将过期未还的书申请还书,管理员审核时,系统检测到该书过期,收取1元罚金,该读者被取消借书资格,只有缴纳罚金以后才会取消限制。

6.9.3 结果分析

以上测试过程涵盖了读者借书、读者还书、管理员审核借书、管理员审核还书。读者不管有没有借书资格,都是可以发出借书申请的,最终借书是否通过,在管理员一方决定。读者所借书籍不管是不是已经过期、是不是损坏,都是可以申请还书的,最终是否罚款,在管理员一方判断。所以说,读者借书、还书都没有异常情况。

管理员审核借书,有三种异常情况:该读者已经有3本书在借未还;该读者有罚金未交;该读者有至少一本书过期未还。这三种情况在测试都进行了处理。

管理员审核还书,有正常情况和两种异常情况。不论如何,都会弹出窗口要求管理员填写图书是否损坏,如果填写正常,那么直接审核通过;如果填写损坏,那么罚款5元;如果读者还书时已经超过借书期限,则罚款1元。在测试用例中上述情况都进行了测试。

综上,读者、管理员的借书、还书综合测试成功,系统功能达到设计目标。

6.10 读者-图书查询

6.10.1 测试说明

读者的图书查询与管理员稍有不同,管理员的查询是单条件查询,而为了使读者的使用体验更好,向读者提供了多条件查询。

6.10.2 测试过程

可以根据书名、作者或者出版社进行单项查找,不需要的条件直接不填即可。

6.11 读者-查看借书记录

6.11.1 测试过程

如下图所示是该读者的借书记录,最后一列“在借”表示当前正在读者手中的书籍,“借阅失败”可能是因为读者有罚金未交等异常情况引起的,“已还”表示读者已经成功归还书籍。

6.12 读者-查看基本信息

6.12.1 测试过程

如下图所示是当前读者的基本信息。

6.13 读者-续借

6.13.1 测试说明

一本书籍在借,且为过期时,读者可以选择续借,续借成功后,借阅时间更新为当前时间,借阅期限重新计算。当书籍过期未还时不可续借,不是在借的书籍也不可续借。以下测试将对上述三种情况进行测试。

6.13.2 测试过程

当前读者的借阅记录如下图所示,有两本在借书籍,一本是4月12日借阅的,已经过期,另一本是6月13日借阅的,还未过期。

选择续借6月13日借阅的书籍,如下图所示,续借成功。

续借成功后,书籍的借阅时间进行了更新。选择续借4月12日借阅的书籍,系统检测到该书已过期,拒绝了续借。选择一条借阅失败的记录进行续借,系统提示该条信息不可续借。

7 课程总结

主要熟悉了SQL server的使用,学会了新增用户并设置用户权限;掌握了sql查询语句的多种用法以及较为复杂的查询逻辑的实现;掌握了触发器的简单使用;将数据库知识和实际结合,实现了一个功能比较完备的管理系统。

实验过程中使用了MySQL和SQL server两个数据库,两者各有优劣,基本的操作都已经掌握,在以后的使用了可以灵活选择。只是对于命令行下操作数据库还不够熟悉。

触发器的实现花费了较多时间,因为触发器的语句写法很灵活,而且Oracle、SQL server等不同数据库的触发器语法还大不相同。在编程的过程中发现,很多能够在高级语言中实现的功能,其实也可以在数据库中用触发器实现,两者对比,选择用触发器实现更好,可以减少编码量。

在系统生成报表时,是用sql语句对多个表进行连接生成的,而没有使用视图,这方面还有待改进,用视图生成报表更加方便。

软件功能学习部分的选做题没有完成,有时间还需要实现,加深对数据库的理解和操作的熟练程度。

上传的附件 cloud_download 基于Java和Sql Server的CS架构图书管理系统.7z ( 5.91mb, 17次下载 )
error_outline 下载需要15点积分

keyboard_arrow_left上一篇 : 基于javaEE学生选课系统 基于JSP实现的课程资源管理系统网站 : 下一篇keyboard_arrow_right



Smilelove
2019-03-14 10:30:43
Java和Sql Server实现的C/S架构图书管理系统
西瓜也上火
2019-06-24 11:45:39
管理员角色的相关账号内容应该是什么呢,数据库里面没有体现啊

发送私信

即使是不成熟的尝试,也胜于胎死腹中的策略

7
文章数
9
评论数
最近文章
eject