苍穹外卖学习笔记(一)

2024-09-07 17:04
文章标签 学习 笔记 外卖 苍穹

本文主要是介绍苍穹外卖学习笔记(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 开发环境搭建
    • 一. 前端环境搭建
    • 二. 后端环境搭建
      • 1.进入idea项目
      • 2.提交git仓库(+推送github远程仓库)
      • 3.数据库环境搭建
      • 4.前后端联调(在源代码中项目已经实现登录功能)
        • nginx反向代理好处:
    • 三. 完善登录功能(md5加密存储)
      • 1.首先打开pojo模块中实体类的employee,添加salt字段
      • 2.在数据库中employee表新建一个salt字段,注意得是字符串类型
      • 3.修改EmployeeServiceImpl类,添加加密处理
  • 接口文档的导入
  • 基于Swagger的Knife4j
    • Swagger常用注解​
      • @Tag
      • @Schema
      • @Content
      • @Hidden
      • @Operation
      • @Parameter
      • @Parameters
      • @RequestBody

开发环境搭建

首先把资料下载,网盘链接:黑马程序员苍穹外资料链接

鉴于很多Windows的朋友没有下载百度网盘客户端或者出现打不开、登录不上的问题,在这里推荐大家使用Tampermonkey+IDM 的脚本管理器方式下载

  1. 首先在浏览器中下载Tampermonkey拓展
    在其添加脚本中下载网盘直链下载助手

  2. 下载多线程下载器IDM(并且下载使用浏览器扩展)
    IDM 全称为 Internet Download Manager,仅支持 Windows 平台,Mac 平台可使用 NDM 代替。

    1. 打开 IDM 选项,将自己的浏览器加入 IDM 的捕获列表中。
    2. 把要支持 IDM 下载的后缀名添加到 IDM 选项 -> 文件类型里。
      后缀:
    3GP 7Z AAC ACE AI AIF ALZ APK APP APPX APPXBUNDLE ARC ARJ ASF AVI BH BIN BR BUNDLE BZ BZ2 CDA CSV DIF DLL DMG DOC DOCX EGG EPS EXE FLV GZ GZIP IMG IPA ISO ISZ JAR KEXT LHA LZ LZH LZMA M4A M4V MDB MID MKV MOV MP3 MP4 MPA MPE MPEG MPG MSI MSIX MSIXBUNDLE MSU MUI OGG OGV PDF PKG PPT PPTX PSD PST PUB QT R0* R1* RA RAR RM RMVB RTF SEA SIT SITX SLDM SLDX TAR TBZ TBZ2 TGZ TIF TIFF TLZ TXZ UDF VOB VSD VSDM VSDX VSS VSSM VST VSTM VSTX WAR WAV WBK WIM WKS WMA WMD WMS WMV WMZ WP5 WPD WPS XLS XLSX XPS XZ Z ZIP ZIPX ZPAQ ZSTD
    

    20240906210957

  3. 打开网页版百度网盘就可以下载了

一. 前端环境搭建

前端工程基于nginx部署
注意:必须将nginx相关代码存放到英文目录下,否则nginx不能启动

启动之后打开浏览器搜索locatehost即可

鉴于之后要经常使用它,我能可以使用edge浏览器的应用功能,将该网站作为应用安装,快速使用
20240906211803
如图:
20240906211822

二. 后端环境搭建

后端工程基于Maven分模块开发构建该spring项目

1.进入idea项目

用idea打开项目在pom.xml文件中引入依赖

20240906212410

直接clean然后install即可
20240906212527

该项目结构比较简单,就是一个父工程聚合三个子模块的单体架构,可以说是当前主流的前后端中的必过项目了

这里对具体项目结构不再详细阐述

2.提交git仓库(+推送github远程仓库)

具体配置idea的github远程仓库这里不再描述

20240906213621

3.数据库环境搭建

复制sky.sql代码到数据库控制台中运行即可
20240906214205

共有11张表
20240906214258

4.前后端联调(在源代码中项目已经实现登录功能)

具体流程如下:
20240906214532

启动之前先使用maven工具中compile进行编译
20240906214641

注意在这里把数据库配置改成自己的
20240906215125

启动项目:
20240906214750

运行结果:
20240906215220

nginx反向代理好处:
  1. 提高访问速度
  2. 进行负载均衡
  3. 保证后端服务安全
  4. 解决跨域问题

三. 完善登录功能(md5加密存储)

思路:

  1. 将密码加密后存储,提高安全性
  2. 使用md5加密方式对明文密码加密

视频中是直接使用了DigestUtils中的MD5加密来提高安全性,鉴于MD5现在已经有点不太安全,市面上已经有了破解的方法,这里使用MD5加盐处理来进一步提高安全性

由于前端问题,这里不再提高注册的方法,直接自创一个类把需要的盐和加密后的密码获取,手动输入到数据库中对应字段

// 生成一个新的盐值
private static final SecureRandom RANDOM = new SecureRandom();
//随机数生成器
private static final int SALT_LENGTH = 16;//盐的长度String salt = generateSalt();// 使用生成的盐值对密码进行加密
String password = "123456";
String hashedPassword = hashPassword(password, salt);// 打印生成的盐值和加密后的密码
System.out.println("Salt: " + salt);
System.out.println("Hashed Password: " + hashedPassword);// 生成盐的方法
private String generateSalt() {byte[] salt = new byte[SALT_LENGTH];RANDOM.nextBytes(salt);return Base64.getEncoder().encodeToString(salt);
}// 对密码进行加密的方法
private String hashPassword(String password, String salt) {String saltedPassword = salt + password;return DigestUtils.md5DigestAsHex(saltedPassword.getBytes());
}

登录验证问题

1.首先打开pojo模块中实体类的employee,添加salt字段

package com.sky.entity;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
import java.time.LocalDateTime;@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Employee implements Serializable {private static final long serialVersionUID = 1L;private Long id;private String username;private String name;private String password;private String phone;private String sex;private String idNumber;private Integer status;//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime createTime;//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime updateTime;private Long createUser;private Long updateUser;private String salt;}

2.在数据库中employee表新建一个salt字段,注意得是字符串类型

20240907142934

3.修改EmployeeServiceImpl类,添加加密处理

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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;import java.util.Base64;import java.security.SecureRandom;@Slf4j
@Service
public class EmployeeServiceImpl implements EmployeeService {@Autowiredprivate EmployeeMapper employeeMapper;private static final SecureRandom RANDOM = new SecureRandom();//随机数生成器private static final int SALT_LENGTH = 16;//盐的长度/*** 员工登录** @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);}//密码比对//对前端传来的密码进行md5加盐处理,然后再进行比对String salt = employee.getSalt();//盐String hashedPassword = hashPassword(password, salt);//加密后的密码if (!hashedPassword.equals(employee.getPassword())) {//密码错误throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);}if (employee.getStatus() == StatusConstant.DISABLE) {//账号被锁定throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);}//3、返回实体对象return employee;}//对密码进行加密private String hashPassword(String password, String salt) {String saltedPassword = salt + password;return DigestUtils.md5DigestAsHex(saltedPassword.getBytes());}
}

然后就可以登录成功了

接口文档的导入

这里使用apifox软件来导入
导入时选择YApi的json格式来导入
20240907143439

具体如下:
20240907143544

基于Swagger的Knife4j

使用方式:

  1. 导入Knife4j的Maven坐标
  2. 在配置类中加入Knife4j相关配置
  3. 设置静态资源映射,否则接口文档页面无法访问

具体代码在server中配置文件WebMvcConfiguration类中

/*** 通过knife4j生成接口文档* @return*/@Beanpublic 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/");}

运行项目后在浏览器输入http://localhost:8080//doc.html即可进入
20240907144202

配置apifox中环境变量
20240907144719

调试:
20240907144741

可以成功

Swagger常用注解​

注解说明(OpenAPI3规范)

OpenApi3规范中文文档

20240907145334

@Tag

用于说明或定义的标签。

部分参数:name:名称
description:描述

@Schema

用于描述实体类属性的描述、示例、验证规则等,比如 POJO 类及属性。

部分参数:name:名称
title:标题
description:描述
example:示例值
required:是否为必须
format:属性的格式。如 @Schema(format = "email")
maxLength 、 minLength:指定字符串属性的最大长度和最小长度
maximum 、 minimum:指定数值属性的最大值和最小值
pattern:指定属性的正则表达式模式
type: 数据类型(integer,long,float,double,string,byte,binary,boolean,date,dateTime,password),必须是字符串。如 @Schema=(type="integer")
implementation :具体的实现类,可以是类本身,也可以是父类或实现的接口

@Content

内容注解。

部分参数:mediaType:内容的类型。比如:application/json
schema:内容的模型定义,使用 @Schema 注解指定模型的相关信息。
@RequestBody(content = @Content(mediaType = "application/json", schema = @Schema(implementation = User.class))) 
@PostMapping("/users")
public void createUser(User user) {// ...
}

@Hidden

某个元素(API 操作、实体类属性等)是否在 API 文档中隐藏。
如,getUserById 方法不会显示在 API 文档中

使用在实体类字段中,实现对敏感信息或不需要公开的元素进行隐藏。如:用户密码字段

@Operation

描述 API 操作的元数据信息。常用于 controller 上
部分参数:

summary:简短描述
description :更详细的描述
hidden:是否隐藏
tags:标签,用于分组API
operationId:操作的唯一标识符,建议使用唯一且具有描述性的名称
parameters:指定相关的请求参数,使用 @Parameter 注解来定义参数的详细属性。
requestBody:指定请求的内容,使用 @RequestBody 注解來指定请求的类型。
responses:指定操作的返回内容,使用 @ApiResponse 注解定义返回值的详细属性。

@Parameter

用于描述 API 操作中的参数
部分参数:

name : 指定的参数名
in:参数来源,可选 query、header、path 或 cookie,默认为空,表示忽略
ParameterIn.QUERY 请求参数
ParameterIn.PATH 路径参数
ParameterIn.HEADER header参数
ParameterIn.COOKIE cookie 参数
description:参数描述
required:是否必填,默认为 false
schema :参数的数据类型。如 schema = @Schema(type = "string")

@Parameters

包含多个 @Parameter 注解,指定多个参数。
代码参考:
包含了 param1 和 param2 两个参数

@RequestBody

API 请求的注解

description:请求信息的描述
content:请求的内容
required:是否必须
@ApiResponse
API 的响应信息。
部分参数:

responseCode:响应的 HTTP 状态码
description:响应信息的描述
content:响应的内容

这篇关于苍穹外卖学习笔记(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145638

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件