caozixuan 2 жил өмнө
parent
commit
4b75fa0e15

+ 46 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/BasicOperationLogController.java

@@ -0,0 +1,46 @@
+package com.qmth.distributed.print.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.teachcloud.common.annotation.OperationLogDetail;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
+import com.qmth.teachcloud.common.service.BasicOperationLogService;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.common.util.ServletUtil;
+import io.swagger.annotations.*;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+
+/**
+ * @Description: 分布式印刷日志管理 - 前端控制器
+ * @Author: CaoZixuan
+ * @Date: 2022-11-29
+ */
+@Api(tags = "日志管理controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_BASIC + "/operation_log")
+public class BasicOperationLogController {
+    @Resource
+    private BasicOperationLogService basicOperationLogService;
+
+    @ApiOperation(value = "日志管理-分页查询")
+    @RequestMapping(value = "/query", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    @OperationLogDetail(detail = "日志管理-查询",customizedOperationType = CustomizedOperationTypeEnum.SEARCH)
+    public Result findOperationLogPage(@ApiParam(value = "操作类型") @RequestParam(required = false) CustomizedOperationTypeEnum customizedOperationType,
+                                       @ApiParam(value = "操作时间 - 起始") @RequestParam(required = false) Long startTime,
+                                       @ApiParam(value = "操作时间 - 终止") @RequestParam(required = false) Long endTime,
+                                       @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                                       @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        return ResultUtil.ok(basicOperationLogService.findOperationLogPage(customizedOperationType, startTime, endTime, requestUser, pageNumber, pageSize));
+    }
+}

+ 6 - 4
teachcloud-common/src/main/java/com/qmth/teachcloud/common/annotation/OperationLogDetail.java

@@ -1,9 +1,6 @@
 package com.qmth.teachcloud.common.annotation;
 
-import com.qmth.teachcloud.common.enums.log.LevelEnum;
-import com.qmth.teachcloud.common.enums.log.OperationTypeEnum;
-import com.qmth.teachcloud.common.enums.log.OperationUnitEnum;
-import com.qmth.teachcloud.common.enums.log.SystemEnum;
+import com.qmth.teachcloud.common.enums.log.*;
 
 import java.lang.annotation.*;
 
@@ -27,6 +24,11 @@ public @interface OperationLogDetail {
      */
     LevelEnum level() default LevelEnum.QUATERNARY;
 
+    /**
+     * 日志记录 - 自定义记录操作类型(默认 - 未知)
+     */
+    CustomizedOperationTypeEnum customizedOperationType() default CustomizedOperationTypeEnum.UN_KNOW;
+
     /**
      * 日志记录 - 操作类型(主要是 'SELECT,EDIT,DELETE',默认为'未知')
      */

+ 3 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/aspect/LogAspect.java

@@ -108,6 +108,7 @@ public class LogAspect {
 
         // 方法中的信息
         operationLog.setId(SystemConstant.getDbUuid());
+        operationLog.setSchoolId(SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId())));
         operationLog.setUrl(request.getServletPath());
         operationLog.setClazzName(clazzName);
         operationLog.setMethod(methodName);
@@ -117,6 +118,7 @@ public class LogAspect {
         operationLog.setReturnValue(JSON.toJSONString(res));
         operationLog.setUserId(requestUser.getId());
         operationLog.setUserName(userName);
+        operationLog.setIp(ServletUtil.getIP());
         operationLog.setCreateTime(System.currentTimeMillis());
 
         // 注解中的信息
@@ -124,6 +126,7 @@ public class LogAspect {
         if (annotation != null) {
             operationLog.setDetail(getDetail(((MethodSignature) joinPoint.getSignature()).getParameterNames(), joinPoint.getArgs(), annotation));
             operationLog.setLevel(annotation.level());
+            operationLog.setCustomizedOperationType(annotation.customizedOperationType());
             operationLog.setOperationType(annotation.operationType());
             operationLog.setOperationUnit(annotation.operationUnit());
             operationLog.setSystemType(annotation.system());

+ 95 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/BasicOperationLogResult.java

@@ -0,0 +1,95 @@
+package com.qmth.teachcloud.common.bean.result;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 日志操作记录查询返回值
+ * @Author: CaoZixuan
+ * @Date: 2022-11-29
+ */
+public class BasicOperationLogResult implements Serializable {
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty("id")
+    private Long id;
+
+    @ApiModelProperty("日志内容")
+    private String detail;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty("操作人id")
+    private Long operatorId;
+
+    @ApiModelProperty("操作人名称")
+    private String operatorName;
+
+    @ApiModelProperty("IP")
+    private String ip;
+
+    @ApiModelProperty("自定义操作类型")
+    private CustomizedOperationTypeEnum customizedOperationType;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty("创建时间")
+    private Long createTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getDetail() {
+        return detail;
+    }
+
+    public void setDetail(String detail) {
+        this.detail = detail;
+    }
+
+    public Long getOperatorId() {
+        return operatorId;
+    }
+
+    public void setOperatorId(Long operatorId) {
+        this.operatorId = operatorId;
+    }
+
+    public String getOperatorName() {
+        return operatorName;
+    }
+
+    public void setOperatorName(String operatorName) {
+        this.operatorName = operatorName;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public CustomizedOperationTypeEnum getCustomizedOperationType() {
+        return customizedOperationType;
+    }
+
+    public void setCustomizedOperationType(CustomizedOperationTypeEnum customizedOperationType) {
+        this.customizedOperationType = customizedOperationType;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+}

+ 35 - 4
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicOperationLog.java

@@ -2,10 +2,7 @@ package com.qmth.teachcloud.common.entity;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import com.qmth.teachcloud.common.enums.log.LevelEnum;
-import com.qmth.teachcloud.common.enums.log.OperationTypeEnum;
-import com.qmth.teachcloud.common.enums.log.OperationUnitEnum;
-import com.qmth.teachcloud.common.enums.log.SystemEnum;
+import com.qmth.teachcloud.common.enums.log.*;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -24,12 +21,19 @@ public class BasicOperationLog implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long id;
 
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
     @ApiModelProperty(value = "日志详情")
     private String detail;
 
     @ApiModelProperty(value = "日志等级(PRIMARY(\"一级日志:敏感信息\"),SECONDARY(\"二级日志:重要信息\"),TERTIARY(\"三级日志:次要信息\"),QUATERNARY(\"四级日志:普通信息\"))")
     private LevelEnum level;
 
+    @ApiModelProperty(value = "自定义记录日志操作类型(LOGIN(\"用户登录\"),LOGOUT(\"用户登出\"),ADD(\"新增\"),DELETE(\"删除\"),UPDATE(\"修改\"),IMPORT(\"导入\"),EXPORT(\"导出\"),UN_KNOW(\"未知\"))")
+    private CustomizedOperationTypeEnum customizedOperationType;
+
     @ApiModelProperty(value = "操作类型(UN_KNOW(\"未知\"),SELECT(\"查询\"),EDIT(\"新增或更新\"),DELETE(\"删除\"))")
     private OperationTypeEnum operationType;
 
@@ -68,6 +72,9 @@ public class BasicOperationLog implements Serializable {
     @ApiModelProperty(value = "用户名称")
     private String userName;
 
+    @ApiModelProperty(value = "ip地址")
+    private String ip;
+
     @ApiModelProperty(value = "日志记录时间")
     @JsonSerialize(using = ToStringSerializer.class)
     private Long createTime;
@@ -80,6 +87,14 @@ public class BasicOperationLog implements Serializable {
         this.id = id;
     }
 
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
     public String getDetail() {
         return detail;
     }
@@ -96,6 +111,14 @@ public class BasicOperationLog implements Serializable {
         this.level = level;
     }
 
+    public CustomizedOperationTypeEnum getCustomizedOperationType() {
+        return customizedOperationType;
+    }
+
+    public void setCustomizedOperationType(CustomizedOperationTypeEnum customizedOperationType) {
+        this.customizedOperationType = customizedOperationType;
+    }
+
     public OperationTypeEnum getOperationType() {
         return operationType;
     }
@@ -192,6 +215,14 @@ public class BasicOperationLog implements Serializable {
         this.userName = userName;
     }
 
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
     public Long getCreateTime() {
         return createTime;
     }

+ 27 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/log/CustomizedOperationTypeEnum.java

@@ -0,0 +1,27 @@
+package com.qmth.teachcloud.common.enums.log;
+
+/**
+ * @Description: 系统自定义日志操作类型
+ * @Author: CaoZixuan
+ * @Date: 2022-11-29
+ */
+public enum CustomizedOperationTypeEnum {
+    LOGIN("用户登录"),
+    LOGOUT("用户登出"),
+    ADD("新增"),
+    DELETE("删除"),
+    UPDATE("修改"),
+    SEARCH("查询"),
+    IMPORT("导入"),
+    EXPORT("导出"),
+    UN_KNOW("未知");
+    private final String desc;
+
+    CustomizedOperationTypeEnum(String desc) {
+        this.desc = desc;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+}

+ 24 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/BasicOperationLogMapper.java

@@ -1,7 +1,13 @@
 package com.qmth.teachcloud.common.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.teachcloud.common.bean.result.BasicMajorResult;
+import com.qmth.teachcloud.common.bean.result.BasicOperationLogResult;
 import com.qmth.teachcloud.common.entity.BasicOperationLog;
+import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * @Description: 基础操作日志记录mapper
@@ -9,4 +15,22 @@ import com.qmth.teachcloud.common.entity.BasicOperationLog;
  * @Date: 2022-02-15
  */
 public interface BasicOperationLogMapper extends BaseMapper<BasicOperationLog> {
+
+    /**
+     * 分页查询 - 操作日志
+     *
+     * @param iPage                   分页参数
+     * @param schoolId                学校id
+     * @param userId                用户id
+     * @param customizedOperationType 自定义操作类型
+     * @param startTime               创建开始时间
+     * @param endTime                 创建截止时间
+     * @return 分页结果
+     */
+    IPage<BasicOperationLogResult> findOperationLogPage(@Param("iPage") Page<BasicMajorResult> iPage,
+                                                        @Param("schoolId") Long schoolId,
+                                                        @Param("userId") Long userId,
+                                                        @Param("customizedOperationType") CustomizedOperationTypeEnum customizedOperationType,
+                                                        @Param("startTime") Long startTime,
+                                                        @Param("endTime") Long endTime);
 }

+ 17 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicOperationLogService.java

@@ -1,7 +1,11 @@
 package com.qmth.teachcloud.common.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.common.bean.result.BasicOperationLogResult;
 import com.qmth.teachcloud.common.entity.BasicOperationLog;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
 
 /**
  * @Description: 操作日志记录服务类
@@ -9,4 +13,17 @@ import com.qmth.teachcloud.common.entity.BasicOperationLog;
  * @Date: 2022-2-15
  */
 public interface BasicOperationLogService extends IService<BasicOperationLog> {
+
+    /**
+     * 操作日志分页查询
+     *
+     * @param customizedOperationType 自定义日志操作类型
+     * @param startTime               创建时间 - 开始
+     * @param endTime                 创建时间 - 截止
+     * @param requestUser             请求用户
+     * @param pageNumber              分页页数
+     * @param pageSize                分页容量
+     * @return 分页结果
+     */
+    IPage<BasicOperationLogResult> findOperationLogPage(CustomizedOperationTypeEnum customizedOperationType, Long startTime, Long endTime, SysUser requestUser, int pageNumber, int pageSize);
 }

+ 12 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicOperationLogServiceImpl.java

@@ -1,7 +1,12 @@
 package com.qmth.teachcloud.common.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.common.bean.result.BasicOperationLogResult;
 import com.qmth.teachcloud.common.entity.BasicOperationLog;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
 import com.qmth.teachcloud.common.mapper.BasicOperationLogMapper;
 import com.qmth.teachcloud.common.service.BasicOperationLogService;
 import org.springframework.stereotype.Service;
@@ -13,4 +18,11 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class BasicOperationLogServiceImpl extends ServiceImpl<BasicOperationLogMapper, BasicOperationLog> implements BasicOperationLogService {
+
+    @Override
+    public IPage<BasicOperationLogResult> findOperationLogPage(CustomizedOperationTypeEnum customizedOperationType, Long startTime, Long endTime, SysUser requestUser, int pageNumber, int pageSize) {
+        Long schoolId = requestUser.getSchoolId();
+        Long userId = requestUser.getId();
+        return this.baseMapper.findOperationLogPage(new Page<>(pageNumber,pageSize),schoolId,userId,customizedOperationType,startTime,endTime);
+    }
 }

+ 29 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/ServletUtil.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.qmth.boot.core.enums.Platform;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.web.context.request.RequestContextHolder;
@@ -270,4 +271,32 @@ public class ServletUtil {
         ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
         return servletRequestAttributes.getResponse();
     }
+
+    /***
+     * 获取客户端ip地址
+     */
+    public static String getIP() {
+        HttpServletRequest request = getRequest();
+        String ipStr = request.getHeader("x-forwarded-for");
+        if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) {
+            ipStr = request.getHeader("Proxy-Client-IP");
+        }
+        if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) {
+            ipStr = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) {
+            ipStr = request.getRemoteAddr();
+        }
+
+        // 多个路由时,取第一个非unknown的ip
+        final String[] arr = ipStr.split(",");
+        for (final String str : arr) {
+            if (!"unknown".equalsIgnoreCase(str)) {
+                ipStr = str;
+                break;
+            }
+        }
+        //目的是将localhost访问对应的ip 0:0:0:0:0:0:0:1 转成 127.0.0.1。
+        return ipStr.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipStr;
+    }
 }

+ 31 - 0
teachcloud-common/src/main/resources/mapper/BasicOperationLogMapper.xml

@@ -2,4 +2,35 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.qmth.teachcloud.common.mapper.BasicOperationLogMapper">
 
+    <select id="findOperationLogPage"
+            resultType="com.qmth.teachcloud.common.bean.result.BasicOperationLogResult">
+        SELECT
+            id,
+            detail,
+            user_id AS operatorId,
+            user_name AS operatorName,
+            ip,
+            customized_operation_type AS customizedOperationType,
+            create_time AS createTime
+        FROM
+            basic_operation_log
+        <where>
+            <if test="schoolId != null">
+                AND school_id = #{schoolId}
+            </if>
+            <if test="userId != null">
+                AND user_id = #{userId}
+            </if>
+            <if test="customizedOperationType != null">
+                AND customized_operation_type = #{customizedOperationType}
+            </if>
+            <if test="startTime != null">
+                AND create_time >= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND #{endTime} >= endTime
+            </if>
+        </where>
+        ORDER BY create_time DESC
+    </select>
 </mapper>