whycxzp
2021-10-29 20d78aac4c8e6d15b279a9389ffdf4e9b0719b28
更新全局日志捕捉
2个文件已修改
5个文件已添加
271 ■■■■■ 已修改文件
pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/aop/OperationLogAspect.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/constant/UserOperation.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/OperationLogMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/OperationLog.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/OperationLogService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/util/ActionUtil.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -133,6 +133,11 @@
            <artifactId>commons-codec</artifactId>
            <version>1.10</version>
        </dependency>
        <!--添加aop-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
    </dependencies>
    <build>
src/main/java/com/whyc/aop/OperationLogAspect.java
New file
@@ -0,0 +1,103 @@
package com.whyc.aop;
import com.whyc.constant.UserOperation;
import com.whyc.service.OperationLogService;
import com.whyc.util.ActionUtil;
import org.aspectj.lang.JoinPoint;
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 OperationLogService 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();
        //操作类型:目前记录 增删改/登录登出
        String methodName = point.getSignature().getName();
        Integer operationType = 0;
        String  operationTypeName = null;
        if(methodName.contains("update")){
            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 fullClassName = point.getSignature().getDeclaringTypeName().toString();
        //获取类型
        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) point.getSignature()).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());
        }
        String operationMsg = "执行了"+className+"的"+operationTypeName+"操作.";
        String operationDetail = "具体调用方法为:"+methodName+",具体参数为:"+map.toString();
        service.record(uId,operationType,operationTime,terminalIp,operationMsg,operationDetail);
    }
}
src/main/java/com/whyc/constant/UserOperation.java
New file
@@ -0,0 +1,40 @@
package com.whyc.constant;
/**用户操作类型*/
public enum UserOperation {
    /**操作类型*/
    TYPE_LOGIN(1,"登录系统"),
    TYPE_LOGOUT(2,"登出系统"),
    TYPE_ADD(3,"新增"),
    TYPE_UPDATE(4,"修改"),
    TYPE_DELETE(5,"删除"),
    /**操作分类 TODO,不确定会使用*/
    SORT_LOGIN(1000,"登录"),
    SORT_COMMON(1001,"常规操作");
    private Integer type;
    private String typeName;
    UserOperation(Integer type, String typeName) {
        this.type = type;
        this.typeName = typeName;
    }
    public Integer getType() {
        return type;
    }
    public void setType(Integer type) {
        this.type = type;
    }
    public String getTypeName() {
        return typeName;
    }
    public void setTypeName(String typeName) {
        this.typeName = typeName;
    }
}
src/main/java/com/whyc/mapper/OperationLogMapper.java
New file
@@ -0,0 +1,6 @@
package com.whyc.mapper;
import com.whyc.pojo.OperationLog;
public interface OperationLogMapper extends CustomMapper<OperationLog> {
}
src/main/java/com/whyc/pojo/OperationLog.java
New file
@@ -0,0 +1,95 @@
package com.whyc.pojo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.ToString;
import org.apache.ibatis.type.Alias;
import java.util.Date;
@Alias("OperationLog")
@TableName(value = "tb_user_log")
@ToString
public class OperationLog {
    private Long num;
    @TableField("uId")
    private Integer uId;
    @TableField("uOprateType")
    private Integer operationType;
    @TableField("uOprateDay")
    private Date operationTime;
    @TableField("uTerminalIp")
    private String terminalIp;
    @TableField("uOprateMsg")
    private String operationMsg;
    private String operationDetail;
    public OperationLog() {
    }
    public OperationLog(Long num, Integer uId, Integer operationType, Date operationTime, String terminalIp, String operationMsg, String operationDetail) {
        this.num = num;
        this.uId = uId;
        this.operationType = operationType;
        this.operationTime = operationTime;
        this.terminalIp = terminalIp;
        this.operationMsg = operationMsg;
        this.operationDetail = operationDetail;
    }
    public Long getNum() {
        return num;
    }
    public void setNum(Long num) {
        this.num = num;
    }
    public Integer getuId() {
        return uId;
    }
    public void setuId(Integer uId) {
        this.uId = uId;
    }
    public Integer getOperationType() {
        return operationType;
    }
    public void setOperationType(Integer operationType) {
        this.operationType = operationType;
    }
    public Date getOperationTime() {
        return operationTime;
    }
    public void setOperationTime(Date operationTime) {
        this.operationTime = operationTime;
    }
    public String getTerminalIp() {
        return terminalIp;
    }
    public void setTerminalIp(String terminalIp) {
        this.terminalIp = terminalIp;
    }
    public String getOperationMsg() {
        return operationMsg;
    }
    public void setOperationMsg(String operationMsg) {
        this.operationMsg = operationMsg;
    }
    public String getOperationDetail() {
        return operationDetail;
    }
    public void setOperationDetail(String operationDetail) {
        this.operationDetail = operationDetail;
    }
}
src/main/java/com/whyc/service/OperationLogService.java
New file
@@ -0,0 +1,20 @@
package com.whyc.service;
import com.whyc.mapper.OperationLogMapper;
import com.whyc.pojo.OperationLog;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
@Service
public class OperationLogService {
    @Resource
    private OperationLogMapper mapper;
    public void record(Long uId, Integer operationType, Date operationTime, String terminalIp, String operationMsg, String operationDetail) {
        OperationLog operationLog = new OperationLog(null, uId.intValue(), operationType, operationTime, terminalIp, operationMsg, operationDetail);
        mapper.insert(operationLog);
    }
}
src/main/java/com/whyc/util/ActionUtil.java
@@ -186,7 +186,7 @@
     * 
     * @return 获取当前session 中的用户对象
     */
    public static Object getUser(){
    public static UserInf getUser(){
        HttpSession session =getSession();
        Object obj=session.getAttribute("user");
        UserInf userInf = new UserInf();