package com.stonedt.intelligence.aspect;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.stonedt.intelligence.entity.User;
import com.stonedt.intelligence.service.UserLogService;
import com.stonedt.intelligence.util.*;
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.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.stereotype.Component;
import org.aspectj.lang.reflect.MethodSignature;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
* description: 用户操作日志
* date: 2020/5/9 12:31
* author: huajiancheng
* version: 1.0
*/
@Aspect
@Component
public class UserLogAspect {
@Autowired
UserLogService userLogService;
@Autowired
UserUtil userUtil;
@Value("${kafuka.url}")
private String kafuka_url;
// 切点
@Pointcut("@annotation(com.stonedt.intelligence.aspect.SystemControllerLog)")
public void controllerAspect() {
}
@Around("controllerAspect()")
public Object around(ProceedingJoinPoint point) {
Object result = null;
long times = System.currentTimeMillis();
try {
// 执行方法
result = point.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
long timee = System.currentTimeMillis();
// 保存日志
saveLog(point, times, timee);
return result;
}
/**
* @param joinPoint JoinPoint 对象
* @param times 开始时间
* @param timee 结束时间
* @return void
* @description: 保存用户的操作日志
* @version: 1.0
* @date: 2020/5/9 17:41
* @author: huajiancheng
*/
private void saveLog(ProceedingJoinPoint joinPoint, long timestamps, long timestampe) {
JSONObject responseJson = new JSONObject();
try {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
SystemControllerLog logAnnotation = method.getAnnotation(SystemControllerLog.class);
String submodule = "";
String operation = "";
if (logAnnotation != null) {
// 注解上的描述
submodule = logAnnotation.submodule();
operation = logAnnotation.operation();
}
// 请求的方法名
String class_name = joinPoint.getTarget().getClass().getName();
String method_name = signature.getName();
// 请求的方法参数值
Object[] args = joinPoint.getArgs();
// 请求的方法参数名称
LocalVariableTableParameterNameDiscoverer tableParameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
String[] paramNames = tableParameterNameDiscoverer.getParameterNames(method);
JSONArray paramsArray = new JSONArray(); // 参数
if (args != null && paramNames != null) {
for (int i = 0; i < args.length; i++) {
JSONObject paramsJson = new JSONObject();
String paramKey = paramNames[i];
if (!paramKey.equals("mv") && !paramKey.equals("request") && !paramKey.equals("session")) {
String paramValue = String.valueOf(args[i]);
if (!paramValue.equals("null")) {
paramsJson.put(paramKey, paramValue);
paramsArray.add(paramsJson);
}
}
}
}
// 获取request
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
User user = userUtil.getuser(request);
Long user_id = user.getUser_id();
String organization_id = user.getOrganization_id();
Integer status = user.getStatus();
String username = user.getUsername();
String create_time = DateUtil.getNowTime();
Map organizeMap = new HashMap();
organizeMap.put("organization_id", organization_id);
Map organizeResponseMap = userLogService.getUserOrganizationById(organizeMap);
String organization_name = String.valueOf(organizeResponseMap.get("organization_name"));
String term_of_validity = String.valueOf(organizeResponseMap.get("term_of_validity"));
term_of_validity = term_of_validity.substring(0,19);
String article_public_id = MD5Util.getMD5(user_id + create_time + method_name + method_name + paramsArray.toJSONString());
String times = DateUtil.stampToDate(String.valueOf(timestamps));
String timee = DateUtil.stampToDate(String.valueOf(timestampe));
// Map moudleMap = userLogService.getMoudleByName(module_name);
Map moudleMap = userLogService.getSubMoudleByName(submodule);
String module_name = String.valueOf(moudleMap.get("module_name"));
String submodule_name = String.valueOf(moudleMap.get("submodule_name"));
String submodule_id = String.valueOf(moudleMap.get("submodule_id"));
String module_id = String.valueOf(moudleMap.get("module_id"));
responseJson.put("user_id", user_id);
responseJson.put("article_public_id", article_public_id);
responseJson.put("organization_id", organization_id);
responseJson.put("create_time", create_time);
responseJson.put("username", username);
responseJson.put("status", status);
responseJson.put("parameters", paramsArray.toJSONString());
responseJson.put("organization_name", organization_name);
responseJson.put("class_name", class_name);
responseJson.put("method_name", method_name);
responseJson.put("times", times);
responseJson.put("timee", timee);
responseJson.put("module_id", module_id);
responseJson.put("module_name", module_name);
responseJson.put("operation", operation);
responseJson.put("submodule_id", submodule_id);
responseJson.put("submodule_name", submodule_name);
responseJson.put("term_of_validity", term_of_validity);
responseJson.put("es_index", "stonedt_portaluserlog");
responseJson.put("es_type", "infor");
responseJson.put("hbase_table", "stonedt_portaluserlog");
String result = MyHttpRequestUtil.doPostKafka("proStonedtData", responseJson.toJSONString(), kafuka_url);
if (result.equals("200")) {
System.out.println("发送成功!");
}
// SysLog sysLog = JSON.toJavaObject(responseJson, SysLog.class);
// 保存系统日志
// userLogService.saveUserLog(sysLog);
} catch (Exception e) {
e.getMessage();
}
}
}