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
package com.moral.api.aop.log;
 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.moral.api.entity.ManageLog;
import com.moral.api.entity.Organization;
import com.moral.api.mapper.ManageLogMapper;
import com.moral.api.mapper.OrganizationMapper;
import com.moral.api.pojo.dto.login.AccountInfoDTO;
import com.moral.api.pojo.form.organization.OrganizationDeleteForm;
import com.moral.api.pojo.form.organization.OrganizationInsertForm;
import com.moral.api.pojo.form.organization.OrganizationUpdateForm;
import com.moral.constant.Constants;
import com.moral.constant.ResponseCodeEnum;
import com.moral.util.TokenUtils;
import com.moral.util.WebUtils;
import lombok.Data;
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.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
 
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Map;
 
/**
 * @ClassName OperationLogAspect
 * @Description 操作日志切面类
 * @Author 陈凯裕
 * @Date 2021/3/31 13:54
 * @Version TODO
 **/
@Aspect
@Component
@ConfigurationProperties(prefix = "log-aspect")
@Data
public class OperationLogAspect {
 
    @Autowired
    ManageLogMapper manageLogMapper;
 
    @Autowired
    OrganizationMapper organizationMapper;
 
    Map<String,String> organizationFormMap;
 
 
    /**
     * @Description: 设置切入点为OperationLogAnno注解使用的地方
     * @Param: []
     * @return: void
     * @Author: 陈凯裕
     * @Date: 2021/3/31
     */
    @Pointcut("@annotation(com.moral.api.aop.log.OperationLogAnno)")
    public void pointCut() {
    }
 
 
    /**
     * @Description: 后置通知,存日志到数据库
     * @Param: [joinPoint, result]方法切入点,方法返回值
     * @return: void
     * @Author: 陈凯裕
     * @Date: 2021/3/31
     */
    @AfterReturning(returning = "result", value = "pointCut()")
    @Transactional
    public void saveOperLog(JoinPoint joinPoint, Object result) throws Throwable {
        //判断操作是否成功,失败不计入日志
        Map resultMap = JSONObject.parseObject(JSONObject.toJSONString(result), Map.class);
        if (!ResponseCodeEnum.SUCCESS.getCode().equals(resultMap.get("code")))
            return;
        //获取请求参数
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
        Object parameters = request.getAttribute("parameters");
        String token = request.getHeader("token");
        //获取module和type
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();//获取切入点方法信号
        Method method = signature.getMethod();//获取切入点的方法
        OperationLogAnno anno = method.getAnnotation(OperationLogAnno.class);//获取方法的注解
        String module = anno.module();//获取操作的模块
        String type = anno.type();//获取操作的类型
        //获取操作用户id ip 名称
        Integer id = Integer.parseInt(TokenUtils.getUidByToken(token));
        String ip = WebUtils.getIpAddr(request);
        AccountInfoDTO account = (AccountInfoDTO) TokenUtils.getUserInfoByToken(token);
        String accountName = account.getAccount().getUserName();
        //获取content
        String content = getContent(type,module,parameters);
        content = content+"操作人员:"+accountName+";";
        //存入数据库
        ManageLog manageLog = new ManageLog();
        manageLog.setContent(content);
        manageLog.setIp(ip);
        manageLog.setAccountId(id);
        manageLogMapper.insert(manageLog);
 
    }
 
    public String getContent(String type, String module,Object parameters) {
        String content = "";
        if (module.equals(Constants.ORGANIZATION_MODULE_NAME)) {
            content = getOrganizationContent(type,parameters);
        }
 
        return content;
    }
 
    /**
    * @Description: 获取组织模块操作描述
            * @Param: [type, parameters]
            * @return: java.lang.String
            * @Author: 陈凯裕
            * @Date: 2021/4/1
            */
    public String getOrganizationContent(String type,Object parameters) {
        StringBuilder content = new StringBuilder();
        if (type.equals(Constants.INSERT_OPERATE_TYPE)) {//处理组织添加日志插入
            OrganizationInsertForm form = JSON.parseObject(JSON.toJSONString(parameters), OrganizationInsertForm.class);
            String organizationName = form.getName();
            content.append("添加了组织:").append(organizationName).append(";");
        } else if (type.equals(Constants.DELETE_OPERATE_TYPE)) { //处理组织删除日志
            OrganizationDeleteForm form = JSON.parseObject(JSON.toJSONString(parameters), OrganizationDeleteForm.class);
            Organization organization = organizationMapper.selectById(form.getOrganizationId());
            String organizationName = organization.getName();
            content.append("删除了组织:").append(organizationName).append(";");
        } else if (type.equals(Constants.UPDATE_OPERATE_TYPE)) {  //处理组织更新日志
            OrganizationUpdateForm form = JSON.parseObject(JSON.toJSONString(parameters), OrganizationUpdateForm.class);
            Map<String,Object> formMap = JSON.parseObject(JSON.toJSONString(parameters), Map.class);
            Organization organization = organizationMapper.selectById(form.getOrganizationId());
            String organizationName = organization.getName();
            content.append("更新了组织:").append(organizationName).append(";");
            //将formMap中的Key全部替换为中文写入日志
            formMap.forEach((k,v)->{
                String key = organizationFormMap.get(k);
                if(key!=null)
                    content.append(key).append("->").append(v).append(";");
            });
        }
 
        return content.toString();
    }
 
 
}