9.spring-图书管理系统

文章目录

  • 1.开发项目流程
    • 1.1开发开发
    • 1.2数据库的设计
  • 2.MySQL数据库相关代码
  • 3.构造图书结构
    • 3.1用户登录
    • 3.2图书列表
    • 3.3图书添加
    • 3.4图书删除
      • 3.4.1批量删除
    • 3.5图书查询(翻页)
  • 4.页面展示
    • 4.1登录页面
    • 4.2列表页面
    • 4.3增加图书页面
    • 4.4修改图书信息页面
  • 5.功能展示
    • 5.1增加图书信息
    • 5.2修改图书信息
    • 5.3删除单个图书
    • 5.4批量删除图书
    • 5.5翻页功能
  • 7.拓展知识
    • 7.1SpringBoot 中的mapper,service,controller,model 分别有什么用?
    • 7.2DAO层、Service层和Controller层的区别
    • 7.3 SSM系统架构
    • 7.4MySQL(关系型数据库)和mongodb(非关系型数据库)的区别
    • 7.5redis(非关系型数据库)

大家好,我是晓星航。今天为大家带来的是 相关的讲解!😀

1.开发项目流程

1.1开发开发

1.需求确认阶段:需求分析,需求评审

2.开发

1)方案设计
2)接口定义
3)开发业务代码
4)测试(自测+联调) - 和其他团队一起联合测试

3.提测阶段 - 测试人员

4.上线(发布)阶段

1.2数据库的设计

image-20240324143734595

数据库编码:

1.安装时修改

2.建表时修改

2.MySQL数据库相关代码

1.建库

create databases book_test default character set utf8mb4;

2.建表

用户表:

DROP TABLE IF EXISTS user_info;
CREATE TABLE user_info (id INT NOT NULL AUTO_INCREMENT,user_name VARCHAR(128) NOT NULL,password VARCHAR(128) NOT NULL,delete_flag TINYINT(4) NULL DEFAULT 0,create_time DATETIME DEFAULT now(),update_time DATETIME DEFAULT now() ON UPDATE now(),PRIMARY KEY(id),
UNIQUE INDEX user_name_UNIQUE (user_name ASC)) ENGINE = INNODB DEFAULT CHARACTER SET = utf8mb4 COMMENT ='用户表';

图书表:

DROP TABLE IF EXISTS book_info;
CREATE TABLE book_info (id INT(11) NOT NULL AUTO_INCREMENT,book_name VARCHAR(127) NOT NULL,author VARCHAR(127) NOT NULL,count INT(11) NOT NULL,price DECIMAL(7,2) NOT NULL,publish VARCHAR(256) NOT NULL,status TINYINT(4) DEFAULT 1 COMMENT '0-无效,1-正常,2-不允许借阅',create_time DATETIME DEFAULT noW(),update_time DATETIME DEFAULT now() ON UPDATE now(),
PRIMARY KEY (id)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;

3.插入数据检验

用户表插入数据:

-- 初始化数据
INSERT INTo user_info (user_name,PASSWORD) VALUES ("admin","admin");
INSERT INTO user_info( user_name,PASSWORD) VALUES ("zhangsan","123456");

图书表插入数据:

-- 初始化图书数据
INSERT INTO book_info (book_name,author,count,price, publish) VALUES ('活着','余华',29,22.00,'北京文艺出版社');
INSERT INTO book_info (book_name,author,count,price, publish) VALUES ('平凡的世界','路遥',5,98.56,'北京十月文艺出版社');
INSERT INTO book_info (book_name,author,count,price,publish) VALUES ('三体','刘慈欣',9,102.67,'重庆出版社');
INSERT INTO book_info (book_name,author,count,price,publish) VALUES ('金字塔原理','麦肯锡',16,178.00,'民主与建设出版社');

批量化构造数据:

INSERT INTO book_info (book_name,author,count,price,publish) VALUES ('图书2','作者2',29,22.00,'出版社2'),('图书3','作者2',29,22.00,'出版社3'),('图书4','作者2',29,22.00,'出版社4'),('图书5','作者2',29,22.00,'出版社5'),('图书6','作者2',29,22.00,'出版社6'),('图书7','作者2',29,22.00,'出版社7'),('图书8','作者2',29,22.00,'出版社8'),('图书9','作者2',29,22.00,'出版社9'),('图书10','作者2',29,22.00,'出版社10'),('图书11','作者2',29,22.00,'出版社11');
INSERT INTO book_info (book_name,author,count,price,publish) VALUES ('图书12','作者2',29,22.00,'出版社12'),('图书13','作者2',29,22.00,'出版社13'),('图书14','作者2',29,22.00,'出版社14'),('图书15','作者2',29,22.00,'出版社15'),('图书16','作者2',29,22.00,'出版社16'),('图书17','作者2',29,22.00,'出版社17'),('图书18','作者2',29,22.00,'出版社18'),('图书19','作者2',29,22.00,'出版社19'),('图书20','作者2',29,22.00,'出版社20'),('图书21','作者2',29,22.00,'出版社21');

3.构造图书结构

3.1用户登录

约定前后端交互接口

[请求]
/user/login
Content-Type:application/x-www-form-urlencoded; charset-UTF-8[参数]
name=zhangsan&password=123456[响应]
true //账号密码验证正确,否则返回false

实现服务器代码

控制层

从数据库中,根据名称查询用户,如果可以查到,并且密码一致,就认为登录成功

import com.example.demo.model.UserInfo;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.stringutils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.Restcontroller;import javax.servlet.http.HttpSession;@RequestMapping("/user")
@Restcontrnller

model层 - 存放实体类:

UserInfo.java:

package com.example.book.model;import lombok.Data;import java.util.Date;@Data
public class UserInfo {private Integer id;private String userName;private String password;private Integer deleteFlag;private Date createTime;private Date updateTime;
}

Controller层:

UserController.java:

package com.example.book.controller;import com.example.book.constant.Constants;
import com.example.book.model.UserInfo;
import com.example.book.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpSession;@RequestMapping("/user")
@RestController
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/login")public Boolean login(String userName, String password, HttpSession session){//校验参数if (!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)){return false;}//验证账号密码是否正确/*** if (userName.equals("admin")){ }  这种写法, 如果userName为null, 会报空指针异常* 开发习惯, 养成*///1. 根据用户名去查找用户信息UserInfo userInfo = userService.getUserInfoByName(userName);//2. 比对密码是否正确if (userInfo==null || userInfo.getId()<=0){return false;}if (password.equals(userInfo.getPassword())){//账号密码正确//存SessionuserInfo.setPassword("");session.setAttribute(Constants.SESSION_USER_KEY,userInfo);return true;}return false;}
}

根据用户名查用户信息,比对验证密码是否正确,账号密码正确后存Session,登录成功!

service层 - 主要是针对具体的问题的操作,把一些数据层的操作进行组合,间接与数据库打交道:

UserService.java:

package com.example.book.service;import com.example.book.mapper.UserInfoMapper;
import com.example.book.model.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserInfoMapper userInfoMapper;public UserInfo getUserInfoByName (String name) {return userInfoMapper.selectUserByName(name);}
}

Mapper层(Dao层):

UserInfoMapper.java:

package com.example.book.mapper;import com.example.book.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;@Mapper
public interface UserInfoMapper {/*** 根据用户名称查询用户信息* @param name* @return*/@Select("select * from user_info where user_name=#{name}")UserInfo selectUserByName(String name);}

3.2图书列表

可以由前端完成也可以由后端完成

前端完成:

image-20240325153145143

后端完成:

image-20240325153153208

model层 - 存放实体类:

PageResult.java:

package com.example.book.model;import lombok.Data;import java.util.List;@Data
public class PageResult<T> {/*** 当前页的记录*/private List<T> records;/*** 总记录数*/private Integer total;private PageRequest pageRequest;public PageResult(List<T> records, Integer total,PageRequest pageRequest) {this.records = records;this.total = total;this.pageRequest = pageRequest;}
}

PageRequest.java:

package com.example.book.model;import lombok.Data;@Data
public class PageRequest {/*** 当前页码*/private Integer currentPage=1;/*** 每页显示条数*/private Integer pageSize=10;private Integer offset;public Integer getOffset() {return (currentPage-1) * pageSize;}
}

controller层:

BookController.java

package com.example.book.controller;import com.example.book.model.*;
import com.example.book.service.BookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpSession;
import java.util.List;@Slf4j
@RequestMapping("/book")
@RestController
public class BookController {@Autowiredprivate BookService bookService;@RequestMapping("/getBookListByPage")public Result getBookListByPage(PageRequest pageRequest, HttpSession session){log.info("查询翻页信息, pageRequest:{}",pageRequest);
//        //用户登录校验
//        UserInfo userInfo = (UserInfo) session.getAttribute(Constants.SESSION_USER_KEY);
//        if (userInfo==null|| userInfo.getId()<=0 || "".equals(userInfo.getUserName())){
//            //用户未登录
//            return Result.unlogin();
//        }//校验成功if (pageRequest.getPageSize()<0 || pageRequest.getCurrentPage()<1){return Result.fail("参数校验失败");}PageResult<BookInfo> bookInfoPageResult = null;try {bookInfoPageResult = bookService.selectBookInfoByPage(pageRequest);return Result.success(bookInfoPageResult);}catch (Exception e){log.error("查询翻页信息错误,e:{}",e);return Result.fail(e.getMessage());}}
}

service层:

BookService.java:

package com.example.book.service;import com.example.book.enums.BookStatusEnum;
import com.example.book.mapper.BookInfoMapper;
import com.example.book.model.BookInfo;
import com.example.book.model.PageRequest;
import com.example.book.model.PageResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Slf4j
@Service
public class BookService {@Autowiredprivate BookInfoMapper bookInfoMapper;public PageResult<BookInfo> selectBookInfoByPage(PageRequest pageRequest) {if (pageRequest == null) {return null;}//获取总记录数Integer count = bookInfoMapper.count();//获取当前记录List<BookInfo> bookInfos = bookInfoMapper.selectBookInfoByPage(pageRequest.getOffset(), pageRequest.getPageSize());if (bookInfos != null && bookInfos.size() > 0) {for (BookInfo bookInfo : bookInfos) {//根据status 获取状态的定义bookInfo.setStatusCN(BookStatusEnum.getNameByCode(bookInfo.getStatus()).getName());}}return new PageResult<>(bookInfos, count, pageRequest);}/*** 添加图书** @param bookInfo* @return*/public Integer addBook(BookInfo bookInfo) {Integer result = 0;try {result = bookInfoMapper.insertBook(bookInfo);} catch (Exception e) {log.error("添加图书出错, e:{}", e);}return result;}public BookInfo queryBookInfoById(Integer id) {return bookInfoMapper.queryBookInfoById(id);}/*** 更新图书* @param bookInfo* @return*/public Integer updateBook(BookInfo bookInfo) {Integer result = 0;try {result = bookInfoMapper.updateBook(bookInfo);} catch (Exception e) {log.error("更新图书失败, e:{}", e);}return result;}public Integer batchDelete(List<Integer> ids){Integer result =0;try {result = bookInfoMapper.batchDelete(ids);}catch (Exception e){log.error("批量删除图书失败, ids:{}",ids);}return result;}
}

mapper层:

BookInfoMapper.java:

package com.example.book.mapper;import com.example.book.model.BookInfo;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper
public interface BookInfoMapper {/*** 获取当前页的信息* @param offset* @param pageSize* @return*/@Select("select * from book_info where status !=0 " +"order by id desc limit #{offset},#{pageSize}")List<BookInfo> selectBookInfoByPage(Integer offset, Integer pageSize);/*** 获取总记录数* @return*/@Select("select count(1) from book_info where status !=0")Integer count();@Insert("insert into book_info (book_name,author, count, price, publish, status) " +"values(#{bookName}, #{author}, #{count}, #{price},#{publish}, #{status})")Integer insertBook(BookInfo bookInfo);@Select("select * from book_info where id =#{id}")BookInfo queryBookInfoById(Integer id);Integer updateBook(BookInfo bookInfo);Integer batchDelete(List<Integer> ids);
}

3.3图书添加

前端代码:

image-20240326152454105

Controller层:

image-20240326152529837

service层:

image-20240326152608120

mapper层(Dao层):

image-20240326152634176

3.4图书删除

企业中很少使用delete语句
delete语句通常是在进行数据修复时才会使用

pg.测试人员进行测试,手工造一些数据,测试完成之后,这条数据就是脏数据了
这个脏数据(假数据) 没有任何价值的,需要把数据删掉,使用delete语句

逻辑删除,物理删除

image-20240326101620298

image-20240326140815832

前端代码:

image-20240326141430507 image-20240326141653479

3.4.1批量删除

image-20240326141711489

Controller层:

image-20240326141747075

service层:

image-20240326142106050

mapper层(Dao层):

image-20240326141822193

3.5图书查询(翻页)

Controller层:

image-20240326152744171

service层:

image-20240326152838700

mapper层(Dao层):

image-20240326152857339

4.页面展示

4.1登录页面

image-20240326162901803

登录失败:

image-20240326162919495

登录成功:

image-20240326162934694

4.2列表页面

image-20240326163009627

4.3增加图书页面

image-20240326163149057

image-20240326163200614

4.4修改图书信息页面

image-20240326163228825

image-20240326163238887

5.功能展示

5.1增加图书信息

image-20240326163149057

image-20240326163200614

5.2修改图书信息

image-20240326163228825
image-20240326163238887

5.3删除单个图书

image-20240326163531046

image-20240326163552634

image-20240326163612445

5.4批量删除图书

image-20240326163713219

image-20240326163726067

5.5翻页功能

image-20240326163757337

image-20240326163836758

7.拓展知识

7.1SpringBoot 中的mapper,service,controller,model 分别有什么用?

MSCM:

  1. controller - 控制层

相当于MVC的C层,controller通过service的接口来控制业务流程,也可通过接收前端传过来的参数进行业务操作。

  1. model - 数据模型层

相当于MVC的M层,存放实体类,与数据库中的属性值基本保持一致。

  1. service - 业务逻辑层

主要是针对具体的问题的操作,把一些数据层的操作进行组合,间接与数据库打交道(提供操作数据库的方法)。

要做这一层的话,要先设计接口,在实现类。

  1. mapper - 数据存储对象 (Dao)

相当于DAO层,mapper层直接与数据库打交道(执行SQL语句),接口提供给service层。

图书管理系统目录:

image-20240325144321175

7.2DAO层、Service层和Controller层的区别

image-20240324112001591

简化理解:

image-20240324112329505

图书管理系统目录:

image-20240325144321175

7.3 SSM系统架构

image-20240325143656658

7.4MySQL(关系型数据库)和mongodb(非关系型数据库)的区别

image-20240326155315647

MySQL:

image-20240326155434335

mongodb:

image-20240326155459830

7.5redis(非关系型数据库)

image-20240326162500120

感谢各位读者的阅读,本文章有任何错误都可以在评论区发表你们的意见,我会对文章进行改正的。如果本文章对你有帮助请动一动你们敏捷的小手点一点赞,你的每一次鼓励都是作者创作的动力哦!😘

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL·表的内外连接

目录 表的内连和外连 内连接 案例1&#xff1a;显示SMITH的名字和部门名 外连接 左外连接 案例2&#xff1a; 查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出来 右外连接 案例3&#xff1a;对stu表和exam表联合查询&#…

【Linux】什么是进程?

一个正在执行的程序&#xff0c;我们称之为进程。 然后我们来顺着一条线来思考。 操作系统底层是用C语言编写的&#xff0c;而我们的进程&#xff0c;它会有各种属性&#xff0c;那么各种属性就可以用一个结构体来对进程的各个属性进行描述&#xff0c;然后这个结构体里面&…

linux安装clamav病毒扫描与删除

ClamAV介绍 ClamAV是Linux操作系统一款免费的杀毒工具&#xff0c;通过命令执行病毒库升级、查找病毒和删除病毒。 安装ClamAV 方法一&#x1f4a1; Tips&#xff1a;在CentOS操作系统上安装ClamAV&#xff0c;请分别执行以下命令 yum install epel-release -y yum install cla…

Python 运筹优化11 BernoulliBandit 解读

说明 以广告点击的案例继续MultiArmed Bandit的学习。 内容 1 概要 样例假设存在5个广告&#xff0c;通过伯努利分布来模拟广告的点击可能。 adA BernoulliBandit(0.004) adB BernoulliBandit(0.016) adC BernoulliBandit(0.02) adD BernoulliBandit(0.028) adE Bern…

sipeed 的 MaixCam UART操作

发现问题 根据sipeed MaixCam官方文档 使用MaixVision会报错。 正确的接线 1&#xff0c;usb转ttl的RX和TX与sipeed MaixCam官方赠送的usb转接头反向连接&#xff0c;GND互相连接。 2&#xff0c;再用一根tpyc-c为其供电。 连接WiFi路由器 MaixCam液晶屏输入WiFi名称和密…

requestAnimationFrame请求动画帧

一、前言 在Web应用中&#xff0c;实现动画效果的方法比较多&#xff1a; CSS3&#xff1a;Transition&#xff08;过度&#xff09; / Animation&#xff08;动画&#xff09; HTML5&#xff1a;Canvas JavaScript&#xff1a;setInterval&#xff08;定时器&#xff09; /…

腾讯云服务器部署前后端服务

服务器&#xff1a;OpenCloudOS &#xff08;兼容centos8&#xff09; 后端&#xff1a;javaSpringboot 前端&#xff1a;Vue 下载jdk 1&#xff09;下载jdk11 wget https://download.java.net/openjdk/jdk11/ri/openjdk-1128_linux-x64_bin.tar.gz 2&#xff09;解压jdk …

印象笔记大师:揭秘高效管理的终极技巧,让你的信息整理事半功倍!

印象笔记&#xff08;Evernote&#xff09;是一款功能强大的笔记应用&#xff0c;它可以帮助用户记录、整理和管理各种信息。无论是工作、学习还是日常生活&#xff0c;印象笔记都能为我们提供便捷的服务。本文将全面详细地介绍印象笔记的使用技巧&#xff0c;包括基本介绍、主…

Gartner发布降低企业软件供应链安全风险指南:全球软件供应链相关法规、指南以及企业需要开展的三个方面工作

软件供应链攻击呈三位数增长&#xff0c;但很少有企业机构采取措施对这些复杂攻击的风险进行评估。安全和风险管理领导者可参考本文&#xff0c;采用三种实践来检测和预防攻击&#xff0c;保护企业机构的安全。 主要发现 虽然软件供应链攻击频繁发生&#xff0c;但其安全评估尚…

2024数维杯B题详细思路代码数学建模高质量保姆级

2024年第九届数维杯大学生数学建模挑战赛题目 B 题 生物质和煤共热解问题的研究 &#xff08;1&#xff09;基于附件一&#xff0c;请分析正己烷不溶物(INS)对热解产率&#xff08;主要 考虑焦油产率、水产率、焦渣产率&#xff09;是否产生显著影响&#xff1f;并利用图像 加…

1689 ssm社区老人危机干预系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java ssm社区老人危机干预系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主…

从RAID 0到RAID 10:全面解析RAID技术与应用

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、磁盘阵列简介 2、磁盘阵列诞生背景 3、硬件RA…