AOP记录操作日志

创建数据库表

-- 操作日志
create table operate_log (id int unsigned primary key auto_increment comment'id',operate_user int unsigned comment '操作人员Id',operate_time datetime comment '操作时间',class_name varchar(100)comment '操作类',method_name varchar(100)comment '操作的方法',method_params varchar(1000)comment '方法参数',return_value varchar(2000)comment '返回值',cost_time bigint comment '方法执行耗时, 单位:ms') comment '操作日志表';

引入APO依赖

 <!-- AOP依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

 

创建数据库对应的类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class OperateLog {private Integer id;private Integer operateUser;// 操作人员的idprivate LocalDateTime operateTime;//操作时间private String className; // 操作类名private String methodName ; //操作方法private String methodParams; //方法参数private String returnValue; //返回值private Long costTime; //操作耗时

创建注解类

package com.it.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 {}

创建AOP类

package com.it.aop;import com.alibaba.fastjson.JSONObject;
import com.it.mapper.OperateLogMapper;
import com.it.pojo.OperateLog;
import com.it.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.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.Arrays;@Slf4j
@Component
@Aspect //切面类
public class LogAspect {@Autowiredprivate HttpServletRequest response;@Autowiredprivate OperateLogMapper operateLogMapper;@Around("@annotation(com.it.anno.Log)")public Object recordLog(ProceedingJoinPoint joinPoint) throws Throwable{//id 自增//操作人的idString jwt= response.getHeader("token");Claims claims = JwtUtils.parseJWT(jwt);Integer operateUser =(Integer) claims.get("id");//操作时间LocalDateTime operateTime = LocalDateTime.now();//操作类名String className = joinPoint.proceed().getClass().getName();//操作方法名String methodName = joinPoint.getSignature().getName();//操作方法参数Object[] args = joinPoint.getArgs();String methodParams = Arrays.toString(args);//记录时间 (开始)long begin = System.currentTimeMillis();//调用原始的目标方法运行Object proceed = joinPoint.proceed();//记录时间 (结束)long end = System.currentTimeMillis();//方法返回值String returnValue = JSONObject.toJSONString(proceed);//耗时时间long costTime = end - begin;//记录日志OperateLog operateLog=new OperateLog(null,operateUser,operateTime,className,methodName,methodParams,returnValue,costTime);operateLogMapper.insert(operateLog);log.info("AOP记录操作日志:{}",operateLog);return proceed;}
}

 每个方法上把自定义的@Log注解引入进来

 /*根据ID删除部门*///@DeleteMapping("/{id}")@Log@DeleteMapping("/depts/{id}")public Result delete( @PathVariable Integer id) throws Exception {log.info("根据ID删除部门:{}",id);deptservec.delete(id);return Result.success();}//新增部门// @PostMapping@Log@PostMapping ("/depts")public Result add( @PathVariable Dept dept) {log .info("新增部门:{}",dept);deptservec.add(dept);return  Result.success();}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/201601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言——I /深入理解指针(五)

一、sizeof 和 strlen 的对比 1、sizeof sizeof是操作符&#xff0c;计算变量所占内存内存空间⼤⼩的&#xff0c;单位是字节&#xff0c;如果操作数是类型的话&#xff0c;计算的是使⽤类型创建的变量所占内存空间的⼤⼩。 sizeof 只关注占⽤内存空间的⼤⼩&#xff0c;不在…

鸿蒙4.0开发笔记之ArkTS语法基础的UI描述、基础组件的使用与如何查看组件是否有参数(八)

文章目录 一、声明式UI描述1、无/有参数组件2、如何查看组件是否有参数 二、Image组件的使用三、组件的属性设置四、补充1、使用组件的成员函数配置组件的事件方法2、配置子组件3、多组件嵌套 一、声明式UI描述 在HarmonyOS的ArkTS语法中&#xff0c;万物皆组件。ArkTS以声明方…

【Verilog】 FPGA程序设计---Verilog基础知识

目录 Verilog 和 VHDL 区别 Verilog 和 C 的区别 Verilog 基础知识 1 Verilog 的逻辑值 2 Verilog 的标识符 3 Verilog 的数字进制格式 4 Verilog 的数据类型 1) 寄存器类型 2) 线网类型 3) 参数类型 5 Verilog 的运算符 1) 算术运算符 2) 关系运算…

数据结构之选择排序

目录 直接选择排序 选择排序的时间复杂度 堆排序 向上调整算法 向下调整算法 向上调整算法建立堆 向下调整算法建立堆 堆排序整体代码 堆排序的时间复杂度 直接选择排序 在之前讲插入排序时&#xff0c;我们讲了这样的一个应用场景&#xff0c;我们在斗地主摸牌时&…

Lean语言学习笔记

Lean是什么&#xff1f; Lean 是一门可作为交互式定理证明工具的函数式编程语言。 创建Lean项目 可以使用 lake 来创建一个新的 Lean 项目&#xff1a; mkdir lean-playground && cd lean-playground lake init foo之后会得到下面的目录结构&#xff1a; ├── F…

国产智能运维操作系统新选择-浪潮KeyarchOS

1.背景 在CentOS停更&#xff0c;国有企业纷纷摒弃原有的开发与运维工具&#xff0c;全面拥抱国产。我司也顺应号召&#xff0c;更换原有CentOS系统。 在新系统选型上&#xff0c;我司有以下要求&#xff1a; 国产、快速更新迭代、社区活跃&#xff1b;拥有一定知名度&#x…

Kotlin 中的 var 和 val:选择正确的变量声明

在 Kotlin 编程语言中&#xff0c;var 和 val 是两个基本的关键字&#xff0c;用于变量声明。 它们的正确使用对于编写可维护和高效的代码至关重要。 一、对比分析&#xff1a; var &#xff1a;用于声明可变变量。使用 var 声明的变量可以在初始化后被重新赋值。val &#…

【Collection - PriorityQueue源码解析】

本文主要对Collection - PriorityQueue进行源码解析。 Collection - PriorityQueue源码解析 概述方法剖析 add()和offer()element()和peek()remove()和poll()remove(Object o) 概述 前面以Java ArrayDeque为例讲解了Stack和Queue&#xff0c;其实还有一种特殊的队列叫做Priori…

保障海外业务发展,Coremail提供高效安全的海外通邮服务

11月22日&#xff0c;Coremail举办《全球通邮&#xff1a;如何保障安全、快捷的海外中继服务》直播分享会&#xff0c;直播会上Coremail安全团队和直播嘉宾复旦大学校园信息化办公室徐艺扬老师就海外中继服务进行了深度分享。 ​ 海外通邮困难重重 境外垃圾邮件数量居高不下…

echarts中option个参数的含义

var option {title: {text: ECharts 入门示例},tooltip: {},legend: {data: [数量]},xAxis: {data: [衬衫, 羊毛衫, 雪纺衫, 裤子, 高跟鞋, 袜子]},yAxis: {},series: [{name: 数量,type: bar,data: [5, 20, 36, 10, 10, 20]}] }; title&#xff1a;主要控制图表的标题 legen…

语义分割 LR-ASPP网络学习笔记 (附代码)

论文地址&#xff1a;https://arxiv.org/abs/1905.02244 代码地址&#xff1a;https://github.com/WZMIAOMIAO/deep-learning-for-image-processing/tree/master/pytorch_segmentation/lraspp 1.是什么&#xff1f; LR-ASPP是一个轻量级语义分割网络&#xff0c;它是在Mobil…

使用Ansible Expect模块实现自动化交互式任务

Ansible是一种功能强大的自动化工具&#xff0c;可用于自动化配置管理、部署和任务执行。其中的Expect模块是Ansible的一个重要组件&#xff0c;它允许我们自动化处理需要与交互式命令行进行交互的任务。本文将介绍如何使用Ansible的Expect模块&#xff0c;并提供一些示例来说明…

【ESP8266】ESP8266集成开发环境对比

当涉及到ESP8266开发环境的选择时&#xff0c;有几个常见的选择可供开发人员使用。在本篇文章中&#xff0c;我们将对比一些目前最流行的ESP8266集成开发环境&#xff08;IDE&#xff09;&#xff0c;以帮助您选择最适合您的需求的开发环境。 总结&#xff1a;Arduino IDE和Pl…

HarmonyOS应用开发——页面

我们将对于多页面以及更多有趣的功能展开叙述&#xff0c;这次我们对于 HarmonyOS 的很多有趣常用组件并引出一些其他概念以及解决方案、页面跳转传值、生命周期、启动模式&#xff08;UiAbility&#xff09;&#xff0c;样式的书写、状态管理以及动画等方面进行探讨 页面之间…

项目进度已经落后了,项目经理该怎么办?

进度管理是项目管理的核心工作之一&#xff0c;通过可续的进度计划与控制管理&#xff0c;最终实现项目按照目标交付。 进度管理的两大核心工作&#xff1a;计划制定、过程管控。 项目管理过程中难免会遇到工作进度和计划不一致的情况&#xff0c;有效管理项目进度&#xff…

springboot简单集成jwt

springboot简单集成jwt 参考&#xff1a;https://blog.csdn.net/gjtao1130/article/details/111658060 大佬的源码是可以运行的&#xff0c;我写这个文章的目的是添加一些注释来辅助理解 源码 JwtInterceptor.Java package com.xxh.jwt1.interceptor;import com.auth0.jwt.J…

Redis安装和使用(基于windows)

Redis是一个使用C语言编写的开源、高性能、非关系型的键值对存储数据库。它支持多种数据结构&#xff0c;包括字符串、列表、集合、有序集合、哈希表等。Redis的内存操作能力极强&#xff0c;其读写性能非常优秀&#xff0c;且支持持久化&#xff0c;可以将数据存储到磁盘上&am…

使用 React 和 ECharts 创建地球模拟扩散和飞线效果

在本博客中&#xff0c;我们将学习如何使用 React 和 ECharts 创建一个酷炫的地球模拟扩散效果。我们将使用 ECharts 作为可视化库&#xff0c;以及 React 来构建我们的应用。地球贴图在文章的结尾。 最终效果 准备工作 首先&#xff0c;确保你已经安装了 React&#xff0c;并…

大语言模型有那些能力和应用

目录 能力 应用 能力 理解语义的能力&#xff1a;LLM 具有强大的语义理解能力&#xff0c;能够理解大部分文本&#xff0c;包括不同语言&#xff08;人类语言或计算机语言&#xff09;和表达水平的文本&#xff0c;即使是多语言混杂、语法用词错误&#xff0c;也在多数情况下…

关于Java中list三个实现类区别

1. 前言&#xff1a; List实现Collection接口&#xff0c;它的数据结构是有序可以重复的结合&#xff0c;该结合的体系有索引&#xff1b;它有三个实现类&#xff1a;ArrayList、LinkList、Vector三个实现类。 2. 三个实现类的基本区别&#xff1a; 2.1 ArrayList: 底层数据…