From 289adf7c272540f803216e46de74f66859c8d6a8 Mon Sep 17 00:00:00 2001 From: daizong <30498993@qq.com> Date: Tue, 20 Aug 2019 09:37:08 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E6=88=90swagger-bootstrap-ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 10 +- ruoyi-common/pom.xml | 3 +- ruoyi-common/ruoyi-common-swagger/pom.xml | 32 +++++++ .../ruoyi/common/swagger/SwaggerConfig.java | 93 +++++++++++++++++++ ruoyi-gateway/pom.xml | 15 ++- .../ruoyi/gateway/config/SwaggerProvider.java | 57 ++++++++++++ .../com/ruoyi/gateway/fiflt/AuthFilter.java | 4 +- .../ruoyi/gateway/handler/SwaggerHandler.java | 55 +++++++++++ ruoyi-service-api/ruoyi-system-api/pom.xml | 7 +- .../java/com/ruoyi/system/domain/SysUser.java | 7 +- ruoyi-service/ruoyi-auth/pom.xml | 9 +- .../auth/controller/TokenController.java | 4 + ruoyi-service/ruoyi-system/pom.xml | 8 +- .../system/controller/SysUserController.java | 8 +- 14 files changed, 299 insertions(+), 13 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-swagger/pom.xml create mode 100644 ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/SwaggerConfig.java create mode 100644 ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java create mode 100644 ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SwaggerHandler.java diff --git a/pom.xml b/pom.xml index f02d7e7..07ec386 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ 1.1.14 1.19 2.3.2 - 2.7.0 + 2.9.2 1.2.12 2.1.5 3.9.1 @@ -40,6 +40,7 @@ 4.1.19 2.6.2 3.4.0 + 20.0 @@ -182,6 +183,11 @@ ${jwt.version} + + com.google.guava + guava + ${guava.version} + @@ -245,4 +251,4 @@ - \ No newline at end of file + diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 1c6e365..8e5b012 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -14,5 +14,6 @@ ruoyi-common-redis ruoyi-common-log ruoyi-common-auth + ruoyi-common-swagger - \ No newline at end of file + diff --git a/ruoyi-common/ruoyi-common-swagger/pom.xml b/ruoyi-common/ruoyi-common-swagger/pom.xml new file mode 100644 index 0000000..c06e364 --- /dev/null +++ b/ruoyi-common/ruoyi-common-swagger/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + com.ruoyi.cloud + ruoyi-common + 1.0.0-SNAPSHOT + + ruoyi-common-swagger + + + + com.github.xiaoymin + swagger-bootstrap-ui + 1.8.7 + compile + + + + io.springfox + springfox-swagger2 + ${swagger.version} + + + + io.springfox + springfox-bean-validators + ${swagger.version} + + + diff --git a/ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/SwaggerConfig.java b/ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/SwaggerConfig.java new file mode 100644 index 0000000..22a21fd --- /dev/null +++ b/ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/SwaggerConfig.java @@ -0,0 +1,93 @@ +package com.ruoyi.common.swagger; + +import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI; +import com.google.common.collect.Lists; +import io.swagger.annotations.ApiOperation; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.core.annotation.Order; +import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +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 java.util.List; + +/** + * @ClassName SwaggerConfig + * @PackageName com.ruoyi.system.config + * @Description TODO + * @Author daiz + * @Date 2019/8/16 9:57 + * @Version 1.0 + */ +@Configuration +@EnableSwagger2 +@EnableSwaggerBootstrapUI +@Import(BeanValidatorPluginsConfiguration.class) +public class SwaggerConfig { + + @Bean(value = "userApi") + @Order(value = 1) + public Docket groupRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + .paths(PathSelectors.any()) + + .build().securityContexts(Lists.newArrayList(securityContext(), securityContext1())).securitySchemes(Lists.newArrayList(apiKey(), apiKey1())); + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("swagger-bootstrap-ui") + .description("swagger-bootstrap-ui-demo RESTful APIs") + .termsOfServiceUrl("") + .contact("group@qq.com") + .version("1.0") + .build(); + } + + private ApiKey apiKey() { + return new ApiKey("BearerToken", "Authorization", "header"); + } + + private ApiKey apiKey1() { + return new ApiKey("BearerToken1", "Authorization-x", "header"); + } + + private SecurityContext securityContext() { + return SecurityContext.builder() + .securityReferences(defaultAuth()) + .forPaths(PathSelectors.regex("/.*")) + .build(); + } + + private SecurityContext securityContext1() { + return SecurityContext.builder() + .securityReferences(defaultAuth1()) + .forPaths(PathSelectors.regex("/.*")) + .build(); + } + + List defaultAuth() { + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + return Lists.newArrayList(new SecurityReference("BearerToken", authorizationScopes)); + } + + List defaultAuth1() { + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + return Lists.newArrayList(new SecurityReference("BearerToken1", authorizationScopes)); + } +} diff --git a/ruoyi-gateway/pom.xml b/ruoyi-gateway/pom.xml index 2177e8d..78e68e6 100644 --- a/ruoyi-gateway/pom.xml +++ b/ruoyi-gateway/pom.xml @@ -54,6 +54,19 @@ com.github.penggle kaptcha + + + + com.github.xiaoymin + swagger-bootstrap-ui + 1.8.7 + compile + + + io.springfox + springfox-swagger2 + ${swagger.version} + @@ -73,4 +86,4 @@ - \ No newline at end of file + diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java new file mode 100644 index 0000000..28af192 --- /dev/null +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java @@ -0,0 +1,57 @@ +package com.ruoyi.gateway.config; + +import lombok.AllArgsConstructor; +import org.springframework.cloud.gateway.config.GatewayProperties; +import org.springframework.cloud.gateway.route.RouteLocator; +import org.springframework.cloud.gateway.support.NameUtils; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; +import springfox.documentation.swagger.web.SwaggerResource; +import springfox.documentation.swagger.web.SwaggerResourcesProvider; + +import java.util.ArrayList; +import java.util.List; + +/** + * @ClassName SwaggerProvider + * @PackageName com.ruoyi.gateway.config + * @Description TODO + * @Author daiz + * @Date 2019/8/16 10:04 + * @Version 1.0 + */ + +@Component +@Primary +@AllArgsConstructor +public class SwaggerProvider implements SwaggerResourcesProvider { + + public static final String API_URI = "/v2/api-docs"; + private final RouteLocator routeLocator; + private final GatewayProperties gatewayProperties; + + + @Override + public List get() { + List resources = new ArrayList<>(); + List routes = new ArrayList<>(); + //取出gateway的route + routeLocator.getRoutes().subscribe(route -> routes.add(route.getId())); + //结合配置的route-路径(Path),和route过滤,只获取有效的route节点 + gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId())) + .forEach(routeDefinition -> routeDefinition.getPredicates().stream() + .filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName())) + .forEach(predicateDefinition -> resources.add(swaggerResource(routeDefinition.getId(), + predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0") + .replace("/**", API_URI))))); + return resources; + } + + private SwaggerResource swaggerResource(String name, String location) { + SwaggerResource swaggerResource = new SwaggerResource(); + swaggerResource.setName(name); + swaggerResource.setLocation(location); + swaggerResource.setSwaggerVersion("2.0"); + return swaggerResource; + } +} diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/fiflt/AuthFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/fiflt/AuthFilter.java index 6c2d58d..3349433 100644 --- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/fiflt/AuthFilter.java +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/fiflt/AuthFilter.java @@ -34,7 +34,7 @@ import reactor.core.publisher.Mono; public class AuthFilter implements GlobalFilter, Ordered { // 排除过滤的 uri 地址 - private static final String[] whiteList = {"/auth/login", "/user/register"}; + private static final String[] whiteList = {"/auth/login", "/user/register", "/system/v2/api-docs", "/auth/v2/api-docs"}; @Resource(name = "stringRedisTemplate") private ValueOperations ops; @@ -96,4 +96,4 @@ public class AuthFilter implements GlobalFilter, Ordered { return -200; } -} \ No newline at end of file +} diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SwaggerHandler.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SwaggerHandler.java new file mode 100644 index 0000000..fe9516b --- /dev/null +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SwaggerHandler.java @@ -0,0 +1,55 @@ +package com.ruoyi.gateway.handler; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; +import springfox.documentation.swagger.web.*; + +import java.util.Optional; + +/** + * @ClassName SwaggerHandler + * @PackageName com.ruoyi.gateway.handler + * @Description TODO + * @Author daiz + * @Date 2019/8/16 10:07 + * @Version 1.0 + */ +@RestController +@RequestMapping("/swagger-resources") +public class SwaggerHandler { + + @Autowired(required = false) + private SecurityConfiguration securityConfiguration; + + @Autowired(required = false) + private UiConfiguration uiConfiguration; + + private final SwaggerResourcesProvider swaggerResources; + + @Autowired + public SwaggerHandler(SwaggerResourcesProvider swaggerResources) { + this.swaggerResources = swaggerResources; + } + + @GetMapping("/configuration/security") + public Mono> securityConfiguration() { + return Mono.just(new ResponseEntity<>( + Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK)); + } + + @GetMapping("/configuration/ui") + public Mono> uiConfiguration() { + return Mono.just(new ResponseEntity<>( + Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK)); + } + + @GetMapping("") + public Mono swaggerResources() { + return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK))); + } +} diff --git a/ruoyi-service-api/ruoyi-system-api/pom.xml b/ruoyi-service-api/ruoyi-system-api/pom.xml index 4f749f9..a29c65a 100644 --- a/ruoyi-service-api/ruoyi-system-api/pom.xml +++ b/ruoyi-service-api/ruoyi-system-api/pom.xml @@ -18,5 +18,10 @@ ${ruoyi.version} + + io.springfox + springfox-swagger2 + ${swagger.version} + - \ No newline at end of file + diff --git a/ruoyi-service-api/ruoyi-system-api/src/main/java/com/ruoyi/system/domain/SysUser.java b/ruoyi-service-api/ruoyi-system-api/src/main/java/com/ruoyi/system/domain/SysUser.java index ddd246d..4f34966 100644 --- a/ruoyi-service-api/ruoyi-system-api/src/main/java/com/ruoyi/system/domain/SysUser.java +++ b/ruoyi-service-api/ruoyi-system-api/src/main/java/com/ruoyi/system/domain/SysUser.java @@ -4,6 +4,8 @@ import java.util.Date; import java.util.List; import java.util.Set; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; @@ -14,18 +16,21 @@ import com.ruoyi.common.core.domain.BaseEntity; /** * 用户对象 sys_user - * + * * @author ruoyi */ +@ApiModel(description = "用户对象实体") public class SysUser extends BaseEntity { private static final long serialVersionUID = 1L; /** 用户ID */ + @ApiModelProperty(value = "用户序号", example = "123") @Excel(name = "用户序号", prompt = "用户编号") private Long userId; /** 部门ID */ + @ApiModelProperty(value = "部门编号", example = "456") @Excel(name = "部门编号", type = Type.IMPORT) private Long deptId; diff --git a/ruoyi-service/ruoyi-auth/pom.xml b/ruoyi-service/ruoyi-auth/pom.xml index db162bc..532aeed 100644 --- a/ruoyi-service/ruoyi-auth/pom.xml +++ b/ruoyi-service/ruoyi-auth/pom.xml @@ -62,7 +62,12 @@ ruoyi-common-log ${ruoyi.version} - + + + com.ruoyi.cloud + ruoyi-common-swagger + 1.0.0-SNAPSHOT + org.springframework.boot @@ -105,4 +110,4 @@ - \ No newline at end of file + diff --git a/ruoyi-service/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java b/ruoyi-service/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java index c8dcc58..38b1c4c 100644 --- a/ruoyi-service/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java +++ b/ruoyi-service/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java @@ -2,6 +2,8 @@ package com.ruoyi.auth.controller; import javax.servlet.http.HttpServletRequest; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -13,6 +15,7 @@ import com.ruoyi.auth.service.SysLoginService; import com.ruoyi.common.core.domain.R; import com.ruoyi.system.domain.SysUser; +@Api(tags = "系统登录") @RestController public class TokenController { @@ -22,6 +25,7 @@ public class TokenController @Autowired private SysLoginService sysLoginService; + @ApiOperation(value = "用户登录") @PostMapping("login") public R login(@RequestBody LoginForm form) { diff --git a/ruoyi-service/ruoyi-system/pom.xml b/ruoyi-service/ruoyi-system/pom.xml index daaf66a..8c9f4cb 100644 --- a/ruoyi-service/ruoyi-system/pom.xml +++ b/ruoyi-service/ruoyi-system/pom.xml @@ -89,6 +89,12 @@ ruoyi-common-redis ${ruoyi.version} + + + com.ruoyi.cloud + ruoyi-common-swagger + ${ruoyi.version} + @@ -159,4 +165,4 @@ - \ No newline at end of file + diff --git a/ruoyi-service/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java b/ruoyi-service/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java index 6429d92..31402ad 100644 --- a/ruoyi-service/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java +++ b/ruoyi-service/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java @@ -2,6 +2,8 @@ package com.ruoyi.system.controller; import javax.servlet.http.HttpServletRequest; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -24,10 +26,11 @@ import com.ruoyi.system.util.PasswordUtil; /** * 用户 提供者 - * + * * @author zmr * @date 2019-05-20 */ +@Api(tags = "用户模块") @RestController @RequestMapping("user") public class SysUserController extends BaseController @@ -68,6 +71,7 @@ public class SysUserController extends BaseController /** * 查询用户列表 */ + @ApiOperation(value = "查询用户列表数据") @GetMapping("list") public R list(SysUser sysUser) { @@ -177,7 +181,7 @@ public class SysUserController extends BaseController /** * 删除用户 - * @throws Exception + * @throws Exception */ @HasPermissions("system:user:remove") @OperLog(title = "用户管理", businessType = BusinessType.DELETE) -- Gitee