不停弹窗的网站怎么做,北京做企业网站多少钱,seo是什么意思 seo是什么职位,wordpress子菜单欢迎关注个人主页#xff1a;逸狼 创造不易#xff0c;可以点点赞吗 如有错误#xff0c;欢迎指出~ 图书管理系统 创建书籍类BookInfo import lombok.Data;import java.math.BigDecimal;Data
//这个类基本上是和数据库对应起来的
public class BookInfo {private Integer id… 欢迎关注个人主页逸狼 创造不易可以点点赞吗 如有错误欢迎指出~ 图书管理系统 创建书籍类BookInfo import lombok.Data;import java.math.BigDecimal;Data
//这个类基本上是和数据库对应起来的
public class BookInfo {private Integer id;private String bookName;private String author;private Integer num;private BigDecimal price;private String publishName;private Integer status;//可以使用枚举,不建议使用Boolean类型private String statusCN;
}
需求: 1. 登录:⽤⼾输⼊账号,密码完成登录功能
2. 列表展⽰:展⽰图书3.4.1 准备⼯作 创建新项⽬,引⼊对应依赖,
根据学习的深入,系统后续其他功能也会逐步完善~ 根据需求可以得知,后端需要提供两个接⼝
1. 账号密码校验接⼝:根据输⼊⽤⼾名和密码校验登录是否通过
2. 图书列表:提供图书列表信息
用户登入UserController
接⼝定义
1. 登录接⼝ [URL] POST /user/login
[请求参数] nameadminpasswordadmin
[响应] true //账号密码验证成功 false//账号密码验证失败 import jakarta.servlet.http.HttpSession;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;RequestMapping(/user)
RestController
public class UserController {RequestMapping(/login)public Boolean login(String name, String password, HttpSession session){//1.校验参数形式//2.从数据库中校验账号和密码是否正确,但是还未学,暂且写死//3.如果正确,存储session,返回trueif(!StringUtils.hasLength(name) || !StringUtils.hasLength(password)){return false;}if(admin.equals(name) admin.equals(password)){//账号密码都正确//session的内容,取决于后面需要从session中获取什么session.setAttribute(userName,name);return true;}return false;}
}用postman测试后端接口 书架BookController
2. 图书列表展⽰
[URL] POST /book/getList
[请求参数] ⽆
[响应] 返回图书列表 [ { id: 1, bookName: 活着, author: 余华, count: 270, price: 20, publish: 北京⽂艺出版社, status: 1, statusCN: 可借阅 }, ... ] 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;
import java.util.Random;RestController
RequestMapping(/book)
public class BookController {RequestMapping(/getList)public ListBookInfo getList(){//从数据库中查询,先mock(模拟)一些数据ListBookInfo bookInfosmockData();for(BookInfo bookInfo: bookInfos){if(bookInfo.getStatus()1){bookInfo.setStatusCN(可借阅);//这里的设置是为了方便后面,但不合理,正常后端是返回数字0或1}else{bookInfo.setStatusCN(不可借阅);}}return bookInfos;}private ListBookInfo mockData() {ListBookInfo bookInfosnew ArrayList();for (int i 1; i 15; i) {BookInfo bookInfo new BookInfo();bookInfo.setId(i);bookInfo.setBookName(图书i);bookInfo.setAuthor(作者i);bookInfo.setPublishName(出版社i);bookInfo.setNum(new Random().nextInt(100));//生成100以内的随机数bookInfo.setPrice(new BigDecimal(new Random().nextInt(70)10));//10~80之间bookInfo.setStatus(i%50?0:1);bookInfos.add(bookInfo);}return bookInfos;}
}测试 测试前端浏览器,对接后端模拟的数据 应⽤分层
应⽤分层是⼀种软件开发设计思想,它将应⽤程序分成N个层次,这N个层次分别负责各⾃的职责,多个 层次之间协同提供完整的功能.根据项⽬的复杂度,把项⽬分成三层,四层或者更多层. 常⻅的MVC设计模式,就是应⽤分层的⼀种具体体现.
为什么需要应⽤分层
在最开始的时候为了让项⽬快速上线我们通常是不考虑分层的.但是随着业务越来越复杂⼤量的 代码混在⼀起会出现逻辑不清晰、各模块相互依赖、代码扩展性差、改动⼀处就牵⼀发⽽动全⾝等 问题.所以学习对项⽬进⾏分层就是我们程序员的必修课了. 如何分层(三层架构)
MVC三层架构就是把整体的系统分成了Model模型View视图和Controller 控制器三个层次也就是将⽤⼾视图和业务处理隔离开并且通过控制器连接起来很好地实现 了表现和逻辑的解耦是⼀种标准的软件分层架构。 ⽬前现在更主流的开发⽅式是前后端分离的⽅式,后端开发⼯程师不再需要关注前端的实现,所以对 于Java后端开发者,⼜有了⼀种新的分层架构:把整体架构分为表现层、业务逻辑层和数据层.这种分层 ⽅式也称之为三层架构.
1. 表现层: 就是展⽰数据结果和接受⽤⼾指令的是最靠近⽤⼾的⼀层2. 业务逻辑层 :负责处理业务逻辑,⾥⾯有复杂业务的具体实现3. 数据层: 负责存储和管理与应⽤程序相关的数据
可以看到,咱们前⾯的代码,并不符合这种设计思想,⽽是所有的代码堆砌在⼀起 Spring MVC在后端开发角度把代码分为三个部分:
请求处理,响应数据: 负责,接收页面的请求,给页面响应数据逻辑处理: 负责业务逻辑处理的代码数据访问: 负责业务数据的维护操作,包括增删改查等操作
Controller:控制层. 接收前端发送的请求,对请求进行处理,并响应数据
Service:业务逻辑层,处理具体的业务逻辑
Dao:数据访问层,也称为持久层,负责数据访问操作,包括数据的增删查改.
MVC强调的是数据与模型的分离
三层架构强调的是数据的处理,两者的目的都是解耦,代码分层
MVC和三层架构的区别和联系
关于⼆者的关系,⼀直存在不同的观点.有⼈认为三层架构是MVC模式的⼀种实现,也有⼈认为MVC是 三层架构的替代⽅案,等等各种说法都有.根本原因是⼤家站在不同的⻆度来看待这个问题的.
从概念上来讲,⼆者都是软件⼯程领域中的架构模式.
MVC架构模式由三部分组成,分别是: 模型(Model),视图(View)和控制器(Controller).三层架构将业务应⽤划分为: 表现层,业务逻辑层,数据访问层. ⼆者其实是从不同⻆度对软件⼯程进⾏了抽象.
MVC模式强调数据和视图分离,将数据展⽰和数据处理分开,通过控制器对两者进⾏组合. 三层架构强调不同维度数据处理的⾼内聚和低耦合,将交互界⾯,业务处理和数据库操作的逻辑分开.
⻆度不同也就谈不上互相替代了在⽇常的开发中可以经常看到两种共存的情况⽐如我们设计模型 层的时候往往也会拆分出业务逻辑层Service层和数据访问层Dao层。
但是⼆者的⽬的是相同的,都是解耦分层代码复⽤
软件设计原则⾼内聚低耦合. 应⽤分层的好处
• 降低层与层之间的依赖,结构更加的明确,利于各层逻辑的复⽤
• 开发⼈员可以只关注整个结构中的其中某⼀层,极⼤地降低了维护成本和维护时间
• 可以很容易的⽤新的实现来替换原有层次的实现
• 有利于标准化
代码重构
使⽤上⾯的分层思想,来对代码进⾏改造
1. 先创建对应的包路径,并把代码移到对应的⽬录 代码拆分
控制层:接收前端发送的请求对请求进⾏处理并响应数据
package com.example.demo.controller;import com.example.demo.model.BookInfo;
import com.example.demo.service.BookService;
import org.springframework.web.bind.annotation.PostMapping;
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;
import java.util.Random;RestController
RequestMapping(/book)
public class BookController {PostMapping(/getList)public ListBookInfo getList(){BookService bookService new BookService();ListBookInfo bookInfos bookService.getBookList();return bookInfos;}
}业务逻辑层:处理具体的业务逻辑。
package com.example.demo.service;import com.example.demo.dao.BookDao;
import com.example.demo.model.BookInfo;import java.util.List;public class BookService {public ListBookInfo getBookList(){BookDao bookDao new BookDao();ListBookInfo bookInfos bookDao.mockData();for(BookInfo bookInfo : bookInfos){if(bookInfo.getStatus() 1){bookInfo.setStatusCN(可借阅);}else{bookInfo.setStatusCN(不可借阅);}}return bookInfos;}
}数据访问层:负责数据访问操作包括数据的增、删、改、查
package com.example.demo.dao;import com.example.demo.model.BookInfo;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class BookDao {public ListBookInfo mockData() {ListBookInfo bookInfos new ArrayList();for(int i 1; i 15; i){BookInfo bookInfo new BookInfo();bookInfo.setId(i);bookInfo.setBookName(图书i);bookInfo.setAuthor(作者i);bookInfo.setPublishName(出版社i);bookInfo.setNum(new Random().nextInt(100));//生成100以内的随机数bookInfo.setPrice(new BigDecimal(new Random().nextInt(70)10));//10~80之间bookInfo.setStatus(i%50?0:1);bookInfos.add(bookInfo);}return bookInfos;}
}