Estudo de caso baseado no sistema de gerenciamento de livros de empréstimo SSM Framework-Cloud
1. Introdução ao Projeto
Conhecimento da estrutura SSM (Spring+Spring MVC+MyBatis) para implementar um sistema simples de gerenciamento de livros de empréstimos na nuvem. Durante o processo de desenvolvimento, o sistema de gerenciamento de livros de empréstimos em nuvem integrou três estruturas principais e implementou funções do sistema com base na integração das estruturas. O sistema de gerenciamento de livros de empréstimo implementa principalmente dois módulos funcionais: módulo de login do usuário e módulo de gerenciamento de livros. O módulo de login do usuário é usado principalmente para realizar login e logout do usuário; o módulo de gerenciamento de livros é usado principalmente para gerenciar livros, como recomendações de novos livros, empréstimo de livros, etc.
2. Diagrama da estrutura funcional do sistema de empréstimo em nuvem
3. Ambiente de desenvolvimento
servidor web: Tomcat 8.5.24
Kit de desenvolvimento Java: JDK 8.
Ferramentas de desenvolvimento: IntelliJ IDEA 2023.1.
Banco de dados: MySQL 8.0.25.
4. Estrutura organizacional dos arquivos de projeto do sistema de empréstimo em nuvem
• Camada de objeto persistente (camada de persistência ou camada de persistência): Esta camada consiste em diversas classes de persistência (classes de entidade).
• Camada de acesso a dados (camada DAO): Esta camada consiste em diversas interfaces DAO e arquivos de mapeamento MyBatis. O nome da interface DAO sempre termina com Mapper, e o nome do arquivo de mapeamento MyBatis deve ser igual ao nome da interface.
• Camada lógica de negócios (camada de serviço): Esta camada consiste em diversas interfaces de serviço e classes de implementação. A camada lógica é usada principalmente para implementar a lógica de negócios do sistema.
• Camada de apresentação Web: Esta camada inclui principalmente a classe Controller e a página JSP no Spring MVC.
5. Projeto de banco de dados
O sistema de gerenciamento de livros de empréstimos inclui principalmente dois módulos: login do usuário e gerenciamento de livros.O módulo de login do usuário usará a tabela do usuário e o módulo de gerenciamento de livros usará a tabela de informações do livro. Além disso, no módulo de gerenciamento de livros, após a conclusão de cada empréstimo de livros, o sistema registrará a situação do empréstimo de livros, portanto, o módulo de gerenciamento de livros também precisa de uma tabela de registro de empréstimos.
tabela de usuário
Nome da tabela (chinês) | Nome da tabela (inglês) | |||
---|---|---|---|---|
tabela de usuário | do utilizador | |||
Nome do campo | tipo | comprimento | É uma chave primária? | ilustrar |
ID do usuário | interno | 32 | sim | ID do usuário |
senha do usuário | varchar | 32 | não | nome de usuário |
senha do usuário | varchar | 32 | não | senha do usuário |
email_do_usuário | varchar | 32 | não | E-mail do usuário (conta de usuário) |
papel do usuário | varchar | 32 | não | Função de usuário (ADMIN: administrador, USUÁRIO: usuário comum) |
status do usuário | varchar | 1 | não | Status do usuário (0: normal, 1: desabilitado) |
Tabela de informações do livro
Nome da tabela (chinês) | Nome da tabela (inglês) | |||
---|---|---|---|---|
Tabela de informações do livro | livro | |||
Nome do campo | tipo | comprimento | É uma chave primária? | ilustrar |
livro_id | interno | 32 | sim | Número do livro |
nome_livro | varchar | 32 | não | título do livro |
livro_isbn | varchar | 32 | não | Número ISBN padrão do livro |
livro_press | varchar | 32 | não | editora de livros |
autor_livro | varchar | 32 | não | autor do livro |
paginação_livro | interno | 32 | não | Número de páginas do livro |
preço_livro | dobro | 32 | não | preço do livro |
livro_uploadtime | varchar | 32 | não | Tempo de estante de livros |
status_do_livro | varchar | 1 | não | Status do livro (0: disponível para empréstimo, 1: emprestado, 2: retornando, 3: removido) |
livro_emprestado | varchar | 32 | não | mutuário de livros |
livro_borrowtime | varchar | 32 | não | Reservar tempo de empréstimo |
livro_returntime | varchar | 32 | não | Tempo estimado de devolução dos livros |
Formulário de registro de empréstimo
Nome da tabela (chinês) | Nome da tabela (inglês) | |||
---|---|---|---|---|
Formulário de registro de empréstimo | registro | |||
Nome do campo | tipo | comprimento | É uma chave primária? | ilustrar |
id_registro | varchar | 32 | sim | Empréstimo de ID de registro |
nome_do_livro_registro | varchar | 32 | não | O nome do livro emprestado |
record_bookisbn | varchar | 32 | não | Número ISBN do livro emprestado |
record_borrower | varchar | 32 | não | mutuário de livros |
record_borrowtime | varchar | 32 | não | Reservar tempo de empréstimo |
record_remandtime | varchar | 32 | não | Horário de devolução do livro |
6. Exibição de alguns códigos-fonte principais
Módulo de login
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 gerenciamento 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 empréstimo
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;
}
}