drone-ops/drone-log/pom.xml
@@ -25,6 +25,10 @@ </dependency> <dependency> <groupId>org.springblade</groupId> <artifactId>blade-starter-swagger</artifactId> </dependency> <dependency> <groupId>org.springblade</groupId> <artifactId>blade-starter-tenant</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --> drone-ops/drone-log/src/main/java/org/sxkj/core/log/common/GenericConverter.java
New file @@ -0,0 +1,28 @@ package org.sxkj.core.log.common; import org.springblade.core.tool.utils.BeanUtil; import java.io.Serializable; /** * @Description 通用转换工具类 * @Author AIX * @Date 2026/1/12 10:22 * @Version 1.0 */ public class GenericConverter implements Serializable { private static final long serialVersionUID = 1L; public static <S, T> T convert(S source, Class<T> targetType) { T target = BeanUtil.newInstance(targetType); BeanUtil.copy(source, target); return target; } public static <S, T> T copy(S source, T target) { BeanUtil.copy(source, target); return target; } } drone-ops/drone-log/src/main/java/org/sxkj/core/log/common/IdParam.java
New file @@ -0,0 +1,40 @@ /* * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: Chill 庄骞 (smallchill@163.com) */ package org.sxkj.core.log.common; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; import java.io.Serializable; /** * 设备跟踪流转表 数据传输对象实体类 * * @author aix * @since 2026-01-08 */ @Data public class IdParam implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "主键", required = true) @NotNull private Long id; } drone-ops/drone-log/src/main/java/org/sxkj/core/log/controller/LogApiController.java
@@ -45,6 +45,7 @@ @RestController @AllArgsConstructor @RequestMapping("/api") @ApiIgnore public class LogApiController { private final ILogApiService logService; drone-ops/drone-log/src/main/java/org/sxkj/core/log/controller/LogErrorController.java
@@ -42,6 +42,7 @@ @RestController @AllArgsConstructor @RequestMapping("/error") @ApiIgnore public class LogErrorController { private final ILogErrorService errorLogService; drone-ops/drone-log/src/main/java/org/sxkj/core/log/controller/LogUsualController.java
@@ -44,6 +44,7 @@ @RestController @AllArgsConstructor @RequestMapping("/usual") @ApiIgnore public class LogUsualController { private final ILogUsualService logService; drone-ops/drone-log/src/main/java/org/sxkj/core/log/controller/OperationLogController.java
New file @@ -0,0 +1,74 @@ package org.sxkj.core.log.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; import org.springframework.web.bind.annotation.*; import org.sxkj.core.log.dto.OperationLogDTO; import org.sxkj.core.log.model.OperationLog; import org.sxkj.core.log.param.OperationLogPageParam; import org.sxkj.core.log.service.IOperationLogService; import org.sxkj.core.log.vo.OperationLogVO; import org.sxkj.core.log.wrapper.OperationLogWrapper; import javax.validation.Valid; /** * @Description 操作日志控制器 * @Author AIX * @Date 2026/1/15 17:33 * @Version 1.0 */ @NonDS @RestController @AllArgsConstructor @RequestMapping("/log/operationLog") @Api(value = "操作日志", tags = "操作日志") public class OperationLogController extends BladeController { private final IOperationLogService operationLogService; /** * 查询单条 */ @GetMapping("/detail") @ApiOperationSupport(order = 1) @ApiOperation(value = "详情", notes = "详情") public R<OperationLog> detail(OperationLog log) { return R.data(operationLogService.getOne(Condition.getQueryWrapper(log))); } /** * 自定义分页查询 * @param operationLogPageParam * @param query * @return */ @GetMapping("/page") @ApiOperationSupport(order = 2) @ApiOperation(value = "分页", notes = "分页") public R<IPage<OperationLogVO>> page(OperationLogPageParam operationLogPageParam, Query query) { IPage<OperationLogVO> pages = operationLogService.selectOperationLogPage(Condition.getPage(query), operationLogPageParam); return R.data(pages); } /** * 设备报废记录表 新增 */ @PostMapping("/save") @ApiOperationSupport(order = 3) @ApiOperation(value = "新增操作日志", notes = "新增操作日志") public R<Boolean> save(@Valid @RequestBody OperationLogDTO operationLogDTO) { OperationLog operationLog = OperationLogWrapper.build().entityDTO(operationLogDTO); return R.status(operationLogService.save(operationLog)); } } drone-ops/drone-log/src/main/java/org/sxkj/core/log/dto/OperationLogDTO.java
New file @@ -0,0 +1,37 @@ package org.sxkj.core.log.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; import java.io.Serializable; /** * @Description 操作日志DTO * @Author AIX * @Date 2026/1/15 17:42 * @Version 1.0 */ @Data public class OperationLogDTO implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "当前菜单地址", required = true) @NotNull private String requestUri; /** * 日志类型(0菜单/1按钮) */ @ApiModelProperty(value = "日志类型(0菜单/1按钮)", required = true) @NotNull private String type; /** * 日志标题 */ @ApiModelProperty(value = "日志标题", required = true) @NotNull private String title; } drone-ops/drone-log/src/main/java/org/sxkj/core/log/feign/LogClient.java
@@ -29,6 +29,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; import java.util.Date; @@ -40,6 +41,7 @@ @NonDS @RestController @AllArgsConstructor @ApiIgnore public class LogClient implements ILogClient { private final ILogUsualService usualLogService; drone-ops/drone-log/src/main/java/org/sxkj/core/log/mapper/OperationLogMapper.java
New file @@ -0,0 +1,29 @@ package org.sxkj.core.log.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Param; import org.sxkj.core.log.dto.OperationLogDTO; import org.sxkj.core.log.model.OperationLog; import org.sxkj.core.log.param.OperationLogPageParam; import org.sxkj.core.log.vo.LogApiVO; import org.sxkj.core.log.vo.OperationLogVO; import java.util.List; /** * 操作日志 Mapper 接口 * * @author Aix */ public interface OperationLogMapper extends BaseMapper<OperationLog> { /** * 自定义分页查询 * @param param * @param page * @return */ List<OperationLogVO> selectOperationLogPage(IPage<OperationLogVO> page, @Param("param") OperationLogPageParam param); } drone-ops/drone-log/src/main/java/org/sxkj/core/log/mapper/OperationLogMapper.xml
New file @@ -0,0 +1,43 @@ <?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="org.sxkj.core.log.mapper.OperationLogMapper"> <!-- 通用查询映射结果 --> <resultMap id="logResultMap" type="org.sxkj.core.log.model.OperationLog"> <result column="id" property="id"/> <result column="create_time" property="createTime"/> <result column="service_id" property="serviceId"/> <result column="server_host" property="serverHost"/> <result column="server_ip" property="serverIp"/> <result column="env" property="env"/> <result column="type" property="type"/> <result column="title" property="title"/> <result column="method" property="method"/> <result column="request_uri" property="requestUri"/> <result column="user_agent" property="userAgent"/> <result column="remote_ip" property="remoteIp"/> <result column="method_class" property="methodClass"/> <result column="method_name" property="methodName"/> <result column="params" property="params"/> <result column="create_by" property="createBy"/> </resultMap> <!--自定义分页查询--> <select id="selectOperationLogPage" resultType="org.sxkj.core.log.vo.OperationLogVO"> select * from ja_log_operation_log <where> <if test="param.title!=null and param.title!=''"> and title like concat('%',#{param.title},'%') </if> <if test="param.createBy!=null and param.createBy!=''"> and create_by like concat('%',#{param.createBy},'%') </if> <if test="param.startTime!=null and param.startTime!=''"> and date_format(create_time,'%Y-%m-%d') >= #{param.startTime} </if> <if test="param.endTime!=null and param.endTime!=''"> and date_format(create_time,'%Y-%m-%d') <= #{param.endTime} </if> </where> </select> </mapper> drone-ops/drone-log/src/main/java/org/sxkj/core/log/model/OperationLog.java
New file @@ -0,0 +1,30 @@ package org.sxkj.core.log.model; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; import org.springblade.core.log.model.LogAbstract; /** * @Description 操作日志 * @Author AIX * @Date 2026/1/15 16:50 * @Version 1.0 */ @EqualsAndHashCode(callSuper = true) @TableName("ja_log_operation_log") @Data public class OperationLog extends LogAbstract { private static final long serialVersionUID = 1L; /** * 日志类型(0菜单/1按钮) */ private String type; /** * 日志标题 */ private String title; } drone-ops/drone-log/src/main/java/org/sxkj/core/log/param/OperationLogPageParam.java
New file @@ -0,0 +1,27 @@ package org.sxkj.core.log.param; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @Description 操作日志查询参数 * @Author AIX * @Date 2026/1/16 10:21 * @Version 1.0 */ @Data public class OperationLogPageParam { @ApiModelProperty(value = "日志类型(0菜单/1按钮)") private String title; @ApiModelProperty(value = "操作人") private String createBy; @ApiModelProperty(value = "开始时间") private String startTime; @ApiModelProperty(value = "结束时间") private String endTime; } drone-ops/drone-log/src/main/java/org/sxkj/core/log/service/IOperationLogService.java
New file @@ -0,0 +1,24 @@ package org.sxkj.core.log.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import org.sxkj.core.log.model.OperationLog; import org.sxkj.core.log.param.OperationLogPageParam; import org.sxkj.core.log.vo.OperationLogVO; /** * 服务类 * * @author Aix */ public interface IOperationLogService extends IService<OperationLog> { /** * 自定义分页查询 * @param operationLogPageParam * @param page * @return */ IPage<OperationLogVO> selectOperationLogPage(IPage<OperationLogVO> page, OperationLogPageParam operationLogPageParam); } drone-ops/drone-log/src/main/java/org/sxkj/core/log/service/impl/OperationLogServiceImpl.java
New file @@ -0,0 +1,43 @@ package org.sxkj.core.log.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springblade.core.log.utils.LogAbstractUtil; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.utils.StringUtil; import org.springblade.core.tool.utils.WebUtil; import org.springframework.stereotype.Service; import org.sxkj.core.log.dto.OperationLogDTO; import org.sxkj.core.log.mapper.OperationLogMapper; import org.sxkj.core.log.model.OperationLog; import org.sxkj.core.log.param.OperationLogPageParam; import org.sxkj.core.log.service.IOperationLogService; import org.sxkj.core.log.vo.OperationLogVO; import javax.servlet.http.HttpServletRequest; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; /** * @Description 操作日志服务实现类 * @Author AIX * @Date 2026/1/15 17:24 * @Version 1.0 */ @Service public class OperationLogServiceImpl extends ServiceImpl<OperationLogMapper, OperationLog> implements IOperationLogService { @Override public IPage<OperationLogVO> selectOperationLogPage(IPage<OperationLogVO> page, OperationLogPageParam operationLogPageParam) { return page.setRecords(baseMapper.selectOperationLogPage(page,operationLogPageParam)); } @Override public boolean save(OperationLog entity) { String requestUri = entity.getRequestUri(); LogAbstractUtil.addRequestInfoToLog(WebUtil.getRequest(), entity); entity.setCreateBy(AuthUtil.getNickName()); entity.setRequestUri(StringUtil.isBlank(requestUri)?entity.getRequestUri():requestUri); return super.save(entity); } } drone-ops/drone-log/src/main/java/org/sxkj/core/log/vo/OperationLogVO.java
New file @@ -0,0 +1,47 @@ package org.sxkj.core.log.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @Description 操作日志 * @Author AIX * @Date 2026/1/15 17:16 * @Version 1.0 */ @Data public class OperationLogVO { /** * 日志类型(0菜单/1按钮) */ @ApiModelProperty(value = "日志类型(0菜单/1按钮)") private String type; /** * 日志标题 */ @ApiModelProperty(value = "日志标题") private String title; /** * 请求地址 */ @ApiModelProperty(value = "请求地址") private String requestUri; /** * 客户端IP */ @ApiModelProperty(value = "客户端IP") private String remoteIp; /** * 客户端 */ @ApiModelProperty(value = "客户端") private String userAgent; @ApiModelProperty(value = "操作人") private String createBy; } drone-ops/drone-log/src/main/java/org/sxkj/core/log/wrapper/OperationLogWrapper.java
New file @@ -0,0 +1,32 @@ package org.sxkj.core.log.wrapper; import org.springblade.core.mp.support.BaseEntityWrapper; import org.springblade.core.tool.utils.BeanUtil; import org.sxkj.core.log.dto.OperationLogDTO; import org.sxkj.core.log.model.OperationLog; import org.sxkj.core.log.vo.OperationLogVO; import java.util.Objects; /** * @Description 操作日志包装类 * @Author AIX * @Date 2026/1/15 17:40 * @Version 1.0 */ public class OperationLogWrapper extends BaseEntityWrapper<OperationLog, OperationLogVO> { public static OperationLogWrapper build() { return new OperationLogWrapper(); } @Override public OperationLogVO entityVO(OperationLog entity) { return Objects.requireNonNull(BeanUtil.copy(entity, OperationLogVO.class)); } public OperationLog entityDTO(OperationLogDTO operationLogDTO) { return Objects.requireNonNull(BeanUtil.copy(operationLogDTO, OperationLog.class)); } } drone-ops/drone-swagger/src/main/resources/application-dev.yml
@@ -1,15 +1,18 @@ knife4j: cloud: routes: - name: blade-system - name: 系统管理 uri: 127.0.0.1 location: /blade-system/v2/api-docs - name: blade-resource - name: 资源管理 uri: 127.0.0.1 location: /blade-resource/v2/api-docs - name: 反无相关 uri: 127.0.0.1 location: /drone-fw/v2/api-docs - name: 日志相关 uri: 127.0.0.1 location: /blade-log/v2/api-docs