代码采用Spring+SpringMVC+Mybatis主流设计模式,实现了如下功能,数据库采用的是mysql数据库。
根据用户的不同,功能可分为如下:
图书管理员:登录:以图书管理员的身份登录
图书查询:根据书名、作者、图书类型等关键字搜索图书
借书、还书、续借:管理员可以为读者办理借阅图书,归还图书,对图书续借。
查看借阅记录:可以根据读者学号以及图书编号查询借阅记录。
办理逾期交款:如读者有图书超期的情况将会有欠款,可以根据读者学号来为读者办理还款。
图书入库、出库、修改信息:管理员可以将新书录入系统,也可将图书馆下架的书删除,如果图书信息有误或是需要修改,可以修改图书的相关信息。
管理读者信息:管理员可以添加读者,删除读者,修改读者的信息。
读者(学生):登录:以学生的身份登录
个人信息管理:完善和修改相关的个人信息
图书查询:根据书名、作者、图书类型等关键字搜索图书
当前借阅:可查看读者当前已借阅的图书信息
续借图书:对于已借阅并快到归还日期的书,如果想续借,可直接在系统上续借
借阅历史:可查看以前借过哪些图书
逾期缴款:显示已欠款但未交款的记录;显示历史交款记录。
图书挂失和预约:对已借出的图书进行预约;图书如果丢失可在学生端进行挂失。
大致的功能模块:
系统登录模块:读者和图书管理员都必须登录才能进入系统,用户登录时在后台判断用户的权限类型,分为读者(即学生)和图书管理员
图书管理模块:可以对图书进行添加,删除、修改图书信息、查询、查看等一系列的操作。
读者管理模块:添加读者,注销读者,修改读者信息
图书借还功能模块:图书管理员可以为读者办理借阅图书,归还图书的功能,并且能够实现逾期缴款的操作。 如果读者想续借,读者可在自己的页面续借,图书管理员也可以帮忙续借。
图书查询模块:读者和管理员都可以根据不同的条件比如书名,作者等关键字搜索查询相关图书
预约和挂失模块:对已借出的图书进行预约;图书如果丢失可W在学生端进行挂失
管理员后台借阅主页
数据库库表说明
数据库表说明:
tb_category 图书分类表
tb_comment 图书评论表
tb_library 图书信息表
tb_manager 管理员表
tb_order 图书预定表
tb_record 图书借阅表
tb_user 学生用户表
登录页面截图
注册页面
管理员预约管理
管理员借阅超期管理
管理员-学生信息管理
管理员-借阅用户黑名单管理
图书信息管理
图书分类管理
图书添加页面
学生用户主页
学生借阅记录
学生预约书籍记录
书籍借阅页面
用户个人资料修改
部分代码查看
package controller.user;
import mapper.TbOrderMapper;
import mapper.TbRecordMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import po.*;
import po.CustomPO.BookExt;
import po.CustomPO.CommentExt;
import po.CustomPO.TbLibraryQuery;
import po.CustomPO.TblibraryExt;
import service.CommentService;
import service.LibraryCategoryService;
import service.LibraryService;
import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
* @description: 前台页面列表显示处理
*/
@Controller
@RequestMapping("/user/ch")
public class UserBookController {
// 注入
@Autowired
private LibraryService libraryService;
@Autowired
private LibraryCategoryService libraryCategoryService;
@Autowired
private CommentService commentService;
@Autowired
private TbOrderMapper orderMapper;
@Autowired
private TbRecordMapper recordMapper;
@Value("${LOGIN_USER}")
private String LOGIN_USER; // 当前登录用户的 session 存储 属性名
@RequestMapping("/user_bookList")
public String toLibraryListByCid(TbLibraryQuery libraryQuery, PageCount pageCount, Model model, HttpSession session) {
if (libraryQuery == null || libraryQuery.getCateId() == null) {
libraryQuery = new TbLibraryQuery();
libraryQuery.setCateId((Integer) session.getAttribute("currentCategory"));
}
// 根据 类目 id
// 若 当前 类目 为 父类目 则获取 其 下面 的 所有子类目
// 若 当前 类目 为 子类目 则获取 其 同级 类目
List<TbCategory> categoryList = libraryCategoryService.getCategoryByCid(libraryQuery.getCateId());
// 获取当前类目信息
TbCategory currentCategory = libraryCategoryService.getCategoryById(libraryQuery.getCateId());
// 按照条件进行查询
PageCount<TblibraryExt> libraryPageCount = libraryService.findLibraryByAll(libraryQuery, pageCount);
// model 将数据设置到域中
model.addAttribute("subCategoryList", categoryList);
model.addAttribute("libraryPageCount", libraryPageCount);
// 默认
if (currentCategory == null) {
currentCategory = new TbCategory();
currentCategory.setId(0);
}
session.setAttribute("currentCategory", currentCategory.getId());
return "/user/user_bookList";
}
/**
* 通过 图书 id 查询 图书详细信息
*
* @param id
* @return
*/
@RequestMapping("/bookId")
public String toBookInfo(int id, Model model) {
BookExt bookInfo = libraryService.getBookInfoById(id);
// 将 时间戳 进行转换
Long dateSS = bookInfo.getLibrary().getCreatedate();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String formatDate = simpleDateFormat.format(new Date(dateSS * 1000));
bookInfo.setFormatDate(formatDate);
// 通过 图书id 获取 回复信息
List<CommentExt> commentExts = commentService.findCommentByBookId(id);
// 将 查询的 图书信息 设置到 域 中
model.addAttribute("bookInfo", bookInfo);
// 将 回复信息 设置到 域 汇总
model.addAttribute("commentExts", commentExts);
return "/user/bookDetail";
}
/**
* 用于 借阅 图书 操作
*
* @param session 用于 取 用户信息
* @param order 用户借阅关联信息
* @return
*/
@RequestMapping("/jieyue_book")
public String jieyueBook(HttpSession session, Model model, String oid, String kkid, TbOrder order) {
if (null != kkid) {
TbRecord tbRecord = recordMapper.selectByPrimaryKey(Integer.valueOf(kkid));
tbRecord.setReturnbook(2); //2代表挂失
recordMapper.updateByPrimaryKey(tbRecord);
model.addAttribute("successMsg", "图书挂失成功");
return "errorMsg";
}
if (null != oid) {
TbRecord tbOrder = recordMapper.selectByPrimaryKey(Integer.valueOf(oid));
// 插入数据
tbOrder.setBackdate(tbOrder.getBackdate() + 3 * 30 * 24 * 60 * 60);
recordMapper.updateByPrimaryKey(tbOrder);
model.addAttribute("successMsg", "续借三个月成功");
return "errorMsg";
}
// 获取 session 中的用户信息
ActiveUser activeUser = (ActiveUser) session.getAttribute("activeUser");
TbUser tbUser = new TbUser();
tbUser.setId(activeUser.getUserid());
order.setUserId(tbUser.getId());
// 插入数据
libraryService.jieyueBookById(order);
return "redirect:/user/ch/bookId.action?id=" + order.getBookId();
}
@RequestMapping("/commitInfo")
@ResponseBody
public String commitComment(HttpSession session, TbComment comment) {
// 获取 session 中的用户信息
ActiveUser activeUser = (ActiveUser) session.getAttribute("activeUser");
TbUser tbUser = new TbUser();
tbUser.setId(activeUser.getUserid());
comment.setUserId(tbUser.getId());
libraryService.addCommentInfo(comment);
return "ok";
}
}
用户借阅信息显示
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!--借阅记录页面-->
<!DOCTYPE html>
<html lang="en">
<head>
<%@ page contentType="text/html;charset=utf-8" %>
<meta charset="UTF-8">
<title>我的借阅记录</title>
<jsp:include page="../../../include.jsp"/>
</head>
<body>
<div class="panel panel-default">
<div class="panel-heading"><span class="glyphicon glyphicon-picture"> </span> 我的借阅记录</div>
<div class="panel-body">
<div class="row">
<div class="col-md-3"></div>
<table class="table Cont_center" style="margin-top: 50px;">
<tr><b>
<td>图书名称</td>
<td>借阅日期</td>
<td>预计归还时间</td>
<td>借阅状态</td>
</b></tr>
<%--已归还--%>
<c:forEach items="${recordReturnList}" var="recordReturn">
<tr>
<td>${recordReturn.bookname}</td>
<c:if test="${recordReturn.recorddate!=null}">
<td class="recorddate">
${recordReturn.recorddate}
</td>
</c:if>
<c:if test="${recordReturn.backdate!=null}">
<td class="backdate">
${recordReturn.backdate}
</td>
</c:if>
<td>
<button class="btn btn-default"><span class="glyphicon glyphicon-ok-circle"> </span> 已归还
</button>
</td>
</tr>
</c:forEach>
<%--借阅中--%>
<c:forEach items="${recordRunList}" var="recordRun">
<tr>
<td>《${recordRun.bookname}》</td>
<c:if test="${recordRun.recorddate!=null}">
<td class="recorddate">
${recordRun.recorddate}
</td>
</c:if>
<c:if test="${recordRun.backdate!=null}">
<td class="backdate">
${recordRun.backdate}
</td>
</c:if>
<td>
<button class="btn btn-info"><span class="glyphicon glyphicon-time"> </span> 借阅中</button>
<a class="btn btn-info" href="/user/ch/jieyue_book.action?oid=${recordRun.id}"
target="iframe_cont"><span class="glyphicon glyphicon-time"> </span> 续借</a>
<button class="btn btn-success" onclick="guashi('${recordRun.id}')"><span
class="glyphicon glyphicon-check"> </span> 挂失
</button>
</td>
</tr>
</c:forEach>
<%--逾期,未归还--%>
<c:forEach items="${recordOverdueList}" var="recordOverdue">
<tr>
<td>《${recordOverdue.bookname}》</td>
<c:if test="${recordOverdue.recorddate!=null}">
<td class="recorddate">
${recordOverdue.recorddate}
</td>
</c:if>
<c:if test="${recordOverdue.backdate!=null}">
<td class="backdate">
${recordOverdue.backdate}
</td>
</c:if>
<td>
<button class="btn btn-danger"><span class="glyphicon glyphicon-minus"> </span>
逾期,欠费:${recordOverdue.ticketffee}
</button>
<button class="btn btn-success" onclick="guashi('${recordOverdue.id}')"><span
class="glyphicon glyphicon-check"> </span> 挂失
</button>
</td>
</tr>
</c:forEach>
<%--挂失--%>
<c:forEach items="${recordGuashi}" var="recordOverdue">
<tr>
<td>《${recordOverdue.bookname}》</td>
<c:if test="${recordOverdue.recorddate!=null}">
<td class="recorddate">
${recordOverdue.recorddate}
</td>
</c:if>
<c:if test="${recordOverdue.backdate!=null}">
<td class="backdate">
${recordOverdue.backdate}
</td>
</c:if>
<td>
<button class="btn btn-info"><span class="glyphicon glyphicon-book"> </span>
已挂失
</button>
</td>
</tr>
</c:forEach>
</table>
</div>
</div>
</div>
<script>
//挂失
function guashi(id) {
location.href = "/user/ch/jieyue_book.action?kkid=" + id;
}
</script>
<div class="panel panel-default">
<div class="panel-heading"><span class="glyphicon glyphicon-picture"> </span> 我的预约记录</div>
<div class="panel-body">
<div class="row">
<table class="table Cont_center" style="margin-top: 50px;">
<%--预约成功--%>
<tr><b>
<td>图书名称</td>
<td>预约日期</td>
<td>剩余领取时间</td>
<td>预约状态</td>
</b></tr>
<c:forEach items="${tbOrderItems}" var="OrderItems">
<tr>
<td>${OrderItems.bookName}</td>
<c:if test="${OrderItems.orderdate!=null}">
<td class="recorddate">
${OrderItems.orderdate}
</td>
</c:if>
<td class="ctime">
<c:if test="${OrderItems.orderdate+604800<l}">
已过期
</c:if>
<c:if test="${OrderItems.orderdate+604800>l}">
${OrderItems.orderdate+604800-l}
</c:if>
</td>
<td>
<button class="btn btn-success"><span class="glyphicon glyphicon-ok"> </span> 预约成功</button>
<a href="/user/deleteOrder.action?id=${OrderItems.id}">
<button class="btn btn-danger"><span class="glyphicon glyphicon-minus"> </span> 取消预约
</button>
</a>
</td>
</tr>
</c:forEach>
</table>
</div>
</div>
</div>
<script>
window.onload = function () {
//获取到时间戳数组
var recorddate = $(".recorddate");
recorddate.each(function () {
$(this).html(getLocalTime($(this).text()))
})
var backdate = $(".backdate");
backdate.each(function () {
$(this).html(getLocalTime($(this).text()))
})
var ctime = $(".ctime");
ctime.each(function () {
$(this).html(getDateTime($(this).text()))
})
};
</script>
</body>
</html>