diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/controller/LogOperationController.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/controller/LogOperationController.java index ddd86e8fac..13ed1b9bd1 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/controller/LogOperationController.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/controller/LogOperationController.java @@ -1,6 +1,7 @@ package com.epmet.controller; import com.epmet.commons.tools.security.user.LoginUserUtil; +import com.epmet.commons.tools.utils.IpUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.dto.form.LogOperationListFormDTO; @@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; @@ -27,7 +29,7 @@ public class LogOperationController { private LoginUserUtil loginUserUtil; @PostMapping("/list") - public Result> listLogOperations(@RequestBody LogOperationListFormDTO input) { + public Result> listLogOperations(@RequestBody LogOperationListFormDTO input, HttpServletRequest request) { ValidatorUtils.validateEntity(input); String condition = input.getCondition(); Integer pageNo = input.getPageNo(); diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/entity/LogOperationEntity.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/entity/LogOperationEntity.java index b6b0d4364e..3bbbb75841 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/entity/LogOperationEntity.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/entity/LogOperationEntity.java @@ -49,6 +49,12 @@ public class LogOperationEntity extends BaseEpmetEntity { private String typeDisplay; + private String ip; + + private String fromApp; + + private String fromClient; + /** * 内容 */ @@ -63,6 +69,15 @@ public class LogOperationEntity extends BaseEpmetEntity { * 操作人ID */ private String operatorId; + /** + * 操作人姓名 + */ + private String operatorName; + + /** + * 操作人手机号 + */ + private String operatorMobile; /** * 操作时间,该时间不是插入数据的时间,而是操作发生的真实时间 diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/bean/log/LogOperationHelper.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/bean/log/LogOperationHelper.java new file mode 100644 index 0000000000..0d390709bd --- /dev/null +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/bean/log/LogOperationHelper.java @@ -0,0 +1,63 @@ +package com.epmet.mq.listener.bean.log; + +import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.feign.ResultDataResolver; +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.utils.SpringContextUtils; +import com.epmet.dto.CustomerStaffDTO; +import com.epmet.feign.EpmetUserOpenFeignClient; + +/** + * 操作日志帮助类 单例 + */ +public class LogOperationHelper implements ResultDataResolver { + + private EpmetUserOpenFeignClient userOpenFeignClient; + + private LogOperationHelper() { + } + + /** + * @Description 利用类只能加载一次的特性,保证类静态变量只能生成一份,实现单例 + * @return + * @author wxz + * @date 2021.06.09 16:55 + */ + private static class SingletonInnerClass { + public static LogOperationHelper instance = new LogOperationHelper(); + } + + /** + * @Description 获取实例 + * @return + * @author wxz + * @date 2021.06.09 16:54 + */ + public static LogOperationHelper getInstance() { + return SingletonInnerClass.instance; + } + + /** + * @Description 获取操作人信息 + * @return + * @author wxz + * @date 2021.06.09 16:57 + */ + public OperatorInfo getOperatorInfo(String userId) { + if (userOpenFeignClient == null) { + synchronized (this) { + if (userOpenFeignClient == null) { + userOpenFeignClient = SpringContextUtils.getBean(EpmetUserOpenFeignClient.class); + } + } + } + + CustomerStaffDTO form = new CustomerStaffDTO(); + form.setUserId(userId); + Result result = userOpenFeignClient.getCustomerStaffInfoByUserId(form); + CustomerStaffDTO staffInfo = getResultDataOrThrowsException(result, ServiceConstant.EPMET_ADMIN_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), + "调用epmet-user服务获取staff信息发生异常"); + return new OperatorInfo(staffInfo.getMobile(), staffInfo.getRealName()); + } +} diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/bean/log/OperatorInfo.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/bean/log/OperatorInfo.java new file mode 100644 index 0000000000..fe1ce2fc09 --- /dev/null +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/bean/log/OperatorInfo.java @@ -0,0 +1,11 @@ +package com.epmet.mq.listener.bean.log; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class OperatorInfo { + private String mobile; + private String name; +} diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/AuthOperationLogListener.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/AuthOperationLogListener.java index fe6cf5a03d..85573d40f0 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/AuthOperationLogListener.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/AuthOperationLogListener.java @@ -3,11 +3,20 @@ package com.epmet.mq.listener.listener; import com.alibaba.fastjson.JSON; import com.epmet.auth.constants.AuthOperationEnum; import com.epmet.commons.rocketmq.messages.LoginMQMsg; +import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.distributedlock.DistributedLock; +import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.feign.ResultDataResolver; +import com.epmet.commons.tools.utils.IpUtils; +import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.utils.SpringContextUtils; +import com.epmet.dto.CustomerStaffDTO; import com.epmet.entity.LogOperationEntity; +import com.epmet.feign.EpmetUserOpenFeignClient; +import com.epmet.mq.listener.bean.log.LogOperationHelper; +import com.epmet.mq.listener.bean.log.OperatorInfo; import com.epmet.service.LogOperationService; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; @@ -48,12 +57,19 @@ public class AuthOperationLogListener implements MessageListenerConcurrently { logger.info("认证操作日志监听器-收到消息内容:{}", msg); LoginMQMsg msgObj = JSON.parseObject(msg, LoginMQMsg.class); + //获取操作人信息 + OperatorInfo operatorInfo = LogOperationHelper.getInstance().getOperatorInfo(msgObj.getUserId()); LogOperationEntity logEntity = new LogOperationEntity(); logEntity.setCategory(messageExt.getTopic()); logEntity.setType(tags); logEntity.setTypeDisplay(AuthOperationEnum.getDisplay(tags)); + logEntity.setIp(msgObj.getIp()); + logEntity.setFromApp(msgObj.getFromApp()); + logEntity.setFromClient(msgObj.getFromClient()); logEntity.setTargetId(""); logEntity.setOperatorId(msgObj.getUserId()); + logEntity.setOperatorName(operatorInfo.getName()); + logEntity.setOperatorMobile(operatorInfo.getMobile()); logEntity.setOperatingTime(msgObj.getLoginTime()); logEntity.setContent("成功登录系统"); diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/ProjectOperationLogListener.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/ProjectOperationLogListener.java index 181e7cd3fc..5240444701 100644 --- a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/ProjectOperationLogListener.java +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/mq/listener/listener/ProjectOperationLogListener.java @@ -8,6 +8,8 @@ import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.utils.SpringContextUtils; import com.epmet.entity.LogOperationEntity; +import com.epmet.mq.listener.bean.log.LogOperationHelper; +import com.epmet.mq.listener.bean.log.OperatorInfo; import com.epmet.service.LogOperationService; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; @@ -51,12 +53,19 @@ public class ProjectOperationLogListener implements MessageListenerConcurrently String content = StringUtils.isBlank(msgObj.getOperationBrief()) ? "" : msgObj.getOperationBrief(); + OperatorInfo operatorInfo = LogOperationHelper.getInstance().getOperatorInfo(msgObj.getOperatorId()); + LogOperationEntity logEntity = new LogOperationEntity(); logEntity.setCategory(messageExt.getTopic()); logEntity.setType(msgObj.getOperation()); logEntity.setTypeDisplay(getOperationTypeDisplay(msgObj.getOperation())); logEntity.setTargetId(msgObj.getProjectId()); + logEntity.setIp(msgObj.getIp()); + logEntity.setFromApp(msgObj.getFromApp()); + logEntity.setFromClient(msgObj.getFromClient()); logEntity.setOperatorId(msgObj.getOperatorId()); + logEntity.setOperatorMobile(operatorInfo.getMobile()); + logEntity.setOperatorName(operatorInfo.getName()); logEntity.setOperatingTime(msgObj.getOperatingTime()); logEntity.setContent(content); diff --git a/epmet-admin/epmet-admin-server/src/main/resources/db/migration/V0.0.3__add_log_ope_table.sql b/epmet-admin/epmet-admin-server/src/main/resources/db/migration/V0.0.3__add_log_ope_table.sql index b55c87ecf8..c6ccb2e1e9 100644 --- a/epmet-admin/epmet-admin-server/src/main/resources/db/migration/V0.0.3__add_log_ope_table.sql +++ b/epmet-admin/epmet-admin-server/src/main/resources/db/migration/V0.0.3__add_log_ope_table.sql @@ -4,8 +4,13 @@ CREATE TABLE `log_operation` ( `TYPE_DISPLAY` varchar(64) NOT NULL COMMENT '操作类型中文展示', `CONTENT` varchar(512) NOT NULL COMMENT '内容', `CATEGORY` varchar(64) NOT NULL COMMENT '操作类型大类。例如login和logout都属于login大类。项目立项,项目流转,项目结案都属于项目大类', + `IP` varchar(15) NOT NULL COMMENT 'IP地址', + `FROM_APP` varchar(10) NOT NULL COMMENT '所用的APP', + `FROM_CLIENT` varchar(10) NOT NULL COMMENT '所用的client', `TARGET_ID` varchar(64) NOT NULL COMMENT '操作目标ID', `OPERATOR_ID` varchar(64) NOT NULL COMMENT '操作人ID', + `OPERATOR_NAME` varchar(15) NOT NULL COMMENT '操作者姓名', + `OPERATOR_MOBILE` varchar(11) NOT NULL COMMENT '操作者电话', `OPERATING_TIME` datetime NOT NULL COMMENT '操作时间,该时间不是插入数据的时间,而是操作发生的真实时间', `DEL_FLAG` int(11) NOT NULL DEFAULT '0' COMMENT '删除标识 0.未删除 1.已删除', `REVISION` int(11) NOT NULL COMMENT '乐观锁', diff --git a/epmet-admin/epmet-admin-server/src/main/resources/mapper/LogOperationDao.xml b/epmet-admin/epmet-admin-server/src/main/resources/mapper/LogOperationDao.xml index 1496892029..0e00d21c34 100644 --- a/epmet-admin/epmet-admin-server/src/main/resources/mapper/LogOperationDao.xml +++ b/epmet-admin/epmet-admin-server/src/main/resources/mapper/LogOperationDao.xml @@ -9,8 +9,13 @@ + + + + + diff --git a/epmet-auth/src/main/java/com/epmet/service/impl/ThirdLoginServiceImpl.java b/epmet-auth/src/main/java/com/epmet/service/impl/ThirdLoginServiceImpl.java index 3926452c8d..b6881aefdd 100644 --- a/epmet-auth/src/main/java/com/epmet/service/impl/ThirdLoginServiceImpl.java +++ b/epmet-auth/src/main/java/com/epmet/service/impl/ThirdLoginServiceImpl.java @@ -8,6 +8,7 @@ import com.alibaba.fastjson.JSONObject; import com.epmet.auth.constants.AuthOperationConstants; import com.epmet.common.token.constant.LoginConstant; import com.epmet.commons.rocketmq.messages.LoginMQMsg; +import com.epmet.commons.tools.constant.AppClientConstant; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.ExceptionUtils; @@ -32,6 +33,7 @@ import com.epmet.jwt.JwtTokenProperties; import com.epmet.jwt.JwtTokenUtils; import com.epmet.redis.CaptchaRedis; import com.epmet.service.ThirdLoginService; +import com.sun.deploy.association.utility.AppConstants; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.spring.core.RocketMQTemplate; @@ -40,7 +42,10 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import javax.servlet.http.HttpServletRequest; import java.util.*; import java.util.stream.Collectors; @@ -183,11 +188,11 @@ public class ThirdLoginServiceImpl implements ThirdLoginService, ResultDataResol //7.发送登录事件 try { - sendLoginEvent(staffLatestAgencyResultDTO.getStaffId(), formDTO.getAppId()); + sendLoginEvent(staffLatestAgencyResultDTO.getStaffId(), formDTO.getAppId(), AppClientConstant.APP_GOV, AppClientConstant.CLIENT_WXMP); } catch (RenException e) { log.error(e.getInternalMsg()); } catch (Exception e) { - log.error("【工作端workLogin登录】发送登录事件失败,程序继续执行。错误信息"); + log.error("【工作端workLogin登录】发送登录事件失败,程序继续执行。"); } return userTokenResultDTO; @@ -414,7 +419,7 @@ public class ThirdLoginServiceImpl implements ThirdLoginService, ResultDataResol //6.发送登录事件 try { - sendLoginEvent(customerStaff.getUserId(), formDTO.getAppId()); + sendLoginEvent(customerStaff.getUserId(), formDTO.getAppId(), AppClientConstant.APP_GOV, AppClientConstant.CLIENT_WXMP); } catch (RenException e) { log.error(e.getInternalMsg()); } catch (Exception e) { @@ -670,11 +675,16 @@ public class ThirdLoginServiceImpl implements ThirdLoginService, ResultDataResol * @author wxz * @date 2021.06.08 15:27 */ - private void sendLoginEvent(String userId, String appId) { + private void sendLoginEvent(String userId, String appId, String fromApp, String fromClient) { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + LoginMQMsg loginMQMsg = new LoginMQMsg(); loginMQMsg.setUserId(userId); loginMQMsg.setLoginTime(new Date()); loginMQMsg.setAppId(appId); + loginMQMsg.setIp(IpUtils.getIpAddr(request)); + loginMQMsg.setFromApp(fromApp); + loginMQMsg.setFromClient(fromClient); SystemMsgFormDTO form = new SystemMsgFormDTO(); form.setMessageType(AuthOperationConstants.LOGIN); diff --git a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/LoginMQMsg.java b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/LoginMQMsg.java index 643cd99f03..646db43501 100644 --- a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/LoginMQMsg.java +++ b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/LoginMQMsg.java @@ -17,4 +17,10 @@ public class LoginMQMsg { */ private Date loginTime; + private String ip; + + private String fromApp; + + private String fromClient; + } diff --git a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/ProjectChangedMQMsg.java b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/ProjectChangedMQMsg.java index 9530f7a326..5f33faae98 100644 --- a/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/ProjectChangedMQMsg.java +++ b/epmet-commons/epmet-commons-rocketmq/src/main/java/com/epmet/commons/rocketmq/messages/ProjectChangedMQMsg.java @@ -29,4 +29,12 @@ public class ProjectChangedMQMsg implements Serializable { */ private String operationBrief; + /** + * 操作者ip + */ + private String ip; + private String fromApp; + private String fromClient; + + } diff --git a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java index 79e1903e7d..ad3fec6959 100644 --- a/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java +++ b/epmet-module/gov-project/gov-project-server/src/main/java/com/epmet/service/impl/ProjectProcessServiceImpl.java @@ -31,7 +31,9 @@ import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.scan.param.TextScanParamDTO; import com.epmet.commons.tools.scan.param.TextTaskDTO; import com.epmet.commons.tools.scan.result.SyncScanResult; +import com.epmet.commons.tools.security.user.LoginUserUtil; import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.commons.tools.utils.IpUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.utils.ScanContentUtils; import com.epmet.constant.ProjectConstant; @@ -71,7 +73,10 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import javax.servlet.http.HttpServletRequest; import java.util.*; import java.util.stream.Collectors; @@ -116,6 +121,8 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl page(Map params) { @@ -387,14 +394,17 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl implements ProjectTraceS private EpmetUserFeignClient epmetUserFeignClient; @Autowired private EpmetMessageOpenFeignClient epmetMessageOpenFeignClient; + @Autowired + private LoginUserUtil loginUserUtil; @Override public List getPendProjectList(TokenDto tokenDto, ProjectListFromDTO fromDTO) { @@ -506,12 +513,16 @@ public class ProjectTraceServiceImpl implements ProjectTraceS } //项目实时统计消息 + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String mqMsgBrief = String.format("创建了\"%s\"的项目", formDTO.getTitle()); ProjectChangedMQMsg mqMsg = new ProjectChangedMQMsg(projectEntity.getCustomerId(), ProjectConstant.OPERATION_CREATED, projectEntity.getId(), formDTO.getUserId(), new Date(), - mqMsgBrief); + mqMsgBrief, + IpUtils.getIpAddr(request), + loginUserUtil.getLoginUserApp(), + loginUserUtil.getLoginUserClient()); boolean msgResult = SendMqMsgUtil.build().openFeignClient(epmetMessageOpenFeignClient).sendProjectChangedMqMsg(mqMsg); if (!msgResult) { log.error("项目实时统计消息发送失败");