package cn.wisenergy.chnmuseum.party.common.log; import cn.wisenergy.chnmuseum.party.auth.util.JwtTokenUtil; import cn.wisenergy.chnmuseum.party.common.enums.RESPONSE_CODE_ENUM; import cn.wisenergy.chnmuseum.party.common.enums.RESULT_INFO_ENUM; import cn.wisenergy.chnmuseum.party.common.util.DateUtil80; import cn.wisenergy.chnmuseum.party.core.annotations.OperationLog; import cn.wisenergy.chnmuseum.party.mapper.SysLogMapper; import cn.wisenergy.chnmuseum.party.model.SysLog; import cn.wisenergy.chnmuseum.party.model.TOperationLog; import cn.wisenergy.chnmuseum.party.model.TUser; import cn.wisenergy.chnmuseum.party.service.TOperationLogService; import cn.wisenergy.chnmuseum.party.service.impl.TUserServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import javassist.util.HotSwapper; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.AfterThrowing; 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.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.net.InetAddress; import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; import java.util.Map; @Service @Aspect @Transactional class SystemOperationLogService extends ServiceImpl<SysLogMapper, SysLog> { @Resource private SysLogMapper sysLogMapper; @Autowired private TUserServiceImpl userService; @Autowired private TOperationLogService operationLogService; public SystemOperationLogService() { System.out.println("Aop"); } public TUser getCurAdmin(HttpServletRequest request) { String header = request.getHeader("Authorization"); if (StringUtils.isBlank(header)) { return null; } String username = JwtTokenUtil.getUsername(header); TUser user = userService.selectByUsername(username); return user; } /** * 切点 */ @Pointcut("@annotation(cn.wisenergy.chnmuseum.party.common.log.MethodLog)") public void methodCachePointcut() { } /** * 切面 * * @param point * @return * @throws Throwable */ @Around("methodCachePointcut()") public Object around(ProceedingJoinPoint point) throws Throwable { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder .getRequestAttributes()).getRequest(); MethodLog methodLog = getAnnotationLog(point); String ip = getIp(request); TUser user = getCurAdmin(request); // if (user==null){ // HashMap<String, Object> resultMap = new HashMap<>(); // resultMap.put("resultCode", "500"); // resultMap.put("message", "用户未登录!"); // return resultMap; // } String methodName = user.getUserName() + "登录本系统"; if (user.getOrgName() != null) { methodName += ",机构" + user.getOrgName(); } String packages = point.getThis().getClass().getName(); if (packages.indexOf("$$EnhancerByCGLIB$$") > -1) { // 如果是CGLIB动态生成的类 try { packages = packages.substring(0, packages.indexOf("$$")); } catch (Exception ex) { return getFailResult(); } } String operatingcontent = ""; Object[] method_param = null; Object object = null; try { method_param = point.getArgs(); //获取方法参数 // String param=(String) point.proceed(point.getArgs()); object = point.proceed(); } catch (Exception e) { // 异常处理记录日志..log.error(e); return getFailResult(); } if (methodLog.operModule().getMsg().contains("运维")) { TOperationLog operationLog = new TOperationLog(); operationLog.setCreateTime(LocalDateTime.now()); operationLog.setUserId(user.getId()); operationLog.setOperationType(methodLog.operType().getMsg()); operationLogService.save(operationLog); return object; } SysLog sysLog = new SysLog(); if ("1".equals(user.getId())) { sysLog.setType(1); } else { sysLog.setType(2); } sysLog.setOperator(user.getUserName()); sysLog.setOperationIp(ip); sysLog.setOperationContent(methodName); sysLog.setOperationTime(DateUtil80.getDateTimeOfTimestamp(System.currentTimeMillis())); // 处理设置注解上的参数 getControllerMethodDescription(methodLog, sysLog); int insert = sysLogMapper.insert(sysLog); return object; } /** * 获取注解中对方法的描述信息 用于Controller层注解 * * @param log 日志 * @param * @throws Exception */ public void getControllerMethodDescription(MethodLog log, SysLog sysLog) throws Exception { // 设置action动作 sysLog.setOperationType(log.operType().getMsg()); // 设置标题 sysLog.setOperationObject(log.operModule().getMsg()); } /** * 是否存在注解,如果存在就获取 */ private MethodLog getAnnotationLog(JoinPoint joinPoint) throws Exception { Signature signature = joinPoint.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; Method method = methodSignature.getMethod(); if (method != null) { return method.getAnnotation(MethodLog.class); } return null; } protected Map<String, Object> getFailResult() { Map<String, Object> map = new HashMap<>(); map.put(RESULT_INFO_ENUM.RESULT_CODE.getKey(), RESPONSE_CODE_ENUM.SERVER_ERROR.getResultCode()); map.put(RESULT_INFO_ENUM.RESULT_MSG.getKey(), RESPONSE_CODE_ENUM.SERVER_ERROR.getMessage()); return map; } /** * 方法异常时调用 * * @param */ @AfterThrowing("methodCachePointcut()") public void afterThrowing(JoinPoint point) throws Throwable { } /** * 获取请求ip * * @param request * @return */ public static String getIp(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) { //根据网卡取本机配置的IP InetAddress inet = null; try { inet = InetAddress.getLocalHost(); } catch (Exception e) { e.printStackTrace(); } ip = inet.getHostAddress(); } } return ip; } }