mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-10-31 10:37:41 +08:00 
			
		
		
		
	Merge branch 'master-jdk17' of https://gitee.com/zhijiantianya/ruoyi-vue-pro
This commit is contained in:
		| @ -7,6 +7,8 @@ import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; | |||||||
| import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; | import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; | ||||||
| import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; | import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; | ||||||
| import com.baomidou.mybatisplus.extension.incrementer.*; | import com.baomidou.mybatisplus.extension.incrementer.*; | ||||||
|  | import com.baomidou.mybatisplus.extension.parser.JsqlParserGlobal; | ||||||
|  | import com.baomidou.mybatisplus.extension.parser.cache.JdkSerialCaffeineJsqlParseCache; | ||||||
| import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; | import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; | ||||||
| import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; | import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; | ||||||
| import org.apache.ibatis.annotations.Mapper; | import org.apache.ibatis.annotations.Mapper; | ||||||
| @ -16,6 +18,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | |||||||
| import org.springframework.context.annotation.Bean; | import org.springframework.context.annotation.Bean; | ||||||
| import org.springframework.core.env.ConfigurableEnvironment; | import org.springframework.core.env.ConfigurableEnvironment; | ||||||
|  |  | ||||||
|  | import java.util.concurrent.TimeUnit; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * MyBaits 配置类 |  * MyBaits 配置类 | ||||||
|  * |  * | ||||||
| @ -26,6 +30,14 @@ import org.springframework.core.env.ConfigurableEnvironment; | |||||||
|         lazyInitialization = "${mybatis.lazy-initialization:false}") // Mapper 懒加载,目前仅用于单元测试 |         lazyInitialization = "${mybatis.lazy-initialization:false}") // Mapper 懒加载,目前仅用于单元测试 | ||||||
| public class YudaoMybatisAutoConfiguration { | public class YudaoMybatisAutoConfiguration { | ||||||
|  |  | ||||||
|  |     static { | ||||||
|  |         // 动态 SQL 智能优化支持本地缓存加速解析,更完善的租户复杂 XML 动态 SQL 支持,静态注入缓存 | ||||||
|  |         JsqlParserGlobal.setJsqlParseCache(new JdkSerialCaffeineJsqlParseCache( | ||||||
|  |                 (cache) -> cache.maximumSize(1024) | ||||||
|  |                         .expireAfterWrite(5, TimeUnit.SECONDS)) | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @Bean |     @Bean | ||||||
|     public MybatisPlusInterceptor mybatisPlusInterceptor() { |     public MybatisPlusInterceptor mybatisPlusInterceptor() { | ||||||
|         MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); |         MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); | ||||||
| @ -34,7 +46,7 @@ public class YudaoMybatisAutoConfiguration { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Bean |     @Bean | ||||||
|     public MetaObjectHandler defaultMetaObjectHandler(){ |     public MetaObjectHandler defaultMetaObjectHandler() { | ||||||
|         return new DefaultDBFieldHandler(); // 自动填充参数类 |         return new DefaultDBFieldHandler(); // 自动填充参数类 | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | |||||||
| @ -69,7 +69,7 @@ public class ApiSignatureAspect { | |||||||
|  |  | ||||||
|         // 3. 将 nonce 记入缓存,防止重复使用(重点二:此处需要将 ttl 设定为允许 timestamp 时间差的值 x 2 ) |         // 3. 将 nonce 记入缓存,防止重复使用(重点二:此处需要将 ttl 设定为允许 timestamp 时间差的值 x 2 ) | ||||||
|         String nonce = request.getHeader(signature.nonce()); |         String nonce = request.getHeader(signature.nonce()); | ||||||
|         signatureRedisDAO.setNonce(nonce, signature.timeout() * 2, signature.timeUnit()); |         signatureRedisDAO.setNonce(appId, nonce, signature.timeout() * 2, signature.timeUnit()); | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -113,7 +113,7 @@ public class ApiSignatureAspect { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         // 3. 检查 nonce 是否存在,有且仅能使用一次 |         // 3. 检查 nonce 是否存在,有且仅能使用一次 | ||||||
|         return signatureRedisDAO.getNonce(nonce) == null; |         return signatureRedisDAO.getNonce(appId, nonce) == null; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @ -166,4 +166,3 @@ public class ApiSignatureAspect { | |||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -22,7 +22,7 @@ public class ApiSignatureRedisDAO { | |||||||
|      * VALUE 格式:String |      * VALUE 格式:String | ||||||
|      * 过期时间:不固定 |      * 过期时间:不固定 | ||||||
|      */ |      */ | ||||||
|     private static final String SIGNATURE_NONCE = "api_signature_nonce:%s"; |     private static final String SIGNATURE_NONCE = "api_signature_nonce:%s:%s"; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 签名密钥 |      * 签名密钥 | ||||||
| @ -36,16 +36,16 @@ public class ApiSignatureRedisDAO { | |||||||
|  |  | ||||||
|     // ========== 验签随机数 ========== |     // ========== 验签随机数 ========== | ||||||
|  |  | ||||||
|     public String getNonce(String nonce) { |     public String getNonce(String appId, String nonce) { | ||||||
|         return stringRedisTemplate.opsForValue().get(formatNonceKey(nonce)); |         return stringRedisTemplate.opsForValue().get(formatNonceKey(appId, nonce)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setNonce(String nonce, int time, TimeUnit timeUnit) { |     public void setNonce(String appId, String nonce, int time, TimeUnit timeUnit) { | ||||||
|         stringRedisTemplate.opsForValue().set(formatNonceKey(nonce), "", time, timeUnit); |         stringRedisTemplate.opsForValue().set(formatNonceKey(appId, nonce), "", time, timeUnit); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private static String formatNonceKey(String key) { |     private static String formatNonceKey(String appId, String nonce) { | ||||||
|         return String.format(SIGNATURE_NONCE, key); |         return String.format(SIGNATURE_NONCE, appId, nonce); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // ========== 签名密钥 ========== |     // ========== 签名密钥 ========== | ||||||
|  | |||||||
| @ -69,7 +69,7 @@ public class ApiSignatureTest { | |||||||
|         // 断言结果 |         // 断言结果 | ||||||
|         assertTrue(result); |         assertTrue(result); | ||||||
|         // 断言调用 |         // 断言调用 | ||||||
|         verify(signatureRedisDAO).setNonce(eq(nonce), eq(120), eq(TimeUnit.SECONDS)); |         verify(signatureRedisDAO).setNonce(eq(appId), eq(nonce), eq(120), eq(TimeUnit.SECONDS)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -9,6 +9,7 @@ import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO; | |||||||
| import com.mzt.logapi.beans.LogRecord; | import com.mzt.logapi.beans.LogRecord; | ||||||
| import com.mzt.logapi.service.ILogRecordService; | import com.mzt.logapi.service.ILogRecordService; | ||||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||||
|  | import org.springframework.scheduling.annotation.Async; | ||||||
|  |  | ||||||
| import javax.annotation.Resource; | import javax.annotation.Resource; | ||||||
| import javax.servlet.http.HttpServletRequest; | import javax.servlet.http.HttpServletRequest; | ||||||
| @ -28,19 +29,24 @@ public class LogRecordServiceImpl implements ILogRecordService { | |||||||
|     private OperateLogApi operateLogApi; |     private OperateLogApi operateLogApi; | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|  |     @Async | ||||||
|     public void record(LogRecord logRecord) { |     public void record(LogRecord logRecord) { | ||||||
|         // 1. 补全通用字段 |  | ||||||
|         OperateLogCreateReqDTO reqDTO = new OperateLogCreateReqDTO(); |         OperateLogCreateReqDTO reqDTO = new OperateLogCreateReqDTO(); | ||||||
|         reqDTO.setTraceId(TracerUtils.getTraceId()); |         try { | ||||||
|         // 补充用户信息 |             reqDTO.setTraceId(TracerUtils.getTraceId()); | ||||||
|         fillUserFields(reqDTO); |             // 补充用户信息 | ||||||
|         // 补全模块信息 |             fillUserFields(reqDTO); | ||||||
|         fillModuleFields(reqDTO, logRecord); |             // 补全模块信息 | ||||||
|         // 补全请求信息 |             fillModuleFields(reqDTO, logRecord); | ||||||
|         fillRequestFields(reqDTO); |             // 补全请求信息 | ||||||
|  |             fillRequestFields(reqDTO); | ||||||
|  |  | ||||||
|         // 2. 异步记录日志 |             // 2. 异步记录日志 | ||||||
|         operateLogApi.createOperateLog(reqDTO); |             operateLogApi.createOperateLog(reqDTO); | ||||||
|  |         } catch (Throwable ex) { | ||||||
|  |             // 由于 @Async 异步调用,这里打印下日志,更容易跟进 | ||||||
|  |             log.error("[record][url({}) log({}) 发生异常]", reqDTO.getRequestUrl(), reqDTO, ex); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private static void fillUserFields(OperateLogCreateReqDTO reqDTO) { |     private static void fillUserFields(OperateLogCreateReqDTO reqDTO) { | ||||||
|  | |||||||
| @ -63,6 +63,7 @@ public class BpmModelServiceImpl implements BpmModelService { | |||||||
|     @Override |     @Override | ||||||
|     public PageResult<Model> getModelPage(BpmModelPageReqVO pageVO) { |     public PageResult<Model> getModelPage(BpmModelPageReqVO pageVO) { | ||||||
|         ModelQuery modelQuery = repositoryService.createModelQuery(); |         ModelQuery modelQuery = repositoryService.createModelQuery(); | ||||||
|  |         modelQuery.modelTenantId(FlowableUtils.getTenantId()); | ||||||
|         if (StrUtil.isNotBlank(pageVO.getKey())) { |         if (StrUtil.isNotBlank(pageVO.getKey())) { | ||||||
|             modelQuery.modelKey(pageVO.getKey()); |             modelQuery.modelKey(pageVO.getKey()); | ||||||
|         } |         } | ||||||
| @ -78,7 +79,6 @@ public class BpmModelServiceImpl implements BpmModelService { | |||||||
|             return PageResult.empty(count); |             return PageResult.empty(count); | ||||||
|         } |         } | ||||||
|         List<Model> models = modelQuery |         List<Model> models = modelQuery | ||||||
|                 .modelTenantId(FlowableUtils.getTenantId()) |  | ||||||
|                 .orderByCreateTime().desc() |                 .orderByCreateTime().desc() | ||||||
|                 .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); |                 .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); | ||||||
|         return new PageResult<>(models, count); |         return new PageResult<>(models, count); | ||||||
|  | |||||||
| @ -97,7 +97,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { | |||||||
|         } |         } | ||||||
|         if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) { |         if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) { | ||||||
|             taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0])); |             taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0])); | ||||||
|             taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[1])); |             taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getCreateTime()[1])); | ||||||
|         } |         } | ||||||
|         long count = taskQuery.count(); |         long count = taskQuery.count(); | ||||||
|         if (count == 0) { |         if (count == 0) { | ||||||
| @ -119,7 +119,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { | |||||||
|         } |         } | ||||||
|         if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) { |         if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) { | ||||||
|             taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0])); |             taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0])); | ||||||
|             taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[1])); |             taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getCreateTime()[1])); | ||||||
|         } |         } | ||||||
|         // 执行查询 |         // 执行查询 | ||||||
|         long count = taskQuery.count(); |         long count = taskQuery.count(); | ||||||
| @ -141,7 +141,7 @@ public class BpmTaskServiceImpl implements BpmTaskService { | |||||||
|         } |         } | ||||||
|         if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) { |         if (ArrayUtil.isNotEmpty(pageVO.getCreateTime())) { | ||||||
|             taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0])); |             taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[0])); | ||||||
|             taskQuery.taskCreatedAfter(DateUtils.of(pageVO.getCreateTime()[1])); |             taskQuery.taskCreatedBefore(DateUtils.of(pageVO.getCreateTime()[1])); | ||||||
|         } |         } | ||||||
|         // 执行查询 |         // 执行查询 | ||||||
|         long count = taskQuery.count(); |         long count = taskQuery.count(); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV