package com.dsh.guns.core.aop; import com.dsh.guns.config.UserExt; import com.dsh.guns.core.common.annotion.BussinessLog; import com.dsh.guns.core.common.constant.dictmap.base.AbstractDictMap; import com.dsh.guns.core.log.LogManager; import com.dsh.guns.core.log.LogObjectHolder; import com.dsh.guns.core.log.factory.LogTaskFactory; import com.dsh.guns.core.support.HttpKit; import com.dsh.guns.core.util.Contrast; import com.dsh.guns.modular.system.model.User; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; 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 org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.lang.reflect.Method; import java.util.Map; /** * 日志记录 * * @author fengshuonan * @date 2016年12月6日 下午8:48:30 */ @Aspect @Component public class LogAop { private Logger log = LoggerFactory.getLogger(this.getClass()); @Pointcut(value = "@annotation(com.dsh.guns.core.common.annotion.BussinessLog)") public void cutService() { } @Around("cutService()") public Object recordSysLog(ProceedingJoinPoint point) throws Throwable { //先执行业务 Object result = point.proceed(); try { handle(point); } catch (Exception e) { log.error("日志记录出错!", e); } return result; } private void handle(ProceedingJoinPoint point) throws Exception { //获取拦截的方法名 Signature sig = point.getSignature(); MethodSignature msig = null; if (!(sig instanceof MethodSignature)) { throw new IllegalArgumentException("该注解只能用于方法"); } msig = (MethodSignature) sig; Object target = point.getTarget(); Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes()); String methodName = currentMethod.getName(); //如果当前用户未登录,不做日志 User user = UserExt.getUser(); if (null == user) { return; } //获取拦截方法的参数 String className = point.getTarget().getClass().getName(); Object[] params = point.getArgs(); //获取操作名称 BussinessLog annotation = currentMethod.getAnnotation(BussinessLog.class); String bussinessName = annotation.value(); String key = annotation.key(); Class dictClass = annotation.dict(); StringBuilder sb = new StringBuilder(); for (Object param : params) { sb.append(param); sb.append(" & "); } //如果涉及到修改,比对变化 String msg; if (bussinessName.indexOf("修改") != -1 || bussinessName.indexOf("编辑") != -1) { Object obj1 = LogObjectHolder.me().get(); Map obj2 = HttpKit.getRequestParameters(); msg = Contrast.contrastObj(dictClass, key, obj1, obj2); } else { Map parameters = HttpKit.getRequestParameters(); AbstractDictMap dictMap = (AbstractDictMap) dictClass.newInstance(); msg = Contrast.parseMutiKey(dictMap,key,parameters); } // LogManager.me().executeLog(LogTaskFactory.bussinessLog(1, bussinessName, className, methodName, msg)); } }