tlias管理系统-springAOP的操作日志功能实现!!!
This commit is contained in:
@@ -82,6 +82,11 @@
|
||||
<artifactId>fastjson</artifactId>
|
||||
<version>2.0.53</version>
|
||||
</dependency>
|
||||
<!--AOP起步依赖-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-aop</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<dependencyManagement>
|
||||
|
||||
12
tlias-web-management/src/main/java/com/inmind/anno/Log.java
Normal file
12
tlias-web-management/src/main/java/com/inmind/anno/Log.java
Normal file
@@ -0,0 +1,12 @@
|
||||
package com.inmind.anno;
|
||||
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
public @interface Log {
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
package com.inmind.aop;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.inmind.mapper.OperateLogMapper;
|
||||
import com.inmind.pojo.OperateLog;
|
||||
import com.inmind.utils.JwtUtils;
|
||||
import io.jsonwebtoken.Claims;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
import org.aspectj.lang.annotation.Around;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.aspectj.weaver.ast.Var;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Arrays;
|
||||
|
||||
@Aspect
|
||||
@Component
|
||||
@Slf4j
|
||||
public class LogAspect {
|
||||
|
||||
//之前在控制器中,直接定义HttpServletRequest参数,前端控制器 DispatcherServlet就会直接传递一个请求对象给我们。
|
||||
//此处直接从spring容器中获取请求对象
|
||||
@Autowired
|
||||
private HttpServletRequest request;
|
||||
|
||||
@Autowired
|
||||
private OperateLogMapper operateLogMapper;
|
||||
|
||||
@Around("@annotation(com.inmind.anno.Log)")
|
||||
public Object recordLog(ProceedingJoinPoint joinPoint) throws Throwable {
|
||||
//1.操作人ID,就在当前请求是携带的令牌JWT中
|
||||
String jwt = request.getHeader("token");
|
||||
Claims claims = JwtUtils.parseJWT(jwt);
|
||||
Integer operateUser = (Integer) claims.get("id");
|
||||
//2.操作时间
|
||||
LocalDateTime operateTime = LocalDateTime.now();
|
||||
|
||||
//3.执行方法全类名
|
||||
String className = joinPoint.getTarget().getClass().getName();
|
||||
|
||||
//4.执行方法方法名
|
||||
String methodName = joinPoint.getSignature().getName();
|
||||
|
||||
//5.执行方法运行时参数
|
||||
Object[] args = joinPoint.getArgs();
|
||||
String methodParams = Arrays.toString(args);
|
||||
|
||||
long begin = System.currentTimeMillis();
|
||||
//6.执行方法返回值
|
||||
Object result = joinPoint.proceed();
|
||||
|
||||
long end = System.currentTimeMillis();
|
||||
|
||||
String returnValue = JSONObject.toJSONString(result);
|
||||
|
||||
//7.执行时长
|
||||
Long costTime = end - begin;
|
||||
OperateLog operateLog = new OperateLog(null,operateUser, operateTime, className, methodName, methodParams, returnValue, costTime);
|
||||
//保存到数据库中,Mapper
|
||||
operateLogMapper.insert(operateLog);
|
||||
|
||||
log.info("AOP记录操作日志:{}",operateLog);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.inmind.mapper;
|
||||
|
||||
import com.inmind.pojo.OperateLog;
|
||||
import org.apache.ibatis.annotations.Insert;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface OperateLogMapper {
|
||||
|
||||
//插入日志数据
|
||||
@Insert("insert into operate_log (operate_user, operate_time, class_name, method_name, method_params, return_value, cost_time) " +
|
||||
"values (#{operateUser}, #{operateTime}, #{className}, #{methodName}, #{methodParams}, #{returnValue}, #{costTime});")
|
||||
public void insert(OperateLog log);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.inmind.pojo;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class OperateLog {
|
||||
private Integer id; //ID
|
||||
private Integer operateUser; //操作人ID
|
||||
private LocalDateTime operateTime; //操作时间
|
||||
private String className; //操作类名
|
||||
private String methodName; //操作方法名
|
||||
private String methodParams; //操作方法参数
|
||||
private String returnValue; //操作方法返回值
|
||||
private Long costTime; //操作耗时
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.inmind.service.impl;
|
||||
|
||||
import com.inmind.anno.Log;
|
||||
import com.inmind.mapper.DeptMapper;
|
||||
import com.inmind.mapper.EmpMapper;
|
||||
import com.inmind.pojo.Dept;
|
||||
@@ -35,6 +36,7 @@ public class DeptServiceImpl implements DeptService {
|
||||
//根据id删除部门
|
||||
@Transactional(rollbackFor = Exception.class)//让当前方法,处于事务管理下(在方法调用前,执行start transaction)
|
||||
@Override
|
||||
@Log
|
||||
public void delete(Integer id) throws Exception {
|
||||
try {
|
||||
//不仅删除对应部门数据
|
||||
@@ -42,9 +44,9 @@ public class DeptServiceImpl implements DeptService {
|
||||
//进行一些业务逻辑代码,假设业务出现了异常
|
||||
// int a = 1/0;
|
||||
//抛出一个编译时异常
|
||||
if (true) {
|
||||
/* if (true) {
|
||||
throw new Exception("出错了...");
|
||||
}
|
||||
}*/
|
||||
//还要删除该部门下的员工数据(根据部门ID删除相关的员工)
|
||||
empMapper.deleteByDeptId(id);
|
||||
} catch (Exception e) {
|
||||
@@ -60,6 +62,7 @@ public class DeptServiceImpl implements DeptService {
|
||||
|
||||
//新增部门
|
||||
@Override
|
||||
@Log
|
||||
public void add(Dept dept) {
|
||||
//补充基础属性,创建时间和更新时间
|
||||
dept.setCreateTime(LocalDateTime.now());
|
||||
@@ -75,6 +78,7 @@ public class DeptServiceImpl implements DeptService {
|
||||
}
|
||||
|
||||
@Override
|
||||
@Log
|
||||
public void update(Dept dept) {
|
||||
//补充更新时间数据
|
||||
dept.setUpdateTime(LocalDateTime.now());
|
||||
|
||||
Reference in New Issue
Block a user