diff --git a/pom.xml b/pom.xml index f02d7e76fba3159dd45a2fab5838971ce24c0dbf..07ec3864a8288d0054ac98e90d2bdcd2ffc45ac2 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 1c6e365dc55047aeff08a048ef437a1c63d7b49b..8e5b012c9d8247e1e556001d3bd21b302efe153c 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 0000000000000000000000000000000000000000..c06e3646510568283d3e069a0dfd2b350b72f2a5 --- /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 0000000000000000000000000000000000000000..22a21fde15465d3d303379c7ed2530b888247de4 --- /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 2177e8d0a3ee2545cf54b8123726ad581be2bf2a..78e68e6816ead6a179e080c488c0a004f466c4fe 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 0000000000000000000000000000000000000000..28af19234d452408049595e56cd1b09579732d55 --- /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 6c2d58d2a17e2928c60f439f940b4454ad5495db..3349433e42df4b5413309aa69766d0ad9d255bae 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 0000000000000000000000000000000000000000..fe9516b4beb0fa59dc2575e050fdfc65a3231949 --- /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 4f749f97495ea13866e81536ffdb6be299a1e3f5..a29c65a82616c155438cc24b23b5014d8f4caeb8 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 ddd246d7a2b0b25ef2bf24cead3f927655a8401d..4f349662b1e5406eeb520b077789fdb8362e4fa0 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 db162bc805036003a8afbdcab6e94b43e4b22787..532aeed89849a73671201c37d29a69bc10e21c6e 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 c8dcc587ddaebaabd26267ed0fb520b9851901de..38b1c4c0f4894c1b617cc3066e604ae90948e747 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 daaf66a1c3d961e2ed65ca78808291378cebcc2c..8c9f4cbc67100830519d6dfad3f6489be0744cec 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 6429d925fe186fdc187c2c89672900f7f75189dc..31402ad09b64fca854ecc6e8eeeee544d6536409 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)