diff --git a/src/main/java/com/coscoshipping/ebtp/system/kafka/listener/KafkaLogListener.java b/src/main/java/com/coscoshipping/ebtp/system/kafka/listener/KafkaLogListener.java new file mode 100644 index 0000000..a75b77a --- /dev/null +++ b/src/main/java/com/coscoshipping/ebtp/system/kafka/listener/KafkaLogListener.java @@ -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); + }); + } +} diff --git a/src/main/java/com/coscoshipping/ebtp/system/kafka/util/JsonUtils.java b/src/main/java/com/coscoshipping/ebtp/system/kafka/util/JsonUtils.java new file mode 100644 index 0000000..5b99cdd --- /dev/null +++ b/src/main/java/com/coscoshipping/ebtp/system/kafka/util/JsonUtils.java @@ -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字符串。 + *

Title: pojoToJson

+ *

Description:

+ * + * @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 jsonToPojo(String jsonData, Class beanType) { + try { + return MAPPER.readValue(jsonData, beanType); + } catch (Exception e) { + log.info(ExceptionUtil.stacktraceToString(e)); + } + return null; + } + + /** + * 将json数据转换成pojo对象list + *

Title: jsonToList

+ *

Description:

+ * + * @param jsonData + * @param beanType + * @return + */ + public static List jsonToList(String jsonData, Class beanType) { + JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType); + try { + List list = MAPPER.readValue(jsonData, javaType); + return list; + } catch (Exception e) { + log.info(ExceptionUtil.stacktraceToString(e)); + } + return null; + } + + /** + * 将List转为List + *

Title: jsonToList

+ *

Description:

+ * + * @param jsonData + * @param beanType + * @return + */ + public static List jsonToList(List jsonData, Class beanType) { + List 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; + } + + + /** + * 将可变参数转化为数组类型的字符串 + *

Title: jsonToList

+ *

Description:

+ * + * @param args 参数列表 + * @return + */ + public static String argsToArray(Object... args) { + return objectToJson(args); + + } + + +} diff --git a/src/main/java/com/coscoshipping/ebtp/system/operationlog/controller/OperationLogController.java b/src/main/java/com/coscoshipping/ebtp/system/operationlog/controller/OperationLogController.java new file mode 100644 index 0000000..3cd886c --- /dev/null +++ b/src/main/java/com/coscoshipping/ebtp/system/operationlog/controller/OperationLogController.java @@ -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> 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 testLog(@RequestParam(value = "msg", required = false, defaultValue = "hello") String msg) { + // 这里仅返回简单内容,实际日志信息由AOP+Kafka处理 + return BaseResponse.success("操作日志注解+Kafka流程测试成功,msg=" + msg); + } +} diff --git a/src/main/java/com/coscoshipping/ebtp/system/operationlog/dao/SysOperationLogMapper.java b/src/main/java/com/coscoshipping/ebtp/system/operationlog/dao/SysOperationLogMapper.java new file mode 100644 index 0000000..5f5d45c --- /dev/null +++ b/src/main/java/com/coscoshipping/ebtp/system/operationlog/dao/SysOperationLogMapper.java @@ -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 { +} diff --git a/src/main/java/com/coscoshipping/ebtp/system/operationlog/dao/mapper/OperationLogMapper.xml b/src/main/java/com/coscoshipping/ebtp/system/operationlog/dao/mapper/OperationLogMapper.xml new file mode 100644 index 0000000..dd1a890 --- /dev/null +++ b/src/main/java/com/coscoshipping/ebtp/system/operationlog/dao/mapper/OperationLogMapper.xml @@ -0,0 +1,5 @@ + + + + diff --git a/src/main/java/com/coscoshipping/ebtp/system/operationlog/entity/SysOperationLog.java b/src/main/java/com/coscoshipping/ebtp/system/operationlog/entity/SysOperationLog.java new file mode 100644 index 0000000..37f5ab5 --- /dev/null +++ b/src/main/java/com/coscoshipping/ebtp/system/operationlog/entity/SysOperationLog.java @@ -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; +} diff --git a/src/main/java/com/coscoshipping/ebtp/system/operationlog/entity/SysOperationLogVO.java b/src/main/java/com/coscoshipping/ebtp/system/operationlog/entity/SysOperationLogVO.java new file mode 100644 index 0000000..3459ebd --- /dev/null +++ b/src/main/java/com/coscoshipping/ebtp/system/operationlog/entity/SysOperationLogVO.java @@ -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; +} \ No newline at end of file diff --git a/src/main/java/com/coscoshipping/ebtp/system/operationlog/service/ISysOperationLogService.java b/src/main/java/com/coscoshipping/ebtp/system/operationlog/service/ISysOperationLogService.java new file mode 100644 index 0000000..7439afa --- /dev/null +++ b/src/main/java/com/coscoshipping/ebtp/system/operationlog/service/ISysOperationLogService.java @@ -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 getPage(SysOperationLogVO operationLogVO); +} diff --git a/src/main/java/com/coscoshipping/ebtp/system/operationlog/service/impl/SysOperationLogServiceImpl.java b/src/main/java/com/coscoshipping/ebtp/system/operationlog/service/impl/SysOperationLogServiceImpl.java new file mode 100644 index 0000000..3a224bc --- /dev/null +++ b/src/main/java/com/coscoshipping/ebtp/system/operationlog/service/impl/SysOperationLogServiceImpl.java @@ -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 implements ISysOperationLogService { + + @Override + public Boolean insert(SysOperationLog log) { + return super.save(log); + } + + @Override + public IPage getPage(SysOperationLogVO operationLogVO) { + LambdaQueryWrapper 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 result = new Page<>(operationLogVO.getBasePageRequest().getPageNo(), operationLogVO.getBasePageRequest().getPageSize()); + return this.page(result, query); + + } +} diff --git a/src/main/resources/application-master.yml b/src/main/resources/application-master.yml index 811f27b..773c0d6 100644 --- a/src/main/resources/application-master.yml +++ b/src/main/resources/application-master.yml @@ -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