From f759a2e45f5d1e7bd8a502dda03d3dcbc2106944 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=89=AF=28004796=29?= Date: Fri, 19 Jan 2024 19:11:18 +0800 Subject: [PATCH] 123 --- .../java/com/ruoyi/cai/job/ForbidJob.java | 28 ++++++++ .../ruoyi/cai/manager/UserForbidManager.java | 64 ++++++++++++++++++- .../java/com/ruoyi/cai/mq/AmqpProducer.java | 10 +++ .../java/com/ruoyi/cai/mq/CommonDelayDto.java | 2 + .../mq/consumer/CommonDelayMqConsumer.java | 6 +- .../service/impl/UserForbidServiceImpl.java | 17 ++++- 6 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/job/ForbidJob.java diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/job/ForbidJob.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/job/ForbidJob.java new file mode 100644 index 00000000..504cad1d --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/job/ForbidJob.java @@ -0,0 +1,28 @@ +package com.ruoyi.cai.job; + +import com.ruoyi.cai.manager.UserForbidManager; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class ForbidJob { + + @Autowired + private UserForbidManager userForbidManager; + + /** + * 每12小时执行一次 + */ + @Scheduled(cron = "0 0 11,23 * * ? ") + public void checkForbid(){ + try { + userForbidManager.checkAll(); + }catch (Exception e){ + log.error("黑名单失效检测失败!",e); + } + } + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/UserForbidManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/UserForbidManager.java index 827da8eb..7b14302d 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/UserForbidManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/UserForbidManager.java @@ -2,12 +2,14 @@ package com.ruoyi.cai.manager; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.rabbitmq.client.LongString; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.cai.domain.*; import com.ruoyi.cai.dto.admin.UserForbidDTO; import com.ruoyi.cai.dto.admin.query.UserForbidReq; import com.ruoyi.cai.enums.ForbidTimeEnum; import com.ruoyi.cai.enums.ForbidTypeEnum; +import com.ruoyi.cai.mq.AmqpProducer; +import com.ruoyi.cai.mq.CommonDelayDto; import com.ruoyi.cai.service.*; import com.ruoyi.common.utils.StringUtils; import lombok.Data; @@ -17,6 +19,9 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; import java.util.List; @Component @@ -159,6 +164,63 @@ public class UserForbidManager { forbidCache.unForbid(type,member); } + public void checkAll(){ + List expireIds = new ArrayList<>(); + List expireConsumer = new ArrayList<>(); + Page page = new Page<>(); + page.setSize(100L); + long current = 0; + while (true){ + current++; + page.setCurrent(current); + Page res = userForbidService.page(page,Wrappers.lambdaQuery(UserForbid.class) + .eq(UserForbid::getForbidStatus,1)); + List records = res.getRecords(); + if(records.isEmpty()){ + break; + } + for (UserForbid record : records) { + if(record.getEndTime().isAfter(LocalDateTime.now())){ + expireIds.add(record.getId()); + }else if(record.getEndTime().plusHours(12).isAfter(LocalDateTime.now())){ // 还有12小时过期 + expireConsumer.add(record.getId()); + } + } + } + for (Long expireId : expireIds) { + checkExpire(expireId); + } + for (Long expireId : expireConsumer) { + UserForbid userForbid = userForbidService.getById(expireId); + if(userForbid == null || userForbid.getForbidStatus() == 2){ + return; + } + // 后者 - 前者 < 12小时 + long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), userForbid.getEndTime()); + if(between > 0 && between < 60*60*12){ + CommonDelayDto dto = new CommonDelayDto(); + dto.setForbidId(expireId); + dto.setType(2); + amqpProducer.sendCommonDelayMq(dto,(int)between+5); + } + } + } + + @Autowired + private AmqpProducer amqpProducer; + + public void checkExpire(Long id){ + UserForbid userForbid = userForbidService.getById(id); + if(userForbid == null || userForbid.getForbidStatus() == 2){ + return; + } + if(!userForbid.getEndTime().isAfter(LocalDateTime.now())){ + return; + } + this.unForbidByForbidId(id); + + } + @Data public static class CheckForbid implements Serializable { // 是否已经被封禁 diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/AmqpProducer.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/AmqpProducer.java index 8d757954..0a6e1556 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/AmqpProducer.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/AmqpProducer.java @@ -25,6 +25,16 @@ public class AmqpProducer { }); } + public void sendCommonDelayMq(CommonDelayDto dto,Integer timeout){ + rabbitTemplate.convertAndSend(CommonDelayMqConfig.EXCHANGE_NAME, + CommonDelayMqConfig.ROUTING_KEY, + JSON.toJSONString(dto), + messagePostProcessor -> { + messagePostProcessor.getMessageProperties().setDelay(timeout*1000); // 设置延迟时间,单位毫秒 + return messagePostProcessor; + }); + } + public void sendCommonDelayMq(Integer type,Long roomId,Integer timeout){ CommonDelayDto dto = new CommonDelayDto(); dto.setType(type); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/CommonDelayDto.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/CommonDelayDto.java index c7061b4d..06bce1d8 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/CommonDelayDto.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/CommonDelayDto.java @@ -4,6 +4,8 @@ import lombok.Data; @Data public class CommonDelayDto { + // 1- 房间检测 2-黑名单检测 private Integer type; private Long roomId; + private Long forbidId; } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/consumer/CommonDelayMqConsumer.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/consumer/CommonDelayMqConsumer.java index fed64ff4..9697778b 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/consumer/CommonDelayMqConsumer.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/consumer/CommonDelayMqConsumer.java @@ -1,6 +1,7 @@ package com.ruoyi.cai.mq.consumer; import com.alibaba.fastjson2.JSON; +import com.ruoyi.cai.manager.UserForbidManager; import com.ruoyi.cai.mq.AmqpProducer; import com.ruoyi.cai.mq.CommonDelayDto; import com.ruoyi.cai.mq.CommonDelayMqConfig; @@ -16,7 +17,7 @@ public class CommonDelayMqConsumer { @Autowired private CheckTimeOutJob checkTimeOutJob; @Autowired - private AmqpProducer amqpProducer; + private UserForbidManager userForbidManager; @RabbitListener(queues = CommonDelayMqConfig.QUEUE_NAME ,containerFactory = "customContainerFactory") @@ -27,6 +28,9 @@ public class CommonDelayMqConsumer { case 1: checkTimeOutJob.deal(dto.getRoomId()); break; + case 2: + userForbidManager.checkAll(); + break; default: break; } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserForbidServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserForbidServiceImpl.java index 09046307..2e10e313 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserForbidServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/UserForbidServiceImpl.java @@ -8,12 +8,13 @@ import com.ruoyi.cai.domain.Anchor; import com.ruoyi.cai.domain.User; import com.ruoyi.cai.domain.UserForbid; import com.ruoyi.cai.domain.UserForbidLog; -import com.ruoyi.cai.dto.admin.query.UserForbidReq; import com.ruoyi.cai.dto.admin.vo.UserForbidAdminVo; import com.ruoyi.cai.enums.ForbidTimeEnum; import com.ruoyi.cai.enums.ForbidTypeEnum; import com.ruoyi.cai.manager.ForbidCache; import com.ruoyi.cai.mapper.UserForbidMapper; +import com.ruoyi.cai.mq.AmqpProducer; +import com.ruoyi.cai.mq.CommonDelayDto; import com.ruoyi.cai.service.AnchorService; import com.ruoyi.cai.service.UserForbidService; import com.ruoyi.cai.service.UserService; @@ -23,6 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; /** * 封号列表Service业务层处理 @@ -40,6 +42,8 @@ public class UserForbidServiceImpl extends ServiceImpl