| 
					
				 | 
			
			
				@@ -1,12 +1,9 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package com.ruoyi.framework.config; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.ruoyi.common.config.RuoYiConfig; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ruoyi.framework.config.properties.SwaggerProperties; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import io.swagger.annotations.ApiOperation; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.factory.annotation.Autowired; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import org.springframework.beans.factory.annotation.Value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.context.annotation.Bean; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.context.annotation.Configuration; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import springfox.documentation.builders.ApiInfoBuilder; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -29,103 +26,83 @@ import java.util.List; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Configuration 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @EnableSwagger2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @EnableKnife4j 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@ConditionalOnClass({Docket.class, ApiInfoBuilder.class}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@ConditionalOnProperty(prefix = "swagger", value = "enable", matchIfMissing = true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 public class SwaggerConfig { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * 系统基础配置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private RuoYiConfig ruoyiConfig; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * 标题 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @Value("${swagger.title}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private String title; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private SwaggerProperties swaggerProperties; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * 描述 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @Value("${swagger.description}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private String description; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * 创建API 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Bean 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public Docket createRestApi() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return new Docket(DocumentationType.SWAGGER_2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.enable(swaggerProperties.getEnabled()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.apiInfo(apiInfo()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 设置哪些接口暴露给Swagger展示 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.select() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 扫描所有有注解的api,用这种方式更灵活 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 扫描指定包中的swagger注解 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 扫描所有 .apis(RequestHandlerSelectors.any()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.paths(PathSelectors.any()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.build() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			/* 设置安全模式,swagger可以设置访问token */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.securitySchemes(securitySchemes()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.securityContexts(securityContexts()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * 版本 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @Value("${swagger.version}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private String version; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * 安全模式,这里指定token通过Authorization头请求头传递 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private List<SecurityScheme> securitySchemes() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		apiKeyList.add(new ApiKey("Authorization", "Authorization", "header")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return apiKeyList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * 创建API 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @Bean 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public Docket createRestApi() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return new Docket(DocumentationType.SWAGGER_2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .apiInfo(apiInfo()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 设置哪些接口暴露给Swagger展示 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .select() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 扫描所有有注解的api,用这种方式更灵活 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 扫描指定包中的swagger注解 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 扫描所有 .apis(RequestHandlerSelectors.any()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .paths(PathSelectors.any()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .build() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                /* 设置安全模式,swagger可以设置访问token */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .securitySchemes(securitySchemes()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .securityContexts(securityContexts()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * 安全上下文 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private List<SecurityContext> securityContexts() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		List<SecurityContext> securityContexts = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		securityContexts.add( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			SecurityContext.builder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.securityReferences(defaultAuth()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.forPaths(PathSelectors.regex("^(?!auth).*$")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.build()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return securityContexts; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * 安全模式,这里指定token通过Authorization头请求头传递 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private List<SecurityScheme> securitySchemes() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        apiKeyList.add(new ApiKey("Authorization", "Authorization", "header")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return apiKeyList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * 默认的安全上引用 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private List<SecurityReference> defaultAuth() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		authorizationScopes[0] = authorizationScope; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		List<SecurityReference> securityReferences = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return securityReferences; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * 安全上下文 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private List<SecurityContext> securityContexts() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        List<SecurityContext> securityContexts = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        securityContexts.add( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                SecurityContext.builder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        .securityReferences(defaultAuth()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        .forPaths(PathSelectors.regex("^(?!auth).*$")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        .build()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return securityContexts; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * 默认的安全上引用 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private List<SecurityReference> defaultAuth() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        authorizationScopes[0] = authorizationScope; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        List<SecurityReference> securityReferences = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return securityReferences; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * 添加摘要信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private ApiInfo apiInfo() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 用ApiInfoBuilder进行定制 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return new ApiInfoBuilder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 设置标题 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .title(title) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 描述 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .description(description) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 作者信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .contact(new Contact(ruoyiConfig.getName(), null, null)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 版本 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .version(version) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .build(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * 添加摘要信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private ApiInfo apiInfo() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 用ApiInfoBuilder进行定制 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		SwaggerProperties.Contact contact = swaggerProperties.getContact(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return new ApiInfoBuilder() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 设置标题 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.title(swaggerProperties.getTitle()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 描述 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.description(swaggerProperties.getDescription()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 作者信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.contact(new Contact(contact.getName(), contact.getUrl(), contact.getEmail())) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 版本 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.version(swaggerProperties.getVersion()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.build(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |