diff --git a/kernel-d-log/log-business-security/README.md b/kernel-d-log/log-business-security/README.md
new file mode 100644
index 000000000..6e320d638
--- /dev/null
+++ b/kernel-d-log/log-business-security/README.md
@@ -0,0 +1 @@
+安全日志记录
\ No newline at end of file
diff --git a/kernel-d-log/log-business-security/pom.xml b/kernel-d-log/log-business-security/pom.xml
new file mode 100644
index 000000000..ebbd21be3
--- /dev/null
+++ b/kernel-d-log/log-business-security/pom.xml
@@ -0,0 +1,59 @@
+
+
+ 4.0.0
+
+
+ com.javaguns.roses
+ kernel-d-log
+ 8.1.9
+ ../pom.xml
+
+
+ log-business-security
+
+ jar
+
+
+
+
+
+ com.javaguns.roses
+ log-api
+ ${roses.version}
+
+
+
+
+
+ com.javaguns.roses
+ scanner-api
+ ${roses.version}
+
+
+
+
+
+ com.javaguns.roses
+ auth-api
+ ${roses.version}
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
+
+
+
diff --git a/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/controller/LogSecurityController.java b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/controller/LogSecurityController.java
new file mode 100644
index 000000000..df3e587b7
--- /dev/null
+++ b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/controller/LogSecurityController.java
@@ -0,0 +1,114 @@
+package cn.stylefeng.roses.kernel.log.security.controller;
+
+import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
+import cn.stylefeng.roses.kernel.log.security.entity.LogSecurity;
+import cn.stylefeng.roses.kernel.log.security.pojo.request.LogSecurityRequest;
+import cn.stylefeng.roses.kernel.log.security.service.LogSecurityService;
+import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
+import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
+import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 安全日志控制器
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+@RestController
+@ApiResource(name = "安全日志")
+public class LogSecurityController {
+
+ @Resource
+ private LogSecurityService logSecurityService;
+
+ /**
+ * 添加安全日志
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ @PostResource(name = "添加安全日志", path = "/logSecurity/add")
+ public ResponseData add(@RequestBody @Validated(LogSecurityRequest.add.class) LogSecurityRequest logSecurityRequest) {
+ logSecurityService.add(logSecurityRequest);
+ return new SuccessResponseData<>();
+ }
+
+ /**
+ * 删除安全日志
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ @PostResource(name = "删除安全日志", path = "/logSecurity/delete")
+ public ResponseData> delete(@RequestBody @Validated(LogSecurityRequest.delete.class) LogSecurityRequest logSecurityRequest) {
+ logSecurityService.del(logSecurityRequest);
+ return new SuccessResponseData<>();
+ }
+
+ /**
+ * 批量删除安全日志
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ @PostResource(name = "批量删除安全日志", path = "/logSecurity/batchDelete")
+ public ResponseData> batchDelete(@RequestBody @Validated(BaseRequest.batchDelete.class) LogSecurityRequest logSecurityRequest) {
+ logSecurityService.batchDelete(logSecurityRequest);
+ return new SuccessResponseData<>();
+ }
+
+ /**
+ * 编辑安全日志
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ @PostResource(name = "编辑安全日志", path = "/logSecurity/edit")
+ public ResponseData> edit(@RequestBody @Validated(LogSecurityRequest.edit.class) LogSecurityRequest logSecurityRequest) {
+ logSecurityService.edit(logSecurityRequest);
+ return new SuccessResponseData<>();
+ }
+
+ /**
+ * 查看安全日志详情
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ @GetResource(name = "查看安全日志详情", path = "/logSecurity/detail")
+ public ResponseData detail(@Validated(LogSecurityRequest.detail.class) LogSecurityRequest logSecurityRequest) {
+ return new SuccessResponseData<>(logSecurityService.detail(logSecurityRequest));
+ }
+
+ /**
+ * 获取安全日志列表
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ @GetResource(name = "获取安全日志列表", path = "/logSecurity/list")
+ public ResponseData> list(LogSecurityRequest logSecurityRequest) {
+ return new SuccessResponseData<>(logSecurityService.findList(logSecurityRequest));
+ }
+
+ /**
+ * 获取安全日志列表(带分页)
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ @GetResource(name = "获取安全日志列表(带分页)", path = "/logSecurity/page")
+ public ResponseData> page(LogSecurityRequest logSecurityRequest) {
+ return new SuccessResponseData<>(logSecurityService.findPage(logSecurityRequest));
+ }
+
+}
diff --git a/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/entity/LogSecurity.java b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/entity/LogSecurity.java
new file mode 100644
index 000000000..81cac60bd
--- /dev/null
+++ b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/entity/LogSecurity.java
@@ -0,0 +1,86 @@
+package cn.stylefeng.roses.kernel.log.security.entity;
+
+import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
+import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 安全日志实例类
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+@TableName("sys_log_security")
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class LogSecurity extends BaseEntity {
+
+ /**
+ * 主键
+ */
+ @TableId(value = "security_log_id", type = IdType.ASSIGN_ID)
+ @ChineseDescription("主键")
+ private Long securityLogId;
+
+ /**
+ * 当前用户请求的url
+ */
+ @TableField("request_url")
+ @ChineseDescription("当前用户请求的url")
+ private String requestUrl;
+
+ /**
+ * http或方法的请求参数体
+ */
+ @TableField("request_params")
+ @ChineseDescription("http或方法的请求参数体")
+ private String requestParams;
+
+ /**
+ * 当前服务器的ip
+ */
+ @TableField("server_ip")
+ @ChineseDescription("当前服务器的ip")
+ private String serverIp;
+
+ /**
+ * 客户端的ip
+ */
+ @TableField("client_ip")
+ @ChineseDescription("客户端的ip")
+ private String clientIp;
+
+ /**
+ * 请求http方法
+ */
+ @TableField("http_method")
+ @ChineseDescription("请求http方法")
+ private String httpMethod;
+
+ /**
+ * 客户浏览器标识
+ */
+ @TableField("client_browser")
+ @ChineseDescription("客户浏览器标识")
+ private String clientBrowser;
+
+ /**
+ * 客户操作系统
+ */
+ @TableField("client_os")
+ @ChineseDescription("客户操作系统")
+ private String clientOs;
+
+ /**
+ * 安全日志内容
+ */
+ @TableField("log_content")
+ @ChineseDescription("安全日志内容")
+ private String logContent;
+
+}
\ No newline at end of file
diff --git a/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/enums/LogSecurityExceptionEnum.java b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/enums/LogSecurityExceptionEnum.java
new file mode 100644
index 000000000..c1b4622d4
--- /dev/null
+++ b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/enums/LogSecurityExceptionEnum.java
@@ -0,0 +1,36 @@
+package cn.stylefeng.roses.kernel.log.security.enums;
+
+import cn.stylefeng.roses.kernel.rule.constants.RuleConstants;
+import cn.stylefeng.roses.kernel.rule.exception.AbstractExceptionEnum;
+import lombok.Getter;
+
+/**
+ * 安全日志异常相关枚举
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+@Getter
+public enum LogSecurityExceptionEnum implements AbstractExceptionEnum {
+
+ /**
+ * 查询结果不存在
+ */
+ LOG_SECURITY_NOT_EXISTED(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10001", "查询结果不存在");
+
+ /**
+ * 错误编码
+ */
+ private final String errorCode;
+
+ /**
+ * 提示用户信息
+ */
+ private final String userTip;
+
+ LogSecurityExceptionEnum(String errorCode, String userTip) {
+ this.errorCode = errorCode;
+ this.userTip = userTip;
+ }
+
+}
diff --git a/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/mapper/LogSecurityMapper.java b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/mapper/LogSecurityMapper.java
new file mode 100644
index 000000000..af0551513
--- /dev/null
+++ b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/mapper/LogSecurityMapper.java
@@ -0,0 +1,28 @@
+package cn.stylefeng.roses.kernel.log.security.mapper;
+
+import cn.stylefeng.roses.kernel.log.security.entity.LogSecurity;
+import cn.stylefeng.roses.kernel.log.security.pojo.request.LogSecurityRequest;
+import cn.stylefeng.roses.kernel.log.security.pojo.response.LogSecurityVo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 安全日志 Mapper 接口
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+public interface LogSecurityMapper extends BaseMapper {
+
+ /**
+ * 获取自定义查询列表
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ List customFindList(@Param("page") Page page, @Param("param")LogSecurityRequest request);
+
+}
diff --git a/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/mapper/mapping/LogSecurityMapper.xml b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/mapper/mapping/LogSecurityMapper.xml
new file mode 100644
index 000000000..75f56dcf7
--- /dev/null
+++ b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/mapper/mapping/LogSecurityMapper.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ security_log_id,request_url,request_params,server_ip,client_ip,http_method,client_browser,client_os,log_content,create_time,create_user,update_time,update_user
+
+
+
+
+
+
+
+
diff --git a/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/pojo/request/LogSecurityRequest.java b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/pojo/request/LogSecurityRequest.java
new file mode 100644
index 000000000..290d9f68b
--- /dev/null
+++ b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/pojo/request/LogSecurityRequest.java
@@ -0,0 +1,83 @@
+package cn.stylefeng.roses.kernel.log.security.pojo.request;
+
+import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
+import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * 安全日志封装类
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class LogSecurityRequest extends BaseRequest {
+
+ /**
+ * 主键
+ */
+ @NotNull(message = "主键不能为空", groups = {edit.class, delete.class})
+ @ChineseDescription("主键")
+ private Long securityLogId;
+
+ /**
+ * 当前用户请求的url
+ */
+ @ChineseDescription("当前用户请求的url")
+ private String requestUrl;
+
+ /**
+ * http或方法的请求参数体
+ */
+ @ChineseDescription("http或方法的请求参数体")
+ private String requestParams;
+
+ /**
+ * 当前服务器的ip
+ */
+ @ChineseDescription("当前服务器的ip")
+ private String serverIp;
+
+ /**
+ * 客户端的ip
+ */
+ @ChineseDescription("客户端的ip")
+ private String clientIp;
+
+ /**
+ * 请求http方法
+ */
+ @ChineseDescription("请求http方法")
+ private String httpMethod;
+
+ /**
+ * 客户浏览器标识
+ */
+ @ChineseDescription("客户浏览器标识")
+ private String clientBrowser;
+
+ /**
+ * 客户操作系统
+ */
+ @ChineseDescription("客户操作系统")
+ private String clientOs;
+
+ /**
+ * 安全日志内容
+ */
+ @ChineseDescription("安全日志内容")
+ private String logContent;
+
+ /**
+ * 批量删除用的id集合
+ */
+ @NotNull(message = "批量删除id集合不能为空", groups = batchDelete.class)
+ @ChineseDescription("批量删除用的id集合")
+ private List batchDeleteIdList;
+
+}
\ No newline at end of file
diff --git a/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/pojo/response/LogSecurityVo.java b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/pojo/response/LogSecurityVo.java
new file mode 100644
index 000000000..3590fd2ca
--- /dev/null
+++ b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/pojo/response/LogSecurityVo.java
@@ -0,0 +1,17 @@
+package cn.stylefeng.roses.kernel.log.security.pojo.response;
+
+import cn.stylefeng.roses.kernel.log.security.entity.LogSecurity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 安全日志返回值封装
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class LogSecurityVo extends LogSecurity {
+
+}
diff --git a/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/service/LogSecurityService.java b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/service/LogSecurityService.java
new file mode 100644
index 000000000..52ce2d7f2
--- /dev/null
+++ b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/service/LogSecurityService.java
@@ -0,0 +1,83 @@
+package cn.stylefeng.roses.kernel.log.security.service;
+
+import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
+import cn.stylefeng.roses.kernel.log.security.entity.LogSecurity;
+import cn.stylefeng.roses.kernel.log.security.pojo.request.LogSecurityRequest;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * 安全日志服务类
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+public interface LogSecurityService extends IService {
+
+ /**
+ * 新增安全日志
+ *
+ * @param logSecurityRequest 请求参数
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ void add(LogSecurityRequest logSecurityRequest);
+
+ /**
+ * 删除安全日志
+ *
+ * @param logSecurityRequest 请求参数
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ void del(LogSecurityRequest logSecurityRequest);
+
+ /**
+ * 批量删除安全日志
+ *
+ * @param logSecurityRequest 请求参数
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ void batchDelete(LogSecurityRequest logSecurityRequest);
+
+ /**
+ * 编辑安全日志
+ *
+ * @param logSecurityRequest 请求参数
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ void edit(LogSecurityRequest logSecurityRequest);
+
+ /**
+ * 查询详情安全日志
+ *
+ * @param logSecurityRequest 请求参数
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ LogSecurity detail(LogSecurityRequest logSecurityRequest);
+
+ /**
+ * 获取安全日志列表
+ *
+ * @param logSecurityRequest 请求参数
+ * @return List 返回结果
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ List findList(LogSecurityRequest logSecurityRequest);
+
+ /**
+ * 获取安全日志分页列表
+ *
+ * @param logSecurityRequest 请求参数
+ * @return PageResult 返回结果
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ PageResult findPage(LogSecurityRequest logSecurityRequest);
+
+}
diff --git a/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/service/impl/LogSecurityServiceImpl.java b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/service/impl/LogSecurityServiceImpl.java
new file mode 100644
index 000000000..1161cc763
--- /dev/null
+++ b/kernel-d-log/log-business-security/src/main/java/cn/stylefeng/roses/kernel/log/security/service/impl/LogSecurityServiceImpl.java
@@ -0,0 +1,129 @@
+package cn.stylefeng.roses.kernel.log.security.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
+import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
+import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
+import cn.stylefeng.roses.kernel.log.security.entity.LogSecurity;
+import cn.stylefeng.roses.kernel.log.security.enums.LogSecurityExceptionEnum;
+import cn.stylefeng.roses.kernel.log.security.mapper.LogSecurityMapper;
+import cn.stylefeng.roses.kernel.log.security.pojo.request.LogSecurityRequest;
+import cn.stylefeng.roses.kernel.log.security.service.LogSecurityService;
+import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 安全日志业务实现层
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+@Service
+public class LogSecurityServiceImpl extends ServiceImpl implements LogSecurityService {
+
+ @Override
+ public void add(LogSecurityRequest logSecurityRequest) {
+ LogSecurity logSecurity = new LogSecurity();
+ BeanUtil.copyProperties(logSecurityRequest, logSecurity);
+ this.save(logSecurity);
+ }
+
+ @Override
+ public void del(LogSecurityRequest logSecurityRequest) {
+ LogSecurity logSecurity = this.queryLogSecurity(logSecurityRequest);
+ this.removeById(logSecurity.getSecurityLogId());
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void batchDelete(LogSecurityRequest logSecurityRequest) {
+ this.removeByIds(logSecurityRequest.getBatchDeleteIdList());
+ }
+
+ @Override
+ public void edit(LogSecurityRequest logSecurityRequest) {
+ LogSecurity logSecurity = this.queryLogSecurity(logSecurityRequest);
+ BeanUtil.copyProperties(logSecurityRequest, logSecurity);
+ this.updateById(logSecurity);
+ }
+
+ @Override
+ public LogSecurity detail(LogSecurityRequest logSecurityRequest) {
+ return this.queryLogSecurity(logSecurityRequest);
+ }
+
+ @Override
+ public PageResult findPage(LogSecurityRequest logSecurityRequest) {
+ LambdaQueryWrapper wrapper = createWrapper(logSecurityRequest);
+ Page pageList = this.page(PageFactory.defaultPage(), wrapper);
+ return PageResultFactory.createPageResult(pageList);
+ }
+
+ @Override
+ public List findList(LogSecurityRequest logSecurityRequest) {
+ LambdaQueryWrapper wrapper = this.createWrapper(logSecurityRequest);
+ return this.list(wrapper);
+ }
+
+ /**
+ * 获取信息
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ private LogSecurity queryLogSecurity(LogSecurityRequest logSecurityRequest) {
+ LogSecurity logSecurity = this.getById(logSecurityRequest.getSecurityLogId());
+ if (ObjectUtil.isEmpty(logSecurity)) {
+ throw new ServiceException(LogSecurityExceptionEnum.LOG_SECURITY_NOT_EXISTED);
+ }
+ return logSecurity;
+ }
+
+ /**
+ * 创建查询wrapper
+ *
+ * @author fengshuonan
+ * @since 2024/07/11 15:56
+ */
+ private LambdaQueryWrapper createWrapper(LogSecurityRequest logSecurityRequest) {
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+
+ Long securityLogId = logSecurityRequest.getSecurityLogId();
+ queryWrapper.eq(ObjectUtil.isNotNull(securityLogId), LogSecurity::getSecurityLogId, securityLogId);
+
+ String requestUrl = logSecurityRequest.getRequestUrl();
+ queryWrapper.like(ObjectUtil.isNotEmpty(requestUrl), LogSecurity::getRequestUrl, requestUrl);
+
+ String requestParams = logSecurityRequest.getRequestParams();
+ queryWrapper.like(ObjectUtil.isNotEmpty(requestParams), LogSecurity::getRequestParams, requestParams);
+
+ String serverIp = logSecurityRequest.getServerIp();
+ queryWrapper.like(ObjectUtil.isNotEmpty(serverIp), LogSecurity::getServerIp, serverIp);
+
+ String clientIp = logSecurityRequest.getClientIp();
+ queryWrapper.like(ObjectUtil.isNotEmpty(clientIp), LogSecurity::getClientIp, clientIp);
+
+ String httpMethod = logSecurityRequest.getHttpMethod();
+ queryWrapper.like(ObjectUtil.isNotEmpty(httpMethod), LogSecurity::getHttpMethod, httpMethod);
+
+ String clientBrowser = logSecurityRequest.getClientBrowser();
+ queryWrapper.like(ObjectUtil.isNotEmpty(clientBrowser), LogSecurity::getClientBrowser, clientBrowser);
+
+ String clientOs = logSecurityRequest.getClientOs();
+ queryWrapper.like(ObjectUtil.isNotEmpty(clientOs), LogSecurity::getClientOs, clientOs);
+
+ String logContent = logSecurityRequest.getLogContent();
+ queryWrapper.like(ObjectUtil.isNotEmpty(logContent), LogSecurity::getLogContent, logContent);
+
+
+ return queryWrapper;
+ }
+
+}
diff --git a/kernel-d-log/log-spring-boot-starter/src/main/resources/db/migration/mysql/V8.1.9_20240710_1705__add_login_log_account.sql b/kernel-d-log/log-spring-boot-starter/src/main/resources/db/migration/mysql/V8.1.9_20240710_1705__add_login_log_account.sql
deleted file mode 100644
index 69eeb97d8..000000000
--- a/kernel-d-log/log-spring-boot-starter/src/main/resources/db/migration/mysql/V8.1.9_20240710_1705__add_login_log_account.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE `sys_login_log` ADD COLUMN `account` varchar(255) NULL COMMENT '账号' AFTER `user_id`;
\ No newline at end of file
diff --git a/kernel-d-log/log-spring-boot-starter/src/main/resources/db/migration/mysql/V8.1.9_20240711_1545__add_sec_log.sql b/kernel-d-log/log-spring-boot-starter/src/main/resources/db/migration/mysql/V8.1.9_20240711_1545__add_sec_log.sql
new file mode 100644
index 000000000..df50b7380
--- /dev/null
+++ b/kernel-d-log/log-spring-boot-starter/src/main/resources/db/migration/mysql/V8.1.9_20240711_1545__add_sec_log.sql
@@ -0,0 +1,18 @@
+ALTER TABLE `sys_login_log` ADD COLUMN `account` varchar(255) NULL COMMENT '账号' AFTER `user_id`;
+
+CREATE TABLE `sys_log_security` (
+ `security_log_id` bigint NOT NULL COMMENT '主键',
+ `request_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '当前用户请求的url',
+ `request_params` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT 'http或方法的请求参数体',
+ `server_ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '当前服务器的ip',
+ `client_ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '客户端的ip',
+ `http_method` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '请求http方法',
+ `client_browser` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '客户浏览器标识',
+ `client_os` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '客户操作系统',
+ `log_content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '安全日志内容',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `create_user` bigint DEFAULT NULL COMMENT '创建人',
+ `update_time` datetime DEFAULT NULL COMMENT '修改时间',
+ `update_user` bigint DEFAULT NULL COMMENT '修改人',
+ PRIMARY KEY (`security_log_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='安全日志';
\ No newline at end of file
diff --git a/kernel-d-log/pom.xml b/kernel-d-log/pom.xml
index 7242c38d9..85217bd1a 100644
--- a/kernel-d-log/pom.xml
+++ b/kernel-d-log/pom.xml
@@ -20,6 +20,7 @@
log-business
log-business-login-log
log-business-requestapi
+ log-business-security
log-spring-boot-starter