接口优化

This commit is contained in:
2025-09-08 17:54:12 +08:00
parent e20030f10d
commit d42d689bd7
84 changed files with 6403 additions and 4310 deletions
@@ -1,10 +1,12 @@
package com.emotionmuseum.ai.controller;
import com.emotionmuseum.ai.request.*;
import com.emotionmuseum.ai.response.*;
import com.emotionmuseum.ai.dto.MessageListResponse;
import com.emotionmuseum.ai.dto.GuestChatRequest;
import com.emotionmuseum.ai.dto.GuestChatResponse;
import com.emotionmuseum.ai.dto.GuestUserInfo;
import com.emotionmuseum.ai.dto.MessageListResponse;
import com.emotionmuseum.ai.dto.ConversationListResponse;
import com.emotionmuseum.ai.service.GuestChatService;
import com.emotionmuseum.common.interceptor.UserContextInterceptor;
import com.emotionmuseum.common.result.Result;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -12,31 +14,34 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import jakarta.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.List;
/**
* 访客聊天控制器
*
* 提供访客模式下的聊天功能
*
* @author emotion-museum
* @since 2025-07-13
* @since 2025-07-24
*/
@Slf4j
@RestController
@RequestMapping("/api/ai/guest")
@RequestMapping("/ai/guest")
@RequiredArgsConstructor
@Tag(name = "访客聊天", description = "访客模式AI聊天接口")
@Tag(name = "访客聊天", description = "访客模式下的AI聊天功能")
public class GuestChatController {
private final GuestChatService guestChatService;
private final UserContextInterceptor userContextInterceptor = new UserContextInterceptor();
@PostMapping("/chat")
@Operation(summary = "访客聊天", description = "访客模式下发送消息并获取AI回复")
public Result<com.emotionmuseum.ai.dto.GuestChatResponse> guestChat(
@RequestBody com.emotionmuseum.ai.dto.GuestChatRequest request) {
public Result<GuestChatResponse> guestChat(
@RequestBody GuestChatRequest request) {
// 自动获取客户端IP和User-Agent
String clientIp = getClientIp();
@@ -62,8 +67,8 @@ public class GuestChatController {
return (Result) guestChatService.getGuestConversations(clientIp, pageNum, pageSize);
}
@GetMapping("/conversation/{conversationId}/messages")
@Operation(summary = "获取访客会话消息", description = "获取指定会话的消息列表")
@GetMapping("/messages/{conversationId}")
@Operation(summary = "获取会话消息", description = "获取指定会话的所有消息")
public Result<List<MessageListResponse>> getGuestConversationMessages(
@Parameter(description = "会话ID") @PathVariable String conversationId,
@Parameter(description = "页码") @RequestParam(defaultValue = "1") Integer pageNum,
@@ -72,11 +77,11 @@ public class GuestChatController {
String clientIp = getClientIp();
log.info("获取访客会话消息: IP={}, ConversationId={}", clientIp, conversationId);
return guestChatService.getGuestConversationMessages(conversationId, clientIp, pageNum, pageSize);
return (Result) guestChatService.getGuestConversationMessages(conversationId, clientIp, pageNum, pageSize);
}
@PostMapping("/conversation/{conversationId}/end")
@Operation(summary = "结束访客会话", description = "结束指定的访客会话")
@PostMapping("/end/{conversationId}")
@Operation(summary = "结束会话", description = "结束指定的访客会话")
public Result<Void> endGuestConversation(
@Parameter(description = "会话ID") @PathVariable String conversationId) {
@@ -86,7 +91,7 @@ public class GuestChatController {
return guestChatService.endGuestConversation(conversationId, clientIp);
}
@GetMapping("/user/info")
@GetMapping("/user-info")
@Operation(summary = "获取访客用户信息", description = "根据IP地址获取或创建访客用户信息")
public Result<GuestUserInfo> getGuestUserInfo() {
String clientIp = getClientIp();
@@ -94,38 +99,23 @@ public class GuestChatController {
log.info("获取访客用户信息: IP={}", clientIp);
return guestChatService.getOrCreateGuestUser(clientIp, userAgent);
return guestChatService.getGuestUserInfo(clientIp, userAgent);
}
@PostMapping("/emotion/analyze")
@Operation(summary = "访客情绪分析", description = "分析访客输入文本的情绪")
public Result<com.emotionmuseum.ai.dto.EmotionAnalysisResponse> analyzeGuestEmotion(
@RequestBody com.emotionmuseum.ai.dto.EmotionAnalysisRequest request) {
@PostMapping("/test-split")
@Operation(summary = "测试拆分功能", description = "测试AI回复的拆分功能")
public Result<GuestChatResponse> testSplitFunction(
@RequestBody GuestChatRequest request) {
String clientIp = getClientIp();
log.info("访客情绪分析: IP={}, Text={}", clientIp, request.getText());
log.info("测试拆分功能: Message={}", request.getMessage());
return guestChatService.analyzeGuestEmotion(request, clientIp);
}
@GetMapping("/health")
@Operation(summary = "访客服务健康检查", description = "检查访客聊天服务状态")
public Result<Boolean> healthCheck() {
return Result.success(true);
}
@PostMapping("/test/split")
@Operation(summary = "测试消息拆分功能", description = "测试AI回复消息的拆分功能")
public Result<com.emotionmuseum.ai.dto.GuestChatResponse> testMessageSplit(
@RequestBody com.emotionmuseum.ai.dto.GuestChatRequest request) {
log.info("测试消息拆分功能: message={}", request.getMessage());
// 模拟包含不同换行符的AI回复进行测试
// 根据消息内容生成不同的模拟回复
String mockAiReply;
if (request.getMessage().contains("双换行")) {
mockAiReply = "这是第一段回复,介绍基本功能。我可以帮助你进行日常对话。\n\n" +
"这是第二段回复,详细说明聊天功能。我能理解你的情感并给出合适的回应。\n\n" +
"这是第三段回复,介绍情感分析功能。我可以分析你的情绪状态并提供建议。";
mockAiReply = "这是第一段回复,介绍基本功能。\n\n" +
"这是第二段回复,说明聊天功能。\n\n" +
"这是第三段回复,介绍情感分析\n\n" +
"这是第四段回复,提供使用建议。";
} else if (request.getMessage().contains("单换行")) {
mockAiReply = "这是第一行回复,介绍基本功能。\n" +
"这是第二行回复,说明聊天功能。\n" +
@@ -136,7 +126,7 @@ public class GuestChatController {
}
// 创建模拟的访客聊天响应
com.emotionmuseum.ai.dto.GuestChatResponse response = new com.emotionmuseum.ai.dto.GuestChatResponse();
GuestChatResponse response = new GuestChatResponse();
response.setGuestUserId("test_guest_user");
response.setGuestNickname("测试用户");
response.setConversationId("test_conversation_" + System.currentTimeMillis());
@@ -166,29 +156,7 @@ public class GuestChatController {
}
var request = attributes.getRequest();
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
// 处理多个IP的情况,取第一个
if (ip != null && ip.contains(",")) {
ip = ip.split(",")[0].trim();
}
return ip;
return userContextInterceptor.getClientIpAddress(request);
} catch (Exception e) {
return "127.0.0.1";
}
@@ -211,4 +179,4 @@ public class GuestChatController {
return "Unknown";
}
}
}
}