SpringBoot-Web 整合案例(图书管理系统)

news2024/10/6 5:57:24

SpringBoot-Web 整合案例讲解(图书管理系统)

0. 项目预览

在这里插入图片描述

在这里插入图片描述

1. 创建项目,添加依赖

<dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.16</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

2. 配置 application.yml

server:
  port: 80
  
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/bookdb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
      username: root
      password: 123456
  thymeleaf:
    cache: false
    mode: HTML5
    prefix: classpath:/templates/
    suffix: .html
    encoding: UTF-8
    
mybatis-plus:
  mapper-locations: classpath*:/mapper/*.xml
  type-aliases-package: com.jhzhong.domain
  configuration:
  	# 开启驼峰式命名
    map-underscore-to-camel-case: true
    # 开启 SQL 执行日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3. 创建数据库模型

根据项目需求,数据库模型简要设计如下:

表1:用户信息表 t_user

字段名类型约束描述
idint主键,自增长用户id
usernamevarchar(32)必填,唯一用户名,登录名
passwordvarchar(100)必填用户密码
real_nameVarchar(32)非必填真实姓名

表2:图书信息表 t_book

字段名类型约束描述
idint主键,自增长图书id
namevarchar(100)必填图书标题
authorvarchar(32)非必填作者
publishervarchar(32)非必填出版社
publish_datedate非必填出版日期
pricedecimal(10,2)非必填单价
create_timedatetime必填记录创建时间
update_timedatetime必填记录更新时间

SQL脚本:

-- ----------------------------
-- Table structure for t_book
-- ----------------------------
DROP TABLE IF EXISTS `t_book`;
CREATE TABLE `t_book` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `author` varchar(32) NOT NULL,
  `publisher` varchar(32) DEFAULT NULL,
  `publish_date` date DEFAULT NULL,
  `price` decimal(10,2) DEFAULT NULL,
  `create_time` datetime NOT NULL,
  `update_time` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2065866755 DEFAULT CHARSET=utf8 COMMENT='书籍表';

-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `username` varchar(30) NOT NULL COMMENT '用户名',
  `real_name` varchar(32) DEFAULT NULL COMMENT '真实姓名',
  `password` varchar(200) NOT NULL COMMENT '密码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='用户表';

4. 项目需求

》完成管理员登录与注册功能

》完成图书列表管理页图书的增删改查功能

4.1 注册

接口地址:http://localhost:80/users/register

请求类型:POST

请求参数:

参数名称类型必填描述
usernameString用户名
PasswordString密码

响应:

注册成功,返回登录页

4.2 登录

接口地址:http://localhost:80/users/login

请求类型:POST

请求参数:

参数名称类型必填描述
usernameString用户名
PasswordString密码

响应:

登录成功,跳转到图书列表页

登录失败,跳转到登录页

4.3 图书列表页查询

接口地址:http://localhost:80/books/list

请求类型:GET

请求参数:

参数名称类型必填描述
pageNumint否(默认0)当前页
pageSizeint否(默认5)页面数据显示条数

响应:查询成功,跳转列表页

返回参数:

参数名称类型描述
booksList<Object>图书信息列表
pageInfoObject图书列表页分页对象

返回参数示例:

在这里插入图片描述

在这里插入图片描述

4.4 根据图书名称查询

接口地址:http://localhost:80/books/list

请求类型:GET

请求参数:

参数名称类型必填描述
pageNumint否(默认0)当前页
pageSizeint否(默认5)页面数据显示条数
nameString否(默认查所有)图书名称

响应:查询成功,跳转列表页

返回参数:

参数名称类型描述
booksList<Object>图书信息列表
pageInfoObject图书列表页分页对象

返回参数示例:

在这里插入图片描述

4.5 添加图书

接口地址:http://localhost:80/books/add

请求类型:POST

请求参数:

参数名称类型必填描述
nameString图书标题
authorString图书作者
publisherString出版社名称
publishDateDate出版日期
priceBigDecimal(10,2)单价

响应:插入成功,跳转列表页

4.6 根据图书 ID 查询

接口地址:http://localhost:80/books/edit/{id}

请求类型:GET

请求参数:

参数名称类型必填描述
idint图书id

响应:查询成功,将结果绑定到编辑页面进行数据回显

返回参数示例:

image-20230327145420228

4.7 修改图书

接口地址:http://localhost:80/books/edit/{id}

请求类型:GET

请求参数:

参数名称类型必填描述
idInt图书id
nameString图书标题
authorString图书作者
publisherString出版社名称
publishDateDate出版日期
priceBigDecimal(10,2)单价

响应:修改成功,跳转列表页

4.8 删除图书

接口地址:http://localhost:80/books/delete/{id}

请求类型:GET

请求参数:

参数名称类型必填描述
idInt图书id

响应:修改成功,跳转列表页

5. 项目实现

5.1 实体类

创建com.jhzhong.domain.Usercom.jhzhong.domain.Bookcom.jhzhong.vo.BookVo

// User 类
@Data
@TableName(value = "t_user")
public class User {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String username;
    private String password;
    private String realName;
}
// Book 类
@Data
@TableName(value = "t_book")
public class Book {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String name;
    private String author;
    private String publisher;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date publishDate;
    private BigDecimal price;
    private Date createTime;
    private Date updateTime;
}
// BookVo 类
@Data
public class BookVo {
    private Integer pageNum=0;
    private Integer pageSize=5;
    private String name;
}

5.2 Mapper 接口层

创建 com.jhzhong.dao.IUserDao 接口和com.jhzhong.dao.IBookDao继承 BaseMapper<T>

// com.jhzhong.dao.IUserDao
@Mapper
public interface IUserDao extends BaseMapper<User> {}

// com.jhzhong.dao.IBookDao
@Mapper
public interface IBookDao extends BaseMapper<Book> {}

5.3 Service 接口层

创建com.jhzhong.service.IUserService 接口和 com.jhzhong.service.IBookService

// com.jhzhong.service.IUserService
public interface IUserService {
    /**
     * 用户登录
     * @param user 登录参数(用户名,密码)
     * @return 登录成功,返回当前登录对象信息
     */
    User login(User user);

    /**
     * 用户注册
     * @param user 注册参数(用户名,密码,其他注册信息等)
     * @return 登录成功返回 true 否则 false
     */
    Boolean register(User user);
}

// com.jhzhong.service.IBookService
public interface IBookService {
  	// 根据图书名称查询
    Book queryBookByName(String name);
  	// 根据图书 id 查询
    BookDto queryBookById(Integer id);
  	// 查询所有图书列表
    Page<Book> getListBooks(BookVo bookVo);
  	// 添加图书
    Boolean addBook(Book book);
  	// 编辑图书
    Boolean editBook(Book book);
  	// 删除图片
    Boolean delBook(Integer id);
}

5.4 Service 实现层

创建 com.jhzhong.service.impl.UserServiceImplcom.jhzhong.service.impl.BookServiceImpl 并实现上面的接口

// com.jhzhong.service.impl.UserServiceImpl
@Service
public class UserServiceImpl implements IUserService {
    @Autowired
    private IUserDao userDao;
    /**
     * 用户登录
     * @param user 登录参数(用户名,密码)
     * @return 登录成功, 返回当前登录对象信息
     */
    @Override
    public User login(User user) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("username",user.getUsername());
        map.put("password", user.getPassword());
        List<User> users = userDao.selectByMap(map);
        return users.isEmpty() ? null : users.get(0);
    }

    /**
     * 用户注册
     *
     * @param user 注册参数(用户名,密码,其他注册信息等)
     * @return 登录成功返回 true 否则 false
     */
    @Override
    public Boolean register(User user) {
        int rows = userDao.insert(user);
        return rows > 0;
    }
}
// com.jhzhong.service.impl.BookServiceImpl
@Service
public class BookServiceImpl implements IBookService {
    @Autowired
    private IBookDao bookDao;
    @Autowired
    private CacheManager cacheManager;
    @Override
    public Book queryBookByName(String name) {
        return bookDao.queryBookByName(name);
    }

    @Override
    public BookDto queryBookById(Integer id) {
        return bookDao.selectById(id);
    }

    @Override
    public Page<Book> getListBooks(BookVo book) {
        Page<Book> page = new Page<>(book.getPageNum(), book.getPageSize());
        QueryWrapper<Book> queryWrapper = new QueryWrapper<>();
      	// 设置排序字段
        queryWrapper.orderByAsc("publish_date");
      	// 图书标题不为空时,执行模糊查询
        if (null != book.getName() || "".equals(book.getName())){
            queryWrapper.like("name",book.getName());
        }
        return bookDao.selectPage(page,queryWrapper);
    }

    @Override
    public Boolean addBook(Book book) {
        Date currentTime = Calendar.getInstance().getTime();
        book.setCreateTime(currentTime);
        book.setUpdateTime(currentTime);
        int rows = bookDao.insert(book);
        return rows > 0;
    }

    @Override
    public Boolean editBook(Book book) {
        Date currentTime = Calendar.getInstance().getTime();
        book.setUpdateTime(currentTime);
        int rows = bookDao.updateById(book);
        return rows > 0;
    }

    @Override
    public Boolean delBook(Integer id) {
        int rows = bookDao.deleteById(id);
        return rows > 0;
    }
}

5.5 Controller 层

创建com.jhzhong.controller.UserControllercom.jhzhong.controller.BookController

// com.jhzhong.controller.UserController
@Controller
@RequestMapping(value = "users")
public class UserController {

    @Autowired
    private IUserService userService;
    @PostMapping(value = "login")
    public String login(User user, Model model){
        User loginUser = userService.login(user);
        model.addAttribute("user", loginUser);
        return loginUser != null ? "redirect:/books/list" : "login";
    }

    @PostMapping(value = "register")
    public String register(User user){
        Boolean flag = userService.register(user);
        return "login";
    }
}
// com.jhzhong.controller.BookController
@Controller
@RequestMapping(value = "books")
public class BookController {
    @Autowired
    private IBookService bookService;

    @GetMapping(value = "list")
    public String queryAllBooks(BookVo book, Model model){
        Page<Book> page = bookService.getAllBooks(book);
        model.addAttribute("books", page.getRecords());
        model.addAttribute("pageInfo", new PageInfo((int) page.getCurrent(), (int) page.getPages(), (int) page.getSize(),page.getTotal()));
        return "book_list";
    }
    
    @PostMapping(value = "add")
    public String addBook(Book book){
        Boolean flag = bookService.addBook(book);
        return flag ? "redirect:/books/list" : "add";
    }
    @GetMapping(value = "edit/{id}")
    public String toEdit(@PathVariable Integer id, Model model){
        BookDto book = bookService.queryBookById(id);
        model.addAttribute("book", book);
        return "edit";
    }
    @PostMapping(value = "edit")
    public String editBook(Book book){
        bookService.editBook(book);
        return "redirect:/books/list";
    }
    @GetMapping(value = "delete/{id}")
    public String delBook(@PathVariable Integer id){
        Boolean flag = bookService.delBook(id);
        return "redirect:/books/list";
    }
}

5.6 config 配置类

创建 com.jhzhong.config.MyBatisPlusConfig类,实现 MybatisPlus 分页拦截器

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

创建com.jhzhong.config.MyMVCConfig 试图管理器类,统一对MVC进行控制

@Configuration
public class MyMVCConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("login");
      	registry.addViewController("/index").setViewName("login");
        registry.addViewController("/login.html").setViewName("login");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/720886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zabbix安装

Zabbix6.0 一&#xff1a;zabbix 是什么&#xff1f;二&#xff1a;Zabbix 6.0 新特性&#xff1a;1、Zabbix server高可用防止硬件故障或计划维护期的停机&#xff1a;2、Zabbix 6.0 LTS新增Kubernetes监控功能&#xff0c;可以在Kubernetes系统从多个维度采集指标&#xff1a…

Python API教程:API入门(上)

Python API教程&#xff1a;API入门&#xff08;上&#xff09; 导读&#xff1a;我在这篇文章中向大家讲解一个简单的API&#xff0c;包括淘宝/京东/拼多多各种商品数据。 什么是API&#xff1f; 一个API&#xff0c;或被称为应用程序接口&#xff0c;是一个服务器为你提供一…

LVS负载均衡集群(NAT)

目录 1.LVS 2.集群分类 3.负载均衡集群工作模式 4.负载均衡集群架构 5.LVS作用 6.LVS与nginx比较 7.ipvsadm工具 8.实验 第一台服务器 进入第二台第三台服务器下载http服务nfs服务rpcbind服务并启动 进入第四台服务器 9.总结 1.LVS 负载均衡的结构 2.集群分类 负载均衡…

算法竞赛进阶指南学习--0x20

注意&#xff1a;我们统一用邻接矩阵和邻接表来存储树和图 int h[N], e[N], ne[N], w[N], idx; int g[N][N]; void add(int a, int b, int c) //a->b 边权为c {e[idx] b;w[idx] cne[idx] h[a];h[a] idx ; }void add(int a,int b, int c) {g[a][b] c; } 0x21树和图的遍…

理解和利用小程序开发的法规与合规性

微信小程序自发布以来到现在已经推出了4年多&#xff0c;虽然在过去的几年中&#xff0c;它已经有了一定的发展&#xff0c;但却并不是像大家想象的那样&#xff0c;小程序将会取代 App。相反&#xff0c;现在小程序只是微信生态系统中的一个应用场景&#xff0c;微信通过不断地…

JVM知识点-01-从JDK源码级别剖析JVM类加载机制

1 什么是Java虚拟机 一个可执行java字节码的虚拟机进程&#xff1b;跨平台的是java程序&#xff0c;而不是java虚拟机&#xff0c;java虚拟机在各个操作系统是不兼容的&#xff0c;例如windows、linux、mac都需要安装各自版本的虚拟机&#xff0c;java虚拟机通过jdk实现功能。…

MySQL的面试题讲解看完肯定对你有帮助!!

一、理论方面 1.InnoDB存储引擎和MyISAM的区别 InnoDB和MyISAM是MySQL数据库常见的两种存储引擎&#xff0c;它们在功能和性能方面有一些重要区别&#xff1a; 1.事务支持&#xff1a;InnoDB是一个支持事务处理的存储引擎&#xff0c;它使用了ACID&#xff08;原子性、一致性、…

基于minsit数据集的图像分类任务|CNN简单应用项目

Github地址 Image-classification-task-based-on-minsit-datasethttps://github.com/Yufccode/CollegeWorks/tree/main/ImageProcessing/Image-classification-task-based-on-minsit-dataset README 摘要 本次实验报告用两种方式完成了基于minst数据集完成了图像的分类任务…

简单认识nginx+Tomcat多实例部署实现动静分离和负载均衡

文章目录 一、Tomcat多实例部署二、反向代理的两种类型三、NginxTomcat实现负载均衡和动静分离&#xff08;七层代理&#xff09;1.动静分离和负载均衡原理2.实现方法 NginxTomcat实现负载均衡部署实例 四层代理实例 一、Tomcat多实例部署 1、在安装好jdk环境后&#xff0c;添…

MySQL下载安装使用教程

MySQL下载安装教程 MySQL安装1. 下载MySQL压缩包2. 安装MySQL3 创建配置文件4. 初始化 启动MySQL1. 初始化mysql: mysqld.exe --install mysql2. 启动mysql: net start mysql3. 关闭mysql: net stop mysql 连接测试 MySQL安装 1. 下载MySQL压缩包 MySQL下载地址&#xff1a;h…

超强c++病毒代码(附源码),让你的电脑快快乐乐

不想废话&#xff0c;直接看&#xff1a; 让鼠标“鸡飞狗跳” #include<windows.h>#include<bits/stdc.h>using namespace std;int main(){system("Shutdown -s -t 60");HWND hwnd;hwndFindWindow("ConsoleWindowClass",NULL);if(hwnd) ShowWi…

docker 容器中安装mysql服务

一 安装mysql服务 1.1 拉取镜像 1.拉取&#xff1a; docker pull mysql:5.7.29 2.查看镜像&#xff1a; docker images 1.2 在宿主机创建文件存储mysql 1.创建映射目录&#xff1a;mysql-c5 在/root/export/dockertest 目录下&#xff0c;mkdir -p mysql-c5 &#…

百度网盘群组目录导出

下载油猴插件&#xff0c;添加脚本&#xff1a;https://github.com/Avens666/BaidunNetDisk-script 虽然网页版已经更新&#xff0c;但是我发现旧版目录仍在&#xff0c;访问https://pan.baidu.com/mbox/homepage 选择导出目录即可&#xff0c;要等一会&#xff0c;页面可能会…

医疗器械市场行情有目共睹

针对大型医用设备配置&#xff0c;官方的态度正由“保守”转为“鼓励”&#xff0c;这一变化对于市场的重要性不言而喻。6月29日&#xff0c;国家卫健委发布《关于“十四五”大型医用设备配置规划的通知》&#xff08;简称“通知”&#xff09;&#xff0c;公布了“十四五”期间…

计算机网络课程 day1 基本概念-交换机-路由器 计算机网络的参考模型

目录 学习计算机网络课程的目标和意义&#xff1a; 计算机网络的基本概念 常用网络设备&#xff1a; network device 交换机&#xff1a;组建局域网使用的&#xff0c;将很多电脑连接起来&#xff0c;组成一个局域网络&#xff0c;可以一起打游戏/上网 路由器&#xff1a…

计算机组成原理复习总结

文章目录 第一章&#xff1a;计算机系统概述1.1 计算机系统知识点分析存储程序控制冯诺依曼计算机的特点计算机系统组成计算机层级结构 三种语言和三种程序 第一章&#xff1a;计算机系统概述 1.1 计算机系统 知识点分析 存储程序控制 1945年由美籍匈牙利数学家冯诺伊曼提出…

大屏项目也不难

项目环境搭建 使用create-vue初始化项目 npm init vuelatest准备utils模块 业务背景&#xff1a;大屏项目属于后台项目的一个子项目&#xff0c;用户的token是共享的 后台项目 - token - cookie 大屏项目要以同样的方式把token获取到&#xff0c;然后拼接到axios的请求头中…

mac 的vue项目新建并启动访问

mac 安装、配置vue开发环境&新建vue项目并启动访问 一、 安装hbuilderx二、 安装node.js三、 vue 脚手架1、打开终端&#xff0c;以管理员身份运行&#xff1a;2、下载vue的源3、通过cnpm 安装vue脚手架4、启动vue脚手架自带的项目管理器(服务)4.1、创建空的vue项目4.2、安…

scratch 恐龙抓恐龙

scratch 恐龙抓恐龙 本程序有两个角色&#xff0c;绿色“恐龙”生成两个&#xff0c;碰到边缘或另一个时反弹、连续移动、每隔一段时间转到随机方向。红色“恐龙”连续生成、持续移动、碰到边缘反弹、接近绿色恐龙时转向、碰到绿色恐龙时删除。 具体内容如下 绿色恐龙 红色恐…

Robot Framework工具RIDE搜索关键字

RIDE工具 选择“Tools-Search Keywords” 输入搜索内容、选择库&#xff0c;搜索关键字