吉安感知网项目-后端
xiebin
2026-01-16 041fa12f2b00770ed4592ece9bcd36a7ad3f687c
add-操作日志
6 files modified
12 files added
470 ■■■■■ changed files
drone-ops/drone-log/pom.xml 4 ●●●● patch | view | raw | blame | history
drone-ops/drone-log/src/main/java/org/sxkj/core/log/common/GenericConverter.java 28 ●●●●● patch | view | raw | blame | history
drone-ops/drone-log/src/main/java/org/sxkj/core/log/common/IdParam.java 40 ●●●●● patch | view | raw | blame | history
drone-ops/drone-log/src/main/java/org/sxkj/core/log/controller/LogApiController.java 1 ●●●● patch | view | raw | blame | history
drone-ops/drone-log/src/main/java/org/sxkj/core/log/controller/LogErrorController.java 1 ●●●● patch | view | raw | blame | history
drone-ops/drone-log/src/main/java/org/sxkj/core/log/controller/LogUsualController.java 1 ●●●● patch | view | raw | blame | history
drone-ops/drone-log/src/main/java/org/sxkj/core/log/controller/OperationLogController.java 74 ●●●●● patch | view | raw | blame | history
drone-ops/drone-log/src/main/java/org/sxkj/core/log/dto/OperationLogDTO.java 37 ●●●●● patch | view | raw | blame | history
drone-ops/drone-log/src/main/java/org/sxkj/core/log/feign/LogClient.java 2 ●●●●● patch | view | raw | blame | history
drone-ops/drone-log/src/main/java/org/sxkj/core/log/mapper/OperationLogMapper.java 29 ●●●●● patch | view | raw | blame | history
drone-ops/drone-log/src/main/java/org/sxkj/core/log/mapper/OperationLogMapper.xml 43 ●●●●● patch | view | raw | blame | history
drone-ops/drone-log/src/main/java/org/sxkj/core/log/model/OperationLog.java 30 ●●●●● patch | view | raw | blame | history
drone-ops/drone-log/src/main/java/org/sxkj/core/log/param/OperationLogPageParam.java 27 ●●●●● patch | view | raw | blame | history
drone-ops/drone-log/src/main/java/org/sxkj/core/log/service/IOperationLogService.java 24 ●●●●● patch | view | raw | blame | history
drone-ops/drone-log/src/main/java/org/sxkj/core/log/service/impl/OperationLogServiceImpl.java 43 ●●●●● patch | view | raw | blame | history
drone-ops/drone-log/src/main/java/org/sxkj/core/log/vo/OperationLogVO.java 47 ●●●●● patch | view | raw | blame | history
drone-ops/drone-log/src/main/java/org/sxkj/core/log/wrapper/OperationLogWrapper.java 32 ●●●●● patch | view | raw | blame | history
drone-ops/drone-swagger/src/main/resources/application-dev.yml 7 ●●●● patch | view | raw | blame | history
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') &gt;= #{param.startTime}
            </if>
            <if test="param.endTime!=null and param.endTime!=''">
                and date_format(create_time,'%Y-%m-%d') &lt;= #{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