中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

微信的微網(wǎng)站模板下載不了營銷型網(wǎng)站策劃書

微信的微網(wǎng)站模板下載不了,營銷型網(wǎng)站策劃書,襄樊網(wǎng)站建設(shè)哪家好,個(gè)體戶工商可以做經(jīng)營性網(wǎng)站嗎目錄 一、在本地部署并啟動(dòng)Nginx服務(wù)1. 解壓Nginx壓縮包2. 啟動(dòng)Nginx服務(wù)3. 驗(yàn)證Nginx是否啟動(dòng)成功: 二、導(dǎo)入接口文檔1. 黑馬程序員提供的YApi平臺(tái)2. YApi Pro平臺(tái)3. 推薦工具:Apifox 三、Swagger1. 常用注解1.1 Api與ApiModel1.2 ApiModelProperty與Ap…

目錄

  • 一、在本地部署并啟動(dòng)Nginx服務(wù)
    • 1. 解壓Nginx壓縮包
    • 2. 啟動(dòng)Nginx服務(wù)
    • 3. 驗(yàn)證Nginx是否啟動(dòng)成功:
  • 二、導(dǎo)入接口文檔
    • 1. 黑馬程序員提供的YApi平臺(tái)
    • 2. YApi Pro平臺(tái)
    • 3. 推薦工具:Apifox
  • 三、Swagger
    • 1. 常用注解
      • 1.1 @Api與@ApiModel
      • 1.2 @ApiModelProperty與@ApiOperation
  • 四、基于JWT和ThreadLocal動(dòng)態(tài)獲取員工ID
    • 1. 在pom.xml中引入JWT依賴
    • 2. 在application.yaml中配置JWT參數(shù)
    • 3. 使用JWT獲取當(dāng)前登錄員工ID
    • 4. 通過攔截器解析JWT
    • 5. 使用ThreadLocal傳遞員工ID
    • 6. 在Service中獲取員工ID
  • 五、DTO的使用原因
    • 1. 實(shí)體類 Employee
    • 2. DTO EmployeeDTO
    • 3. 使用 DTO 的場景
      • 3.1 查詢員工信息
      • 3.2 更新員工信息
      • 3.3 新增員工
    • 4. DTO、VO和實(shí)體類的區(qū)別
  • 六、為什么使用 XML 注解而不是 MyBatis 注解
    • 1. 使用 XML 注解的原因
      • 1.1 動(dòng)態(tài) SQL 支持
      • 1.2 SQL 與代碼分離
      • 1.3 復(fù)用性
      • 1.4 工具支持
    • 2. MyBatis 注解的局限性
      • 2.1 動(dòng)態(tài) SQL 支持有限
      • 2.2 可讀性差
      • 2.3 維護(hù)困難
  • 七、Spring Boot 的請求映射規(guī)則
    • 1. 類級別路徑
    • 2. 方法級別路徑
      • 2.1 分頁查詢
      • 2.2 根據(jù) ID 查詢菜品
      • 2.3 修改菜品
      • 2.4 新增菜品
      • 2.5 批量刪除菜品
    • 3. 如何區(qū)分不同的功能
    • 4. 示例請求
      • 4.1 新增菜品
      • 4.2 修改菜品
      • 4.3 批量刪除菜品
      • 4.4 分頁查詢菜品
      • 4.5 根據(jù) ID 查詢菜品
  • 八、接口設(shè)計(jì)中的是否必須原則
    • 1. 請求參數(shù)說明
      • 1.1 Java代碼分析
        • 1.1.1 必需參數(shù)
      • 1.2 XML映射文件分析
        • 1.2.1 可選參數(shù)
    • 2. 返回響應(yīng)說明
      • 2.1 Java代碼分析
        • 2.1.1 必需參數(shù)
        • 2.1.2 可選參數(shù)
      • 2.2 返回響應(yīng)示例
        • 2.2.1 成功響應(yīng)(帶數(shù)據(jù))
        • 2.2.2 成功響應(yīng)(不帶數(shù)據(jù))
        • 2.2.3 失敗響應(yīng)
  • 九、阿里云OSS配置指南
    • 1. 注冊阿里云OSS賬號(hào)
    • 2. 獲取關(guān)鍵信息
    • 3. 更新配置文件
    • 4, 重新運(yùn)行服務(wù)


視頻鏈接:黑馬程序員Java項(xiàng)目實(shí)戰(zhàn)《蒼穹外賣》,最適合新手的SpringBoot+SSM的企業(yè)級Java項(xiàng)目實(shí)戰(zhàn)
網(wǎng)盤資料:蒼穹外賣講義&前后端源碼


一、在本地部署并啟動(dòng)Nginx服務(wù)

在開發(fā)過程中,我們經(jīng)常需要使用Nginx來部署前端項(xiàng)目或作為反向代理服務(wù)器。

1. 解壓Nginx壓縮包

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

選擇解壓路徑

  • 將Nginx壓縮包解壓到一個(gè)全英文路徑中。例如:
    D:\nginx
    
  • 注意:路徑中不要包含中文或特殊字符,否則可能會(huì)導(dǎo)致Nginx無法正常運(yùn)行。

2. 啟動(dòng)Nginx服務(wù)

解壓完成后,按照以下步驟啟動(dòng)Nginx:

進(jìn)入Nginx目錄

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

啟動(dòng)Nginx

  • 雙擊nginx.exe文件,啟動(dòng)Nginx服務(wù)。
  • 啟動(dòng)后,Nginx會(huì)在后臺(tái)運(yùn)行,你可以在任務(wù)管理器中看到nginx.exe進(jìn)程。

3. 驗(yàn)證Nginx是否啟動(dòng)成功:

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

二、導(dǎo)入接口文檔

在開發(fā)過程中,接口管理平臺(tái)是團(tuán)隊(duì)協(xié)作和項(xiàng)目管理的重要工具。以下是幾個(gè)常用平臺(tái)的對比:

1. 黑馬程序員提供的YApi平臺(tái)

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

2. YApi Pro平臺(tái)

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

3. 推薦工具:Apifox

  • 地址:https://apifox.com/
  • 優(yōu)勢:
    • 無需梯子即可訪問。
    • 性能流暢,支持接口文檔、Mock數(shù)據(jù)、自動(dòng)化測試等功能。
    • 支持導(dǎo)入YApi數(shù)據(jù)格式的接口文檔,方便無縫遷移現(xiàn)有項(xiàng)目。

在這里插入圖片描述


三、Swagger

Swagger 是一種用于設(shè)計(jì)、構(gòu)建、記錄和使用 RESTful Web 服務(wù)的開源框架。它提供了一套工具,幫助開發(fā)者設(shè)計(jì)、構(gòu)建、文檔化和測試 API。

啟動(dòng)服務(wù):訪問 http://localhost:8080/doc.html
在這里插入圖片描述

1. 常用注解

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

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

1.1 @Api與@ApiModel

在這里插入圖片描述

在這里插入圖片描述

1.2 @ApiModelProperty與@ApiOperation

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


四、基于JWT和ThreadLocal動(dòng)態(tài)獲取員工ID

在開發(fā)員工管理系統(tǒng)時(shí),新增員工時(shí)需要記錄創(chuàng)建人和修改人的ID。如果直接使用固定值,會(huì)導(dǎo)致數(shù)據(jù)不準(zhǔn)確,無法真實(shí)反映操作者。

public void save(EmployeeDTO employeeDTO) {Employee employee = new Employee();employee.setCreateUser(10L); // 固定值employee.setUpdateUser(10L); // 固定值employeeMapper.insert(employee);
}

因此我們要通過JWT和ThreadLocal動(dòng)態(tài)獲取當(dāng)前登錄員工的ID,并實(shí)現(xiàn)數(shù)據(jù)的準(zhǔn)確記錄。在使用 JWT(JSON Web Token)進(jìn)行身份驗(yàn)證時(shí),通常需要在項(xiàng)目中引入相關(guān)的依賴庫,并在配置文件中設(shè)置 JWT 的參數(shù)。以下是如何在 Spring Boot 項(xiàng)目中引入 JWT 并進(jìn)行配置的簡單說明:

1. 在pom.xml中引入JWT依賴

為了使用 JWT,我們需要引入一個(gè) JWT 庫,比如 java-jwt(由 Auth0 提供)。

<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.4.0</version> <!-- 使用最新版本 -->
</dependency>

2. 在application.yaml中配置JWT參數(shù)

application.yaml 文件中定義 JWT 的相關(guān)配置,例如密鑰、過期時(shí)間和令牌名稱。

sky:jwt:# 設(shè)置 JWT 簽名加密時(shí)使用的秘鑰admin-secret-key: itcast# 設(shè)置 JWT 過期時(shí)間(單位:毫秒)admin-ttl: 7200000 # 2小時(shí)# 設(shè)置前端傳遞過來的令牌名稱admin-token-name: token
  • admin-secret-key:用于簽名和驗(yàn)證 JWT 的密鑰。必須保密,且長度足夠復(fù)雜以確保安全性。
  • admin-ttl:JWT 的有效期(以毫秒為單位)。例如,7200000 表示 2 小時(shí)。
  • admin-token-name:前端傳遞 JWT 時(shí)使用的參數(shù)名稱。例如,前端可能會(huì)在請求頭或請求參數(shù)中傳遞 token=xxx。

3. 使用JWT獲取當(dāng)前登錄員工ID

員工登錄成功后,系統(tǒng)會(huì)生成JWT令牌并返回給前端。JWT中包含了當(dāng)前登錄員工的ID信息。

/*** 員工管理*/
@RestController
@RequestMapping("/admin/employee")
@Api(tags = "員工相關(guān)接口")
@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);}...
}

4. 通過攔截器解析JWT

在每次請求時(shí),前端會(huì)攜帶JWT令牌。通過攔截器解析JWT,獲取當(dāng)前登錄員工的ID。

/*** jwt令牌校驗(yàn)的攔截器*/
@Component
@Slf4j
public class JwtTokenAdminInterceptor implements HandlerInterceptor {@Autowiredprivate JwtProperties jwtProperties;/*** 校驗(yàn)jwt** @param request* @param response* @param handler* @return* @throws Exception*/public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//判斷當(dāng)前攔截到的是Controller的方法還是其他資源if (!(handler instanceof HandlerMethod)) {//當(dāng)前攔截到的不是動(dòng)態(tài)方法,直接放行return true;}//1、從請求頭中獲取令牌String token = request.getHeader(jwtProperties.getAdminTokenName());//2、校驗(yàn)令牌try {log.info("jwt校驗(yàn):{}", token);Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token);Long empId = Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString());log.info("當(dāng)前員工id:", empId);BaseContext.setCurrentId(empId);//3、通過,放行return true;} catch (Exception ex) {//4、不通過,響應(yīng)401狀態(tài)碼response.setStatus(401);return false;}}
}

5. 使用ThreadLocal傳遞員工ID

通過ThreadLocal實(shí)現(xiàn)線程隔離,將當(dāng)前登錄員工的ID傳遞給Service層。

public class BaseContext {public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();public static void setCurrentId(Long id) {threadLocal.set(id);}public static Long getCurrentId() {return threadLocal.get();}public static void removeCurrentId() {threadLocal.remove();}
}

6. 在Service中獲取員工ID

在Service層中,從ThreadLocal中獲取當(dāng)前登錄員工的ID,并設(shè)置為創(chuàng)建人和修改人。

public void save(EmployeeDTO employeeDTO) {Employee employee = new Employee();employee.setCreateUser(BaseContext.getCurrentId()); // 動(dòng)態(tài)獲取當(dāng)前登錄員工IDemployee.setUpdateUser(BaseContext.getCurrentId()); // 動(dòng)態(tài)獲取當(dāng)前登錄員工IDemployeeMapper.insert(employee);
}

五、DTO的使用原因

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

1. 實(shí)體類 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;      // 手機(jī)號(hào)private String sex;        // 性別private String idNumber;   // 身份證號(hào)private Integer status;    // 狀態(tài)private LocalDateTime createTime; // 創(chuàng)建時(shí)間(內(nèi)部字段)private LocalDateTime updateTime; // 更新時(shí)間(內(nèi)部字段)private Long createUser;   // 創(chuàng)建人(內(nèi)部字段)private Long updateUser;   // 更新人(內(nèi)部字段)
}

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;      // 手機(jī)號(hào)private String sex;        // 性別private String idNumber;   // 身份證號(hào)
}

3. 使用 DTO 的場景

3.1 查詢員工信息

  • 前端只需要員工的基本信息(如 idusername、name、phonesex、idNumber)。
  • 后端返回 EmployeeDTO,過濾掉敏感字段(如 password)和內(nèi)部字段(如 createTime)。

3.2 更新員工信息

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

3.3 新增員工

  • 前端傳遞 EmployeeDTO 作為請求體,后端將 DTO 轉(zhuǎn)換為實(shí)體類并保存到數(shù)據(jù)庫。
  • 避免前端傳遞內(nèi)部字段(如 createTime、updateTime)。

4. DTO、VO和實(shí)體類的區(qū)別

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

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

1. 使用 XML 注解的原因

1.1 動(dòng)態(tài) SQL 支持

  • XML 提供了強(qiáng)大的動(dòng)態(tài) SQL 支持,例如 <if>、<foreach>、<choose> 等標(biāo)簽。
  • 在復(fù)雜的查詢場景中,動(dòng)態(tài) SQL 可以更靈活地構(gòu)建 SQL 語句。

1.2 SQL 與代碼分離

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

1.3 復(fù)用性

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

1.4 工具支持

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

2. MyBatis 注解的局限性

2.1 動(dòng)態(tài) SQL 支持有限

  • MyBatis 注解對動(dòng)態(tài) SQL 的支持較弱,復(fù)雜的 SQL 語句難以用注解實(shí)現(xiàn)。
  • 例如,@Select 注解無法直接實(shí)現(xiàn) <foreach> 這樣的動(dòng)態(tài) 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 可讀性差

  • 復(fù)雜的 SQL 語句寫在注解中會(huì)導(dǎo)致代碼冗長,可讀性差。
  • 例如,一個(gè)包含多個(gè)條件的查詢語句會(huì)顯得非?;靵y。

2.3 維護(hù)困難

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

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


七、Spring Boot 的請求映射規(guī)則

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

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

1. 類級別路徑

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

2. 方法級別路徑

2.1 分頁查詢

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

2.2 根據(jù) ID 查詢菜品

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

2.3 修改菜品

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

2.4 新增菜品

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

2.5 批量刪除菜品

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

3. 如何區(qū)分不同的功能

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

HTTP 方法路徑功能
POST/admin/dish新增菜品
PUT/admin/dish修改菜品
DELETE/admin/dish批量刪除菜品
GET/admin/dish/page分頁查詢菜品
GET/admin/dish/{id}根據(jù) 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
  • 請求參數(shù)ids=1,2,3

4.4 分頁查詢菜品

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

4.5 根據(jù) ID 查詢菜品

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

八、接口設(shè)計(jì)中的是否必須原則

參數(shù)的必需與非必需性是通過不同的方式來體現(xiàn)的,以下是具體案例

1. 請求參數(shù)說明

在這里插入圖片描述

從接口文檔中可以看到,請求參數(shù)包括以下幾項(xiàng):

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

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

    • categoryIdnamestatus 是可選參數(shù),用于過濾查詢結(jié)果。

1.1 Java代碼分析

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

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

1.2 XML映射文件分析

在 SQL 代碼中,動(dòng)態(tài) SQL 語句根據(jù)傳入的參數(shù)生成查詢條件。以下是代碼的詳細(xì)分析:

<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>
1.2.1 可選參數(shù)
  • name、categoryIdstatus 是可選參數(shù),通過 <if> 標(biāo)簽動(dòng)態(tài)生成查詢條件。
  • 如果某個(gè)參數(shù)為 null,則對應(yīng)的條件不會(huì)添加到 SQL 查詢中。

通過這種設(shè)計(jì),分頁查詢接口既滿足了基本的查詢需求,又提供了靈活的過濾選項(xiàng),適用于不同的業(yè)務(wù)場景。


2. 返回響應(yīng)說明

在 API 設(shè)計(jì)中,返回響應(yīng)的數(shù)據(jù)結(jié)構(gòu)通常需要遵循一定的規(guī)范,以確??蛻舳四軌驕?zhǔn)確處理和理解服務(wù)器的響應(yīng)。Result<T> 類是一個(gè)典型的統(tǒng)一響應(yīng)格式,根據(jù)不同的設(shè)計(jì)需求,我們發(fā)現(xiàn) code 一定是必需的,而 msgdata 在某些情況下是可選的,而在某些情況可能是必需的。接下來,我們將詳細(xì)探討這種設(shè)計(jì)背后的原因。

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

2.1 Java代碼分析

package com.sky.result;import lombok.Data;import java.io.Serializable;`/*** 后端統(tǒng)一返回結(jié)果* @param <T>*/
@Data
public class Result<T> implements Serializable {private Integer code; //編碼:1成功,0和其它數(shù)字為失敗private String msg; //錯(cuò)誤信息private T data; //數(shù)據(jù)public static <T> Result<T> success() {Result<T> result = new Result<T>();result.code = 1;return result;}public static <T> Result<T> success(T object) {Result<T> result = new Result<T>();result.data = object;result.code = 1;return result;}public static <T> Result<T> error(String msg) {Result result = new Result();result.msg = msg;result.code = 0;return result;}}
2.1.1 必需參數(shù)

code 是必需的

  • 作用code 用于表示請求的處理結(jié)果狀態(tài),通常是一個(gè)數(shù)字。
    • 例如: 1 表示成功,0 或其他數(shù)字表示失敗。
  • 為什么必需
    • 明確狀態(tài):客戶端需要知道請求是否成功。code 提供了一個(gè)明確的狀態(tài)標(biāo)識(shí),客戶端可以根據(jù)它決定后續(xù)操作。
    • 標(biāo)準(zhǔn)化:統(tǒng)一的 code 值可以讓客戶端以一致的方式處理所有 API 的響應(yīng)。
    • 錯(cuò)誤處理:當(dāng)請求失敗時(shí),code 可以幫助客戶端快速定位問題類型(如權(quán)限不足、資源不存在等)。
2.1.2 可選參數(shù)

msg 是可選的

  • 作用msg 用于提供額外的錯(cuò)誤信息或成功提示。
    • 例如:成功時(shí):msg 可以為空或包含提示信息(如“操作成功”),失敗時(shí):msg 可以包含具體的錯(cuò)誤描述(如“用戶未找到”)。
  • 為什么可選
    • 成功時(shí)可能不需要:在請求成功的情況下,客戶端可能只需要 data,而不需要額外的提示信息。
    • 減少冗余:如果 msg 是必需的,即使沒有實(shí)際意義的信息(如成功時(shí)的默認(rèn)提示),也需要返回,這會(huì)增加響應(yīng)的冗余。
    • 靈活性:在某些場景下,錯(cuò)誤信息可能由其他方式提供(如日志或?qū)iT的錯(cuò)誤處理機(jī)制),因此 msg 可以省略。

data 是可選的

  • 作用data 用于承載實(shí)際的響應(yīng)數(shù)據(jù)。
    • 例如:查詢接口返回的列表或?qū)ο?#xff0c;創(chuàng)建接口返回的新創(chuàng)建的資源。
  • 為什么可選
    • 某些操作不需要返回?cái)?shù)據(jù):例如,刪除操作或簡單的狀態(tài)更新操作可能不需要返回任何數(shù)據(jù)。
    • 減少冗余:如果 data 是必需的,即使沒有數(shù)據(jù)也需要返回一個(gè)空對象或 null,這會(huì)增加響應(yīng)的冗余。
    • 靈活性:某些接口可能只需要返回狀態(tài)信息(如 codemsg),而不需要額外的數(shù)據(jù)。

2.2 返回響應(yīng)示例

2.2.1 成功響應(yīng)(帶數(shù)據(jù))
{"code": 1,"msg": "操作成功","data": {"id": 123,"name": "John Doe"}
}
2.2.2 成功響應(yīng)(不帶數(shù)據(jù))
{"code": 1
}
2.2.3 失敗響應(yīng)
{"code": 0,"msg": "用戶未找到"
}

這種設(shè)計(jì)符合 API 設(shè)計(jì)的最佳實(shí)踐,能夠滿足大多數(shù)場景的需求,同時(shí)保持簡潔和一致性。


九、阿里云OSS配置指南

在使用對象存儲(chǔ)服務(wù)時(shí),可能會(huì)遇到Bucket失效的情況,從而導(dǎo)致服務(wù)無法正常運(yùn)行。為了解決這個(gè)問題,我們需要重新配置一個(gè)新的Bucket,并更新相關(guān)配置文件。參考教程:Java利用阿里云OSS/本地存儲(chǔ)實(shí)現(xiàn)文件上傳功能

1. 注冊阿里云OSS賬號(hào)

首先,訪問阿里云-對象存儲(chǔ)OSS官網(wǎng)注冊賬號(hào)。新用戶可免費(fèi)試用20GB存儲(chǔ)空間,有效期為3個(gè)月。

在這里插入圖片描述

2. 獲取關(guān)鍵信息

注冊完成后,獲取以下四個(gè)關(guān)鍵信息:

  1. Endpoint:OSS服務(wù)的訪問地址。
  2. Access Key ID:用于身份驗(yàn)證的訪問密鑰ID。
  3. Access Key Secret:用于身份驗(yàn)證的訪問密鑰。
  4. Bucket Name:新創(chuàng)建的Bucket名稱。

在這里插入圖片描述

3. 更新配置文件

將上述獲取的信息填寫到對應(yīng)的YAML配置文件sky-server/src/main/resources/application-dev.yml目錄下

sky:datasource:driver-class-name: com.mysql.cj.jdbc.Driverhost: localhostport: 3306database: sky_take_outusername: your_usernamepassword: your_passwordalioss:endpoint: your_endpointaccess-key-id: your_accessKeyIdaccess-key-secret: your_keySecretbucket-name: your_bucketName#    endpoint: oss-cn-hangzhou.aliyuncs.com
#    access-key-id: LTAI5tPeFLzsPPT8gG3LPW64
#    access-key-secret: U6k1brOZ8gaOIXv3nXbulGTUzy6Pd7
#    bucket-name: sky-take-out

4, 重新運(yùn)行服務(wù)

保存配置文件后,重新運(yùn)行服務(wù)并打開前端頁面,發(fā)現(xiàn)圖片能夠正常上傳了!

在這里插入圖片描述
并且我們可以在自己的對象存儲(chǔ)OSS文件管理中監(jiān)控到從前端頁面上傳的圖片文件

在這里插入圖片描述


http://www.risenshineclean.com/news/66091.html

相關(guān)文章:

  • 中衛(wèi)網(wǎng)站推廣制作電商培訓(xùn)課程
  • 建站之星備案百度推廣售后
  • 網(wǎng)站建設(shè)服務(wù)哪家好seo免費(fèi)推廣
  • 手機(jī)網(wǎng)站制作服務(wù)機(jī)構(gòu)百度法務(wù)部聯(lián)系方式
  • 石家莊網(wǎng)站建設(shè)模板服務(wù)臨沂seo建站
  • 公司名稱大全集最新三個(gè)字贛州seo唐三
  • wordpress過時(shí)了嗎手機(jī)百度seo快速排名
  • 杭州做網(wǎng)站的企業(yè)seo外鏈發(fā)布平臺(tái)有哪些
  • 網(wǎng)站建設(shè)成果成都官網(wǎng)seo服務(wù)
  • 手機(jī)網(wǎng)站制作方案微信群二維碼推廣平臺(tái)
  • 大型服裝網(wǎng)站開發(fā)代運(yùn)營一般收費(fèi)
  • 網(wǎng)站建設(shè)規(guī)劃表福州百度網(wǎng)站排名優(yōu)化
  • 政府網(wǎng)站建設(shè)規(guī)范產(chǎn)品營銷方案案例范文
  • 做零售出口的網(wǎng)站seo綜合查詢怎么用的
  • 怎么做全民奪寶網(wǎng)站網(wǎng)絡(luò)服務(wù)
  • 做民宿最大的網(wǎng)站百度競價(jià)推廣代運(yùn)營
  • 蘭州網(wǎng)站排名優(yōu)化公司惠城網(wǎng)站設(shè)計(jì)
  • 深圳公司網(wǎng)站制作互聯(lián)網(wǎng)營銷的方式有哪些
  • 網(wǎng)頁設(shè)計(jì)網(wǎng)站免登陸企業(yè)培訓(xùn)體系
  • 一個(gè)網(wǎng)址建多個(gè)網(wǎng)站seo是什么意思?
  • 網(wǎng)站方案投放廣告
  • wordpress related posts福州整站優(yōu)化
  • 做的好的家裝網(wǎng)站網(wǎng)站頁面設(shè)計(jì)模板
  • 合肥網(wǎng)站設(shè)計(jì)建東莞百度seo推廣公司
  • 織夢教育咨詢企業(yè)網(wǎng)站模板sem什么意思
  • 代理注冊公司有什么風(fēng)險(xiǎn)合肥seo排名優(yōu)化公司
  • 網(wǎng)站建設(shè)公司yu泰安網(wǎng)站推廣優(yōu)化
  • 網(wǎng)站主機(jī)一個(gè)g西安網(wǎng)絡(luò)推廣公司
  • 自建導(dǎo)航站wordpress百度網(wǎng)盤資源鏈接入口
  • 網(wǎng)站改版提案百度指數(shù)與百度搜索量