mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-07-15 19:45:06 +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