★学习目标:
1、掌握云借阅系统的图书借阅
★思考任务:
1、图书借阅有那些功能?
★任务学习:
★知识要点:
图书借阅模块包括查询图书、新增图书、编辑图书和借阅图书这4个功能,其中,图书借阅功能和新书推荐模块中的图书借阅功能执行的是同样的代码,在此,就不进行重复讲解。新增图书和编辑图书是管理员角色才有的权限,当普通用户登录时,不会展示和开放对应的功能。接下来,分别对查询图书、新增图书和编辑图书这3个功能的实现进行讲解。
1、查询图书
查询图书时,用户可以根据条件查询所有未下架的图书信息,如果没有输入查询条件,就查询所有图书信息。由于数据库中的数据可能有很多,如果让这些数据在一个页面中全部显示出来,势必会使页面数据的可读性变得很差,所以本系统将查询的数据进行分页,每页默认展示10条数据。
登录系统后,在浏览器中输入地址http://localhost:8080/cloudlibrary/admin/books.jsp,访问图书借阅页面
step 1:实现DAO层:由于不能预测用户是有条件查询还是无条件查询,查询时候统一将查询条件封装到Book对象中,最后根据查询条件是否为空进行查询语句的动态拼接。在BookMapper接口中新增查询方法searchBooks()。
@Select({"<script>" +
"SELECT * FROM book " +"where book_status !='3'" +
"<if test=\"name != null\">
AND book_name like CONCAT('%',#{name},'%')</if>" +
"<if test=\"press != null\">
AND book_press like CONCAT('%', #{press},'%') </if>" +
"<if test=\"author != null\">
AND book_author like CONCAT('%', #{author},'%')</if>" +"order by book_status" +"</script>” })
@ResultMap("bookMap")
Page<Book> searchBooks(Book book); // 查询图书
step 2:实现Service层:在文件BookService.java的BookService接口中新增查询图书的方法search(),具体代码如下所示。
//分页查询图书
PageResult search(Book book,
Integer pageNum, Integer pageSize);
在BookServiceImpl类中重写BookService接口的search()方法,具体代码如下所示。
public PageResult search(Book book, Integer pageNum, Integer pageSize){
// 设置分页查询的参数,开始分页
PageHelper.startPage(pageNum, pageSize);
Page<Book> page=bookMapper.searchBooks(book);
return new PageResult(page.getTotal(),page.getResult());
step 3:实现Controller:在BookController类中新增查询图书的方法search(),该示例代码省略。
step 4:实现页面效果:在后台首页main.jsp的导航侧栏中,配置“图书借阅”超链接的目标路径,配置代码如下所示。
<li >
<a href="${pageContext.request.contextPath}/book/search"
target="iframe">
<i class="fa fa-circle-o"></i>图书借阅
</a>
</li>
step 5:启动项目,使用管理员账号登录系统,单击导航侧栏的“图书借阅”超链接,页面显示。
2、新增图书
step 1:增图书功能的具体实现步骤如下。实现DAO层:在BookMapper接口中新增一个新增图书的方法addBook(),新增后的文件内容如下所示。
/新增图书
Integer addBook(Book book);
在BookMapper.xml映射文件中,使用<insert>元素编写新增图书的语句,具体代码如下所示。
<insert id="addBook" parameterType="com.itheima.domain.Book">
insert into book(
book_id,book_name,book_isbn,book_press,book_author,
book_pagination,book_price,book_uploadtime,book_status,
book_borrower,book_borrowtime,book_returntime)
values (#{id},#{name},#{isbn},#{press},#{author},#{pagination},
#{price},#{uploadTime},#{status},#{borrower},#{borrowTime},#{returnTime})</insert>
step 2:实现Service层:在BookService接口中添加新增图书的方法addBook(),具体代码如下所示。
//新增图书
Integer addBook(Book book);
在BookServiceImpl类中重写BookService接口的addBook()方法,具体代码如下所示。
public Integer addBook(Book book) {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
//设置新增图书的上架时间
book.setUploadTime(dateFormat.format(new Date()));
return bookMapper.addBook(book);
}
step 3:实现Controller:在BookController类中新增一个新增图书的方法addBook(),新增addBook()方法的代码如下所示。
@ResponseBody
@RequestMapping("/addBook")
public Result addBook(Book book) {
try {
Integer count=bookService.addBook(book);
if(count!=1) { return new Result(false, "新增图书失败!"); }
return new Result(true, "新增图书成功!");
} catch (Exception e) {
e.printStackTrace();
return new Result(false, "新增图书失败!"); }}
step 4:实现页面效果:

3、编辑图书
step 1:实现DAO层:由于编辑图书和之前实现的图书借阅类似,都是将当前操作的图书信息进行更新,所以编辑图书无须在BookMapper接口中新增方法,可以直接复用BookMapper接口中的editBook()方法即可。
step 2:实现Service层:在BookService接口中添加新增图书的方法editBook(),具体代码如下所示。
/编辑图书信息
Integer editBook(Book book);
在BookServiceImpl类中重写BookService接口的editBook()方法,具体代码如下所示。
public Integer editBook(Book book) {
return bookMapper.editBook(book);
}
step 3:实现Controller:在BookController类中新增一个编辑图书的方法editBook(),新增editBook()方法的代码如下所示。
@ResponseBody
@RequestMapping("/editBook")
public Result editBook(Book book) {
try {
Integer count= bookService.editBook(book);
if(count!=1) { return new Result(false, "编辑失败!"); }
return new Result(true, "编辑成功!");
} catch (Exception e) {
e.printStackTrace();
return new Result(false, "编辑失败!"); }}
step 4:实现页面效果:


