package com.fxkj.manager.aspect; import com.fxkj.common.dto.OperParamDTO; import com.fxkj.common.dto.SystemUserDTO; import com.fxkj.common.mapper.SysOperRecordMapper; import com.fxkj.common.model.SysOperRecord; import com.fxkj.common.security.TokenUserAutoConfiguration; import com.fxkj.common.util.IDGenerator; import com.fxkj.common.util.IPUtils; import com.fxkj.common.util.JsonUtils; import eu.bitwalker.useragentutils.UserAgent; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.*; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; @Component @Aspect @Slf4j public class RequestLogAspect { @Autowired private SysOperRecordMapper sysOperRecordMapper; @Autowired private TokenUserAutoConfiguration tokenUserAutoConfiguration; //com.fxkj.manager.web下的所有接口 && 不是com.fxkj.manager.web.wx下的接口:完成后插入操作记录 @Pointcut("execution(* com.fxkj.manager.web..*(..)) && !execution(* com.fxkj.manager.web.wx..*(..))") public void requestServer() { } @Before("requestServer()") public void doBefore(JoinPoint joinPoint) { log.info("Class Method : {}.{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName()); } @Around("requestServer()") public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature(); ApiOperation annotation = methodSignature.getMethod().getAnnotation(ApiOperation.class); long start = System.currentTimeMillis(); UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); OperParamDTO requestParams = getRequestParams(proceedingJoinPoint); SystemUserDTO systemUserDTO = tokenUserAutoConfiguration.systemUser(request); if(systemUserDTO !=null){ requestParams.setUserId(systemUserDTO.getUserId()); requestParams.setUserName(systemUserDTO.getUsername()); } String value = annotation ==null ? "":annotation.value(); /*============根据自己业务需求插入操作记录============*/ SysOperRecord sysOperRecord = SysOperRecord.builder() .id(IDGenerator.generateUUID()) .userId(getRequestParams(proceedingJoinPoint).getUserId()) .userName(getRequestParams(proceedingJoinPoint).getUserName()) .operContent(value + ":" + requestParams.getParams() + "") .operType(request.getMethod()) .createTime(LocalDateTime.now()) .build(); sysOperRecordMapper.insert(sysOperRecord); return proceedingJoinPoint.proceed(); } @After("requestServer()") public void doAfter(JoinPoint joinPoint) { log.info("===============================End========================"); } /** * 获取入参 * @param proceedingJoinPoint * @return * */ private OperParamDTO getRequestParams(ProceedingJoinPoint proceedingJoinPoint) { Map<String, Object> requestParams = new HashMap<>(); OperParamDTO operParamDTO = new OperParamDTO(); //参数名 String[] paramNames = ((MethodSignature)proceedingJoinPoint.getSignature()).getParameterNames(); //参数值 Object[] paramValues = proceedingJoinPoint.getArgs(); for (int i = 0; i < paramNames.length; i++) { Object value = paramValues[i]; //如果是文件对象 if (value instanceof MultipartFile) { MultipartFile file = (MultipartFile) value; value = file.getOriginalFilename(); //获取文件名 } if(! (value instanceof SystemUserDTO)){ requestParams.put(paramNames[i], value); } } operParamDTO.setParams(requestParams); return operParamDTO; } }