|
|
@@ -4,6 +4,7 @@ package cc.mrbird.febs.server.system.service.impl;
|
|
|
import cc.mrbird.febs.common.entity.FebsConstant;
|
|
|
import cc.mrbird.febs.common.entity.QueryRequest;
|
|
|
import cc.mrbird.febs.common.entity.system.Log;
|
|
|
+import cc.mrbird.febs.common.utils.IPUtil;
|
|
|
import cc.mrbird.febs.common.utils.SortUtil;
|
|
|
import cc.mrbird.febs.server.system.mapper.LogMapper;
|
|
|
import cc.mrbird.febs.server.system.service.ILogService;
|
|
|
@@ -12,18 +13,19 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
-import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.aspectj.lang.ProceedingJoinPoint;
|
|
|
-import org.aspectj.lang.reflect.MethodSignature;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
|
|
|
+import org.springframework.security.core.Authentication;
|
|
|
+import org.springframework.security.core.context.SecurityContextHolder;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Propagation;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
import java.io.Serializable;
|
|
|
import java.lang.reflect.Method;
|
|
|
import java.util.*;
|
|
|
@@ -48,13 +50,15 @@ public class LogServiceImpl extends ServiceImpl<LogMapper, Log> implements ILogS
|
|
|
if (StringUtils.isNotBlank(log.getOperation())) {
|
|
|
queryWrapper.lambda().like(Log::getOperation, log.getOperation());
|
|
|
}
|
|
|
+ if (StringUtils.isNotBlank(log.getLocation())) {
|
|
|
+ queryWrapper.lambda().like(Log::getLocation, log.getLocation());
|
|
|
+ }
|
|
|
if (StringUtils.isNotBlank(log.getCreateTimeFrom()) && StringUtils.isNotBlank(log.getCreateTimeTo())) {
|
|
|
queryWrapper.lambda()
|
|
|
.ge(Log::getCreateTime, log.getCreateTimeFrom())
|
|
|
.le(Log::getCreateTime, log.getCreateTimeTo());
|
|
|
}
|
|
|
|
|
|
-
|
|
|
Page<Log> page = new Page<>(request.getPageNum(), request.getPageSize());
|
|
|
SortUtil.handlePageSort(request, page, "createTime", FebsConstant.ORDER_DESC, true);
|
|
|
|
|
|
@@ -69,19 +73,24 @@ public class LogServiceImpl extends ServiceImpl<LogMapper, Log> implements ILogS
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void saveLog(ProceedingJoinPoint point, Log log) throws JsonProcessingException {
|
|
|
- MethodSignature signature = (MethodSignature) point.getSignature();
|
|
|
- Method method = signature.getMethod();
|
|
|
- cc.mrbird.febs.common.annotation.Log logAnnotation = method.getAnnotation(cc.mrbird.febs.common.annotation.Log.class);
|
|
|
- if (logAnnotation != null) {
|
|
|
- // 注解上的描述
|
|
|
- log.setOperation(logAnnotation.value());
|
|
|
- }
|
|
|
+ public void saveLog(ProceedingJoinPoint point, Method method, HttpServletRequest request, String operation, long start) {
|
|
|
+ Log Log = new Log();
|
|
|
+ // 设置 IP地址
|
|
|
+ String ip = IPUtil.getIpAddr(request);
|
|
|
+ Log.setIp(ip);
|
|
|
+ // 设置操作用户
|
|
|
+ Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
|
|
+ String username = (String) authentication.getPrincipal();
|
|
|
+ Log.setUsername(username);
|
|
|
+ // 设置耗时
|
|
|
+ Log.setTime(System.currentTimeMillis() - start);
|
|
|
+ // 设置操作描述
|
|
|
+ Log.setOperation(operation);
|
|
|
// 请求的类名
|
|
|
String className = point.getTarget().getClass().getName();
|
|
|
// 请求的方法名
|
|
|
- String methodName = signature.getName();
|
|
|
- log.setMethod(className + "." + methodName + "()");
|
|
|
+ String methodName = method.getName();
|
|
|
+ Log.setMethod(className + "." + methodName + "()");
|
|
|
// 请求的方法参数值
|
|
|
Object[] args = point.getArgs();
|
|
|
// 请求的方法参数名称
|
|
|
@@ -90,42 +99,46 @@ public class LogServiceImpl extends ServiceImpl<LogMapper, Log> implements ILogS
|
|
|
if (args != null && paramNames != null) {
|
|
|
StringBuilder params = new StringBuilder();
|
|
|
params = handleParams(params, args, Arrays.asList(paramNames));
|
|
|
- log.setParams(params.toString());
|
|
|
+ Log.setParams(params.toString());
|
|
|
}
|
|
|
- log.setCreateTime(new Date());
|
|
|
- log.setLocation(AddressUtil.getCityInfo(log.getIp()));
|
|
|
+ Log.setCreateTime(new Date());
|
|
|
+ Log.setLocation(AddressUtil.getCityInfo(ip));
|
|
|
// 保存系统日志
|
|
|
- save(log);
|
|
|
+ save(Log);
|
|
|
}
|
|
|
|
|
|
- private StringBuilder handleParams(StringBuilder params, Object[] args, List paramNames) throws JsonProcessingException {
|
|
|
- for (int i = 0; i < args.length; i++) {
|
|
|
- if (args[i] instanceof Map) {
|
|
|
- Set set = ((Map) args[i]).keySet();
|
|
|
- List<Object> list = new ArrayList<>();
|
|
|
- List<Object> paramList = new ArrayList<>();
|
|
|
- for (Object key : set) {
|
|
|
- list.add(((Map) args[i]).get(key));
|
|
|
- paramList.add(key);
|
|
|
- }
|
|
|
- return handleParams(params, list.toArray(), paramList);
|
|
|
- } else {
|
|
|
- if (args[i] instanceof Serializable) {
|
|
|
- Class<?> aClass = args[i].getClass();
|
|
|
- try {
|
|
|
- aClass.getDeclaredMethod("toString", new Class[]{null});
|
|
|
- // 如果不抛出 NoSuchMethodException 异常则存在 toString 方法 ,安全的 writeValueAsString ,否则 走 Object的 toString方法
|
|
|
- params.append(" ").append(paramNames.get(i)).append(": ").append(objectMapper.writeValueAsString(args[i]));
|
|
|
- } catch (NoSuchMethodException e) {
|
|
|
- params.append(" ").append(paramNames.get(i)).append(": ").append(objectMapper.writeValueAsString(args[i].toString()));
|
|
|
+ private StringBuilder handleParams(StringBuilder params, Object[] args, List paramNames) {
|
|
|
+ try {
|
|
|
+ for (int i = 0; i < args.length; i++) {
|
|
|
+ if (args[i] instanceof Map) {
|
|
|
+ Set set = ((Map) args[i]).keySet();
|
|
|
+ List<Object> list = new ArrayList<>();
|
|
|
+ List<Object> paramList = new ArrayList<>();
|
|
|
+ for (Object key : set) {
|
|
|
+ list.add(((Map) args[i]).get(key));
|
|
|
+ paramList.add(key);
|
|
|
}
|
|
|
- } else if (args[i] instanceof MultipartFile) {
|
|
|
- MultipartFile file = (MultipartFile) args[i];
|
|
|
- params.append(" ").append(paramNames.get(i)).append(": ").append(file.getName());
|
|
|
+ return handleParams(params, list.toArray(), paramList);
|
|
|
} else {
|
|
|
- params.append(" ").append(paramNames.get(i)).append(": ").append(args[i]);
|
|
|
+ if (args[i] instanceof Serializable) {
|
|
|
+ Class<?> aClass = args[i].getClass();
|
|
|
+ try {
|
|
|
+ aClass.getDeclaredMethod("toString", new Class[]{null});
|
|
|
+ // 如果不抛出 NoSuchMethodException 异常则存在 toString 方法 ,安全的 writeValueAsString ,否则 走 Object的 toString方法
|
|
|
+ params.append(" ").append(paramNames.get(i)).append(": ").append(objectMapper.writeValueAsString(args[i]));
|
|
|
+ } catch (NoSuchMethodException e) {
|
|
|
+ params.append(" ").append(paramNames.get(i)).append(": ").append(objectMapper.writeValueAsString(args[i].toString()));
|
|
|
+ }
|
|
|
+ } else if (args[i] instanceof MultipartFile) {
|
|
|
+ MultipartFile file = (MultipartFile) args[i];
|
|
|
+ params.append(" ").append(paramNames.get(i)).append(": ").append(file.getName());
|
|
|
+ } else {
|
|
|
+ params.append(" ").append(paramNames.get(i)).append(": ").append(args[i]);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ } catch (Exception ignore) {
|
|
|
+ params.append("参数解析失败");
|
|
|
}
|
|
|
return params;
|
|
|
}
|