/** 
 | 
 * Copyright (c) 2018 人人开源 All rights reserved. 
 | 
 * 
 | 
 * https://www.renren.io 
 | 
 * 
 | 
 * 版权所有,侵权必究! 
 | 
 */ 
 | 
  
 | 
package com.zt.core.aspect; 
 | 
  
 | 
import com.alibaba.fastjson.JSON; 
 | 
import com.zt.common.annotation.LogOperation; 
 | 
import com.zt.common.utils.HttpContextUtils; 
 | 
import com.zt.common.utils.IpUtils; 
 | 
import com.zt.core.context.User; 
 | 
import com.zt.core.context.UserContext; 
 | 
import com.zt.modules.log.enums.OperationStatusEnum; 
 | 
import com.zt.modules.log.model.SysLogOperation; 
 | 
import com.zt.modules.log.service.SysLogOperationService; 
 | 
import org.aspectj.lang.JoinPoint; 
 | 
import org.aspectj.lang.ProceedingJoinPoint; 
 | 
import org.aspectj.lang.annotation.Around; 
 | 
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.http.HttpHeaders; 
 | 
import org.springframework.stereotype.Component; 
 | 
  
 | 
import javax.servlet.http.HttpServletRequest; 
 | 
import java.lang.reflect.Method; 
 | 
  
 | 
/** 
 | 
 * 操作日志,切面处理类 
 | 
 * 
 | 
 * @author Mark sunlightcs@gmail.com 
 | 
 */ 
 | 
@Aspect 
 | 
@Component("log") 
 | 
public class LogOperationAspect { 
 | 
    @Autowired 
 | 
    private SysLogOperationService sysLogOperationService; 
 | 
  
 | 
    @Pointcut("@annotation(com.zt.common.annotation.LogOperation)") 
 | 
    public void logPointCut() { 
 | 
  
 | 
    } 
 | 
  
 | 
    @Before("logPointCut()") 
 | 
    public Object before(JoinPoint point) throws Throwable { 
 | 
        long beginTime = System.currentTimeMillis(); 
 | 
        try { 
 | 
            //执行方法 
 | 
            Object result = true; //point.proceed(); 
 | 
            //执行时长(毫秒) 
 | 
            long time = System.currentTimeMillis() - beginTime; 
 | 
            //保存日志 
 | 
            saveLog(point, time, OperationStatusEnum.SUCCESS.value()); 
 | 
            return result; 
 | 
        }catch(Exception e) { 
 | 
            //执行时长(毫秒) 
 | 
            long time = System.currentTimeMillis() - beginTime; 
 | 
            //保存日志 
 | 
            saveLog(point, time, OperationStatusEnum.FAIL.value()); 
 | 
            throw e; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Around("logPointCut()") 
 | 
    public Object around(ProceedingJoinPoint point) throws Throwable { 
 | 
        long beginTime = System.currentTimeMillis(); 
 | 
        try { 
 | 
            //执行方法 
 | 
            Object result = point.proceed(); 
 | 
            //执行时长(毫秒) 
 | 
            long time = System.currentTimeMillis() - beginTime; 
 | 
            //保存日志 
 | 
            saveLog(point, time, OperationStatusEnum.SUCCESS.value()); 
 | 
            return result; 
 | 
        }catch(Exception e) { 
 | 
            //执行时长(毫秒) 
 | 
            long time = System.currentTimeMillis() - beginTime; 
 | 
            //保存日志 
 | 
            saveLog(point, time, OperationStatusEnum.FAIL.value()); 
 | 
            throw e; 
 | 
        } 
 | 
    } 
 | 
    private void saveLog(JoinPoint joinPoint, long time, Integer status) throws Exception { 
 | 
        MethodSignature signature = (MethodSignature) joinPoint.getSignature(); 
 | 
        Method method = joinPoint.getTarget().getClass().getDeclaredMethod(signature.getName(), signature.getParameterTypes()); 
 | 
        LogOperation annotation = method.getAnnotation(LogOperation.class); 
 | 
  
 | 
        SysLogOperation log = new SysLogOperation(); 
 | 
        if(annotation != null){ 
 | 
            //注解上的描述 
 | 
            log.setOperation(annotation.value()); 
 | 
        } 
 | 
  
 | 
        //登录用户信息 
 | 
        User user = UserContext.getUser(); 
 | 
        if(user != null){ 
 | 
            log.setCreatorName(user.getUsername()); 
 | 
        } 
 | 
  
 | 
        log.setStatus(status); 
 | 
        log.setRequestTime((int)time); 
 | 
  
 | 
        //请求相关信息 
 | 
        HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); 
 | 
        log.setIp(IpUtils.getIpAddr(request)); 
 | 
        log.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT)); 
 | 
        log.setRequestUri(request.getRequestURI()); 
 | 
        log.setRequestMethod(request.getMethod()); 
 | 
  
 | 
        //请求参数 
 | 
        Object[] args = joinPoint.getArgs(); 
 | 
        try{ 
 | 
            String params = JSON.toJSONString(args[0]); 
 | 
            log.setRequestParams(params); 
 | 
        }catch (Exception e){ 
 | 
  
 | 
        } 
 | 
//        log.setIsDelete(0); 
 | 
  
 | 
        //保存到DB 
 | 
        sysLogOperationService.insert(log); 
 | 
    } 
 | 
} 
 |