精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

在线观看a视频| 国内精品久久久久久久果冻传媒| 久久久噜噜噜久久人人看| 欧美极品中文字幕| 国产精品乱码久久久久久| 欧美国产日本高清在线 | 欧美成人久久久| 日韩欧美亚洲国产精品字幕久久久| 午夜精品在线视频| 亚洲国产一二三精品无码| 日韩精品极品视频在线观看免费| 久久国产免费视频| 无码人妻丰满熟妇精品 | 性爽视频在线| 亚洲日本三级| 国产精品视频你懂的| 国产一区玩具在线观看| 三区视频在线观看| 91theporn国产在线观看| 欧洲黄色一区| 可以看av的网站久久看| 精品国产亚洲在线| 永久免费在线看片视频| 亚洲色图美腿丝袜| 日韩欧美国产综合一区| 精品国产一区二区三区在线| 国产亚洲精品久久久久久豆腐| 五月激情婷婷网| 精品国产鲁一鲁****| 美美哒免费高清在线观看视频一区二区| 久久综合久久综合久久综合| 精品国产99国产精品| 日本久久久久久久久久久久| av资源免费观看| 中文一区一区三区高中清不卡免费| 中文字幕亚洲精品在线观看| 国产精品久久77777| 亚洲图片另类小说| 中国特级黄色大片| 中文字幕 亚洲一区| 国产三级aaa| 国产亚洲成av人片在线观黄桃| 久久亚洲一区二区三区明星换脸 | 亚洲精品动漫久久久久| 日本黄色播放器| 在线亚洲欧美日韩| 凹凸成人精品亚洲精品密奴| 欧美性猛片xxxx免费看久爱| 欧美国产精品va在线观看| 人人澡人人澡人人看| 亚洲精品毛片| 国产视频一区二区在线观看| 久久久久久国产精品久久| 无码人妻精品一区二区三区66| 91无套直看片红桃| 老**午夜毛片一区二区三区| 欧美亚洲国产视频小说| 毛葺葺老太做受视频| 超碰在线99| 欧美精品成人| 日韩精品一区国产| 性娇小13――14欧美| 色婷婷狠狠综合| av色综合网| 国产三级短视频| 在线视频超级| 欧美日韩国产在线| 亚洲欧洲日夜超级视频| www.黄色小说.com| 国产精品试看| 超在线视频97| 精品无人乱码一区二区三区的优势| 黄色av网站免费观看| 日韩精品一二区| 亚洲国产精品久久久| 精品久久久久久久无码| 成人深夜福利| 亚洲成av人片在线观看| 亚洲精品视频一二三| 日韩精品毛片| 亚洲精品国产成人久久av盗摄| 精品国产免费一区二区三区 | 午夜精品一区二区三区四区| 国产精品视频无码| 午夜亚洲伦理| 国产精品视频区1| 国产成人免费观看视频| 中文在线日韩| 伊人伊成久久人综合网站| 亚洲欧美高清在线| 免费成人高清在线视频theav| 在线视频欧美日韩| 日本一级片在线播放| 久久国产精品免费一区二区三区| 欧美va亚洲va在线观看蝴蝶网| 亚洲国产日韩欧美在线观看| 小视频免费在线观看| 欧美性猛片aaaaaaa做受| 国产调教打屁股xxxx网站| 偷拍自拍一区| 亚洲黄页视频免费观看| 久久中文字幕精品| 欧美日韩网址| 国产精品久久久久久影视 | 美女视频一区在线观看| 69av在线视频| 精品一级少妇久久久久久久| 91欧美日韩| 国产亚洲精品一区二区| 亚洲第九十七页| 亚洲精品在线国产| 日韩三级在线观看| 日日夜夜精品视频免费观看| 亚州精品国产| 精品一区二区三区四区| 日韩www视频| 99久久99久久精品国产片果冰| 中文欧美在线视频| 在线看成人av| 亚洲激情欧美| 91精品国产91久久久久久久久| 中文字幕欧美色图| 久久成人免费网| 91精品久久久久久久久青青 | 国产网站在线免费观看| 国产精品乱码妇女bbbb| 国产精品999视频| 成人女同在线观看| 婷婷综合五月天| 女人和拘做爰正片视频| 亚洲第一av| 日韩午夜av一区| 性少妇xx生活| 性欧美欧美巨大69| 成人97在线观看视频| 天天操天天干天天摸| 奇米一区二区三区av| 国产精品亚洲精品| 国产叼嘿视频在线观看| 粉嫩aⅴ一区二区三区四区| 99re在线| 超碰在线免费播放| 香蕉乱码成人久久天堂爱免费| 手机免费av片| 盗摄牛牛av影视一区二区| 久久精品这里热有精品| 青娱乐国产在线| 一本久道久久综合婷婷鲸鱼| 日本中文字幕不卡免费| 在线观看国产小视频| 国产午夜精品福利| 男人的天堂日韩| 久久综合欧美| 国产成人高清激情视频在线观看| 一级黄色片在线播放| 欧美国产精品一区二区三区| 男人草女人视频| 国产一区二区三区| 日韩成人在线电影网| 精品无码国产污污污免费网站| 国产亚洲毛片| 欧美精品一区在线| 日本高清在线观看wwwww色| 欧美午夜精品一区二区蜜桃| 国产精品理论在线| 精品一区二区日韩| 国产又黄又爽免费视频| 看亚洲a级一级毛片| 久久99久久99精品免观看粉嫩| 日韩和一区二区| 337p粉嫩大胆噜噜噜噜噜91av| 欧美一级视频在线观看| 黄色大全在线观看| 天堂蜜桃91精品| 亚洲春色在线视频| 亚洲综合资源| 日韩中文在线观看| 亚洲男人第一av| 国产盗摄精品一区二区酒店| 日韩中文字幕一区二区三区| 亚洲一区中文字幕| 亚洲图片 自拍偷拍| 欧美美女在线| 国产日韩在线一区| 日韩欧美一起| 欧美午夜一区二区三区免费大片| 毛片视频免费播放| 成人中文字幕电影| 丰满女人性猛交| 高清精品xnxxcom| 国产成人av网址| 欧美卡一卡二| 国产亚洲人成a一在线v站| 久久国产亚洲精品无码| 久久久久人妻一区精品色欧美| 大胆亚洲人体视频| 国产精品一区二区av| 中文字幕人妻精品一区| 久久人人爽爽爽人久久久| 久操网在线观看| 污污影院在线观看| 日韩精品免费观看| 999免费视频| 欧美大片aaaa| 7777免费精品视频| 日韩精品黄色| 亚洲激情第一页| 国产乱叫456在线| 欧美日韩国产综合新一区| 最新中文字幕av| 国产精品一区二区x88av| 欧美13一14另类| 国产一线二线在线观看 | 黄色片免费网址| 久久国产精品久久w女人spa| 69影院欧美专区视频| 黄色精品免费看| 亚洲精品久久视频| 国产又黄又爽视频| 色网综合在线观看| 800av在线播放| 国产福利一区二区三区在线视频| 国产高清不卡无码视频| 红桃成人av在线播放| 国产精品高潮呻吟久久av无限| 日本在线不卡一区二区| 嫩草国产精品入口| 性亚洲最疯狂xxxx高清| 里番在线观看网站| 亚洲黄色片在线观看| yy1111111| 欧美一区不卡| 国产美女精品在线观看| 成人免费91| 日韩精品在线视频观看| 欧洲成人一区二区三区| 久久人人爽爽爽人久久久| 好男人香蕉影院| 国产一区免费电影| 久久艳片www.17c.com| 少妇一区二区三区四区| 国产精品国产三级国产有无不卡| 五月天婷婷影视| 国产精品久久久久久久久久10秀 | 无码日韩精品一区二区免费| aaa级精品久久久国产片| 99国内精品久久久久| 国内精品久久久久久影视8| 九九九免费视频| 亚洲视频一区二区在线| 亚洲天堂2018av| 日韩电影在线一区二区三区| 91av俱乐部| 日韩激情一二三区| 日韩中文字幕a| 极品美女销魂一区二区三区免费| 欧美激情一级欧美精品| 午夜福利123| 美女视频一区在线观看| 91女神在线观看| 一区二区91| 欧美大片在线播放| 久久精品麻豆| 阿v天堂2018| 日韩欧美2区| 精品国产免费人成在线观看| 国产夫妻自拍av| 色综合久久综合中文综合网| 日本一区二区欧美| 91丨九色丨蝌蚪丨老版| 欧美 变态 另类 人妖| 91免费视频观看| av小说在线观看| 免费观看成人av| 中国黄色片一级| 久久91精品久久久久久秒播| 黄色三级视频片| 狠狠狠色丁香婷婷综合久久五月| 午夜激情福利在线| 国产影视一区| 精品国产乱码一区二区三区四区| 蜜臀av免费一区二区三区| 一区二区三区四区不卡| 日本在线视频一区二区| 久久精品亚洲一区| 老司机深夜福利在线观看| 日韩在线视频免费观看| 丝袜中文在线| 欧美一级高清免费| 伊人久久大香线蕉综合影院首页| 国产一区二区三区在线看麻豆| 国产精品人人妻人人爽人人牛| 精品一区二区三区免费毛片爱| 国产成人av无码精品| 久久国内精品视频| 中国黄色片免费看| 久久国产精品99精品国产 | 国产区在线观看| 98精品国产高清在线xxxx天堂| 欧美高清影院| 国产成人自拍视频在线观看| 国产日韩在线观看视频| 麻豆久久久av免费| 欧美黄色一区二区| 午夜激情在线观看视频| 成人美女视频在线看| 亚洲少妇xxx| 中文字幕一区三区| 日韩男人的天堂| 欧美一个色资源| 岛国视频免费在线观看| 亚洲精品一区二区三区影院| 成人影院免费观看| 136fldh精品导航福利| 欧美黄视频在线观看| 亚洲人成77777| 久久久国产精品一区二区中文| 国产无套精品一区二区三区| 国产精品国产自产拍在线| 7799精品视频天天看| 日本大香伊一区二区三区| 日韩熟女一区二区| 亚洲国产精品99| 青青草视频在线免费直播| 国产一区二区丝袜高跟鞋图片| 一本久久青青| 日本网站免费在线观看| 国产不卡视频在线观看| 日韩三级久久久| 欧美日韩一区二区三区免费看| 91麻豆成人精品国产免费网站| 国产视频一区在线| 老司机深夜福利在线观看| 国产亚洲自拍偷拍| 在线播放一区| 久久综合久久色| 日韩高清国产一区在线| 国产精品无码一区二区三区免费| 亚洲成人av电影在线| 久久久久久久久久久影院| 欧美亚一区二区| 国产黄色在线播放| 国产成人在线一区二区| 国产精品最新| 搡女人真爽免费午夜网站| 久久精品人人爽人人爽| 国产精品乱码一区二区视频| 亚洲欧美日韩高清| 国产黄色在线网站| 91免费版网站入口| 少妇高潮一区二区三区| 欧洲黄色一级视频| 91丨porny丨首页| 欧美一级淫片免费视频黄| 亚洲人午夜精品| 久久精品xxxxx| 中文字幕日韩精品久久| 亚洲三级国产| 免费看黄色aaaaaa 片| 色婷婷综合激情| 9191在线| 欧美综合激情网| 久久99成人| youjizz.com在线观看| 日韩国产欧美在线视频| 刘亦菲国产毛片bd| 欧美一级日韩不卡播放免费| 九色在线视频| 欧美激情精品久久久久久大尺度 | 欧美精品一区二区久久婷婷| a级片免费在线观看| 国产欧美va欧美va香蕉在线| 99久久九九| 色哟哟无码精品一区二区三区| 色综合中文综合网| 欧美猛烈性xbxbxbxb| 91视频99| 国产精品传媒精东影业在线| 欧美熟妇精品一区二区| 欧美性xxxxx极品| 欧美一级性视频| 国产91在线播放精品91| 婷婷亚洲五月| 91精品又粗又猛又爽| 日本高清不卡在线观看| 羞羞电影在线观看www| 久久免费看av| 亚洲精品极品| 亚洲av毛片基地| 精品久久人人做人人爰| 香蕉成人av| 你懂的网址一区二区三区| 毛片一区二区三区| 国产大片中文字幕| 日韩一二三四区| **欧美日韩在线观看| 九九久久九九久久| 欧美极品xxx| 中文字幕久久久久| 久久露脸国产精品|