Merge remote-tracking branch 'origin/master'

This commit is contained in:
efren
2025-07-21 08:34:53 +08:00
10 changed files with 398 additions and 14 deletions

View File

@ -0,0 +1,37 @@
package com.coscoshipping.ebtp.system.kafka.listener;
import cn.hutool.json.JSONUtil;
import com.coscoshipping.ebtp.system.operationlog.entity.SysOperationLog;
import com.coscoshipping.ebtp.system.operationlog.service.ISysOperationLogService;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
import java.util.Optional;
/**
* kafka消费
*
* @author f
*/
@Component
@Slf4j
public class KafkaLogListener {
@Autowired
private ISysOperationLogService sysOperationLogService;
@KafkaListener(topics = "jl_ebtp_log", groupId = "biz-service-ebtp-kafka-consumer")
public void ebtpLog(ConsumerRecord<?, ?> record) {
Optional.ofNullable(record.value())
.ifPresent(msg -> {
System.out.println(msg);
SysOperationLog bean = JSONUtil.toBean(String.valueOf(msg), SysOperationLog.class);
sysOperationLogService.insert(bean);
});
}
}

View File

@ -0,0 +1,124 @@
package com.coscoshipping.ebtp.system.kafka.util;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.exceptions.ExceptionUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
/**
* json util
*
* @author 付庆吉
* @date 2020-09-16
*/
@Slf4j
public class JsonUtils {
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
* 将对象转换成json字符串。
* <p>Title: pojoToJson</p>
* <p>Description: </p>
*
* @param data
* @return
*/
public static String objectToJson(Object data) {
try {
MAPPER.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule());
return MAPPER.writeValueAsString(data);
} catch (JsonProcessingException e) {
log.info(ExceptionUtil.stacktraceToString(e));
}
return null;
}
/**
* 将json结果集转化为对象
*
* @param jsonData json数据
* @param beanType 对象中的object类型
* @return
*/
public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {
try {
return MAPPER.readValue(jsonData, beanType);
} catch (Exception e) {
log.info(ExceptionUtil.stacktraceToString(e));
}
return null;
}
/**
* 将json数据转换成pojo对象list
* <p>Title: jsonToList</p>
* <p>Description: </p>
*
* @param jsonData
* @param beanType
* @return
*/
public static <T> List<T> jsonToList(String jsonData, Class<T> beanType) {
JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
try {
List<T> list = MAPPER.readValue(jsonData, javaType);
return list;
} catch (Exception e) {
log.info(ExceptionUtil.stacktraceToString(e));
}
return null;
}
/**
* 将List<DTO>转为List<VO>
* <p>Title: jsonToList</p>
* <p>Description: </p>
*
* @param jsonData
* @param beanType
* @return
*/
public static <T> List<T> jsonToList(List jsonData, Class<T> beanType) {
List<T> list = new ArrayList<>();
try {
for (Object jd : jsonData) {
T t = beanType.newInstance();
BeanUtil.copyProperties(jd, t);
list.add(t);
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return list;
}
/**
* 将可变参数转化为数组类型的字符串<VO>
* <p>Title: jsonToList</p>
* <p>Description: </p>
*
* @param args 参数列表
* @return
*/
public static String argsToArray(Object... args) {
return objectToJson(args);
}
}

View File

@ -0,0 +1,46 @@
package com.coscoshipping.ebtp.system.operationlog.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.coscoshipping.ebtp.system.common.base.BaseController;
import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse;
import com.chinaunicom.mall.ebtp.common.log.OperationLogDetail;
import com.chinaunicom.mall.ebtp.common.log.enums.EbtpLogBusinessModule;
import com.chinaunicom.mall.ebtp.common.log.enums.EbtpLogType;
import com.coscoshipping.ebtp.system.operationlog.entity.SysOperationLog;
import com.coscoshipping.ebtp.system.operationlog.entity.SysOperationLogVO;
import com.coscoshipping.ebtp.system.operationlog.service.ISysOperationLogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@Api(value = "操作日志")
@RequestMapping("/v1/operationLog")
public class OperationLogController extends BaseController {
@Autowired
private ISysOperationLogService sysOperationLogService;
/**
* 查询分页数据
* @param operationLogVO 分页信息
* @return 返回结果
*/
@ApiOperation("查询分页数据")
@PostMapping("/getPage")
public BaseResponse<IPage<SysOperationLog>> getPage(@ApiParam(value = "对象数据", required = true) @RequestBody SysOperationLogVO operationLogVO) {
return BaseResponse.success(sysOperationLogService.getPage(operationLogVO));
}
/**
* 测试操作日志注解+Kafka流程
*/
@ApiOperation("测试操作日志注解和Kafka流程")
@OperationLogDetail(businessModule = EbtpLogBusinessModule.OTHER,operationType = EbtpLogType.UPDATE,detail = "客服-根据项目projectBizNum查询项目负责人相关信息")
@GetMapping("/testLog")
public BaseResponse<String> testLog(@RequestParam(value = "msg", required = false, defaultValue = "hello") String msg) {
// 这里仅返回简单内容实际日志信息由AOP+Kafka处理
return BaseResponse.success("操作日志注解+Kafka流程测试成功msg=" + msg);
}
}

View File

@ -0,0 +1,13 @@
package com.coscoshipping.ebtp.system.operationlog.dao;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chinaunicom.mall.ebtp.common.base.dao.IBaseMapper;
import com.coscoshipping.ebtp.system.operationlog.entity.SysOperationLog;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface SysOperationLogMapper extends IBaseMapper<SysOperationLog> {
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.coscoshipping.ebtp.system.operationlog.dao.OperationLogMapper">
</mapper>

View File

@ -0,0 +1,85 @@
package com.coscoshipping.ebtp.system.operationlog.entity;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* 操作日志实体类
* 对应表operation_log
*/
@Data
@TableName("sys_operation_log")
public class SysOperationLog implements Serializable {
/** 编号 */
@TableId
private String id;
/** 链路跟踪标识 */
@TableField("transaction_id")
private String transactionId;
/** 内容 */
@TableField("content")
private String content;
/** 结果 */
@TableField("result")
private boolean result;
/** 创建时间 */
@TableField("create_time")
private String createTime;
/** 操作人token */
@TableField("token")
private String token;
/** 操作人ID */
@TableField("user_id")
private String userId;
/** 操作人名称 */
@TableField("user_name")
private String userName;
/** 操作类型 */
@TableField("operation_type")
private String operationType;
/** 服务名 */
@TableField("service_name")
private String serviceName;
/** 业务所属模块 */
@TableField("business_module")
private String businessModule;
/** 包名 */
@TableField("package_name")
private String packageName;
/** 方法名 */
@TableField("method")
private String method;
/** url */
@TableField("url")
private String url;
/** 日志描述 */
@TableField("detail")
private String detail;
/** 方法运行时间 */
@TableField("run_time")
private Long runTime;
/** 日志等级 */
@TableField("level")
private String level;
}

View File

@ -0,0 +1,18 @@
package com.coscoshipping.ebtp.system.operationlog.entity;
import com.chinaunicom.mall.ebtp.common.base.entity.BasePageRequest;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
@ApiModel("操作日志分页VO")
public class SysOperationLogVO extends SysOperationLog implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "分页对象信息")
private BasePageRequest basePageRequest;
}

View File

@ -0,0 +1,10 @@
package com.coscoshipping.ebtp.system.operationlog.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.coscoshipping.ebtp.system.operationlog.entity.SysOperationLog;
import com.coscoshipping.ebtp.system.operationlog.entity.SysOperationLogVO;
public interface ISysOperationLogService {
Boolean insert(SysOperationLog log);
IPage<SysOperationLog> getPage(SysOperationLogVO operationLogVO);
}

View File

@ -0,0 +1,44 @@
package com.coscoshipping.ebtp.system.operationlog.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chinaunicom.mall.ebtp.common.base.service.impl.BaseServiceImpl;
import com.coscoshipping.ebtp.system.operationlog.dao.SysOperationLogMapper;
import com.coscoshipping.ebtp.system.operationlog.entity.SysOperationLog;
import com.coscoshipping.ebtp.system.operationlog.entity.SysOperationLogVO;
import com.coscoshipping.ebtp.system.operationlog.service.ISysOperationLogService;
import org.springframework.stereotype.Service;
@Service
public class SysOperationLogServiceImpl extends BaseServiceImpl<SysOperationLogMapper, SysOperationLog> implements ISysOperationLogService {
@Override
public Boolean insert(SysOperationLog log) {
return super.save(log);
}
@Override
public IPage<SysOperationLog> getPage(SysOperationLogVO operationLogVO) {
LambdaQueryWrapper<SysOperationLog> query = new LambdaQueryWrapper<>();
// 可根据operationLogVO添加更多查询条件
if (operationLogVO.getTransactionId() != null) {
query.eq(SysOperationLog::getTransactionId, operationLogVO.getTransactionId());
}
if (operationLogVO.getUserId() != null) {
query.eq(SysOperationLog::getUserId, operationLogVO.getUserId());
}
if (operationLogVO.getOperationType() != null) {
query.eq(SysOperationLog::getOperationType, operationLogVO.getOperationType());
}
query.orderByDesc(SysOperationLog::getCreateTime);
if (operationLogVO.getBasePageRequest() == null) {
operationLogVO.setBasePageRequest(new com.chinaunicom.mall.ebtp.common.base.entity.BasePageRequest());
}
//查询
IPage<SysOperationLog> result = new Page<>(operationLogVO.getBasePageRequest().getPageNo(), operationLogVO.getBasePageRequest().getPageSize());
return this.page(result, query);
}
}

View File

@ -57,32 +57,34 @@ spring:
# 天宫Kafka增加了安全认证需要配置安全属性
kafka:
bootstrap-servers: 10.172.48.110:32050,10.172.48.109:32050,10.172.48.111:32050
bootstrap-servers: 192.168.110.231:9092
template:
default-topic: jl_eshop
# 生产者配置参数
producer:
client-id: core-service-ebtp-crypt
properties:
security.protocol: SASL_PLAINTEXT
sasl.mechanism: SCRAM-SHA-256
sasl.jaas.config: org.apache.kafka.common.security.scram.ScramLoginModule required username="eshop-kafka" password="Unicom#135";
client-id: sys-manager-ebtp-project
# properties:
# security.protocol: SASL_PLAINTEXT
# sasl.mechanism: SCRAM-SHA-256
# sasl.jaas.config: org.apache.kafka.common.security.scram.ScramLoginModule required username="eshop-kafka" password="Unicom#135";
# 消费者配置参数
consumer:
group-id: core-service-ebtp-crypt-consumer
group-id: biz-service-ebtp-kafka-consumer
auto-offset-reset: latest
properties:
security.protocol: SASL_PLAINTEXT
sasl.mechanism: SCRAM-SHA-256
sasl.jaas.config: org.apache.kafka.common.security.scram.ScramLoginModule required username="eshop-kafka" password="Unicom#135";
# properties:
# security.protocol: SASL_PLAINTEXT
# sasl.mechanism: SCRAM-SHA-256
# sasl.jaas.config: org.apache.kafka.common.security.scram.ScramLoginModule required username="eshop-kafka" password="Unicom#135";
# 生产区 redis 配置
redis:
sentinel:
master: mymaster
nodes: 192.168.110.231:26379
# sentinel:
# master: mymaster
# nodes: 192.168.110.231:26379
host: 192.168.110.231
port: 6379
password: pass
database:
sharding: 1