作者画了流程图方便理解
1.首先需要写一个自定义注解
直接简单粗暴上代码
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
/**
* Created by cengyujun on 2020/8/18 5:13 下午
* 自定义注解类 定义controller方法的中文含义
* @Target({METHOD,TYPE}) 表示这个注解可以用用在类/接口上,还可以用在方法上
* @Retention(RetentionPolicy.RUNTIME) 表示这是一个运行时注解,即运行起来之后,才获取注解中的相关信息,而不像基本注解如@Override 那种不用运行,在编译时eclipse就可以进行相关工作的编译时注解。
* @Inherited 表示这个注解可以被子类继承
* @Documented 表示当执行javadoc的时候,本注解会生成相关文档
*/
@Target({METHOD, TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Operation {
Stringvalue()default "";
}
2.利用javaAOP思想写切面处理类
需要自己写一个insert 方法
这里作者使用了 SpringBoot+MyBatisPlus 直接调用save方法
sysLogService.save(sysLog);(没用MyBatisPlus,需要自己写)
/**
* Created by cengyujun on 2020/8/18 5:15 下午
* :切面处理类
*/
@Aspect
@Component
@Slf4j
public class SysLogAspect {
@Autowired
private SysLogServicesysLogService;
//定义切点@Pointcut
//在注解的位置切入代码
@Pointcut("@annotation(com.baba.apps.common.constant.Operation)")
public void logPoinCut() {
}
//切面 配置通知
@AfterReturning("logPoinCut()")
public void saveSysLog(JoinPoint joinPoint) {
//保存日志
SysLog sysLog =new SysLog();
//从切面织入点处通过反射机制获取织入点处的方法
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//获取切入点所在的方法
Method method = signature.getMethod();
//获取操作
Operation operation = method.getAnnotation(Operation.class);
if (operation !=null) {
String value = operation.value();
sysLog.setOperation(value);//保存获取的操作
}
//获取请求的类名
String className = joinPoint.getTarget().getClass().getName();
//获取请求的方法名
String methodName = method.getName();
sysLog.setMethod(className +"." + methodName);
//请求的参数
Object[] args = joinPoint.getArgs();
//将参数所在的数组转换成json
String params =null;
try {
params = JacksonUtil.obj2json(args);
}catch (Exception e) {
e.printStackTrace();
}
if (params ==null) {
sysLog.setParams("无参数");
}else {
sysLog.setParams(params);
}
//获取用户ip地址
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
sysLog.setIp(IpAdrressUtil.getIpAdrress(request));
//真实地址
sysLog.setAddress(StringUtils.getCityInfo(IpAdrressUtil.getIpAdrress(request)));
String userName = (String) request.getSession().getAttribute("userName");
sysLogService.save(sysLog);
}
}
3.在需要记录的方法加上日志注解
加到Controller类的方法上面
重点 是@Operation(value="")注解
@RequestMapping(value ="/getUserCount", method = RequestMethod.POST)
@ApiOperation(value ="获取用户数量", notes ="查询")
@Operation(value="获取用户数量")
public BacResultgetUserCount(TokenDTO tokenDTO){
if (!JwtUtil2.verify(tokenDTO.getToken(),tokenDTO.getSysName())){
return BacResult.failure(ResultCode.LOGIN_DATE);
}
return getUserCounts();
}
4 数据存到数据库里面
可以自己写 查询接口展示出来,根据需求去使用这些数据