♻️ log 模块拆分

This commit is contained in:
b2baccline
2021-06-01 18:28:06 +08:00
parent 849bb047c7
commit 3e29add2a8
52 changed files with 729 additions and 567 deletions

View File

@@ -73,5 +73,9 @@
<groupId>com.hccake</groupId>
<artifactId>ballcat-notify-controller</artifactId>
</dependency>
<dependency>
<groupId>com.hccake</groupId>
<artifactId>ballcat-log-controller</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -1,45 +0,0 @@
package com.hccake.ballcat.admin.modules.log.controller;
import com.hccake.ballcat.admin.modules.log.model.qo.AdminOperationLogQO;
import com.hccake.ballcat.admin.modules.log.model.vo.AdminOperationLogPageVO;
import com.hccake.ballcat.admin.modules.log.service.OperationLogAdminService;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.ballcat.common.model.result.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 操作日志
*
* @author hccake
* @date 2019-10-15 20:42:32
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/log/adminoperationlog")
@Api(value = "adminoperationlog", tags = "操作日志管理")
public class AdminOperationLogController {
private final OperationLogAdminService operationLogAdminService;
/**
* 分页查询
* @param pageParam 分页参数
* @param adminOperationLogQO 操作日志
* @return R
*/
@ApiOperation(value = "分页查询", notes = "分页查询")
@GetMapping("/page")
@PreAuthorize("@per.hasPermission('log:adminoperationlog:read')")
public R<PageResult<AdminOperationLogPageVO>> getOperationLogAdminPage(PageParam pageParam,
AdminOperationLogQO adminOperationLogQO) {
return R.ok(operationLogAdminService.queryPage(pageParam, adminOperationLogQO));
}
}

View File

@@ -1,25 +0,0 @@
package com.hccake.ballcat.admin.modules.log.converter;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminAccessLog;
import com.hccake.ballcat.admin.modules.log.model.vo.AdminAccessLogPageVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 访问日志
*
* @author hccake 2021-03-22 20:23:41
*/
@Mapper
public interface AdminAccessLogConverter {
AdminAccessLogConverter INSTANCE = Mappers.getMapper(AdminAccessLogConverter.class);
/**
* PO 转 PageVO
* @param adminAccessLog 访问日志
* @return AdminAccessLogVO 访问日志VO
*/
AdminAccessLogPageVO poToPageVo(AdminAccessLog adminAccessLog);
}

View File

@@ -1,25 +0,0 @@
package com.hccake.ballcat.admin.modules.log.converter;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminLoginLog;
import com.hccake.ballcat.admin.modules.log.model.vo.AdminLoginLogPageVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 登陆日志模型转换器
*
* @author hccake 2021-03-22 20:28:16
*/
@Mapper
public interface AdminLoginLogConverter {
AdminLoginLogConverter INSTANCE = Mappers.getMapper(AdminLoginLogConverter.class);
/**
* PO 转 PageVO
* @param adminLoginLog 登陆日志
* @return AdminLoginLogPageVO 登陆日志PageVO
*/
AdminLoginLogPageVO poToPageVo(AdminLoginLog adminLoginLog);
}

View File

@@ -1,33 +0,0 @@
package com.hccake.ballcat.admin.modules.log.converter;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminOperationLog;
import com.hccake.ballcat.admin.modules.log.model.vo.AdminOperationLogPageVO;
import com.hccake.ballcat.commom.log.operation.model.OperationLogDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 操作日志模型转换器
*
* @author hccake 2021-03-22 20:32:30
*/
@Mapper
public interface AdminOperationLogConverter {
AdminOperationLogConverter INSTANCE = Mappers.getMapper(AdminOperationLogConverter.class);
/**
* PO 转 PageVO
* @param adminOperationLog 操作日志
* @return AdminOperationLogPageVO 操作日志PageVO
*/
AdminOperationLogPageVO poToPageVo(AdminOperationLog adminOperationLog);
/**
* 转换OperationLog 为 OperationLogAdmin
* @param operationLogDTO 操作日志DTO
* @return AdminOperationLog
*/
AdminOperationLog dtoToPo(OperationLogDTO operationLogDTO);
}

View File

@@ -1,32 +0,0 @@
package com.hccake.ballcat.admin.modules.log.handler;
import com.hccake.ballcat.admin.modules.log.converter.AdminOperationLogConverter;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminOperationLog;
import com.hccake.ballcat.admin.modules.log.service.OperationLogAdminService;
import com.hccake.ballcat.commom.log.operation.model.OperationLogDTO;
import com.hccake.ballcat.commom.log.operation.service.OperationLogHandler;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
/**
* @author Hccake
* @version 1.0
* @date 2020/5/25 20:38
*/
@Component
@RequiredArgsConstructor
public class AdminOperationLogHandler implements OperationLogHandler {
private final OperationLogAdminService operationLogAdminService;
/**
* 保存操作日志
* @param operationLogDTO 操作日志DTO
*/
@Override
public void saveLog(OperationLogDTO operationLogDTO) {
AdminOperationLog adminOperationLog = AdminOperationLogConverter.INSTANCE.dtoToPo(operationLogDTO);
operationLogAdminService.save(adminOperationLog);
}
}

View File

@@ -1,42 +0,0 @@
package com.hccake.ballcat.admin.modules.log.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hccake.ballcat.admin.modules.log.converter.AdminAccessLogConverter;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminAccessLog;
import com.hccake.ballcat.admin.modules.log.model.qo.AdminAccessLogQO;
import com.hccake.ballcat.admin.modules.log.model.vo.AdminAccessLogPageVO;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX;
import com.hccake.extend.mybatis.plus.mapper.ExtendMapper;
import com.hccake.extend.mybatis.plus.toolkit.WrappersX;
/**
* 后台访问日志
*
* @author hccake
* @date 2019-10-16 16:09:25
*/
public interface AdminAccessLogMapper extends ExtendMapper<AdminAccessLog> {
/**
* 分页查询
* @param pageParam 分页参数
* @param qo 查询对象
* @return 分页结果数据 PageResult
*/
default PageResult<AdminAccessLogPageVO> queryPage(PageParam pageParam, AdminAccessLogQO qo) {
IPage<AdminAccessLog> page = this.prodPage(pageParam);
LambdaQueryWrapperX<AdminAccessLog> wrapperX = WrappersX.lambdaQueryX(AdminAccessLog.class)
.eqIfPresent(AdminAccessLog::getUserId, qo.getUserId())
.eqIfPresent(AdminAccessLog::getTraceId, qo.getTraceId())
.eqIfPresent(AdminAccessLog::getMatchingPattern, qo.getMatchingPattern())
.eqIfPresent(AdminAccessLog::getIp, qo.getIp())
.gtIfPresent(AdminAccessLog::getCreateTime, qo.getStartTime())
.ltIfPresent(AdminAccessLog::getCreateTime, qo.getEndTime());
this.selectPage(page, wrapperX);
IPage<AdminAccessLogPageVO> voPage = page.convert(AdminAccessLogConverter.INSTANCE::poToPageVo);
return new PageResult<>(voPage.getRecords(), voPage.getTotal());
}
}

View File

@@ -1,41 +0,0 @@
package com.hccake.ballcat.admin.modules.log.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hccake.ballcat.admin.modules.log.converter.AdminLoginLogConverter;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminLoginLog;
import com.hccake.ballcat.admin.modules.log.model.qo.AdminLoginLogQO;
import com.hccake.ballcat.admin.modules.log.model.vo.AdminLoginLogPageVO;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX;
import com.hccake.extend.mybatis.plus.mapper.ExtendMapper;
import com.hccake.extend.mybatis.plus.toolkit.WrappersX;
/**
* 登陆日志
*
* @author hccake 2020-09-16 20:21:10
*/
public interface AdminLoginLogMapper extends ExtendMapper<AdminLoginLog> {
/**
* 分页查询
* @param pageParam 分页参数
* @param qo 查询对象
* @return 分页结果数据 PageResult
*/
default PageResult<AdminLoginLogPageVO> queryPage(PageParam pageParam, AdminLoginLogQO qo) {
IPage<AdminLoginLog> page = this.prodPage(pageParam);
LambdaQueryWrapperX<AdminLoginLog> wrapperX = WrappersX.lambdaQueryX(AdminLoginLog.class)
.eqIfPresent(AdminLoginLog::getUsername, qo.getUsername())
.eqIfPresent(AdminLoginLog::getTraceId, qo.getTraceId()).eqIfPresent(AdminLoginLog::getIp, qo.getIp())
.eqIfPresent(AdminLoginLog::getEventType, qo.getEventType())
.eqIfPresent(AdminLoginLog::getStatus, qo.getStatus())
.gtIfPresent(AdminLoginLog::getLoginTime, qo.getStartTime())
.ltIfPresent(AdminLoginLog::getLoginTime, qo.getEndTime());
this.selectPage(page, wrapperX);
IPage<AdminLoginLogPageVO> voPage = page.convert(AdminLoginLogConverter.INSTANCE::poToPageVo);
return new PageResult<>(voPage.getRecords(), voPage.getTotal());
}
}

View File

@@ -1,43 +0,0 @@
package com.hccake.ballcat.admin.modules.log.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hccake.ballcat.admin.modules.log.converter.AdminOperationLogConverter;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminOperationLog;
import com.hccake.ballcat.admin.modules.log.model.qo.AdminOperationLogQO;
import com.hccake.ballcat.admin.modules.log.model.vo.AdminOperationLogPageVO;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX;
import com.hccake.extend.mybatis.plus.mapper.ExtendMapper;
import com.hccake.extend.mybatis.plus.toolkit.WrappersX;
/**
* 操作日志
*
* @author hccake
* @date 2019-10-15 20:42:32
*/
public interface AdminOperationLogMapper extends ExtendMapper<AdminOperationLog> {
/**
* 分页查询
* @param pageParam 分页参数
* @param qo 查询对象
* @return 分页结果数据 PageResult
*/
default PageResult<AdminOperationLogPageVO> queryPage(PageParam pageParam, AdminOperationLogQO qo) {
IPage<AdminOperationLog> page = this.prodPage(pageParam);
LambdaQueryWrapperX<AdminOperationLog> wrapperX = WrappersX.lambdaQueryX(AdminOperationLog.class)
.eqIfPresent(AdminOperationLog::getOperator, qo.getUserId())
.eqIfPresent(AdminOperationLog::getTraceId, qo.getTraceId())
.eqIfPresent(AdminOperationLog::getUri, qo.getUri()).eqIfPresent(AdminOperationLog::getIp, qo.getIp())
.eqIfPresent(AdminOperationLog::getStatus, qo.getStatus())
.eqIfPresent(AdminOperationLog::getType, qo.getType())
.gtIfPresent(AdminOperationLog::getCreateTime, qo.getStartTime())
.ltIfPresent(AdminOperationLog::getCreateTime, qo.getEndTime());
this.selectPage(page, wrapperX);
IPage<AdminOperationLogPageVO> voPage = page.convert(AdminOperationLogConverter.INSTANCE::poToPageVo);
return new PageResult<>(voPage.getRecords(), voPage.getTotal());
}
}

View File

@@ -1,26 +0,0 @@
package com.hccake.ballcat.admin.modules.log.service;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminAccessLog;
import com.hccake.ballcat.admin.modules.log.model.qo.AdminAccessLogQO;
import com.hccake.ballcat.admin.modules.log.model.vo.AdminAccessLogPageVO;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.service.ExtendService;
/**
* 后台访问日志
*
* @author hccake
* @date 2019-10-16 16:09:25
*/
public interface AdminAccessLogService extends ExtendService<AdminAccessLog> {
/**
* 根据QueryObject查询分页数据
* @param page 分页参数
* @param qo 查询参数对象
* @return PageResult<LoginLogVO> 分页数据
*/
PageResult<AdminAccessLogPageVO> queryPage(PageParam page, AdminAccessLogQO qo);
}

View File

@@ -1,25 +0,0 @@
package com.hccake.ballcat.admin.modules.log.service;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminLoginLog;
import com.hccake.ballcat.admin.modules.log.model.qo.AdminLoginLogQO;
import com.hccake.ballcat.admin.modules.log.model.vo.AdminLoginLogPageVO;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.service.ExtendService;
/**
* 登陆日志
*
* @author hccake 2020-09-16 20:21:10
*/
public interface AdminLoginLogService extends ExtendService<AdminLoginLog> {
/**
* 根据QueryObject查询分页数据
* @param page 分页参数
* @param qo 查询参数对象
* @return PageResult<LoginLogVO> 分页数据
*/
PageResult<AdminLoginLogPageVO> queryPage(PageParam page, AdminLoginLogQO qo);
}

View File

@@ -1,26 +0,0 @@
package com.hccake.ballcat.admin.modules.log.service;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminOperationLog;
import com.hccake.ballcat.admin.modules.log.model.qo.AdminOperationLogQO;
import com.hccake.ballcat.admin.modules.log.model.vo.AdminOperationLogPageVO;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.service.ExtendService;
/**
* 操作日志
*
* @author hccake
* @date 2019-10-15 20:42:32
*/
public interface OperationLogAdminService extends ExtendService<AdminOperationLog> {
/**
* 根据QueryObject查询分页数据
* @param pageParam 分页参数
* @param qo 查询参数对象
* @return PageResult<LoginLogVO> 分页数据
*/
PageResult<AdminOperationLogPageVO> queryPage(PageParam pageParam, AdminOperationLogQO qo);
}

View File

@@ -1,36 +0,0 @@
package com.hccake.ballcat.admin.modules.log.service.impl;
import com.hccake.ballcat.admin.modules.log.mapper.AdminAccessLogMapper;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminAccessLog;
import com.hccake.ballcat.admin.modules.log.model.qo.AdminAccessLogQO;
import com.hccake.ballcat.admin.modules.log.model.vo.AdminAccessLogPageVO;
import com.hccake.ballcat.admin.modules.log.service.AdminAccessLogService;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 后台访问日志
*
* @author hccake
* @date 2019-10-16 16:09:25
*/
@Slf4j
@Service
public class AdminAccessLogServiceImpl extends ExtendServiceImpl<AdminAccessLogMapper, AdminAccessLog>
implements AdminAccessLogService {
/**
* 根据QueryObject查询分页数据
* @param pageParam 分页参数
* @param qo 查询参数对象
* @return IPage<LoginLogVO> 分页数据
*/
@Override
public PageResult<AdminAccessLogPageVO> queryPage(PageParam pageParam, AdminAccessLogQO qo) {
return baseMapper.queryPage(pageParam, qo);
}
}

View File

@@ -1,33 +0,0 @@
package com.hccake.ballcat.admin.modules.log.service.impl;
import com.hccake.ballcat.admin.modules.log.mapper.AdminLoginLogMapper;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminLoginLog;
import com.hccake.ballcat.admin.modules.log.model.qo.AdminLoginLogQO;
import com.hccake.ballcat.admin.modules.log.model.vo.AdminLoginLogPageVO;
import com.hccake.ballcat.admin.modules.log.service.AdminLoginLogService;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import org.springframework.stereotype.Service;
/**
* 登陆日志
*
* @author hccake 2020-09-16 20:21:10
*/
@Service
public class AdminLoginLogServiceImpl extends ExtendServiceImpl<AdminLoginLogMapper, AdminLoginLog>
implements AdminLoginLogService {
/**
* 根据QueryObject查询分页数据
* @param pageParam 分页参数
* @param qo 查询参数对象
* @return PageResult<LoginLogVO> 分页数据
*/
@Override
public PageResult<AdminLoginLogPageVO> queryPage(PageParam pageParam, AdminLoginLogQO qo) {
return baseMapper.queryPage(pageParam, qo);
}
}

View File

@@ -1,34 +0,0 @@
package com.hccake.ballcat.admin.modules.log.service.impl;
import com.hccake.ballcat.admin.modules.log.mapper.AdminOperationLogMapper;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminOperationLog;
import com.hccake.ballcat.admin.modules.log.model.qo.AdminOperationLogQO;
import com.hccake.ballcat.admin.modules.log.model.vo.AdminOperationLogPageVO;
import com.hccake.ballcat.admin.modules.log.service.OperationLogAdminService;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import org.springframework.stereotype.Service;
/**
* 操作日志
*
* @author hccake
* @date 2019-10-15 20:42:32
*/
@Service
public class OperationLogAdminServiceImpl extends ExtendServiceImpl<AdminOperationLogMapper, AdminOperationLog>
implements OperationLogAdminService {
/**
* 根据QueryObject查询分页数据
* @param pageParam 分页参数
* @param qo 查询参数对象
* @return PageResult<LoginLogVO> 分页数据
*/
@Override
public PageResult<AdminOperationLogPageVO> queryPage(PageParam pageParam, AdminOperationLogQO qo) {
return baseMapper.queryPage(pageParam, qo);
}
}

View File

@@ -311,7 +311,22 @@
<artifactId>ballcat-notify-model</artifactId>
<version>${revision}</version>
</dependency>
<!-- log 日志模块 -->
<dependency>
<groupId>com.hccake</groupId>
<artifactId>ballcat-log-controller</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>com.hccake</groupId>
<artifactId>ballcat-log-biz</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>com.hccake</groupId>
<artifactId>ballcat-log-model</artifactId>
<version>${revision}</version>
</dependency>
<!--swagger注解-->
<dependency>

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ballcat-log</artifactId>
<groupId>com.hccake</groupId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ballcat-log-biz</artifactId>
<dependencies>
<dependency>
<groupId>com.hccake</groupId>
<artifactId>ballcat-log-model</artifactId>
</dependency>
<dependency>
<groupId>com.hccake</groupId>
<artifactId>ballcat-oauth-model</artifactId>
</dependency>
<dependency>
<groupId>com.hccake</groupId>
<artifactId>ballcat-spring-boot-starter-log</artifactId>
</dependency>
<dependency>
<groupId>com.hccake</groupId>
<artifactId>ballcat-extend-mybatis-plus</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -1,8 +1,6 @@
package com.hccake.ballcat.admin.modules.log.handler;
package com.hccake.ballcat.log.handler;
import cn.hutool.core.util.URLUtil;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminAccessLog;
import com.hccake.ballcat.admin.modules.log.thread.AccessLogAdminSaveThread;
import com.hccake.ballcat.commom.log.access.handler.AccessLogHandler;
import com.hccake.ballcat.commom.log.constant.LogConstant;
import com.hccake.ballcat.commom.log.util.LogUtils;
@@ -10,12 +8,13 @@ import com.hccake.ballcat.common.desensitize.DesensitizationHandlerHolder;
import com.hccake.ballcat.common.desensitize.enums.RegexDesensitizationTypeEnum;
import com.hccake.ballcat.common.util.IpUtils;
import com.hccake.ballcat.common.util.JsonUtils;
import com.hccake.ballcat.log.model.entity.AccessLog;
import com.hccake.ballcat.log.thread.AccessLogSaveThread;
import com.hccake.ballcat.oauth.SysUserDetails;
import com.hccake.ballcat.oauth.util.SecurityUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.HandlerMapping;
import javax.servlet.http.HttpServletRequest;
@@ -33,13 +32,12 @@ import java.util.Optional;
* @date 2019-10-16 16:09:25
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class AdminAccessLogHandler implements AccessLogHandler<AdminAccessLog> {
public class CustomAccessLogHandler implements AccessLogHandler<AccessLog> {
private static final String APPLICATION_JSON = "application/json";
private final AccessLogAdminSaveThread accessLogAdminSaveThread;
private final AccessLogSaveThread accessLogSaveThread;
/**
* 需要脱敏记录的参数
@@ -55,13 +53,13 @@ public class AdminAccessLogHandler implements AccessLogHandler<AdminAccessLog> {
* @param myThrowable 异常信息
*/
@Override
public AdminAccessLog prodLog(HttpServletRequest request, HttpServletResponse response, Long time,
public AccessLog prodLog(HttpServletRequest request, HttpServletResponse response, Long time,
Throwable myThrowable) {
Object matchingPatternAttr = request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
String matchingPattern = matchingPatternAttr == null ? "" : String.valueOf(matchingPatternAttr);
// @formatter:off
String uri = URLUtil.getPath(request.getRequestURI());
AdminAccessLog adminAccessLog = new AdminAccessLog()
AccessLog accessLog = new AccessLog()
.setTraceId(MDC.get(LogConstant.TRACE_ID))
.setCreateTime(LocalDateTime.now())
.setTime(time)
@@ -76,28 +74,28 @@ public class AdminAccessLogHandler implements AccessLogHandler<AdminAccessLog> {
// 参数获取
String params = getParams(request);
adminAccessLog.setReqParams(params);
accessLog.setReqParams(params);
// 非文件上传请求记录body用户改密时不记录body
// TODO 使用注解控制此次请求是否记录body更方便个性化定制
if (!LogUtils.isMultipartContent(request) && "/sysuser/pass/{userId}".equals(uri)) {
adminAccessLog.setReqBody(LogUtils.getRequestBody(request));
accessLog.setReqBody(LogUtils.getRequestBody(request));
}
// 只记录响应头为 application/json 的返回数据
// 后台日志对于分页数据请求不记录返回值
if (!uri.endsWith("/page") && response.getContentType() != null
&& response.getContentType().contains(APPLICATION_JSON)) {
adminAccessLog.setResult(LogUtils.getResponseBody(request, response));
accessLog.setResult(LogUtils.getResponseBody(request, response));
}
// 如果登陆用户 则记录用户名和用户id
Optional.ofNullable(SecurityUtils.getSysUserDetails()).map(SysUserDetails::getSysUser).ifPresent(x -> {
adminAccessLog.setUserId(x.getUserId());
adminAccessLog.setUsername(x.getUsername());
accessLog.setUserId(x.getUserId());
accessLog.setUsername(x.getUsername());
});
return adminAccessLog;
return accessLog;
}
/**
@@ -131,8 +129,8 @@ public class AdminAccessLogHandler implements AccessLogHandler<AdminAccessLog> {
* @param accessLog 访问日志
*/
@Override
public void saveLog(AdminAccessLog accessLog) {
accessLogAdminSaveThread.put(accessLog);
public void saveLog(AccessLog accessLog) {
accessLogSaveThread.put(accessLog);
}
}

View File

@@ -0,0 +1,30 @@
package com.hccake.ballcat.log.handler;
import com.hccake.ballcat.commom.log.operation.model.OperationLogDTO;
import com.hccake.ballcat.commom.log.operation.service.OperationLogHandler;
import com.hccake.ballcat.log.converter.OperationLogConverter;
import com.hccake.ballcat.log.model.entity.OperationLog;
import com.hccake.ballcat.log.service.OperationLogService;
import lombok.RequiredArgsConstructor;
/**
* @author Hccake
* @version 1.0
* @date 2020/5/25 20:38
*/
@RequiredArgsConstructor
public class CustomOperationLogHandler implements OperationLogHandler {
private final OperationLogService operationLogService;
/**
* 保存操作日志
* @param operationLogDTO 操作日志DTO
*/
@Override
public void saveLog(OperationLogDTO operationLogDTO) {
OperationLog operationLog = OperationLogConverter.INSTANCE.dtoToPo(operationLogDTO);
operationLogService.save(operationLog);
}
}

View File

@@ -1,14 +1,14 @@
package com.hccake.ballcat.admin.modules.log.listener;
package com.hccake.ballcat.log.handler;
import cn.hutool.http.useragent.UserAgent;
import cn.hutool.http.useragent.UserAgentUtil;
import com.hccake.ballcat.admin.constants.LoginEventTypeEnum;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminLoginLog;
import com.hccake.ballcat.admin.modules.log.service.AdminLoginLogService;
import com.hccake.ballcat.commom.log.constant.LogConstant;
import com.hccake.ballcat.commom.log.operation.enums.LogStatusEnum;
import com.hccake.ballcat.commom.log.util.LogUtils;
import com.hccake.ballcat.common.util.IpUtils;
import com.hccake.ballcat.log.enums.LoginEventTypeEnum;
import com.hccake.ballcat.log.model.entity.LoginLog;
import com.hccake.ballcat.log.service.LoginLogService;
import lombok.RequiredArgsConstructor;
import org.slf4j.MDC;
import org.springframework.context.event.EventListener;
@@ -16,7 +16,6 @@ import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.authentication.event.AbstractAuthenticationFailureEvent;
import org.springframework.security.authentication.event.AuthenticationSuccessEvent;
import org.springframework.security.authentication.event.LogoutSuccessEvent;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
@@ -30,10 +29,9 @@ import java.util.HashMap;
* @date 2020 /6/9 20:52
*/
@RequiredArgsConstructor
@Component
public class LoginEventListener {
public class LoginLogHandler {
private final AdminLoginLogService adminLoginLogService;
private final LoginLogService loginLogService;
/**
* 登陆成功时间监听 记录用户登录日志
@@ -50,9 +48,9 @@ public class LoginEventListener {
// TODO 暂时只记录了 password 模式其他的第三方登陆 spring-authorization-server 孵化后重构
// https://github.com/spring-projects-experimental/spring-authorization-server
if ("password".equals(((HashMap) details).get("grant_type"))) {
AdminLoginLog adminLoginLog = prodLoginLog(source).setMsg("登陆成功")
.setStatus(LogStatusEnum.SUCCESS.getValue()).setEventType(LoginEventTypeEnum.LOGIN.getValue());
adminLoginLogService.save(adminLoginLog);
LoginLog loginLog = prodLoginLog(source).setMsg("登陆成功").setStatus(LogStatusEnum.SUCCESS.getValue())
.setEventType(LoginEventTypeEnum.LOGIN.getValue());
loginLogService.save(loginLog);
}
}
@@ -63,9 +61,9 @@ public class LoginEventListener {
@EventListener(AbstractAuthenticationFailureEvent.class)
public void onAuthenticationFailureEvent(AbstractAuthenticationFailureEvent event) {
AbstractAuthenticationToken source = (AbstractAuthenticationToken) event.getSource();
AdminLoginLog adminLoginLog = prodLoginLog(source).setMsg(event.getException().getMessage())
LoginLog loginLog = prodLoginLog(source).setMsg(event.getException().getMessage())
.setEventType(LoginEventTypeEnum.LOGIN.getValue()).setStatus(LogStatusEnum.FAIL.getValue());
adminLoginLogService.save(adminLoginLog);
loginLogService.save(loginLog);
}
/**
@@ -75,9 +73,8 @@ public class LoginEventListener {
@EventListener(LogoutSuccessEvent.class)
public void onLogoutSuccessEvent(LogoutSuccessEvent event) {
AbstractAuthenticationToken source = (AbstractAuthenticationToken) event.getSource();
AdminLoginLog adminLoginLog = prodLoginLog(source).setMsg("登出成功")
.setEventType(LoginEventTypeEnum.LOGOUT.getValue());
adminLoginLogService.save(adminLoginLog);
LoginLog loginLog = prodLoginLog(source).setMsg("登出成功").setEventType(LoginEventTypeEnum.LOGOUT.getValue());
loginLogService.save(loginLog);
}
/**
@@ -85,18 +82,18 @@ public class LoginEventListener {
* @param source AbstractAuthenticationToken 当前token
* @return LoginLog 登陆日志
*/
private AdminLoginLog prodLoginLog(AbstractAuthenticationToken source) {
private LoginLog prodLoginLog(AbstractAuthenticationToken source) {
// 获取 Request
HttpServletRequest request = LogUtils.getHttpServletRequest();
AdminLoginLog adminLoginLog = new AdminLoginLog().setLoginTime(LocalDateTime.now())
.setIp(IpUtils.getIpAddr(request)).setStatus(LogStatusEnum.SUCCESS.getValue())
.setTraceId(MDC.get(LogConstant.TRACE_ID)).setUsername(source.getName());
LoginLog loginLog = new LoginLog().setLoginTime(LocalDateTime.now()).setIp(IpUtils.getIpAddr(request))
.setStatus(LogStatusEnum.SUCCESS.getValue()).setTraceId(MDC.get(LogConstant.TRACE_ID))
.setUsername(source.getName());
// 根据 ua 获取浏览器和操作系统
UserAgent ua = UserAgentUtil.parse(request.getHeader("user-agent"));
if (ua != null) {
adminLoginLog.setBrowser(ua.getBrowser().getName()).setOs(ua.getOs().getName());
loginLog.setBrowser(ua.getBrowser().getName()).setOs(ua.getOs().getName());
}
return adminLoginLog;
return loginLog;
}
}

View File

@@ -0,0 +1,41 @@
package com.hccake.ballcat.log.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hccake.ballcat.log.converter.AccessLogConverter;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.ballcat.log.model.entity.AccessLog;
import com.hccake.ballcat.log.model.qo.AccessLogQO;
import com.hccake.ballcat.log.model.vo.AccessLogPageVO;
import com.hccake.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX;
import com.hccake.extend.mybatis.plus.mapper.ExtendMapper;
import com.hccake.extend.mybatis.plus.toolkit.WrappersX;
/**
* 后台访问日志
*
* @author hccake
* @date 2019-10-16 16:09:25
*/
public interface AccessLogMapper extends ExtendMapper<AccessLog> {
/**
* 分页查询
* @param pageParam 分页参数
* @param qo 查询对象
* @return 分页结果数据 PageResult
*/
default PageResult<AccessLogPageVO> queryPage(PageParam pageParam, AccessLogQO qo) {
IPage<AccessLog> page = this.prodPage(pageParam);
LambdaQueryWrapperX<AccessLog> wrapperX = WrappersX.lambdaQueryX(AccessLog.class)
.eqIfPresent(AccessLog::getUserId, qo.getUserId()).eqIfPresent(AccessLog::getTraceId, qo.getTraceId())
.eqIfPresent(AccessLog::getMatchingPattern, qo.getMatchingPattern())
.eqIfPresent(AccessLog::getUri, qo.getUri()).eqIfPresent(AccessLog::getHttpStatus, qo.getHttpStatus())
.eqIfPresent(AccessLog::getIp, qo.getIp()).gtIfPresent(AccessLog::getCreateTime, qo.getStartTime())
.ltIfPresent(AccessLog::getCreateTime, qo.getEndTime());
this.selectPage(page, wrapperX);
IPage<AccessLogPageVO> voPage = page.convert(AccessLogConverter.INSTANCE::poToPageVo);
return new PageResult<>(voPage.getRecords(), voPage.getTotal());
}
}

View File

@@ -0,0 +1,39 @@
package com.hccake.ballcat.log.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hccake.ballcat.log.converter.LoginLogConverter;
import com.hccake.ballcat.log.model.entity.LoginLog;
import com.hccake.ballcat.log.model.qo.LoginLogQO;
import com.hccake.ballcat.log.model.vo.LoginLogPageVO;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX;
import com.hccake.extend.mybatis.plus.mapper.ExtendMapper;
import com.hccake.extend.mybatis.plus.toolkit.WrappersX;
/**
* 登陆日志
*
* @author hccake 2020-09-16 20:21:10
*/
public interface LoginLogMapper extends ExtendMapper<LoginLog> {
/**
* 分页查询
* @param pageParam 分页参数
* @param qo 查询对象
* @return 分页结果数据 PageResult
*/
default PageResult<LoginLogPageVO> queryPage(PageParam pageParam, LoginLogQO qo) {
IPage<LoginLog> page = this.prodPage(pageParam);
LambdaQueryWrapperX<LoginLog> wrapperX = WrappersX.lambdaQueryX(LoginLog.class)
.eqIfPresent(LoginLog::getUsername, qo.getUsername()).eqIfPresent(LoginLog::getTraceId, qo.getTraceId())
.eqIfPresent(LoginLog::getIp, qo.getIp()).eqIfPresent(LoginLog::getEventType, qo.getEventType())
.eqIfPresent(LoginLog::getStatus, qo.getStatus()).gtIfPresent(LoginLog::getLoginTime, qo.getStartTime())
.ltIfPresent(LoginLog::getLoginTime, qo.getEndTime());
this.selectPage(page, wrapperX);
IPage<LoginLogPageVO> voPage = page.convert(LoginLogConverter.INSTANCE::poToPageVo);
return new PageResult<>(voPage.getRecords(), voPage.getTotal());
}
}

View File

@@ -0,0 +1,42 @@
package com.hccake.ballcat.log.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hccake.ballcat.log.converter.OperationLogConverter;
import com.hccake.ballcat.log.model.entity.OperationLog;
import com.hccake.ballcat.log.model.qo.OperationLogQO;
import com.hccake.ballcat.log.model.vo.OperationLogPageVO;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX;
import com.hccake.extend.mybatis.plus.mapper.ExtendMapper;
import com.hccake.extend.mybatis.plus.toolkit.WrappersX;
/**
* 操作日志
*
* @author hccake
* @date 2019-10-15 20:42:32
*/
public interface OperationLogMapper extends ExtendMapper<OperationLog> {
/**
* 分页查询
* @param pageParam 分页参数
* @param qo 查询对象
* @return 分页结果数据 PageResult
*/
default PageResult<OperationLogPageVO> queryPage(PageParam pageParam, OperationLogQO qo) {
IPage<OperationLog> page = this.prodPage(pageParam);
LambdaQueryWrapperX<OperationLog> wrapperX = WrappersX.lambdaQueryX(OperationLog.class)
.eqIfPresent(OperationLog::getOperator, qo.getUserId())
.eqIfPresent(OperationLog::getTraceId, qo.getTraceId()).eqIfPresent(OperationLog::getUri, qo.getUri())
.eqIfPresent(OperationLog::getIp, qo.getIp()).eqIfPresent(OperationLog::getStatus, qo.getStatus())
.eqIfPresent(OperationLog::getType, qo.getType()).likeIfPresent(OperationLog::getMsg, qo.getMsg())
.gtIfPresent(OperationLog::getCreateTime, qo.getStartTime())
.ltIfPresent(OperationLog::getCreateTime, qo.getEndTime());
this.selectPage(page, wrapperX);
IPage<OperationLogPageVO> voPage = page.convert(OperationLogConverter.INSTANCE::poToPageVo);
return new PageResult<>(voPage.getRecords(), voPage.getTotal());
}
}

View File

@@ -0,0 +1,26 @@
package com.hccake.ballcat.log.service;
import com.hccake.ballcat.log.model.entity.AccessLog;
import com.hccake.ballcat.log.model.qo.AccessLogQO;
import com.hccake.ballcat.log.model.vo.AccessLogPageVO;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.service.ExtendService;
/**
* 后台访问日志
*
* @author hccake
* @date 2019-10-16 16:09:25
*/
public interface AccessLogService extends ExtendService<AccessLog> {
/**
* 根据QueryObject查询分页数据
* @param page 分页参数
* @param qo 查询参数对象
* @return PageResult<LoginLogVO> 分页数据
*/
PageResult<AccessLogPageVO> queryPage(PageParam page, AccessLogQO qo);
}

View File

@@ -0,0 +1,25 @@
package com.hccake.ballcat.log.service;
import com.hccake.ballcat.log.model.entity.LoginLog;
import com.hccake.ballcat.log.model.qo.LoginLogQO;
import com.hccake.ballcat.log.model.vo.LoginLogPageVO;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.service.ExtendService;
/**
* 登陆日志
*
* @author hccake 2020-09-16 20:21:10
*/
public interface LoginLogService extends ExtendService<LoginLog> {
/**
* 根据QueryObject查询分页数据
* @param page 分页参数
* @param qo 查询参数对象
* @return PageResult<LoginLogVO> 分页数据
*/
PageResult<LoginLogPageVO> queryPage(PageParam page, LoginLogQO qo);
}

View File

@@ -0,0 +1,26 @@
package com.hccake.ballcat.log.service;
import com.hccake.ballcat.log.model.entity.OperationLog;
import com.hccake.ballcat.log.model.qo.OperationLogQO;
import com.hccake.ballcat.log.model.vo.OperationLogPageVO;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.service.ExtendService;
/**
* 操作日志
*
* @author hccake
* @date 2019-10-15 20:42:32
*/
public interface OperationLogService extends ExtendService<OperationLog> {
/**
* 根据QueryObject查询分页数据
* @param pageParam 分页参数
* @param qo 查询参数对象
* @return PageResult<LoginLogVO> 分页数据
*/
PageResult<OperationLogPageVO> queryPage(PageParam pageParam, OperationLogQO qo);
}

View File

@@ -0,0 +1,35 @@
package com.hccake.ballcat.log.service.impl;
import com.hccake.ballcat.log.mapper.AccessLogMapper;
import com.hccake.ballcat.log.model.entity.AccessLog;
import com.hccake.ballcat.log.model.qo.AccessLogQO;
import com.hccake.ballcat.log.model.vo.AccessLogPageVO;
import com.hccake.ballcat.log.service.AccessLogService;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 后台访问日志
*
* @author hccake
* @date 2019-10-16 16:09:25
*/
@Slf4j
@Service
public class AccessLogServiceImpl extends ExtendServiceImpl<AccessLogMapper, AccessLog> implements AccessLogService {
/**
* 根据QueryObject查询分页数据
* @param pageParam 分页参数
* @param qo 查询参数对象
* @return IPage<LoginLogVO> 分页数据
*/
@Override
public PageResult<AccessLogPageVO> queryPage(PageParam pageParam, AccessLogQO qo) {
return baseMapper.queryPage(pageParam, qo);
}
}

View File

@@ -0,0 +1,32 @@
package com.hccake.ballcat.log.service.impl;
import com.hccake.ballcat.log.mapper.LoginLogMapper;
import com.hccake.ballcat.log.model.entity.LoginLog;
import com.hccake.ballcat.log.model.qo.LoginLogQO;
import com.hccake.ballcat.log.model.vo.LoginLogPageVO;
import com.hccake.ballcat.log.service.LoginLogService;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import org.springframework.stereotype.Service;
/**
* 登陆日志
*
* @author hccake 2020-09-16 20:21:10
*/
@Service
public class LoginLogServiceImpl extends ExtendServiceImpl<LoginLogMapper, LoginLog> implements LoginLogService {
/**
* 根据QueryObject查询分页数据
* @param pageParam 分页参数
* @param qo 查询参数对象
* @return PageResult<LoginLogVO> 分页数据
*/
@Override
public PageResult<LoginLogPageVO> queryPage(PageParam pageParam, LoginLogQO qo) {
return baseMapper.queryPage(pageParam, qo);
}
}

View File

@@ -0,0 +1,34 @@
package com.hccake.ballcat.log.service.impl;
import com.hccake.ballcat.log.mapper.OperationLogMapper;
import com.hccake.ballcat.log.model.entity.OperationLog;
import com.hccake.ballcat.log.model.qo.OperationLogQO;
import com.hccake.ballcat.log.model.vo.OperationLogPageVO;
import com.hccake.ballcat.log.service.OperationLogService;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import org.springframework.stereotype.Service;
/**
* 操作日志
*
* @author hccake
* @date 2019-10-15 20:42:32
*/
@Service
public class OperationLogServiceImpl extends ExtendServiceImpl<OperationLogMapper, OperationLog>
implements OperationLogService {
/**
* 根据QueryObject查询分页数据
* @param pageParam 分页参数
* @param qo 查询参数对象
* @return PageResult<LoginLogVO> 分页数据
*/
@Override
public PageResult<OperationLogPageVO> queryPage(PageParam pageParam, OperationLogQO qo) {
return baseMapper.queryPage(pageParam, qo);
}
}

View File

@@ -1,7 +1,7 @@
package com.hccake.ballcat.admin.modules.log.thread;
package com.hccake.ballcat.log.thread;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminAccessLog;
import com.hccake.ballcat.admin.modules.log.service.AdminAccessLogService;
import com.hccake.ballcat.log.model.entity.AccessLog;
import com.hccake.ballcat.log.service.AccessLogService;
import com.hccake.ballcat.common.core.thread.AbstractBlockingQueueThread;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -17,9 +17,9 @@ import java.util.List;
@Slf4j
@Component
@RequiredArgsConstructor
public class AccessLogAdminSaveThread extends AbstractBlockingQueueThread<AdminAccessLog> {
public class AccessLogSaveThread extends AbstractBlockingQueueThread<AccessLog> {
private final AdminAccessLogService adminAccessLogService;
private final AccessLogService accessLogService;
/**
* 线程启动时的日志打印
@@ -35,7 +35,7 @@ public class AccessLogAdminSaveThread extends AbstractBlockingQueueThread<AdminA
* @param list 后台访问日志列表
*/
@Override
public void error(Throwable e, List<AdminAccessLog> list) {
public void error(Throwable e, List<AccessLog> list) {
log.error("后台访问日志记录异常, [msg]:{}, [data]:{}", e.getMessage(), list);
}
@@ -44,8 +44,8 @@ public class AccessLogAdminSaveThread extends AbstractBlockingQueueThread<AdminA
* @param list 后台访问日志列表
*/
@Override
public void process(List<AdminAccessLog> list) throws Exception {
adminAccessLogService.saveBatchSomeColumn(list);
public void process(List<AccessLog> list) throws Exception {
accessLogService.saveBatchSomeColumn(list);
}
}

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ballcat-log</artifactId>
<groupId>com.hccake</groupId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ballcat-log-controller</artifactId>
<dependencies>
<dependency>
<groupId>com.hccake</groupId>
<artifactId>ballcat-log-biz</artifactId>
</dependency>
<dependency>
<groupId>com.hccake</groupId>
<artifactId>ballcat-common-model</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -1,11 +1,11 @@
package com.hccake.ballcat.admin.modules.log.controller;
package com.hccake.ballcat.log.controller;
import com.hccake.ballcat.admin.modules.log.model.qo.AdminAccessLogQO;
import com.hccake.ballcat.admin.modules.log.model.vo.AdminAccessLogPageVO;
import com.hccake.ballcat.admin.modules.log.service.AdminAccessLogService;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.ballcat.common.model.result.R;
import com.hccake.ballcat.log.model.qo.AccessLogQO;
import com.hccake.ballcat.log.model.vo.AccessLogPageVO;
import com.hccake.ballcat.log.service.AccessLogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@@ -22,24 +22,23 @@ import org.springframework.web.bind.annotation.RestController;
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/log/adminaccesslog")
@Api(value = "adminaccesslog", tags = "访问日志管理")
public class AdminAccessLogController {
@RequestMapping("/log/access-log")
@Api(value = "access-log", tags = "访问日志管理")
public class AccessLogController {
private final AdminAccessLogService adminAccessLogService;
private final AccessLogService accessLogService;
/**
* 分页查询
* @param pageParam 分页参数
* @param adminAccessLogQO 访问日志查询对象
* @param accessLogQO 访问日志查询对象
* @return R
*/
@ApiOperation(value = "分页查询", notes = "分页查询")
@GetMapping("/page")
@PreAuthorize("@per.hasPermission('log:adminaccesslog:read')")
public R<PageResult<AdminAccessLogPageVO>> getAccessLogApiPage(PageParam pageParam,
AdminAccessLogQO adminAccessLogQO) {
return R.ok(adminAccessLogService.queryPage(pageParam, adminAccessLogQO));
@PreAuthorize("@per.hasPermission('log:access-log:read')")
public R<PageResult<AccessLogPageVO>> getAccessLogApiPage(PageParam pageParam, AccessLogQO accessLogQO) {
return R.ok(accessLogService.queryPage(pageParam, accessLogQO));
}
}

View File

@@ -1,11 +1,11 @@
package com.hccake.ballcat.admin.modules.log.controller;
package com.hccake.ballcat.log.controller;
import com.hccake.ballcat.admin.modules.log.model.qo.AdminLoginLogQO;
import com.hccake.ballcat.admin.modules.log.model.vo.AdminLoginLogPageVO;
import com.hccake.ballcat.admin.modules.log.service.AdminLoginLogService;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.ballcat.common.model.result.R;
import com.hccake.ballcat.log.model.qo.LoginLogQO;
import com.hccake.ballcat.log.model.vo.LoginLogPageVO;
import com.hccake.ballcat.log.service.LoginLogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@@ -21,23 +21,23 @@ import org.springframework.web.bind.annotation.RestController;
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/log/adminloginlog")
@Api(value = "adminloginlog", tags = "登陆日志管理")
public class AdminLoginLogController {
@RequestMapping("/log/login-log")
@Api(value = "login-log", tags = "登陆日志管理")
public class LoginLogController {
private final AdminLoginLogService adminLoginLogService;
private final LoginLogService loginLogService;
/**
* 分页查询
* @param pageParam 分页参数
* @param adminLoginLogQO 登陆日志查询对象
* @param loginLogQO 登陆日志查询对象
* @return R 通用返回体
*/
@ApiOperation(value = "分页查询", notes = "分页查询")
@GetMapping("/page")
@PreAuthorize("@per.hasPermission('log:adminloginlog:read')")
public R<PageResult<AdminLoginLogPageVO>> getLoginLogPage(PageParam pageParam, AdminLoginLogQO adminLoginLogQO) {
return R.ok(adminLoginLogService.queryPage(pageParam, adminLoginLogQO));
@PreAuthorize("@per.hasPermission('log:login-log:read')")
public R<PageResult<LoginLogPageVO>> getLoginLogPage(PageParam pageParam, LoginLogQO loginLogQO) {
return R.ok(loginLogService.queryPage(pageParam, loginLogQO));
}
}

View File

@@ -0,0 +1,45 @@
package com.hccake.ballcat.log.controller;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.ballcat.common.model.result.R;
import com.hccake.ballcat.log.model.qo.OperationLogQO;
import com.hccake.ballcat.log.model.vo.OperationLogPageVO;
import com.hccake.ballcat.log.service.OperationLogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 操作日志
*
* @author hccake
* @date 2019-10-15 20:42:32
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/log/operation-log")
@Api(value = "operation-log", tags = "操作日志管理")
public class OperationLogController {
private final OperationLogService operationLogService;
/**
* 分页查询
* @param pageParam 分页参数
* @param operationLogQO 操作日志
* @return R
*/
@ApiOperation(value = "分页查询", notes = "分页查询")
@GetMapping("/page")
@PreAuthorize("@per.hasPermission('log:operation-log:read')")
public R<PageResult<OperationLogPageVO>> getOperationLogAdminPage(PageParam pageParam,
OperationLogQO operationLogQO) {
return R.ok(operationLogService.queryPage(pageParam, operationLogQO));
}
}

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ballcat-log</artifactId>
<groupId>com.hccake</groupId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ballcat-log-model</artifactId>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
</dependency>
<dependency>
<groupId>com.hccake</groupId>
<artifactId>ballcat-spring-boot-starter-log</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,25 @@
package com.hccake.ballcat.log.converter;
import com.hccake.ballcat.log.model.entity.AccessLog;
import com.hccake.ballcat.log.model.vo.AccessLogPageVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 访问日志
*
* @author hccake 2021-03-22 20:23:41
*/
@Mapper
public interface AccessLogConverter {
AccessLogConverter INSTANCE = Mappers.getMapper(AccessLogConverter.class);
/**
* PO 转 PageVO
* @param accessLog 访问日志
* @return AdminAccessLogVO 访问日志VO
*/
AccessLogPageVO poToPageVo(AccessLog accessLog);
}

View File

@@ -0,0 +1,25 @@
package com.hccake.ballcat.log.converter;
import com.hccake.ballcat.log.model.entity.LoginLog;
import com.hccake.ballcat.log.model.vo.LoginLogPageVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 登陆日志模型转换器
*
* @author hccake 2021-03-22 20:28:16
*/
@Mapper
public interface LoginLogConverter {
LoginLogConverter INSTANCE = Mappers.getMapper(LoginLogConverter.class);
/**
* PO 转 PageVO
* @param loginLog 登陆日志
* @return AdminLoginLogPageVO 登陆日志PageVO
*/
LoginLogPageVO poToPageVo(LoginLog loginLog);
}

View File

@@ -0,0 +1,33 @@
package com.hccake.ballcat.log.converter;
import com.hccake.ballcat.commom.log.operation.model.OperationLogDTO;
import com.hccake.ballcat.log.model.entity.OperationLog;
import com.hccake.ballcat.log.model.vo.OperationLogPageVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 操作日志模型转换器
*
* @author hccake 2021-03-22 20:32:30
*/
@Mapper
public interface OperationLogConverter {
OperationLogConverter INSTANCE = Mappers.getMapper(OperationLogConverter.class);
/**
* PO 转 PageVO
* @param operationLog 操作日志
* @return AdminOperationLogPageVO 操作日志PageVO
*/
OperationLogPageVO poToPageVo(OperationLog operationLog);
/**
* 转换OperationLog 为 OperationLogAdmin
* @param operationLogDTO 操作日志DTO
* @return AdminOperationLog
*/
OperationLog dtoToPo(OperationLogDTO operationLogDTO);
}

View File

@@ -1,4 +1,4 @@
package com.hccake.ballcat.admin.constants;
package com.hccake.ballcat.log.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;

View File

@@ -1,4 +1,4 @@
package com.hccake.ballcat.admin.modules.log.model.entity;
package com.hccake.ballcat.log.model.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -16,10 +16,10 @@ import java.time.LocalDateTime;
* @date 2019-10-16 16:09:25
*/
@Data
@TableName("admin_access_log")
@TableName("log_access_log")
@Accessors(chain = true)
@ApiModel(value = "后台访问日志")
public class AdminAccessLog {
public class AccessLog {
private static final long serialVersionUID = 1L;

View File

@@ -1,10 +1,10 @@
package com.hccake.ballcat.admin.modules.log.model.entity;
package com.hccake.ballcat.log.model.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.hccake.ballcat.admin.constants.LoginEventTypeEnum;
import com.hccake.ballcat.log.enums.LoginEventTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -19,9 +19,9 @@ import java.time.LocalDateTime;
*/
@Data
@Accessors(chain = true)
@TableName("admin_login_log")
@TableName("log_login_log")
@ApiModel(value = "登陆日志")
public class AdminLoginLog {
public class LoginLog {
private static final long serialVersionUID = 1L;

View File

@@ -1,4 +1,4 @@
package com.hccake.ballcat.admin.modules.log.model.entity;
package com.hccake.ballcat.log.model.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -15,9 +15,9 @@ import java.time.LocalDateTime;
* @date 2019-10-15 20:42:32
*/
@Data
@TableName("admin_operation_log")
@TableName("log_operation_log")
@ApiModel(value = "操作日志")
public class AdminOperationLog {
public class OperationLog {
private static final long serialVersionUID = 1L;

View File

@@ -1,4 +1,4 @@
package com.hccake.ballcat.admin.modules.log.model.qo;
package com.hccake.ballcat.log.model.qo;
import cn.hutool.core.date.DatePattern;
import io.swagger.annotations.ApiModel;
@@ -16,7 +16,7 @@ import java.time.LocalDateTime;
*/
@Data
@ApiModel(value = "后台访问日志查询对象")
public class AdminAccessLogQO {
public class AccessLogQO {
private static final long serialVersionUID = 1L;
@@ -38,12 +38,24 @@ public class AdminAccessLogQO {
@ApiModelProperty(value = "访问IP地址")
private String ip;
/**
* 请求Uri
*/
@ApiModelProperty(value = "请求Uri")
private String uri;
/**
* 请求映射地址
*/
@ApiModelProperty(value = "请求映射地址")
private String matchingPattern;
/**
* 响应状态码
*/
@ApiModelProperty(value = "响应状态码")
private Integer httpStatus;
/**
* 登陆时间区间开始时间
*/

View File

@@ -1,7 +1,7 @@
package com.hccake.ballcat.admin.modules.log.model.qo;
package com.hccake.ballcat.log.model.qo;
import cn.hutool.core.date.DatePattern;
import com.hccake.ballcat.admin.constants.LoginEventTypeEnum;
import com.hccake.ballcat.log.enums.LoginEventTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -16,7 +16,7 @@ import java.time.LocalDateTime;
*/
@Data
@ApiModel(value = "登陆日志查询对象")
public class AdminLoginLogQO {
public class LoginLogQO {
private static final long serialVersionUID = 1L;

View File

@@ -1,4 +1,4 @@
package com.hccake.ballcat.admin.modules.log.model.qo;
package com.hccake.ballcat.log.model.qo;
import cn.hutool.core.date.DatePattern;
import io.swagger.annotations.ApiModel;
@@ -16,7 +16,7 @@ import java.time.LocalDateTime;
*/
@Data
@ApiModel(value = "操作日志查询对象")
public class AdminOperationLogQO {
public class OperationLogQO {
/**
* 追踪ID
@@ -30,6 +30,12 @@ public class AdminOperationLogQO {
@ApiModelProperty(value = "用户ID")
private Integer userId;
/**
* 日志消息
*/
@ApiModelProperty(value = "日志消息")
private String msg;
/**
* 访问IP地址
*/

View File

@@ -1,4 +1,4 @@
package com.hccake.ballcat.admin.modules.log.model.vo;
package com.hccake.ballcat.log.model.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -7,14 +7,14 @@ import lombok.Data;
import java.time.LocalDateTime;
/**
* 后台访问日志展示对象
* 访问日志展示对象
*
* @author hccake
* @date 2019-10-16 16:09:25
*/
@Data
@ApiModel(value = "后台访问日志分页展示对象")
public class AdminAccessLogPageVO {
@ApiModel(value = "访问日志分页展示对象")
public class AccessLogPageVO {
private static final long serialVersionUID = 1L;

View File

@@ -1,6 +1,6 @@
package com.hccake.ballcat.admin.modules.log.model.vo;
package com.hccake.ballcat.log.model.vo;
import com.hccake.ballcat.admin.constants.LoginEventTypeEnum;
import com.hccake.ballcat.log.enums.LoginEventTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -14,7 +14,7 @@ import java.time.LocalDateTime;
*/
@Data
@ApiModel(value = "登陆日志")
public class AdminLoginLogPageVO {
public class LoginLogPageVO {
private static final long serialVersionUID = 1L;

View File

@@ -1,4 +1,4 @@
package com.hccake.ballcat.admin.modules.log.model.vo;
package com.hccake.ballcat.log.model.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -14,7 +14,7 @@ import java.time.LocalDateTime;
*/
@Data
@ApiModel(value = "操作日志视图对象")
public class AdminOperationLogPageVO {
public class OperationLogPageVO {
private static final long serialVersionUID = 1L;

21
ballcat-log/pom.xml Normal file
View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ballcat</artifactId>
<groupId>com.hccake</groupId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ballcat-log</artifactId>
<packaging>pom</packaging>
<modules>
<module>ballcat-log-model</module>
<module>ballcat-log-biz</module>
<module>ballcat-log-controller</module>
</modules>
</project>

View File

@@ -151,4 +151,22 @@ UPDATE `sys_lov` SET `url` = '/system/user/page', update_time = now() WHERE `key
-- 配置表 conf_key 非 null
ALTER TABLE `sys_config`
MODIFY COLUMN `conf_key` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '配置键' AFTER `name`,
MODIFY COLUMN `deleted` bigint(20) NOT NULL COMMENT '逻辑删除标识,未删除为 0已删除为删除时间' AFTER `description`;
MODIFY COLUMN `deleted` bigint(20) NOT NULL COMMENT '逻辑删除标识,未删除为 0已删除为删除时间' AFTER `description`;
-- 日志模块拆分相关修改
UPDATE `sys_menu` SET `path` = 'operation-log' WHERE `id` = 110100;
UPDATE `sys_menu` SET `path` = 'login-log' WHERE `id` = 110200;
UPDATE `sys_menu` SET `path` = 'access-log' WHERE `id` = 110300;
UPDATE `sys_menu` SET `uri` = 'log/operation-log/OperationLogPage' WHERE `id` = 110100;
UPDATE `sys_menu` SET `uri` = 'log/login-log/LoginLogPage' WHERE `id` = 110200;
UPDATE `sys_menu` SET `uri` = 'log/access-log/AccessLogPage' WHERE `id` = 110300;
UPDATE `sys_menu` SET `permission` = 'log:operation-log:read' WHERE `id` = 110100;
UPDATE `sys_menu` SET `permission` = 'log:login-log:read' WHERE `id` = 110200;
UPDATE `sys_menu` SET `permission` = 'log:access-log:read' WHERE `id` = 110300;
UPDATE `sys_menu` SET `title` = '访问日志' WHERE `id` = 110300;
UPDATE `sys_menu` SET `title` = '访问日志查询' WHERE `id` = 110301;
RENAME TABLE `admin_access_log` TO `log_access_log`;
RENAME TABLE `admin_operation_log` TO `log_operation_log`;
RENAME TABLE `admin_login_log` TO `log_login_log`;

View File

@@ -15,6 +15,7 @@
<module>ballcat-system</module>
<module>ballcat-oauth</module>
<module>ballcat-notify</module>
<module>ballcat-log</module>
</modules>
<name>ballcat</name>
<description>项目基本脚手架</description>