蒼穹外賣-Day1 | 環境搭建、nginx、git、令牌、登錄加密、接口文檔、Swagger

目錄

nginx:

nginx反向代理和負載均衡概念

nginx反向代理和負載均衡如何配置?

后端環境:maven管理

sky-common

sky-pojo

sky-server:

后端環境搭建--Git進行版本控制

后端數據庫--Mysql

前后端聯調

前后端運行:

前后端聯調如何完成--斷點調試跟蹤代碼

斷點調試小tips:

.yml文件簡介:

YAML 的常見應用場景

令牌生成

完善登錄功能

TODO使用小tips

導入接口文檔

Swagger技術

介紹

使用方式

在線接口測試:

Swagger常用注解


nginx:

nginx學習,看這一篇就夠了:下載、安裝。使用:正向代理、反向代理、負載均衡。常用命令和配置文件,很全-CSDN博客

前端分為web端、小程序端

web端在nginx下面的html文件夾下面,nginx必須放在沒有中文目錄的環境運行

運行方法:雙擊nginx.exe,用瀏覽器打開訪問localhost,訪問端口號默認80

nginx反向代理和負載均衡概念

驗證方法:在前端頁面點擊登錄(打開F12開發者模式)可以看到前端請求地址

nginx反向代理:將前端發送的動態請求轉發到后端服務器

nginx反向代理好處:

  1. 緩存提高訪問速度,
  2. 進行負載均衡(把大量請求按照指定方式均衡的分配給集群中的每臺服務器),
  3. 保證后端服務安全

nginx反向代理和負載均衡如何配置?

反向代理主要依靠proxy_pass來配置

負載均衡的底層也是基于反向代理實現的,多配置了一些服務器server,轉發可能需要給多個后臺服務器

在這個項目中,負載均衡的配置文件在

后端環境:maven管理

sky-common

  1. constant:常量類
  2. context:上下文相關
  3. enumaration:枚舉類
  4. exception:自定義異常類
  5. json:處理json轉換
  6. properties:Springboot中的配置屬性類,把配置文件中的一些配置對象封裝
  7. result:后端返回結果
  8. utils:工具類

sky-pojo

前三項都屬于POJO(Plain Old Java Object?,簡單老式java對象),一種遵循簡單設計原則的普通 Java 類,主要用于封裝數據。

POJO 的核心特點:

  1. 無繼承要求:不需要繼承特定的類(如?Serializable?等,不過實際中為了序列化可能會實現)
  2. 無接口強制:不需要實現特定的接口
  3. 字段私有化:成員變量通常用?private?修飾
  4. 提供訪問方法:通過?public?的?getter?和?setter?方法操作字段
  5. 無業務邏輯:主要用于數據存儲,不包含復雜的業務處理方法
  6. 可包含構造方法:通常會有默認構造方法和帶參數的構造方法

sky-server:

配置文件、配置類、攔截器、controller、service、mapper、啟動類等

后端環境搭建--Git進行版本控制

在IDEA中VCS(version control system版本控制系統)新建git倉庫,上方就會出現Git相關操作按鈕。

先對號commit到本地倉庫,再箭頭push到遠程倉庫

后端數據庫--Mysql

前段時間做數據庫作業好像破壞了什么Mysql配置,啟動方式:

管理員身份運行cmd,net start mysql,再使用Navicat

前后端聯調

前后端運行:

前端雙擊nginx

后端代碼編譯:點擊compile(父工程sky-take-out整體編譯)

sky-server中運行application,運行項目

嘗試在登錄頁面前端登錄,報錯,原因沒有修改數據庫連接賬號密碼

修改之后成功登錄:

前后端聯調如何完成--斷點調試跟蹤代碼

右上角綠框可以快速運行查看啟動類,旁邊的小蟲子是debug斷點調試,

在EmployeeController類里面有login方法,打一個斷點

重新登陸

@PostMapping("/login")public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {log.info("員工登錄:{}", employeeLoginDTO);

員工登錄DTO中封裝前端試圖登錄的賬號密碼

斷點調試可以方便看到前端提供過來的數據

  1. Mapper中的sql語句,如果是簡單的查詢可以寫注解,復雜/mybatis中動態標簽通過xml配置
  2. 后面的異常處理,由全局捕獲業務異常的GlobalExceptionHandeler捕獲,類型是BaseException(父類),其他類型的異常繼承它

斷點調試小tips:

stepover單步調試(F8),resume program左側--運行至下一個斷點

ctrl + alt + b可以跳轉到光標的函數位置

.yml文件簡介:

.yml?是一種文件格式的擴展名,對應的文件類型是?YAML 文件(YAML 全稱是 "YAML Ain't Markup Language",即 “YAML 不是標記語言”)。它是一種數據序列化格式,主要用于存儲和傳輸結構化數據,語法簡潔、易讀

簡潔直觀
采用縮進(通常是空格,而非 Tab)來表示數據的層級關系,避免了 XML 或 JSON 中的大量標簽(如?<tag>)或括號(如?{}?[]),可讀性極強。
例如,一個簡單的用戶信息 YAML 配置:

user:name: Aliceage: 25hobbies:- reading- hikingcontact:email: alice@example.comphone: 123456789

YAML 的常見應用場景

  • 配置文件:很多框架(如 Spring Boot、Docker、Kubernetes、Ansible 等)默認使用 YAML 作為配置文件格式,例如 Spring Boot 的?application.yml?用于配置數據庫連接、端口號等。
  • 數據存儲:可用于存儲簡單的結構化數據(如測試數據、配置參數)。
  • API 交互:部分 API 會使用 YAML 格式傳輸數據(雖然 JSON 更常見)。
格式特點適用場景
YAML縮進表示層級,簡潔易讀,支持注釋配置文件(如 Spring Boot 配置)、人工編輯的結構化數據
JSON用括號表示層級,語法嚴格(無注釋),機器友好API 數據傳輸、前端與后端交互
XML標簽嵌套,語法繁瑣,支持復雜結構和命名空間傳統配置文件(如早期 Java 框架)、文檔標記

如圖上中的兩個是springboot的配置文件

令牌生成

JwtProperties是一個配置屬性類,在common-properties中,如下所示

package com.sky.properties;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
// 封裝了SpringBoot里面的一些配置項
@ConfigurationProperties(prefix = "sky.jwt")
@Data
public class JwtProperties {/*** 管理端員工生成jwt令牌相關配置*/private String adminSecretKey;private long adminTtl;private String adminTokenName;/*** 用戶端微信用戶生成jwt令牌相關配置*/private String userSecretKey;private long userTtl;private String userTokenName;}

其中

@ConfigurationProperties(prefix = "sky.jwt") 

是 Spring Boot 中的一個注解,用于將配置文件(如?application.yml?或?application.properties)中指定前綴的配置項,自動綁定到當前類的屬性上

  1. @ConfigurationProperties
    這是 Spring Boot 提供的核心注解,作用是 “配置屬性綁定”。它會自動讀取配置文件中的內容,并將符合規則的配置值賦值給類中的成員變量。

  2. prefix = "sky.jwt"
    prefix?表示 “配置前綴”,指定了要讀取的配置項的共同前綴。
    這意味著:Spring 會去配置文件中尋找所有以?sky.jwt?開頭的配置項,然后與當前類的屬性進行匹配綁定。

所以在aplication.yml中找到下面這一段,會被綁定到JwtProperties類的屬性上

sky:jwt:# 設置jwt簽名加密時使用的秘鑰admin-secret-key: itcast# 設置jwt過期時間admin-ttl: 7200000# 設置前端傳遞過來的令牌名稱admin-token-name: token

可以看到和上面一一對應

生成jwt令牌在EmployeeController

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 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
public class EmployeeController {@Autowiredprivate EmployeeService employeeService;@Autowiredprivate JwtProperties jwtProperties;/*** 登錄** @param employeeLoginDTO* @return*/@PostMapping("/login")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());// jwt令牌String token = JwtUtil.createJWT(jwtProperties.getAdminSecretKey(),jwtProperties.getAdminTtl(),claims);// 需要傳遞給前端的信息,用VO進行封裝EmployeeLoginVO employeeLoginVO = EmployeeLoginVO.builder().id(employee.getId()).userName(employee.getUsername()).name(employee.getName()).token(token).build();return Result.success(employeeLoginVO);}/*** 退出** @return*/@PostMapping("/logout")public Result<String> logout() {return Result.success();}}

其中EmployeeLoginVO如下所示

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;}

完善登錄功能

問題:密碼在數據庫明文存儲,安全性低?

TODO使用小tips

導入接口文檔

教程使用Yapi,這個網站現在無法使用

嘗試使用ApiPost失敗,于是嘗試apifox,導入類型選擇Yapi,可以成功導入

Swagger技術

介紹

可以幫助后端生成接口文檔,并進行在線調試

?

使用方式

Bean注解:使用Spring框架創建并管理對象

在server的config類下面

package com.sky.config;import com.sky.interceptor.JwtTokenAdminInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;/*** 配置類,注冊web層相關組件*/
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {@Autowiredprivate JwtTokenAdminInterceptor jwtTokenAdminInterceptor;/*** 注冊自定義攔截器** @param registry*/protected void addInterceptors(InterceptorRegistry registry) {log.info("開始注冊自定義攔截器...");registry.addInterceptor(jwtTokenAdminInterceptor).addPathPatterns("/admin/**").excludePathPatterns("/admin/employee/login");}/*** 通過knife4j生成接口文檔* @return*/@Beanpublic Docket docket() {log.info("準備生成接口文檔...");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) {log.info("開始設置靜態資源映射...");registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");}
}

由于上面配置的靜態資源映射,將后端接口文檔映射到localhost:8080/doc.html

  • 如果不設置靜態資源映射,SpringMVC會以為在請求某一個controller,是動態請求
  • 如果掃描包的名字寫錯了,就無法正確掃描生成動態接口文檔

訪問即可查看該接口文檔

knife4j為此動態生成接口文檔

目前已經有的兩個接口是解析下面的類生成的

/*** 員工管理*/
@RestController
@RequestMapping("/admin/employee")
@Slf4j
public class EmployeeController {@Autowiredprivate EmployeeService employeeService;@Autowiredprivate JwtProperties jwtProperties;/*** 登錄** @param employeeLoginDTO* @return*/@PostMapping("/login")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")public Result<String> logout() {return Result.success();}}

在線接口測試:

Swagger常用注解

在EmployeeController里面加入相關注解之后

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95008.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95008.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95008.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

論文閱讀-ZeroDCE和ZeroDCE++

文章目錄1 概述2 模塊2.1 總體說明2.2 LE曲線&#xff08;Light Enhance Curve&#xff09;2.3 DCE-Net2.4 無監督損失2.4.1 空間一致性損失2.4.2 曝光控制損失2.4.3 顏色恒定損失2.4.4 照明平滑度損失2.5 ZeroDCE3 效果3.1 不同損失函數組合的效果3.2 參數設置影響3.3 訓練數據…

Web自動化技術選擇

我想學習自動化技術&#xff0c;我的訴求是&#xff1a; 1.我想做自動報社保功能&#xff0c;先從我們自己的系統里面下載Excel&#xff0c;然后自動登錄到社保局的系統&#xff0c;自動填寫Excel&#xff0c;自動上傳Excel。 2.可以自動的到社保局的系統里面查下數據&#xff…

【celeba】-數據集的介紹

CelebA 數據集在 MTCNN 中的使用 1 數據集結構 CelebA_副本/ ├── Anno/ │ ├── list_bbox_celeba.txt # 邊界框 │ ├── list_landmarks_celeba.txt # 5 關鍵點 │ ├── list_attr_celeba.txt # 40 屬性 │ └── identity_CelebA.txt …

解讀 GPT-5:從“博士級 AI 專家”能力到 OpenAI API Key 獲取與實踐(提示工程→性能調優全流程)

GPT-5深度解讀&#xff1a;一位“博士級專家”的誕生與思考第一部分&#xff1a;新范式——化繁為簡的統一智能體 OpenAI的GPT-5&#xff0c;遠不止是一次常規的模型升級。它的發布&#xff0c;標志著一種顛覆性的架構思想變革&#xff1a;從過去那個讓用戶在各種“Turbo”、“…

8.3.1 注冊服務中心Etcd

etcd是什么 etcd 是一個分布式鍵值對存儲&#xff0c;設計用來可靠而快速的保存關鍵數據并提供訪問。通過分布式鎖&#xff0c; leader選舉保障可靠的分布式協同。 etcd 特點 完全復制&#xff0c;集群中的每個節點均擁有全量數據 強一致性&#xff0c;etcd通過raft共識算法…

異或循環冗余

異或代碼CRC8-ITU例程比較計算CRC16異或改進測試重點代碼 def fun_crc(datas):crc 0xFF poly 0x07 for i in range(len(datas)):for j in range(7, -1, -1):if (crc & 0x80) 0x80: crc (crc << 1) ^ polyelse:crc (crc << 1)if (datas[i] & 2**j):#值…

一款輕量、免費、無廣告,強大的演示工具,支持屏幕放大、涂鴉、截圖、錄屏

軟件介紹 ZoomIt&#xff0c;是一款輕量、免費、無廣告&#xff0c;強大的演示工具&#xff0c;支持屏幕放大、涂鴉、截圖、錄屏等。在系統托盤中不顯示的運行&#xff0c;可自定義快捷鍵&#xff0c;使用方面。 軟件基礎功能 屏幕放大&#xff1a;按下快捷鍵“Ctrl1”可進入…

從街亭失守看管理

最近看了《三國演義》&#xff0c;重溫了街亭失守事件&#xff0c;從馬謖最耀眼的登場來看就是&#xff0c;火燒藤甲兵計策和諸葛亮不謀而合&#xff0c;說明馬謖確實是有真材實料的&#xff0c;但在守街亭的任務上&#xff0c;諸葛亮也躊躇過又對先帝的遺言“馬謖不可重用”記…

全面解析 URL 重定向原理:從協議、實現到安全實踐

一、什么是 URL 重定向&#xff1f; URL 重定向&#xff08;URL Redirection&#xff09;是 Web 技術中一種將用戶請求的 URL 自動轉向另一個目標 URL 的機制。用戶可能完全不會察覺跳轉發生&#xff0c;因為瀏覽器在幕后完成了一切。 重定向通常用于以下場景&#xff1a; 網…

多任務 Transformer 模型的高效任務間注意力

抽象 在計算機視覺和更廣泛的深度學習領域&#xff0c;Transformer 架構已被公認為許多應用程序的最先進技術。然而&#xff0c;對于多任務學習&#xff0c;與單任務模型相比&#xff0c;可能需要更多的查詢&#xff0c;考慮到實際的硬件限制&#xff0c;它的多頭注意力通常接近…

QT的常用控件說明

文章目錄基本的代碼的模板Label控件font字體相關Button 控件CheckBox 控件Radio控件ComboBox控件LineEdit 控件基本的代碼的模板 class MainWindow(QWidget):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs) # 調用父類初始化方法# 聲明窗口實例# 代…

5Python異常處理與模塊導入全指南

目錄 什么是異常&#xff1f; 異常的捕獲方法&#xff1a; 為什么要捕獲異常&#xff1f; 捕獲異常的語法&#xff1a; 異常的else和finally語法&#xff1a; 什么是異常&#xff1f; 異常就是程序運行過程中出現了錯誤&#xff0c;也就是我們常說的出bug了-。- 異常的捕…

區塊鏈密碼學簡介

區塊鏈密碼學簡介 一、對稱密碼算法 概述 對稱密碼算法的主要特點是使用相同的密鑰進行加密和解密。這類算法根據其加密方式大致可以分為兩類:流密碼和分組密碼。區塊鏈技術主要采用分組密碼。流密碼以數據流的形式逐位或逐字節加密,而分組密碼則將數據分成固定大小的塊進行…

GridKernalGateway

GridKernalGateway 是 Apache Ignite 架構中一個關鍵的安全與狀態管理組件&#xff0c;它的作用是 “在公共 API 和內部內核&#xff08;kernal&#xff09;之間建立安全、可控的訪問通道”。 我們可以把它理解為一個 “門衛 狀態哨兵”&#xff0c;確保外部調用不會在 Ignite…

MySQL索引、B+樹相關知識總結

MySQL索引、B樹相關知識匯總一、有一個查詢需求&#xff0c;MySQL中有兩個表&#xff0c;一個表1000W數據&#xff0c;另一個表只有幾千數據&#xff0c;要做一個關聯查詢&#xff0c;如何優化&#xff1f;1、為關聯字段建立索引2、小表驅動大表二、b樹和b樹的區別1、更高的查詢…

Java學習進階 -- 泛型的繼承和通配符及綜合練習

首先&#xff0c;泛型不具備繼承性&#xff0c;但是數據具備繼承性1.核心概念解析泛型不具備繼承性即使類型A是類型B的子類&#xff0c;Generic<A>也不是Generic<B>的子類這是Java泛型的類型安全設計&#xff0c;防止不安全的類型轉換數據具備繼承性泛型容器中的元…

如何實現在多跳UDP傳輸場景,保證單文件和多文件完整傳輸的成功率?

如何實現在多跳UDP傳輸場景&#xff0c;保證單文件和多文件完整傳輸的成功率&#xff1f; 一、前言 UDP&#xff08;User Datagram Protocol&#xff09;是一個輕量、無連接的傳輸協議&#xff0c;廣泛用于低延遲、高吞吐的應用中&#xff0c;如視頻流、實時游戲等。然而&…

【Spring IoC 核心實現類詳解:DefaultListableBeanFactory】

Spring IoC 核心實現類詳解&#xff08;源碼原理&#xff09;作為 Spring 的靈魂&#xff0c;IoC 容器&#xff08;Inversion of Control&#xff09;是整個框架的核心。 那么 IoC 的“心臟”到底是哪個類&#xff1f;它是怎么管理和裝配 Bean 的&#xff1f;本文將從源碼層面深…

為什么開啟JWT全局認證后,CSRF失敗會消失?

這是因為 JWT認證與CSRF校驗的設計邏輯完全不同&#xff0c;當全局啟用JWT認證后&#xff0c;Django的CSRF校驗會被“繞過”或不再生效&#xff0c;具體原因如下&#xff1a; 核心原因&#xff1a;JWT認證不依賴Cookie&#xff0c;無需CSRF保護 1. CSRF的作用場景 CSRF攻擊的前…

寶龍地產債務化解解決方案二:基于資產代幣化與輕資產轉型的戰略重構

一、行業背景與代幣化創新趨勢1.1 房地產債務危機現狀寶龍地產&#xff08;01238.HK&#xff09;截至2024年中債務總額達584億元&#xff0c;其中50.7%為一年內到期債務&#xff0c;但現金儲備僅89.47億元&#xff0c;短期償債覆蓋率不足30%。2025年2月境外債務重組計劃因債權人…