diff --git a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java index f026d9fc..eefad390 100644 --- a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java +++ b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java @@ -8,17 +8,12 @@ import com.ai.da.common.utils.LocalCacheUtils; import com.ai.da.common.utils.MultiReadHttpServletRequest; import com.ai.da.common.utils.MultiReadHttpServletResponse; import com.ai.da.model.vo.AuthPrincipalVo; -import lombok.AllArgsConstructor; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Required; import org.springframework.context.annotation.Configuration; import org.springframework.lang.NonNull; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.util.StopWatch; import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.filter.OncePerRequestFilter; import javax.annotation.Resource; @@ -28,7 +23,6 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.sql.Statement; import java.util.Arrays; import java.util.List; @@ -50,7 +44,8 @@ public class AuthenticationFilter extends OncePerRequestFilter { Arrays.asList("/favicon.ico","/doc.html","api/account/login","api/account/preLogin","api/account/sendEmail", "/webjars/","/swagger-resources","/v2/api-docs","api/account/resetPwd", "/api/python/saveGeneratePicture", "/api/python/getLibraryByUserId", - "/api/third/party/addUser","/api/third/party/editUser","/api/element/initDefaultSysFile"); + "/api/third/party/addUser","/api/third/party/editUser","/api/element/initDefaultSysFile", + "/api/python/chatStream","/api/python/flush"); @Override protected void doFilterInternal(HttpServletRequest httpServletRequest, @NonNull HttpServletResponse httpServletResponse, @NonNull FilterChain filterChain) throws ServletException, IOException { diff --git a/src/main/java/com/ai/da/controller/PythonController.java b/src/main/java/com/ai/da/controller/PythonController.java index f9dbd0f4..7a9a0ea3 100644 --- a/src/main/java/com/ai/da/controller/PythonController.java +++ b/src/main/java/com/ai/da/controller/PythonController.java @@ -3,23 +3,23 @@ package com.ai.da.controller; import com.ai.da.common.enums.CollectionLevel1TypeEnum; import com.ai.da.common.response.Response; import com.ai.da.common.utils.CopyUtil; -import com.ai.da.common.utils.MD5Utils; -import com.ai.da.model.dto.CollectionDeleteFileDTO; -import com.ai.da.model.dto.CollectionElementUploadDTO; -import com.ai.da.model.dto.CollectionGeneratePrintDTO; -import com.ai.da.model.dto.CollectionSavePrintDTO; -import com.ai.da.model.vo.*; +import com.ai.da.model.dto.ChatFlushDTO; +import com.ai.da.model.dto.ChatSendDTO; +import com.ai.da.model.vo.PythonLibraryVo; +import com.ai.da.model.vo.SysFileVO; import com.ai.da.python.PythonService; -import com.ai.da.service.*; +import com.ai.da.service.ChatRobotService; +import com.ai.da.service.LibraryService; +import com.ai.da.service.SysFileService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import javax.annotation.Resource; -import javax.validation.Valid; import java.util.Collections; import java.util.List; import java.util.Map; @@ -39,13 +39,16 @@ public class PythonController { @Resource private LibraryService libraryService; + @Resource + private ChatRobotService chatRobotService; + @ApiOperation(value = "python服务保存图片到java服务") @PostMapping("/saveGeneratePicture") public Response upload(@RequestParam("file") MultipartFile file, - @ApiParam("操作类型 generatePrint ->生成印花 " + - "designCollection ->设计collection generateAdvancedDesign ->生成高级design") - @RequestParam(value = "operateType") String operateType) { - return Response.success(pythonService.upload(file,operateType)); + @ApiParam("操作类型 generatePrint ->生成印花 " + + "designCollection ->设计collection generateAdvancedDesign ->生成高级design") + @RequestParam(value = "operateType") String operateType) { + return Response.success(pythonService.upload(file, operateType)); } @ApiOperation(value = "通过文件类型获取系统文件") @@ -56,12 +59,25 @@ public class PythonController { @ApiOperation(value = "通过用户id获取library") @GetMapping("/getLibraryByUserId") - public Response>> getLibraryByUserId(@RequestParam(value = "userId") Long userId) { + public Response>> getLibraryByUserId(@RequestParam(value = "userId") Long userId) { List response = CopyUtil.copyList(libraryService.selectByAccountIdAnd1TypeList(userId, - Collections.singletonList(CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName())),PythonLibraryVo.class); + Collections.singletonList(CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName())), PythonLibraryVo.class); //key转小写 统一 - return Response.success(response.stream().collect(Collectors.groupingBy(v ->v.getLevel2Type().toLowerCase(), - Collectors.mapping(PythonLibraryVo::getUrl,Collectors.toList())))); + return Response.success(response.stream().collect(Collectors.groupingBy(v -> v.getLevel2Type().toLowerCase(), + Collectors.mapping(PythonLibraryVo::getUrl, Collectors.toList())))); + } + + @ApiOperation(value = "发送用户输入消息") + @PostMapping("/chatStream") + public SseEmitter MessageToPythonChatStream(@RequestBody ChatSendDTO chatSendDTO) { + log.info(chatSendDTO.toString()); + return chatRobotService.sendMessageToChatRobot(chatSendDTO); + } + + @ApiOperation(value = "刷新会话缓存") + @PostMapping("/flush") + public Response ChatBufferFlush(@RequestBody ChatFlushDTO chatFlushDTO) { + return Response.success(chatRobotService.chatBufferFlush(chatFlushDTO)); } } diff --git a/src/main/java/com/ai/da/model/dto/ChatFlushDTO.java b/src/main/java/com/ai/da/model/dto/ChatFlushDTO.java new file mode 100644 index 00000000..8f331480 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/ChatFlushDTO.java @@ -0,0 +1,27 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author aida + * @version 1.0 + * @project aida_back + * @description 刷新缓存DTO + * @date 2023/7/25 16:51:16 + */ + +@Data +public class ChatFlushDTO { + @NotNull(message = "userId cannot be empty!") + @ApiModelProperty("用户id") + private String user_id; + + @NotBlank(message = "sessionId cannot be empty!") + @ApiModelProperty("会话ID") + private String session_id; + +} diff --git a/src/main/java/com/ai/da/model/dto/ChatSendDTO.java b/src/main/java/com/ai/da/model/dto/ChatSendDTO.java new file mode 100644 index 00000000..b50f5a0c --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/ChatSendDTO.java @@ -0,0 +1,34 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author aida + * @version 1.0 + * @project aida_back + * @description 机器人对话DTO + * @date 2023/7/25 16:35:55 + */ + +@Data +@ApiModel("chatRobot 对话") +public class ChatSendDTO { + + @NotNull(message = "userId cannot be empty!") + @ApiModelProperty("用户id") + private String user_id; + + @NotBlank(message = "sessionId cannot be empty!") + @ApiModelProperty("会话ID") + private String session_id; + + @NotBlank(message = "Please input the message !") + @ApiModelProperty("消息") + private String message; + +} diff --git a/src/main/java/com/ai/da/service/ChatRobotService.java b/src/main/java/com/ai/da/service/ChatRobotService.java new file mode 100644 index 00000000..93dacb9a --- /dev/null +++ b/src/main/java/com/ai/da/service/ChatRobotService.java @@ -0,0 +1,18 @@ +package com.ai.da.service; + +import com.ai.da.model.dto.ChatFlushDTO; +import com.ai.da.model.dto.ChatSendDTO; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +/** + * @author aida + * @version 1.0 + * @project aida_back + * @description 对话机器人服务接口 + * @date 2023/7/25 16:42:18 + */ +public interface ChatRobotService { + SseEmitter sendMessageToChatRobot(ChatSendDTO chatSendDTO); + + String chatBufferFlush(ChatFlushDTO chatFlushDTO); +} diff --git a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java new file mode 100644 index 00000000..bef77381 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java @@ -0,0 +1,96 @@ + + + +package com.ai.da.service.impl; + +import com.ai.da.model.dto.ChatFlushDTO; +import com.ai.da.model.dto.ChatSendDTO; +import com.ai.da.service.ChatRobotService; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * @author aida + * @version 1.0 + * @project ChatRobot + * @description 请求python Chat Stream 接口服务实现类 + * @date 2023/7/10 10:41:45 + */ +@Slf4j +@Service +public class ChatRobotServiceImpl implements ChatRobotService { + + // @Value("") + String chatStreamUrl = "http://127.0.0.1:6789/api/chat_stream"; + String chatBufferFlushUrl = "http://127.0.0.1:6789/api/chat_flush"; + + RestTemplate restTemplate = new RestTemplate(); + + + Gson gson = new GsonBuilder().create(); + private final ExecutorService executorService = Executors.newSingleThreadExecutor(); + Integer timeout = 9999999; + + @Override + public SseEmitter sendMessageToChatRobot(ChatSendDTO chatSendDTO) { + SseEmitter emitter = new SseEmitter(); + String requestBody = gson.toJson(chatSendDTO); + executorService.execute(() -> { + try { + // 这里根据你的业务逻辑,从服务获取数据 + // 示例:从服务获取数据并逐条发送给客户端 + URL urlObj = new URL(chatStreamUrl); + HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection(); + connection.setConnectTimeout(timeout); + connection.setReadTimeout(timeout); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setDoOutput(true); + + OutputStream outputStream = connection.getOutputStream(); + outputStream.write(requestBody.getBytes()); + outputStream.flush(); + outputStream.close(); + + int responseCode = connection.getResponseCode(); + + if (responseCode == HttpURLConnection.HTTP_OK) { + BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + log.info(line); + emitter.send(line); + } + reader.close(); + } else { + System.out.println("Request failed with status code: " + responseCode); + } + + connection.disconnect(); + emitter.complete(); + } catch (Exception e) { + emitter.completeWithError(e); + } + }); + return emitter; + } + + @Override + public String chatBufferFlush(ChatFlushDTO chatFlushDTO) { + log.info(chatBufferFlushUrl); + return String.valueOf(restTemplate.postForEntity(chatBufferFlushUrl, chatFlushDTO, String.class)); + } + +} diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 3292f56f..a49d4252 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -3,8 +3,8 @@ server.port=5567 #datasource spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://18.167.251.121:33006/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true -spring.datasource.username=nacos -spring.datasource.password=nacos +spring.datasource.username=root +spring.datasource.password=root #security spring.security.jwtSecret=JWTSECRET diff --git a/target/classes/application-test.properties b/target/classes/application-test.properties index 3292f56f..a49d4252 100644 --- a/target/classes/application-test.properties +++ b/target/classes/application-test.properties @@ -3,8 +3,8 @@ server.port=5567 #datasource spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://18.167.251.121:33006/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true -spring.datasource.username=nacos -spring.datasource.password=nacos +spring.datasource.username=root +spring.datasource.password=root #security spring.security.jwtSecret=JWTSECRET diff --git a/target/classes/com/ai/da/common/security/filter/AuthenticationFilter.class b/target/classes/com/ai/da/common/security/filter/AuthenticationFilter.class index cbaf17ac..c7f70b32 100644 Binary files a/target/classes/com/ai/da/common/security/filter/AuthenticationFilter.class and b/target/classes/com/ai/da/common/security/filter/AuthenticationFilter.class differ diff --git a/target/classes/com/ai/da/controller/PythonController.class b/target/classes/com/ai/da/controller/PythonController.class index da03c859..534ea363 100644 Binary files a/target/classes/com/ai/da/controller/PythonController.class and b/target/classes/com/ai/da/controller/PythonController.class differ