SpringBoot-AOP记录操作日志
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记录操作日志的更多相关文章
- 使用SpringBoot AOP 记录操作日志、异常日志
平时我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能:我们在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因我们都要到服务器去查询日志才能找到,而且也不能对发 ...
- Spring aop 记录操作日志 Aspect
前几天做系统日志记录的功能,一个操作调一次记录方法,每次还得去收集参数等等,太尼玛烦了.在程序员的世界里,当你的一个功能重复出现多次,就应该想想肯定有更简单的实现方法.于是果断搜索各种资料,终于搞定了 ...
- spring-boot-route(十七)使用aop记录操作日志
在上一章内容中--使用logback管理日志,我们详细讲述了如何将日志生成文件进行存储.但是在实际开发中,使用文件存储日志用来快速查询问题并不是最方便的,一个优秀系统除了日志文件还需要将操作日志进行持 ...
- springmvc集成aop记录操作日志
首先说明一下,这篇文章只做了记录日志相关事宜 具体springmvc如何集成配置aop对cotroller进行拦截,请看作者的另一篇文章 http://www.cnblogs.com/guokai87 ...
- Spring aop 记录操作日志 Aspect 自定义注解
时间过的真快,转眼就一年了,没想到随手写的笔记会被这么多人浏览,不想误人子弟,于是整理了一个优化版,在这里感谢智斌哥提供的建议和帮助,话不多说,进入正题 所需jar包 :spring4.3相关联以及a ...
- 用AOP记录操作日志,并写进数据库。
先用AOP注解 1 package com.vlandc.oss.apigate.log.aspect; import java.util.Map; import java.util.Optional ...
- Springboot AOP写操作日志 GET POST
pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- [编码实践]SpringBoot实战:利用Spring AOP实现操作日志审计管理
设计原则和思路: 元注解方式结合AOP,灵活记录操作日志 能够记录详细错误日志为运营以及审计提供支持 日志记录尽可能减少性能影响 操作描述参数支持动态获取,其他参数自动记录. 1.定义日志记录元注解, ...
- Spring Boot中使用AOP记录请求日志
这周看别人写的springboot后端代码中有使用AOP记录请求日志,以前没接触过,因此学习下. 一.AOP简介 AOP为Aspect Oriented Programming的缩写,意为:面向切面编 ...
- Spring Boot AOP 简易操作日志管理
AOP (Aspect Oriented Programming) 面向切面编程. 业务有核心业务和边缘业务. 比如用户管理,菜单管理,权限管理,这些都属于核心业务. 比如日志管理,操作记录管理,这些 ...
随机推荐
- Spring Cloud组件和架构图
Spring Cloud是微服务架构的集大成者,将一系列优秀的组件进行了整合. 服务网关:聚合内部服务,提供统一的对外API接口,屏蔽内部实现.可以解决跨域.认证和前端调用负责的问题,便于项目重构.可 ...
- 交换机卡在CPU task进程处理方法
故障现象: 笔记本通过console线连接H3C交换机的console口,无法登陆,敲任何东西都无效.因为没有备份,不敢重启.显示以下报错: <test-sw> wrong input! ...
- C语言:char 常量写法及变量赋值
#include <stdio.h> main() { char zfx_1,zfx_2,zfx_3,zfx_4,zfx_5,zfx_6,zfx_7,zfx_8; zfx_1='a';// ...
- 交通规则:HOV车道
多乘员车道的限行时间一般为工作日上下班高峰,车上只有一个人时不能走该车道
- C语言:伪代码
伪代码(Pseudocode)是一种算法描述语言.使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(C, Java, Pascal)实现.因此,伪代码必须结构清晰,代码简单,可读性好, ...
- Oracle执行计划总结
一.ORACLE中常见执行计划 表访问的执行计划 1.table access full:全表扫描.它会访问表中的每一条记录. 2.table access by user rowid:输入源rowi ...
- 小猿圈-IT自学人的小圈子 【强力推荐学习】
笔记链接 https://book.apeland.cn/details/322/ 学习视频 https://www.apeland.cn/python
- 排列组合的实现(js描述)
组合的实现 排列组合描述和公式 犹记得高中数学,组合表示C(m, n),意思为从集合m,选出n个数生成一项,总共有多少个项的可能?组合是无序的,排列是有序的.所以排列的项数量多于组合 排列A(n,m) ...
- python基础之文件的读取
#文件名 txt文件的读取#文件的读取 open("文件","读写方法") with open("文件","读写方法") ...
- python里面的==,is的区别
python中对象的三个要素:id(身份标示),type(数据类型).value(值) == 比较操作符:用来比较两个对象值是否相等. is 同一性运算符:比较两个对象的id值是否相等,即是否是同 ...