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. 初步了解Unix系统的I/O模式

    I/O模式 对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间. 当一个read操作发生时,它会经历两个阶段: 等待数据 ...

  2. [刘阳Java]_程序员Java编程进阶的5个注意点,别编程两三年还是增删改查

    此文章也是关注网上好几篇技术文章后,今天分享出来.因为,总有在程序学习路上的小伙伴会感到迷茫.而迷茫存在的情况如下 第一种:在大学学习中出现的迷茫,不知道Java到底要学什么.学习Java的标准是什么 ...

  3. Windows内核开发-3-内核编程基础

    Windows内核开发-3-内核编程基础 这里会深入讲解kernel内核的API.结构体.和一些定义.考察代码在内核驱动中运行的机制.最后把所有知识合在一起写一个有用的驱动. 本章学习要点: 1:通用 ...

  4. java网络编程基础——TCP网络编程三

    AIO实现非阻塞通信 java7 NIO2 提供了异步Channel支持,这种异步Channel可以提供更高效的IO,这种基于异步Channel的IO被称为异步IO(Asynchronous IO) ...

  5. Java下如何保证多线程安全

    前言         可能有人会觉得,只要我写代码的时候不去开启其他线程,那么就不会有多线程的问题了.         然而事实并非如此,如果仅仅是一些简单的测试代码,确实代码都会顺序执行而不是并发执 ...

  6. Thinkphp 生成的验证码不显示问题解决

    在调用验证码之前加上   ob_clean(); 将: public function verify(){                $verify = new \Think\Verify();  ...

  7. 一文读懂Spring动态配置多数据源---源码详细分析

    Spring动态多数据源源码分析及解读 一.为什么要研究Spring动态多数据源 ​ 期初,最开始的原因是:想将答题服务中发送主观题答题数据给批改中间件这块抽象出来, 但这块主要使用的是mq消息的方式 ...

  8. 自学linux——4.Linux的自有服务(基础篇)

    linux自有服务(内置) 一.运行级别(模式) 在Linux中存在一个进程:init,进程id是1. 查看进程:#ps -ef|grep init 对应的配置文件:inittab(运行级别配置文件位 ...

  9. OI卷题记录

    2021.8.2 LG3386 匈牙利算法 二分图 LG1377 笛卡尔树 题解 2021.8.3 LG2962 \(\text{Meet in middle}\) LG3389 高斯消元 高斯-约旦 ...

  10. 工具idea 基于maven 创建springMVC项目

    SpringMVC Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单.这些控制器一般不 ...