Commit c5cc818a4901024ee950926ef0d4989404495547
1 parent
72cebfca
系统操作日志:集成 mzt-biz-log
Showing
14 changed files
with
399 additions
and
6 deletions
yudao-dependencies/pom.xml
| ... | ... | @@ -62,6 +62,7 @@ |
| 62 | 62 | <jsch.version>0.1.55</jsch.version> |
| 63 | 63 | <tika-core.version>2.9.1</tika-core.version> |
| 64 | 64 | <ip2region.version>2.7.0</ip2region.version> |
| 65 | + <bizlog-sdk.version>3.0.6</bizlog-sdk.version> | |
| 65 | 66 | <!-- 三方云服务相关 --> |
| 66 | 67 | <okio.version>3.5.0</okio.version> |
| 67 | 68 | <okhttp3.version>4.11.0</okhttp3.version> |
| ... | ... | @@ -100,6 +101,17 @@ |
| 100 | 101 | <version>${revision}</version> |
| 101 | 102 | </dependency> |
| 102 | 103 | <dependency> |
| 104 | + <groupId>io.github.mouzt</groupId> | |
| 105 | + <artifactId>bizlog-sdk</artifactId> | |
| 106 | + <version>${bizlog-sdk.version}</version> | |
| 107 | + <exclusions> | |
| 108 | + <exclusion> <!-- 排除掉springboot依赖使用项目的 --> | |
| 109 | + <groupId>org.springframework.boot</groupId> | |
| 110 | + <artifactId>spring-boot-starter</artifactId> | |
| 111 | + </exclusion> | |
| 112 | + </exclusions> | |
| 113 | + </dependency> | |
| 114 | + <dependency> | |
| 103 | 115 | <groupId>cn.iocoder.boot</groupId> |
| 104 | 116 | <artifactId>yudao-spring-boot-starter-biz-dict</artifactId> |
| 105 | 117 | <version>${revision}</version> | ... | ... |
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/LogRecordConstants.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.crm.enums; | |
| 2 | + | |
| 3 | +/** | |
| 4 | + * CRM 操作日志枚举 | |
| 5 | + * | |
| 6 | + * @author HUIHUI | |
| 7 | + */ | |
| 8 | +public interface LogRecordConstants { | |
| 9 | + | |
| 10 | + String WHO = "【{getAdminUserById{#userId}}】"; | |
| 11 | + | |
| 12 | + //======================= 客户转移操作日志 ======================= | |
| 13 | + | |
| 14 | + String TRANSFER_CUSTOMER_LOG_TYPE = "客户转移"; | |
| 15 | + String TRANSFER_CUSTOMER_LOG_SUCCESS = WHO + "把客户【{{#crmCustomer.name}}】负责人【{getAdminUserById{#crmCustomer.ownerUserId}}】转移给了【{getAdminUserById{#reqVO.newOwnerUserId}}】"; | |
| 16 | + String TRANSFER_CUSTOMER_LOG_FAIL = ""; | |
| 17 | + | |
| 18 | +} | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.http
| 1 | -### 请求 /update | |
| 2 | -GET {{baseUrl}}/crm/customer/page?pageNo=1&pageSize=10&name="张三" | |
| 1 | +### 请求 /transfer | |
| 2 | +PUT {{baseUrl}}/crm/customer/transfer | |
| 3 | +Content-Type: application/json | |
| 3 | 4 | Authorization: Bearer {{token}} |
| 4 | 5 | tenant-id: {{adminTenentId}} |
| 5 | 6 | |
| 7 | +{ | |
| 8 | + "id": 11, | |
| 9 | + "newOwnerUserId": 127, | |
| 10 | + "oldOwnerPermissionLevel": 2 | |
| 11 | +} | |
| 12 | + | |
| 6 | 13 | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java
| ... | ... | @@ -17,14 +17,14 @@ import io.swagger.v3.oas.annotations.Operation; |
| 17 | 17 | import io.swagger.v3.oas.annotations.Parameter; |
| 18 | 18 | import io.swagger.v3.oas.annotations.Parameters; |
| 19 | 19 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 20 | +import jakarta.annotation.Resource; | |
| 21 | +import jakarta.servlet.http.HttpServletResponse; | |
| 22 | +import jakarta.validation.Valid; | |
| 20 | 23 | import org.mapstruct.ap.internal.util.Collections; |
| 21 | 24 | import org.springframework.security.access.prepost.PreAuthorize; |
| 22 | 25 | import org.springframework.validation.annotation.Validated; |
| 23 | 26 | import org.springframework.web.bind.annotation.*; |
| 24 | 27 | |
| 25 | -import jakarta.annotation.Resource; | |
| 26 | -import jakarta.servlet.http.HttpServletResponse; | |
| 27 | -import jakarta.validation.Valid; | |
| 28 | 28 | import java.io.IOException; |
| 29 | 29 | import java.util.List; |
| 30 | 30 | import java.util.Map; | ... | ... |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
| ... | ... | @@ -9,12 +9,15 @@ import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerUpdat |
| 9 | 9 | import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert; |
| 10 | 10 | import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; |
| 11 | 11 | import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper; |
| 12 | +import cn.iocoder.yudao.module.crm.enums.LogRecordConstants; | |
| 12 | 13 | import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; |
| 13 | 14 | import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; |
| 14 | 15 | import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission; |
| 15 | 16 | import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; |
| 16 | 17 | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; |
| 17 | 18 | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| 19 | +import com.mzt.logapi.context.LogRecordContext; | |
| 20 | +import com.mzt.logapi.starter.annotation.LogRecord; | |
| 18 | 21 | import jakarta.annotation.Resource; |
| 19 | 22 | import org.springframework.stereotype.Service; |
| 20 | 23 | import org.springframework.transaction.annotation.Transactional; |
| ... | ... | @@ -126,11 +129,14 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { |
| 126 | 129 | |
| 127 | 130 | @Override |
| 128 | 131 | @Transactional(rollbackFor = Exception.class) |
| 132 | + @LogRecord(success = LogRecordConstants.TRANSFER_CUSTOMER_LOG_SUCCESS, | |
| 133 | + type = LogRecordConstants.TRANSFER_CUSTOMER_LOG_TYPE, bizNo = "{{#reqVO.id}}") | |
| 129 | 134 | @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#reqVO.id", level = CrmPermissionLevelEnum.OWNER) |
| 130 | 135 | public void transferCustomer(CrmCustomerTransferReqVO reqVO, Long userId) { |
| 131 | 136 | // 1. 校验客户是否存在 |
| 132 | 137 | validateCustomer(reqVO.getId()); |
| 133 | 138 | |
| 139 | + LogRecordContext.putVariable("crmCustomer", customerMapper.selectById(reqVO.getId())); | |
| 134 | 140 | // 2.1 数据权限转移 |
| 135 | 141 | crmPermissionService.transferPermission( |
| 136 | 142 | CrmCustomerConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType())); | ... | ... |
yudao-module-system/yudao-module-system-api/pom.xml
| ... | ... | @@ -22,6 +22,13 @@ |
| 22 | 22 | <artifactId>yudao-common</artifactId> |
| 23 | 23 | </dependency> |
| 24 | 24 | |
| 25 | + <!-- Springboot-注解-通用操作日志组件 --> | |
| 26 | + <!-- 此组件解决的问题是: 「谁」在「什么时间」对「什么」做了「什么事」 --> | |
| 27 | + <dependency> | |
| 28 | + <groupId>io.github.mouzt</groupId> | |
| 29 | + <artifactId>bizlog-sdk</artifactId> | |
| 30 | + </dependency> | |
| 31 | + | |
| 25 | 32 | <!-- 参数校验 --> |
| 26 | 33 | <dependency> |
| 27 | 34 | <groupId>org.springframework.boot</groupId> | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogV2DO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.dal.dataobject.logger; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | |
| 4 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 5 | +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | |
| 6 | +import cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum; | |
| 7 | +import com.baomidou.mybatisplus.annotation.KeySequence; | |
| 8 | +import com.baomidou.mybatisplus.annotation.TableField; | |
| 9 | +import com.baomidou.mybatisplus.annotation.TableId; | |
| 10 | +import com.baomidou.mybatisplus.annotation.TableName; | |
| 11 | +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | |
| 12 | +import lombok.Data; | |
| 13 | +import lombok.EqualsAndHashCode; | |
| 14 | + | |
| 15 | +import java.time.LocalDateTime; | |
| 16 | +import java.util.Map; | |
| 17 | + | |
| 18 | +/** | |
| 19 | + * 操作日志表 | |
| 20 | + * | |
| 21 | + * @author 芋道源码 | |
| 22 | + */ | |
| 23 | +@TableName(value = "system_operate_log_v2", autoResultMap = true) | |
| 24 | +@KeySequence("system_operate_log_seq_v2") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 | |
| 25 | +@Data | |
| 26 | +@EqualsAndHashCode(callSuper = true) | |
| 27 | +public class OperateLogV2DO extends BaseDO { | |
| 28 | + | |
| 29 | + /** | |
| 30 | + * {@link #javaMethodArgs} 的最大长度 | |
| 31 | + */ | |
| 32 | + public static final Integer JAVA_METHOD_ARGS_MAX_LENGTH = 8000; | |
| 33 | + | |
| 34 | + /** | |
| 35 | + * {@link #resultData} 的最大长度 | |
| 36 | + */ | |
| 37 | + public static final Integer RESULT_MAX_LENGTH = 4000; | |
| 38 | + | |
| 39 | + /** | |
| 40 | + * 日志主键 | |
| 41 | + */ | |
| 42 | + @TableId | |
| 43 | + private Long id; | |
| 44 | + /** | |
| 45 | + * 链路追踪编号 | |
| 46 | + * | |
| 47 | + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 | |
| 48 | + */ | |
| 49 | + private String traceId; | |
| 50 | + /** | |
| 51 | + * 用户编号 | |
| 52 | + * | |
| 53 | + * 关联 MemberUserDO 的 id 属性,或者 AdminUserDO 的 id 属性 | |
| 54 | + */ | |
| 55 | + private Long userId; | |
| 56 | + /** | |
| 57 | + * 用户类型 | |
| 58 | + * | |
| 59 | + * 关联 {@link UserTypeEnum} | |
| 60 | + */ | |
| 61 | + private Integer userType; | |
| 62 | + /** | |
| 63 | + * 操作模块 | |
| 64 | + */ | |
| 65 | + private String module; | |
| 66 | + /** | |
| 67 | + * 操作名 | |
| 68 | + */ | |
| 69 | + private String name; | |
| 70 | + /** | |
| 71 | + * 操作分类 | |
| 72 | + * | |
| 73 | + * 枚举 {@link OperateTypeEnum} | |
| 74 | + */ | |
| 75 | + private Integer type; | |
| 76 | + /** | |
| 77 | + * 操作内容,记录整个操作的明细 | |
| 78 | + * 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。 | |
| 79 | + */ | |
| 80 | + private String content; | |
| 81 | + /** | |
| 82 | + * 拓展字段,有些复杂的业务,需要记录一些字段 | |
| 83 | + * 例如说,记录订单编号,则可以添加 key 为 "orderId",value 为订单编号 | |
| 84 | + */ | |
| 85 | + @TableField(typeHandler = JacksonTypeHandler.class) | |
| 86 | + private Map<String, Object> exts; | |
| 87 | + | |
| 88 | + /** | |
| 89 | + * 请求方法名 | |
| 90 | + */ | |
| 91 | + private String requestMethod; | |
| 92 | + /** | |
| 93 | + * 请求地址 | |
| 94 | + */ | |
| 95 | + private String requestUrl; | |
| 96 | + /** | |
| 97 | + * 用户 IP | |
| 98 | + */ | |
| 99 | + private String userIp; | |
| 100 | + /** | |
| 101 | + * 浏览器 UA | |
| 102 | + */ | |
| 103 | + private String userAgent; | |
| 104 | + | |
| 105 | + /** | |
| 106 | + * Java 方法名 | |
| 107 | + */ | |
| 108 | + private String javaMethod; | |
| 109 | + /** | |
| 110 | + * Java 方法的参数 | |
| 111 | + * | |
| 112 | + * 实际格式为 Map<String, Object> | |
| 113 | + * 不使用 @TableField(typeHandler = FastjsonTypeHandler.class) 注解的原因是,数据库存储有长度限制,会进行裁剪,会导致 JSON 反序列化失败 | |
| 114 | + * 其中,key 为参数名,value 为参数值 | |
| 115 | + */ | |
| 116 | + private String javaMethodArgs; | |
| 117 | + /** | |
| 118 | + * 开始时间 | |
| 119 | + */ | |
| 120 | + private LocalDateTime startTime; | |
| 121 | + /** | |
| 122 | + * 执行时长,单位:毫秒 | |
| 123 | + */ | |
| 124 | + private Integer duration; | |
| 125 | + /** | |
| 126 | + * 结果码 | |
| 127 | + * | |
| 128 | + * 目前使用的 {@link CommonResult#getCode()} 属性 | |
| 129 | + */ | |
| 130 | + private Integer resultCode; | |
| 131 | + /** | |
| 132 | + * 结果提示 | |
| 133 | + * | |
| 134 | + * 目前使用的 {@link CommonResult#getMsg()} 属性 | |
| 135 | + */ | |
| 136 | + private String resultMsg; | |
| 137 | + /** | |
| 138 | + * 结果数据 | |
| 139 | + * | |
| 140 | + * 如果是对象,则使用 JSON 格式化 | |
| 141 | + */ | |
| 142 | + private String resultData; | |
| 143 | + | |
| 144 | +} | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/OperateLogV2Mapper.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.dal.mysql.logger; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants; | |
| 4 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 5 | +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | |
| 6 | +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | |
| 7 | +import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; | |
| 8 | +import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO; | |
| 9 | +import org.apache.ibatis.annotations.Mapper; | |
| 10 | + | |
| 11 | +import java.util.Collection; | |
| 12 | + | |
| 13 | +@Mapper | |
| 14 | +public interface OperateLogV2Mapper extends BaseMapperX<OperateLogV2DO> { | |
| 15 | + | |
| 16 | + default PageResult<OperateLogV2DO> selectPage(OperateLogPageReqVO reqVO, Collection<Long> userIds) { | |
| 17 | + LambdaQueryWrapperX<OperateLogV2DO> query = new LambdaQueryWrapperX<OperateLogV2DO>() | |
| 18 | + .likeIfPresent(OperateLogV2DO::getModule, reqVO.getModule()) | |
| 19 | + .inIfPresent(OperateLogV2DO::getUserId, userIds) | |
| 20 | + .eqIfPresent(OperateLogV2DO::getType, reqVO.getType()) | |
| 21 | + .betweenIfPresent(OperateLogV2DO::getStartTime, reqVO.getStartTime()); | |
| 22 | + if (Boolean.TRUE.equals(reqVO.getSuccess())) { | |
| 23 | + query.eq(OperateLogV2DO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode()); | |
| 24 | + } else if (Boolean.FALSE.equals(reqVO.getSuccess())) { | |
| 25 | + query.gt(OperateLogV2DO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode()); | |
| 26 | + } | |
| 27 | + query.orderByDesc(OperateLogV2DO::getId); // 降序 | |
| 28 | + return selectPage(reqVO, query); | |
| 29 | + } | |
| 30 | + | |
| 31 | +} | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/config/YudaoOperateLogV2Configuration.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.framework.bizlog.config; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; | |
| 4 | +import cn.iocoder.yudao.module.system.api.logger.OperateLogApi; | |
| 5 | +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | |
| 6 | +import cn.iocoder.yudao.module.system.framework.bizlog.service.AdminUserParseFunction; | |
| 7 | +import cn.iocoder.yudao.module.system.framework.bizlog.service.ILogRecordServiceImpl; | |
| 8 | +import com.mzt.logapi.beans.Operator; | |
| 9 | +import com.mzt.logapi.service.IOperatorGetService; | |
| 10 | +import com.mzt.logapi.starter.annotation.EnableLogRecord; | |
| 11 | +import lombok.extern.slf4j.Slf4j; | |
| 12 | +import org.springframework.context.annotation.Bean; | |
| 13 | +import org.springframework.context.annotation.Configuration; | |
| 14 | + | |
| 15 | +import java.util.Optional; | |
| 16 | + | |
| 17 | + | |
| 18 | +/** | |
| 19 | + * 使用 @Configuration 是因为 mzt-biz-log 的配置类是 @Configuration 的 | |
| 20 | + * | |
| 21 | + * @author HUIHUI | |
| 22 | + */ | |
| 23 | +@Configuration(proxyBeanMethods = false) | |
| 24 | +@EnableLogRecord(tenant = "${yudao.info.base-package}") | |
| 25 | +@Slf4j | |
| 26 | +public class YudaoOperateLogV2Configuration { | |
| 27 | + | |
| 28 | + //======================= mzt-biz-log ======================= | |
| 29 | + | |
| 30 | + @Bean | |
| 31 | + public ILogRecordServiceImpl iLogRecordServiceImpl(OperateLogApi operateLogApi) { | |
| 32 | + log.info("ILogRecordServiceImpl 初始化"); | |
| 33 | + return new ILogRecordServiceImpl(operateLogApi); | |
| 34 | + } | |
| 35 | + | |
| 36 | + @Bean | |
| 37 | + public IOperatorGetService operatorGetLoginUserIdService() { | |
| 38 | + // 获取操作用户编号 | |
| 39 | + return () -> Optional.of(WebFrameworkUtils.getLoginUserId()) | |
| 40 | + .map(a -> { | |
| 41 | + Operator operator = new Operator(); | |
| 42 | + operator.setOperatorId(a.toString()); | |
| 43 | + return operator; | |
| 44 | + }) | |
| 45 | + .orElseThrow(() -> new IllegalArgumentException("user is null")); | |
| 46 | + } | |
| 47 | + | |
| 48 | + @Bean | |
| 49 | + public AdminUserParseFunction adminUserParseFunction(AdminUserApi adminUserApi) { | |
| 50 | + return new AdminUserParseFunction(adminUserApi); | |
| 51 | + } | |
| 52 | + | |
| 53 | +} | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/package-info.java
0 → 100644
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/service/AdminUserParseFunction.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.framework.bizlog.service; | |
| 2 | + | |
| 3 | +import cn.hutool.core.util.ObjUtil; | |
| 4 | +import cn.hutool.core.util.StrUtil; | |
| 5 | +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | |
| 6 | +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; | |
| 7 | +import com.mzt.logapi.service.IParseFunction; | |
| 8 | +import lombok.RequiredArgsConstructor; | |
| 9 | +import lombok.extern.slf4j.Slf4j; | |
| 10 | + | |
| 11 | +/** | |
| 12 | + * 自定义函数-通过用户编号获取用户信息 | |
| 13 | + * | |
| 14 | + * @author HUIHUI | |
| 15 | + */ | |
| 16 | +@Slf4j | |
| 17 | +@RequiredArgsConstructor | |
| 18 | +public class AdminUserParseFunction implements IParseFunction { | |
| 19 | + | |
| 20 | + private final AdminUserApi adminUserApi; | |
| 21 | + | |
| 22 | + @Override | |
| 23 | + public boolean executeBefore() { | |
| 24 | + return true; | |
| 25 | + } | |
| 26 | + | |
| 27 | + @Override | |
| 28 | + public String functionName() { | |
| 29 | + return "getAdminUserById"; | |
| 30 | + } | |
| 31 | + | |
| 32 | + @Override | |
| 33 | + public String apply(Object value) { | |
| 34 | + if (value == null) { | |
| 35 | + log.warn("(getAdminUserById) 解析异常参数为 null"); | |
| 36 | + return ""; | |
| 37 | + } | |
| 38 | + if (StrUtil.isEmpty(value.toString())) { | |
| 39 | + log.warn("(getAdminUserById) 解析异常参数为空"); | |
| 40 | + return ""; | |
| 41 | + } | |
| 42 | + | |
| 43 | + // 获取用户信息 | |
| 44 | + AdminUserRespDTO user = adminUserApi.getUser(Long.parseLong(value.toString())); | |
| 45 | + if (user == null) { | |
| 46 | + log.warn("(getAdminUserById) 获取用户信息失败,参数为:{}", value); | |
| 47 | + return ""; | |
| 48 | + } | |
| 49 | + // 返回格式 芋道源码(13888888888) | |
| 50 | + String nickname = user.getNickname(); | |
| 51 | + if (ObjUtil.isNotEmpty(user.getMobile())) { | |
| 52 | + return nickname.concat("(").concat(user.getMobile()).concat(")"); | |
| 53 | + } | |
| 54 | + return nickname; | |
| 55 | + } | |
| 56 | +} | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/service/ILogRecordServiceImpl.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.framework.bizlog.service; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.module.system.api.logger.OperateLogApi; | |
| 4 | +import com.mzt.logapi.beans.LogRecord; | |
| 5 | +import com.mzt.logapi.service.ILogRecordService; | |
| 6 | +import lombok.RequiredArgsConstructor; | |
| 7 | +import lombok.extern.slf4j.Slf4j; | |
| 8 | + | |
| 9 | +import java.util.Collections; | |
| 10 | +import java.util.List; | |
| 11 | + | |
| 12 | +/** | |
| 13 | + * 操作日志 ILogRecordService 实现类 | |
| 14 | + * | |
| 15 | + * 基于 {@link OperateLogApi} 实现,记录操作日志 | |
| 16 | + * | |
| 17 | + * @author HUIHUI | |
| 18 | + */ | |
| 19 | +@Slf4j | |
| 20 | +@RequiredArgsConstructor | |
| 21 | +public class ILogRecordServiceImpl implements ILogRecordService { | |
| 22 | + | |
| 23 | + private final OperateLogApi operateLogApi; | |
| 24 | + | |
| 25 | + @Override | |
| 26 | + public void record(LogRecord logRecord) { | |
| 27 | + log.info("【logRecord】log={}", logRecord); | |
| 28 | + } | |
| 29 | + | |
| 30 | + @Override | |
| 31 | + public List<LogRecord> queryLog(String bizNo, String type) { | |
| 32 | + return Collections.emptyList(); | |
| 33 | + } | |
| 34 | + | |
| 35 | + @Override | |
| 36 | + public List<LogRecord> queryLogByBizNo(String bizNo, String type, String subType) { | |
| 37 | + return Collections.emptyList(); | |
| 38 | + } | |
| 39 | +} | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogService.java
| ... | ... | @@ -20,6 +20,13 @@ public interface OperateLogService { |
| 20 | 20 | void createOperateLog(OperateLogCreateReqDTO createReqDTO); |
| 21 | 21 | |
| 22 | 22 | /** |
| 23 | + * 记录操作日志 V2 | |
| 24 | + * | |
| 25 | + * @param createReqDTO 操作日志请求 | |
| 26 | + */ | |
| 27 | + void createOperateLogV2(OperateLogCreateReqDTO createReqDTO); | |
| 28 | + | |
| 29 | + /** | |
| 23 | 30 | * 获得操作日志分页列表 |
| 24 | 31 | * |
| 25 | 32 | * @param pageReqVO 分页条件 | ... | ... |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java
| ... | ... | @@ -8,14 +8,16 @@ import cn.iocoder.yudao.framework.common.util.string.StrUtils; |
| 8 | 8 | import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO; |
| 9 | 9 | import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; |
| 10 | 10 | import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; |
| 11 | +import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO; | |
| 11 | 12 | import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; |
| 12 | 13 | import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper; |
| 14 | +import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogV2Mapper; | |
| 13 | 15 | import cn.iocoder.yudao.module.system.service.user.AdminUserService; |
| 16 | +import jakarta.annotation.Resource; | |
| 14 | 17 | import lombok.extern.slf4j.Slf4j; |
| 15 | 18 | import org.springframework.stereotype.Service; |
| 16 | 19 | import org.springframework.validation.annotation.Validated; |
| 17 | 20 | |
| 18 | -import jakarta.annotation.Resource; | |
| 19 | 21 | import java.util.Collection; |
| 20 | 22 | |
| 21 | 23 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| ... | ... | @@ -34,6 +36,8 @@ public class OperateLogServiceImpl implements OperateLogService { |
| 34 | 36 | |
| 35 | 37 | @Resource |
| 36 | 38 | private OperateLogMapper operateLogMapper; |
| 39 | + @Resource | |
| 40 | + private OperateLogV2Mapper operateLogV2Mapper; | |
| 37 | 41 | |
| 38 | 42 | @Resource |
| 39 | 43 | private AdminUserService userService; |
| ... | ... | @@ -47,6 +51,14 @@ public class OperateLogServiceImpl implements OperateLogService { |
| 47 | 51 | } |
| 48 | 52 | |
| 49 | 53 | @Override |
| 54 | + public void createOperateLogV2(OperateLogCreateReqDTO createReqDTO) { | |
| 55 | + OperateLogV2DO log = BeanUtils.toBean(createReqDTO, OperateLogV2DO.class); | |
| 56 | + log.setJavaMethodArgs(StrUtils.maxLength(log.getJavaMethodArgs(), JAVA_METHOD_ARGS_MAX_LENGTH)); | |
| 57 | + log.setResultData(StrUtils.maxLength(log.getResultData(), RESULT_MAX_LENGTH)); | |
| 58 | + operateLogV2Mapper.insert(log); | |
| 59 | + } | |
| 60 | + | |
| 61 | + @Override | |
| 50 | 62 | public PageResult<OperateLogDO> getOperateLogPage(OperateLogPageReqVO pageReqVO) { |
| 51 | 63 | // 处理基于用户昵称的查询 |
| 52 | 64 | Collection<Long> userIds = null; | ... | ... |