粘合剂东莞网站建设,wordpress 调用副标题,如何做网页推广,做营销网站应该要注意些什么前言#xff1a;如果在接口的声明方法中鼠标右键没有Test的单元测试。
你的鼠标光标问题#xff1a;要在花括号范围内#xff01;#xff01;#xff01;#xff01; 数据库表是应⽤程序开发中的⼀个重要环节, 数据库表的设计往往会决定我们的应⽤需求是否能顺利实现, 甚… 前言如果在接口的声明方法中鼠标右键没有Test的单元测试。
你的鼠标光标问题要在花括号范围内 数据库表是应⽤程序开发中的⼀个重要环节, 数据库表的设计往往会决定我们的应⽤需求是否能顺利实现, 甚⾄决定我们的实现⽅式. 如何设计表以及这些表有哪些字段, 这些表存在哪些关系 也是⾮常重要的. 数据库表设计是依据业务需求来设计的. 如何设计出优秀的数据库表, 与经验有很⼤关系. 数据库表通常分两种: 实体表和关系表. 分析我们的需求, 图书管理系统相对来说⽐较简单, 只有两个实体: ⽤⼾和图书, 并且⽤⼾和图书之间没有关联关系表的具体字段设计, 也与需求有关. ⽤⼾表有⽤⼾名和密码即可(复杂的业务可能还涉及昵称, 年龄等资料) 图书表有哪些字段, 也是参考需求⻚⾯(通常不是⼀个⻚⾯决定的, ⽽是要对整个系统进⾏全⾯分析观察后定的) 一.图书管理系统引入数据库
1.引入数据库
2.添加依赖记得刷新 3.配置数据库日志 代码
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/book_test?characterEncodingutf8useSSLfalseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
mybatis:configuration:map-underscore-to-camel-case: true #配置驼峰⾃动转换log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句
# 设置⽇志⽂件的⽂件名
logging:file:name: spring-book.log 4.创建对象bookInfo 代码
package com.example.demo.model;import lombok.Data;
import java.math.BigDecimal;Data
public class BookInfo{// 图书的唯一标识符private Integer id;// 图书的名称private String bookName;// 图书的作者private String author;// 图书的某种编号或库存数量这里假设为编号private Integer count;// 图书的价格private BigDecimal price;// 出版图书的出版社名称private String publish;// 图书的借阅状态。1表示图书可借阅2表示图书不可借阅private Integer status;// 图书借阅状态的中文描述用于更直观地展示图书的借阅情况private String statusCN;private Data createTime;private Data updateTime;}5.创建对象UserInfo package com.example.demo.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;
}6.创建接口声明方法。 package com.example.demo.mapper;import com.example.demo.model.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import static org.junit.jupiter.api.Assertions.*;Slf4j
SpringBootTest
class UserInfoMapperTest {Autowiredprivate UserInfoMapper userInfoMapper;Testvoid getInfoByName() {UserInfo userInfo userInfoMapper.getInfoByName(zhangsan);log.info(查询数据:{},userInfo);}
} 1.创建用户登录的Service 代码
package com.example.demo.service;import com.example.demo.mapper.UserInfoMapper;
import com.example.demo.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 userName) {return userInfoMapper.getInfoByName(userName);}
}
2.在controller层写后端UserController逻辑 package com.example.demo.controller;import com.example.demo.model.UserInfo;
import com.example.demo.service.UserService;
import jakarta.servlet.http.HttpSession;
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;RestController
RequestMapping(/user)
public class UserController {Autowiredprivate UserService userService;RequestMapping(/login)public String login(String userName, String password, HttpSession session){if(!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)){return 用户或密码为空!;}UserInfo userInfo userService.getUserInfoByName(userName);if (userInfonull){return 用户不存在;}//用户存在, 校验密码是否正确if (!password.equals(userInfo.getPassword())){return 密码错误;}//正确的情况session.setAttribute(user_session_key,userInfo);return ok;}
}3.启动项目测试注意切换不用变成单元测试 根据数据库查看一下 二.写插入图书的后端逻辑代码
1.写插入图书的数据层接口 package com.example.demo.mapper;import com.example.demo.model.BookInfo;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;Mapper
public interface BookMapper {/*** 插入图书*/Insert(insert into book_info (book_name, author, count, price, publish, status) values (#{bookName}, #{author}, #{count}, #{price}, #{publish}, #{status}))Integer insertBook(BookInfo bookInfo);
}2.在controller中调用 代码
package com.example.demo.controller;import com.example.demo.model.BookInfo;
import com.example.demo.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.RestController;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;Slf4j
// 使用RestController注解将类标记为Spring MVC的控制器并且该类中所有方法的返回值都会自动转换为JSON或XML格式
RestController
// 使用RequestMapping注解定义该控制器中所有请求的基础URL路径
RequestMapping(book)
public class BookController {Autowiredprivate BookService bookService;/*** 添加图书*/RequestMapping(/addBook)public String addBook(BookInfo bookInfo){//校验参数log.info(添加图书, 接收到参数bookInfo: {}, bookInfo);if (!StringUtils.hasLength(bookInfo.getBookName())|| !StringUtils.hasLength(bookInfo.getAuthor())|| bookInfo.getCount()null|| bookInfo.getPrice()null|| !StringUtils.hasLength(bookInfo.getPublish())|| bookInfo.getStatus()null){return 输入参数不合法;}//添加图书try{Integer result bookService.insertBook(bookInfo);if (result 0){return ;}}catch (Exception e){log.error(添加图书异常, e: , e);}return 添加失败;}}3.调试成功 4. 编写增添图书的前端代码。 !DOCTYPE html
html langenheadmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0title添加图书/titlelink relstylesheet hrefcss/bootstrap.min.csslink relstylesheet hrefcss/add.css/headbodydiv classcontainerdiv classform-inlineh2 styletext-align: left; margin-left: 10px;svg xmlnshttp://www.w3.org/2000/svg width40fill#17a2b8 classbi bi-book-half viewBox0 0 16 16pathdM8.5 2.687c.654-.689 1.782-.886 3.112-.752 1.234.124 2.503.523 3.388.893v9.923c-.918-.35-2.107-.692-3.287-.81-1.094-.111-2.278-.039-3.213.492V2.687zM8 1.783C7.015.936 5.587.81 4.287.94c-1.514.153-3.042.672-3.994 1.105A.5.5 0 0 0 0 2.5v11a.5.5 0 0 0 .707.455c.882-.4 2.303-.881 3.68-1.02 1.409-.142 2.59.087 3.223.877a.5.5 0 0 0 .78 0c.633-.79 1.814-1.019 3.222-.877 1.378.139 2.8.62 3.681 1.02A.5.5 0 0 0 16 13.5v-11a.5.5 0 0 0-.293-.455c-.952-.433-2.48-.952-3.994-1.105C10.413.809 8.985.936 8 1.783z //svgspan添加图书/span/h2/divform idaddBookdiv classform-grouplabel forbookName图书名称:/labelinput typetext classform-control placeholder请输入图书名称 idbookName namebookName/divdiv classform-grouplabel forbookAuthor图书作者/labelinput typetext classform-control placeholder请输入图书作者 idbookAuthor nameauthor //divdiv classform-grouplabel forbookStock图书库存/labelinput typetext classform-control placeholder请输入图书库存 idbookStock namecount//divdiv classform-grouplabel forbookPrice图书定价/labelinput typenumber classform-control placeholder请输入价格 idbookPrice nameprice/divdiv classform-grouplabel forbookPublisher出版社/labelinput typetext idbookPublisher classform-control placeholder请输入图书出版社 namepublish //divdiv classform-grouplabel forbookStatus图书状态/labelselect classcustom-select idbookStatus namestatusoption value1 selected可借阅/optionoption value2不可借阅/option/select/divdiv classform-group styletext-align: rightbutton typebutton classbtn btn-info btn-lg onclickadd()确定/buttonbutton typebutton classbtn btn-secondary btn-lg onclickjavascript:history.back()返回/button/div/form/divscript typetext/javascript srcjs/jquery.min.js/scriptscriptfunction add(){$.ajax({url: /book/addBook,type: post,data: $(#addBook).serialize(),success: function(result){if(resultok){alert//添加成功alert(添加成功);location.href book_list.html;}else{alert(result);}}});}/script
/body/html 三.实现图书列表查询未完成
实现分页查询有插件这里自己实现修改太多太麻烦懒得写了 1.model定义一个类用来接受参数 代码
package com.example.demo.model;import lombok.Data;Data
public class PageRequest {private Integer pageNum;private Integer pageSize 10;private Integer offset;public Integer getOffset() {return (pageNum-1) * pageSize;}
}2.在Mapper实现接口 Select(select * from book_info limit #{offset}, #{limit})
ListBookInfo queryBookByPage(Integer offset, Integer limit); 3.在Service中写 public ListBookInfo getBookListByPage(PageRequest pageRequest){return bookMapper.queryBookByPage(pageRequest.getOffset(),pageRequest.getPageSize());} 4.在Controller写后端逻辑 使用枚举类来表示图书的状态。