mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 18:28:43 +08:00 
			
		
		
		
	完成操作日志的存储
This commit is contained in:
		| @@ -272,7 +272,7 @@ public class OperateLogAspect { | ||||
|         return ((MethodSignature) joinPoint.getSignature()).getMethod().getDeclaringClass().getAnnotation(annotationClass); | ||||
|     } | ||||
|  | ||||
|     private static Map<String, Object> obtainMethodArgs(ProceedingJoinPoint joinPoint) { | ||||
|     private static String obtainMethodArgs(ProceedingJoinPoint joinPoint) { | ||||
|         // TODO 提升:参数脱敏和忽略 | ||||
|         MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); | ||||
|         String[] argNames = methodSignature.getParameterNames(); | ||||
| @@ -285,7 +285,7 @@ public class OperateLogAspect { | ||||
|             // 被忽略时,标记为 ignore 字符串,避免和 null 混在一起 | ||||
|             args.put(argName, !isIgnoreArgs(argValue) ? argValue : "[ignore]"); | ||||
|         } | ||||
|         return args; | ||||
|         return JSON.toJSONString(argValues); | ||||
|     } | ||||
|  | ||||
|     private static String obtainResultData(Object result) { | ||||
|   | ||||
| @@ -0,0 +1,10 @@ | ||||
| /** | ||||
|  * 该包是技术组件,每个子包,代表一个组件。每个组件包括两部分: | ||||
|  * 1. core 包:是该组件的核心分装 | ||||
|  * 2. config 包:是该组件基于 Spring 的配置 | ||||
|  * | ||||
|  * 技术组件,也分成两类: | ||||
|  * 1. 框架组件:和我们熟悉的 MyBatis、Redis 等等的拓展 | ||||
|  * 2. 业务组件:和业务相关的组件的封装,例如说数据字典、操作日志等等。 | ||||
|  */ | ||||
| package cn.iocoder.dashboard.framework; | ||||
| @@ -6,7 +6,6 @@ import lombok.Data; | ||||
| import javax.validation.constraints.NotEmpty; | ||||
| import javax.validation.constraints.NotNull; | ||||
| import java.util.Date; | ||||
| import java.util.Map; | ||||
|  | ||||
| /** | ||||
|  * 操作日志 Base VO,提供给添加、修改、详细的子 VO 使用 | ||||
| @@ -56,7 +55,7 @@ public class SysOperateLogBaseVO { | ||||
|     private String javaMethod; | ||||
|  | ||||
|     @ApiModelProperty(value = "Java 方法的参数") | ||||
|     private Map<String, Object> javaMethodArgs; | ||||
|     private String javaMethodArgs; | ||||
|  | ||||
|     @ApiModelProperty(value = "开始时间", required = true) | ||||
|     @NotNull(message = "开始时间不能为空") | ||||
|   | ||||
| @@ -24,6 +24,16 @@ import java.util.Map; | ||||
| @EqualsAndHashCode(callSuper = true) | ||||
| public class SysOperateLogDO extends BaseDO { | ||||
|  | ||||
|     /** | ||||
|      * {@link #javaMethodArgs} 的最大长度 | ||||
|      */ | ||||
|     public static final Integer JAVA_METHOD_ARGS_MAX_LENGTH = 8000; | ||||
|  | ||||
|     /** | ||||
|      * {@link #resultData} 的最大长度 | ||||
|      */ | ||||
|     public static final Integer RESULT_MAX_LENGTH = 4000; | ||||
|  | ||||
|     /** | ||||
|      * 日志主键 | ||||
|      */ | ||||
| @@ -54,6 +64,7 @@ public class SysOperateLogDO extends BaseDO { | ||||
|      * | ||||
|      * 枚举 {@link SysOperateLogTypeEnum} | ||||
|      */ | ||||
|     @TableField("operate_type") | ||||
|     private Integer type; | ||||
|     /** | ||||
|      * 操作内容,记录整个操作的明细 | ||||
| @@ -94,9 +105,12 @@ public class SysOperateLogDO extends BaseDO { | ||||
|     private String javaMethod; | ||||
|     /** | ||||
|      * Java 方法的参数 | ||||
|      * | ||||
|      * 实际格式为 Map<String, Object> | ||||
|      *     不使用 @TableField(typeHandler = FastjsonTypeHandler.class) 注解的原因是,数据库存储有长度限制,会进行裁剪,会导致 JSON 反序列化失败 | ||||
|      *     其中,key 为参数名,value 为参数值 | ||||
|      */ | ||||
|     @TableField(typeHandler = FastjsonTypeHandler.class) | ||||
|     private Map<String, Object> javaMethodArgs; | ||||
|     private String javaMethodArgs; | ||||
|     /** | ||||
|      * 开始时间 | ||||
|      */ | ||||
|   | ||||
| @@ -5,12 +5,15 @@ import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert; | ||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dao.logger.SysOperateLogMapper; | ||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO; | ||||
| import cn.iocoder.dashboard.modules.system.service.logger.SysOperateLogService; | ||||
| import cn.iocoder.dashboard.util.string.StrUtils; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.scheduling.annotation.Async; | ||||
| import org.springframework.stereotype.Service; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
|  | ||||
| import static cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.logger.SysOperateLogDO.*; | ||||
|  | ||||
| @Service | ||||
| @Slf4j | ||||
| public class SysOperateLogServiceImpl implements SysOperateLogService { | ||||
| @@ -21,8 +24,10 @@ public class SysOperateLogServiceImpl implements SysOperateLogService { | ||||
|     @Override | ||||
|     @Async | ||||
|     public void createOperateLogAsync(SysOperateLogCreateReqVO reqVO) { | ||||
|         SysOperateLogDO logDO = SysOperateLogConvert.INSTANCE.convert(reqVO); | ||||
|         try { | ||||
|             SysOperateLogDO logDO = SysOperateLogConvert.INSTANCE.convert(reqVO); | ||||
|             logDO.setJavaMethodArgs(StrUtils.maxLength(logDO.getJavaMethodArgs(), JAVA_METHOD_ARGS_MAX_LENGTH)); | ||||
|             logDO.setResultData(StrUtils.maxLength(logDO.getResultData(), RESULT_MAX_LENGTH)); | ||||
|             operateLogMapper.insert(logDO); | ||||
|         } catch (Throwable throwable) { | ||||
|             // 仅仅打印日志,不对外抛出。原因是,还是要保留现场数据。 | ||||
|   | ||||
							
								
								
									
										16
									
								
								src/main/java/cn/iocoder/dashboard/util/string/StrUtils.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/main/java/cn/iocoder/dashboard/util/string/StrUtils.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| package cn.iocoder.dashboard.util.string; | ||||
|  | ||||
| import cn.hutool.core.util.StrUtil; | ||||
|  | ||||
| /** | ||||
|  * 字符串工具类 | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| public class StrUtils { | ||||
|  | ||||
|     public static String maxLength(CharSequence str, int maxLength) { | ||||
|         return StrUtil.maxLength(str, maxLength - 3); // -3 的原因,是该方法会补充 ... 恰好 | ||||
|     } | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV