Commit 3bab9748db4d7e0661afaf365b3789966223145d

Authored by puhui999
1 parent ddb6fe7e

系统操作日志:使用自定义 starter 的方式重新集成 mzt-biz-log

Showing 21 changed files with 187 additions and 128 deletions
yudao-dependencies/pom.xml
@@ -26,7 +26,7 @@ @@ -26,7 +26,7 @@
26 <mybatis-plus.version>3.5.4.1</mybatis-plus.version> 26 <mybatis-plus.version>3.5.4.1</mybatis-plus.version>
27 <mybatis-plus-generator.version>3.5.4.1</mybatis-plus-generator.version> 27 <mybatis-plus-generator.version>3.5.4.1</mybatis-plus-generator.version>
28 <dynamic-datasource.version>4.2.0</dynamic-datasource.version> 28 <dynamic-datasource.version>4.2.0</dynamic-datasource.version>
29 - <mybatis-plus-join.version>1.4.7.2</mybatis-plus-join.version> 29 + <mybatis-plus-join.version>1.4.8.1</mybatis-plus-join.version>
30 <redisson.version>3.25.0</redisson.version> 30 <redisson.version>3.25.0</redisson.version>
31 <dm8.jdbc.version>8.1.3.62</dm8.jdbc.version> 31 <dm8.jdbc.version>8.1.3.62</dm8.jdbc.version>
32 <!-- 消息队列 --> 32 <!-- 消息队列 -->
yudao-framework/yudao-spring-boot-starter-biz-operatelog/pom.xml
@@ -46,6 +46,13 @@ @@ -46,6 +46,13 @@
46 <groupId>com.google.guava</groupId> 46 <groupId>com.google.guava</groupId>
47 <artifactId>guava</artifactId> 47 <artifactId>guava</artifactId>
48 </dependency> 48 </dependency>
  49 + <!-- Springboot-注解-通用操作日志组件 -->
  50 + <!-- 此组件解决的问题是: 「谁」在「什么时间」对「什么」做了「什么事」 -->
  51 + <dependency>
  52 + <groupId>io.github.mouzt</groupId>
  53 + <artifactId>bizlog-sdk</artifactId>
  54 + </dependency>
  55 +
49 </dependencies> 56 </dependencies>
50 57
51 </project> 58 </project>
yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelogv2/config/YudaoOperateLogV2Configuration.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.operatelogv2.config;
  2 +
  3 +import cn.iocoder.yudao.framework.operatelogv2.core.service.ILogRecordServiceImpl;
  4 +import cn.iocoder.yudao.module.system.api.logger.OperateLogApi;
  5 +import com.mzt.logapi.service.ILogRecordService;
  6 +import com.mzt.logapi.starter.annotation.EnableLogRecord;
  7 +import lombok.extern.slf4j.Slf4j;
  8 +import org.springframework.boot.autoconfigure.AutoConfiguration;
  9 +import org.springframework.context.annotation.Bean;
  10 +import org.springframework.context.annotation.Primary;
  11 +
  12 +/**
  13 + * mzt-biz-log 配置类
  14 + *
  15 + * @author HUIHUI
  16 + */
  17 +@EnableLogRecord(tenant = "") // 貌似用不上 tenant 这玩意给个空好啦
  18 +@AutoConfiguration
  19 +@Slf4j
  20 +public class YudaoOperateLogV2Configuration {
  21 +
  22 + @Bean
  23 + @Primary
  24 + public ILogRecordService iLogRecordServiceImpl(OperateLogApi operateLogApi) {
  25 + return new ILogRecordServiceImpl(operateLogApi);
  26 + }
  27 +
  28 +}
yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelogv2/core/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.operatelogv2.core;
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/ILogRecordServiceImpl.java renamed to yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelogv2/core/service/ILogRecordServiceImpl.java
1 -package cn.iocoder.yudao.module.system.framework.bizlog.service; 1 +package cn.iocoder.yudao.framework.operatelogv2.core.service;
2 2
3 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils; 3 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
4 import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; 4 import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
5 import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; 5 import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
6 -import cn.iocoder.yudao.module.system.service.logger.OperateLogService;  
7 -import cn.iocoder.yudao.module.system.service.logger.bo.OperateLogV2CreateReqBO; 6 +import cn.iocoder.yudao.module.system.api.logger.OperateLogApi;
  7 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2CreateReqDTO;
8 import com.mzt.logapi.beans.LogRecord; 8 import com.mzt.logapi.beans.LogRecord;
9 import com.mzt.logapi.service.ILogRecordService; 9 import com.mzt.logapi.service.ILogRecordService;
10 -import jakarta.annotation.Resource;  
11 import jakarta.servlet.http.HttpServletRequest; 10 import jakarta.servlet.http.HttpServletRequest;
  11 +import lombok.RequiredArgsConstructor;
12 import lombok.extern.slf4j.Slf4j; 12 import lombok.extern.slf4j.Slf4j;
13 -import org.springframework.stereotype.Service;  
14 13
15 import java.util.Collections; 14 import java.util.Collections;
16 import java.util.List; 15 import java.util.List;
17 16
18 -// TODO @puhui999:这个应该搞到 operatelog 组件里哈;  
19 /** 17 /**
20 * 操作日志 ILogRecordService 实现类 18 * 操作日志 ILogRecordService 实现类
21 * 19 *
22 - * 基于 {@link OperateLogService} 实现,记录操作日志 20 + * 基于 {@link OperateLogApi} 实现,记录操作日志
23 * 21 *
24 * @author HUIHUI 22 * @author HUIHUI
25 */ 23 */
26 @Slf4j 24 @Slf4j
27 -@Service 25 +@RequiredArgsConstructor
28 public class ILogRecordServiceImpl implements ILogRecordService { 26 public class ILogRecordServiceImpl implements ILogRecordService {
29 27
30 - @Resource  
31 - private OperateLogService operateLogService; 28 + private final OperateLogApi operateLogApi;
32 29
33 @Override 30 @Override
34 public void record(LogRecord logRecord) { 31 public void record(LogRecord logRecord) {
35 - OperateLogV2CreateReqBO reqBO = new OperateLogV2CreateReqBO(); 32 + OperateLogV2CreateReqDTO reqBO = new OperateLogV2CreateReqDTO();
36 // 补全通用字段 33 // 补全通用字段
37 reqBO.setTraceId(TracerUtils.getTraceId()); 34 reqBO.setTraceId(TracerUtils.getTraceId());
38 // 补充用户信息 35 // 补充用户信息
@@ -42,24 +39,24 @@ public class ILogRecordServiceImpl implements ILogRecordService { @@ -42,24 +39,24 @@ public class ILogRecordServiceImpl implements ILogRecordService {
42 // 补全请求信息 39 // 补全请求信息
43 fillRequestFields(reqBO); 40 fillRequestFields(reqBO);
44 // 异步记录日志 41 // 异步记录日志
45 - operateLogService.createOperateLogV2(reqBO); 42 + operateLogApi.createOperateLogV2(reqBO);
46 log.info("操作日志 ===> {}", reqBO); 43 log.info("操作日志 ===> {}", reqBO);
47 } 44 }
48 45
49 - private static void fillUserFields(OperateLogV2CreateReqBO reqBO) { 46 + private static void fillUserFields(OperateLogV2CreateReqDTO reqBO) {
50 reqBO.setUserId(WebFrameworkUtils.getLoginUserId()); 47 reqBO.setUserId(WebFrameworkUtils.getLoginUserId());
51 reqBO.setUserType(WebFrameworkUtils.getLoginUserType()); 48 reqBO.setUserType(WebFrameworkUtils.getLoginUserType());
52 } 49 }
53 50
54 - public static void fillModuleFields(OperateLogV2CreateReqBO reqBO, LogRecord logRecord) {  
55 - reqBO.setModule(logRecord.getType()); // 大模块类型如 crm-客户  
56 - reqBO.setName(logRecord.getSubType());// 操作名称如 转移客户 51 + public static void fillModuleFields(OperateLogV2CreateReqDTO reqBO, LogRecord logRecord) {
  52 + reqBO.setType(logRecord.getType()); // 大模块类型如 crm-客户
  53 + reqBO.setSubType(logRecord.getSubType());// 操作名称如 转移客户
57 reqBO.setBizId(Long.parseLong(logRecord.getBizNo())); // 操作模块业务编号 54 reqBO.setBizId(Long.parseLong(logRecord.getBizNo())); // 操作模块业务编号
58 reqBO.setContent(logRecord.getAction());// 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。 55 reqBO.setContent(logRecord.getAction());// 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。
59 reqBO.setExtra(logRecord.getExtra()); // 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 ),例如说,记录订单编号,{ orderId: "1"} 56 reqBO.setExtra(logRecord.getExtra()); // 拓展字段,有些复杂的业务,需要记录一些字段 ( JSON 格式 ),例如说,记录订单编号,{ orderId: "1"}
60 } 57 }
61 58
62 - private static void fillRequestFields(OperateLogV2CreateReqBO reqBO) { 59 + private static void fillRequestFields(OperateLogV2CreateReqDTO reqBO) {
63 // 获得 Request 对象 60 // 获得 Request 对象
64 HttpServletRequest request = ServletUtils.getRequest(); 61 HttpServletRequest request = ServletUtils.getRequest();
65 if (request == null) { 62 if (request == null) {
yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelogv2/core/vo/OperateLogV2PageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.operatelogv2.core.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +
  7 +@Schema(description = "管理后台 - 操作日志分页 Request VO")
  8 +@Data
  9 +public class OperateLogV2PageReqVO extends PageParam {
  10 +
  11 + @Schema(description = "模块数据编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  12 + private Long bizId;
  13 +
  14 + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  15 + private Long userId;
  16 +
  17 + @Schema(description = "模块类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  18 + private String bizType;
  19 +
  20 +}
yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/java/cn/iocoder/yudao/framework/operatelogv2/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.operatelogv2;
0 \ No newline at end of file 2 \ No newline at end of file
yudao-framework/yudao-spring-boot-starter-biz-operatelog/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
1 -cn.iocoder.yudao.framework.operatelog.config.YudaoOperateLogAutoConfiguration  
2 \ No newline at end of file 1 \ No newline at end of file
  2 +cn.iocoder.yudao.framework.operatelog.config.YudaoOperateLogAutoConfiguration
  3 +cn.iocoder.yudao.framework.operatelogv2.config.YudaoOperateLogV2Configuration
3 \ No newline at end of file 4 \ No newline at end of file
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/LogRecordConstants.java
@@ -22,6 +22,5 @@ public interface LogRecordConstants { @@ -22,6 +22,5 @@ public interface LogRecordConstants {
22 //======================= 客户转移操作日志 ======================= 22 //======================= 客户转移操作日志 =======================
23 23
24 String TRANSFER_CUSTOMER_LOG_SUCCESS = "把客户【{{#crmCustomer.name}}】的负责人从【{getAdminUserById{#crmCustomer.ownerUserId}}】变更为了【{getAdminUserById{#reqVO.newOwnerUserId}}】"; 24 String TRANSFER_CUSTOMER_LOG_SUCCESS = "把客户【{{#crmCustomer.name}}】的负责人从【{getAdminUserById{#crmCustomer.ownerUserId}}】变更为了【{getAdminUserById{#reqVO.newOwnerUserId}}】";
25 - String TRANSFER_CUSTOMER_LOG_FAIL = ""; // TODO @puhui999:这个可以删除哈,一般不搞失败的日志  
26 25
27 } 26 }
yudao-module-system/yudao-module-system-api/pom.xml
@@ -22,32 +22,12 @@ @@ -22,32 +22,12 @@
22 <artifactId>yudao-common</artifactId> 22 <artifactId>yudao-common</artifactId>
23 </dependency> 23 </dependency>
24 24
25 - <!-- TODO @puhui999 & 芋艿:操作日志,要不要这么引入? -->  
26 - <!-- Springboot-注解-通用操作日志组件 -->  
27 - <!-- 此组件解决的问题是: 「谁」在「什么时间」对「什么」做了「什么事」 -->  
28 - <dependency>  
29 - <groupId>io.github.mouzt</groupId>  
30 - <artifactId>bizlog-sdk</artifactId>  
31 - </dependency>  
32 -  
33 - <!-- TODO @puhui999 & 芋艿:要不要移除掉 -->  
34 - <!--工具类相关-->  
35 - <dependency>  
36 - <groupId>com.fasterxml.jackson.core</groupId>  
37 - <artifactId>jackson-databind</artifactId>  
38 - </dependency>  
39 - <dependency>  
40 - <groupId>com.fasterxml.jackson.core</groupId>  
41 - <artifactId>jackson-core</artifactId>  
42 - </dependency>  
43 -  
44 <!-- 参数校验 --> 25 <!-- 参数校验 -->
45 <dependency> 26 <dependency>
46 <groupId>org.springframework.boot</groupId> 27 <groupId>org.springframework.boot</groupId>
47 <artifactId>spring-boot-starter-validation</artifactId> 28 <artifactId>spring-boot-starter-validation</artifactId>
48 <optional>true</optional> 29 <optional>true</optional>
49 </dependency> 30 </dependency>
50 -  
51 </dependencies> 31 </dependencies>
52 32
53 </project> 33 </project>
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/OperateLogApi.java
1 package cn.iocoder.yudao.module.system.api.logger; 1 package cn.iocoder.yudao.module.system.api.logger;
2 2
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
3 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO; 4 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
  5 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2CreateReqDTO;
  6 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2PageReqDTO;
4 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2RespDTO; 7 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2RespDTO;
5 import jakarta.validation.Valid; 8 import jakarta.validation.Valid;
6 9
7 -import java.util.List;  
8 -  
9 /** 10 /**
10 * 操作日志 API 接口 11 * 操作日志 API 接口
11 * 12 *
@@ -21,12 +22,18 @@ public interface OperateLogApi { @@ -21,12 +22,18 @@ public interface OperateLogApi {
21 void createOperateLog(@Valid OperateLogCreateReqDTO createReqDTO); 22 void createOperateLog(@Valid OperateLogCreateReqDTO createReqDTO);
22 23
23 /** 24 /**
24 - * 获取指定模块的指定数据的操作日志 25 + * 创建操作日志
  26 + *
  27 + * @param createReqDTO 请求
  28 + */
  29 + void createOperateLogV2(@Valid OperateLogV2CreateReqDTO createReqDTO);
  30 +
  31 + /**
  32 + * 获取指定模块的指定数据的操作日志分页
25 * 33 *
26 - * @param module 操作模块  
27 - * @param bizId 操作模块编号  
28 - * @return 操作日志 34 + * @param pageReqVO 请求
  35 + * @return 操作日志分页
29 */ 36 */
30 - List<OperateLogV2RespDTO> getOperateLogByModuleAndBizId(String module, Long bizId); 37 + PageResult<OperateLogV2RespDTO> getOperateLogPage(OperateLogV2PageReqDTO pageReqVO);
31 38
32 } 39 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/logger/bo/OperateLogV2CreateReqBO.java renamed to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/dto/OperateLogV2CreateReqDTO.java
1 -package cn.iocoder.yudao.module.system.service.logger.bo; 1 +package cn.iocoder.yudao.module.system.api.logger.dto;
2 2
3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; 3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 import jakarta.validation.constraints.NotEmpty; 4 import jakarta.validation.constraints.NotEmpty;
  5 +import jakarta.validation.constraints.NotNull;
5 import lombok.Data; 6 import lombok.Data;
6 7
7 /** 8 /**
@@ -10,7 +11,7 @@ import lombok.Data; @@ -10,7 +11,7 @@ import lombok.Data;
10 * @author HUIHUI 11 * @author HUIHUI
11 */ 12 */
12 @Data 13 @Data
13 -public class OperateLogV2CreateReqBO { 14 +public class OperateLogV2CreateReqDTO {
14 15
15 /** 16 /**
16 * 链路追踪编号 17 * 链路追踪编号
@@ -23,29 +24,29 @@ public class OperateLogV2CreateReqBO { @@ -23,29 +24,29 @@ public class OperateLogV2CreateReqBO {
23 * 24 *
24 * 关联 MemberUserDO 的 id 属性,或者 AdminUserDO 的 id 属性 25 * 关联 MemberUserDO 的 id 属性,或者 AdminUserDO 的 id 属性
25 */ 26 */
26 - @NotEmpty(message = "用户编号不能为空") 27 + @NotNull(message = "用户编号不能为空")
27 private Long userId; 28 private Long userId;
28 /** 29 /**
29 * 用户类型 30 * 用户类型
30 * 31 *
31 * 关联 {@link UserTypeEnum} 32 * 关联 {@link UserTypeEnum}
32 */ 33 */
33 - @NotEmpty(message = "用户类型不能为空") 34 + @NotNull(message = "用户类型不能为空")
34 private Integer userType; 35 private Integer userType;
35 /** 36 /**
36 - * 操作模块 37 + * 操作模块类型
37 */ 38 */
38 - @NotEmpty(message = "操作模块不能为空")  
39 - private String module; 39 + @NotEmpty(message = "操作模块类型不能为空")
  40 + private String type;
40 /** 41 /**
41 * 操作名 42 * 操作名
42 */ 43 */
43 @NotEmpty(message = "操作名不能为空") 44 @NotEmpty(message = "操作名不能为空")
44 - private String name; 45 + private String subType;
45 /** 46 /**
46 * 操作模块业务编号 47 * 操作模块业务编号
47 */ 48 */
48 - @NotEmpty(message = "操作模块业务编号不能为空") 49 + @NotNull(message = "操作模块业务编号不能为空")
49 private Long bizId; 50 private Long bizId;
50 /** 51 /**
51 * 操作内容,记录整个操作的明细 52 * 操作内容,记录整个操作的明细
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/dto/OperateLogV2PageReqDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.api.logger.dto;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import lombok.Data;
  5 +
  6 +/**
  7 + * 操作日志分页 Request DTO
  8 + *
  9 + * @author HUIHUI
  10 + */
  11 +@Data
  12 +public class OperateLogV2PageReqDTO extends PageParam {
  13 +
  14 + /**
  15 + * 模块类型
  16 + */
  17 + private String bizType;
  18 + /**
  19 + * 模块数据编号
  20 + */
  21 + private Long bizId;
  22 +
  23 + /**
  24 + * 用户编号
  25 + */
  26 + private Long userId;
  27 +
  28 +}
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/logger/dto/OperateLogV2RespDTO.java
1 package cn.iocoder.yudao.module.system.api.logger.dto; 1 package cn.iocoder.yudao.module.system.api.logger.dto;
2 2
3 -import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;  
4 -import com.fasterxml.jackson.annotation.JsonFormat;  
5 import lombok.Data; 3 import lombok.Data;
6 4
7 -import java.time.LocalDateTime;  
8 -  
9 -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;  
10 -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT;  
11 -  
12 /** 5 /**
13 * 系统操作日志 Resp DTO 6 * 系统操作日志 Resp DTO
14 * 7 *
@@ -26,6 +19,10 @@ public class OperateLogV2RespDTO { @@ -26,6 +19,10 @@ public class OperateLogV2RespDTO {
26 */ 19 */
27 private Long userId; 20 private Long userId;
28 /** 21 /**
  22 + * 用户名称
  23 + */
  24 + private String userName;
  25 + /**
29 * 用户类型 26 * 用户类型
30 */ 27 */
31 private Integer userType; 28 private Integer userType;
@@ -68,20 +65,8 @@ public class OperateLogV2RespDTO { @@ -68,20 +65,8 @@ public class OperateLogV2RespDTO {
68 private String userAgent; 65 private String userAgent;
69 66
70 /** 67 /**
71 - * 创建时间  
72 - */  
73 - // TODO puhui999: 木得效果怎么肥事  
74 - @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT)  
75 - private LocalDateTime createTime;  
76 -  
77 - // TODO @puhui999:下面 2 个字段不用返回;用 userId 哈;返回一个 userName  
78 - /**  
79 - * 创建者  
80 - */  
81 - private String creator;  
82 - /**  
83 - * 创建者名称 68 + * 创建时间, 直接返回字符串
84 */ 69 */
85 - private String creatorName; 70 + private String createTime;
86 71
87 } 72 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/logger/OperateLogApiImpl.java
1 package cn.iocoder.yudao.module.system.api.logger; 1 package cn.iocoder.yudao.module.system.api.logger;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO; 6 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
  7 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2CreateReqDTO;
  8 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2PageReqDTO;
6 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2RespDTO; 9 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2RespDTO;
  10 +import cn.iocoder.yudao.module.system.convert.logger.OperateLogConvert;
7 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO; 11 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO;
8 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; 12 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
9 import cn.iocoder.yudao.module.system.service.logger.OperateLogService; 13 import cn.iocoder.yudao.module.system.service.logger.OperateLogService;
10 import cn.iocoder.yudao.module.system.service.user.AdminUserService; 14 import cn.iocoder.yudao.module.system.service.user.AdminUserService;
11 import jakarta.annotation.Resource; 15 import jakarta.annotation.Resource;
  16 +import org.springframework.scheduling.annotation.Async;
12 import org.springframework.stereotype.Service; 17 import org.springframework.stereotype.Service;
13 import org.springframework.validation.annotation.Validated; 18 import org.springframework.validation.annotation.Validated;
14 19
15 -import java.util.Collections;  
16 import java.util.List; 20 import java.util.List;
17 import java.util.Map; 21 import java.util.Map;
18 22
@@ -39,21 +43,31 @@ public class OperateLogApiImpl implements OperateLogApi { @@ -39,21 +43,31 @@ public class OperateLogApiImpl implements OperateLogApi {
39 } 43 }
40 44
41 @Override 45 @Override
42 - public List<OperateLogV2RespDTO> getOperateLogByModuleAndBizId(String module, Long bizId) {  
43 - List<OperateLogV2DO> logList = operateLogService.getOperateLogByModuleAndBizId(module, bizId);  
44 - if (CollUtil.isEmpty(logList)) {  
45 - return Collections.emptyList(); 46 + @Async
  47 + public void createOperateLogV2(OperateLogV2CreateReqDTO createReqDTO) {
  48 + operateLogService.createOperateLogV2(createReqDTO);
  49 + }
  50 +
  51 + @Override
  52 + public PageResult<OperateLogV2RespDTO> getOperateLogPage(OperateLogV2PageReqDTO pageReqVO) {
  53 + PageResult<OperateLogV2DO> operateLogPage = operateLogService.getOperateLogPage(pageReqVO);
  54 + if (CollUtil.isEmpty(operateLogPage.getList())) {
  55 + return PageResult.empty();
46 } 56 }
47 57
48 // 获取用户 58 // 获取用户
49 - List<AdminUserDO> userList = adminUserService.getUserList(convertSet(logList, item -> Long.parseLong(item.getCreator()))); 59 + List<AdminUserDO> userList = adminUserService.getUserList(convertSet(operateLogPage.getList(), OperateLogV2DO::getUserId));
  60 + return BeanUtils.toBean(operateLogPage, OperateLogV2RespDTO.class).setList(setUserInfo(operateLogPage.getList(), userList));
  61 + }
  62 +
  63 + private static List<OperateLogV2RespDTO> setUserInfo(List<OperateLogV2DO> logList, List<AdminUserDO> userList) {
50 Map<Long, AdminUserDO> userMap = convertMap(userList, AdminUserDO::getId); 64 Map<Long, AdminUserDO> userMap = convertMap(userList, AdminUserDO::getId);
51 return convertList(logList, item -> { 65 return convertList(logList, item -> {
52 - OperateLogV2RespDTO bean = BeanUtils.toBean(item, OperateLogV2RespDTO.class);  
53 - findAndThen(userMap, Long.parseLong(item.getCreator()), user -> {  
54 - bean.setCreatorName(user.getNickname()); 66 + OperateLogV2RespDTO respDTO = OperateLogConvert.INSTANCE.convert(item);
  67 + findAndThen(userMap, item.getUserId(), user -> {
  68 + respDTO.setUserName(user.getNickname());
55 }); 69 });
56 - return bean; 70 + return respDTO;
57 }); 71 });
58 } 72 }
59 73
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/logger/OperateLogConvert.java
@@ -3,15 +3,20 @@ package cn.iocoder.yudao.module.system.convert.logger; @@ -3,15 +3,20 @@ package cn.iocoder.yudao.module.system.convert.logger;
3 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 3 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
4 import cn.iocoder.yudao.framework.common.util.collection.MapUtils; 4 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  6 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2RespDTO;
6 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO; 7 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO;
7 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; 8 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
  9 +import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO;
8 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; 10 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
9 import org.mapstruct.Mapper; 11 import org.mapstruct.Mapper;
  12 +import org.mapstruct.Mapping;
10 import org.mapstruct.factory.Mappers; 13 import org.mapstruct.factory.Mappers;
11 14
12 import java.util.List; 15 import java.util.List;
13 import java.util.Map; 16 import java.util.Map;
14 17
  18 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  19 +
15 @Mapper 20 @Mapper
16 public interface OperateLogConvert { 21 public interface OperateLogConvert {
17 22
@@ -25,4 +30,7 @@ public interface OperateLogConvert { @@ -25,4 +30,7 @@ public interface OperateLogConvert {
25 }); 30 });
26 } 31 }
27 32
  33 + @Mapping(target = "createTime", source = "logV2DO.createTime", dateFormat = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  34 + OperateLogV2RespDTO convert(OperateLogV2DO logV2DO);
  35 +
28 } 36 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/logger/OperateLogV2DO.java
@@ -42,15 +42,14 @@ public class OperateLogV2DO extends BaseDO { @@ -42,15 +42,14 @@ public class OperateLogV2DO extends BaseDO {
42 * 关联 {@link UserTypeEnum} 42 * 关联 {@link UserTypeEnum}
43 */ 43 */
44 private Integer userType; 44 private Integer userType;
45 - // TODO @puhui999:module 改成 type,name 改成 subType;  
46 /** 45 /**
47 - * 操作模块 46 + * 操作模块类型
48 */ 47 */
49 - private String module; 48 + private String type;
50 /** 49 /**
51 * 操作名 50 * 操作名
52 */ 51 */
53 - private String name; 52 + private String subType;
54 /** 53 /**
55 * 操作模块业务编号 54 * 操作模块业务编号
56 */ 55 */
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/logger/OperateLogV2Mapper.java
@@ -3,28 +3,29 @@ package cn.iocoder.yudao.module.system.dal.mysql.logger; @@ -3,28 +3,29 @@ package cn.iocoder.yudao.module.system.dal.mysql.logger;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2PageReqDTO;
6 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; 7 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
7 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO; 8 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO;
8 import org.apache.ibatis.annotations.Mapper; 9 import org.apache.ibatis.annotations.Mapper;
9 10
10 import java.util.Collection; 11 import java.util.Collection;
11 -import java.util.List;  
12 12
13 @Mapper 13 @Mapper
14 public interface OperateLogV2Mapper extends BaseMapperX<OperateLogV2DO> { 14 public interface OperateLogV2Mapper extends BaseMapperX<OperateLogV2DO> {
15 15
16 default PageResult<OperateLogV2DO> selectPage(OperateLogPageReqVO reqVO, Collection<Long> userIds) { 16 default PageResult<OperateLogV2DO> selectPage(OperateLogPageReqVO reqVO, Collection<Long> userIds) {
17 LambdaQueryWrapperX<OperateLogV2DO> query = new LambdaQueryWrapperX<OperateLogV2DO>() 17 LambdaQueryWrapperX<OperateLogV2DO> query = new LambdaQueryWrapperX<OperateLogV2DO>()
18 - .likeIfPresent(OperateLogV2DO::getModule, reqVO.getModule()) 18 + .likeIfPresent(OperateLogV2DO::getType, reqVO.getModule())
19 .inIfPresent(OperateLogV2DO::getUserId, userIds); 19 .inIfPresent(OperateLogV2DO::getUserId, userIds);
20 query.orderByDesc(OperateLogV2DO::getId); // 降序 20 query.orderByDesc(OperateLogV2DO::getId); // 降序
21 return selectPage(reqVO, query); 21 return selectPage(reqVO, query);
22 } 22 }
23 23
24 - default List<OperateLogV2DO> selectListByModuleAndBizId(String module, Long bizId) {  
25 - return selectList(new LambdaQueryWrapperX<OperateLogV2DO>()  
26 - .eq(OperateLogV2DO::getModule, module)  
27 - .eq(OperateLogV2DO::getBizId, bizId) 24 + default PageResult<OperateLogV2DO> selectPage(OperateLogV2PageReqDTO pageReqVO) {
  25 + return selectPage(pageReqVO, new LambdaQueryWrapperX<OperateLogV2DO>()
  26 + .eqIfPresent(OperateLogV2DO::getType, pageReqVO.getBizType())
  27 + .eqIfPresent(OperateLogV2DO::getBizId, pageReqVO.getBizId())
  28 + .eqIfPresent(OperateLogV2DO::getUserId, pageReqVO.getUserId())
28 .orderByDesc(OperateLogV2DO::getCreateTime)); 29 .orderByDesc(OperateLogV2DO::getCreateTime));
29 } 30 }
30 31
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/bizlog/config/YudaoOperateLogV2Configuration.java deleted
1 -package cn.iocoder.yudao.module.system.framework.bizlog.config;  
2 -  
3 -import com.mzt.logapi.starter.annotation.EnableLogRecord;  
4 -import org.springframework.context.annotation.Configuration;  
5 -  
6 -// TODO @puhui999:挪到 yudao-spring-boot-starter-biz-operatelog 下,搞个 cn.iocoder.yudao.framework.operatelogv2;跑通后,我们直接就删除老的实现了;  
7 -/**  
8 - * mzt-biz-log 配置类  
9 - *  
10 - * @author HUIHUI  
11 - */  
12 -@Configuration(proxyBeanMethods = false)  
13 -@EnableLogRecord(tenant = "") // 貌似用不上 tenant 这玩意给个空好啦  
14 -public class YudaoOperateLogV2Configuration {  
15 -  
16 -}  
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogService.java
@@ -2,12 +2,11 @@ package cn.iocoder.yudao.module.system.service.logger; @@ -2,12 +2,11 @@ package cn.iocoder.yudao.module.system.service.logger;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO; 4 import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogCreateReqDTO;
  5 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2CreateReqDTO;
  6 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2PageReqDTO;
5 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; 7 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
6 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; 8 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
7 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO; 9 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO;
8 -import cn.iocoder.yudao.module.system.service.logger.bo.OperateLogV2CreateReqBO;  
9 -  
10 -import java.util.List;  
11 10
12 /** 11 /**
13 * 操作日志 Service 接口 12 * 操作日志 Service 接口
@@ -38,16 +37,14 @@ public interface OperateLogService { @@ -38,16 +37,14 @@ public interface OperateLogService {
38 * 37 *
39 * @param createReqBO 创建请求 38 * @param createReqBO 创建请求
40 */ 39 */
41 - void createOperateLogV2(OperateLogV2CreateReqBO createReqBO); 40 + void createOperateLogV2(OperateLogV2CreateReqDTO createReqBO);
42 41
43 - // TODO @puhui999:module 改成 type  
44 /** 42 /**
45 - * 获取指定模块的指定数据的操作日志 43 + * 获得操作日志分页列表
46 * 44 *
47 - * @param module 操作模块  
48 - * @param bizId 操作模块编号  
49 - * @return 操作日志 45 + * @param pageReqVO 分页条件
  46 + * @return 操作日志分页列表
50 */ 47 */
51 - List<OperateLogV2DO> getOperateLogByModuleAndBizId(String module, Long bizId); 48 + PageResult<OperateLogV2DO> getOperateLogPage(OperateLogV2PageReqDTO pageReqVO);
52 49
53 } 50 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/logger/OperateLogServiceImpl.java
@@ -6,13 +6,14 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -6,13 +6,14 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 import cn.iocoder.yudao.framework.common.util.string.StrUtils; 7 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.api.logger.dto.OperateLogV2CreateReqDTO;
  10 +import cn.iocoder.yudao.module.system.api.logger.dto.OperateLogV2PageReqDTO;
9 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; 11 import cn.iocoder.yudao.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO;
10 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO; 12 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO;
11 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO; 13 import cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogV2DO;
12 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; 14 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
13 import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper; 15 import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogMapper;
14 import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogV2Mapper; 16 import cn.iocoder.yudao.module.system.dal.mysql.logger.OperateLogV2Mapper;
15 -import cn.iocoder.yudao.module.system.service.logger.bo.OperateLogV2CreateReqBO;  
16 import cn.iocoder.yudao.module.system.service.user.AdminUserService; 17 import cn.iocoder.yudao.module.system.service.user.AdminUserService;
17 import jakarta.annotation.Resource; 18 import jakarta.annotation.Resource;
18 import lombok.extern.slf4j.Slf4j; 19 import lombok.extern.slf4j.Slf4j;
@@ -20,7 +21,6 @@ import org.springframework.stereotype.Service; @@ -20,7 +21,6 @@ import org.springframework.stereotype.Service;
20 import org.springframework.validation.annotation.Validated; 21 import org.springframework.validation.annotation.Validated;
21 22
22 import java.util.Collection; 23 import java.util.Collection;
23 -import java.util.List;  
24 24
25 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; 25 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
26 import static cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO.JAVA_METHOD_ARGS_MAX_LENGTH; 26 import static cn.iocoder.yudao.module.system.dal.dataobject.logger.OperateLogDO.JAVA_METHOD_ARGS_MAX_LENGTH;
@@ -69,14 +69,15 @@ public class OperateLogServiceImpl implements OperateLogService { @@ -69,14 +69,15 @@ public class OperateLogServiceImpl implements OperateLogService {
69 // ======================= LOG V2 ======================= 69 // ======================= LOG V2 =======================
70 70
71 @Override 71 @Override
72 - public void createOperateLogV2(OperateLogV2CreateReqBO createReqBO) { 72 + public void createOperateLogV2(OperateLogV2CreateReqDTO createReqBO) {
73 OperateLogV2DO log = BeanUtils.toBean(createReqBO, OperateLogV2DO.class); 73 OperateLogV2DO log = BeanUtils.toBean(createReqBO, OperateLogV2DO.class);
74 operateLogV2Mapper.insert(log); 74 operateLogV2Mapper.insert(log);
75 } 75 }
76 76
  77 +
77 @Override 78 @Override
78 - public List<OperateLogV2DO> getOperateLogByModuleAndBizId(String module, Long bizId) {  
79 - return operateLogV2Mapper.selectListByModuleAndBizId(module, bizId); 79 + public PageResult<OperateLogV2DO> getOperateLogPage(OperateLogV2PageReqDTO pageReqVO) {
  80 + return operateLogV2Mapper.selectPage(pageReqVO);
80 } 81 }
81 82
82 } 83 }