SpringBoot2.X,使用 自定义注解 + SpringAOP来记录系统操作日志

1:自定义一个操作日志的注解

/**
* 操作日志注解
*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface OperateLog {

/**
* 模块名称
*
* @return
*/
String module();

/**
* 操作名称
*
* @return
*/
String function();

/**
* 过滤敏感词
*
* @return
*/
Class<? extends OperateLogHandler> handler() default OperateLogHandler.class;

}

2:操作日志的AOP

/**
* 操作日志aop
*/
@Slf4j
@Aspect
@Component
public class OperateLogAspect {

private static final String OPERATE_LOG_ID = "operateLogId";

@Autowired
private SysOperateLogService sysOperateLogService;

/**
* 切点: @annotation 表示持有“cn.XXXX.annotation.OperateLog”注解的方法都将执行aop的通知
*/
@Pointcut("@annotation(cn.xiweiai.dc.web.admin.annotation.OperateLog)")
public void pointcut() {
//
}

/**
* 定义前置通知
*/
@Before("pointcut()")
public void before(JoinPoint point) {
HttpServletRequest request = ServletRequestAttributesUtils.getHttpServletRequest();
SysOperateLog operateLog = new SysOperateLog();
//组装操作日志
if (CurrentUserUtils.isLogin()) {
operateLog.setUserId(CurrentUserUtils.getCurrentUserId());
}
OperateLog annotation = getOperateLog(point);
operateLog.setModuleName(annotation.module());
operateLog.setFunctionName(annotation.function());
operateLog.setReqUrl(request.getRequestURI());
operateLog.setIp(request.getRemoteAddr());
operateLog.setReqBody(getReqBody(point));
operateLog.setCreateTime(new Date());
     //保存操作日志
sysOperateLogService.add(operateLog);
//将该条日志的id放入request域,为后续使用做准备
request.setAttribute(OPERATE_LOG_ID, operateLog.getId());
}

/**
* 后置返回通知
*
* @param result
*/
@AfterReturning(pointcut = "pointcut()", returning = "result")
public void afterReturning(Object result) {
HttpServletRequest request = ServletRequestAttributesUtils.getHttpServletRequest();
Long operateLogId = (Long) request.getAttribute(OPERATE_LOG_ID);
if (operateLogId == null) {
log.error("operateLogId为空");
return;
}
String respBody = null;
if (result != null) {
try {
respBody = ObjectMapperUtils.writeValueAsString(result);
} catch (JsonParseException e) {
log.error(e.getMessage(), e);
}
}
SysOperateLog operateLog = new SysOperateLog();
operateLog.setId(operateLogId);
operateLog.setRespBody(respBody);
operateLog.setUpdateTime(new Date());

if (CurrentUserUtils.isLogin()) {
operateLog.setUserId(CurrentUserUtils.getCurrentUserId());
}
//后置通知:更新日志
sysOperateLogService.update(operateLog);
}

private OperateLog getOperateLog(JoinPoint point) {
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
return method.getAnnotation(OperateLog.class);
}
/**
* 获取请求body参数 请求参数获取后,会变成空null,进行封装请求参数,保证后续使用能够获取到。
*
* @param point
* @return
*/
private String getReqBody(JoinPoint point) {
String reqBody = null;
try {
Map<String, Object> params = WebUtils.getParams();
if (CollectionUtils.isEmpty(params)) {
return null;
}
Class<? extends OperateLogHandler> clazz = getOperateLog(point).handler();
if (clazz != null && !clazz.isAssignableFrom(OperateLogHandler.class)) {
reqBody = clazz.newInstance().handler(params);
} else {
reqBody = ObjectMapperUtils.writeValueAsString(params);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return reqBody;
}
}

3:日志类

/**
* 系统操作日志表
* @date 2019-08-27
*/
@Data
@Entity
@Table(name = "dc_sys_operate_log")
public class SysOperateLog {

@Id
@GeneratedValue(generator = "JDBC")
private Long id;

/**
* 组织id
*/
private Long userId;

/**
* 模块名称
*/
private String moduleName;

/**
* 功能名称
*/
private String functionName;

/**
* 请求url
*/
private String reqUrl;

/**
* 登录名
*/
private String ip;

/**
* 请求body(包含url参数)
*/
private String reqBody;

/**
* 响应body
*/
private String respBody;

/**
* 密码
*/
private String detail;

/**
* 创建时间
*/
private Date createTime;

/**
* 更新时间
*/
private Date updateTime;

}

4:调用AOP

/**
* 系统用户控制器(成员管理)
*/
@Slf4j
@RestController
@RequestMapping(value = "/user", produces = APPLICATION_JSON_UTF8_VALUE)
public class SysUserController {

@Autowired
private SysUserService sysUserService;

/**
* 系统用户列表
*
* @param dto
* @return
*/
@OperateLog(module = "用户管理", function = "用户列表")
@RequiresPermissions(USER_LIST)
@PostMapping(value = "/list")
public DabResponse list(@Valid @RequestBody QuerySysUserListReqDTO dto) {

return success(sysUserService.getQuerySysUserListRespDTO(dto));
}

/**
* 修改用户信息
*
* @param dto
* @return
*/
@OperateLog(module = "用户管理", function = "修改用户信息")
@RequiresPermissions(USER_LIST)
@PostMapping(value = "/update")
public DabResponse update(@Valid @RequestBody SysUserUpdateDTO dto) {
sysUserService.update(dto);
return success();
}

/**
* 修改用户状态
*
* @param dto
* @return
*/
@OperateLog(module = "用户管理", function = "修改用户状态")
@RequiresPermissions(USER_LIST)
@PostMapping(value = "/update/status")
public DabResponse updateStatus(@Valid @RequestBody SysUserUpdateStatusDTO dto) {
sysUserService.updateStatus(dto);
return success();
}

}

猜你喜欢

转载自www.cnblogs.com/shsgshn/p/11528027.html