解决合并冲突

This commit is contained in:
2025-12-10 14:20:24 +08:00
parent e1385cb3e6
commit 18f6a845e6
804 changed files with 61881 additions and 13577 deletions

View File

@@ -0,0 +1,194 @@
package com.openhis.common.aspectj;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
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.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;
import com.alibaba.fastjson2.JSON;
import com.core.common.core.domain.R;
import com.core.common.utils.SecurityUtils;
import com.core.system.domain.SysOperLog;
import lombok.extern.slf4j.Slf4j;
@Aspect
@Component
@Slf4j
public class OperLogAspect {
@Autowired
private JdbcTemplate jdbcTemplate;
// 线程局部变量,用于在方法调用前后传递数据
private final ThreadLocal<SysOperLog> operLogThreadLocal = new ThreadLocal<>();
private final ThreadLocal<Long> startTimeThreadLocal = new ThreadLocal<>();
/**
* 定义切点所有Controller包下的方法排除login接口
*/
@Pointcut("execution(* com.openhis.web..controller..*.*(..)) "
+ "&& !execution(* com.openhis.web..controller..*.login(..)) ")
public void operLogPointCut() {}
/**
* 前置通知:在方法执行前记录请求信息
*/
@Before("operLogPointCut()")
public void doBefore(JoinPoint joinPoint) {
try {
ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
if (attributes == null) {
return;
}
HttpServletRequest request = attributes.getRequest();
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
Method method = signature.getMethod();
// 创建操作日志对象
SysOperLog operLog = new SysOperLog();
operLog.setOperTime(new Date());
operLog.setOperUrl(request.getRequestURI());
operLog.setRequestMethod(request.getMethod());
// 获取请求参数
String operParam = getRequestParams(joinPoint, request);
operLog.setOperParam(operParam);
// 设置操作方法名
String className = joinPoint.getTarget().getClass().getName();
String methodName = method.getName();
operLog.setMethod(className + "." + methodName + "()");
// 保存到线程局部变量
operLogThreadLocal.set(operLog);
// 记录开始时间
startTimeThreadLocal.set(System.currentTimeMillis());
} catch (Exception e) {
log.error("操作日志前置通知异常", e);
}
}
/**
* 返回通知:在方法成功执行后记录结果
*/
@AfterReturning(pointcut = "operLogPointCut()", returning = "result")
public void doAfterReturning(JoinPoint joinPoint, Object result) {
try {
SysOperLog operLog = operLogThreadLocal.get();
if (operLog == null) {
return;
}
// 计算消耗时间
Long startTime = startTimeThreadLocal.get();
if (startTime != null) {
Long costTime = System.currentTimeMillis() - startTime;
operLog.setCostTime(costTime);
}
// 设置操作结果
if (result instanceof R) {
R<?> r = (R<?>)result;
operLog.setJsonResult(JSON.toJSONString(r));
// 根据R的code判断操作状态
if (r.getCode() != 200) { // 假设200是成功状态码
operLog.setStatus(1); // 失败
operLog.setErrorMsg(r.getMsg());
}
} else {
operLog.setJsonResult(result != null ? JSON.toJSONString(result) : "null");
}
// 插入数据库
insertOperLog(operLog);
} catch (Exception e) {
log.error("操作日志返回通知异常", e);
} finally {
// 清理线程局部变量
operLogThreadLocal.remove();
}
}
/**
* 获取请求参数
*/
private String getRequestParams(JoinPoint joinPoint, HttpServletRequest request) {
Map<String, Object> params = new HashMap<>();
// 添加基本请求信息
params.put("url", request.getRequestURL().toString());
params.put("method", request.getMethod());
// 获取Query参数
Map<String, String[]> parameterMap = request.getParameterMap();
if (!parameterMap.isEmpty()) {
Map<String, Object> queryParams = new HashMap<>();
parameterMap.forEach((key, values) -> {
if (values.length == 1) {
queryParams.put(key, values[0]);
} else {
queryParams.put(key, values);
}
});
params.put("query", queryParams);
}
// 获取Body参数排除文件上传和响应对象
Object[] args = joinPoint.getArgs();
if (args.length > 0) {
for (Object arg : args) {
if (isValidRequestBody(arg)) {
params.put("body", arg);
break; // 通常只有一个RequestBody
}
}
}
return JSON.toJSONString(params);
}
/**
* 判断是否为有效的请求体参数
*/
private boolean isValidRequestBody(Object arg) {
return arg != null && !(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse)
&& !(arg instanceof MultipartFile) && !(arg instanceof MultipartFile[]);
}
/**
* 插入操作日志到数据库
*/
private void insertOperLog(SysOperLog operLog) {
String username = SecurityUtils.getLoginUser().getUsername();
String sql = "INSERT INTO sys_oper_log "
+ "(title,oper_time,method,request_method,oper_name,oper_url,oper_param,json_result,error_msg,cost_time) "
+ "VALUES (?, ?, ?,?, ?, ?, ?, ?,?, ?)";
try {
jdbcTemplate.update(sql, "OperLogAspect切面生成", operLog.getOperTime(), operLog.getMethod(),
operLog.getRequestMethod(), username, operLog.getOperUrl(), operLog.getOperParam(),
operLog.getJsonResult(), operLog.getErrorMsg(), operLog.getCostTime());
} catch (Exception e) {
log.error("插入操作日志失败", e);
}
}
}