基于SSM框架案例-云借阅图书管理系统
一、项目简介
SSM(Spring+Spring MVC+MyBatis)框架知识来实现一个简单的云借阅图书管理系统。云借阅图书管理系统在开发过程中,整合了三大框架,并在框架整合的基础上实现了系统功能。 借阅图书管理系统主要实现了两大功能模块:用户登录模块和图书管理模块,用户登录模块主要用于实现用户的登录与注销;图书管理模块主要用于管理图书,如新书推荐、图书借阅等。
二、云借阅系统功能结构图
三、开发环境
web服务器:Tomcat 8.5.24
Java开发包:JDK 8。
开发工具:IntelliJ IDEA 2023.1。
数据库:MySQL 8.0.25。
四、云借阅系统项目文件组织结构
• 持久对象层(持久层或持久化层):该层由若干持久化类(实体类)组成。
• 数据访问层(DAO层):该层由若干DAO接口和MyBatis映射文件组成。DAO接口的名称统一以Mapper结尾,且MyBatis的映射文件名称要与接口的名称相同。
• 业务逻辑层(Service层):该层由若干Service接口和实现类组成。逻辑层主要用于实现系统的业务逻辑。
• Web表现层:该层主要包括Spring MVC中的Controller类和JSP页面。
五、数据库设计
借阅图书管理系统中主要包括用户登录和图书管理两大模块,用户登录模块会用到用户表,图书管理模块会用到图书信息表。除此之外,在图书管理模块中,每次图书借阅完成后,系统会记录图书借阅情况,因此,图书管理模块还需要一个借阅记录表。
用户表
表名(中文) | 功表名(英文) | |||
---|---|---|---|---|
用户表 | user | |||
字段名 | 类型 | 长度 | 是否主键 | 说明 |
user_id | int | 32 | 是 | 用户id |
user_password | varchar | 32 | 否 | 用户名称 |
user_password | varchar | 32 | 否 | 用户密码 |
user_email | varchar | 32 | 否 | 用户邮箱(用户账号) |
user_role | varchar | 32 | 否 | 用户角色(ADMIN:管理员,USER:普通用户) |
user_status | varchar | 1 | 否 | 用户状态(0:正常,1:禁用) |
图书信息表
表名(中文) | 功表名(英文) | |||
---|---|---|---|---|
图书信息表 | book | |||
字段名 | 类型 | 长度 | 是否主键 | 说明 |
book_id | int | 32 | 是 | 图书编号 |
book_name | varchar | 32 | 否 | 图书名称 |
book_isbn | varchar | 32 | 否 | 图书标准ISBN编号 |
book_press | varchar | 32 | 否 | 图书出版社 |
book_author | varchar | 32 | 否 | 图书作者 |
book_pagination | int | 32 | 否 | 图书页数 |
book_price | double | 32 | 否 | 图书价格 |
book_uploadtime | varchar | 32 | 否 | 图书上架时间 |
book_status | varchar | 1 | 否 | 图书状态(0:可借阅,1:已借阅,2:归还中,3:已下架) |
book_borrower | varchar | 32 | 否 | 图书借阅人 |
book_borrowtime | varchar | 32 | 否 | 图书借阅时间 |
book_returntime | varchar | 32 | 否 | 图书预计归还时间 |
借阅记录表
表名(中文) | 功表名(英文) | |||
---|---|---|---|---|
借阅记录表 | record | |||
字段名 | 类型 | 长度 | 是否主键 | 说明 |
record_id | varchar | 32 | 是 | 借阅记录id |
record_bookname | varchar | 32 | 否 | 借阅的图书名称 |
record_bookisbn | varchar | 32 | 否 | 借阅的图书的ISBN编号 |
record_borrower | varchar | 32 | 否 | 图书借阅人 |
record_borrowtime | varchar | 32 | 否 | 图书借阅时间 |
record_remandtime | varchar | 32 | 否 | 图书归还时间 |
六、部分核心源代码展示
登录模块
package com.xiaohe.controller;
import com.xiaohe.entity.PageResult;
import com.xiaohe.entity.Result;
import com.xiaohe.pojo.User;
import com.xiaohe.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* @version v1.0.0
* @belongsProject: SSMBooks
* @belongsPackage: com.xiaohe.controller
* @author: xiaohe
* @description: UserController
* @createTime: 2023-06-16 11:31
*/
@Controller
@RequestMapping("/user")
public class UserController {
// @ResponseBody
@RequestMapping("toMainPage")
//提供一个直接跳转主页面的方法
public String toMainPage(){
return "main";
}
@Autowired
private UserService userService;
// @ResponseBody
@RequestMapping("/login")
// HttpSession httpSession
public String login(User user, HttpServletRequest request){
User dbUser = userService.login(user);
if (dbUser == null){
//登录失败:用户名或密码错误
request.setAttribute("msg","用户名或者密码错误");
return "login";
}else {
//登录成功
//将用户的信息绑定到叫做USER_SESSION的session上面去
//获取信息: .getSession().getAttribute()
request.getSession().setAttribute("USER_SESSION",dbUser);
if ("ADMIN".equals(dbUser.getRole())){
return "redirect:/admin/main.jsp";
}else {
return "redirect:/admin/index.jsp";
}
}
}
//注销方法
// @ResponseBody
@RequestMapping("/logout")
public String logout(HttpSession session){
//如果传入的参数是HttpServletRequest
//HttpSession session = request.getSession();
session.invalidate();
return "login";
}
//查询数据
@RequestMapping(value = "/findById")
@ResponseBody
public Result<User> findUserById(Integer id){
User user = userService.finUserById(id);
System.out.println(user);
return new Result<>(true,"",user);
}
//添加用户
@RequestMapping("/addUser")
@ResponseBody
public Result addUser(User user){
Integer num = userService.addUser(user);
if (num>0){
//操作成功
return new Result(true,"新增成功");
}else {
//操作失败
return new Result(false,"新增失败");
}
}
@RequestMapping("/editUser")
@ResponseBody
public Result editUser(User user){
Integer num = userService.editUser(user);
if (num>0){
//操作成功
return new Result(true,"修改成功");
}else {
//操作失败
return new Result(false,"修改失败");
}
}
@RequestMapping("/delUser")
@ResponseBody
public Result delUser(User user){
Integer num = userService.delUser(user);
if (num>0){
return new Result(true,"离职成功");
}else {
return new Result(false,"修改失败");
}
}
@RequestMapping("/search")
@ResponseBody
public ModelAndView searchUsers(User user,Integer pageNum,Integer pageSize,HttpServletRequest request){
ModelAndView modelAndView = new ModelAndView();
//前端是否传递pageNum,pageSize的值
if (pageNum==null){
pageNum=1;
}
if (pageSize==null){
pageSize=10;
}
//查询数据
PageResult pageResult = userService.searchUsers(user,pageNum,pageSize);
//数据
//将查询的数据参数返回到页面,用于回显查询的输入框中
//查询的参数:name、id这两个参数绑定在user对象
modelAndView.setViewName("user");
//user是根据user.jsp页面来的
modelAndView.addObject("user",user);
//将查询出的数据放到modelAndView对象中去
modelAndView.addObject("pageResult",pageResult);
//将当前页码返回到页面
modelAndView.addObject("pageNum",pageNum);
//将分页插件页码变化时的url返回到页面中-->gourl
modelAndView.addObject("gourl",request.getRequestURI());
return modelAndView;
}
}
图书管理模块
package com.xiaohe.controller;
import com.xiaohe.entity.PageResult;
import com.xiaohe.entity.Result;
import com.xiaohe.pojo.Book;
import com.xiaohe.pojo.User;
import com.xiaohe.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* @version v1.0.0
* @belongsProject: SSMBooks
* @belongsPackage: com.xiaohe.controller
* @author: xiaohe
* @description: BookController
* @createTime: 2023-06-19 14:35
*/
@Controller
@RequestMapping("/book")
public class BookController {
@Autowired
private BookService bookService;
@RequestMapping("/selectNewbooks")
public ModelAndView selectNewBooks(){
ModelAndView modelAndView = new ModelAndView();
int pageNum=1;
int pageSize=6;
PageResult pageResult = bookService.selectNewBooks(pageNum,pageSize);
modelAndView.addObject("pageResult",pageResult);
//modelAndView
modelAndView.setViewName("books_new");
return modelAndView;
}
@ResponseBody//将java对象转化为json数据格式
@RequestMapping (value= "/findById")
public Result<Book> findBookById(Integer id){
Book book = bookService.findBookById(id);
return new Result<>(true,"",book);
}
/**
* @param book
* @param session
* @return
* HttpSession
*/
@ResponseBody
@RequestMapping("/borrowBook")
public Result borrowBook(Book book, HttpSession session){
User user = (User) session.getAttribute("USER_SESSION");
String name = user.getName();
book.setBorrower(name);
Integer num = bookService.borrowBook(book);
if (num>0){
//借阅成功
return new Result(true,"借阅成功");
}else {
//借阅失败
return new Result(false,"借阅失败");
}
}
//根据条件分页查询图书信息
@ResponseBody
@RequestMapping("/search")
public ModelAndView searchBooks(Book book, Integer pageNum, Integer pageSize, HttpServletRequest request){
ModelAndView modelAndView = new ModelAndView();
if (pageNum==null){
pageNum=1;
}
if (pageSize==null){
pageSize=10;
}
//查询出的数据
PageResult pageResult = bookService.search(book,pageNum,pageSize);
//页面
modelAndView.setViewName("books");
//数据
//将查询的数据参数返回到页面,用于回显查询的输入框中
//查询的参数:name、author、press这三个参数绑定在book对象
//search是根据book.jsp页面来的
modelAndView.addObject("search",book);
//将查询出的数据放到modelAndView对象中去
modelAndView.addObject("pageResult",pageResult);
//将当前页码返回到页面
modelAndView.addObject("pageNum",pageNum);
//将分页插件页码变化时的url返回到页面中-->gourl
modelAndView.addObject("gourl",request.getRequestURI());
return modelAndView;
}
//新增书籍
// @ResponseBody
@RequestMapping("/addBook")
// @RequiresPermission("admin.dashboard")
public Result addBook(Book book){
Integer num = bookService.addBook(book);
if (num>0){
//操作成功
return new Result(true,"新增成功");
}else {
//操作失败
return new Result(false,"新增失败");
}
}
// @ResponseBody
@RequestMapping("/editBook")
public Result editBook(Book book){
Integer num = bookService.editBook(book);
if (num>0){
//编辑成功
return new Result(true,"编辑成功");
}else {
//编辑失败
return new Result(false,"编辑失败");
}
}
@ResponseBody
@RequestMapping("/searchBorrowed")
public ModelAndView searchBorrowed(Book book,Integer pageNum,Integer pageSize,HttpServletRequest request){
ModelAndView modelAndView = new ModelAndView();
if (pageNum==null){
pageNum =1;
}
if (pageSize==null){
pageSize=10;
}
User user = (User) request.getSession().getAttribute("USER_SESSION");
modelAndView.setViewName("book_borrowed");
PageResult pageResult = bookService.searchBorrowed(book,user,pageNum,pageSize);
modelAndView.addObject("search",book);
modelAndView.addObject("pageResult",pageResult);
modelAndView.addObject("pageNum",pageNum);
modelAndView.addObject("gourl",request.getRequestURI());
return modelAndView;
}
//归还图书信息
@ResponseBody
@RequestMapping("/returnBook")
public Result returnBook(Integer id,HttpSession session){
//获取当前用户的信息
User user = (User)session.getAttribute("USER_SESSION");
// HttpServletRequest request;
// request.getSession().getAttribute("USER_SESSION");
//调用service层的方法
boolean flag = bookService.returnBook(id,user);
if (flag){
//归还成功
return new Result(true,"还书确认中,请到图书馆还书");
}else {
return new Result(false,"还书失败");
}
}
//确认归还
@ResponseBody
@RequestMapping("/returnConfirm")
public Result returnConfirm(Integer id){
boolean flag = bookService.returnConfirm(id);
if (flag){
return new Result(true,"归还确认成功");
}else {
return new Result(false,"归还确认失败");
}
}
}
借阅记录模块
package com.xiaohe.controller;
import com.github.pagehelper.Page;
import com.xiaohe.entity.PageResult;
import com.xiaohe.pojo.Record;
import com.xiaohe.pojo.User;
import com.xiaohe.service.RecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
/**
* @version v1.0.0
* @belongsProject: SSMBooks
* @belongsPackage: com.xiaohe.controller
* @author: xiaohe
* @description: RecordController
* @createTime: 2023-06-27 09:11
*/
@Controller
@RequestMapping("/record")
public class RecordController {
@Autowired
private RecordService recordService;
@RequestMapping("/searchRecords")
public ModelAndView searchRecords(Record record, Integer pageNum, Integer pageSize, HttpServletRequest request){
ModelAndView modelAndView = new ModelAndView();
if (pageNum==null){
pageNum=1;
}
if (pageSize==null){
pageSize=10;
}
User user = (User) request.getSession().getAttribute("USER_SESSION");
modelAndView.setViewName("record");
modelAndView.addObject("search",record);
PageResult pageResult = recordService.searchRecord(record,pageNum,pageSize,user);
modelAndView.addObject("pageResult",pageResult);
modelAndView.addObject("pageNum",pageNum);
modelAndView.addObject("gourl",request.getRequestURI());
return modelAndView;
}
}