工作中遇到一个需求,管理员修改用户个人信息后,要通过邮件通知给超级管理员本次修改的列以及修改前后对应的值。首先想到的方法是遍历每个字段,逐一比较,后面发现工作量巨大,直接放弃。后来经过思考,参考swagger的实现方式,自己造轮子实现了一套基于注解和切面的操作日志记录功能。
关键maven依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
展示效果
具体实现
创建自定义注解
@Target({
ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface OperateLogParam {
/**
* 名称
* @return
*/
String name() default "";
/**
* 连接字符
* @return
*/
String limit() default "";
/**
* 映射关系
* @see 1-转正;0-试用期
* @return
*/
String map() default "";
/**
* 类型 可以根据需要制定默认值 处理逻辑见OperateLogEvent
* @return
*/
OperateLogEnum operateType() default OperateLogEnum.UPDATE_AFTER;
}
操作类型枚举类
public enum OperateLogEnum {
UPDATE_AROUND,UPDATE_BEFORE,UPDATE_AFTER;
}
日志信息
@Data
@NoArgsConstructor
public class OperateLog {
@TableId(value = "id",type = IdType.AUTO)
private Long id;
@JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")
@ApiModelProperty(name = "optTime",value = "操作时间")
private Date optTime;
@ApiModelProperty(name = "field",value = "操作列")
private String field;
@ApiModelProperty(name = "value",value = "操作内容")
private String value;
@ApiModelProperty(name = "operator",value = "操作人")
private String operator;
private Long employeeId;
public OperateLog(String field, String value, String operator, Long employeeId) {