package cc.mrbird.febs.server.system.aspect; import cc.mrbird.febs.common.core.exception.FebsException; import cc.mrbird.febs.common.core.utils.FebsUtil; import cc.mrbird.febs.server.system.annotation.ControllerEndpoint; import cc.mrbird.febs.server.system.service.ILogService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; 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.springframework.stereotype.Component; import java.lang.reflect.Method; /** * @author MrBird */ @Aspect @Slf4j @Component @RequiredArgsConstructor public class ControllerEndpointAspect extends BaseAspectSupport { private final ILogService logService; @Pointcut("execution(* cc.mrbird.febs.server.system.controller.*.*(..)) && @annotation(cc.mrbird.febs.server.system.annotation.ControllerEndpoint)") public void pointcut() { } @Around("pointcut()") public Object around(ProceedingJoinPoint point) throws FebsException { Object result; Method targetMethod = resolveMethod(point); ControllerEndpoint annotation = targetMethod.getAnnotation(ControllerEndpoint.class); String operation = annotation.operation(); long start = System.currentTimeMillis(); try { result = point.proceed(); if (StringUtils.isNotBlank(operation)) { String username = FebsUtil.getCurrentUsername(); String ip = FebsUtil.getHttpServletRequestIpAddress(); logService.saveLog(point, targetMethod, ip, operation, username, start); } return result; } catch (Throwable throwable) { log.error(throwable.getMessage(), throwable); String exceptionMessage = annotation.exceptionMessage(); String message = throwable.getMessage(); String error = FebsUtil.containChinese(message) ? exceptionMessage + "," + message : exceptionMessage; throw new FebsException(error); } } }