精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解 Spring Boot 3.x 中使用 SpringDoc 2 / Swagger3

開發 架構
Swagger 的核心思想是通過定義和描述 API 的規范、結構和交互方式,以提高 API 的可讀性、可靠性和易用性,同時降低 API 開發的難度和開發者之間的溝通成本。

大家好,我是碼哥,《Redis 高手心法》作者。

SpringBoot 已經成為 Java 開發的首選框架,今天碼哥跟大家聊一聊 Spring Boot3 如何與 Swagger3 集成打造一個牛逼轟轟的接口文檔。

為什么要用 Swagger

唐二婷:我最討厭兩件事:

  1. 別人接口不寫注釋;
  2. 自己寫接口注釋。

我們都被接口文檔折磨過,前端抱怨后端的接口文檔一坨屎;后端覺得寫接口文檔浪費時間。

每個項目都有成百上千個接口調用,這時候再要求人工編寫接口文檔并且保證文檔的實時更新幾乎是一件不可能完成的事,所以這時候我們迫切需要一個工具,一個能幫我們自動化生成接口文檔以及自動更新文檔的工具。

它就是 Swagger。

Swagger 的核心思想是通過定義和描述 API 的規范、結構和交互方式,以提高 API 的可讀性、可靠性和易用性,同時降低 API 開發的難度和開發者之間的溝通成本。

這里我采用了 Swagger3.0(Open API 3.0)的方式集成到 SpringBoot。springfox-boot-start 和 springfox-swagger2 都是基于 Swagger2.x 的。

這里將介紹 springdoc-openapi-ui,它是 SpringBoot 基于 Open API 3.0(Swagger3.0)

SpringFox 與 Swagger 的關系

Springfox 是一套可以幫助 Java 開發者自動生成 API 文檔的工具,它是基于 Swagger 2.x 基礎上開發的。

除了集成 Swagger 2.x,Springfox 還提供了一些額外功能,例如自定義 Swagger 文檔、API 版本控制、請求驗證等等。

但是隨著時間的推移,Swagger2.x 終究成為歷史,所以我們可以看出 springfox-boot-starter 的坐標從 3.0.0 版本(2020 年 7 月 14 日)開始就一直沒有更新;

也得注意的是 springfox-swagger2 坐標和 springfox-boot-start 是一樣的,但 springfox-boot-start 只有 3.0.0 版本。這里我就不在使用 Swagger2.x 版本

SpringDoc(推薦)

SpringDoc 對應坐標是 springdoc-openapi-ui,它是一個集成 Swagger UI 和 ReDoc 的接口文檔生成工具,在使用上與 springfox-boot-starter 類似,但提供了更為靈活、功能更加強大的工具。

其中除了可以生成 Swagger UI 風格的接口文檔,還提供了 ReDoc 的文檔渲染方式,可以自動注入 OpenAPI 規范的 JSON 描述文件,支持 OAuth2、JWT 等認證機制,并且支持全新的 OpenAPI 3.0 規范。

SpringBoot 3 集成 Swagger3.0

唐二婷:開干吧,Spring Boot3 如何集成這么吊炸天的工具。

需要注意的是,我們一般不會選擇原生的 Swagger maven 坐標來集成 Swagger。而是通過 springdoc-openapi-ui 的 Maven 坐標。

它可以很好的和 Spring 或 SpringBoot 項目集成;這個坐標也被 Spring 社區廣泛支持和認可,并被認為是集成 Swagger UI 和 OpenAPI 規范的一個優秀選擇。

引入 Maven

在該示例中,我使用 Spring Boot 3.0.2 集成 Swagger 3.0。

springdoc-openapi-starter-webmvc-ui:目前最新版本是 2.6.0,適用于 Spring Boot 3.x 和 Spring Framework 6。支持 Jakarta 命名空間(例如,jakarta.validation),適合 Spring Boot 3 的 Jakarta EE 轉換。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springdoc</groupId>
        <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

</dependencies>

配置 SwaggerOpenApiConfig

我們通過配置類的方式創建一個 OpenAPI 的 Bean 對象就可以創建 Swagger3.0 的文檔說明。

import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Swagger3Config {
    @Bean
    public OpenAPI springShopOpenAPI() {
        return new OpenAPI()
                .info(new Info().title("碼哥跳動 Swagger3 詳解")
                        .description("Swagger3 Spring Boot 3.0 application")
                        .version("v0.0.1")
                        .license(new License().name("Apache 2.0").url("http://springdoc.org")))
                .externalDocs(new ExternalDocumentation()
                        .description("swagger 3 詳解")
                        .url("https://springshop.wiki.github.org/docs"));
    }


}

OpenAPI 對象是 Swagger 中的核心類之一,用于描述整個 API 的結構和元數據。

Swagger2 和 Swagger3 使用的是完全不同的兩套注解,所以原本使用 Swagger2 相關注解的代碼頁需要完全遷移,改為使用 Swagger3 的注解。

Swagger2

Swagger3

@Api

@Tag

@ApiOperation

@Operation

@ApiImplicitParams

@Parameters

@ApiImplicitParam

@Parameter

@ApiModel

@Schema

@ApiModelProperty

@Schema

@ApiResponses

@ApiResponses

@ApiResponse

@ApiResponse

@ApiIgnore

@Hidden 或者 其他注解的 hidden = true 屬性

配置文件

通過以下配置來控制 swagger 的開關和訪問地址:WEB 界面的顯示基于解析 JSON 接口返回的結果, 如果 api-docs 關閉, swagger-ui 即使 enable 也無法使用。

server:
  port: 8013

spring:
  application:
    name: magebyte-swagger

springdoc:
  api-docs:
    enabled: true # 開啟OpenApi接口
    path: /v3/api-docs  # 自定義路徑,默認為 "/v3/api-docs"
  swagger-ui:
    enabled: true # 開啟swagger界面,依賴OpenApi,需要OpenApi同時開啟
    path: /swagger-ui.html # 自定義路徑,默認為"/swagger-ui/index.html"
    # Packages to include,多個用 , 分割
    packagesToScan: zero.magebyte.magebyte.swagger.controller

需要注意的是,packagesToScan 用于指定 Controller 接口包路徑。

@Schema

Swagger3 用 @Schema 注解對象和字段, 以及接口中的參數類型。

@Setter
@Getter
@Schema(description = "響應返回數據對象")
public class Result<T> implements Serializable {

    @Schema(
            title = "code",
            description = "響應碼",
            format = "int32",
            requiredMode = Schema.RequiredMode.REQUIRED
    )
    private Integer code;

    @Schema(
            title = "msg",
            description = "響應信息",
            accessMode = Schema.AccessMode.READ_ONLY,
            example = "成功或失敗",
            requiredMode = Schema.RequiredMode.REQUIRED
    )
    private String message;

    @Schema(title = "data", description = "響應數據", accessMode = Schema.AccessMode.READ_ONLY)
    private T data;
}

返回對象定義。

@Data
@AllArgsConstructor
@Schema(title = "學生模型VO", description = "響應視圖學生模型VO")
public class StudentVO implements Serializable {
    @Schema(name = "學生ID", description = "學生ID屬性", format = "int64", example = "1")
    private Long id;            // 學生ID
    @Schema(name = "學生姓名", description = "學生姓名屬性", example = "jack")
    private String name;        // 學生姓名
    @Schema(name = "學生年齡", description = "學生年齡屬性", format = "int32", example = "24")
    private Integer age;        // 學生年齡
    @Schema(name = "學生地址", description = "學生地址屬性", example = "安徽合肥")
    private String address;     // 學生地址
    @Schema(name = "學生分數", description = "學生分數屬性", format = "double", example = "55.50")
    private Double fraction;    // 學生分數
    @Schema(name = "學生愛好", description = "學生愛好屬性(List類型)",
            type = "array", example = "[\"玩\", \"寫字\"]")
    private List<String> likes; // 學生愛好
}

@Paramete

@Parameter 注解用于描述方法參數。如果不希望顯示某個參數, 用@Parameter(hidden = true)修飾。

@Parameters({
    @Parameter(name = "currentPage", description = "當前頁碼", required = true),
    @Parameter(name = "size", description = "當前頁大小", example = "10"),
    @Parameter(name = "queryUser", description = "用戶查詢條件")
})

Controller 接口定義

啟動項目,打開鏈接:http://localhost:8013/swagger-ui/index.html

@RestController
@RequestMapping("/students")
@Tag(name = "StudentControllerAPI", description = "學生控制器接口"
        , externalDocs = @ExternalDocumentation(description = "這是一個接口文檔介紹"))
public class StudentController {


    @Operation(
            summary = "根據Id查詢學生信息", description = "根據ID查詢學生信息,并返回響應結果信息",
            parameters = {
                    @Parameter(name = "id", description = "學生ID", required = true, example = "1")
            },
            responses = {
                    @ApiResponse(
                            responseCode = "200",
                            description = "響應成功",
                            content = @Content(
                                    mediaType = "application/json",
                                    schema = @Schema(
                                            title = "Resul和StudentVO組合模型",
                                            description = "返回實體,AjaxResult內data為StudentVO模型",
                                            anyOf = {Result.class, StudentVO.class}
                                    )
                            )
                    ),
                    @ApiResponse(
                            responseCode = "500",
                            description = "響應失敗",
                            content = @Content(
                                    mediaType = "application/json",
                                    schema = @Schema(
                                            title = "Resul模型",
                                            description = "返回實體,Result內 data為空",
                                            implementation = Result.class
                                    )
                            )
                    )
            }
    )
    @GetMapping("/{id}")
    public Result<StudentVO> findOneStudent(@PathVariable(value = "id") Long id) {
        //模擬學生數據
        List<String> likes = Arrays.asList("抓魚", "爬山", "寫字");
        StudentVO studentVO = new StudentVO(id, "張三", 22, "惠州", 93.5, likes);
        return new Result<StudentVO>(200, "成功", studentVO);
    }


    @Operation(
            summary = "查詢全部學生數據",
            description = "查詢學生信息,并返回響應結果信息",
            responses = {
                    @ApiResponse(
                            responseCode = "200",
                            description = "響應成功",
                            content = @Content(
                                    mediaType = "application/json",
                                    schema = @Schema(
                                            title = "AjaxResul和StudentVO組合模型",
                                            description = "返回實體,Result內data為StudentVO模型(并且StudentVO為集合)",
                                            anyOf = {Result.class, StudentVO.class}
                                    )
                            )
                    )
            }

    )
    @GetMapping("/lists")
    public Result<List<StudentVO>> findAllStudent() {
        //模擬學生數據
        List<String> likes = Arrays.asList("抓魚", "爬山", "寫字");
        StudentVO student1 = new StudentVO(1L, "張三", 22, "深圳", 93.5, likes);
        StudentVO student2 = new StudentVO(2L, "李四", 24, "惠州", 99.5, likes);
        return new Result(200, "成功", Arrays.asList(student1, student2));
    }

    @Operation(summary = "學生查詢接口", description = "學生查詢接口")
    @GetMapping("/query")
    public Result<List<StudentVO>> queryStudent(QueryStudentDTO queryStudentDTO) {
        //模擬學生數據
        List<String> likes = Arrays.asList("抓魚", "爬山", "寫字");
        StudentVO student1 = new StudentVO(1L, "張三", 22, "廣東深圳", 93.5, likes);
        StudentVO student2 = new StudentVO(2L, "李四", 24, "廣東惠州", 99.5, likes);
        return new Result<List<StudentVO>>(200, "成功", Arrays.asList(student1, student2));
    }

    @Operation(summary = "學生添加接口", description = "學生添加接口")
    @PostMapping
    public Result saveStudent(@RequestBody StudentDTO studentDTO) {
        System.out.println("成功添加數據:" + studentDTO);
        return new Result(200, "成功", null);
    }


}

責任編輯:姜華 來源: 碼哥跳動
相關推薦

2022-07-21 11:04:53

Swagger3Spring

2012-06-17 20:19:29

2024-07-09 08:25:48

2024-05-07 08:31:09

SpringFlowable業務流程

2025-03-21 09:30:00

2024-05-23 08:07:05

2024-07-11 08:24:22

2024-07-05 10:17:08

數據流系統CPU

2024-07-01 08:11:31

2024-07-01 08:18:14

2021-04-13 07:29:13

Swagger3接口Postman

2021-05-07 20:27:14

SpringBootSwagger3文檔

2020-11-02 07:00:29

Spring Boo注解自動化

2025-08-04 02:11:00

2024-06-28 09:30:36

2021-12-09 10:17:25

部署實戰Linux

2011-08-16 10:41:40

安裝XcodeLion

2011-04-27 09:39:53

EclipseIntelliJ

2017-10-24 15:11:39

Python 2.x 3.x

2014-11-28 09:47:26

Python
點贊
收藏

51CTO技術棧公眾號

欧美日韩另类综合| 91爱视频在线| 五月天婷婷在线观看视频| av观看在线| 99热精品一区二区| 国产精品色午夜在线观看| 欧美性猛交xxxxx少妇| 偷拍精品福利视频导航| 6080yy午夜一二三区久久| 国产精品久久..4399| yiren22综合网成人| 国产91精品入口| 国产精品一区二区三区久久久| 欧美精品一级片| 精品国产一区二区三区| 精品国产伦一区二区三区免费| 成人精品小视频| 欧美1—12sexvideos| 国产女人18水真多18精品一级做| 99超碰麻豆| 国产成人a v| 影音先锋亚洲精品| 色婷婷久久一区二区| 亚洲熟女一区二区| 午夜电影一区| 欧美日韩视频在线一区二区| 国产成人永久免费视频| 日本天堂在线观看| 26uuu亚洲婷婷狠狠天堂| 2019国产精品视频| 亚洲图片欧美在线| 丝袜亚洲精品中文字幕一区| 久久久久久这里只有精品| 日本伦理一区二区三区| 国产成人ay| 亚洲美女久久久| a级片在线观看视频| 国产高清精品二区| 欧美日韩国产一区二区三区地区| 欧美韩国日本在线| 手机在线观看av网站| 亚洲在线一区二区三区| 成人在线免费观看网址| 日本美女高清在线观看免费| 欧美韩国日本综合| 日产精品一线二线三线芒果| 四虎影视精品成人| www.亚洲色图| 国产一区二区在线网站| 日本高清视频免费观看| 国产成+人+日韩+欧美+亚洲| 91|九色|视频| 性做久久久久久久| 成人三级在线视频| 国产日韩欧美亚洲一区| 欧美性受xxxx狂喷水| 成人app下载| 久久精品人成| 国产有码在线| 中文字幕第一区第二区| 亚洲日本精品| 麻豆网在线观看| 亚洲欧美视频在线观看| 8x8ⅹ国产精品一区二区二区| 综合久久2019| 亚洲r级在线视频| 日韩在线综合网| 欧美第一视频| 欧美日韩国产精品成人| 日韩欧美色视频| 六月丁香久久丫| 亚洲人成在线免费观看| 天天干天天操天天拍| 91成人超碰| 97热在线精品视频在线观看| 欧美一区二区三区不卡视频| 免费精品视频最新在线| 亚洲一区中文字幕| 日本高清视频在线| 国产日产亚洲精品系列| 一区二区三区在线视频111| av软件在线观看| 亚洲成人综合网站| 国产一级不卡毛片| 爱情电影网av一区二区| 欧美r级在线观看| 亚洲av无码国产精品久久| 日韩欧美电影| 久久久久免费精品国产| 亚洲第一网站在线观看| 国产精品一区2区| 久久精品国产理论片免费 | 亚洲国产97在线精品一区| 精品人妻少妇嫩草av无码| 色喇叭免费久久综合网| 国模精品视频一区二区| 波多野结衣不卡| 高清shemale亚洲人妖| 欧美一区国产一区| 免费在线看电影| 欧美伊人久久久久久午夜久久久久| 91网址在线观看精品| 欧美成人午夜77777| 深夜精品寂寞黄网站在线观看| 国产亚洲精品av| 久久综合综合久久综合| 国产日韩三区| 老司机在线永久免费观看| 欧美日韩中文在线| 日本wwwxx| 成人a'v在线播放| 992tv在线成人免费观看| 91午夜交换视频| 久久一区二区视频| 欧美性猛交内射兽交老熟妇| 日韩精品一区二区三区av| 精品国产一区二区三区忘忧草| 人妻熟人中文字幕一区二区| 99精品福利视频| 亚洲影视中文字幕| 日本暖暖在线视频| 在线视频一区二区三区| 亚洲av无码一区二区三区网址| 91精品一区国产高清在线gif | 欧美日韩在线一| 天堂av一区| www.亚洲免费视频| 亚洲第一区av| 久久久久久久久久久黄色| 国产九九九九九| 少妇精品在线| 久久国产精品影视| 亚洲一区 中文字幕| 国产午夜亚洲精品理论片色戒| 97在线国产视频| 51亚洲精品| 欧美精品激情在线| 亚洲成人一二三区| 亚洲一本大道在线| 日本天堂在线播放| 欧美日韩福利| 成人在线资源网址| 亚洲第一图区| 欧美va亚洲va| 免费在线观看国产精品| 国产99久久久国产精品免费看| 中文字幕av导航| 高清一区二区| 免费av一区二区| 国产毛片在线视频| 一区二区三区在线视频观看 | 欧美交换配乱吟粗大25p| 国产麻豆精品| 久久久久久美女| 婷婷亚洲一区二区三区| 日韩欧美极品在线观看| 国产一二三四五区| 老汉av免费一区二区三区| 影音先锋在线亚洲| 欧美国产中文高清| 欧美肥老妇视频| 手机看片一区二区三区| 欧美日韩裸体免费视频| 欧美18—19性高清hd4k| 美女精品自拍一二三四| 亚洲资源视频| 亚洲综合网狠久久| 国内精品400部情侣激情| 色在线免费视频| 在线免费不卡电影| 午夜剧场免费在线观看| 国产成人精品一区二| 人人妻人人做人人爽| 日韩电影不卡一区| 国产精品久久久一区| 国产激情视频在线| 亚洲国产精品人人爽夜夜爽| 亚洲天堂视频在线播放| 综合分类小说区另类春色亚洲小说欧美| 性鲍视频在线观看| 亚洲制服av| 在线观看日本一区| 国产图片一区| 国产精品美女无圣光视频| yellow91字幕网在线| 亚洲国产小视频在线观看| 99re热视频| 亚洲综合另类小说| 日本性高潮视频| 国产大陆a不卡| 国产视频一区二区视频| 一区二区三区毛片免费| 久久精品日产第一区二区三区精品版 | 天天色 色综合| 毛片视频免费播放| 9色porny自拍视频一区二区| 污污网站免费看| 99riav国产精品| 欧美做受777cos| 国产伦精品一区二区三区千人斩| 91av一区二区三区| 99久久亚洲国产日韩美女| 午夜精品福利视频| 免费大片黄在线观看视频网站| 亚洲丁香婷深爱综合| 一区二区日韩视频| 日本电影亚洲天堂一区| 久久精品美女视频| 国产精品福利一区| 精品无人区无码乱码毛片国产| 国产福利视频一区二区三区| 国产视频一区二区视频| 国产视频欧美| 欧美性潮喷xxxxx免费视频看| 色狮一区二区三区四区视频| 鲁鲁视频www一区二区| 亚洲综合影院| 91久久久久久国产精品| 成人日韩在线观看| 全亚洲最色的网站在线观看| 欧美videossex| 久久久国产一区二区三区| eeuss影院www在线播放| 亚洲精品在线视频| 日本精品一区二区在线观看| 日韩欧美在线网站| 99久久久无码国产精品免费| 欧美在线短视频| 国产第一页在线观看| 精品国产31久久久久久| 久久久久久久久97| 依依成人精品视频| √天堂中文官网8在线| 中文无字幕一区二区三区| 中文字幕一区二区三区人妻电影| 成人av免费观看| 秘密基地免费观看完整版中文| 国产美女在线观看一区| 午夜免费一级片| 狠狠狠色丁香婷婷综合激情| mm131亚洲精品| 久久99精品国产麻豆不卡| av污在线观看| 久久99精品一区二区三区三区| 日韩一区二区三区不卡视频| 日韩成人午夜电影| 日本www.色| 蜜桃一区二区三区在线| 97超碰成人在线| 激情综合五月天| 亚洲精品中文字幕乱码无线| 国产精品一区久久久久| 亚洲av午夜精品一区二区三区| 国产成人在线观看| 色哟哟视频在线| 26uuu国产电影一区二区| 国产三级av在线播放| 中文字幕高清不卡| 国产suv精品一区二区68| 亚洲欧美日韩中文字幕一区二区三区| 欧美日韩黄色网| 亚洲激情图片一区| 日韩成人av毛片| 欧美性xxxx在线播放| 青青艹在线观看| 欧美高清精品3d| 亚洲成a人片77777精品| 精品亚洲aⅴ在线观看| 成人午夜影视| 欧美成人精品h版在线观看| 成人免费高清观看| 日本精品性网站在线观看| 成人免费视频观看| 147欧美人体大胆444| 人妖一区二区三区| 亚洲一卡二卡三卡四卡无卡网站在线看 | 精品国产免费人成网站| 国产精品嫩草影院一区二区| 国产精品一区二区三区www| 国产精品手机在线| 禁果av一区二区三区| 一级一片免费播放| 日韩午夜免费| 粉色视频免费看| av资源站一区| 国产日韩精品中文字无码| 有坂深雪av一区二区精品| 成年人av网站| 欧美一级欧美三级在线观看| 欧美新色视频| 欧美猛交ⅹxxx乱大交视频| 在线天堂资源| 91中文在线观看| 狠狠色丁香婷婷综合影院| 强开小嫩苞一区二区三区网站| 国产美女一区| 久久精品视频在线观看免费| 久久综合色播五月| 欧美激情国产精品免费| 欧美性受极品xxxx喷水| 日本高清视频网站| 久久亚洲影音av资源网| 中国字幕a在线看韩国电影| 91在线高清视频| 国产99亚洲| 国产www免费| 久久国产人妖系列| 国产ts在线播放| 亚洲综合久久久久| 国产又粗又长又大视频| 亚洲天堂男人的天堂| 岛国毛片av在线| 成人免费激情视频| 欧美日韩精品一区二区视频| 国产原创popny丨九色| 国产一区在线看| 懂色av粉嫩av浪潮av| 欧美性生活大片免费观看网址| 国内精品国产成人国产三级| 在线观看欧美www| 芒果视频成人app| 久久爱av电影| 在线观看一区| 亚洲精品久久一区二区三区777| 中文字幕在线一区免费| 99re国产在线| 精品视频在线导航| 在线能看的av网址| 国产专区一区二区| 伊人成年综合电影网| 手机在线观看日韩av| 亚洲柠檬福利资源导航| 一本到在线视频| 最近的2019中文字幕免费一页| 欧美××××黑人××性爽| 精品日本一区二区三区在线观看| 国产精品mv在线观看| 中文字幕avav| 怡红院av一区二区三区| www.国产麻豆| 欧美大秀在线观看| 都市激情久久| 日韩av高清在线看片| 99久久久久久99| 国产成人无码精品| 日韩av在线免播放器| 男女羞羞在线观看| 久久久久免费网| 久久资源在线| 国产毛片欧美毛片久久久| 欧美性xxxxx极品少妇| 成人午夜电影在线观看| 国产欧美一区二区三区在线| 日韩理论电影| 久久久九九九热| 夜夜揉揉日日人人青青一国产精品 | 男人的午夜天堂| 91精品国产91久久久久久一区二区| 国产原创视频在线观看| www.成人av.com| 在线日韩电影| 免费污网站在线观看| 在线观看日韩一区| 精品国产99久久久久久| 91在线播放视频| 在线综合视频| a级黄色免费视频| 欧美videos大乳护士334| 手机在线观看av网站| 手机成人在线| 老司机免费视频一区二区| 中文字幕手机在线观看| 亚洲精品不卡在线| 99久久久国产精品免费调教网站| 欧美一级黄色录像片| jiyouzz国产精品久久| 波多野结衣电车| 久久人人爽人人爽爽久久| 第四色中文综合网| 亚洲不卡视频在线| 一区二区三区产品免费精品久久75| 五月婷婷丁香六月| 国产男女猛烈无遮挡91| 国语精品一区| 国产精品av久久久久久无| 91精品国产美女浴室洗澡无遮挡| 黄色aa久久| 中文字幕在线亚洲精品| av一区二区久久| 国产伦精品一区二区三区四区| 久久久久久久久网站| av亚洲在线观看| 国产清纯白嫩初高中在线观看性色| 一本到不卡精品视频在线观看| 国产美女在线观看| 日本视频一区二区不卡| 国产suv精品一区二区883| 欧美日韩在线视频播放| 久久久久久这里只有精品| 国产精品97|