lxw
2022-07-13 c85e1a75207f26543c0e30dd5b936606d7749017
日志修改
3个文件已删除
1个文件已添加
5个文件已修改
530 ■■■■■ 已修改文件
src/main/java/com/whyc/aop/OperationLogAspect.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/DocLogMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/UserLogMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/DocLog.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/DocLogService.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/UserLogService.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/util/CommonUtil.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/DocLogMapper.xml 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/UserLogMapper.xml 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/aop/OperationLogAspect.java
New file
@@ -0,0 +1,122 @@
package com.whyc.aop;
import com.whyc.constant.UserOperation;
import com.whyc.service.DocLogService;
import com.whyc.util.ActionUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
/**
 * 定义aop,对特定的接口进行内容捕捉,生成操作日志
 * 切面为controller
 * 切点为Point表达式
 * 具体连接点为JoinPoint
 * 处理方式为doAfterReturning
 */
@Component
@Aspect
public class OperationLogAspect {
    @Autowired
    private DocLogService service;
    /**定义切点*/
    @Pointcut(value = "execution(public * com.whyc..controller.*.add*(..))" +
            "|| execution(public * com.whyc..controller.*.delete*(..))" +
            "|| execution(public * com.whyc..controller.*.update*(..))"
    )
    private void operationLogPointcut(){};
    /**aop处理类,对捕捉到的切点接口,进行数据处理*/
    @AfterReturning(pointcut = "operationLogPointcut()",returning = "resp")
    public void doAfterReturnOperation(JoinPoint point,Object resp){
        //用户id
        Long uId = ActionUtil.getUser().getUId();
        Signature signature = point.getSignature();
        String methodSignature = signature.toString();
        String methodName = signature.getName();
        //执行的类全名
        String fullClassName = signature.getDeclaringTypeName();
        Integer operationType = 0;
        String  operationTypeName = null;
        if(methodName.contains("update")){
            //提取单项-修改配置
            if(fullClassName.contains("pageParam")){
                operationTypeName = UserOperation.TYPE_PARAM_CHANGE.getTypeName();
                operationType = UserOperation.TYPE_PARAM_CHANGE.getType();
            }
            //提取单项-密码修改
            else if(fullClassName.contains("updatePassword")){
                operationTypeName = UserOperation.TYPE_PASSWORD_CHANGE.getTypeName();
                operationType = UserOperation.TYPE_PASSWORD_CHANGE.getType();
            }
            else {
                operationTypeName = UserOperation.TYPE_UPDATE.getTypeName();
                operationType = UserOperation.TYPE_UPDATE.getType();
            }
        }else if (methodName.contains("add")){
            operationTypeName = UserOperation.TYPE_ADD.getTypeName();
            operationType = UserOperation.TYPE_ADD.getType();
        }else if (methodName.contains("delete")){
            operationTypeName = UserOperation.TYPE_DELETE.getTypeName();
            operationType = UserOperation.TYPE_DELETE.getType();
        }/*else if (methodName.contains("login")){
            operationTypeName = UserOperation.TYPE_LOGIN.getTypeName();
            operationType = UserOperation.TYPE_LOGIN.getType();
        }else if (methodName.contains("logout")){
            operationTypeName = UserOperation.TYPE_LOGOUT.getTypeName();
            operationType = UserOperation.TYPE_LOGOUT.getType();
        }*/
        //获取类型
        String[] fullClassNameSplit = fullClassName.split("\\.");
        String className = fullClassNameSplit[fullClassNameSplit.length-1].replace("Controller","模块");
        if(fullClassName.contains("app")){
            className+="-安卓端";
        }
        //操作时间
        Date operationTime = new Date();
        //客户端ip
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
        String terminalIp = request.getRemoteAddr();
        //操作信息
        //获取切点方法信息
        String[] parameterNames = ((MethodSignature) signature).getParameterNames();
        Object[] args = point.getArgs();
        HashMap<String, Object> map = new HashMap<>();
        for (int i = 0; i < parameterNames.length; i++) {
            map.put(parameterNames[i],args[i].toString());
        }
        //人脸接口的添加参数是图片的base64字符串,不存储
        if(methodSignature.contains("FaceController.add")||methodSignature.contains("FaceController.update")){
            map = new HashMap<>();
        }
        String operationMsg = "执行了"+className+"的"+operationTypeName+"操作.";
        String operationDetail = "具体调用方法为:"+methodName+",具体参数为:"+map.toString();
        service.recordOperationLog(uId,operationType,operationTime,terminalIp,operationMsg,operationDetail);
    }
}
src/main/java/com/whyc/mapper/DocLogMapper.java
@@ -1,6 +1,10 @@
package com.whyc.mapper;
import com.whyc.pojo.DocLog;
import com.whyc.pojo.UserLog;
import java.util.List;
public interface DocLogMapper extends CustomMapper<DocLog>{
    List<DocLog> getList(DocLog docLog);
}
src/main/java/com/whyc/mapper/UserLogMapper.java
File was deleted
src/main/java/com/whyc/pojo/DocLog.java
@@ -1,6 +1,7 @@
package com.whyc.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
@@ -34,9 +35,15 @@
    private Integer id;
    @TableField(exist = false)
    private Integer name;
    private Integer oprateType;
    private Date oprateDay;
    @TableField(exist = false)
    private Date oprateDay2;
    private String terminalIp;
@@ -48,5 +55,11 @@
    @ApiModelProperty(value = "是否已阅读,此功能针对异常信息")
    private Integer readFlag;
    @TableField(exist = false)
    private String operationTypeStr;
    @TableField(exist = false)
    private Integer eventType;
}
src/main/java/com/whyc/service/DocLogService.java
@@ -1,11 +1,100 @@
package com.whyc.service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.whyc.constant.UserOperation;
import com.whyc.mapper.DocLogMapper;
import com.whyc.pojo.DocLog;
import com.whyc.pojo.UserLog;
import com.whyc.util.ActionUtil;
import com.whyc.util.DateUtil;
import com.whyc.util.ExcelUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;
@Service
public class DocLogService {
    @Autowired
    @Autowired(required = false)
    private DocLogMapper mapper;
    public void recordOperationLog(Long uId, Integer operationType, Date operationTime, String terminalIp, String operationMsg, String operationDetail) {
        DocLog docLog=new DocLog();
        docLog.setId(uId.intValue());
        docLog.setOprateType(operationType);
        docLog.setOprateDay(operationTime);
        docLog.setTerminalIp(terminalIp);
        docLog.setOprateMsg(operationMsg);
        docLog.setOperationDetail(operationDetail);
        mapper.insert(docLog);
    }
    public PageInfo<DocLog> getPage(int pageNum, int pageSize, DocLog docLog) {
        PageHelper.startPage(pageNum,pageSize,true);
        //这个接口要兼容新老审计日志记录的查询
        List<DocLog> userLogList = mapper.getList(docLog);
        userLogList.stream().forEach(docLog1-> {
            switch (docLog1.getOprateType()){
                case 1: docLog1.setOperationTypeStr(UserOperation.TYPE_LOGIN.getTypeName());break;
                case 2: docLog1.setOperationTypeStr(UserOperation.TYPE_LOGOUT.getTypeName());break;
                case 3: docLog1.setOperationTypeStr(UserOperation.TYPE_ADD.getTypeName());break;
                case 4: docLog1.setOperationTypeStr(UserOperation.TYPE_UPDATE.getTypeName());break;
                case 5: docLog1.setOperationTypeStr(UserOperation.TYPE_DELETE.getTypeName());break;
                case 20:docLog1.setOperationTypeStr(UserOperation.TYPE_UNAUTHORIZED_ACCESS.getTypeName());break;
                case 21:docLog1.setOperationTypeStr(UserOperation.TYPE_EXCEPTION.getTypeName());break;
                case 31:docLog1.setOperationTypeStr(UserOperation.TYPE_LOGIN_FAIL.getTypeName());break;
                case 32:docLog1.setOperationTypeStr(UserOperation.TYPE_PARAM_CHANGE.getTypeName());break;
                case 33:docLog1.setOperationTypeStr(UserOperation.TYPE_PASSWORD_CHANGE.getTypeName());break;
                case 34:docLog1.setOperationTypeStr(UserOperation.TYPE_LOGIN_TIMEOUT.getTypeName());break;
                default:docLog1.setOperationTypeStr(UserOperation.TYPE_UNRECOGNIZED.getTypeName());
            }
        });
        PageInfo<DocLog> pageInfo = new PageInfo<>(userLogList);
        return pageInfo;
    }
    public void exportExcel(HttpServletResponse response, String[][] value) {
        String[] columnTitleArr = new String[]{"操作人姓名","操作类型","操作时间","终端IP","操作事件","具体参数"};
        String now = DateUtil.YYYY_MM_DD_HH_MM_SS_UNION.format(new Date());
        ExcelUtil.exportExcel("UserLog-"+now,"测试sheet1",columnTitleArr,value,new HSSFWorkbook(),response);
    }
    public void record(long uId, int operationType, String msg) {
        DocLog docLog = new DocLog();
        docLog.setTerminalIp(ActionUtil.getRequest().getRemoteAddr());
        docLog.setOprateDay(new Date());
        docLog.setId((int)(uId));
        docLog.setOprateType(operationType);
        docLog.setOprateMsg(msg);
        mapper.insert(docLog);
    }
    public void record(long uId, int operationType, String msg,String msgDetail) {
        DocLog docLog = new DocLog();
        docLog.setTerminalIp(ActionUtil.getRequest().getRemoteAddr());
        docLog.setOprateDay(new Date());
        docLog.setId((int)(uId));
        docLog.setOprateType(operationType);
        docLog.setOprateMsg(msg);
        docLog.setOperationDetail(msgDetail);
        mapper.insert(docLog);
    }
    public void record2(HttpServletRequest request, long uId, int operationType, String msg, String msgDetail) {
        DocLog docLog = new DocLog();
        docLog.setTerminalIp(request.getRemoteAddr());
        //userLog.setTerminalIp(request.getRemoteAddr());
        docLog.setOprateDay(new Date());
        docLog.setId((int)(uId));
        docLog.setOprateType(operationType);
        docLog.setOprateMsg(msg);
        docLog.setOperationDetail(msgDetail);
        mapper.insert(docLog);
    }
}
src/main/java/com/whyc/service/UserLogService.java
File was deleted
src/main/java/com/whyc/util/CommonUtil.java
@@ -1,7 +1,7 @@
package com.whyc.util;
import com.whyc.pojo.UserInf;
import com.whyc.service.UserLogService;
import com.whyc.service.DocLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.stereotype.Component;
@@ -15,11 +15,11 @@
@Component
public class CommonUtil {
    private static UserLogService userLogService;
    private static DocLogService docLogService;
    @Autowired
    public void setUserLogService(UserLogService userLogService) {
        CommonUtil.userLogService = userLogService;
    public void setUserLogService(DocLogService docLogService) {
        CommonUtil.docLogService = docLogService;
    }
    /**获取当前Session中的属性user*/
@@ -35,15 +35,15 @@
    /**手动记录特定日志*/
    public static void record(long uId, int operationType, String msg){
        userLogService.record(uId,operationType,msg);
        docLogService.record(uId,operationType,msg);
    }
    /**手动记录特定日志*/
    public static void record(long uId, int operationType, String msg,String msgDetail){
        userLogService.record(uId,operationType,msg,msgDetail);
        docLogService.record(uId,operationType,msg,msgDetail);
    }
    /**手动记录特定日志*/
    public static void record2(HttpServletRequest request,long uId, int operationType, String msg,String msgDetail){
        userLogService.record2(request,uId,operationType,msg,msgDetail);
        docLogService.record2(request,uId,operationType,msg,msgDetail);
    }
}
src/main/resources/mapper/DocLogMapper.xml
@@ -2,5 +2,94 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.whyc.mapper.DocLogMapper">
    <resultMap id="Map_docLog" type="docLog">
        <id property="num" column="num"/>
        <result property="id" column="id"/>
        <result property="oprateType" column="oprate_type"/>
        <result property="oprateDay" column="oprate_day"/>
        <result property="terminalIp" column="terminal_ip"/>
        <result property="oprateMsg" column="oprate_msg"/>
        <result property="operationDetail" column="operation_detail"/>
        <result property="name" column="name"/>
    </resultMap>
    <select id="getList" resultMap="Map_docLog">
        select l.*,u.name from db_doc.tb_doc_log l,db_doc.tb_doc_user u
        where l.uId = u.uId
        and uOprateDay between #{oprateDay} and  #{oprateDay2}
        <if test="id !=null">
            and l.id = #{id}
        </if>
        <!--条件查询-非全部-->
        <if test="eventType !=null">
            <choose>
                <!--系统级别(1)-->
                <when test="eventType ==1">
                    <choose>
                        <when test="oprateType ==1
                            or oprateType ==2
                            or oprateType ==20
                            or oprateType ==21
                        ">
                            <choose>
                                <!--登录包括普通登录和临时凭证ID登录-->
                                <when test="oprateType ==1">
                                    and oprate_type in (#{oprateType},35)
                                </when>
                                <otherwise>
                                    and oprate_type= #{oprateType}
                                </otherwise>
                            </choose>
                        </when>
                        <when test="oprateType ==31
                            or oprateType ==32
                            or oprateType ==33
                            or oprateType ==34">
                            and oprate_type= #{oprateType}
                            <choose>
                                <when test="oprateType ==31">
                                    or oprate_msg  regexp '登录PC系统失败'
                                </when>
                                <when test="oprateType ==32">
                                    or oprate_msg  regexp '配置参数修改|导航配置'
                                </when>
                                <when test="oprateType ==33">
                                    or oprate_msg  regexp '密码' and oprate_msg not regexp '更新密码复杂度规则'
                                </when>
                                <otherwise>
                                    or oprate_msg  regexp 'LoginAction!login|imeout'
                                </otherwise>
                            </choose>
                        </when>
                        <when test="oprateType == 3 or oprateType == 4 or oprateType == 5">
                            and oprate_type= #{oprateType}
                            and oprate_msg  regexp
                            '添加新用户|的用户信息|权限组|审计数据记录容量
                            |执行了User模块|执行了PermitGroup'
                        </when>
                    </choose>
                </when>
                <!--业务级别-机房(2)-->
                <when test="eventType ==2">
                    and oprate_type= #{oprateType}
                    and oprate_msg regexp '单体|电池组|组端|设备|Batt|Dev|FBO|Fbs|Ld9|Li9130|Lithium|Station3D'
                    and oprate_msg not regexp '电源|Pwrdev'
                </when>
                <!--业务级别-电源(3)-->
                <when test="eventType ==3">
                    and oprate_type= #{oprateType}
                    and oprate_msg regexp 'PowerInf|Pwr'
                </when>
                <!--业务级别-其他(4)-->
                <when test="eventType ==4">
                    and oprate_type= #{oprateType}
                    and oprate_msg not regexp '添加新用户|的用户信息|权限组|审计数据记录容量|配置参数修改|导航配置|密码|单体|电池组|组端|设备|电源|
                    |执行了User模块|执行了PermitGroup|
                    |Batt|Dev|FBO|Fbs|Ld9|Li9130|Lithium|Station3D|
                    |PowerInf|Pwr'
                </when>
            </choose>
        </if>
        ORDER BY oprate_day DESC
    </select>
</mapper>
src/main/resources/mapper/UserLogMapper.xml
File was deleted