微服務的編程測評系統2

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

文章目錄

  • 前言
  • 工程創建
    • 創建ck-oj
    • 創建oj-modules
    • 創建具體微服務oj-system
  • 推送碼云
  • 管理員登錄邏輯分析
  • docker安裝mysql
    • docker客戶端docker desktop安裝
    • 安裝mysql
  • mysql-plus和數據庫連接池介紹
    • 數據庫連接池
    • 為什么采?HikariCP
  • 集成mybatis-plus和數據庫連接池
  • 管理員登錄-表結構設計
  • 實體類
  • 雪花算法
    • 為什么不使??增id
    • 如何處理?增id問題:
    • 為什么不使?uuid作為主鍵
  • 實體類代碼優化
    • lombok
    • BaseEntity
  • 接口文檔
    • 內容
    • ?定義狀態碼和統一數據返回
    • 接口文檔定義
  • Swagger
    • 介紹
    • 引入
    • Swagger注解使用
    • 訪問接口文檔
    • 測試功能
  • 總結


前言

工程創建

先開發B端在開發C端
在這里插入圖片描述
在做后端,在做前端
先做登錄

在這里插入圖片描述

按照這個層級結構進行創建

創建ck-oj

在這里插入圖片描述

創建最外層ck-oj,然后刪掉src,因為這個不寫代碼

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.1</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.ck</groupId><artifactId>ck-oj</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><spring-boot.version>3.0.1</spring-boot.version><spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version><spring-cloud.version>2022.0.0</spring-cloud.version></properties><dependencies><!-- bootstrap 啟動器 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency></dependencies><dependencyManagement><dependencies><!-- SpringCloud Alibaba 微服務 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><!-- SpringCloud 微服務 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- SpringBoot 依賴配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
</project>

更改依賴

創建oj-modules

在這里插入圖片描述

刪除srcmul,更改pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.ck</groupId><artifactId>ck-oj</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>oj-modules</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>

創建具體微服務oj-system

在這里插入圖片描述
然后是創建啟動類

@SpringBootApplication
public class OjSystemApplication {public static void main(String[] args) {SpringApplication.run(OjSystemApplication.class, args);}
}

還有配置文件bootsrap.yml
這個是最先加載的配置文件

server:port: 9201spring:application:name: oj-system

其他同理

在這里插入圖片描述

在這里插入圖片描述
在服務這里可以對服務進行統一的啟動和停止

推送碼云

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

git config --global user.name ""
git config --global user.email ""
mkdir ck-oj  //已經有了,不用執行
cd ck-oj  
git init 
touch README.md  //防止倉庫為空才創建的,我們的目錄不為空,所以不用執行
git add README.md 
git commit -m "first commit"
git remote add origin https://gitee.com/once-three-hearted-grass/ck-oj.git
git push -u origin "master"

在這里插入圖片描述
這樣就成功了

管理員登錄邏輯分析

管理員用賬號密碼登錄,C端使用手機號和驗證碼登錄
不提供管理員注冊功能,提供一個不帶外開放的新增管理員接口

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

docker安裝mysql

docker客戶端docker desktop安裝

安裝官網

在這里插入圖片描述
在這里下載
首頁點擊get docker
然后就是一直安裝就可以了
安裝wsl
等等
這個的原理就是在本地安裝使用一個docker,和在本地使用鏡像等等

打開 Docker Desktop,點擊任務欄圖標 → Settings(或右鍵菜單)。
選擇 Docker Engine,在 JSON 配置中添加以下內容
修改鏡像源

修改成這樣就可以了```bash
{"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","https://mirror.ccs.tencentyun.com","https://registry.cn-hangzhou.aliyuncs.com","https://docker.mirrors.ustc.edu.cn","https://docker.1panel.live","https://atomhub.openatom.cn/","https://hub.uuuadc.top","https://docker.anyhub.us.kg","https://dockerhub.jobcher.com","https://dockerhub.icu","https://docker.ckyl.me","https://docker.awsl9527.cn"]
}

安裝mysql

# 下載鏡像到本地
docker pull mysql:5.7docker run -d --name oj-mysql -p 3306:3306 -e "TZ=Asia/Shanghai" -e "MYSQL_ROOT_PASSWORD=123456" mysql:5.7

docker run啟動一個容器
-d表示后臺運行
–name指定名稱
-p就是端口映射
-e是指定時區和root用戶的密碼
運行成功返回一個id

docker ps -a 顯示全部容器
docker ps 顯示正在運行的容器

docker rm 名稱或者id
刪除一個容器

docker exec -it 容器id bash

進入一個容器

mysql -u root -p123456
# 創建oj項???
CREATE USER 'ojtest'@'%' IDENTIFIED BY '123456';

然后就是創建數據庫

CREATE database if NOT EXISTS `ckoj_dev` ;

然后就是為這個用戶賦予這個數據庫的權限

GRANT CREATE,DROP,SELECT, INSERT, UPDATE, DELETE ON ckoj_dev.* TO 'ojtest'@'%';

創建測試表,并插?測試數據
用新用戶登錄一下數據庫

exit
mysql -u ojtest -p123456
show databases;
use ckoj_dev

創建一個表

CREATE TABLE `tb_test` (`test_id` bigint unsigned NOT NULL,`title` text NOT NULL,`content` text NOT NULL,PRIMARY KEY (`test_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO tb_test values(1,'test','test');
select * from tb_test;
update tb_test set title = 'test_update' where test_id = 1;
delete from tb_test;

測試一下

在這里插入圖片描述

這個就是數據庫管理工具

mysql-plus和數據庫連接池介紹

數據庫連接池

借助mybatis-plus操作數據庫雖然給我們提供了很?的便捷,但是這樣?式操作數據庫還是會存在?些問題:
? 頻繁的創建連接和銷毀連接:包括TCP層的握?和MySQL協議握?,這會消耗?量時間。
? 連接數不受控制:在業務流量?峰期,?量應?服務器可能同時請求數據庫連接,?數據庫能夠承載的連接數有限,這可能導致數據庫性能降低。
? 連接管理困難:開發者需要??管理數據庫連接的創建、使?和關閉,這增加了開發的復雜性和出錯的可能性。
數據庫連接池就是?來解決我們上?提到的這些問題,通過數據庫連接池我們可以:
? 提供統?的管理:數據庫連接池提供對數據庫連接創建等操作的統?管理。
? 提?系統性能 :由于創建和銷毀數據庫連接需要消耗時間和系統資源,如果每次需要進?數據庫操作時都進?創建和銷毀連接,會極?地影響系統性能。?使?連接池,可以復?已經創建好的連接,??提?了系統的性能。
? 提?資源利?率 :連接池通過復?已有連接,避免了頻繁創建和銷毀連接帶來的資源浪費,提?了系統資源的利?率。
? 提?系統穩定性 :數據庫連接池可以有效地控制系統中并發訪問數據庫的連接數量,避免因并發連接數過多?導致數據庫崩潰。同時,連接池還會定時檢查連接的有效性,?動替換掉?效連接,保證了系統的穩定性。
在這里插入圖片描述
要設置的為初始連接數3,最大連接數4,空閑時間10,超時時間10
事先創建好3個mybatis與數據庫的連接,如果a,b,c三個請求直接過來就可以鏈接了
第四個d請求來的話,如果前面處理完了,就可以接著使用,如果前面的還沒有處理完,那么就創建一個新的連接,為第四個
當e來的時候,沒有空余的鏈接的話,又因為最大鏈接為4,所以就會等待,等待10s,這個10s就是超時時間,超時的話,那么就請求失敗了
如果10s中之類,也就是空閑時間之類,沒有人使用第四個鏈接的話
那么第四個鏈接就會關閉掉了
常?的數據庫連接池:
C3P0、Druid、HikariCP

為什么采?HikariCP

?性能:HikariCP是?個?性能的數據庫連接池,它提供了快速、低延遲的連接獲取和釋放機制。在Spring Boot項?中,這可以顯著提?應?程序的響應速度和吞吐量,特別是在?并發場景下表現尤為出?。
資源優化:HikariCP對資源的使?進?了精細的管理和優化。它采?了?種內存效率極?的數據結構
來存儲和管理連接,減少了內存占?和垃圾回收的壓?。此外,HikariCP還通過減少不必要的線程和鎖競爭,進?步降低了系統資源消耗。
配置靈活:HikariCP提供了豐富的配置選項,允許開發者根據項?的具體需求進?微調。通過調整連接池??、超時時間、連接?命周期等參數,可以優化連接池的性能和穩定性。
與Spring Boot集成良好:Spring Boot對HikariCP提供了良好的?持,可以輕松地在項?中集成和使?。Spring Boot的?動配置功能可以?動配置HikariCP的連接池參數,簡化了配置過程。

默認都使用的這個數據庫連接池

集成mybatis-plus和數據庫連接池

先引入mybatis-plus的依賴
看官網

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.12</version>
</dependency>

我們在oj-system進行測試

但是這樣不利于我們做版本管理,我們可以在ck-oj這里做好版本管理

    <properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><spring-boot.version>3.0.1</spring-boot.version><spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version><spring-cloud.version>2022.0.0</spring-cloud.version><mybatis-plus.version>3.5.12</mybatis-plus.version></properties>
        <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>${mybatis-plus.version}</version></dependency>

然后就可以這樣引入了

除了引入mabatis,如果要操作數據庫的話,還要引入mysql的驅動

        <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency>

這個不用指定版本號
因為在ck-oj里面對版本號做了指定的

            <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency>

左鍵spring-boot-dependencies就可以看到mysql驅動的版本號了

@TableName("tb_test")
public class TestDomain {private Integer testId;private String title;private String content;
}

記得還要get和set方法

@SpringBootApplication
@MapperScan("com.ck.system.**.mapper") 
public class OjSystemApplication {public static void main(String[] args) {SpringApplication.run(OjSystemApplication.class, args);}
}

@MapperScan(“com.ck.system.**.mapper”)啟動類上的這個就可以把mapper包下面的接口都注入到spring中

spring:application:name: oj-systemdatasource:url: jdbc:mysql://localhost:3306/ckoj_dev?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8username: ojtestpassword: 123456hikari:minimum-idle: 5 # 最?空閑連接數maximum-pool-size: 20 # 最?連接數idle-timeout: 30000 # 空閑連接存活時間(毫秒)connection-timeout: 30000 # 連接超時時間(毫秒)

hikari是springboot自帶的,就算不配置,也會有默認的配置的,但還是配置一下吧

@Service
public class TestServiceImpl implements TestService{@Autowiredprivate TestMapper testMapper;@Overridepublic List<?> list() {return testMapper.selectList(new LambdaQueryWrapper<>());}
}

在這里插入圖片描述

管理員登錄-表結構設計

## datetime可以顯示 年月日時分秒
create table tb_sys_user(user_id bigint unsigned not null comment '用戶id',user_account varchar(20) not null comment '賬號',password varchar(20) not null comment '密碼',create_by bigint unsigned not null comment '創建人',update_by bigint unsigned  comment '修改人',create_time datetime not null comment '創造時間',update_time datetime comment '修改時間',primary key(`user_id`),unique key `idx_user_account` (`user_account`)
)

unique key是唯一索引

實體類

bitint對應Long
datetime 對應LocalDateTime

@TableName("tb_sys_user")
public class SysUser {private Long userId;private String userAccount;private String password;private Long createBy;private Long updateBy;private LocalDateTime createTime;private LocalDateTime updateTime;
}

記得還要有get和set方法

雪花算法

主鍵我們不再使用自動增長的id

為什么不使??增id

? 數據遷移和備份:如果你需要將數據從?個數據庫遷移到另?個數據庫,或者備份和恢復數據,?增主鍵可能會導致問題。例如,如果你在新數據庫中已經存在與舊數據庫相同的?增 ID,那么插?操作可能會失敗。
? 刪除和插?操作:如果表中存在?量刪除和插?操作,?增主鍵可能會導致 ID 值的不連續。這可能會浪費存儲空間,并可能導致某些應?程序或系統邏輯出現問題。
? 性能問題:在?并發的寫?操作中,?增主鍵可能會導致性能瓶頸。因為每次插?新記錄時,數據庫都需要找到下?個可?的?增 ID。這可能會增加寫操作的延遲。
? 可預測性:?增主鍵的值是可預測的,因為它們總是按照遞增的順序?成。這可能會帶來安全?險,例如,攻擊者可能會嘗試預測未來的 ID 值來插?惡意數據。
? 分布式環境問題:在分布式數據庫系統中,?增主鍵可能會帶來挑戰。如何保證各個節點?成的?增id是唯?的,這將需要額外的機制來協調各個節點。

如何處理?增id問題:

使?uuid或者雪花算法?成的主鍵。
? uuid:UUID(Universally Unique Identifier,通?唯?識別碼)是?種軟件建構的標準,?于在分布式計算環境中為元素提供唯?的辨識信息。UUID共占128位,分為五段,它具有唯?性、全局性、不變性等特點。

? 雪花算法:雪花算法(Snowflake)是?種分布式唯?ID?成算法,?于?成全局唯?的ID。它的設計?標是在分布式系統中?成ID,保證ID的唯?性、有序性和趨勢遞增。雪花算法的核?思想是將?個64位的ID分成多個部分,分別表?不同的信息。

在這里插入圖片描述

時間戳是精確到毫秒級的,是唯一的,機器表示又可以減少重復性,最后一個是一毫秒內生成id的序號

為什么不使?uuid作為主鍵

存儲空間:UUID存儲會占?更?的空間,這會增加數據庫的存儲需求,尤其是在?型數據庫或?并發的系統中,這可能會成為性能瓶頸。
索引性能:由于UUID相對較?,使?UUID作為主鍵會導致索引變得更?,從?影響查詢性能。特別是在執?范圍查詢或JOIN操作時,性能下降可能會更加明顯。
可讀性:UUID由?串字符組成,不易于?類閱讀或記憶。這可能會影響到開發、運維和調試的便利性。

使用uuid的話,還必須為字符串類型的,因為uuid含有字母,但是雪花算法就沒有字母,全是數字

    @TableId(type = IdType.ASSIGN_ID)private Long testId;

ASSIGN_ID就是雪花算法的id
ASSIGN_UUID才是uuid

    @GetMapping("/add")public String add() { return testService.add();}

在這里插入圖片描述
這樣就成功了

實體類代碼優化

    @TableId(type = IdType.ASSIGN_ID)private Long userId;

lombok

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>

lombok因為都會用,所以直接放在ck-oj

@TableName("tb_sys_user")
@Data
public class SysUser {@TableId(type = IdType.ASSIGN_ID)private Long userId;private String userAccount;private String password;private Long createBy;private Long updateBy;private LocalDateTime createTime;private LocalDateTime updateTime;
}

BaseEntity

然后就是createBy這些字段可以提取出來為BaseEntity,供所有的基本類的使用

@TableName("tb_sys_user")
@Data
public class SysUser extends BaseEntity{@TableId(type = IdType.ASSIGN_ID)private Long userId;private String userAccount;private String password;
}
@Data
public class BaseEntity {private Long createBy;private Long updateBy;private LocalDateTime createTime;private LocalDateTime updateTime;
}

因為BaseEntity 會給所有的oj-modules使用
所以我們在建一個模塊來放這些都要使用的東西
然后就是有些公共部分是所有模塊都要使用的,比如BaseEntity
但是有些公共部分,比如redis,就可能只有部分模塊要使用的,所以我們在oj-common里面再放一個模塊oj-common-core來放所有模塊都要使用的東西
在這里插入圖片描述
然后oj-modules里面都會使用BaseEntity的,所以我們直接在oj-modules里面引入oj-common-core

        <dependency><groupId>com.ck</groupId><artifactId>oj-common-core</artifactId><version>1.0-SNAPSHOT</version></dependency>

版本號統一在ck-oj里面管理

        <oj-common-core.version>1.0-SNAPSHOT</oj-common-core.version>
        <dependency><groupId>com.ck</groupId><artifactId>oj-common-core</artifactId><version>${oj-common-core.version}</version></dependency>

這樣就行了

import com.ck.common.core.domain.BaseEntity;

接口文檔

內容

? 接?概述:包括接?名稱、接?功能、接?類別等。
? 接?地址:接?的唯?訪問地址。
? 請求?法:定義接?的請求?式,如GET(查詢)、POST(新增)、PUT(修改)、DELETE(刪除)等。
? 請求參數:定義請求時需要傳遞的參數,包括路徑參數(PathParameters)、查詢參數(QueryParameters)、請求頭(Headers)、請求體(Body)等。
? 響應數據:定義接?返回的數據格式,包括狀態碼(Status Code)、消息(Message)、數據體(Data)等。(注意:包含接?請求出現錯誤時,返回的狀態碼和錯誤信息。不同接?格式統?狀態碼含義相同)
? 請求和響應?例:為了更好地描述接?的使?,接??檔中會提供?些具體的接?請求和響應?
例,以供讀者參考。

public class R<T> {/*** 消息狀態碼*/private int code;/*** 消息內容*/private String msg;/*** 數據對象*/private T data;
}

Http協議狀態碼
在這里插入圖片描述

?定義狀態碼和統一數據返回

1000 SUCCESS
服務器報錯
2000 ERROR 服務繁忙請稍后重試(前端根據錯誤碼顯?:服務繁忙請稍后重試)
操作失敗,但是服務器不存在異常,這個是執行錯誤

3000 FAILED 操作失敗
這個業務錯誤是自己判斷出來的錯誤,比如密碼錯誤,用戶名重復等等
3001 FAILED_UNAUTHORIZED 未授權

@Data
public class R <T>{private int code;private String msg;private T data;
}
@AllArgsConstructor
@Getter
public enum ResultCode {//操作唱功SUCCESS (1000, "操作成功"),//服務器內部錯誤,友好提?ERROR (2000, "服務繁忙請稍后重試"),//操作失敗,但是服務器不存在異常FAILED (3000, "操作失敗"),FAILED_UNAUTHORIZED (3001, "未授權"),FAILED_PARAMS_VALIDATE (3002, "參數校驗失敗"),FAILED_NOT_EXISTS (3003, "資源不存在"),FAILED_ALREADY_EXISTS (3004, "資源已存在"),AILED_USER_EXISTS (3101, "??已存在"),FAILED_USER_NOT_EXISTS (3102, "??不存在"),FAILED_LOGIN (3103, "??名或密碼錯誤"),FAILED_USER_BANNED (3104, "您已被列??名單, 請聯系管理員.");private int code;private String msg;
}

枚舉類型必須定義一個構造函數,所以用注解AllArgsConstructor

接口文檔定義

    @RequestMapping("/login")public R<Void> login(LoginDTO loginDTO){return sysUserService.login(loginDTO.getUserAccount(), loginDTO.getPassword());}
    @Overridepublic R<Void> login(String userAccount, String password) {LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.select(SysUser::getPassword).eq(SysUser::getUserAccount, userAccount);SysUser sysUser = sysUserMapper.selectOne(queryWrapper);R<Void> r = new R<>();if(sysUser == null){r.setCode(ResultCode.FAILED_USER_NOT_EXISTS.getCode());r.setMsg(ResultCode.FAILED_USER_NOT_EXISTS.getMsg());return r;}if(!sysUser.getPassword().equals(password)){r.setCode(ResultCode.FAILED_LOGIN.getCode());r.setMsg(ResultCode.FAILED_LOGIN.getMsg());return r;}r.setCode(ResultCode.SUCCESS.getCode());r.setMsg(ResultCode.SUCCESS.getMsg());return r;}

Swagger

介紹

官網

Swagger是?個接??檔?成?具,它可以幫助開發者?動?成接??檔。當項?的接?發?變更時,Swagger可以實時更新?檔,確保?檔的準確性和時效性。Swagger還內置了測試功能,開發者可以直接在?檔中測試接?,?需編寫額外的測試代碼。

引入

這是一個公共的組件,所以得在oj-common里面使用,但是并不是所有的模塊都要使用,所以創建一個oj-common-swagger

        <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.2.0</version></dependency>
        <springdoc-openapi.version>2.2.0</springdoc-openapi.version>
@Configuration
public class SwaggerConfig {@Beanpublic OpenAPI openAPI() {return new OpenAPI().info(new Info().title("在線oj系統").description("在線oj系統接??檔").version("v1"));}
}

這個是swagger的配置類
定義在oj-common-swagger
但是這個配置類是一個bean,被其他模塊引入的時候,是不會自動注入到其他模塊的bean中的
所以還要配置,讓oj-common-swagger中的bean,在oj-common-swagger被引入依賴的時候,自動注入到那個引入它的模塊中
在resources目錄下創建文件夾META-INF/spring,spring是子文件夾,然后再里面創建文件
org.springframework.boot.autoconfigure.AutoConfiguration.imports
配置com.ck.common.swagger.SwaggerConfig
這樣就可以了
在這里插入圖片描述
這樣就可以了

然后再oj-system里面

        <dependency><groupId>com.ck</groupId><artifactId>oj-common-swagger</artifactId><version>${oj-common-swagger.version}</version></dependency>

就可以使用swagger了

Swagger注解使用

@Tag(name = "管理員用戶接口API")
public class SysUserController {

Tag注解使用在類的上面,表示對這個類的所有接口進行分組的描述

    @Operation(summary = "新增管理員", description = "根據提供的信息新增管理員??")@PostMapping("/add")@ApiResponse(responseCode = "1000", description = "操作成功")@ApiResponse(responseCode = "2000", description = "服務繁忙請稍后重試")@ApiResponse(responseCode = "3101", description = "??已存在")public R<Void> add(@RequestBody SysUserSaveDTO saveDTO) {return null;}

Operation在方法上面使用,表示對這個接口的總體描述
ApiResponse描述code和msg

@Data
public class SysUserSaveDTO {@Schema(description = "用戶賬號")private String userAccount;@Schema(description = "用戶密碼")private String password;
}

Schema用于描述字段

@DeleteMapping("/{userId}")@Operation(summary = "刪除??", description = "通過??id刪除??")@Parameters(value = {@Parameter(name = "userId", in = ParameterIn.PATH, description = "??ID")})@ApiResponse(responseCode = "1000", description = "成功刪除??")@ApiResponse(responseCode = "2000", description = "服務繁忙請稍后重試")@ApiResponse(responseCode = "3101", description = "??不存在")public R<Void> delete(@PathVariable Long userId) {return null;}

@Parameters
? 介紹:?于指定@Parameter注解對象數組,描述操作的輸?參數。
? ?于:?法。
? @Parameter
? 介紹:?于描述輸?參數。
? ?于:?法。
? 常?屬性:
? name:參數的名稱。
? in:參數的位置,可以是 path、query、header、cookie 中的?種。
? description:參數的描述。

其中如果是PathVariable 類型的話,對應就是PATH

    @Operation(summary = "??詳情", description = "根據查詢條件查詢??詳情")@GetMapping("/detail")@Parameters(value = {@Parameter(name = "userId", in = ParameterIn.QUERY, description = "??ID"),@Parameter(name = "sex", in = ParameterIn.QUERY, description = "??性別")})@ApiResponse(responseCode = "1000", description = "成功獲取??信息")@ApiResponse(responseCode = "2000", description = "服務繁忙請稍后重試")@ApiResponse(responseCode = "3101", description = "??不存在")public R<SysUserVO> detail(@RequestParam(required = true) Long userId, @RequestParam(required = false) String sex) {return null;}

如果是get請求的RequestParam的話,對應就是QUERY

訪問接口文檔

訪問網址http://127.0.0.1:9201/swagger-ui/index.html

這樣就成功了

在這里插入圖片描述
swaggerconfig配置的就是最上面的標題和描述

然后完善一下我們的login接口

    @PostMapping("/login")@Operation(summary = "用戶登錄", description = "用戶用賬號和密碼登錄")@ApiResponse(responseCode = "1000", description = "操作成功")@ApiResponse(responseCode = "2000", description = "服務繁忙請稍后重試")@ApiResponse(responseCode = "3102", description = "??不存在")@ApiResponse(responseCode = "3103", description = "??名或密碼錯誤")public R<Void> login(LoginDTO loginDTO){return sysUserService.login(loginDTO.getUserAccount(), loginDTO.getPassword());}

測試功能

swagger還有一個測試功能
其實很簡單,就是打斷點,然后用debug的形式啟動項目

然后去接口文檔上面try it ot
就可以了
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
這樣就成功了

總結

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

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

相關文章

AR智能巡檢:電力運維的數字化變革

在電力行業快速發展的當下&#xff0c;傳統運維方式已難以滿足現代電網對高效、安全的需求。近年來&#xff0c;增強現實&#xff08;AR www.teamhelper.cn &#xff09;技術的興起為電力巡檢帶來了全新的解決方案。通過實時數據可視化、遠程協作和智能分析&#xff0c;AR技術…

NeRF和3DGS原理詳細

NeRF和3DGS一、傳統三維表征方法1.1 顯示表征1.2 隱式表征二、NeRF&#xff08;Nerual Radiance Field&#xff09;2.1 NeRF場景表示2.2 NeRF訓練流程2.3 NeRF體渲染2.4 NeRF位置編碼2.5 NeRF體素分層采樣&#xff08;Volume Hierarchical Sampling&#xff09;2.6 NeRF網絡結構…

035_ClaudeCode_MCP_介紹

035_ClaudeCode_MCP_介紹 摘要 Model Context Protocol&#xff08;MCP&#xff09;是一個開放的標準化協議&#xff0c;專為大型語言模型提供上下文數據而設計。作為Claude Code生態系統的重要組成部分&#xff0c;MCP如同"AI應用程序的USB-C端口"&#xff0c;提供…

Python 程序無法找到 Oracle 的 64 位客戶端庫 (libclntsh.so)

數據庫錯誤: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://oracle.github.io/odpi/doc/installation.html#linux for help 這個錯誤表明 Python 程序無法找到…

Kubernetes常用命令總結

文章目錄Kubernetes常用命令總結1. 集群管理命令kubectl cluster-infokubectl get nodeskubectl describe node <node-name>kubectl top nodes2. Pod相關命令kubectl get podskubectl get pods -o widekubectl describe pod <pod-name>kubectl logs <pod-name&g…

roboflow使用教程

如何利用roboflow標注自己的訓練集、調用開源數據集 官網&#xff1a;Roboflow: Computer vision tools for developers and enterprises&#xff08;國內代理進不去&#xff09; 先注冊登陸進去 訓練自己的數據集 點擊“New Project”,名字按照自己的需求來 我不想寫了&am…

IDEA中使用Tomcat兩種方式

Catalogue1 集成本地Tomcat2 Tomcat Maven插件&#xff08;推薦&#xff09;1 集成本地Tomcat 將本地Tomcat集成到Idea中&#xff0c;然后進行項目部署即可 點擊編輯配置 點擊加號 添加local的Tomcat 配置Application Server 可以修改一下Name 至此&#xff0c;配置完成 …

服務器上的文件復制到本地 Windows 系統

在 Windows 上通過 SSH 連接到 Linux 服務器后&#xff0c;如果需要將服務器上的文件復制到本地 Windows 系統&#xff0c;可以使用以下幾種方法&#xff1a;方法 1&#xff1a;使用 scp&#xff08;Secure Copy&#xff09;命令 scp&#xff08;基于 SSH 的安全復制&#xff0…

大語言模型置信度增強實戰指南

LLM怎么簡單增強置信度 在大語言模型(LLM)的應用中,“置信度增強”核心目標是提升模型輸出的可靠性(減少錯誤/幻覺) 并讓模型更清晰地表達自身的不確定性(避免“一本正經地胡說”)。常用方式可分為“輸出優化”“知識補充”“校準調整”三大類, 一、基于“推理過程優…

NLP:人名分類器案例分享

本文目錄&#xff1a;一、案例介紹&#xff08;一&#xff09;關于人名分類&#xff08;二&#xff09;人名分類數據預覽二、案例步驟&#xff08;一&#xff09;導入工具包&#xff08;二&#xff09;數據預處理1. 獲取常用的字符數量2. 國家名種類數和個數3.讀數據到內存4.構…

3分鐘實戰!用DeepSeek+墨刀AI生成智能對話APP原型圖

如今&#xff0c;AI生成原型圖已經逐漸成為產品經理的一項常用輔助技能&#xff0c;不僅能加快設計進程&#xff0c;還能顯著提升前期溝通效率。最近我嘗試將大語言模型工具與AI原型工具結合測試&#xff0c;目標是看看是否能生成更高質量的原型頁面。直到我使用DeepSeek墨刀AI…

CentOS網絡配置與LAMP環境搭建指南

一、CentOS配置網絡1、查看網卡名稱ifconfig2、找到網卡對應配置文件網卡存放路徑 &#xff1a;/etc/sysconfig/network-scriptscd /etc/sysconfig/network-scripts3、修改網卡對應配置文件使用 vi/vim 打開文件&#xff0c;查看以下內容vim ifcfg-ens33將ONBOOTno 改為 ONBOOT…

TinyMCE 富文本編輯器在 vue2 中的使用 @tinymce/tinymce-vue

TinyMCE是一款功能強大、高度可定制的富文本編輯器。官方文檔 TinyMCE DOCS tinymce-vue包的版本4及更高版本支持Vue.js 3。但不支持Vue.js 2.x。對于Vue.js 2。X應用程序&#xff0c;使用tinymce-vue版本3。 安裝TinyMCE和Vue集成包 npm install tinymce/tinymce-vue3 tiny…

LP-MSPM0G3507學習--04GPIO控制

關鍵函數&#xff1a; DL_GPIO_readPins(GPIO_Regs* gpio, uint32_t pins):同時讀一組端口DL_GPIO_writePins(GPIO_Regs* gpio, uint32_t pins)&#xff1a;同時寫一組端口DL_GPIO_setPins(GPIO_Regs* gpio, uint32_t pins)&#xff1a;對指定某組端口的某管腳置高DL_GPIO_cle…

LVS(Linux virtual server)-實現四層負載均衡

一、簡介LVS:Linux Virtual Server&#xff0c;負載調度器&#xff0c;內核集成&#xff0c;章文嵩&#xff0c;阿里的四層SLB(Server LoadBalance)是基 于LVSkeepalived實現LVS 官網: http://www.linuxvirtualserver.org/二、LVS運行原理2.1LVS 的集群結構2.2lvs相關概念RS&am…

Kubernetes CNI網絡插件性能瓶頸排查與優化實踐

Kubernetes CNI網絡插件性能瓶頸排查與優化實踐 CNI&#xff08;Container Network Interface&#xff09;是 Kubernetes 網絡層的核心組件&#xff0c;不同 CNI 插件實現了容器間網絡通信、多租戶隔離、流量限速等功能。然而在大規模集群或高并發業務場景下&#xff0c;CNI 插…

20250720-6-Kubernetes 調度-nodeName字段,DaemonS_筆記

一、污點與容忍&#xfeff;1. 給節點添加污點&#xfeff;1&#xff09;命令格式基本語法&#xff1a;kubectl taint node [node] keyvalue:[effect]示例&#xff1a;kubectl taint node k8s-node1 gpuyes:NoSchedule操作說明&#xff1a;與打標簽命令類似&#xff0c;將"…

微軟開源項目 Detours 詳細介紹與使用實例分享

目錄 1、Detours概述 2、Detours功能特性 3、Detours工作原理 4、Detours應用場景 5、Detours兼容性 6、Detours具體使用方法 7、Detours使用實例 - 使用Detours攔截系統庫中的UnhandledExceptionFilter接口,實現對程序異常的攔截 C++軟件異常排查從入門到精通系列教程…

研發知識系統選型實戰:從 Notion 到 Gitee Wiki 的迭代經驗

關鍵詞&#xff1a;知識管理、版本控制、協作編輯、國產平臺、研發效能 在日常研發管理中&#xff0c;知識管理平臺往往被視為“非核心工具”&#xff0c;但它的好壞直接影響著團隊交接效率、文檔可用性以及協作深度。過去幾年&#xff0c;我們團隊先后使用過 Notion、Confluen…

從一開始的網絡攻防(三):sqlmap快速上手

一、確定目標 使用sqlmap的第一步是確定探測的目標&#xff0c;一般有四種&#xff1a; 數據庫URL文件Google批量掃 環境 Target IP: 192.168.8.133 Port: 13306(Mysql)、8088(sqli_labs) mysql&#xff1a; docker pull的最新mysql sqlmap github&#xff1a;https://g…