123
This commit is contained in:
28
ruoyi-cai/src/main/java/com/ruoyi/cai/job/ForbidJob.java
Normal file
28
ruoyi-cai/src/main/java/com/ruoyi/cai/job/ForbidJob.java
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<Long> expireIds = new ArrayList<>();
|
||||
List<Long> expireConsumer = new ArrayList<>();
|
||||
Page<UserForbid> page = new Page<>();
|
||||
page.setSize(100L);
|
||||
long current = 0;
|
||||
while (true){
|
||||
current++;
|
||||
page.setCurrent(current);
|
||||
Page<UserForbid> res = userForbidService.page(page,Wrappers.lambdaQuery(UserForbid.class)
|
||||
.eq(UserForbid::getForbidStatus,1));
|
||||
List<UserForbid> 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 {
|
||||
// 是否已经被封禁
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -4,6 +4,8 @@ import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class CommonDelayDto {
|
||||
// 1- 房间检测 2-黑名单检测
|
||||
private Integer type;
|
||||
private Long roomId;
|
||||
private Long forbidId;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<UserForbidMapper, UserFor
|
||||
private AnchorService anchorService;
|
||||
@Autowired
|
||||
private ForbidCache forbidCache;
|
||||
@Autowired
|
||||
private AmqpProducer amqpProducer;
|
||||
|
||||
@Override
|
||||
public void forbid(UserForbidLog userForbidLog, User user) {
|
||||
@@ -75,6 +79,17 @@ public class UserForbidServiceImpl extends ServiceImpl<UserForbidMapper, UserFor
|
||||
anchorService.update(Wrappers.lambdaUpdate(Anchor.class).eq(Anchor::getId,user.getId()).set(Anchor::getStatus,1));
|
||||
}
|
||||
forbidCache.addForbid(one);
|
||||
try {
|
||||
// 后者 - 前者 < 12小时
|
||||
long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), endTime);
|
||||
CommonDelayDto dto = new CommonDelayDto();
|
||||
dto.setForbidId(one.getId());
|
||||
dto.setType(2);
|
||||
amqpProducer.sendCommonDelayMq(dto,(int)between+2);
|
||||
}catch (Exception e){
|
||||
log.error("延时任务发送失败!");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user