mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-10-31 18:49:06 +08:00 
			
		
		
		
	接入 swagger + knife4j 组件,实现 API 接口文档
This commit is contained in:
		
							
								
								
									
										5
									
								
								http-client.env.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								http-client.env.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | |||||||
|  | { | ||||||
|  |   "local": { | ||||||
|  |     "baseUrl": "http://127.0.0.1:8080" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										67
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										67
									
								
								pom.xml
									
									
									
									
									
								
							| @ -41,14 +41,19 @@ | |||||||
| <!--        <jwt.version>0.9.1</jwt.version>--> | <!--        <jwt.version>0.9.1</jwt.version>--> | ||||||
|  |  | ||||||
|         <!-- Web 相关 --> |         <!-- Web 相关 --> | ||||||
|  |         <knife4j.version>3.0.2</knife4j.version> | ||||||
|  |  | ||||||
|         <!-- DB 相关 --> |         <!-- DB 相关 --> | ||||||
|         <mysql-connector-java.version>5.1.46</mysql-connector-java.version> |         <mysql-connector-java.version>5.1.46</mysql-connector-java.version> | ||||||
|         <druid.version>1.2.4</druid.version> |         <druid.version>1.2.4</druid.version> | ||||||
|         <mybatis-plus.version>3.4.1</mybatis-plus.version> |         <mybatis-plus.version>3.4.1</mybatis-plus.version> | ||||||
|  |         <redisson.version>3.13.6</redisson.version> | ||||||
|         <!-- 工具类相关 --> |         <!-- 工具类相关 --> | ||||||
|         <org.projectlombok.version>1.16.14</org.projectlombok.version> |         <org.projectlombok.version>1.16.14</org.projectlombok.version> | ||||||
|         <org.mapstruct.version>1.3.0.Final</org.mapstruct.version> |         <org.mapstruct.version>1.3.0.Final</org.mapstruct.version> | ||||||
|  |         <jjwt.version>0.9.1</jjwt.version> | ||||||
|  |         <fastjson.version>1.2.75</fastjson.version> | ||||||
|  |         <hutool.version>5.5.6</hutool.version> | ||||||
|     </properties> |     </properties> | ||||||
|  |  | ||||||
|     <!-- 依赖声明 --> |     <!-- 依赖声明 --> | ||||||
| @ -190,6 +195,13 @@ | |||||||
|     <packaging>jar</packaging> |     <packaging>jar</packaging> | ||||||
|  |  | ||||||
|     <dependencies> |     <dependencies> | ||||||
|  |         <!-- Spring 核心 --> | ||||||
|  |         <dependency> | ||||||
|  |             <!-- 用于生成自定义的 Spring @ConfigurationProperties 配置类的说明文件 --> | ||||||
|  |             <groupId>org.springframework.boot</groupId> | ||||||
|  |             <artifactId>spring-boot-configuration-processor</artifactId> | ||||||
|  |             <optional>true</optional> | ||||||
|  |         </dependency> | ||||||
|  |  | ||||||
|         <!-- Web 相关 --> |         <!-- Web 相关 --> | ||||||
|         <dependency> |         <dependency> | ||||||
| @ -197,31 +209,82 @@ | |||||||
|             <artifactId>spring-boot-starter-web</artifactId> |             <artifactId>spring-boot-starter-web</artifactId> | ||||||
|         </dependency> |         </dependency> | ||||||
|  |  | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.springframework.boot</groupId> | ||||||
|  |             <artifactId>spring-boot-starter-security</artifactId> | ||||||
|  |         </dependency> | ||||||
|  |  | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.springframework.boot</groupId> | ||||||
|  |             <artifactId>spring-boot-starter-validation</artifactId> | ||||||
|  |         </dependency> | ||||||
|  |  | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>com.github.xiaoymin</groupId> | ||||||
|  |             <artifactId>knife4j-spring-boot-starter</artifactId> | ||||||
|  |             <version>${knife4j.version}</version> | ||||||
|  |         </dependency> | ||||||
|  |  | ||||||
|         <!-- DB 相关 --> |         <!-- DB 相关 --> | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>mysql</groupId> |             <groupId>mysql</groupId> | ||||||
|             <artifactId>mysql-connector-java</artifactId> |             <artifactId>mysql-connector-java</artifactId> | ||||||
|             <version>${mysql-connector-java.version}</version> |             <version>${mysql-connector-java.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|  |  | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>com.alibaba</groupId> |             <groupId>com.alibaba</groupId> | ||||||
|             <artifactId>druid-spring-boot-starter</artifactId> |             <artifactId>druid-spring-boot-starter</artifactId> | ||||||
|             <version>${druid.version}</version> |             <version>${druid.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|  |  | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>com.baomidou</groupId> |             <groupId>com.baomidou</groupId> | ||||||
|             <artifactId>mybatis-plus-boot-starter</artifactId> |             <artifactId>mybatis-plus-boot-starter</artifactId> | ||||||
|             <version>${mybatis-plus.version}</version> |             <version>${mybatis-plus.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|  |  | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.redisson</groupId> | ||||||
|  |             <artifactId>redisson-spring-boot-starter</artifactId> | ||||||
|  |             <version>${redisson.version}</version> | ||||||
|  |         </dependency> | ||||||
|  |  | ||||||
|         <!-- 工具类相关 --> |         <!-- 工具类相关 --> | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>org.projectlombok</groupId> |             <groupId>org.projectlombok</groupId> | ||||||
|             <artifactId>lombok</artifactId> |             <artifactId>lombok</artifactId> | ||||||
|             <version>${org.projectlombok.version}</version> |             <version>${org.projectlombok.version}</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|  |  | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>io.jsonwebtoken</groupId> | ||||||
|  |             <artifactId>jjwt</artifactId> | ||||||
|  |             <version>${jjwt.version}</version> | ||||||
|  |         </dependency> | ||||||
|  |  | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>com.alibaba</groupId> | ||||||
|  |             <artifactId>fastjson</artifactId> | ||||||
|  |             <version>${fastjson.version}</version> | ||||||
|  |         </dependency> | ||||||
|  |  | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.projectlombok</groupId> | ||||||
|  |             <artifactId>lombok</artifactId> | ||||||
|  |             <version>${org.projectlombok.version}</version> | ||||||
|  |         </dependency> | ||||||
|  |  | ||||||
|  |         <dependency> | ||||||
|  |             <!-- 解析客户端操作系统、浏览器等 TODO 芋艿:后面看看 hutool 有没替代 --> | ||||||
|  |             <groupId>eu.bitwalker</groupId> | ||||||
|  |             <artifactId>UserAgentUtils</artifactId> | ||||||
|  |             <version>1.21</version> | ||||||
|  |         </dependency> | ||||||
|  |  | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>cn.hutool</groupId> | ||||||
|  |             <artifactId>hutool-core</artifactId> | ||||||
|  |             <version>${hutool.version}</version> | ||||||
|  |         </dependency> | ||||||
|     </dependencies> |     </dependencies> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
| @ -0,0 +1,105 @@ | |||||||
|  | package cn.iocoder.dashboard.framework.swagger.config; | ||||||
|  |  | ||||||
|  | import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; | ||||||
|  | import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; | ||||||
|  | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; | ||||||
|  | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||||||
|  | import org.springframework.boot.context.properties.EnableConfigurationProperties; | ||||||
|  | import org.springframework.context.annotation.Bean; | ||||||
|  | import org.springframework.context.annotation.Configuration; | ||||||
|  | import org.springframework.http.HttpHeaders; | ||||||
|  | import springfox.documentation.builders.ApiInfoBuilder; | ||||||
|  | import springfox.documentation.builders.PathSelectors; | ||||||
|  | import springfox.documentation.service.*; | ||||||
|  | import springfox.documentation.spi.DocumentationType; | ||||||
|  | import springfox.documentation.spi.service.contexts.SecurityContext; | ||||||
|  | import springfox.documentation.spring.web.plugins.Docket; | ||||||
|  | import springfox.documentation.swagger2.annotations.EnableSwagger2; | ||||||
|  | import springfox.documentation.service.ApiKey; | ||||||
|  |  | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.Collections; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | import static springfox.documentation.builders.RequestHandlerSelectors.basePackage; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Swagger2 自动配置类 | ||||||
|  |  * | ||||||
|  |  * @author 芋道源码 | ||||||
|  |  */ | ||||||
|  | @Configuration | ||||||
|  | @EnableSwagger2 | ||||||
|  | @EnableKnife4j | ||||||
|  | @ConditionalOnClass({Docket.class, ApiInfoBuilder.class}) | ||||||
|  | @ConditionalOnProperty(prefix = "yudao.swagger", value = "enable", matchIfMissing = true) | ||||||
|  | // 允许使用 swagger.enable=false 禁用 Swagger | ||||||
|  | @EnableConfigurationProperties(SwaggerProperties.class) | ||||||
|  | public class SwaggerAutoConfiguration { | ||||||
|  |  | ||||||
|  |     @Bean | ||||||
|  |     @ConditionalOnMissingBean | ||||||
|  |     public SwaggerProperties swaggerProperties() { | ||||||
|  |         return new SwaggerProperties(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Bean | ||||||
|  |     public Docket createRestApi() { | ||||||
|  |         SwaggerProperties properties = swaggerProperties(); | ||||||
|  |         // 创建 Docket 对象 | ||||||
|  |         return new Docket(DocumentationType.SWAGGER_2) | ||||||
|  |                 // 用来创建该 API 的基本信息,展示在文档的页面中(自定义展示的信息) | ||||||
|  |                 .apiInfo(apiInfo(properties)) | ||||||
|  |                 // 设置扫描指定 package 包下的 | ||||||
|  |                 .select() | ||||||
|  |                 .apis(basePackage(properties.getBasePackage())) | ||||||
|  |                 .paths(PathSelectors.any()) | ||||||
|  |                 .build() | ||||||
|  |                 .securitySchemes(securitySchemes()) | ||||||
|  |                 .securityContexts(securityContexts()) | ||||||
|  | //                .pathMapping() TODO 芋艿:稍后解决,统一 api 前缀 | ||||||
|  |                 ; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * API 摘要信息 | ||||||
|  |      */ | ||||||
|  |     private static ApiInfo apiInfo(SwaggerProperties properties) { | ||||||
|  |         return new ApiInfoBuilder() | ||||||
|  |                 .title(properties.getTitle()) | ||||||
|  |                 .description(properties.getDescription()) | ||||||
|  |                 .contact(new Contact(properties.getAuthor(), null, null)) | ||||||
|  |                 .version(properties.getVersion()) | ||||||
|  |                 .build(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 安全模式,这里配置通过请求头 Authorization 传递 token 参数 | ||||||
|  |      */ | ||||||
|  |     private static List<SecurityScheme> securitySchemes() { | ||||||
|  |         return Collections.singletonList(new ApiKey(HttpHeaders.AUTHORIZATION, "Authorization", "header")); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 安全上下文 | ||||||
|  |      * | ||||||
|  |      * @see #securitySchemes() | ||||||
|  |      * @see #authorizationScopes() | ||||||
|  |      */ | ||||||
|  |     private static List<SecurityContext> securityContexts() { | ||||||
|  |         return Collections.singletonList(SecurityContext.builder() | ||||||
|  |                 .securityReferences(securityReferences()) | ||||||
|  |                 .forPaths(PathSelectors.regex("^(?!auth).*$")) | ||||||
|  |                 .build()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private static List<SecurityReference> securityReferences() { | ||||||
|  |         return Collections.singletonList(new SecurityReference(HttpHeaders.AUTHORIZATION, authorizationScopes())); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private static AuthorizationScope[] authorizationScopes() { | ||||||
|  |         return new AuthorizationScope[]{new AuthorizationScope("global", "accessEverything")}; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,43 @@ | |||||||
|  | package cn.iocoder.dashboard.framework.swagger.config; | ||||||
|  |  | ||||||
|  | import lombok.Data; | ||||||
|  | import org.springframework.boot.context.properties.ConfigurationProperties; | ||||||
|  |  | ||||||
|  | import javax.validation.constraints.NotEmpty; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Swagger 配置属性 | ||||||
|  |  * | ||||||
|  |  * @author 芋道源码 | ||||||
|  |  */ | ||||||
|  | @ConfigurationProperties("yudao.swagger") | ||||||
|  | @Data | ||||||
|  | public class SwaggerProperties { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标题 | ||||||
|  |      */ | ||||||
|  |     @NotEmpty(message = "标题不能为空") | ||||||
|  |     private String title; | ||||||
|  |     /** | ||||||
|  |      * 描述 | ||||||
|  |      */ | ||||||
|  |     @NotEmpty(message = "描述不能为空") | ||||||
|  |     private String description; | ||||||
|  |     /** | ||||||
|  |      * 作者 | ||||||
|  |      */ | ||||||
|  |     @NotEmpty(message = "作者不能为空") | ||||||
|  |     private String author; | ||||||
|  |     /** | ||||||
|  |      * 版本 | ||||||
|  |      */ | ||||||
|  |     @NotEmpty(message = "版本不能为空") | ||||||
|  |     private String version; | ||||||
|  |     /** | ||||||
|  |      * 扫描的包 | ||||||
|  |      */ | ||||||
|  |     @NotEmpty(message = "扫描的 package 不能为空") | ||||||
|  |     private String basePackage; | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,6 @@ | |||||||
|  | /** | ||||||
|  |  * 基于 Swagger + Knife4j 实现 API 接口文档 | ||||||
|  |  * | ||||||
|  |  * @author 芋道源码 | ||||||
|  |  */ | ||||||
|  | package cn.iocoder.dashboard.framework.swagger; | ||||||
| @ -0,0 +1 @@ | |||||||
|  | <http://www.iocoder.cn/Spring-Boot/Swagger/?dashboard> | ||||||
| @ -1,7 +1,29 @@ | |||||||
| spring: | spring: | ||||||
|   # 数据源配置项 |   # 数据源配置项 TODO 多数据源;TODO 监控配置 | ||||||
|   datasource: |   datasource: | ||||||
|     url: jdbc:mysql://127.0.1:3306/ruoyi-vue-pro?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT |     url: jdbc:mysql://127.0.1:3306/ruoyi-vue-pro?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT | ||||||
|     driver-class-name: com.mysql.jdbc.Driver |     driver-class-name: com.mysql.jdbc.Driver | ||||||
|     username: root |     username: root | ||||||
|     password: 123456 |     password: 123456 | ||||||
|  |   # redis 配置 TODO 需要进行下,对接到 redisson | ||||||
|  |   redis: | ||||||
|  |     # 地址 | ||||||
|  |     host: localhost | ||||||
|  |     # 端口,默认为6379 | ||||||
|  |     port: 6379 | ||||||
|  |     # 数据库索引 | ||||||
|  |     database: 0 | ||||||
|  |     # 连接超时时间 | ||||||
|  |     timeout: 10s | ||||||
|  |  | ||||||
|  | # 芋道配置项,设置当前项目所有自定义的配置 | ||||||
|  | yudao: | ||||||
|  |   security: | ||||||
|  |     token-header: Authorization | ||||||
|  |     token-secret: abcdefghijklmnopqrstuvwxyz | ||||||
|  |     token-expires: 30m | ||||||
|  |   swagger: | ||||||
|  |     title: 管理后台 | ||||||
|  |     description: 提供管理员管理的所有功能 | ||||||
|  |     version: 1.0.0 | ||||||
|  |     base-package: cn.iocoder.dashboard.modules | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV