AOP记录操作日志

news2024/11/25 7:18:27

创建数据库表

-- 操作日志
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;// 操作人员的id
    private 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 {

    @Autowired
    private HttpServletRequest response;
    @Autowired
    private OperateLogMapper operateLogMapper;


    @Around("@annotation(com.it.anno.Log)")
    public Object recordLog(ProceedingJoinPoint joinPoint) throws Throwable{

        //id 自增
        //操作人的id
       String 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.coloradmin.cn/o/1288785.html

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

相关文章

全国各省市城市地级市自治州盟地区369个城市年度平均气温数据(2001-2022年)

这份包含369个城市平均气温数据的数据集&#xff08;2001-2022年&#xff09;是基于美国国家海洋和大气管理局&#xff08;NOAA&#xff09;下属国家环境信息中心&#xff08;NCEI&#xff09;提供的原始数据编制而成的。利用气象观测站点的这些栅格图和全国地级市的行政边界数…

ospf选路

问题描述 R6通过主备份路径访问LSP&#xff08;R1&#xff09;&#xff0c;主为R2&#xff0c; 备为R3 解决方案 路由器1看作LSP&#xff0c;配置loopback 0 ,地址为1.1.1.1 供测试使用&#xff1b;路由器 236, LSW4和LSW5&#xff0c; 运行ospf处于相同区域&#xff0c;建立…

【SpringCloud篇】Eureka服务的基本配置和操作

文章目录 &#x1f339;简述Eureka&#x1f6f8;搭建Eureka服务⭐操作步骤⭐服务注册⭐服务发现 &#x1f339;简述Eureka Eureka是Netflix开源的一个基于REST的服务治理框架&#xff0c;主要用于实现微服务架构中的服务注册与发现。它由Eureka服务器和Eureka客户端组成&#…

怎么安装Element组件库?

先创建一个项目 1.现在桌面创建一个文件夹 2.窗口里面输入vue ui&#xff0c;打开vue图形页面 3.创建项目 4.接下来只要等待就行了 到这里很多人会发现自己没有NPM脚本这个女选项&#xff0c;这时候我们要点击package.json他才会出来 到此&#xff0c;就已经创建好了 &#…

幽灵鲨crm助力企业轻松进行客户管理

当今竞争激烈的商业环境中&#xff0c;有效的客户管理是企业成功的关键之一。幽灵鲨CRM应运而生&#xff0c;致力于为企业提供便捷、智能的客户管理解决方案&#xff0c;助您轻松驾驭客户关系&#xff0c;开拓更广阔的市场。 解放您的管理压力 幽灵鲨CRM集客户信息、沟通记录、…

C++中单引号‘‘和双引号““的区别

操作系统&#xff1a;Windows 10 IDE&#xff1a;CLion 单引号&#xff1a;表示一个字符&#xff0c;例如 a 双引号""&#xff1a;表示一个字符串&#xff0c;例如 "a" 在C中&#xff0c;使用双引号可以方便地创建字符串&#xff0c;而使用单引号可以方便…

C++基础 -45- 类的静态数据成员

类的静态成员不包含在对象空间内 举例验证 定义普通变量和静态的变量 输出可知静态成员并没有占用类空间 静态数据成员的赋值&#xff08;必须类外赋值&#xff09; int base:: b 100;静态数据成员的访问&#xff08;不需要先定义对象&#xff09; int main() {cout <…

算法通关村——原来这就是堆

堆结构是一种非常重要的基础数据结构&#xff0c;也是算法的重要内容&#xff0c;很多题目甚至只能用堆来进行&#xff0c;所以我们必须先明确什么类型的题目可以用堆&#xff0c;以及如何使用堆来解决。由于堆的构造和维护过程都非常复杂&#xff0c;因此面试时一般不需要手写…

28、pytest实战:获取多用户鉴权

前提 测试过程中有用户体系&#xff0c;例如包括管理员、商家、用户角色&#xff0c;不同测试用例需要使用不同角色来操作&#xff0c;操作权限根据用户的鉴权来判断实现。 技能点 建立全局变量文件&#xff0c;保存账号相关信息获取鉴权信息变为module级别fixture&#xff…

Linux-centos上如何配置管理NFS服务器?

Linux/centos上如何配置管理NFS服务器&#xff1f; 1 NFS基础了解 NFS&#xff08;Network File System&#xff09;即文件操作系统&#xff1b;NFS允许网络中不同计算机相互之间共享资源。 1.1 NFS概述 1980年由SUN发展出来的在UNIX&Linux系统间实现文件共享的一种方法…

语音验证码有什么好处?

在互联网时代&#xff0c;验证码的重要性不言而喻&#xff01;网站或APP注册登录、密码修改、在线支付等场景均需通过验证码确认系用户本人&#xff0c;以保障用户帐户信息及财产安全。 常见的验证码是短信验证码&#xff0c;而语音验证码因其是语音电话自动播报的形式&#x…

【数据分享】1961—2022年我国省市县三级的逐日降水量数据(免费获取\excel\shp格式)

降水数据是我们在各项研究中最常用的气象指标之一&#xff01;之前我们给大家分享了来自国家青藏高原科学数据中心发布的1961—2022年全国范围的逐日降水栅格数据&#xff01;&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01; 本次我们分享的是我国1961——2022…

文件格式对齐、自定义快捷键、idea

文件格式对齐 日常编码必备idea快捷键 [VS Code] 入门-自定键盘快捷键 文件格式对齐 文件格式对齐通常是通过编辑器或IDE提供的快捷键或命令完成的。以下是一些常见编辑器和IDE中进行文件格式对齐的方法&#xff1a; Visual Studio Code: 快捷键&#xff1a;通常是使用快捷…

大模型的推理和搜索能力

摘要&#xff1a; 推理和搜索问题&#xff0c;如定理证明和程序合成&#xff0c;一直是人工智能领域的长期挑战。组合搜索空间使得传统的基于搜索的方法难以处理。然而&#xff0c;即使在最数学化的领域中&#xff0c;人类也可以直观地操作&#xff0c;而AlphaGo等现有工作已经…

[RISCV] 发现一个可以看RISC-V CPU行为的开源项目

最近在浏览某大型程序员交友 网站的时候发现一个好玩的项目,介绍如下: A small program that handles mie, msi, mti and trap interrupts and updates some global variables on interrupts. 重点是他下面还放了一张图: 能看到RISCV CSR的行为太酷啦!!! 下面一起setup一…

IT外包服务内容有哪些?

在信息技术迅猛发展的今天&#xff0c;越来越多的企业为了提高效率、降低成本以及更专注于核心业务&#xff0c;选择将信息技术工作外包给专业的IT服务公司。IT外包包含很多不同的服务&#xff0c;以下是对主要服务内容的简要概述。 1. 网络建设与维护 网络是现代企业信息系统…

文章润色软件,免费的几款润色工具推荐

高质量的文章对任意一个平台都是至关重要的。然而&#xff0c;即便思路清晰&#xff0c;内容丰富&#xff0c;若文章表达不够准确、连贯&#xff0c;其传达的信息可能会失去效果。本文将深入探讨文章润色的方法、文章润色的工具以及一些实用的技巧&#xff0c;帮助大家提升文章…

CleanMyMac X2024最新版本mac优化软件好用吗?

为了维护mac系统健康&#xff0c;优化系统功能&#xff0c;我们需要定期给电脑进行清理。那么作为mac清理软件CleanMyMac X软件具备哪些独特性和实用性呢&#xff1f;今天就给大家说明一下。 CleanMyMac X全新版下载如下: https://wm.makeding.com/iclk/?zoneid49983 1、 简…

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

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

什么是TDR(威胁检测与响应)

网络安全是被动和主动方法的混合体。过去&#xff0c;企业往往局限于被动的方法&#xff0c;随着合规性和安全策略越来越受到重视&#xff0c;主动方法也越来越受到关注。与其他行业相比&#xff0c;网络安全是高度动态的&#xff0c;网络安全团队采用任何可以帮助他们优化的新…