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