Revert "update 优化操作日志"

This reverts commit bcc11dcc12.
This commit is contained in:
疯狂的狮子Li
2026-04-03 07:07:03 +00:00
committed by Gitee
parent bcc11dcc12
commit b2e07254f9
11 changed files with 118 additions and 427 deletions

View File

@@ -1,8 +1,7 @@
package org.dromara.common.log.annotation; package org.dromara.common.log.annotation;
import org.dromara.common.log.enums.BusinessType; import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.log.enums.OperateChannel; import org.dromara.common.log.enums.OperatorType;
import org.springframework.core.annotation.AliasFor;
import java.lang.annotation.*; import java.lang.annotation.*;
@@ -15,44 +14,20 @@ import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@Documented @Documented
public @interface Log { public @interface Log {
/** /**
* 模块【已废弃,请使用 module】 * 模块
*
* @deprecated 请使用 {@link #module()}
*/ */
@Deprecated
String title() default ""; String title() default "";
/** /**
* 业务模块名称(必填,如:用户管理、订单管理) * 功能
*/
String module() default "";
/**
* 操作功能名称(必填,如:新增用户、导出订单)
*/
String name() default "";
/**
* 操作描述(备注)
*/
String remark() default "";
/**
* 标签(用于检索/分类)
*/
String[] tags() default {};
/**
* 业务类型(查询/新增/修改/删除/导入/导出等)
*/ */
BusinessType businessType() default BusinessType.OTHER; BusinessType businessType() default BusinessType.OTHER;
/** /**
* 操作渠道WEB / APP / MINI_APP / OPEN_API 等 * 操作人类别
*/ */
OperateChannel channel() default OperateChannel.WEB; OperatorType operatorType() default OperatorType.MANAGE;
/** /**
* 是否保存请求的参数 * 是否保存请求的参数
@@ -64,6 +39,7 @@ public @interface Log {
*/ */
boolean isSaveResponseData() default true; boolean isSaveResponseData() default true;
/** /**
* 排除指定的请求参数 * 排除指定的请求参数
*/ */

View File

@@ -4,8 +4,6 @@ import cn.hutool.core.lang.Dict;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.useragent.UserAgent;
import cn.hutool.http.useragent.UserAgentUtil;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -94,35 +92,28 @@ public class LogAspect {
*/ */
protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) { protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) {
try { try {
// *========数据库日志=========*// // *========数据库日志=========*//
OperLogEvent operLog = new OperLogEvent(); OperLogEvent operLog = new OperLogEvent();
operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
// 请求的地址
String ip = ServletUtils.getClientIP();
operLog.setOperIp(ip);
operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255));
LoginUser loginUser = LoginHelper.getLoginUser(); LoginUser loginUser = LoginHelper.getLoginUser();
operLog.setUsername(loginUser.getUsername()); operLog.setOperName(loginUser.getUsername());
operLog.setDeptName(loginUser.getDeptName()); operLog.setDeptName(loginUser.getDeptName());
operLog.setUserType(loginUser.getUserType());
operLog.setDeviceType(loginUser.getDeviceType());
operLog.setOperIp(ServletUtils.getClientIP());
HttpServletRequest request = ServletUtils.getRequest();
operLog.setOperUrl(StringUtils.substring(request.getRequestURI(), 0, 255));
UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
operLog.setBrowser(userAgent.getBrowser().getName());
operLog.setOs(userAgent.getOs().getName());
if (e != null) { if (e != null) {
operLog.setStatus(BusinessStatus.FAIL.ordinal()); operLog.setStatus(BusinessStatus.FAIL.ordinal());
operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 3800)); operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 3800));
} else {
operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
} }
// 设置方法名称 // 设置方法名称
String className = joinPoint.getTarget().getClass().getName(); String className = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName(); String methodName = joinPoint.getSignature().getName();
operLog.setMethod(className + "." + methodName + "()"); operLog.setMethod(className + "." + methodName + "()");
// 设置请求方式 // 设置请求方式
operLog.setRequestMethod(request.getMethod()); operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
// 处理设置注解上的参数 // 处理设置注解上的参数
getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);
// 设置消耗时间 // 设置消耗时间
@@ -149,12 +140,12 @@ public class LogAspect {
* @throws Exception 异常 * @throws Exception 异常
*/ */
public void getControllerMethodDescription(JoinPoint joinPoint, Log log, OperLogEvent operLog, Object jsonResult) throws Exception { public void getControllerMethodDescription(JoinPoint joinPoint, Log log, OperLogEvent operLog, Object jsonResult) throws Exception {
operLog.setModule(StringUtils.isBlank(log.title()) ? log.module() : log.title()); // 设置action动作
operLog.setName(log.name()); operLog.setBusinessType(log.businessType().ordinal());
operLog.setRemark(log.remark()); // 设置标题
operLog.setTags(JsonUtils.toJsonString(log.tags())); operLog.setTitle(log.title());
operLog.setBusinessType(log.businessType().getCode()); // 设置操作人类别
operLog.setChannel(log.channel().getCode()); operLog.setOperatorType(log.operatorType().ordinal());
// 是否需要保存request参数和值 // 是否需要保存request参数和值
if (log.isSaveRequestData()) { if (log.isSaveRequestData()) {
// 获取参数的信息,传入到数据库中。 // 获取参数的信息,传入到数据库中。

View File

@@ -1,195 +1,58 @@
package org.dromara.common.log.enums; package org.dromara.common.log.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/** /**
* 业务操作类型 * 业务操作类型
* *
* @author AprilWind * @author ruoyi
*/ */
@Getter
@AllArgsConstructor
public enum BusinessType { public enum BusinessType {
/** /**
* 其它操作 * 其它
*/ */
OTHER(0, "其它操作"), OTHER,
/**
* 查询
*/
QUERY(1, "查询"),
/** /**
* 新增 * 新增
*/ */
INSERT(2, "新增"), INSERT,
/** /**
* 修改 * 修改
*/ */
UPDATE(3, "修改"), UPDATE,
/** /**
* 删除 * 删除
*/ */
DELETE(4, "删除"), DELETE,
/** /**
* 导入 * 授权
*/ */
IMPORT(5, "导入"), GRANT,
/** /**
* 导出 * 导出
*/ */
EXPORT(6, "导出"), EXPORT,
/** /**
* 授权/赋权 * 导入
*/ */
GRANT(7, "授权"), IMPORT,
/** /**
* 清空数据 * 强退
*/ */
CLEAN(8, "清空数据"), FORCE,
/**
* 强制退出(用户登出)
*/
FORCE_LOGOUT(9, "强制退出"),
/**
* 状态修改(启用/禁用/冻结/解冻)
*/
CHANGE_STATUS(10, "状态修改"),
/**
* 重置密码
*/
RESET_PASSWORD(11, "重置密码"),
/**
* 批量删除
*/
BATCH_DELETE(12, "批量删除"),
/**
* 批量导入
*/
BATCH_IMPORT(13, "批量导入"),
/**
* 批量导出
*/
BATCH_EXPORT(14, "批量导出"),
/**
* 批量操作(通用)
*/
BATCH_OPERATE(15, "批量操作"),
/**
* 审核操作(通过/驳回)
*/
AUDIT(16, "审核"),
/**
* 发布/上线
*/
PUBLISH(17, "发布"),
/**
* 撤回/下线
*/
REVOKE(18, "撤回"),
/**
* 同步数据
*/
SYNC(19, "同步数据"),
/**
* 生成数据(生成编码、生成报表等)
*/
GENERATE(20, "生成数据"),
/**
* 上传文件
*/
UPLOAD(21, "上传文件"),
/**
* 下载文件
*/
DOWNLOAD(22, "下载文件"),
/**
* 定时任务执行
*/
TASK_EXECUTE(23, "定时任务执行"),
/**
* 接口调用(第三方/开放API
*/
API_CALL(24, "接口调用"),
/**
* 登录
*/
LOGIN(25, "登录"),
/**
* 登出
*/
LOGOUT(26, "登出"),
/**
* 注册
*/
REGISTER(27, "注册"),
/**
* 作废/取消
*/
CANCEL(28, "作废/取消"),
/**
* 归档
*/
ARCHIVE(29, "归档"),
/**
* 配置修改
*/
CONFIG_UPDATE(30, "配置修改"),
/**
* 打印单据/报表
*/
PRINT(31, "打印"),
/**
* 复制数据/克隆
*/
COPY(32, "复制"),
/** /**
* 生成代码 * 生成代码
*/ */
GENCODE(33, "生成代码"); GENCODE,
/** /**
* 业务类型编码 * 清空数据
*/ */
private final Integer code; CLEAN,
/**
* 业务类型描述
*/
private final String desc;
} }

View File

@@ -1,54 +0,0 @@
package org.dromara.common.log.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 操作渠道
*
* @author AprilWind
*/
@Getter
@AllArgsConstructor
public enum OperateChannel {
/**
* 管理后台
*/
WEB(0, "管理后台"),
/**
* 移动端APP
*/
APP(1, "移动端APP"),
/**
* 小程序
*/
MINI_APP(2, "小程序"),
/**
* 开放接口
*/
OPEN_API(3, "开放接口"),
/**
* 定时任务
*/
TASK(4, "定时任务"),
/**
* 第三方调用
*/
THIRD(5, "第三方调用");
/**
* 操作渠道编码
*/
private final Integer code;
/**
* 操作渠道描述
*/
private final String desc;
}

View File

@@ -0,0 +1,23 @@
package org.dromara.common.log.enums;
/**
* 操作人类别
*
* @author ruoyi
*/
public enum OperatorType {
/**
* 其它
*/
OTHER,
/**
* 后台用户
*/
MANAGE,
/**
* 手机端用户
*/
MOBILE
}

View File

@@ -11,6 +11,7 @@ import java.time.LocalDateTime;
* *
* @author Lion Li * @author Lion Li
*/ */
@Data @Data
public class OperLogEvent implements Serializable { public class OperLogEvent implements Serializable {
@@ -18,34 +19,24 @@ public class OperLogEvent implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
* 业务模块名称 * 日志主键
*/ */
private String module; private Long operId;
/** /**
* 操作功能名称 * 操作模块
*/ */
private String name; private String title;
/** /**
* 操作描述(备注 * 业务类型0其它 1新增 2修改 3删除
*/
private String remark;
/**
* 标签(用于检索/分类)
*/
private String tags;
/**
* 业务类型
*/ */
private Integer businessType; private Integer businessType;
/** /**
* 操作渠道 * 业务类型数组
*/ */
private Integer channel; private Integer[] businessTypes;
/** /**
* 请求方法 * 请求方法
@@ -58,20 +49,20 @@ public class OperLogEvent implements Serializable {
private String requestMethod; private String requestMethod;
/** /**
* 用户名 * 操作类别0其它 1后台用户 2手机端用户
*/ */
private String username; private Integer operatorType;
/**
* 操作人员
*/
private String operName;
/** /**
* 部门名称 * 部门名称
*/ */
private String deptName; private String deptName;
/**
* 用户类型
*/
private String userType;
/** /**
* 请求url * 请求url
*/ */
@@ -83,19 +74,9 @@ public class OperLogEvent implements Serializable {
private String operIp; private String operIp;
/** /**
* 设备类型 * 操作地点
*/ */
private String deviceType; private String operLocation;
/**
* 浏览器类型
*/
private String browser;
/**
* 操作系统
*/
private String os;
/** /**
* 请求参数 * 请求参数

View File

@@ -83,7 +83,7 @@ public class SysUserOnlineController extends BaseController {
* @return 操作结果 * @return 操作结果
*/ */
@SaCheckPermission("monitor:online:forceLogout") @SaCheckPermission("monitor:online:forceLogout")
@Log(title = "在线用户", businessType = BusinessType.FORCE_LOGOUT) @Log(title = "在线用户", businessType = BusinessType.FORCE)
@RepeatSubmit() @RepeatSubmit()
@DeleteMapping("/{tokenId}") @DeleteMapping("/{tokenId}")
public R<Void> forceLogout(@PathVariable String tokenId) { public R<Void> forceLogout(@PathVariable String tokenId) {
@@ -120,7 +120,7 @@ public class SysUserOnlineController extends BaseController {
* @param tokenId token值 * @param tokenId token值
* @return 操作结果 * @return 操作结果
*/ */
@Log(title = "在线设备", businessType = BusinessType.FORCE_LOGOUT) @Log(title = "在线设备", businessType = BusinessType.FORCE)
@RepeatSubmit() @RepeatSubmit()
@DeleteMapping("/myself/{tokenId}") @DeleteMapping("/myself/{tokenId}")
public R<Void> remove(@PathVariable("tokenId") String tokenId) { public R<Void> remove(@PathVariable("tokenId") String tokenId) {

View File

@@ -13,6 +13,7 @@ import java.time.LocalDateTime;
* *
* @author Lion Li * @author Lion Li
*/ */
@Data @Data
@TableName("sys_oper_log") @TableName("sys_oper_log")
public class SysOperLog implements Serializable { public class SysOperLog implements Serializable {
@@ -27,35 +28,15 @@ public class SysOperLog implements Serializable {
private Long operId; private Long operId;
/** /**
* 业务模块名称 * 操作模块
*/ */
private String module; private String title;
/** /**
* 操作功能名称 * 业务类型0其它 1新增 2修改 3删除
*/
private String name;
/**
* 操作描述(备注)
*/
private String remark;
/**
* 标签(用于检索/分类)
*/
private String tags;
/**
* 业务类型
*/ */
private Integer businessType; private Integer businessType;
/**
* 操作渠道
*/
private Integer channel;
/** /**
* 请求方法 * 请求方法
*/ */
@@ -72,20 +53,15 @@ public class SysOperLog implements Serializable {
private Integer operatorType; private Integer operatorType;
/** /**
* 用户名 * 操作人员
*/ */
private String username; private String operName;
/** /**
* 部门名称 * 部门名称
*/ */
private String deptName; private String deptName;
/**
* 用户类型
*/
private String userType;
/** /**
* 请求url * 请求url
*/ */
@@ -96,26 +72,11 @@ public class SysOperLog implements Serializable {
*/ */
private String operIp; private String operIp;
/**
* 设备类型
*/
private String deviceType;
/** /**
* 操作地点 * 操作地点
*/ */
private String operLocation; private String operLocation;
/**
* 浏览器类型
*/
private String browser;
/**
* 操作系统
*/
private String os;
/** /**
* 请求参数 * 请求参数
*/ */

View File

@@ -35,42 +35,22 @@ public class SysOperLogBo implements Serializable {
private Long operId; private Long operId;
/** /**
* 业务模块名称 * 模块标题
*/ */
private String module; private String title;
/** /**
* 操作功能名称 * 业务类型0其它 1新增 2修改 3删除
*/
private String name;
/**
* 操作描述(备注)
*/
private String remark;
/**
* 标签(用于检索/分类)
*/
private String tags;
/**
* 业务类型
*/ */
private Integer businessType; private Integer businessType;
/**
* 操作渠道
*/
private Integer channel;
/** /**
* 业务类型数组 * 业务类型数组
*/ */
private Integer[] businessTypes; private Integer[] businessTypes;
/** /**
* 请求方法 * 方法名称
*/ */
private String method; private String method;
@@ -85,9 +65,9 @@ public class SysOperLogBo implements Serializable {
private Integer operatorType; private Integer operatorType;
/** /**
* 用户名 * 操作人员
*/ */
private String username; private String operName;
/** /**
* 部门名称 * 部门名称
@@ -95,40 +75,20 @@ public class SysOperLogBo implements Serializable {
private String deptName; private String deptName;
/** /**
* 用户类型 * 请求URL
*/
private String userType;
/**
* 请求url
*/ */
private String operUrl; private String operUrl;
/** /**
* 操作地址 * 主机地址
*/ */
private String operIp; private String operIp;
/**
* 设备类型
*/
private String deviceType;
/** /**
* 操作地点 * 操作地点
*/ */
private String operLocation; private String operLocation;
/**
* 浏览器类型
*/
private String browser;
/**
* 操作系统
*/
private String os;
/** /**
* 请求参数 * 请求参数
*/ */

View File

@@ -1,6 +1,5 @@
package org.dromara.system.service.impl; package org.dromara.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -44,11 +43,10 @@ public class SysOperLogServiceImpl implements ISysOperLogService {
@Async @Async
@EventListener @EventListener
public void recordOper(OperLogEvent operLogEvent) { public void recordOper(OperLogEvent operLogEvent) {
SysOperLog operLog = BeanUtil.copyProperties(operLogEvent, SysOperLog.class); SysOperLogBo operLog = MapstructUtils.convert(operLogEvent, SysOperLogBo.class);
// 远程查询操作地点 // 远程查询操作地点
operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
operLog.setOperTime(LocalDateTime.now()); insertOperlog(operLog);
baseMapper.insert(operLog);
} }
/** /**
@@ -78,7 +76,7 @@ public class SysOperLogServiceImpl implements ISysOperLogService {
Map<String, Object> params = operLog.getParams(); Map<String, Object> params = operLog.getParams();
return new LambdaQueryWrapper<SysOperLog>() return new LambdaQueryWrapper<SysOperLog>()
.like(StringUtils.isNotBlank(operLog.getOperIp()), SysOperLog::getOperIp, operLog.getOperIp()) .like(StringUtils.isNotBlank(operLog.getOperIp()), SysOperLog::getOperIp, operLog.getOperIp())
.like(StringUtils.isNotBlank(operLog.getModule()), SysOperLog::getModule, operLog.getModule()) .like(StringUtils.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle())
.eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0, .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0,
SysOperLog::getBusinessType, operLog.getBusinessType()) SysOperLog::getBusinessType, operLog.getBusinessType())
.func(f -> { .func(f -> {
@@ -88,7 +86,7 @@ public class SysOperLogServiceImpl implements ISysOperLogService {
}) })
.eq(operLog.getStatus() != null, .eq(operLog.getStatus() != null,
SysOperLog::getStatus, operLog.getStatus()) SysOperLog::getStatus, operLog.getStatus())
.like(StringUtils.isNotBlank(operLog.getUsername()), SysOperLog::getUsername, operLog.getUsername()) .like(StringUtils.isNotBlank(operLog.getOperName()), SysOperLog::getOperName, operLog.getOperName())
.between(params.get("beginTime") != null && params.get("endTime") != null, .between(params.get("beginTime") != null && params.get("endTime") != null,
SysOperLog::getOperTime, params.get("beginTime"), params.get("endTime")); SysOperLog::getOperTime, params.get("beginTime"), params.get("endTime"));
} }

View File

@@ -506,24 +506,16 @@ insert into sys_user_post values ('1', '1');
-- ---------------------------- -- ----------------------------
create table sys_oper_log ( create table sys_oper_log (
oper_id bigint(20) not null comment '日志主键', oper_id bigint(20) not null comment '日志主键',
module varchar(50) default '' comment '业务模块名称', title varchar(50) default '' comment '模块标题',
name varchar(50) default '' comment '操作功能名称', business_type int(2) default 0 comment '业务类型0其它 1新增 2修改 3删除',
remark varchar(255) default '' comment '操作描述(备注)', method varchar(100) default '' comment '方法名称',
tags varchar(255) default '' comment '标签(用于检索/分类)',
business_type int(2) default 0 comment '业务类型',
channel int(1) default 0 comment '操作渠道',
method varchar(100) default '' comment '请求方法',
request_method varchar(10) default '' comment '请求方式', request_method varchar(10) default '' comment '请求方式',
operator_type int(1) default 0 comment '操作类别', operator_type int(1) default 0 comment '操作类别0其它 1后台用户 2手机端用户',
username varchar(50) default '' comment '用户名', oper_name varchar(50) default '' comment '操作人员',
dept_name varchar(50) default '' comment '部门名称', dept_name varchar(50) default '' comment '部门名称',
user_type varchar(20) default '' comment '用户类型', oper_url varchar(255) default '' comment '请求URL',
oper_url varchar(255) default '' comment '请求url', oper_ip varchar(128) default '' comment '主机地址',
oper_ip varchar(128) default '' comment '操作地址',
device_type varchar(50) default '' comment '设备类型',
oper_location varchar(255) default '' comment '操作地点', oper_location varchar(255) default '' comment '操作地点',
browser varchar(50) default '' comment '浏览器类型',
os varchar(50) default '' comment '操作系统',
oper_param varchar(4000) default '' comment '请求参数', oper_param varchar(4000) default '' comment '请求参数',
json_result varchar(4000) default '' comment '返回参数', json_result varchar(4000) default '' comment '返回参数',
status int(1) default 0 comment '操作状态0正常 1异常', status int(1) default 0 comment '操作状态0正常 1异常',