Commit c5cc818a4901024ee950926ef0d4989404495547

Authored by puhui999
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,6 +62,7 @@
62 <jsch.version>0.1.55</jsch.version> 62 <jsch.version>0.1.55</jsch.version>
63 <tika-core.version>2.9.1</tika-core.version> 63 <tika-core.version>2.9.1</tika-core.version>
64 <ip2region.version>2.7.0</ip2region.version> 64 <ip2region.version>2.7.0</ip2region.version>
  65 + <bizlog-sdk.version>3.0.6</bizlog-sdk.version>
65 <!-- 三方云服务相关 --> 66 <!-- 三方云服务相关 -->
66 <okio.version>3.5.0</okio.version> 67 <okio.version>3.5.0</okio.version>
67 <okhttp3.version>4.11.0</okhttp3.version> 68 <okhttp3.version>4.11.0</okhttp3.version>
@@ -100,6 +101,17 @@ @@ -100,6 +101,17 @@
100 <version>${revision}</version> 101 <version>${revision}</version>
101 </dependency> 102 </dependency>
102 <dependency> 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 <groupId>cn.iocoder.boot</groupId> 115 <groupId>cn.iocoder.boot</groupId>
104 <artifactId>yudao-spring-boot-starter-biz-dict</artifactId> 116 <artifactId>yudao-spring-boot-starter-biz-dict</artifactId>
105 <version>${revision}</version> 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 Authorization: Bearer {{token}} 4 Authorization: Bearer {{token}}
4 tenant-id: {{adminTenentId}} 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,14 +17,14 @@ import io.swagger.v3.oas.annotations.Operation;
17 import io.swagger.v3.oas.annotations.Parameter; 17 import io.swagger.v3.oas.annotations.Parameter;
18 import io.swagger.v3.oas.annotations.Parameters; 18 import io.swagger.v3.oas.annotations.Parameters;
19 import io.swagger.v3.oas.annotations.tags.Tag; 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 import org.mapstruct.ap.internal.util.Collections; 23 import org.mapstruct.ap.internal.util.Collections;
21 import org.springframework.security.access.prepost.PreAuthorize; 24 import org.springframework.security.access.prepost.PreAuthorize;
22 import org.springframework.validation.annotation.Validated; 25 import org.springframework.validation.annotation.Validated;
23 import org.springframework.web.bind.annotation.*; 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 import java.io.IOException; 28 import java.io.IOException;
29 import java.util.List; 29 import java.util.List;
30 import java.util.Map; 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,12 +9,15 @@ import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerUpdat
9 import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert; 9 import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert;
10 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; 10 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
11 import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper; 11 import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper;
  12 +import cn.iocoder.yudao.module.crm.enums.LogRecordConstants;
12 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; 13 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
13 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; 14 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
14 import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission; 15 import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
15 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; 16 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
16 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; 17 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
17 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 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 import jakarta.annotation.Resource; 21 import jakarta.annotation.Resource;
19 import org.springframework.stereotype.Service; 22 import org.springframework.stereotype.Service;
20 import org.springframework.transaction.annotation.Transactional; 23 import org.springframework.transaction.annotation.Transactional;
@@ -126,11 +129,14 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { @@ -126,11 +129,14 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
126 129
127 @Override 130 @Override
128 @Transactional(rollbackFor = Exception.class) 131 @Transactional(rollbackFor = Exception.class)
  132 + @LogRecord(success = LogRecordConstants.TRANSFER_CUSTOMER_LOG_SUCCESS,
  133 + type = LogRecordConstants.TRANSFER_CUSTOMER_LOG_TYPE, bizNo = "{{#reqVO.id}}")
129 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#reqVO.id", level = CrmPermissionLevelEnum.OWNER) 134 @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, bizId = "#reqVO.id", level = CrmPermissionLevelEnum.OWNER)
130 public void transferCustomer(CrmCustomerTransferReqVO reqVO, Long userId) { 135 public void transferCustomer(CrmCustomerTransferReqVO reqVO, Long userId) {
131 // 1. 校验客户是否存在 136 // 1. 校验客户是否存在
132 validateCustomer(reqVO.getId()); 137 validateCustomer(reqVO.getId());
133 138
  139 + LogRecordContext.putVariable("crmCustomer", customerMapper.selectById(reqVO.getId()));
134 // 2.1 数据权限转移 140 // 2.1 数据权限转移
135 crmPermissionService.transferPermission( 141 crmPermissionService.transferPermission(
136 CrmCustomerConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType())); 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,6 +22,13 @@
22 <artifactId>yudao-common</artifactId> 22 <artifactId>yudao-common</artifactId>
23 </dependency> 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 <dependency> 33 <dependency>
27 <groupId>org.springframework.boot</groupId> 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
  1 +package cn.iocoder.yudao.module.system.framework.bizlog;
0 \ No newline at end of file 2 \ No newline at end of file
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,6 +20,13 @@ public interface OperateLogService {
20 void createOperateLog(OperateLogCreateReqDTO createReqDTO); 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 * @param pageReqVO 分页条件 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,14 +8,16 @@ import cn.iocoder.yudao.framework.common.util.string.StrUtils;
8 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO; 8 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
9 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; 9 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
10 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; 10 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
  11 +import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO;
11 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; 12 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
12 import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper; 13 import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper;
  14 +import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogV2Mapper;
13 import cn.iocoder.yudao.module.system.service.user.AdminUserService; 15 import cn.iocoder.yudao.module.system.service.user.AdminUserService;
  16 +import jakarta.annotation.Resource;
14 import lombok.extern.slf4j.Slf4j; 17 import lombok.extern.slf4j.Slf4j;
15 import org.springframework.stereotype.Service; 18 import org.springframework.stereotype.Service;
16 import org.springframework.validation.annotation.Validated; 19 import org.springframework.validation.annotation.Validated;
17 20
18 -import jakarta.annotation.Resource;  
19 import java.util.Collection; 21 import java.util.Collection;
20 22
21 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; 23 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -34,6 +36,8 @@ public class OperateLogServiceImpl implements OperateLogService { @@ -34,6 +36,8 @@ public class OperateLogServiceImpl implements OperateLogService {
34 36
35 @Resource 37 @Resource
36 private OperateLogMapper operateLogMapper; 38 private OperateLogMapper operateLogMapper;
  39 + @Resource
  40 + private OperateLogV2Mapper operateLogV2Mapper;
37 41
38 @Resource 42 @Resource
39 private AdminUserService userService; 43 private AdminUserService userService;
@@ -47,6 +51,14 @@ public class OperateLogServiceImpl implements OperateLogService { @@ -47,6 +51,14 @@ public class OperateLogServiceImpl implements OperateLogService {
47 } 51 }
48 52
49 @Override 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 public PageResult<OperateLogDO> getOperateLogPage(OperateLogPageReqVO pageReqVO) { 62 public PageResult<OperateLogDO> getOperateLogPage(OperateLogPageReqVO pageReqVO) {
51 // 处理基于用户昵称的查询 63 // 处理基于用户昵称的查询
52 Collection<Long> userIds = null; 64 Collection<Long> userIds = null;