《蒼穹外賣》SpringBoot后端開發項目重點知識整理(DAY1 to DAY3)

目錄

  • 一、在本地部署并啟動Nginx服務
    • 1. 解壓Nginx壓縮包
    • 2. 啟動Nginx服務
    • 3. 驗證Nginx是否啟動成功:
  • 二、導入接口文檔
    • 1. 黑馬程序員提供的YApi平臺
    • 2. YApi Pro平臺
    • 3. 推薦工具:Apifox
  • 三、Swagger
    • 1. 常用注解
      • 1.1 @Api與@ApiModel
      • 1.2 @ApiModelProperty與@ApiOperation
  • 四、DTO的使用原因
    • 1. 實體類 Employee
    • 2. DTO EmployeeDTO
    • 3. 使用 DTO 的場景
      • 3.1 查詢員工信息
      • 3.2 更新員工信息
      • 3.3 新增員工
    • 4. DTO、VO和實體類的區別
  • 五、為什么使用 XML 注解而不是 MyBatis 注解
    • 1. 使用 XML 注解的原因
      • 1.1 動態 SQL 支持
      • 1.2 SQL 與代碼分離
      • 1.3 復用性
      • 1.4 工具支持
    • 2. MyBatis 注解的局限性
      • 2.1 動態 SQL 支持有限
      • 2.2 可讀性差
      • 2.3 維護困難
  • 六、Spring Boot 的請求映射規則
    • 1. 類級別路徑
    • 2. 方法級別路徑
      • 2.1 分頁查詢
      • 2.2 根據 ID 查詢菜品
      • 2.3 修改菜品
      • 2.4 新增菜品
      • 2.5 批量刪除菜品
    • 3. 如何區分不同的功能
    • 4. 示例請求
      • 4.1 新增菜品
      • 4.2 修改菜品
      • 4.3 批量刪除菜品
      • 4.4 分頁查詢菜品
      • 4.5 根據 ID 查詢菜品
  • 七、接口設計中的是否必須原則
    • 1. 請求參數說明
    • 2. Java代碼片段分析
    • 3. XML映射文件分析
  • 八、阿里云OSS
  • 九、JWT令牌


視頻鏈接:黑馬程序員Java項目實戰《蒼穹外賣》,最適合新手的SpringBoot+SSM的企業級Java項目實戰
網盤資料:蒼穹外賣講義&前后端源碼

一、在本地部署并啟動Nginx服務

在開發過程中,我們經常需要使用Nginx來部署前端項目或作為反向代理服務器。

1. 解壓Nginx壓縮包

首先,確保你已經從黑馬程序員資料中下載了Nginx的壓縮包。接下來,按照以下步驟解壓:

選擇解壓路徑

  • 將Nginx壓縮包解壓到一個全英文路徑中。例如:
    D:\nginx
    
  • 注意:路徑中不要包含中文或特殊字符,否則可能會導致Nginx無法正常運行。

2. 啟動Nginx服務

解壓完成后,按照以下步驟啟動Nginx:

進入Nginx目錄

  • 打開解壓后的Nginx文件夾,找到nginx.exe文件。路徑通常為:
    C:\nginx\nginx.exe
    

啟動Nginx

  • 雙擊nginx.exe文件,啟動Nginx服務。
  • 啟動后,Nginx會在后臺運行,你可以在任務管理器中看到nginx.exe進程。

3. 驗證Nginx是否啟動成功:

  • 打開瀏覽器,訪問以下地址(其中80是默認端口可省略不寫):
    http://localhost:80
    
  • 如果看到此頁面,說明Nginx已成功啟動。
    在這里插入圖片描述
  • 注意:Nginx默認不會隨系統自動啟動,因此每次重啟電腦后,都需要手動啟動Nginx

二、導入接口文檔

在開發過程中,接口管理平臺是團隊協作和項目管理的重要工具。以下是幾個常用平臺的對比:

1. 黑馬程序員提供的YApi平臺

  • 地址:http://yapi.smart-xwork.cn/
  • 狀態:已棄用
  • 功能:適合用于接口管理和文檔生成。

2. YApi Pro平臺

  • 地址:https://yapi.pro/
  • 問題:需要掛梯子才能訪問,且極易卡頓,使用體驗不佳。

3. 推薦工具:Apifox

  • 地址:https://apifox.com/
  • 優勢:
    • 無需梯子即可訪問。
    • 性能流暢,支持接口文檔、Mock數據、自動化測試等功能。
    • 支持導入YApi數據格式的接口文檔,方便無縫遷移現有項目。

在這里插入圖片描述


三、Swagger

Swagger 是一種用于設計、構建、記錄和使用 RESTful Web 服務的開源框架。它提供了一套工具,幫助開發者設計、構建、文檔化和測試 API。

啟動服務:訪問 http://localhost:8080/doc.html
在這里插入圖片描述


1. 常用注解

通過注解可以控制生成的接口文檔,使接口文檔擁有更好的可讀性,常用注解如下:

注解說明
@Api用在類上,例如Controller,表示對類的說明
@ApiModel用在類上,例如entity、DTO、VO
@ApiModelProperty用在屬性上,描述屬性信息
@ApiOperation用在方法上,例如Controller的方法,說明方法的用途、作用

1.1 @Api與@ApiModel

在這里插入圖片描述

在這里插入圖片描述

1.2 @ApiModelProperty與@ApiOperation

在這里插入圖片描述
在這里插入圖片描述


四、DTO的使用原因

在項目中,Employee 是實體類(Entity),用于表示數據庫中的員工記錄,而 EmployeeDTO 是數據傳輸對象(DTO),用于在不同層之間傳遞數據。以下是使用 DTO 的主要原因和優勢:

1. 實體類 Employee

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;           // 員工IDprivate String username;   // 用戶名private String name;       // 姓名private String password;   // 密碼(敏感字段)private String phone;      // 手機號private String sex;        // 性別private String idNumber;   // 身份證號private Integer status;    // 狀態private LocalDateTime createTime; // 創建時間(內部字段)private LocalDateTime updateTime; // 更新時間(內部字段)private Long createUser;   // 創建人(內部字段)private Long updateUser;   // 更新人(內部字段)
}

2. DTO EmployeeDTO

package com.sky.dto;import lombok.Data;
import java.io.Serializable;@Data
public class EmployeeDTO implements Serializable {private Long id;           // 員工IDprivate String username;   // 用戶名private String name;       // 姓名private String phone;      // 手機號private String sex;        // 性別private String idNumber;   // 身份證號
}

3. 使用 DTO 的場景

3.1 查詢員工信息

  • 前端只需要員工的基本信息(如 idusernamenamephonesexidNumber)。
  • 后端返回 EmployeeDTO,過濾掉敏感字段(如 password)和內部字段(如 createTime)。

3.2 更新員工信息

  • 前端傳遞 EmployeeDTO 作為請求體,后端根據 DTO 更新員工信息。
  • 避免前端傳遞不必要的字段(如 passwordcreateTime)。

3.3 新增員工

  • 前端傳遞 EmployeeDTO 作為請求體,后端將 DTO 轉換為實體類并保存到數據庫。
  • 避免前端傳遞內部字段(如 createTimeupdateTime)。

4. DTO、VO和實體類的區別

特性DTOVOEntity
目的數據傳輸數據展示或封裝值表示數據庫中的數據結構
使用場景跨層數據傳輸(如Controller-Service)展示層或領域模型數據庫操作、業務邏輯
可變性可變(通常有setter)通常不可變(無setter)可變(用于持久化和業務邏輯)
字段與傳輸需求相關與展示或業務邏輯相關與數據庫表字段嚴格對應
行為通常無行為可能包含簡單行為(如格式化)包含業務邏輯和驗證規則
示例UserDTOUserVOUserEntity

五、為什么使用 XML 注解而不是 MyBatis 注解

1. 使用 XML 注解的原因

1.1 動態 SQL 支持

  • XML 提供了強大的動態 SQL 支持,例如 <if><foreach><choose> 等標簽。
  • 在復雜的查詢場景中,動態 SQL 可以更靈活地構建 SQL 語句。

1.2 SQL 與代碼分離

  • 將 SQL 語句寫在 XML 文件中,可以使 SQL 與 Java 代碼分離,便于維護和管理。
  • 對于復雜的 SQL 語句,XML 文件的可讀性更高。

1.3 復用性

  • XML 文件中的 SQL 語句可以在多個 Mapper 接口中復用。
  • 例如,可以在不同的 Mapper 接口中引用同一個 SQL 片段。

1.4 工具支持

  • MyBatis 提供了豐富的工具支持 XML 文件的編寫和調試。
  • 例如,MyBatis Generator 可以自動生成 XML 映射文件。

2. MyBatis 注解的局限性

2.1 動態 SQL 支持有限

  • MyBatis 注解對動態 SQL 的支持較弱,復雜的 SQL 語句難以用注解實現。
  • 例如,@Select 注解無法直接實現 <foreach> 這樣的動態 SQL。
<select id="getSetmealIdsByDishIds" resultType="java.lang.Long">select setmeal_id from setmeal_dish where dish_id in<foreach collection="dishIds" item="dishId" separator="," open="(" close=")">#{dishId}</foreach>
</select>

2.2 可讀性差

  • 復雜的 SQL 語句寫在注解中會導致代碼冗長,可讀性差。
  • 例如,一個包含多個條件的查詢語句會顯得非常混亂。

2.3 維護困難

  • SQL 語句與 Java 代碼混合在一起,維護起來不如 XML 文件方便。
  • 修改 SQL 語句時需要重新編譯 Java 代碼。

你提到的代碼中有兩個 @PutMapping 注解沒有指定路徑,這意味著它們默認映射到類級別的路徑 /admin/dish。以下是對這個問題的詳細解釋:


六、Spring Boot 的請求映射規則

在 Spring Boot 中,請求的映射是通過 類級別的 @RequestMapping方法級別的 @PutMapping@GetMapping 等注解 共同決定的。

  • 類級別的 @RequestMapping
    • 定義了該類中所有方法的公共路徑前綴。
    • 例如,@RequestMapping("/admin/dish") 表示該類中的所有方法都映射到 /admin/dish 路徑下。
    • 管理端發出的請求,統一使用/admin作為前綴。
    • 用戶端發出的請求,統一使用/user作為前綴。
  • 方法級別的 @PutMapping@GetMapping
    • 定義了具體的 HTTP 方法和路徑。
    • 如果方法級別的注解沒有指定路徑,則默認使用類級別的路徑。

1. 類級別路徑

@RestController
@RequestMapping("/admin/dish")
public class DishController {// 方法定義...
}
  • 所有方法的公共路徑前綴是 /admin/dish

2. 方法級別路徑

2.1 分頁查詢

@GetMapping("/page")
public Result<PageResult> page(DishPageQueryDTO dishPageQueryDTO) {// 方法實現...
}
  • 完整路徑是 /admin/dish/page

2.2 根據 ID 查詢菜品

@GetMapping("/{id}")
public Result<DishVO> getById(@PathVariable Long id) {// 方法實現...
}
  • 完整路徑是 /admin/dish/{id}

2.3 修改菜品

@PutMapping
public Result update(@RequestBody DishDTO dishDTO) {// 方法實現...
}
  • 由于 @PutMapping 沒有指定路徑,默認使用類級別的路徑 /admin/dish

2.4 新增菜品

@PostMapping
public Result save(@RequestBody DishDTO dishDTO) {// 方法實現...
}
  • 由于 @PostMapping 沒有指定路徑,默認使用類級別的路徑 /admin/dish

2.5 批量刪除菜品

@DeleteMapping
public Result delete(@RequestParam List<Long> ids) {// 方法實現...
}
  • 由于 @DeleteMapping 沒有指定路徑,默認使用類級別的路徑 /admin/dish

3. 如何區分不同的功能

Spring Boot 通過 HTTP 方法 來區分不同的功能。例如:

HTTP 方法路徑功能
POST/admin/dish新增菜品
PUT/admin/dish修改菜品
DELETE/admin/dish批量刪除菜品
GET/admin/dish/page分頁查詢菜品
GET/admin/dish/{id}根據 ID 查詢菜品

4. 示例請求

4.1 新增菜品

  • HTTP 方法POST
  • URL/admin/dish
  • 請求體
    {"name": "宮保雞丁","price": 38.0,"flavors": [{"name": "微辣","value": "少辣"}]
    }
    

4.2 修改菜品

  • HTTP 方法PUT
  • URL/admin/dish
  • 請求體
    {"id": 1,"name": "宮保雞丁","price": 40.0,"flavors": [{"name": "微辣","value": "少辣"}]
    }
    

4.3 批量刪除菜品

  • HTTP 方法DELETE
  • URL/admin/dish?ids=1,2,3
  • 請求參數ids=1,2,3

4.4 分頁查詢菜品

  • HTTP 方法GET
  • URL/admin/dish/page?page=1&pageSize=10
  • 請求參數page=1&pageSize=10

4.5 根據 ID 查詢菜品

  • HTTP 方法GET
  • URL/admin/dish/1
  • 路徑參數id=1

七、接口設計中的是否必須原則

在這里插入圖片描述

參數的必需與非必需性是通過不同的方式來體現的,以下是具體案例


1. 請求參數說明

從接口文檔中可以看到,請求參數包括以下幾項:

參數名類型說明必需性示例值
categoryIdstring分類id可選101
namestring菜品名稱可選官保雞丁
pagestring頁碼必需1
pageSizestring每頁記錄數必需10
statusstring分類狀態可選1
  • 必需參數

    • pagepageSize 是分頁查詢的必需參數,用于指定查詢的頁碼和每頁的記錄數。
  • 可選參數

    • categoryIdnamestatus 是可選參數,用于過濾查詢結果。

2. Java代碼片段分析

在此 Java 代碼中,DishPageQueryDTO 是一個數據傳輸對象(DTO),用于封裝分頁查詢的參數。以下是代碼的詳細分析:

public PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO) {// 1. 使用 PageHelper 進行分頁PageHelper.startPage(dishPageQueryDTO.getPage(), dishPageQueryDTO.getPageSize());// 2. 調用 Mapper 進行查詢Page<DishVO> page = dishMapper.pageQuery(dishPageQueryDTO);// 3. 返回分頁結果return new PageResult(page.getTotal(), page.getResult());
}
  • 必需參數
    • dishPageQueryDTO.getPage()dishPageQueryDTO.getPageSize() 是分頁查詢的必需參數。
    • 如果這兩個參數為空或未提供,分頁功能將無法正常工作。

3. XML映射文件分析

在 SQL 代碼中,動態 SQL 語句根據傳入的參數生成查詢條件。以下是代碼的詳細分析:

<select id="pageQuery" resultType="com.sky.vo.DishVO">select d.* , c.name as categoryName from dish d left outer join category c on d.category_id = c.id<where><if test="name != null">and d.name like concat('%',#{name},'%')</if><if test="categoryId != null">and d.category_id = #{categoryId}</if><if test="status != null">and d.status = #{status}</if></where>order by d.create_time desc
</select>
  • 可選參數
    • namecategoryIdstatus 是可選參數,通過 <if> 標簽動態生成查詢條件。
    • 如果某個參數為 null,則對應的條件不會添加到 SQL 查詢中。

通過這種設計,分頁查詢接口既滿足了基本的查詢需求,又提供了靈活的過濾選項,適用于不同的業務場景。

八、阿里云OSS

九、JWT令牌

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

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

相關文章

Mysql5.7-yum安裝和更改mysql數據存放路徑-2020年記錄

記錄下官網里用yum rpm源安裝mysql, 1 官網下載rpm https://dev.mysql.com/downloads/repo/yum/ https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html&#xff08;附官網操作手冊&#xff09; wget https://repo.mysql.com//mysql80-community-release…

HTML5(Web前端開發筆記第一期)

p.s.這是萌新自己自學總結的筆記&#xff0c;如果想學習得更透徹的話還是請去看大佬的講解 目錄 三件套標簽標題標簽段落標簽文本格式化標簽圖像標簽超鏈接標簽錨點鏈接默認鏈接地址 音頻標簽視頻標簽 HTML基本骨架綜合案例->個人簡介列表表格表單input標簽單選框radio上傳…

Oracle19c進入EM Express(Oracle企業管理器)詳細步驟

以下是使用Oracle 19c進入Oracle Enterprise Manager Database Express&#xff08;EM Express&#xff09;的詳細步驟&#xff1a; ### **步驟 1&#xff1a;確認EM Express配置狀態** 1. **登錄數據庫服務器** 使用Oracle用戶或管理員權限賬戶登錄操作系統。 2. **查看EM…

JSAR 基礎 1.2.1 基礎概念_空間小程序

JSAR 基礎 1.2.1 基礎概念_空間小程序 空間空間自由度可嵌入空間空間小程序 最新的技術進展表明&#xff0c;官網之前的文檔準備廢除了&#xff0c;基于xsml的開發將退出歷史舞臺&#xff0c;three.js和普通web結合的技術將成為主導。所以后續學習請移步three.js學習路徑&#…

JavaWeb-servlet6中重定向、轉發、cookie、session、文件上傳和下載

請求重定向 一個 web 資源收到客戶端請求后&#xff0c;通知客戶端去訪問另外一個 web 資源&#xff0c;這稱之為請求重定向。 使用response對象提供的sendRedirect()方法&#xff0c;可以將網頁重定向到另一個頁面。SendRedirect()方法的語法格式&#xff1a; response.send…

信息安全訪問控制、抗攻擊技術、安全體系和評估(高軟42)

系列文章目錄 信息安全訪問控制、抗攻擊技術、安全體系和評估 文章目錄 系列文章目錄前言一、信息安全技術1.訪問控制2.抗攻擊技術 二、欺騙技術1.ARP欺騙2.DNS欺騙3.IP欺騙 三、抗攻擊技術1.端口掃描2.強化TCP/IP堆棧 四、保證體系和評估1.保證體系2.安全風險管理 五、真題在…

SpringBoot POST和GET請求

1. 什么是 HTTP 請求&#xff1f; HTTP 協議&#xff1a;超文本傳輸協議&#xff0c;用于客戶端和服務器之間的通信。 常見 HTTP 方法&#xff1a; GET&#xff1a;獲取資源POST&#xff1a;提交數據PUT&#xff1a;更新資源DELETE&#xff1a;刪除資源 2. GET 請求詳解 作…

mysql的Innodb最大支持的索引長度是多少,以及索引長度怎么計算

今天正好有空&#xff0c;來講個之前粉絲經常問的一個知識&#xff0c;就是mysql的Innodb最大支持的索引長度是多少&#xff1f;以及索引長度怎么計算&#xff1f; 一、mysql的innodb引擎&#xff0c;創建索引最大支持的長度是多少字節&#xff1f; 不墨跡&#xff0c;直接說…

Python 中 `sort()` 和 `sorted()` 的用法與區別

Python 中 sort() 和 sorted() 的用法與區別 1. sort() 方法&#xff1a; sort() 是 Python 列表類型 (list) 的一個方法&#xff0c;它用于就地&#xff08;原地&#xff09;排序列表&#xff0c;修改原始列表。排序時可以通過 key 參數指定排序依據&#xff0c;還可以通過 …

SpringBoot過濾器(Filter)的使用:Filter接口、FilterRegistrationBean類配置、@WebFilter注釋

1、過濾器(Filter)的介紹 Spring Boot 的過濾器用于對數據進行過濾處理。通過 Spring Boot 的過濾器,程序開發人員不僅可以對用戶通過 URL 地址發送的請求進行過濾處理(例如:過濾一些錯誤的請求或者請求中的敏感詞等),而且可以對服務器返回的數據進行過濾處理(例如:壓…

C++修煉之路:初識C++

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《題海拾貝》 歡迎點贊&#xff0c;關注&#xff01; 引言 …

【STM32MP157系統移植】3.TF-A目錄結構

bl1&#xff1a;部分一般不用TFA自帶的&#xff0c;而是芯片內部的BOOTROM bl2&#xff1a;更像傳統意義的TF-A&#xff0c;TF-A本身 bl31&#xff1a;是ARMV&#xff18;的EL3運行時固件 bl32&#xff1a;OPTEE或者TF-A提供的sp_min bl33&#xff1a;就是uboot 真正需要移…

OpenCV連續數字識別—可運行驗證

前言 ? 文章開始&#xff0c;瞎說一點其他的東西&#xff0c;真的是很離譜&#xff0c;找了至少兩三個小時&#xff0c;就一個簡單的需求&#xff1a; 1、利用OpenCV 在Windows進行抓圖 2、利用OpenCV 進行連續數字的檢測。 3、使用C&#xff0c;Qt 3、將檢測的結果顯示出來 …

shell的模擬實現 ─── linux第16課

在shell的命令行中輸入命令,會有兩種執行命令的途徑 shell自己執行 shell創建子進程(fork ,exit ,waitpid,exec) ,子進程去執行 shell自己執行的命令是自建命令(bulit command) 子進程執行的是非自建命令 第一版只能維護命令行參數表創建子進程, 執行非內建命令 我們先創…

MySQL創建數據庫和表,插入四大名著中的人物

一、登錄數據庫并創建數據庫db_ck 二、創建表t_hero 表屬性包括&#xff08;id&#xff0c;name&#xff0c;nickname&#xff0c;age&#xff0c;gender&#xff0c;address&#xff0c;weapon&#xff0c;types&#xff09; mysql> create table t_hero(-> id int,-…

靜態網頁的爬蟲(以電影天堂為例)

一、電影天堂的網址&#xff08;url&#xff09; 電影天堂_免費電影_迅雷電影下載_電影天堂網最好的迅雷電影下載網&#xff0c;分享最新電影&#xff0c;高清電影、綜藝、動漫、電視劇等下載&#xff01;https://dydytt.net/index.htm 我們要爬取這個頁面上的內容 二、代碼…

【C++】:STL詳解 —— 紅黑樹封裝map和set

目錄 紅黑樹的源代碼 正向迭代器的代碼 反向迭代器的代碼 set的模擬實現 map的模擬實現 紅黑樹的源代碼 #pragma once #include <iostream>using namespace std; // set ->key // map ->key/value// set ->key // map ->key/valueenum Colour {RED,BLAC…

MATLAB控制函數測試要點剖析

一、功能準確性檢驗 基礎功能核驗 針對常用控制函數&#xff0c;像用于傳遞函數建模的 tf 、構建狀態空間模型的 ss &#xff0c;以及開展階躍響應分析的 step 等&#xff0c;必須確認其能精準執行基礎操作。以 tf 函數為例&#xff0c;在輸入分子與分母系數后&#xff0c;理…

MoonSharp 文檔一

目錄 1.Getting Started 步驟1&#xff1a;在 IDE 中引入 MoonSharp 步驟2&#xff1a;引入命名空間 步驟3&#xff1a;調用腳本 步驟4&#xff1a;運行代碼 2.Keeping a Script around 步驟1&#xff1a;復現前教程所有操作 步驟2&#xff1a;改為創建Script對象 步驟…

ROS云課三分鐘-差動移動機器人導航報告如何撰寫-及格邊緣瘋狂試探

提示詞&#xff1a;基于如上所有案例并結合roslaunch teb_local_planner_tutorials robot_diff_drive_in_stage.launch和上面所有對話內容&#xff0c;設計一個差速移動機器人仿真實驗&#xff0c;并完成報告的全文撰寫。 差速移動機器人導航仿真實驗報告 一、實驗目的 驗證 T…