package com.terra.system.aspect; import com.terra.system.annotation.SysLog; import com.terra.system.entity.sys.OperateEntity; import com.terra.system.entity.sys.UserEntity; import com.terra.system.helper.WebHelper; import com.terra.system.service.sys.OperateService; import com.terra.system.service.sys.TokenService; import io.swagger.v3.oas.annotations.tags.Tag; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import javax.annotation.Resource; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; /** * 日志切面类 * @author WWW */ @Aspect @Component public class LogAspect { @Resource private TokenService tokenService; @Resource private OperateService operateService; private final static String SELECT = "select"; private final static String INSERT = "insert"; private final static String UPDATE = "update"; private final static String DELETE = "delete"; private final static String UPLOAD = "upload"; private final static String DOWNLOAD = "download"; private final static String COUNT = "count"; private final static String SPLIT = "\\\\"; private static final Log log = LogFactory.getLog(LogAspect.class); @Pointcut("@annotation(com.terra.system.annotation.SysLog)") public void logPointCut() { // } /** * 环绕通知 @Around,也可以使用 @Before (前置通知) 或 @After (后置通知) */ @Around("logPointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { long beginTime = System.currentTimeMillis(); // 执行方法 Object result = point.proceed(); // 执行时长(毫秒) long time = System.currentTimeMillis() - beginTime; // 保存日志 saveLog(point, time); return result; } /** * 保存日志 */ private void saveLog(ProceedingJoinPoint joinPoint, long time) { try { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Class clazz = joinPoint.getTarget().getClass(); Method method = signature.getMethod(); HttpServletRequest req = WebHelper.getRequest(); String url = req.getServletPath(); OperateEntity oe = new OperateEntity(); oe.setIp(WebHelper.getIpAddress(req)); oe.setUrl(url); oe.setExec(time); // 设置模块 Tag tag = clazz.getAnnotation(Tag.class); if (tag != null) { String[] strs = tag.name().split(SPLIT); oe.setModular1(strs[0]); oe.setModular2(strs[1]); } // 设置类名\方法名、类别 oe.setClazz(clazz.getName() + "." + method.getName()); oe.setType(getType(method.getName())); // 设置备注 SysLog sysLog = method.getAnnotation(SysLog.class); if (sysLog != null) { oe.setBak(sysLog.value()); } UserEntity ue = tokenService.getCurrentUser(req); if (ue != null) { oe.setUserid(ue.getId()); } operateService.insertOperate(oe); } catch (Exception ex) { log.error(ex.getMessage(), ex); } } /** * 获取操作类型 */ private static int getType(String methodName) { if (methodName.contains(SELECT)) { return 1; } if (methodName.contains(INSERT)) { return 2; } if (methodName.contains(UPDATE)) { return 3; } if (methodName.contains(DELETE)) { return 4; } if (methodName.contains(UPLOAD)) { return 5; } if (methodName.contains(DOWNLOAD)) { return 6; } // methodName.indexOf(COUNT) > -1 if (methodName.contains(COUNT)) { return 7; } return 0; } }