From 4c8137daf2f9c49dd1bf0d3f24372929016358f9 Mon Sep 17 00:00:00 2001
From: 疯狂的狮子li <15040126243@163.com>
Date: 星期三, 07 十二月 2022 20:32:57 +0800
Subject: [PATCH] update 优化 使用spring事件发布机制 重构登录日志与操作日志
---
/dev/null | 15 -----
ruoyi-system/src/main/java/com/ruoyi/system/service/SysRegisterService.java | 28 +++++++-
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/event/OperLogEvent.java | 6 +-
ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java | 11 ++-
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/event/LogininforEvent.java | 44 ++++++++++++++
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java | 14 ++--
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java | 13 ++--
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java | 32 +++++-----
ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java | 2
9 files changed, 107 insertions(+), 58 deletions(-)
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/event/LogininforEvent.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/event/LogininforEvent.java
new file mode 100644
index 0000000..733f97f
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/event/LogininforEvent.java
@@ -0,0 +1,44 @@
+package com.ruoyi.common.core.domain.event;
+
+import lombok.Data;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.Serializable;
+
+/**
+ * 鐧诲綍浜嬩欢
+ *
+ * @author Lion Li
+ */
+
+@Data
+public class LogininforEvent implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 鐢ㄦ埛璐﹀彿
+ */
+ private String username;
+
+ /**
+ * 鐧诲綍鐘舵�� 0鎴愬姛 1澶辫触
+ */
+ private String status;
+
+ /**
+ * 鎻愮ず娑堟伅
+ */
+ private String message;
+
+ /**
+ * 璇锋眰浣�
+ */
+ private HttpServletRequest request;
+
+ /**
+ * 鍏朵粬鍙傛暟
+ */
+ private Object[] args;
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/OperLogDTO.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/event/OperLogEvent.java
similarity index 91%
rename from ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/OperLogDTO.java
rename to ruoyi-common/src/main/java/com/ruoyi/common/core/domain/event/OperLogEvent.java
index 26bf674..3a29978 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/dto/OperLogDTO.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/event/OperLogEvent.java
@@ -1,4 +1,4 @@
-package com.ruoyi.common.core.domain.dto;
+package com.ruoyi.common.core.domain.event;
import lombok.Data;
@@ -6,13 +6,13 @@
import java.util.Date;
/**
- * 閫氱敤鎿嶄綔鏃ュ織瀹炰綋
+ * 鎿嶄綔鏃ュ織浜嬩欢
*
* @author Lion Li
*/
@Data
-public class OperLogDTO implements Serializable {
+public class OperLogEvent implements Serializable {
private static final long serialVersionUID = 1L;
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/LogininforService.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/LogininforService.java
deleted file mode 100644
index 91aee43..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/LogininforService.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.ruoyi.common.core.service;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * 閫氱敤 绯荤粺璁块棶鏃ュ織
- *
- * @author Lion Li
- */
-public interface LogininforService {
-
- void recordLogininfor(String username, String status, String message,
- HttpServletRequest request, Object... args);
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/OperLogService.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/OperLogService.java
deleted file mode 100644
index a3b27e6..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/OperLogService.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.ruoyi.common.core.service;
-
-import com.ruoyi.common.core.domain.dto.OperLogDTO;
-import org.springframework.scheduling.annotation.Async;
-
-/**
- * 閫氱敤 鎿嶄綔鏃ュ織
- *
- * @author Lion Li
- */
-public interface OperLogService {
-
- @Async
- void recordOper(OperLogDTO operLogDTO);
-}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
index 3b6a858..64ab736 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
@@ -4,8 +4,7 @@
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.core.domain.dto.OperLogDTO;
-import com.ruoyi.common.core.service.OperLogService;
+import com.ruoyi.common.core.domain.event.OperLogEvent;
import com.ruoyi.common.enums.BusinessStatus;
import com.ruoyi.common.enums.HttpMethod;
import com.ruoyi.common.helper.LoginHelper;
@@ -67,7 +66,7 @@
try {
// *========鏁版嵁搴撴棩蹇�=========*//
- OperLogDTO operLog = new OperLogDTO();
+ OperLogEvent operLog = new OperLogEvent();
operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
// 璇锋眰鐨勫湴鍧�
String ip = ServletUtils.getClientIP();
@@ -87,8 +86,8 @@
operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
// 澶勭悊璁剧疆娉ㄨВ涓婄殑鍙傛暟
getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);
- // 淇濆瓨鏁版嵁搴�
- SpringUtils.getBean(OperLogService.class).recordOper(operLog);
+ // 鍙戝竷浜嬩欢淇濆瓨鏁版嵁搴�
+ SpringUtils.context().publishEvent(operLog);
} catch (Exception exp) {
// 璁板綍鏈湴寮傚父鏃ュ織
log.error("寮傚父淇℃伅:{}", exp.getMessage());
@@ -103,7 +102,7 @@
* @param operLog 鎿嶄綔鏃ュ織
* @throws Exception
*/
- public void getControllerMethodDescription(JoinPoint joinPoint, Log log, OperLogDTO operLog, Object jsonResult) throws Exception {
+ public void getControllerMethodDescription(JoinPoint joinPoint, Log log, OperLogEvent operLog, Object jsonResult) throws Exception {
// 璁剧疆action鍔ㄤ綔
operLog.setBusinessType(log.businessType().ordinal());
// 璁剧疆鏍囬
@@ -127,7 +126,7 @@
* @param operLog 鎿嶄綔鏃ュ織
* @throws Exception 寮傚父
*/
- private void setRequestValue(JoinPoint joinPoint, OperLogDTO operLog) throws Exception {
+ private void setRequestValue(JoinPoint joinPoint, OperLogEvent operLog) throws Exception {
String requestMethod = operLog.getRequestMethod();
if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) {
String params = argsArrayToString(joinPoint.getArgs());
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java
index 47898e3..d011b58 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java
@@ -18,7 +18,7 @@
*
* @author Lion Li
*/
-@EnableAsync
+@EnableAsync(proxyTargetClass = true)
@Configuration
public class AsyncConfig extends AsyncConfigurerSupport {
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java
index cda6c76..551ed7a 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java
@@ -7,11 +7,11 @@
import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.domain.event.LogininforEvent;
import com.ruoyi.common.core.domain.dto.RoleDTO;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.domain.model.XcxLoginUser;
-import com.ruoyi.common.core.service.LogininforService;
import com.ruoyi.common.enums.DeviceType;
import com.ruoyi.common.enums.LoginType;
import com.ruoyi.common.enums.UserStatus;
@@ -24,6 +24,7 @@
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.redis.RedisUtils;
+import com.ruoyi.common.utils.spring.SpringUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
@@ -46,7 +47,6 @@
private final ISysUserService userService;
private final ISysConfigService configService;
- private final LogininforService asyncService;
private final SysPermissionService permissionService;
@Value("${user.password.maxRetryCount}")
@@ -141,7 +141,12 @@
* @return
*/
private void recordLogininfor(String username, String status, String message) {
- asyncService.recordLogininfor(username, status, message, ServletUtils.getRequest());
+ LogininforEvent logininforDTO = new LogininforEvent();
+ logininforDTO.setUsername(username);
+ logininforDTO.setStatus(status);
+ logininforDTO.setMessage(message);
+ logininforDTO.setRequest(ServletUtils.getRequest());
+ SpringUtils.context().publishEvent(logininforDTO);
}
/**
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysRegisterService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysRegisterService.java
index 983173d..62cf400 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysRegisterService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysRegisterService.java
@@ -4,9 +4,9 @@
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.core.domain.event.LogininforEvent;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.RegisterBody;
-import com.ruoyi.common.core.service.LogininforService;
import com.ruoyi.common.enums.UserType;
import com.ruoyi.common.exception.user.CaptchaException;
import com.ruoyi.common.exception.user.CaptchaExpireException;
@@ -15,6 +15,7 @@
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.redis.RedisUtils;
+import com.ruoyi.common.utils.spring.SpringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@@ -31,7 +32,6 @@
private final ISysUserService userService;
private final ISysConfigService configService;
- private final LogininforService asyncService;
/**
* 娉ㄥ唽
@@ -61,7 +61,7 @@
if (!regFlag) {
throw new UserException("user.register.error");
}
- asyncService.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success"), request);
+ recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success"));
}
/**
@@ -77,12 +77,30 @@
String captcha = RedisUtils.getCacheObject(verifyKey);
RedisUtils.deleteObject(verifyKey);
if (captcha == null) {
- asyncService.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.expire"), request);
+ recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.expire"));
throw new CaptchaExpireException();
}
if (!code.equalsIgnoreCase(captcha)) {
- asyncService.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.error"), request);
+ recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.error"));
throw new CaptchaException();
}
}
+
+ /**
+ * 璁板綍鐧诲綍淇℃伅
+ *
+ * @param username 鐢ㄦ埛鍚�
+ * @param status 鐘舵��
+ * @param message 娑堟伅鍐呭
+ * @return
+ */
+ private void recordLogininfor(String username, String status, String message) {
+ LogininforEvent logininforDTO = new LogininforEvent();
+ logininforDTO.setUsername(username);
+ logininforDTO.setStatus(status);
+ logininforDTO.setMessage(message);
+ logininforDTO.setRequest(ServletUtils.getRequest());
+ SpringUtils.context().publishEvent(logininforDTO);
+ }
+
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java
index 159db62..1cd176f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java
@@ -6,8 +6,8 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.PageQuery;
+import com.ruoyi.common.core.domain.event.LogininforEvent;
import com.ruoyi.common.core.page.TableDataInfo;
-import com.ruoyi.common.core.service.LogininforService;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.ip.AddressUtils;
@@ -16,6 +16,7 @@
import com.ruoyi.system.service.ISysLogininforService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@@ -33,22 +34,19 @@
@RequiredArgsConstructor
@Slf4j
@Service
-public class SysLogininforServiceImpl implements ISysLogininforService, LogininforService {
+public class SysLogininforServiceImpl implements ISysLogininforService {
private final SysLogininforMapper baseMapper;
/**
* 璁板綍鐧诲綍淇℃伅
*
- * @param username 鐢ㄦ埛鍚�
- * @param status 鐘舵��
- * @param message 娑堟伅
- * @param args 鍒楄〃
+ * @param logininforEvent 鐧诲綍浜嬩欢
*/
@Async
- @Override
- public void recordLogininfor(final String username, final String status, final String message,
- HttpServletRequest request, final Object... args) {
+ @EventListener
+ public void recordLogininfor(LogininforEvent logininforEvent) {
+ HttpServletRequest request = logininforEvent.getRequest();
final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
final String ip = ServletUtils.getClientIP(request);
@@ -56,27 +54,27 @@
StringBuilder s = new StringBuilder();
s.append(getBlock(ip));
s.append(address);
- s.append(getBlock(username));
- s.append(getBlock(status));
- s.append(getBlock(message));
+ s.append(getBlock(logininforEvent.getUsername()));
+ s.append(getBlock(logininforEvent.getStatus()));
+ s.append(getBlock(logininforEvent.getMessage()));
// 鎵撳嵃淇℃伅鍒版棩蹇�
- log.info(s.toString(), args);
+ log.info(s.toString(), logininforEvent.getArgs());
// 鑾峰彇瀹㈡埛绔搷浣滅郴缁�
String os = userAgent.getOs().getName();
// 鑾峰彇瀹㈡埛绔祻瑙堝櫒
String browser = userAgent.getBrowser().getName();
// 灏佽瀵硅薄
SysLogininfor logininfor = new SysLogininfor();
- logininfor.setUserName(username);
+ logininfor.setUserName(logininforEvent.getUsername());
logininfor.setIpaddr(ip);
logininfor.setLoginLocation(address);
logininfor.setBrowser(browser);
logininfor.setOs(os);
- logininfor.setMsg(message);
+ logininfor.setMsg(logininforEvent.getMessage());
// 鏃ュ織鐘舵��
- if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
+ if (StringUtils.equalsAny(logininforEvent.getStatus(), Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
logininfor.setStatus(Constants.SUCCESS);
- } else if (Constants.LOGIN_FAIL.equals(status)) {
+ } else if (Constants.LOGIN_FAIL.equals(logininforEvent.getStatus())) {
logininfor.setStatus(Constants.FAIL);
}
// 鎻掑叆鏁版嵁
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java
index 8610d97..28ac34c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java
@@ -5,15 +5,15 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.PageQuery;
-import com.ruoyi.common.core.domain.dto.OperLogDTO;
+import com.ruoyi.common.core.domain.event.OperLogEvent;
import com.ruoyi.common.core.page.TableDataInfo;
-import com.ruoyi.common.core.service.OperLogService;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.ip.AddressUtils;
import com.ruoyi.system.domain.SysOperLog;
import com.ruoyi.system.mapper.SysOperLogMapper;
import com.ruoyi.system.service.ISysOperLogService;
import lombok.RequiredArgsConstructor;
+import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@@ -29,19 +29,19 @@
*/
@RequiredArgsConstructor
@Service
-public class SysOperLogServiceImpl implements ISysOperLogService, OperLogService {
+public class SysOperLogServiceImpl implements ISysOperLogService {
private final SysOperLogMapper baseMapper;
/**
* 鎿嶄綔鏃ュ織璁板綍
*
- * @param operLogDTO 鎿嶄綔鏃ュ織淇℃伅
+ * @param operLogEvent 鎿嶄綔鏃ュ織浜嬩欢
*/
@Async
- @Override
- public void recordOper(final OperLogDTO operLogDTO) {
- SysOperLog operLog = BeanUtil.toBean(operLogDTO, SysOperLog.class);
+ @EventListener
+ public void recordOper(OperLogEvent operLogEvent) {
+ SysOperLog operLog = BeanUtil.toBean(operLogEvent, SysOperLog.class);
// 杩滅▼鏌ヨ鎿嶄綔鍦扮偣
operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
insertOperlog(operLog);
--
Gitblit v1.9.3