Estudio de caso basado en SSM Framework-Sistema de gestión de libros de préstamos en la nube
1. Introducción al proyecto
Conocimiento del marco SSM (Spring+Spring MVC+MyBatis) para implementar un sistema simple de gestión de libros de préstamos en la nube. Durante el proceso de desarrollo, el sistema de gestión de libros de préstamos en la nube integró tres marcos principales e implementó funciones del sistema basadas en la integración de los marcos. El sistema de gestión de libros en préstamo implementa principalmente dos módulos funcionales principales: módulo de inicio de sesión de usuario y módulo de gestión de libros. El módulo de inicio de sesión de usuario se utiliza principalmente para realizar el inicio de sesión y cierre de sesión del usuario, y el módulo de gestión de libros se utiliza principalmente para gestionar libros, como recomendaciones de libros nuevos. , préstamo de libros, etc.
2. Diagrama de estructura funcional del sistema de préstamos en la nube
3. Entorno de desarrollo
servidor web: Tomcat 8.5.24
Kit de desarrollo Java: JDK 8.
Herramientas de desarrollo: IntelliJ IDEA 2023.1.
Base de datos: MySQL 8.0.25.
4. Estructura organizativa de los archivos de proyecto del sistema de préstamos en la nube.
• Capa de objeto persistente (capa de persistencia o capa de persistencia): Esta capa consta de varias clases de persistencia (clases de entidad).
• Capa de acceso a datos (capa DAO): Esta capa consta de varias interfaces DAO y archivos de mapeo MyBatis. El nombre de la interfaz DAO siempre termina en Mapper y el nombre del archivo de mapeo MyBatis debe ser el mismo que el nombre de la interfaz.
• Capa de lógica empresarial (capa de servicio): esta capa consta de varias interfaces de servicio y clases de implementación. La capa lógica se utiliza principalmente para implementar la lógica empresarial del sistema.
• Capa de presentación web: esta capa incluye principalmente la clase Controlador y la página JSP en Spring MVC.
5. Diseño de base de datos
El sistema de gestión de libros de préstamo incluye principalmente dos módulos: inicio de sesión de usuario y gestión de libros: el módulo de inicio de sesión de usuario utilizará la tabla de usuarios y el módulo de gestión de libros utilizará la tabla de información del libro. Además, en el módulo de gestión de libros, una vez completado cada préstamo de libros, el sistema registrará el estado del préstamo de libros, por lo que el módulo de gestión de libros también necesita una tabla de registro de préstamos.
tabla de usuarios
Nombre de la tabla (chino) | Nombre de la tabla (inglés) | |||
---|---|---|---|---|
tabla de usuarios | usuario | |||
Nombre del campo | tipo | longitud | ¿Es una clave primaria? | ilustrar |
ID_usuario | En t | 32 | Sí | identificación de usuario |
contraseña de usuario | varchar | 32 | No | nombre de usuario |
contraseña de usuario | varchar | 32 | No | contraseña de usuario |
correo_usuario | varchar | 32 | No | Correo electrónico del usuario (cuenta de usuario) |
rol del usuario | varchar | 32 | No | Rol de usuario (ADMIN: administrador, USUARIO: usuario normal) |
Estatus de usuario | varchar | 1 | No | Estado del usuario (0: normal, 1: deshabilitado) |
tabla de información del libro
Nombre de la tabla (chino) | Nombre de la tabla (inglés) | |||
---|---|---|---|---|
tabla de información del libro | libro | |||
Nombre del campo | tipo | longitud | ¿Es una clave primaria? | ilustrar |
id_libro | En t | 32 | Sí | Número de libro |
nombre del libro | varchar | 32 | No | Titulo del libro |
libro_isbn | varchar | 32 | No | Número ISBN estándar del libro |
libro_prensa | varchar | 32 | No | editorial de libros |
autor_libro | varchar | 32 | No | autor del libro |
paginación_libro | En t | 32 | No | Número de páginas del libro |
precio_libro | doble | 32 | No | precio del libro |
libro_uploadtime | varchar | 32 | No | Tiempo en el estante del libro |
estado_libro | varchar | 1 | No | Estado del libro (0: disponible para préstamo, 1: prestado, 2: devuelto, 3: eliminado) |
prestatario de libros | varchar | 32 | No | prestatario de libros |
libro_borrowtime | varchar | 32 | No | Tiempo de préstamo de libros |
hora_devolucióndellibro | varchar | 32 | No | Tiempo estimado de devolución de los libros. |
Formulario de registro de endeudamiento
Nombre de la tabla (chino) | Nombre de la tabla (inglés) | |||
---|---|---|---|---|
Formulario de registro de endeudamiento | registro | |||
Nombre del campo | tipo | longitud | ¿Es una clave primaria? | ilustrar |
id_registro | varchar | 32 | Sí | ID de registro de préstamo |
nombre_libro_registro | varchar | 32 | No | El nombre del libro prestado. |
record_bookisbn | varchar | 32 | No | Número ISBN del libro prestado |
prestatario_registro | varchar | 32 | No | prestatario de libros |
record_borrowtime | varchar | 32 | No | Tiempo de préstamo de libros |
record_remandtime | varchar | 32 | No | Hora de devolución del libro |
6. Visualización de algunos códigos fuente principales.
Módulo de inicio de sesión
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;
}
}
Módulo de gestión de biblioteca
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,"归还确认失败");
}
}
}
Módulo de registro de préstamos
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;
}
}