【若依分离版操作方法日志与其它业务数据(如入库操作)关联的实现】

news2024/9/20 16:57:17

若依框架业务表和操作日志表关联

  • 需求:
  • 分析:
  • 思路:
  • 实现:

需求:

基于若依分离版框架业务数据与操作日志的数据做个关联

入库表


/*入库业务表																															*/
CREATE TABLE [BS_In](	
	[Id] 					int IDENTITY(1,1)			NOT NULL,	/*主键Id,采集Id													*/
	[WhId] 					int				 			NOT NULL,	/*仓库Id															*/
	[BatchCode] 			[nvarchar](30) 					NULL,	/*批次号															*/
	[InOrder]		 		[nvarchar](30) 					NULL,	/*入库单据															*/
	[InType] 				[nvarchar](30)	 			NOT NULL,	/*入库类型															*/
	[InTime] 				datetime	 				NOT NULL,	/*入库时间															*/
	[Operator] 				[nvarchar](30) 				NOT NULL,	/*入库人															*/
	[Notes]	 				[nvarchar](100) 				NULL,	/*备注																*/
	[LogId]	 				int 						NOT	NULL,	/*操作日志Id														*/
	 CONSTRAINT [PK_BS_In] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY];

其中LogId是取的是操作日志的Id,对应sys_oper_log表的oper_id

操作日志表(若依框架自带)

/*操作日志表																															*/
CREATE TABLE [sys_oper_log](	
  [oper_id]					bigint  IDENTITY(1,1) NOT NULL,								--日志主键
  [title]					varchar(50) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL,		--模块标题
  [business_type]			int DEFAULT 0 NULL,											--业务类型(0其它 1新增 2修改 3删除)
  [method]					varchar(100) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL,		--方法名称
  [request_method]			varchar(10) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL,		--请求方式
  [operator_type]			int DEFAULT 0 NULL,											--操作类别(0其它 1后台用户 2手机端用户)
  [oper_name]				varchar(50) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL,		-- 操作人员
  [dept_name]				varchar(50) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL,		--部门名称
  [oper_url]				varchar(255) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL,		--请求URL
  [oper_ip]					varchar(128) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL,		--主机地址
  [oper_location]			varchar(255) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL,		--操作地点
  [oper_param]				varchar(2000) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL,	--请求参数
  [json_result]				varchar(2000) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL,	--返回参数
  [status]					int DEFAULT 0 NULL,											--操作状态(0正常 1异常)
  [error_msg]				varchar(2000) COLLATE Chinese_PRC_CI_AS DEFAULT '' NULL,	--错误消息
  [oper_time]				datetime  NULL,   
	 CONSTRAINT [PK_sys_oper_log] PRIMARY KEY CLUSTERED 
(
	[oper_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY];

其中oper_id是操作日志的Id,对应BS_In表的logId
怎么新建入库任务表同时插入操作日志表再关联插入操作日志表的oper_id?

分析:

若依自带的操作日志可以通过@Log注解插入操作日志表
在需要被记录日志的controller方法上添加@Log注解,使用方法如下:
在这里插入图片描述
在这里插入图片描述
其中最核心的是LogAspect.java类,它处于com.ruoyi.framework.aspectj包下;
在处理完请求后执行和拦截异常操作后都会执行handleLog方法,handleLog方法最主要的就是处理
SysOperLog数据库日志对象参数并执行插入数据操作。重点就是这一段代码。在这里插入图片描述

思路:

  • 取出插入日志表sys_oper_log表的oper_id
  • oper_id设置到请求上下文或线程局部变量中,以便后续的操作使用
  • 在实现类上新增@Log注解,插入入库表BS_In,插入成功后取出Id,
  • 在方法中取出oper_id和入库表的Id,根据Id去更新BS_InlogId

实现:

1.修改SysOperLogMapper.xml文件中的insert标签的内容,主要修改内容是可以新增后返回operId

	<insert id="insertOperlog" parameterType="SysOperLog" useGeneratedKeys="true" keyProperty="operId">
		insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time)
        values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, getdate())
	</insert>

加了useGeneratedKeys=“true” keyProperty=“operId”

2.将oper_id设置到请求上下文或线程局部变量中,修改LogAspect.java

 protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult)
    {
        try
        {
            // 获取当前的用户
            LoginUser loginUser = SecurityUtils.getLoginUser();

            // *========数据库日志=========*//
            SysOperLog operLog = new SysOperLog();
            operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
            // 请求的地址
            String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
            operLog.setOperIp(ip);
            operLog.setOperUrl(ServletUtils.getRequest().getRequestURI());
            if (loginUser != null)
            {
                operLog.setOperName(loginUser.getUsername());
            }

            if (e != null)
            {
                operLog.setStatus(BusinessStatus.FAIL.ordinal());
                operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000));
            }
            // 设置方法名称
            String className = joinPoint.getTarget().getClass().getName();
            String methodName = joinPoint.getSignature().getName();
            operLog.setMethod(className + "." + methodName + "()");
            // 设置请求方式
            operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
            // 处理设置注解上的参数
            getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);
            // 保存数据库
            operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
            SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog);
            //AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
            RequestContextHolder.currentRequestAttributes().setAttribute("logId", operLog.getOperId(), RequestAttributes.SCOPE_REQUEST);
        }
        catch (Exception exp)
        {
            // 记录本地异常日志
            log.error("==前置通知异常==");
            log.error("异常信息:{}", exp.getMessage());
            exp.printStackTrace();
        }
    }

修改了保存数据库下代码

3.插入入库业务表,取出新增成功后的主键Id,使用@Log主键插入操作日志表

    @Log(title = "产品入库", businessType = BusinessType.INSERT)
    @Override
    public int toolin(Map map) throws Exception {
        int insertIn = collectMapper.insertIn(in);
        if(insertIn==0) throw new Exception("插入入库业务表失败");
        int MId = Integer.parseInt(in.get("MId").toString());
        return MId;
    }
    <insert id="insertIn"  useGeneratedKeys="true" keyProperty="MId">
        insert into BS_In values (#{WhId},#{BatchCode},#{InOrder},#{InType},getdate(),#{Operator},#{Notes},null)
    </insert>

4.取出MIdlogId更新日志

    public AjaxResult toolin(@RequestBody Map map){
        try {
            int MId = collectService.toolin(map);
            Long logId = (Long) RequestContextHolder.currentRequestAttributes().getAttribute("logId", RequestAttributes.SCOPE_REQUEST);
            //执行成功根据主表id更新日志表id
            int i = collectService.updateInLog(MId, logId);
        }catch (Exception e){
            return AjaxResult.error(e.getMessage());
        }
        return AjaxResult.success();
    }
    <update id="updateInLog">
        update BS_In set LogId=#{logId} where Id=#{MId}
    </update>

效果:
在这里插入图片描述
在这里插入图片描述
如果需要查询出关联信息可以使用inner join内连接查询

  select *
  from BS_In b inner join sys_oper_log s
  on b.LogId=s.oper_id

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

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

相关文章

【MySQL 主从复制与读写分离】

目录 一、MySQL主从复制1.1、主从复制架构和原理1.2、MySQL的扩展1.2.1、什么是读写分离1. 读写分离的基本原理2. MySQL 读写分离原理 1.2.2、为什么要读写分离1.2.3、什么时候要读写分离1.2.4、主从复制与读写分离1.2.5、mysql支持的复制类型 1.3、复制的共用1.4、复制架构1.5…

2023年下半年北京/上海/深圳NPDP产品经理认证招生

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

java学习记录之DBUtils

1 jdbc回顾 1.1 批处理  Statement 执行多条sql addBatch(sql) clearBatch() int[] executeBatch()  PreparedStatement 执行一条sql语句&#xff0c;多组参数 addBatch() 执行之前必须设置实际参数 psmt.setXxxx() clearBatch() executeBatch() 1.2 事务  事务&…

SpringBoot 整合redis + Aop防止重复提交 (简易)

1.redis的安装 redis下载 解压 安装 # wget http://download.redis.io/releases/redis-6.0.8.tar.gz # tar xzf redis-6.0.8.tar.gz # cd redis-6.0.8 # make 看一下就会有 进入redis-6.0.8下的src目录 [rootVM-16-8-centos redis]# cd redis-6.0.8 [rootVM-16-8-centos re…

【Java】Java 中的引用类型

本文仅供学习参考&#xff01; Java是一种类型化语言&#xff0c;这本质上意味着声明的每个变量都有与之关联的特定类型。此类型确定它可以存储的值。例如&#xff0c;整数类型可以存储非小数。也称为数据类型&#xff0c;这可以大致分为两类&#xff1a;基元和引用。基元类型是…

华为云GaussDB,能否成为数据库国产化替代的“更优选择”?

没有一个行业比数据库更需要长期主义&#xff0c;而在践行长期主义的道路上&#xff0c;国内数据库厂商中华为是不可忽视的存在。 近日&#xff0c;Gartner Peer Insights《Voice of the Customer for Cloud Database Management Systems&#xff0c;2023》报告发布&#xff0…

使用python unittest从零构建web应用的自动化测试用例

文章目录 必要性使用pycharm搭建unittest框架selenium下载web driverweb driver的基本使用driver 定位元素driver使用事件处理下拉框处理复选框 sshftp数据库sqlserveroracle安装使用 mongodb excelpycurl 必要性 大部分团队起始对于要不要投入资源进行UI自动化测试的开发都是…

泰裤辣!Corona 10强势来袭,蓝海创意云同步更新支持

2023年6月22日&#xff0c;Chaos Corona官网发布了Chaos Corona 10 for 3ds Max and Cinema 4D版本。本次不仅更新了新功能&#xff0c;还优化了渲染卡顿的问题&#xff0c;一起来看看有哪些实用的好玩意吧&#xff01; 1.贴花影响特定通道 CR10在你的场景中焕然一新&#xff…

Git报错: Please move or remove them before you switch branches.

Bug记录&#xff1a;在我写需求的时候&#xff0c;产品说上个包有崩溃&#xff0c;于是我就控制台 git checkout切分支&#xff0c;结果报错Please move or remove them before you switch branches.下面是被改动的文件&#xff0c;因为是项目build的时候产生的临时文件&#x…

在虚幻引擎中创建大气的HIMIL电影作品

今天瑞云渲染小编给大家带来了关于电影制片人Tiziano Fioriti展示了《H I M I L》项目背后的工作流程&#xff0c;解释了人工智能是如何用于细节的&#xff0c;并谈到了设置火光的问题。 介绍 大家好&#xff0c;我叫Tiziano Fioriti&#xff0c;是来自意大利的自由电影制作人…

RabbitMQ管理界面介绍

1.管理界面概览 connections&#xff1a; 无论生产者还是消费者&#xff0c;都需要与RabbitMQ建立连接后才可以完成消息的生产和消费&#xff0c;在这里可以查看连接情况 channels&#xff1a; 通道&#xff0c;建立连接后&#xff0c;会形成通道&#xff0c;消息的投递获取依…

高阶常系数微分方程——笔记整理

首先&#xff0c;介绍基本知识&#xff1a; 首先&#xff0c;我们对式子进行处理得到&#xff1a; 得到特征根是 和 0, 所以其通解 假设特解是,带入方程所得&#xff1a;

Nik Color Efex 滤镜库

Nik Color Efex 滤镜库中提供了 55 个滤镜。有关这些滤镜的详细参数说明请分别参阅&#xff1a; 1 ~ 11 《Nik Color Efex 滤镜详解&#xff08;1/5&#xff09;》 12 ~ 22 《Nik Color Efex 滤镜详解&#xff08;2/5&#xff09;》 23 ~ 33 《Nik Color Efex 滤镜详解&#x…

2023年java还是golang还是c#?

前言 我们可以先来看一下这三门语言各自的优劣 学习曲线&#xff1a;如果你是初学者或对编程相对陌生&#xff0c;Java可能是一个较好的选择。它有广泛的学习资源和社区支持&#xff0c;易于上手。Go也有简单易学的特点&#xff0c;但由于相对较年轻&#xff0c;相关的学习资…

为何收入或存款增量难找存量告急

其实&#xff0c;和年纪关系不太大吧&#xff0c;平凡的普通人都没多少存款。 *近日&#xff0c;有调查称“大概五分之一的年轻人存款在一万元以内。10万元存款是一个“坎”&#xff0c;存款超过10万就会超过53.7%的人。”“年轻人”“存款”两个词碰撞在一起&#xff0c;引来了…

python3中http协议提供文件服务器功能

http协议是互联网的通用基础协议&#xff0c;也可以利用其来开发文件服务器&#xff0c;给客户提供文件浏览&#xff0c;查看&#xff0c;下载&#xff0c;上传等功能。 目录 1.python3自带http文件服务 2.python3从头开发http文件服务 1.python3自带http文件服务 python3中…

资源调度框架 YARN

3.1.1 什么是YARN Yet Another Resource Negotiator, 另一种资源协调者通用资源管理系统为上层应用提供统一的资源管理和调度&#xff0c;为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处 3.1.2 YARN产生背景 通用资源管理系统 Hadoop数据分布式存储&#xff08…

【打杂记录】-能否开发一个报账系统,自动批量识别与完成报账任务?

能否开发一个报账系统&#xff0c;自动批量识别与完成报账任务&#xff1f; 今天这篇博客&#xff0c;我想说些非技术性语言。我在研二一年负责实验室的报账工作&#xff0c;近期终于有机会将工作交接给下一位负责人&#xff0c;我的科研时间又回来了。 在这一年里&#xff0c…

centos7 挂载未分配的空间新增卷

一、系统环境 操作系统&#xff1a;Centos 7 已配置环境&#xff1a;空 二、磁盘挂载到新目录&#xff08;磁盘挂载&#xff09; 2.1 查找新硬盘 查看机器所挂硬盘及分区情况&#xff1a; fdisk -l 复制 红框圈中的即是本次要挂载的磁盘&#xff0c;与 /dev/sda 和 /de…

掌握多线程的用法一篇就够了

多线程 线程与进程进程线程线程调度速度问题 创建线程的方式第一种:继承Thread类原理分析 第二种:实现Runnable接口的形式第三种&#xff1a;有返回值的线程 Thread类的方法Thread和Runnable的区别线程安全问题举例测试代码线程安全问题分析案例解决办法分析方案一:使用同步代…