一 定义接口
package com.aidun.annotations;
import java.lang.annotation.*;
/**
* 操作日志注解
* @date 2019-03-11 14:24
* @since 1.0.0
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface OperateLog {
/**
* 操作信息,例如:“新增用户”
*/
String operateMsg() default "";
/**
* 日志类型,例如:“新增”
*/
String logType() default "";
/**
* 请求类型
*/
String requestMethod() default "post";
}
二 操作日志实体类
package com.aidun.bean;
import com.aidun.util.mybatis.MyBatisDomain;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* 操作日志实体
* @date 2019-03-11 12:01
* @since 1.0.0
*/
public class OperateLog extends MyBatisDomain implements Serializable {
private String operateUserId;
private String operateUserName;
private String operateMsg;
private String operateIp;
private String operateUrl;
private String logType;
private String requestMethod;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
private Date beginDate;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
private Date endDate;
public OperateLog() {
}
public String getOperateUserId() {
return operateUserId;
}
public void setOperateUserId(String operateUserId) {
this.operateUserId = operateUserId;
}
public String getOperateUserName() {
return operateUserName;
}
public void setOperateUserName(String operateUserName) {
this.operateUserName = operateUserName;
}
public String getOperateMsg() {
return operateMsg;
}
public void setOperateMsg(String operateMsg) {
this.operateMsg = operateMsg;
}
public String getOperateIp() {
return operateIp;
}
public void setOperateIp(String operateIp) {
this.operateIp = operateIp;
}
public String getOperateUrl() {
return operateUrl;
}
public void setOperateUrl(String operateUrl) {
this.operateUrl = operateUrl;
}
public String getLogType() {
return logType;
}
public void setLogType(String logType) {
this.logType = logType;
}
public String getRequestMethod() {
return requestMethod;
}
public void setRequestMethod(String requestMethod) {
this.requestMethod = requestMethod;
}
public Date getBeginDate() {
return beginDate;
}
public void setBeginDate(Date beginDate) {
this.beginDate = beginDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
}
三 面向切面
package com.aidun.aop;
import com.aidun.annotations.OperateLog;
import com.aidun.bean.User;
import com.aidun.service.OperateLogService;
import com.aidun.service.UserService;
import com.aidun.service.impl.OperateLogServiceImpl;
import com.aidun.util.IpUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
/**
* 操作日志切面
*
* @author 郭一行
* @date 2019-03-11 14:33
* @since 1.0.0
*/
@Aspect
@Component()
public class OperateLogAspect {
@Autowired
private HttpServletRequest request;
@Autowired
private UserService userService;
@Autowired
private OperateLogService operateLogService;
private final String accessTokenKey = "accessToken";
/**
* 注解织入点
*
* @author 郭一行
* @date 2019/3/11 14:47
* @since 1.0.0
*/
@Pointcut("@annotation(com.aidun.annotations.OperateLog)")
public void logPointCut() {
}
/**
* 前置通知 用于拦截操作,在方法返回后执行
*
* @param joinPoint 切点
*/
@Before("logPointCut()")
public void doBefore(JoinPoint joinPoint) {
String name = ((MethodSignature) joinPoint.getSignature()).getMethod().getName();
OperateLog operateLog = ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(OperateLog.class);
com.aidun.bean.OperateLog operateLogBean = new com.aidun.bean.OperateLog();
operateLogBean.setOperateMsg(operateLog.operateMsg());
operateLogBean.setLogType(operateLog.logType());
operateLogBean.setRequestMethod(operateLog.requestMethod());
//获取url
String url = request.getScheme() + "://" + request.getServerName() + "/" + request.getContextPath() + "/";
//获取用户ip
String ipAddr = IpUtil.getIpAddr(request);
//获取登录用户
String accessToken = request.getHeader(accessTokenKey);
User user = userService.get(accessToken);
operateLogBean.setOperateUserId(user.getId());
operateLogBean.setOperateUserName(user.getName());
operateLogBean.setOperateIp(ipAddr);
operateLogBean.setOperateUrl(url);
operateLogBean.setCreateDate(new Date());
operateLogBean.setCreateBy(user.getId());
operateLogBean.setDeleted(0);
operateLogService.save(operateLogBean);
}
}
四 调用
/**
* 用户 保存
*/
@RequestMapping(value = "/create", method = POST)
@com.aidun.annotations.OperateLog(operateMsg = "新增用户" ,logType = "新增" ,requestMethod = "post")
public JSONObject create(User entity) {
userService.save(entity);
return ApiCode.SUCCESS.getValue();
}