1.添加 rabbitmq

2.在 AI 登录时 创建消息队列
This commit is contained in:
2025-08-27 16:42:53 +08:00
parent 5ea65a8d25
commit 07a4142818
7 changed files with 148 additions and 19 deletions

View File

@@ -11,17 +11,51 @@ import com.yupi.springbootinit.model.enums.LoginSceneEnum;
import com.yupi.springbootinit.model.vo.user.SystemUsersVO;
import com.yupi.springbootinit.service.SystemUsersService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Service
@RequiredArgsConstructor
public class LoginService {
private final SystemUsersService usersService;
@Resource
private RedisTemplate<String,Boolean> redisTemplate;
private final Set<String> created = ConcurrentHashMap.newKeySet();
private final HeadersExchange userHeadersExchange;
@Resource
private RabbitAdmin rabbitAdmin;
public SystemUsersVO login(LoginSceneEnum scene, SystemUsersDTO dto) {
SystemUsers user = validateUser(dto); // 校验用户名、密码、状态、租户过期
checkRole(scene, user.getId()); // 按场景做角色校验
if (scene.equals(LoginSceneEnum.AI_CHAT)) {
redisTemplate.opsForValue().set("ai_login:"+user.getTenantId() ,true);
String queueName = "q.tenant." + user.getTenantId();
if (created.add(String.valueOf(user.getTenantId()))) {
Queue queue = QueueBuilder.durable(queueName).build();
rabbitAdmin.declareQueue(queue);
Map<String, Object> headers = Map.of("tenantId", user.getTenantId(), "x-match", "all");
Binding binding = BindingBuilder
.bind(queue)
.to(userHeadersExchange) // ← 传 Exchange 对象
.whereAll(headers)
.match();
rabbitAdmin.declareBinding(binding);
}
}
Long second = usersService.getTenantExpiredTime(dto.getTenantId());
// Sa-Token 登录
StpUtil.login(user.getId(), scene.getSaMode());
@@ -53,4 +87,12 @@ public class LoginService {
};
if (!pass) throw new BusinessException(ErrorCode.LOGIN_NOW_ALLOWED);
}
public Boolean aiChatLogout(SystemUsersDTO usersDTO) {
Boolean delete = redisTemplate.delete("ai_login:"+usersDTO.getTenantId());
created.remove(String.valueOf(usersDTO.getTenantId()));
log.info("删除租户:{}登录状态:{}",usersDTO.getTenantId(),delete);
StpUtil.logout(usersDTO.getUserId());
return true;
}
}