diff --git a/README.md b/README.md index 42772dddd..2d0a9c0ab 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@ * 采用前后端分离的模式,微服务版本前端(基于 [RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue))。 * 后端采用Spring Boot、Spring Cloud & Alibaba。 -* 注册中心、配置中心选型Nacos,为权限认证使用OAuth2。 +* 注册中心、配置中心选型Nacos,权限认证使用OAuth2。 +* 流量控制框架选型Sentinel。 * 感谢[ruoyi-cloud-design](https://gitee.com/zhangmrit/ruoyi-cloud),[pig](https://gitee.com/log4j/pig)。 * 如需不分离应用,请移步 [RuoYi](https://gitee.com/y_project/RuoYi),如需分离应用,请移步 [RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue) * 阿里云优惠券:[点我进入](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console)   @@ -95,9 +96,13 @@ com.ruoyi + + + + - + diff --git a/pom.xml b/pom.xml index 973c4d113..112369e56 100644 --- a/pom.xml +++ b/pom.xml @@ -6,14 +6,14 @@ com.ruoyi ruoyi - 1.0.0 + 2.0.0 ruoyi http://www.ruoyi.vip 若依微服务系统 - 1.0.0 + 2.0.0 UTF-8 UTF-8 1.8 @@ -31,7 +31,6 @@ 1.2.70 3.17 2.6.2 - 1.19 @@ -51,7 +50,7 @@ com.alibaba.cloud spring-cloud-alibaba-dependencies - 2.1.0.RELEASE + 2.2.1.RELEASE pom import @@ -146,13 +145,6 @@ commons-pool2 ${common-pool.version} - - - - eu.bitwalker - UserAgentUtils - ${bitwalker.version} - diff --git a/ruoyi-api/pom.xml b/ruoyi-api/pom.xml index 7c6557838..2437cfe02 100644 --- a/ruoyi-api/pom.xml +++ b/ruoyi-api/pom.xml @@ -4,7 +4,7 @@ com.ruoyi ruoyi - 1.0.0 + 2.0.0 4.0.0 diff --git a/ruoyi-api/ruoyi-api-system/pom.xml b/ruoyi-api/ruoyi-api-system/pom.xml index 503331813..6f9997c97 100644 --- a/ruoyi-api/ruoyi-api-system/pom.xml +++ b/ruoyi-api/ruoyi-api-system/pom.xml @@ -5,7 +5,7 @@ com.ruoyi ruoyi-api - 1.0.0 + 2.0.0 4.0.0 diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteLogService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteLogService.java index 38345d777..8a1f590f7 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteLogService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteLogService.java @@ -3,6 +3,7 @@ package com.ruoyi.system.api; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.domain.SysOperLog; @@ -20,9 +21,20 @@ public interface RemoteLogService * 保存系统日志 * * @param sysOperLog 日志实体 - * @param from 内部调用标志 * @return 结果 */ @PostMapping("/operlog") R saveLog(@RequestBody SysOperLog sysOperLog); + + /** + * 保存访问记录 + * + * @param username 用户名称 + * @param status 状态 + * @param message 消息 + * @return 结果 + */ + @PostMapping("/logininfor") + R saveLogininfor(@RequestParam("username") String username, @RequestParam("status") String status, + @RequestParam("message") String message); } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java index 2c8eee863..64bcd53ba 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java @@ -20,7 +20,6 @@ public interface RemoteUserService * 通过用户名查询用户信息 * * @param username 用户名 - * @param from 调用标志 * @return 结果 */ @GetMapping(value = "/user/info/{username}") diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysOperLog.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysOperLog.java index 10320fedf..f3b54ff4c 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysOperLog.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysOperLog.java @@ -58,10 +58,6 @@ public class SysOperLog extends BaseEntity @Excel(name = "操作地址") private String operIp; - /** 操作地点 */ - @Excel(name = "操作地点") - private String operLocation; - /** 请求参数 */ @Excel(name = "请求参数") private String operParam; @@ -193,16 +189,6 @@ public class SysOperLog extends BaseEntity this.operIp = operIp; } - public String getOperLocation() - { - return operLocation; - } - - public void setOperLocation(String operLocation) - { - this.operLocation = operLocation; - } - public String getOperParam() { return operParam; diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteLogFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteLogFallbackFactory.java index 96f6c334a..8d1d9cd89 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteLogFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteLogFallbackFactory.java @@ -29,6 +29,13 @@ public class RemoteLogFallbackFactory implements FallbackFactory saveLogininfor(String username, String status, String message) + { + return null; + } }; + } } diff --git a/ruoyi-auth/pom.xml b/ruoyi-auth/pom.xml index e1a8c74d5..e70cd30c3 100644 --- a/ruoyi-auth/pom.xml +++ b/ruoyi-auth/pom.xml @@ -4,7 +4,7 @@ com.ruoyi ruoyi - 1.0.0 + 2.0.0 4.0.0 diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java index 963e0636c..4058f7583 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java @@ -1,5 +1,6 @@ package com.ruoyi.auth.controller; +import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.security.oauth2.common.OAuth2AccessToken; @@ -9,8 +10,11 @@ import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.core.constant.Constants; +import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.system.api.RemoteLogService; /** * token 控制 @@ -24,6 +28,9 @@ public class TokenController @Autowired private TokenStore tokenStore; + @Autowired + private RemoteLogService remoteLogService; + @DeleteMapping("/logout") public R logout(@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = false) String authHeader) { @@ -45,6 +52,13 @@ public class TokenController // 清空 refresh token OAuth2RefreshToken refreshToken = accessToken.getRefreshToken(); tokenStore.removeRefreshToken(refreshToken); + Map map = accessToken.getAdditionalInformation(); + if (map.containsKey(SecurityConstants.DETAILS_USERNAME)) + { + String username = (String) map.get(SecurityConstants.DETAILS_USERNAME); + // 记录用户退出日志 + remoteLogService.saveLogininfor(username, Constants.LOGOUT, "退出成功"); + } return R.ok(); } } diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/handler/AuthenticationSuccessEventHandler.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/handler/AuthenticationSuccessEventHandler.java new file mode 100644 index 000000000..f6fda372e --- /dev/null +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/handler/AuthenticationSuccessEventHandler.java @@ -0,0 +1,39 @@ +package com.ruoyi.auth.handler; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationListener; +import org.springframework.security.authentication.event.AuthenticationSuccessEvent; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; +import com.ruoyi.common.core.constant.Constants; +import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.common.security.domain.LoginUser; +import com.ruoyi.system.api.RemoteLogService; + +/** + * 认证成功处理 + * + * @author ruoyi + */ +@Component +public class AuthenticationSuccessEventHandler implements ApplicationListener +{ + @Autowired + private RemoteLogService remoteLogService; + + @Override + public void onApplicationEvent(AuthenticationSuccessEvent event) + { + Authentication authentication = (Authentication) event.getSource(); + if (StringUtils.isNotEmpty(authentication.getAuthorities()) + && authentication.getPrincipal() instanceof LoginUser) + { + LoginUser user = (LoginUser) authentication.getPrincipal(); + + String username = user.getUsername(); + + // 记录用户登录日志 + remoteLogService.saveLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功"); + } + } +} diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index eb3a0e552..77c0a0a13 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -4,7 +4,7 @@ com.ruoyi ruoyi - 1.0.0 + 2.0.0 4.0.0 diff --git a/ruoyi-common/ruoyi-common-core/pom.xml b/ruoyi-common/ruoyi-common-core/pom.xml index afb5909fe..09ebe3ef7 100644 --- a/ruoyi-common/ruoyi-common-core/pom.xml +++ b/ruoyi-common/ruoyi-common-core/pom.xml @@ -5,7 +5,7 @@ com.ruoyi ruoyi-common - 1.0.0 + 2.0.0 4.0.0 diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java index 8ae378a74..2613ce04b 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java @@ -12,6 +12,11 @@ public class Constants */ public static final String UTF8 = "UTF-8"; + /** + * GBK 字符集 + */ + public static final String GBK = "GBK"; + /** * http请求 */ diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java index 87f4735b9..9e0123d38 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java @@ -16,6 +16,7 @@ public class SecurityConstants * 授权token url */ public static final String AUTH_TOKEN = "/oauth/token"; + /** * 注销token url */ diff --git a/ruoyi-common/ruoyi-common-datascope/pom.xml b/ruoyi-common/ruoyi-common-datascope/pom.xml index b318f59c5..b89792e1f 100644 --- a/ruoyi-common/ruoyi-common-datascope/pom.xml +++ b/ruoyi-common/ruoyi-common-datascope/pom.xml @@ -5,7 +5,7 @@ com.ruoyi ruoyi-common - 1.0.0 + 2.0.0 4.0.0 diff --git a/ruoyi-common/ruoyi-common-log/pom.xml b/ruoyi-common/ruoyi-common-log/pom.xml index a3b797752..a75f289ac 100644 --- a/ruoyi-common/ruoyi-common-log/pom.xml +++ b/ruoyi-common/ruoyi-common-log/pom.xml @@ -5,7 +5,7 @@ com.ruoyi ruoyi-common - 1.0.0 + 2.0.0 4.0.0 @@ -23,11 +23,5 @@ ruoyi-common-security - - - eu.bitwalker - UserAgentUtils - - \ No newline at end of file diff --git a/ruoyi-common/ruoyi-common-redis/pom.xml b/ruoyi-common/ruoyi-common-redis/pom.xml index 407257b0b..ecea0c59c 100644 --- a/ruoyi-common/ruoyi-common-redis/pom.xml +++ b/ruoyi-common/ruoyi-common-redis/pom.xml @@ -5,7 +5,7 @@ com.ruoyi ruoyi-common - 1.0.0 + 2.0.0 4.0.0 diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java index 8d8223dce..0499feb6a 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java @@ -1,6 +1,5 @@ package com.ruoyi.common.redis.configure; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; @@ -22,7 +21,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; public class RedisConfig extends CachingConfigurerSupport { @Bean - @ConditionalOnMissingBean(name = "redisTemplate") @SuppressWarnings(value = { "unchecked", "rawtypes", "deprecation" }) public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { diff --git a/ruoyi-common/ruoyi-common-security/pom.xml b/ruoyi-common/ruoyi-common-security/pom.xml index 1a596a40c..e12fd09fe 100644 --- a/ruoyi-common/ruoyi-common-security/pom.xml +++ b/ruoyi-common/ruoyi-common-security/pom.xml @@ -4,7 +4,7 @@ com.ruoyi ruoyi-common - 1.0.0 + 2.0.0 4.0.0 diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/config/SecurityImportBeanDefinitionRegistrar.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/config/SecurityImportBeanDefinitionRegistrar.java index d6a8f9b5c..386bce005 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/config/SecurityImportBeanDefinitionRegistrar.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/config/SecurityImportBeanDefinitionRegistrar.java @@ -20,6 +20,5 @@ public class SecurityImportBeanDefinitionRegistrar implements ImportBeanDefiniti String beanName = StringUtils.uncapitalize(aClass.getSimpleName()); BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(ResourceServerConfig.class); registry.registerBeanDefinition(beanName, beanDefinitionBuilder.getBeanDefinition()); - } } diff --git a/ruoyi-common/ruoyi-common-swagger/pom.xml b/ruoyi-common/ruoyi-common-swagger/pom.xml index a9f231a67..9de859931 100644 --- a/ruoyi-common/ruoyi-common-swagger/pom.xml +++ b/ruoyi-common/ruoyi-common-swagger/pom.xml @@ -5,7 +5,7 @@ com.ruoyi ruoyi-common - 1.0.0 + 2.0.0 4.0.0 diff --git a/ruoyi-gateway/pom.xml b/ruoyi-gateway/pom.xml index cf167a9cc..98668782f 100644 --- a/ruoyi-gateway/pom.xml +++ b/ruoyi-gateway/pom.xml @@ -4,54 +4,72 @@ com.ruoyi ruoyi - 1.0.0 + 2.0.0 4.0.0 - + ruoyi-gateway - + ruoyi-gateway网关模块 - + - - + + org.springframework.cloud spring-cloud-starter-gateway - + com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery - + com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config - + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + com.alibaba.cloud + spring-cloud-alibaba-sentinel-gateway + + + + + com.alibaba.csp + sentinel-datasource-nacos + + org.springframework.boot spring-boot-starter-actuator - + com.github.penggle kaptcha - + com.ruoyi ruoyi-common-redis - + io.springfox @@ -63,9 +81,9 @@ springfox-swagger2 ${swagger.fox.version} - + - + @@ -81,5 +99,5 @@ - + diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java new file mode 100644 index 000000000..677ffde2e --- /dev/null +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java @@ -0,0 +1,32 @@ +package com.ruoyi.gateway.config; + +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import com.alibaba.csp.sentinel.adapter.gateway.sc.SentinelGatewayFilter; +import com.ruoyi.gateway.handler.SentinelFallbackHandler; + +/** + * 网关限流配置 + * + * @author ruoyi + */ +@Configuration +public class GatewayConfig +{ + @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) + public SentinelFallbackHandler sentinelGatewayExceptionHandler() + { + return new SentinelFallbackHandler(); + } + + @Bean + @Order(-1) + public GlobalFilter sentinelGatewayFilter() + { + return new SentinelGatewayFilter(); + } +} \ No newline at end of file diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/RouterFunctionConfiguration.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/RouterFunctionConfiguration.java index b923b002b..7e4cdf235 100644 --- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/RouterFunctionConfiguration.java +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/RouterFunctionConfiguration.java @@ -7,7 +7,6 @@ import org.springframework.http.MediaType; import org.springframework.web.reactive.function.server.RequestPredicates; import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.RouterFunctions; -import com.ruoyi.gateway.handler.HystrixFallbackHandler; import com.ruoyi.gateway.handler.ValidateCodeHandler; /** @@ -19,20 +18,14 @@ import com.ruoyi.gateway.handler.ValidateCodeHandler; public class RouterFunctionConfiguration { @Autowired - private HystrixFallbackHandler hystrixFallbackHandler; - - @Autowired - private ValidateCodeHandler imageCodeHandler; + private ValidateCodeHandler validateCodeHandler; @SuppressWarnings("rawtypes") @Bean public RouterFunction routerFunction() { - return RouterFunctions - .route(RequestPredicates.path("/fallback").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), - hystrixFallbackHandler) - .andRoute(RequestPredicates.GET("/code").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), - imageCodeHandler); + return RouterFunctions.route( + RequestPredicates.GET("/code").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), + validateCodeHandler); } - } diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/HystrixFallbackHandler.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/HystrixFallbackHandler.java deleted file mode 100644 index d49f424fa..000000000 --- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/HystrixFallbackHandler.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.ruoyi.gateway.handler; - -import com.alibaba.fastjson.JSON; -import com.ruoyi.common.core.domain.R; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.server.HandlerFunction; -import org.springframework.web.reactive.function.server.ServerRequest; -import org.springframework.web.reactive.function.server.ServerResponse; -import reactor.core.publisher.Mono; -import java.util.Optional; -import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR; - -/** - * 熔断降级处理 - * - * @author ruoyi - */ -@Component -public class HystrixFallbackHandler implements HandlerFunction -{ - private static final Logger log = LoggerFactory.getLogger(HystrixFallbackHandler.class); - - @Override - public Mono handle(ServerRequest serverRequest) - { - Optional originalUris = serverRequest.attribute(GATEWAY_ORIGINAL_REQUEST_URL_ATTR); - originalUris.ifPresent(originalUri -> log.error("网关执行请求:{}失败,hystrix服务降级处理", originalUri)); - return ServerResponse.status(HttpStatus.INTERNAL_SERVER_ERROR.value()).contentType(MediaType.APPLICATION_JSON) - .body(BodyInserters.fromValue(JSON.toJSONString(R.failed("服务已被降级熔断")))); - } -} \ No newline at end of file diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SentinelFallbackHandler.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SentinelFallbackHandler.java new file mode 100644 index 000000000..60a006f29 --- /dev/null +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SentinelFallbackHandler.java @@ -0,0 +1,47 @@ +package com.ruoyi.gateway.handler; + +import java.nio.charset.StandardCharsets; +import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebExceptionHandler; +import reactor.core.publisher.Mono; + +/** + * 自定义限流异常处理 + * + * @author ruoyi + */ +public class SentinelFallbackHandler implements WebExceptionHandler +{ + private Mono writeResponse(ServerResponse response, ServerWebExchange exchange) + { + ServerHttpResponse serverHttpResponse = exchange.getResponse(); + serverHttpResponse.getHeaders().add("Content-Type", "application/json;charset=UTF-8"); + byte[] datas = "{\"status\":429,\"message\":\"请求超过最大数,请稍后再试\"}".getBytes(StandardCharsets.UTF_8); + DataBuffer buffer = serverHttpResponse.bufferFactory().wrap(datas); + return serverHttpResponse.writeWith(Mono.just(buffer)); + } + + @Override + public Mono handle(ServerWebExchange exchange, Throwable ex) + { + if (exchange.getResponse().isCommitted()) + { + return Mono.error(ex); + } + if (!BlockException.isBlockException(ex)) + { + return Mono.error(ex); + } + return handleBlockedRequest(exchange, ex).flatMap(response -> writeResponse(response, exchange)); + } + + private Mono handleBlockedRequest(ServerWebExchange exchange, Throwable throwable) + { + return GatewayCallbackManager.getBlockHandler().handleRequest(exchange, throwable); + } +} diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/impl/ValidateCodeServiceImpl.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/impl/ValidateCodeServiceImpl.java index 738897ccf..3af3f25d3 100644 --- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/impl/ValidateCodeServiceImpl.java +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/impl/ValidateCodeServiceImpl.java @@ -3,13 +3,10 @@ package com.ruoyi.gateway.service.impl; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.concurrent.TimeUnit; - import javax.imageio.ImageIO; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.FastByteArrayOutputStream; - import com.google.code.kaptcha.Producer; import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.exception.CaptchaException; diff --git a/ruoyi-gateway/src/main/resources/bootstrap.yml b/ruoyi-gateway/src/main/resources/bootstrap.yml index a8c537070..5f9f269e8 100644 --- a/ruoyi-gateway/src/main/resources/bootstrap.yml +++ b/ruoyi-gateway/src/main/resources/bootstrap.yml @@ -10,6 +10,8 @@ spring: profiles: # 环境配置 active: dev + main: + allow-bean-definition-overriding: true cloud: nacos: discovery: @@ -22,3 +24,18 @@ spring: file-extension: yml # 共享配置 shared-dataids: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + sentinel: + # 取消控制台懒加载 + eager: true + transport: + # 控制台地址 + dashboard: 127.0.0.1:8718 + # nacos配置持久化 + datasource: + ds1: + nacos: + server-addr: 127.0.0.1:8848 + dataId: sentinel-ruoyi-gateway + groupId: DEFAULT_GROUP + data-type: json + rule-type: flow diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml index 92d74bbf5..876391dd0 100644 --- a/ruoyi-modules/pom.xml +++ b/ruoyi-modules/pom.xml @@ -4,7 +4,7 @@ com.ruoyi ruoyi - 1.0.0 + 2.0.0 4.0.0 diff --git a/ruoyi-modules/ruoyi-gen/pom.xml b/ruoyi-modules/ruoyi-gen/pom.xml index a148ab6ca..62228dee9 100644 --- a/ruoyi-modules/ruoyi-gen/pom.xml +++ b/ruoyi-modules/ruoyi-gen/pom.xml @@ -5,7 +5,7 @@ com.ruoyi ruoyi-modules - 1.0.0 + 2.0.0 4.0.0 @@ -29,10 +29,10 @@ spring-cloud-starter-alibaba-nacos-config - + - org.springframework.cloud - spring-cloud-starter-netflix-hystrix + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityUtils.java b/ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityUtils.java index 09b1145ec..b78f5350d 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityUtils.java +++ b/ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityUtils.java @@ -22,7 +22,7 @@ public class VelocityUtils private static final String PROJECT_PATH = "main/java"; /** mybatis空间路径 */ - private static final String MYBATIS_PATH = "main/resources/mybatis"; + private static final String MYBATIS_PATH = "main/resources/mapper"; /** * 设置模板变量信息 diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm index c45ba6699..5646a2e46 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm @@ -1,6 +1,8 @@ package ${packageName}.controller; import java.util.List; +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -11,15 +13,15 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.ruoyi.framework.aspectj.lang.annotation.Log; -import com.ruoyi.framework.aspectj.lang.enums.BusinessType; +import com.ruoyi.common.log.annotation.Log; +import com.ruoyi.common.log.enums.BusinessType; import ${packageName}.domain.${ClassName}; import ${packageName}.service.I${ClassName}Service; -import com.ruoyi.framework.web.controller.BaseController; -import com.ruoyi.framework.web.domain.AjaxResult; -import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.web.controller.BaseController; +import com.ruoyi.common.core.web.domain.AjaxResult; +import com.ruoyi.common.core.utils.poi.ExcelUtil; #if($table.crud) -import com.ruoyi.framework.web.page.TableDataInfo; +import com.ruoyi.common.core.web.page.TableDataInfo; #elseif($table.tree) #end @@ -30,7 +32,7 @@ import com.ruoyi.framework.web.page.TableDataInfo; * @date ${datetime} */ @RestController -@RequestMapping("/${moduleName}/${businessName}") +@RequestMapping("/${businessName}") public class ${ClassName}Controller extends BaseController { @Autowired @@ -62,11 +64,11 @@ public class ${ClassName}Controller extends BaseController @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')") @Log(title = "${functionName}", businessType = BusinessType.EXPORT) @GetMapping("/export") - public AjaxResult export(${ClassName} ${className}) + public void export(HttpServletResponse response, ${ClassName} ${className}) throws IOException { List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class); - return util.exportExcel(list, "${businessName}"); + return util.exportExcel(response, list, "${businessName}"); } /** diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/js/api.js.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/js/api.js.vm index cd2403cc6..d78cd2f64 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/js/api.js.vm +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/js/api.js.vm @@ -42,12 +42,3 @@ export function del${BusinessName}(${pkColumn.javaField}) { method: 'delete' }) } - -// 导出${functionName} -export function export${BusinessName}(query) { - return request({ - url: '/${moduleName}/${businessName}/export', - method: 'get', - params: query - }) -} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm index 0b64a0c85..d8ecac1a9 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm @@ -229,7 +229,7 @@ \ No newline at end of file diff --git a/ruoyi-ui/src/views/system/logininfor/index.vue b/ruoyi-ui/src/views/system/logininfor/index.vue index cf71a0a1f..f082f8cb2 100644 --- a/ruoyi-ui/src/views/system/logininfor/index.vue +++ b/ruoyi-ui/src/views/system/logininfor/index.vue @@ -90,15 +90,12 @@ - - - - - - - + + + + diff --git a/ruoyi-ui/src/views/system/operlog/index.vue b/ruoyi-ui/src/views/system/operlog/index.vue index d417c9118..124c7cda9 100644 --- a/ruoyi-ui/src/views/system/operlog/index.vue +++ b/ruoyi-ui/src/views/system/operlog/index.vue @@ -110,7 +110,6 @@ -