Browse Source

系统日志开发

master
luogw 1 month ago
parent
commit
e341f73184
  1. 2
      src/main/java/com/project/operation/annotation/OperationLog.java
  2. 17
      src/main/java/com/project/operation/aop/OperationLogAspect.java
  3. 24
      src/main/java/com/project/operation/domain/enums/ModuleEnum.java
  4. 19
      src/main/java/com/project/operation/domain/service/DescriptionStrategy.java
  5. 27
      src/main/java/com/project/operation/domain/service/impl/description/AppealDescriptionStrategy.java
  6. 22
      src/main/java/com/project/operation/domain/service/impl/description/DataDescriptionStrategy.java
  7. 42
      src/main/java/com/project/operation/domain/service/impl/description/DescriptionManager.java
  8. 66
      src/main/java/com/project/operation/domain/service/impl/description/TaskDescriptionStrategy.java
  9. 4
      src/main/java/com/project/task/application/TaskApplicationService.java
  10. 9
      src/main/java/com/project/task/application/impl/TaskApplicationServiceImpl.java
  11. 10
      src/main/java/com/project/task/controller/TaskController.java
  12. 2
      src/main/java/com/project/task/domain/service/DeleteTaskDomainService.java
  13. 4
      src/main/java/com/project/task/domain/service/SearchTaskDomainService.java
  14. 9
      src/main/java/com/project/task/domain/service/impl/DeleteTaskDomainServiceImpl.java
  15. 8
      src/main/java/com/project/task/domain/service/impl/SearchTaskDomainServiceImpl.java

2
src/main/java/com/project/operation/annotation/OperationLog.java

@ -1,5 +1,7 @@
package com.project.operation.annotation;
import com.project.operation.domain.enums.ModuleEnum;
import java.lang.annotation.*;
/**

17
src/main/java/com/project/operation/aop/OperationLogAspect.java

@ -1,5 +1,6 @@
package com.project.operation.aop;
import cn.hutool.core.util.EnumUtil;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.project.base.domain.result.Result;
import com.project.ding.domain.dto.LoginDTO;
@ -7,6 +8,8 @@ import com.project.ding.utils.JwtUtils;
import com.project.operation.annotation.OperationLog;
import com.project.operation.application.impl.OperationLogApplicationService;
import com.project.operation.domain.dto.OperationLogDTO;
import com.project.operation.domain.enums.ModuleEnum;
import com.project.operation.domain.service.impl.description.DescriptionManager;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -36,6 +39,8 @@ public class OperationLogAspect {
private JwtUtils jwtUtils;
@Autowired
private OperationLogApplicationService operationLogApplicationService;
@Autowired
private DescriptionManager descriptionManager;
private final ThreadLocal<OperationLogDTO> operationLogDTOThreadLocal = new ThreadLocal<>();
@ -73,8 +78,14 @@ public class OperationLogAspect {
//获取操作信息
OperationLog annotation = method.getAnnotation(OperationLog.class);
operationLogDTO.setModule(annotation.module());
operationLogDTO.setAction(annotation.action());
operationLogDTO.setDescription(annotation.description());
ModuleEnum moduleEnum = ModuleEnum.findByValue(annotation.module());
if(moduleEnum != null){
descriptionManager.process(moduleEnum.name(),joinPoint.getArgs(),operationLogDTO,method.getName());
}else{
operationLogDTO.setAction(annotation.action());
operationLogDTO.setDescription(annotation.description());
}
Object businessResult;
@ -103,7 +114,7 @@ public class OperationLogAspect {
}
try {
//获取当前登陆用户
if(operationLogDTO.getMethod().contains("getToken") && result instanceof Result){
if(operationLogDTO.getMethod().contains("login") && result instanceof Result){
LoginDTO data = ((Result<LoginDTO>) result).getData();
String userId = jwtUtils.parseToken(data.getToken()).getSubject();
operationLogDTO.setCreatorId(Long.parseLong(userId));

24
src/main/java/com/project/operation/domain/enums/ModuleEnum.java

@ -0,0 +1,24 @@
package com.project.operation.domain.enums;
import com.project.base.domain.enums.HasValueEnum;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public enum ModuleEnum implements HasValueEnum<String> {
EXAM_TASK("考试任务"),
DATA_MANAGEMENT("资料管理"),
APPEAL_APPROVAL("申诉审批");
private final String value;
public static ModuleEnum findByValue(String value) {
for (ModuleEnum moduleEnum : ModuleEnum.values()) {
if (moduleEnum.getValue().equals(value)) {
return moduleEnum;
}
}
return null;
}
}

19
src/main/java/com/project/operation/domain/service/DescriptionStrategy.java

@ -0,0 +1,19 @@
package com.project.operation.domain.service;
import com.project.operation.domain.dto.OperationLogDTO;
/**
* 日志记录详细信息
*/
public interface DescriptionStrategy {
/**
* 获取并构建详细信息
*/
Boolean process(Object[] args, OperationLogDTO operationLogDTO,String methodName);
/**
* 获取策略名称
* @return 策略名称
*/
String getStrategyName();
}

27
src/main/java/com/project/operation/domain/service/impl/description/AppealDescriptionStrategy.java

@ -0,0 +1,27 @@
package com.project.operation.domain.service.impl.description;
import com.project.operation.domain.dto.OperationLogDTO;
import com.project.operation.domain.enums.ModuleEnum;
import com.project.operation.domain.service.DescriptionStrategy;
import org.springframework.stereotype.Component;
/**
* 申诉审批
*/
@Component
public class AppealDescriptionStrategy implements DescriptionStrategy {
@Override
public Boolean process(Object[] args, OperationLogDTO operationLogDTO,String methodName) {
if (methodName.equals("save")) {
}
return null;
}
@Override
public String getStrategyName() {
return ModuleEnum.APPEAL_APPROVAL.name();
}
}

22
src/main/java/com/project/operation/domain/service/impl/description/DataDescriptionStrategy.java

@ -0,0 +1,22 @@
package com.project.operation.domain.service.impl.description;
import com.project.operation.domain.dto.OperationLogDTO;
import com.project.operation.domain.enums.ModuleEnum;
import com.project.operation.domain.service.DescriptionStrategy;
import org.springframework.stereotype.Component;
/**
* 资料管理
*/
@Component
public class DataDescriptionStrategy implements DescriptionStrategy {
@Override
public Boolean process(Object[] args, OperationLogDTO operationLogDTO,String methodName) {
return null;
}
@Override
public String getStrategyName() {
return ModuleEnum.DATA_MANAGEMENT.name();
}
}

42
src/main/java/com/project/operation/domain/service/impl/description/DescriptionManager.java

@ -0,0 +1,42 @@
package com.project.operation.domain.service.impl.description;
import com.project.operation.domain.dto.OperationLogDTO;
import com.project.operation.domain.service.DescriptionStrategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 日志记录详细信息策略管理器
*/
@Component
@Slf4j
public class DescriptionManager {
private Map<String, DescriptionStrategy> strategyMap = new ConcurrentHashMap<>();
@Autowired
public DescriptionManager(List<DescriptionStrategy> strategyList) {
this.strategyMap = strategyList.stream()
.collect(Collectors.toMap(DescriptionStrategy::getStrategyName, Function.identity()));
}
/**
* 指定使用的策略
*/
public Boolean process(String strategyName, Object[] args, OperationLogDTO operationLogDTO,String methodName) throws Exception {
DescriptionStrategy descriptionStrategy = strategyMap.get(strategyName);
if (descriptionStrategy == null) {
log.error("未找到构建日志详细信息的策略: {}", strategyName);
return false;
}
log.info("使用构建日志详细信息策略: {}", strategyName);
return descriptionStrategy.process(args,operationLogDTO,methodName);
}
}

66
src/main/java/com/project/operation/domain/service/impl/description/TaskDescriptionStrategy.java

@ -0,0 +1,66 @@
package com.project.operation.domain.service.impl.description;
import com.project.operation.domain.dto.OperationLogDTO;
import com.project.operation.domain.enums.ModuleEnum;
import com.project.operation.domain.service.DescriptionStrategy;
import com.project.task.application.TaskApplicationService;
import com.project.task.domain.dto.TaskDTO;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 考试任务
*/
@Component
public class TaskDescriptionStrategy implements DescriptionStrategy {
@Autowired
private TaskApplicationService taskApplicationService;
@Override
public Boolean process(Object[] args, OperationLogDTO operationLogDTO,String methodName) {
if (methodName.equals("save")) {
TaskDTO taskDTO = (TaskDTO) args[0];
//设置操作
if (taskDTO.getId() == null){
operationLogDTO.setAction("创建");
}else {
operationLogDTO.setAction("编辑");
}
//构建操作详细信息
if (StringUtils.isBlank(taskDTO.getName())){
return false;
}
operationLogDTO.setDescription("【"+ taskDTO.getName() +"】");
return true;
}
if (methodName.equals("batchDelete")) {
String taskIds = (String) args[0];
if (StringUtils.isBlank(taskIds)){
return false;
}
List<Long> taskIdList = Arrays.asList(taskIds.split(",")).stream().map(id -> Long.parseLong(id)).collect(Collectors.toList());
List<TaskDTO> taskDTOList = taskApplicationService.selectBatchIds(taskIdList);
if (taskIdList.size() == 1){
operationLogDTO.setAction("删除");
}else{
operationLogDTO.setAction("批量删除");
}
operationLogDTO.setDescription(taskDTOList.stream().map(taskDTO -> "【"+ taskDTO.getName() +"】").collect(Collectors.joining(",")));
}
return true;
}
@Override
public String getStrategyName() {
return ModuleEnum.EXAM_TASK.name();
}
}

4
src/main/java/com/project/task/application/TaskApplicationService.java

@ -10,9 +10,11 @@ import java.util.List;
public interface TaskApplicationService {
Result<TaskDTO> saveOrUpdate(TaskDTO dto) throws Exception;
Result<String> batchDelete(List<Long> idList) throws Exception;
Result<String> batchDelete(String ids) throws Exception;
Result<PageResult<TaskDTO>> search(TaskParam param) throws Exception;
Result<TaskDTO> getDetail(Long id) throws Exception;
List<TaskDTO> selectBatchIds(List<Long> taskIdList);
}

9
src/main/java/com/project/task/application/impl/TaskApplicationServiceImpl.java

@ -32,8 +32,8 @@ public class TaskApplicationServiceImpl implements TaskApplicationService {
@Override
public Result<String> batchDelete(List<Long> idList) throws Exception {
return deleteTaskDomainService.batchDelete(idList);
public Result<String> batchDelete(String ids) throws Exception {
return deleteTaskDomainService.batchDelete(ids);
}
@Override
@ -45,4 +45,9 @@ public class TaskApplicationServiceImpl implements TaskApplicationService {
public Result<TaskDTO> getDetail(Long id) throws Exception {
return searchTaskDomainService.getDetail(id);
}
@Override
public List<TaskDTO> selectBatchIds(List<Long> taskIdList) {
return searchTaskDomainService.selectBatchIds(taskIdList);
}
}

10
src/main/java/com/project/task/controller/TaskController.java

@ -4,15 +4,13 @@ package com.project.task.controller;
import com.project.base.domain.result.PageResult;
import com.project.base.domain.result.Result;
import com.project.operation.annotation.OperationLog;
import com.project.operation.domain.enums.ModuleEnum;
import com.project.task.application.TaskApplicationService;
import com.project.task.domain.dto.TaskDTO;
import com.project.task.domain.param.TaskParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ -43,7 +41,7 @@ public class TaskController {
@PostMapping("/batchDelete")
@OperationLog(module = "考试任务")
public Result<String> batchDelete(List<Long> idList) throws Exception {
return taskApplicationService.batchDelete(idList);
public Result<String> batchDelete(String ids) throws Exception {
return taskApplicationService.batchDelete(ids);
}
}

2
src/main/java/com/project/task/domain/service/DeleteTaskDomainService.java

@ -6,6 +6,6 @@ import java.util.List;
public interface DeleteTaskDomainService {
Result<String> batchDelete(List<Long> idList) throws Exception;
Result<String> batchDelete(String ids) throws Exception;
}

4
src/main/java/com/project/task/domain/service/SearchTaskDomainService.java

@ -5,8 +5,12 @@ import com.project.base.domain.result.Result;
import com.project.task.domain.dto.TaskDTO;
import com.project.task.domain.param.TaskParam;
import java.util.List;
public interface SearchTaskDomainService {
Result<PageResult<TaskDTO>> search(TaskParam param) throws Exception;
Result<TaskDTO> getDetail(Long id) throws Exception;
List<TaskDTO> selectBatchIds(List<Long> taskIdList);
}

9
src/main/java/com/project/task/domain/service/impl/DeleteTaskDomainServiceImpl.java

@ -7,9 +7,11 @@ import com.project.base.domain.result.Result;
import com.project.task.domain.entity.TaskEntity;
import com.project.task.domain.service.DeleteTaskDomainService;
import com.project.task.domain.service.TaskBaseService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@ -18,7 +20,12 @@ public class DeleteTaskDomainServiceImpl implements DeleteTaskDomainService {
@Autowired
private TaskBaseService taskBaseService;
@Override
public Result<String> batchDelete(List<Long> idList) throws Exception {
public Result<String> batchDelete(String ids) throws Exception {
if (StringUtils.isBlank(ids)) {
throw new BusinessErrorException("id不能为空");
}
List<String> idList = Arrays.asList(ids.split(","));
long count = taskBaseService.count(new LambdaQueryWrapper<TaskEntity>()
.in(TaskEntity::getId, idList)
.ge(TaskEntity::getStartTime, DateUtil.beginOfDay(new Date())));

8
src/main/java/com/project/task/domain/service/impl/SearchTaskDomainServiceImpl.java

@ -17,7 +17,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
public class SearchTaskDomainServiceImpl implements SearchTaskDomainService {
@ -62,4 +64,10 @@ public class SearchTaskDomainServiceImpl implements SearchTaskDomainService {
TaskEntity taskEntity = taskMapper.selectById(id);
return Result.success(buildDTO(taskEntity));
}
@Override
public List<TaskDTO> selectBatchIds(List<Long> taskIdList) {
List<TaskEntity> taskEntities = taskMapper.selectBatchIds(taskIdList);
return taskEntities.stream().map(taskEntity -> buildDTO(taskEntity)).collect(Collectors.toList());
}
}

Loading…
Cancel
Save