Day65-F:\硕士阶段\Java\课程资料\1、黑马程序员Java项目《苍穹外卖》企业级开发实战\sky-take-out-Git-苍穹外卖-swagger-接口文档
Git
远程仓库下不同分支有两个同名文件时的合并:报错
解决方法:打开重名文件进行修改;然后提交到暂存区
然后commit提交到本地仓库,但是此时可能无法正常提交,需要在指令后面加上-i,来解决报错
检出标签的时候需要创建一个新分支
推送标签前需要保证代码都已经保存在本地仓库(先add到缓存区,再commit -m)
检出标签(并创建该分支)之后会自动切换到新分支
IDEA中集成了Git
远程克隆
web-ai-project02这个项目名字点进去有一个“克隆仓库”
或者关闭项目重新在还没进入项目那里搞
克隆完之后idea左侧界面有一个.gitignore,表示不需要被git管理的文件(比如编译后的class文件)
*.iml表示所有以.iml结尾的都不管理
添加到暂存区的两种办法
方法一:新增任意代码,如果是git仓库的话会自动弹出是否添加到暂存区
方法二:左侧项目栏右键进入Git
没有被GIT管理或者没有加入暂存区的文件会是红色,加入之后会是绿色
提交文件commit
管理远程仓库
新版Git--Manage Remotes
添加远程仓库
删除远程仓库:只是删除关系,并不删除数据
推送仓库内容:Git--推送
提交并推送一步到位:Git--提交(下图左侧)
拉起远程仓库:Git--拉取
查看分支:点击左上角
推送分支:也是在左上角这个点击分支名字,再点击推送
合并分支:左上角这个,点击b1,点击将b1合并到master
苍穹外卖板块
调出.iml文件:在cmd中输入
F:\硕士阶段\Java\课程资料\1、黑马程序员Java项目《苍穹外卖》企业级开发实战\sky-take-out>mvn idea:module
创建Git仓库
点击
选择:创建Git仓库
选择在这层创建
第一次推送需要定义远程仓库
(DataGrip)建立数据库:localhost右键点击SQL Script,然后点击Run SQL Script
VMWare虚拟机如果不关闭(挂起也不行)会一直占用8080端口,使得程序无法运行。
苍穹外卖的前端nginx在F盘下的software
前后端联调,记得打开nginx,记得修改resource里面的yml文件
datasource:
url: jdbc:mysql://localhost:3306/sky_take_out
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 1234
JWT令牌在controller里面发放
异常类放置
- 异常类在sky—common下的exception
- 异常捕获类在sky—server下的handler
JwtProperties是配置文件的配置项,管理配置文件的,具体的配置文件是sky-server下的properties包下的yml(两个)文件,prefix说明是针对yml里面sky下的jwt下的配置
就是把定义的配置转移到yml文件中定义,后续可以通过@Autowired注解注入该配置类
生成器模式(封装数据)区别于new对象然后set封装
通过builder调用
前提是对应的类上加了@Builder注解,这里就是EmployeeLoginVO类
nginx反向代理
location /api/ 匹配所有以 /api/ 开头的请求路径
location /api/ {
proxy_pass 定义了转发的目的地
当 Nginx 接收到请求时,会去掉匹配到的 /api/,将其余部分拼接到后面的 URL
proxy_pass http://localhost:8080/admin/;
下面这行是被注释掉的负载均衡配置,暂时不生效
}
正则重写(上面那个偏新手,下面这个性能更优)
location ^~ /api/ {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://localhost:8080;
}
匹配:^~确保如果URL以/api/开头,Nginx立即处理,不理会其他配置。
重写 ( rewrite):通过正则表达式^/api/(.*)$引出/api/之后的所有内容(即$1),然后强制把请求路径改为原来/$1。此时/api/已经彻底消失了。
转发:最后转发到http://localhost:8080。
例子:访问http://localhost/api/login->转发到http://localhost:8080/login。
负载均衡
密码存储加密
TODO左侧上方有三个.点击可以查看TODO
package com.sky.service.impl;
import com.sky.constant.MessageConstant;
import com.sky.constant.StatusConstant;
import com.sky.dto.EmployeeLoginDTO;
import com.sky.entity.Employee;
import com.sky.exception.AccountLockedException;
import com.sky.exception.AccountNotFoundException;
import com.sky.exception.PasswordErrorException;
import com.sky.mapper.EmployeeMapper;
import com.sky.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeMapper employeeMapper;
/**
* 员工登录
*
* @param employeeLoginDTO
* @return
*/
public Employee login(EmployeeLoginDTO employeeLoginDTO) {
String username = employeeLoginDTO.getUsername();
String password = employeeLoginDTO.getPassword();
//1、根据用户名查询数据库中的数据
Employee employee = employeeMapper.getByUsername(username);
//2、处理各种异常情况(用户名不存在、密码不对、账号被锁定)
if (employee == null) {
//账号不存在
throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
}
//密码比对
// TODO 后期需要进行md5加密,然后再进行比对
password = DigestUtils.md5DigestAsHex(password.getBytes());
if (!password.equals(employee.getPassword())) {
//密码错误
throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
}
if (employee.getStatus() == StatusConstant.DISABLE) {
//账号被锁定
throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);
}
//3、返回实体对象
return employee;
}
}
修改的地方
//密码比对
// TODO 后期需要进行md5加密,然后再进行比对
password = DigestUtils.md5DigestAsHex(password.getBytes());
导入接口文档
YApi平台
注册了yapi邮箱是QQ邮箱,用户名David胃袋,密码是QQ密码前面三个大写字母,中间五个数字,后面三个小写字母
Swagger
接口文档在http://localhost:8080/doc.html
可以通过自己生成的接口文档来测试代码!!!
package com.sky.controller.admin;
import com.sky.constant.JwtClaimsConstant;
import com.sky.dto.EmployeeLoginDTO;
import com.sky.entity.Employee;
import com.sky.properties.JwtProperties;
import com.sky.result.Result;
import com.sky.service.EmployeeService;
import com.sky.utils.JwtUtil;
import com.sky.vo.EmployeeLoginVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* 员工管理
*/
@RestController
@RequestMapping("/admin/employee")
@Slf4j
@Api(tags = "员工相关接口")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@Autowired
private JwtProperties jwtProperties;
/**
* 登录
*
* @param employeeLoginDTO
* @return
*/
@PostMapping("/login")
@ApiOperation(value = "员工登录")
public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {
log.info("员工登录:{}", employeeLoginDTO);
Employee employee = employeeService.login(employeeLoginDTO);
//登录成功后,生成jwt令牌
Map<String, Object> claims = new HashMap<>();
claims.put(JwtClaimsConstant.EMP_ID, employee.getId());
String token = JwtUtil.createJWT(
jwtProperties.getAdminSecretKey(),
jwtProperties.getAdminTtl(),
claims);
EmployeeLoginVO employeeLoginVO = EmployeeLoginVO.builder()
.id(employee.getId())
.userName(employee.getUsername())
.name(employee.getName())
.token(token)
.build();
return Result.success(employeeLoginVO);
}
/**
* 退出
*
* @return
*/
@PostMapping("/logout")
@ApiOperation("员工退出")
public Result<String> logout() {
return Result.success();
}
}
package com.sky.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(description = "员工登录时传递的数据模型")
public class EmployeeLoginDTO implements Serializable {
@ApiModelProperty("用户名")
private String username;
@ApiModelProperty("密码")
private String password;
}
package com.sky.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "员工登录返回的数据格式")
public class EmployeeLoginVO implements Serializable {
@ApiModelProperty("主键值")
private Long id;
@ApiModelProperty("用户名")
private String userName;
@ApiModelProperty("姓名")
private String name;
@ApiModelProperty("jwt令牌")
private String token;
}
由于加上了注解所以生成的Swagger文档就变成
加在controller类上的注解@Api(tags = "员工相关接口")
加在方法上的注解@ApiOperation(value = "员工登录")
加在参数类EmployeeLoginDTO上的注解@ApiModel(description = "员工登录时传递的数据模型")
加载参数类上的username属性上的注解@ApiModelProperty("用户名")

浙公网安备 33010602011771号