fix: 重构日志模块

This commit is contained in:
valarchie 2023-07-15 08:16:45 +08:00
parent 2401ec2c62
commit 9859bb1360
22 changed files with 149 additions and 220 deletions

View File

@ -4,10 +4,10 @@ import com.agileboot.common.core.base.BaseController;
import com.agileboot.common.core.dto.ResponseDTO;
import com.agileboot.common.core.page.PageDTO;
import com.agileboot.domain.common.cache.CacheCenter;
import com.agileboot.domain.system.monitor.MonitorApplicationService;
import com.agileboot.domain.system.monitor.dto.OnlineUserInfo;
import com.agileboot.domain.system.monitor.dto.RedisCacheInfoDTO;
import com.agileboot.domain.system.monitor.dto.ServerInfo;
import com.agileboot.domain.monitor.MonitorApplicationService;
import com.agileboot.domain.monitor.dto.OnlineUserInfo;
import com.agileboot.domain.monitor.dto.RedisCacheInfoDTO;
import com.agileboot.domain.monitor.dto.ServerInfo;
import com.agileboot.infrastructure.annotations.AccessLog;
import com.agileboot.orm.common.enums.BusinessTypeEnum;
import io.swagger.v3.oas.annotations.Operation;

View File

@ -1,80 +0,0 @@
package com.agileboot.admin.controller.system;
import com.agileboot.common.core.base.BaseController;
import com.agileboot.common.core.dto.ResponseDTO;
import com.agileboot.common.core.page.PageDTO;
import com.agileboot.common.exception.error.ErrorCode;
import com.agileboot.common.utils.poi.CustomExcelUtil;
import com.agileboot.domain.common.command.BulkOperationCommand;
import com.agileboot.domain.system.logininfo.LoginInfoApplicationService;
import com.agileboot.domain.system.logininfo.dto.LoginInfoDTO;
import com.agileboot.domain.system.logininfo.query.LoginInfoQuery;
import com.agileboot.infrastructure.annotations.AccessLog;
import com.agileboot.orm.common.enums.BusinessTypeEnum;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 系统访问记录
*
* @author valarchie
*/
@Tag(name = "登录日志API", description = "登录日志相关API")
@RestController
@RequestMapping("/loginInfo")
@Validated
@RequiredArgsConstructor
public class SysLoginInfoController extends BaseController {
@NonNull
private LoginInfoApplicationService loginInfoApplicationService;
@Operation(summary = "日志列表")
@PreAuthorize("@permission.has('monitor:logininfor:list')")
@GetMapping("/list")
public ResponseDTO<PageDTO<LoginInfoDTO>> list(LoginInfoQuery query) {
PageDTO<LoginInfoDTO> pageDTO = loginInfoApplicationService.getLoginInfoList(query);
return ResponseDTO.ok(pageDTO);
}
@Operation(summary = "日志列表导出", description = "将登录日志导出到excel")
@AccessLog(title = "登录日志", businessType = BusinessTypeEnum.EXPORT)
@PreAuthorize("@permission.has('monitor:logininfor:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, LoginInfoQuery query) {
PageDTO<LoginInfoDTO> pageDTO = loginInfoApplicationService.getLoginInfoList(query);
CustomExcelUtil.writeToResponse(pageDTO.getRows(), LoginInfoDTO.class, response);
}
@Operation(summary = "删除登录日志")
@PreAuthorize("@permission.has('monitor:logininfor:remove')")
@AccessLog(title = "登录日志", businessType = BusinessTypeEnum.DELETE)
@DeleteMapping("/{infoIds}")
public ResponseDTO<Void> remove(@PathVariable @NotNull @NotEmpty List<Long> infoIds) {
loginInfoApplicationService.deleteLoginInfo(new BulkOperationCommand<>(infoIds));
return ResponseDTO.ok();
}
@Operation(summary = "清空登录日志", description = "暂时不支持")
@PreAuthorize("@permission.has('monitor:logininfor:remove')")
@AccessLog(title = "登录日志", businessType = BusinessTypeEnum.CLEAN)
@DeleteMapping("/clean")
public ResponseDTO<Void> clean() {
return ResponseDTO.fail(ErrorCode.Business.UNSUPPORTED_OPERATION);
}
}

View File

@ -0,0 +1,99 @@
package com.agileboot.admin.controller.system;
import com.agileboot.common.core.base.BaseController;
import com.agileboot.common.core.dto.ResponseDTO;
import com.agileboot.common.core.page.PageDTO;
import com.agileboot.common.utils.poi.CustomExcelUtil;
import com.agileboot.domain.common.command.BulkOperationCommand;
import com.agileboot.domain.system.log.LogApplicationService;
import com.agileboot.domain.system.log.dto.LoginInfoDTO;
import com.agileboot.domain.system.log.query.LoginInfoQuery;
import com.agileboot.domain.system.log.dto.OperationLogDTO;
import com.agileboot.domain.system.log.dto.OperationLogQuery;
import com.agileboot.infrastructure.annotations.AccessLog;
import com.agileboot.orm.common.enums.BusinessTypeEnum;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 系统访问记录
*
* @author valarchie
*/
@Tag(name = "日志API", description = "日志相关API")
@RestController
@RequestMapping("/logs")
@Validated
@RequiredArgsConstructor
public class SysLogsController extends BaseController {
private final LogApplicationService logApplicationService;
@Operation(summary = "登录日志列表")
@PreAuthorize("@permission.has('monitor:logininfor:list')")
@GetMapping("/loginInfos")
public ResponseDTO<PageDTO<LoginInfoDTO>> loginInfoList(LoginInfoQuery query) {
PageDTO<LoginInfoDTO> pageDTO = logApplicationService.getLoginInfoList(query);
return ResponseDTO.ok(pageDTO);
}
@Operation(summary = "登录日志导出", description = "将登录日志导出到excel")
@AccessLog(title = "登录日志", businessType = BusinessTypeEnum.EXPORT)
@PreAuthorize("@permission.has('monitor:logininfor:export')")
@PostMapping("/loginInfos/excel")
public void loginInfosExcel(HttpServletResponse response, LoginInfoQuery query) {
PageDTO<LoginInfoDTO> pageDTO = logApplicationService.getLoginInfoList(query);
CustomExcelUtil.writeToResponse(pageDTO.getRows(), LoginInfoDTO.class, response);
}
@Operation(summary = "删除登录日志")
@PreAuthorize("@permission.has('monitor:logininfor:remove')")
@AccessLog(title = "登录日志", businessType = BusinessTypeEnum.DELETE)
@DeleteMapping("/loginInfos")
public ResponseDTO<Void> removeLoginInfos(@RequestParam @NotNull @NotEmpty List<Long> infoIds) {
logApplicationService.deleteLoginInfo(new BulkOperationCommand<>(infoIds));
return ResponseDTO.ok();
}
@Operation(summary = "操作日志列表")
@PreAuthorize("@permission.has('monitor:operlog:list')")
@GetMapping("/operationLogs")
public ResponseDTO<PageDTO<OperationLogDTO>> operationLogs(OperationLogQuery query) {
PageDTO<OperationLogDTO> pageDTO = logApplicationService.getOperationLogList(query);
return ResponseDTO.ok(pageDTO);
}
@Operation(summary = "操作日志导出")
@AccessLog(title = "操作日志", businessType = BusinessTypeEnum.EXPORT)
@PreAuthorize("@permission.has('monitor:operlog:export')")
@PostMapping("/operationLogs/excel")
public void operationLogsExcel(HttpServletResponse response, OperationLogQuery query) {
PageDTO<OperationLogDTO> pageDTO = logApplicationService.getOperationLogList(query);
CustomExcelUtil.writeToResponse(pageDTO.getRows(), OperationLogDTO.class, response);
}
@Operation(summary = "删除操作日志")
@AccessLog(title = "操作日志", businessType = BusinessTypeEnum.DELETE)
@PreAuthorize("@permission.has('monitor:operlog:remove')")
@DeleteMapping
public ResponseDTO<Void> removeOperationLogs(@RequestParam List<Long> operationIds) {
logApplicationService.deleteOperationLog(new BulkOperationCommand<>(operationIds));
return ResponseDTO.ok();
}
}

View File

@ -1,75 +0,0 @@
package com.agileboot.admin.controller.system;
import com.agileboot.common.core.base.BaseController;
import com.agileboot.common.core.dto.ResponseDTO;
import com.agileboot.common.core.page.PageDTO;
import com.agileboot.common.exception.error.ErrorCode;
import com.agileboot.common.utils.poi.CustomExcelUtil;
import com.agileboot.domain.common.command.BulkOperationCommand;
import com.agileboot.domain.system.operationlog.OperationLogApplicationService;
import com.agileboot.domain.system.operationlog.dto.OperationLogDTO;
import com.agileboot.domain.system.operationlog.query.OperationLogQuery;
import com.agileboot.infrastructure.annotations.AccessLog;
import com.agileboot.orm.common.enums.BusinessTypeEnum;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 操作日志记录
*
* @author valarchie
*/
@Tag(name = "操作日志API", description = "操作日志相关接口")
@RestController
@RequestMapping("/operationLog")
@RequiredArgsConstructor
public class SysOperationLogController extends BaseController {
@NonNull
private OperationLogApplicationService operationLogApplicationService;
@Operation(summary = "操作日志列表")
@PreAuthorize("@permission.has('monitor:operlog:list')")
@GetMapping("/list")
public ResponseDTO<PageDTO<OperationLogDTO>> list(OperationLogQuery query) {
PageDTO<OperationLogDTO> pageDTO = operationLogApplicationService.getOperationLogList(query);
return ResponseDTO.ok(pageDTO);
}
@Operation(summary = "操作日志导出")
@AccessLog(title = "操作日志", businessType = BusinessTypeEnum.EXPORT)
@PreAuthorize("@permission.has('monitor:operlog:export')")
@PostMapping("/export")
public void export(HttpServletResponse response, OperationLogQuery query) {
PageDTO<OperationLogDTO> pageDTO = operationLogApplicationService.getOperationLogList(query);
CustomExcelUtil.writeToResponse(pageDTO.getRows(), OperationLogDTO.class, response);
}
@Operation(summary = "删除操作日志")
@AccessLog(title = "操作日志", businessType = BusinessTypeEnum.DELETE)
@PreAuthorize("@permission.has('monitor:operlog:remove')")
@DeleteMapping("/{operationIds}")
public ResponseDTO<Void> remove(@PathVariable List<Long> operationIds) {
operationLogApplicationService.deleteOperationLog(new BulkOperationCommand<>(operationIds));
return ResponseDTO.ok();
}
@Operation(summary = "清空操作日志", description = "暂未支持")
@AccessLog(title = "操作日志", businessType = BusinessTypeEnum.CLEAN)
@PreAuthorize("@permission.has('monitor:operlog:remove')")
@DeleteMapping("/clean")
public ResponseDTO<Void> clean() {
return ResponseDTO.fail(ErrorCode.Business.UNSUPPORTED_OPERATION);
}
}

View File

@ -1,11 +1,11 @@
package com.agileboot.domain.system.monitor;
package com.agileboot.domain.monitor;
import cn.hutool.core.util.StrUtil;
import com.agileboot.domain.common.cache.CacheCenter;
import com.agileboot.domain.system.monitor.dto.OnlineUserInfo;
import com.agileboot.domain.system.monitor.dto.RedisCacheInfoDTO;
import com.agileboot.domain.system.monitor.dto.RedisCacheInfoDTO.CommonStatusDTO;
import com.agileboot.domain.system.monitor.dto.ServerInfo;
import com.agileboot.domain.monitor.dto.OnlineUserInfo;
import com.agileboot.domain.monitor.dto.RedisCacheInfoDTO;
import com.agileboot.domain.monitor.dto.RedisCacheInfoDTO.CommonStatusDTO;
import com.agileboot.domain.monitor.dto.ServerInfo;
import com.agileboot.infrastructure.cache.RedisUtil;
import com.agileboot.infrastructure.cache.redis.CacheKeyEnum;
import java.util.ArrayList;
@ -31,7 +31,7 @@ import org.springframework.stereotype.Service;
public class MonitorApplicationService {
@NonNull
private RedisTemplate redisTemplate;
private RedisTemplate<?, ?> redisTemplate;
@NonNull
private RedisUtil redisUtil;

View File

@ -1,4 +1,4 @@
package com.agileboot.domain.system.monitor.dto;
package com.agileboot.domain.monitor.dto;
import cn.hutool.core.util.NumberUtil;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.agileboot.domain.system.monitor.dto;
package com.agileboot.domain.monitor.dto;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.agileboot.domain.system.monitor.dto;
package com.agileboot.domain.monitor.dto;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;

View File

@ -1,4 +1,4 @@
package com.agileboot.domain.system.monitor.dto;
package com.agileboot.domain.monitor.dto;
import cn.hutool.core.util.NumberUtil;
import com.agileboot.common.constant.Constants;

View File

@ -1,4 +1,4 @@
package com.agileboot.domain.system.monitor.dto;
package com.agileboot.domain.monitor.dto;
import com.agileboot.domain.common.cache.CacheCenter;
import com.agileboot.infrastructure.web.domain.login.LoginUser;

View File

@ -1,4 +1,4 @@
package com.agileboot.domain.system.monitor.dto;
package com.agileboot.domain.monitor.dto;
import java.util.List;
import java.util.Properties;

View File

@ -1,4 +1,4 @@
package com.agileboot.domain.system.monitor.dto;
package com.agileboot.domain.monitor.dto;
import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.NumberUtil;

View File

@ -1,4 +1,4 @@
package com.agileboot.domain.system.monitor.dto;
package com.agileboot.domain.monitor.dto;
import lombok.Data;

View File

@ -1,11 +1,15 @@
package com.agileboot.domain.system.logininfo;
package com.agileboot.domain.system.log;
import com.agileboot.common.core.page.PageDTO;
import com.agileboot.domain.common.command.BulkOperationCommand;
import com.agileboot.domain.system.logininfo.dto.LoginInfoDTO;
import com.agileboot.domain.system.logininfo.query.LoginInfoQuery;
import com.agileboot.domain.system.log.dto.LoginInfoDTO;
import com.agileboot.domain.system.log.query.LoginInfoQuery;
import com.agileboot.domain.system.log.dto.OperationLogDTO;
import com.agileboot.domain.system.log.dto.OperationLogQuery;
import com.agileboot.orm.system.entity.SysLoginInfoEntity;
import com.agileboot.orm.system.entity.SysOperationLogEntity;
import com.agileboot.orm.system.service.ISysLoginInfoService;
import com.agileboot.orm.system.service.ISysOperationLogService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
@ -19,11 +23,14 @@ import org.springframework.stereotype.Service;
*/
@Service
@RequiredArgsConstructor
public class LoginInfoApplicationService {
public class LogApplicationService {
@NonNull
private ISysLoginInfoService loginInfoService;
@NonNull
private ISysOperationLogService operationLogService;
public PageDTO<LoginInfoDTO> getLoginInfoList(LoginInfoQuery query) {
Page<SysLoginInfoEntity> page = loginInfoService.page(query.toPage(), query.toQueryWrapper());
List<LoginInfoDTO> records = page.getRecords().stream().map(LoginInfoDTO::new).collect(Collectors.toList());
@ -36,4 +43,14 @@ public class LoginInfoApplicationService {
loginInfoService.remove(queryWrapper);
}
public PageDTO<OperationLogDTO> getOperationLogList(OperationLogQuery query) {
Page<SysOperationLogEntity> page = operationLogService.page(query.toPage(), query.toQueryWrapper());
List<OperationLogDTO> records = page.getRecords().stream().map(OperationLogDTO::new).collect(Collectors.toList());
return new PageDTO<>(records, page.getTotal());
}
public void deleteOperationLog(BulkOperationCommand<Long> deleteCommand) {
operationLogService.removeBatchByIds(deleteCommand.getIds());
}
}

View File

@ -1,4 +1,4 @@
package com.agileboot.domain.system.logininfo.dto;
package com.agileboot.domain.system.log.dto;
import com.agileboot.common.annotation.ExcelColumn;
import com.agileboot.common.annotation.ExcelSheet;

View File

@ -1,4 +1,4 @@
package com.agileboot.domain.system.operationlog.dto;
package com.agileboot.domain.system.log.dto;
import cn.hutool.core.bean.BeanUtil;
import com.agileboot.common.annotation.ExcelColumn;

View File

@ -1,4 +1,4 @@
package com.agileboot.domain.system.operationlog.query;
package com.agileboot.domain.system.log.dto;
import cn.hutool.core.util.StrUtil;
import com.agileboot.orm.common.query.AbstractPageQuery;
@ -19,7 +19,6 @@ public class OperationLogQuery extends AbstractPageQuery<SysOperationLogEntity>
private String username;
private String requestModule;
@Override
public QueryWrapper<SysOperationLogEntity> addQueryCondition() {
QueryWrapper<SysOperationLogEntity> queryWrapper = new QueryWrapper<SysOperationLogEntity>()

View File

@ -1,4 +1,4 @@
package com.agileboot.domain.system.logininfo.query;
package com.agileboot.domain.system.log.query;
import cn.hutool.core.util.StrUtil;
import com.agileboot.orm.common.query.AbstractPageQuery;

View File

@ -1,36 +0,0 @@
package com.agileboot.domain.system.operationlog;
import com.agileboot.common.core.page.PageDTO;
import com.agileboot.domain.common.command.BulkOperationCommand;
import com.agileboot.domain.system.operationlog.dto.OperationLogDTO;
import com.agileboot.domain.system.operationlog.query.OperationLogQuery;
import com.agileboot.orm.system.entity.SysOperationLogEntity;
import com.agileboot.orm.system.service.ISysOperationLogService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
import java.util.stream.Collectors;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
/**
* @author valarchie
*/
@Service
@RequiredArgsConstructor
public class OperationLogApplicationService {
@NonNull
private ISysOperationLogService operationLogService;
public PageDTO<OperationLogDTO> getOperationLogList(OperationLogQuery query) {
Page<SysOperationLogEntity> page = operationLogService.page(query.toPage(), query.toQueryWrapper());
List<OperationLogDTO> records = page.getRecords().stream().map(OperationLogDTO::new).collect(Collectors.toList());
return new PageDTO<>(records, page.getTotal());
}
public void deleteOperationLog(BulkOperationCommand<Long> deleteCommand) {
operationLogService.removeBatchByIds(deleteCommand.getIds());
}
}

View File

@ -1,5 +1,6 @@
package com.agileboot.domain.system.monitor.dto;
import com.agileboot.domain.monitor.dto.ServerInfo;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

View File

@ -146,6 +146,7 @@ public class SecurityConfig {
.antMatchers("/swagger-resources/**").anonymous()
.antMatchers("/webjars/**").anonymous()
.antMatchers("/**/api-docs/**" ).anonymous()
.antMatchers("/**/api-docs.yaml" ).anonymous()
.antMatchers("/druid/**").anonymous()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated()

View File

@ -57,9 +57,12 @@ public abstract class AbstractQuery<T> {
}
public void addTimeCondition(QueryWrapper<T> queryWrapper) {
if (queryWrapper != null && StrUtil.isNotEmpty(this.timeRangeColumn)) {
if (queryWrapper != null
&& StrUtil.isNotEmpty(this.timeRangeColumn)
&& beginTime != null && endTime != null) {
queryWrapper
.ge(beginTime != null, StrUtil.toUnderlineCase(timeRangeColumn), DatePickUtil.getBeginOfTheDay(beginTime))
.ge(beginTime != null, StrUtil.toUnderlineCase(timeRangeColumn),
DatePickUtil.getBeginOfTheDay(beginTime))
.le(endTime != null, StrUtil.toUnderlineCase(timeRangeColumn), DatePickUtil.getEndOfTheDay(endTime));
}
}