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)