苍穹外卖学习笔记(一)

文章目录

  • 开发环境搭建
    • 一. 前端环境搭建
    • 二. 后端环境搭建
      • 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.xdnf.cn/news/1527412.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux网络测试和故障排查命令

文章目录 ping 命令常用选项:使用示例:域名解析和 IP 地址响应数据停止 ping 命令统计数据延迟统计 traceroute 命令常用选项:使用示例:命令执行:路由节点详情: mtr 命令使用示例:使用结果详解输…

『功能项目』武器的切换实例【34】

本章项目成果展示 我们打开上一篇33战士的A键连击的项目, 本章要做的事情是按键盘E键切换职业时切换手中的武器 首先在资源商店下载免费的武器模型 创建一个空物体 命名为WeaponPos 将武器预制体拖拽至WeaponPos (注意调整空物体位置就可以后续文章会更…

深入解析 Dubbo 的 attachments 机制及其应用场景

背景 在分布式系统中,服务之间的调用(RPC调用)是非常常见的。而在这种服务调用过程中,常常需要在不同服务之间传递一些上下文信息,比如用户身份信息、请求追踪ID、客户端IP等。Dubbo 提供的 attachments 机制&#xf…

ffmpeg(各个系统版本安装- Windows11-Mac-Linux)

各个系统上的安装不建议使用编译安装,大佬的话可以 编译安装会各种环境问题,直接使用别人安装好的就行 1.Windows11上安装ffmpeg 1.官网下载ffmpeg 进入Download FFmpeg网址,点击下载windows版ffmpeg,使用别人编译好的版本即可 …

【C++ Primer Plus习题】12.1

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "Cow.h" u…

【NumPy】基础知识

NumPy是Python的第三方库&#xff0c;要使用需要先导入。 import numpy as np 在pycharm中可以通过np.来查看numpy的可用函数。 np.函数名? 查看对应函数的详细信息。 生成NumPy数组 ndarray 多维数组对象 numpy封装了一个新的数据类型ndarray&#xff0c;是一个多维数组对…

HTB-You know 0xDiablos

引言 项目概述&#xff1a;HTB的EASY难度 PWN靶机 You know 0xDiablos https://app.hackthebox.com/challenges/106 本文详细解释了溢出payload的结构以及为什么要这样构造&#xff0c;友好的为想要入手PWN的朋友解释了原理技术点涉及: 32位linux逆向、32位程序调用、栈溢出目…

【AcWing】851. 求最短路

spfa算法其实是对贝尔曼福特算法做一个优化。 贝尔曼福特算法会遍历所有边来更新&#xff0c;但是每一次迭代的话我不一定每条边都会更新&#xff0c;SPFA是对这个做优化。 如果说dist[b]在当前这次迭代想变小的话&#xff0c;那么一定是dist[a]变小了&#xff0c;只有a变小了…

Unity笔记:ScrollRect代码阅读

大体流程 Unity Docs - UGUI | Class ScrollRect 总的说 自身不负责Rebuild&#xff0c;设置脏之后交由LayoutRebuilder注册到CanvasUpdateRegistry里待rebuild的集合在固定时机统一Rebuild。自身只在Prelayout和Postlayout做一下数据准备和数据更新 自身的ICanvasElement.…

3.门锁_STM32_矩阵按键设备实现

概述 需求来源&#xff1a; 门锁肯定是要输入密码&#xff0c;这个门锁提供了两个输入密码的方式&#xff1a;一个是蓝牙输入&#xff0c;一个是按键输入。对于按键输入&#xff0c;采用矩阵按键来实现。矩阵按键是为了模拟触摸屏的按键输入&#xff0c;后续如果项目结束前还…

Banana Pi BPI-SM9 AI 计算模组采用算能科技BM1688芯片方案设计

产品概述 香蕉派 Banana Pi BPI-SM9 16-ENC-A3 深度学习计算模组搭载算能科技高集成度处理器 BM1688&#xff0c;功耗低、算力强、接口丰富、兼容性好。支持INT4/INT8/FP16/BF16/FP32混合精度计算&#xff0c;可支持 16 路高清视频实时分析&#xff0c;灵活应对图像、语音、自…

【数据库中级】1_DBeaver操作数据库

文章目录 一、连接数据库1.1 命令行连接数据库1.2 DBeaver工具连接数据库 二、DBeaver操作数据库2.1 通过DBeaver操作数据库2.2 通过DBeaver操作表2.3 通过DBeaver操作数据 三、DBeaver界面3.1 SQL编辑区3.2 导航区3.3 修改字体大小 一、连接数据库 1.1 命令行连接数据库 命令…

C语言 ——— 带副作用的宏参数

目录 带有副作用的代码 带有副作用的宏参数 结论 带有副作用的代码 代码演示&#xff1a; int a 10;int b a; 副作用解析&#xff1a; 变量 a 在赋值给 b 之前 a 的值自增了1&#xff0c;那么 int b a; 这条代码就带有副作用 带有副作用的宏参数 代码演示&#xff1a…

【激活函数总结】Pytorch中的激活函数详解: ReLU、Leaky ReLU、Sigmoid、Tanh 以及 Softmax

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

UniApp实现漂亮的音乐歌词滚动播放效果

在现代的音乐播放应用中&#xff0c;歌词的展示和滚动播放已经成为了一个非常常见的功能。今天&#xff0c;我们将通过UniApp来实现一个漂亮的歌词滚动播放功能。我们将使用UniApp提供的组件和API来完成这个任务。 页面结构 在页面的模板部分&#xff0c;我们需要创建一个音频…

基于MinerU的PDF解析API

基于MinerU的PDF解析API - MinerU的GPU镜像构建 - 基于FastAPI的PDF解析接口支持一键启动&#xff0c;已经打包到镜像中&#xff0c;自带模型权重&#xff0c;支持GPU推理加速&#xff0c;GPU速度相比CPU每页解析要快几十倍不等 主要功能 删除页眉、页脚、脚注、页码等元素&…

使用Python中的igraph为绘图添加标题和图例

在 igraph 中&#xff0c;可以通过添加标题和图例来增强图形的可读性和表达能力。我们可以使用 igraph.plot 函数进行绘图&#xff0c;并通过它的参数来指定标题和图例。 1、问题背景 在python中的igraph库中&#xff0c;能否为绘图添加图例和标题&#xff1f;在手册或教程中都…

Qt项目使用Inno Setup打包(关于打包中文乱码的解决)

​ 关于打包好的文件乱码解决方法 打包好的文件中文乱码&#xff0c;就是编码格式出现了问题&#xff0c;更改一下中文脚本编码格式&#xff0c;在官网Inno Setup Translations下载好中文脚本 点击下载&#xff0c;然后另存为 得到ChineseSimplified.isl.txt文件后&#…

《MaPLe: Multi-modal Prompt Learning》中文校对版

系列论文研读目录 文章目录 系列论文研读目录题目&#xff1a;《Maple&#xff1a;多模态提示学习》摘要1.简介2.相关工作视觉语言模型&#xff1a;提示学习&#xff1a;视觉语言模型中的提示学习&#xff1a; 3.方法3.1.回看CLIP编码图像&#xff1a;编码文本&#xff1a;Zero…

【H2O2|全栈】关于HTML(5)HTML基础(四)

HTML基础知识 目录 HTML基础知识 前言 准备工作 标签的具体分类&#xff08;四&#xff09; 本文中的标签在什么位置中使用&#xff1f; 表单&#xff08;一&#xff09; 表单标签 输入域标签 预告和回顾 后话 前言 本系列博客将分享HTML相关知识点。 这一期博客&…