package com.meeno.inner.oa.extend.operaterecord.aop;

import com.alibaba.fastjson.JSONArray;
import com.google.common.collect.Lists;
import com.meeno.inner.oa.common.utils.AopUtils;
import com.meeno.inner.oa.extend.operaterecord.enums.OperateRecordTypeEnum;
import com.meeno.inner.oa.extend.operaterecord.repository.OperateRecordRepository;
import com.meeno.inner.oa.extend.operaterecord.service.OperateRecordService;
import com.meeno.inner.oa.extend.operaterecord.service.model.OperateRecordModel;
import com.meeno.inner.oa.extend.project.module.controller.form.ModuleModel;
import com.meeno.inner.oa.extend.project.module.entity.Module;
import com.meeno.inner.oa.extend.project.module.enums.ModuleTypeEnum;
import com.meenoframework.common.filter.ThreadLocalClient;
import lombok.NoArgsConstructor;
import lombok.extern.java.Log;
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 java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List; /**
* @description: 切面类
* @author: Wzq
* @create: 2020-03-30 11:20
*/
@Aspect
@Component
@Log
public class ModuleAspect { @Autowired
private OperateRecordService operateRecordService; @Pointcut("execution(public * com.meeno.inner.oa.extend.project.module.service.ModuleService.*(..))")
public void cutPoint(){} /**
* AfterReturning遇到异常不执行
* @param joinPoint
* @param retrunObj 方法返回值
*/
@AfterReturning(returning="retrunObj",pointcut = "cutPoint()")
public void before(JoinPoint joinPoint,Object retrunObj){
//获取方法名称
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
log.info("aop->MethodName:"+method.getName());
//方法中的值
Object[] args = joinPoint.getArgs();
/*Object target = joinPoint.getTarget();
Object aThis = joinPoint.getThis();
String classType = joinPoint.getTarget().getClass().getName();*/
//方法名称
String methodName = joinPoint.getSignature().getName();
MethodNameEnum methodNameEnum = MethodNameEnum.get(methodName);
HashMap<String, Object> fieldsMap = AopUtils.getFieldsName(method, args); //获取操作记录的Model
List<OperateRecordModel> operationRecordList = null;
if(methodNameEnum != null){
operationRecordList = this.getOperationRecord(methodNameEnum, fieldsMap,retrunObj);
} this.operateRecordService.addAll(operationRecordList); } public List<OperateRecordModel> getOperationRecord(MethodNameEnum methodNameEnum, HashMap<String, Object> fieldsMap,Object retrunObj){
//操作记录Model
List<OperateRecordModel> recordModelList = Lists.newArrayList();
Long loginUserId = ThreadLocalClient.get().getId();
//操作日志类型
OperateRecordTypeEnum type = OperateRecordTypeEnum.MODULE;
//模块
Module module = null;
//操作日志内容
StringBuffer content = new StringBuffer();
ModuleModel model = null;
OperateRecordModel recordModel = null;
switch (methodNameEnum){
case ADD:
content.append("创建了->");
String moduleTypeStr = null;
model = (ModuleModel) fieldsMap.get("model");
//项目id
Long projectId = model.getProjectId();
//获取模块层级
this.moduleModelLevelToString(model,content);
//获取功能点数组字符串
moduleTypeStr = model.getModuleTypeStr();
//判断是否是多个type
if(moduleTypeStr != null && !moduleTypeStr.isEmpty()){
//生成多条记录
JSONArray jsonArray = JSONArray.parseArray(moduleTypeStr);
if(jsonArray != null && !jsonArray.isEmpty()){
for (int i = 0; i < jsonArray.size(); i++) {
Integer moduleTypeCode = jsonArray.getInteger(i);
ModuleTypeEnum typeEnum = ModuleTypeEnum.getModuleTypeEnum(moduleTypeCode);
switch (typeEnum){
case WEB:
content.append(" 类型:web");
break;
case IOS:
content.append(" 类型:ios");
break;
case ANDROID:
content.append(" 类型:android");
break;
case SERVER:
content.append(" 类型:server");
break;
}
//每个type创建一条操作记录
OperateRecordModel tempRecordModel = new OperateRecordModel();
tempRecordModel.setProjectId(projectId);
tempRecordModel.setUserId(loginUserId);
tempRecordModel.setContent(content.toString());
tempRecordModel.setType(type);
//加入到集合中
recordModelList.add(tempRecordModel);
}
}
}else{
//生成一条记录
recordModel = new OperateRecordModel();
recordModel.setProjectId(projectId);
recordModel.setUserId(loginUserId);
recordModel.setContent(content.toString());
recordModel.setType(type);
//加入到集合中
recordModelList.add(recordModel);
}
break;
case EDIT:
content.append("编辑了->");
//方法中的参数
model = (ModuleModel) fieldsMap.get("model");
//返回的对象
module = (Module) retrunObj;
//获取模块层级
this.moduleModelLevelToString(model,content);
content.append(" 预计投入修改为: " + model.getPredictInput());
//生成一条记录
recordModel = new OperateRecordModel();
recordModel.setProjectId(module.getProjectId());
recordModel.setUserId(loginUserId);
recordModel.setContent(content.toString());
recordModel.setType(type);
//加入到集合中
recordModelList.add(recordModel);
break;
case DELETE:
content.append("删除了->");
//返回的对象
module = (Module) retrunObj;
//获取模块层级
this.moduleLevelToString(module,content);
//生成一条记录
recordModel = new OperateRecordModel();
recordModel.setProjectId(module.getProjectId());
recordModel.setUserId(loginUserId);
recordModel.setContent(content.toString());
recordModel.setType(type);
//加入到集合中
recordModelList.add(recordModel);
break;
case EDIT_STATUS:
content.append("修改模块状态->");
//返回的对象
module = (Module) retrunObj;
//获取模块层级
this.moduleLevelToString(module,content);
//获取模块的状态
this.moduleStatusToString(module,content);
//生成一条记录
recordModel = new OperateRecordModel();
recordModel.setProjectId(module.getProjectId());
recordModel.setUserId(loginUserId);
recordModel.setContent(content.toString());
recordModel.setType(type);
//加入到集合中
recordModelList.add(recordModel);
break;
case EDIT_REAL_INPUT:
content.append("修改模块实际投入->");
//返回的对象
module = (Module) retrunObj;
//获取模块层级
this.moduleLevelToString(module,content);
content.append(" 修改实际投入为: " + module.getRealInput());
//生成一条记录
recordModel = new OperateRecordModel();
recordModel.setProjectId(module.getProjectId());
recordModel.setUserId(loginUserId);
recordModel.setContent(content.toString());
recordModel.setType(type);
//加入到集合中
recordModelList.add(recordModel);
break;
case EDIT_PREDICT_INPUT:
content.append("修改模块预计投入->");
//返回的对象
module = (Module) retrunObj;
//获取模块层级
this.moduleLevelToString(module,content);
content.append(" 修改预计投入为: " + module.getRealInput());
//生成一条记录
recordModel = new OperateRecordModel();
recordModel.setProjectId(module.getProjectId());
recordModel.setUserId(loginUserId);
recordModel.setContent(content.toString());
recordModel.setType(type);
//加入到集合中
recordModelList.add(recordModel);
break;
/*case SET_WEIGHT:
break;*/
default:
break; }
return recordModelList;
} /**
* 修改模块的状态ToString
* @param module
* @param content
*/
private void moduleStatusToString(Module module,StringBuffer content){
if(module != null){
switch (module.getStatus()){
case NOT_INITIATED:
//未开始
content.append(" 修改状态为:未开始");
break;
case PROCESSING:
//进行中
content.append(" 修改状态为:进行中");
break;
case OVER:
//结束
content.append(" 修改状态为:结束");
break;
} } } /**
* 模块ModelToString
* @param model
* @param content
*/
private void moduleLevelToString(Module model,StringBuffer content){
if(model != null){
switch (model.getLevel()){
case one:
//一级模块
content.append("一级模块名称:" + model.getName());
break;
case two:
//二级模块
content.append("二级模块名称:" + model.getName());
break;
case three:
//三级模块
content.append("功能点名称:" + model.getName());
break;
}
}
} /**
* 模块ModelLevelToString
* @param model
* @param content
*/
private void moduleModelLevelToString(ModuleModel model,StringBuffer content){
if(model != null){
switch (model.getLevel()){
case one:
//一级模块
content.append("一级模块名称:" + model.getModuleName());
break;
case two:
//二级模块
content.append("二级模块名称:" + model.getModuleName());
break;
case three:
//三级模块
content.append("功能点名称:" + model.getModuleName());
break;
}
}
} @NoArgsConstructor
private enum MethodNameEnum{
ADD("add"),
EDIT("edit"),
DELETE("delete"),
EDIT_STATUS("editStatus"),
EDIT_REAL_INPUT("editRealInput"),
EDIT_PREDICT_INPUT("editPredictInput"),
SET_WEIGHT("setWeight")
; private String methodName; MethodNameEnum(String methodName) {
this.methodName = methodName;
} public String getMethodName() {
return methodName;
} public void setMethodName(String methodName) {
this.methodName = methodName;
} public static MethodNameEnum get(String methodName){
MethodNameEnum[] values = MethodNameEnum.values();
for (MethodNameEnum value : values) {
if (value.methodName.equals(methodName)) {
return value;
}
}
return null;
}
} }

SpringBoot-AOP记录操作日志的更多相关文章

  1. 使用SpringBoot AOP 记录操作日志、异常日志

    平时我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能:我们在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因我们都要到服务器去查询日志才能找到,而且也不能对发 ...

  2. Spring aop 记录操作日志 Aspect

    前几天做系统日志记录的功能,一个操作调一次记录方法,每次还得去收集参数等等,太尼玛烦了.在程序员的世界里,当你的一个功能重复出现多次,就应该想想肯定有更简单的实现方法.于是果断搜索各种资料,终于搞定了 ...

  3. spring-boot-route(十七)使用aop记录操作日志

    在上一章内容中--使用logback管理日志,我们详细讲述了如何将日志生成文件进行存储.但是在实际开发中,使用文件存储日志用来快速查询问题并不是最方便的,一个优秀系统除了日志文件还需要将操作日志进行持 ...

  4. springmvc集成aop记录操作日志

    首先说明一下,这篇文章只做了记录日志相关事宜 具体springmvc如何集成配置aop对cotroller进行拦截,请看作者的另一篇文章 http://www.cnblogs.com/guokai87 ...

  5. Spring aop 记录操作日志 Aspect 自定义注解

    时间过的真快,转眼就一年了,没想到随手写的笔记会被这么多人浏览,不想误人子弟,于是整理了一个优化版,在这里感谢智斌哥提供的建议和帮助,话不多说,进入正题 所需jar包 :spring4.3相关联以及a ...

  6. 用AOP记录操作日志,并写进数据库。

    先用AOP注解 1 package com.vlandc.oss.apigate.log.aspect; import java.util.Map; import java.util.Optional ...

  7. Springboot AOP写操作日志 GET POST

    pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  8. [编码实践]SpringBoot实战:利用Spring AOP实现操作日志审计管理

    设计原则和思路: 元注解方式结合AOP,灵活记录操作日志 能够记录详细错误日志为运营以及审计提供支持 日志记录尽可能减少性能影响 操作描述参数支持动态获取,其他参数自动记录. 1.定义日志记录元注解, ...

  9. Spring Boot中使用AOP记录请求日志

    这周看别人写的springboot后端代码中有使用AOP记录请求日志,以前没接触过,因此学习下. 一.AOP简介 AOP为Aspect Oriented Programming的缩写,意为:面向切面编 ...

  10. Spring Boot AOP 简易操作日志管理

    AOP (Aspect Oriented Programming) 面向切面编程. 业务有核心业务和边缘业务. 比如用户管理,菜单管理,权限管理,这些都属于核心业务. 比如日志管理,操作记录管理,这些 ...

随机推荐

  1. ESP32构建系统(CMake版)

    ESP32 芯片是一款 2.4 GHz Wi-Fi 和蓝牙双模芯片,内置 1 或 2 个 32 位处理器,运算能力最高可达 600 DMIPS. ESP-IDF 即乐鑫物联网开发框架,可为在 Wind ...

  2. 「CF585E」 Present for Vitalik the Philatelist

    「CF585E」 Present for Vitalik the Philatelist 传送门 我们可以考虑枚举 \(S'=S\cup\{x\}\),那么显然有 \(\gcd\{S'\}=1\). ...

  3. Spring Boot(三):Spring Boot中的事件的使用 与Spring Boot启动流程(Event 事件 和 Listeners监听器)

    前言:在讲述内容之前 希望大家对设计模式有所了解 即使你学会了本片的内容 也不知道什么时候去使用 或者为什么要这样去用 观察者模式: 观察者模式是一种对象行为模式.它定义对象间的一种一对多的依赖关系, ...

  4. C语言:fopen

    fopen,传递文件名参数,w+选项读取用fread或fgets,其中fread是按字节读取,fgets每次读取一个字符串写入用fwrite或fputs或fprintf,fwrite按字节写入,fpu ...

  5. C语言:位运算加密

    数据加密解密是一个常用的功能,如果你不希望让别人看到文件中的内容,可以通过密钥(也称"密码")将文件的内容加密.比如文本文件(.txt),加密前的内容是能够读懂的,加密后的内容是& ...

  6. 【LeetCode】724. 寻找数组的中心下标

    724. 寻找数组的中心下标 知识点:数组:前缀和: 题目描述 给你一个整数数组 nums ,请计算数组的 中心下标 . 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的 ...

  7. 使用Elastic Job的分片配置加速任务执行和提高资源利用率

    上一篇,我们介绍了如何使用Elastic Job实现定时任务.解决了使用@Scheduled来实现时候存在的竞争问题,同时也实现了定时任务的高可用执行. 然而,还有一类问题是我们在做定时任务时候容易出 ...

  8. cookie详解(八)

    一.什么是cookie 1.大概了解 什么是 Cookie?针对不同用户,做出不同的响应.,这就是Cookie的原理.是浏览器储存在用户的机器上的(可见免用户名登录)1. Cookie翻译过来是饼干的 ...

  9. 离线安装rpm包并解决依赖(升级vsftpd为例)

    背景  实际开发中,我们的linux服务器是处理离线状态的,并不能访问互联网.如果此时要在linux上安装或者升级软件,就只能通过rpm包的安装方式.rpm包安装有一个缺陷,就是不能处理安装包的依赖问 ...

  10. tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

    writedby 张艳涛,看springmvc 的源码太难了,怎么办, 这篇文章主要分析了看透springmvc的第9章结尾的 如何解析xml 命名空间标签 <?xml version=&quo ...