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);
|
|
}
|
|
}
|