whycxzp
2023-12-13 bffd7fca80dd79adb5621b992beca63ab06b9d16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
package com.whyc.aop;
 
import com.whyc.constant.OperationLogEnum;
import com.whyc.dto.Response;
import com.whyc.service.OperationLogService;
import com.whyc.util.UserUtil;
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 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
        int uId = UserUtil.getUser().getUid();
        Response response = (Response) resp;
        Signature signature = point.getSignature();
        String methodSignature = signature.toString();
        //方法名
        // e.g:update
        String methodName = signature.getName();
        //执行的类全名
        // e.g: com.whyc.controller.CKPowerDevRtSetController
        String fullClassName = signature.getDeclaringTypeName();
        //获取类型
        String[] fullClassNameSplit = fullClassName.split("\\.");
        //类名
        // e.g: CKPowerDevRtSetController
        String classNameTrue = fullClassNameSplit[fullClassNameSplit.length - 1];
        Integer type1 = 0;
        Integer type2 = 0;
        String operationTypeName = "";
 
        //系统级
        if (classNameTrue.equals("UserInfController")) {
            if(methodName.contains("add")){ //用户新增
                type1 = OperationLogEnum.TYPE_1_SYS.getType();
                type2 = OperationLogEnum.TYPE_2_USER_ADD.getType();
                operationTypeName = OperationLogEnum.TYPE_2_USER_ADD.getName();
 
            }else if(methodName.contains("update")){ //用户修改
                type1 = OperationLogEnum.TYPE_1_SYS.getType();
                type2 = OperationLogEnum.TYPE_2_USER_UPDATE.getType();
                operationTypeName = OperationLogEnum.TYPE_2_USER_UPDATE.getName();
            }else if(methodName.contains("delete")){ //用户删除
                type1 = OperationLogEnum.TYPE_1_SYS.getType();
                type2 = OperationLogEnum.TYPE_2_USER_DELETE.getType();
                operationTypeName = OperationLogEnum.TYPE_2_USER_DELETE.getName();
            }else if(methodName.contains("updatePassword")){ //密码重置 TODO
                type1 = OperationLogEnum.TYPE_1_SYS.getType();
                type2 = OperationLogEnum.TYPE_2_USER_UPDATE_PASSWORD.getType();
                operationTypeName = OperationLogEnum.TYPE_2_USER_UPDATE_PASSWORD.getName();
            }
 
        }else if(classNameTrue.equals("LoginController")){
            if(methodName.equals("login")){
                if((boolean) response.getData()){ //用户登录
                    type1 = OperationLogEnum.TYPE_1_SYS.getType();
                    type2 = OperationLogEnum.TYPE_2_LOGIN.getType();
                    operationTypeName = OperationLogEnum.TYPE_2_LOGIN.getName();
                }else { //用户登录失败
                    type1 = OperationLogEnum.TYPE_1_SYS.getType();
                    type2 = OperationLogEnum.TYPE_2_LOGIN_FAIL.getType();
                    operationTypeName = OperationLogEnum.TYPE_2_LOGIN_FAIL.getName();
                }
            }else if(methodName.equals("logout")){ //用户退出
                type1 = OperationLogEnum.TYPE_1_SYS.getType();
                type2 = OperationLogEnum.TYPE_2_LOGOUT.getType();
                operationTypeName = OperationLogEnum.TYPE_2_LOGOUT.getName();
            }
        }
        //业务级
        else if(classNameTrue.equals("CKPowerDevSignalSetController")
        ||classNameTrue.equals("CKPowerDevRtSetController")){ //电源设备设置
            if(methodName.startsWith("update")){
                type1 = OperationLogEnum.TYPE_1_SERVICE.getType();
                type2 = OperationLogEnum.TYPE_2_POWER_UPDATE.getType();
                operationTypeName = OperationLogEnum.TYPE_2_POWER_UPDATE.getName();
            }
        }else if(classNameTrue.equals("CKPowerDevBattRtStateSetController")){ //核容装置设置
            if(methodName.startsWith("update")){
                type1 = OperationLogEnum.TYPE_1_SERVICE.getType();
                type2 = OperationLogEnum.TYPE_2_BATTERY_UPDATE.getType();
                operationTypeName = OperationLogEnum.TYPE_2_BATTERY_UPDATE.getName();
            }
        }else if(classNameTrue.contains("Alarm")
                ||classNameTrue.contains("Alm")){ //告警设置
            if(methodName.startsWith("update")){
                type1 = OperationLogEnum.TYPE_1_SERVICE.getType();
                type2 = OperationLogEnum.TYPE_2_ALARM.getType();
                operationTypeName = OperationLogEnum.TYPE_2_ALARM.getName();
            }
        }
        // TODO else if()
 
 
 
        String module = "模块";
        String className = classNameTrue.replace("Controller:", module);
 
       /* //操作时间
        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++) {
            if (args[i] != null) {
                map.put(parameterNames[i], args[i].toString());
            }
        }
        String operationMsg = "执行了" + className + "的" + operationTypeName + "操作.";
        String operationDetail = "具体调用方法为:" + methodName + ",具体参数为:" + map.toString();
 
        service.record(uId, type1, type2, operationMsg, operationDetail);
 
    }
 
}