外卖项目–Springboot回顾Day1

项目简单介绍和启动

前端通过nginx.exe直接启动

后端使用maven同一管理依赖版本

后端结构:

  1. -common 存放实体类
  2. -pojo 实体类,DTO(数据传输对象),VO(视图对象-返回给前端页面),POJO(普通JAVA对象-属性及对应的getter和setter方法)
  3. -sever 后端服务,Controller,Service,Mapper
1
public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO){}

后端返回的结果统一封装为Result,接受的参数为DTO

Nginx 反向代理

前端请求地址:http:// localhost/api/employee/login (默认端口80)

后端服务地址:http:// localhost/:8080/admin/employee/login

浏览器—————> Nginx ————–>Tomcat

Nginx反向代理:将前端发送的动态请求由Nginx转发到后端服务器

优点:

  1. 提高访问速度 (Nginx有缓存)

  2. 进行运载均衡:将大量的请求按照指定的方式均衡地分配给集群中的每台服务器

  3. 保证后端安全(隐藏后端地址)

Nginx策略

论调 默认
weight 权重,默认为1,权重越大,被分配的客户端请求越多
ip_hash 依据ip,每个访客可以固定访问一个后端服务器
least_conn 依据最少连接,吧把请求优先分配给连接少的服务器
url_hash 依据url分配,相同的url分配到一个后端
fair 响应时间,响应时间短的服务优先被分配

配置文件nginxconf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 80;
server_name localhost;

upstream webservers{
server 127.0.0.1:8080 weight=90 ;
#server 127.0.0.1:8088 weight=10 ;
}


# 反向代理,处理用户端发送的请求
location /user/ {
proxy_pass http://webservers/user/;
}

}

完善登录功能

问题:员工表中的密码是明文存储,安全性太低

思路:使用MD5加密

  1. 修改数据库中的明文密码
  2. 修改Java,将前端提交的代码进行MD5加密后再存储

接口文档

接口管理平台: YApi

Swagger ——- 按照约定的规范去定义接口及接口相关信息,就可以生成接口文档以及在线接口调试页面(官网https://swagger.io/)

Knife4j是为JavaMVC框架生成的Swagger生产Api文档的增强解决方案

使用方式:

  1. 导入knife4j的maven坐标
  2. 在配置中加入knife4j的相关配置
  3. 设置静态资源映射,否则接口文档无法访问
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//WebMvcConfiguration.java
/**
* 配置类,注册web层相关组件
*/
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

@Autowired
private JwtTokenAdminInterceptor jwtTokenAdminInterceptor;

/**
* 注册自定义拦截器
*
* @param registry
*/
protected void addInterceptors(InterceptorRegistry registry) {
log.info("开始注册自定义拦截器...");
registry.addInterceptor(jwtTokenAdminInterceptor)
.addPathPatterns("/admin/**")
.excludePathPatterns("/admin/employee/login");
}

/**
* 通过knife4j生成接口文档
* @return
*/
@Bean
public Docket docket() {
ApiInfo apiInfo = new ApiInfoBuilder()
.title("苍穹外卖项目接口文档")
.version("2.0")
.description("苍穹外卖项目接口文档")
.build();
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo)
.select()
.apis(RequestHandlerSelectors.basePackage("com.sky.controller"))
.paths(PathSelectors.any())
.build();
return docket;
}

/**
* 设置静态资源映射
* @param registry
*/
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}

常用注解

@Api 用在类上,例如:Controller ,表对类的说明
@ApiModel 用在类上,例如:entity,DTO,VO,表对类的用途说明
@ApiModelProperty 用在属性上,描述属性信息
@ApiOperation 用在方法上,说明方法的作用和用途