From aeaaf046d6c77d671edbbb42a64b3c18d5a75bc5 Mon Sep 17 00:00:00 2001 From: zhuangtianxiang <2913129173@qq.com> Date: Thu, 24 Apr 2025 01:30:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(dify):=20=E6=B7=BB=E5=8A=A0=20Dify?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E6=9C=8D=E5=8A=A1=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 DifyServeService 服务类,实现应用列表获取和持久化- 添加 DifyServeMapper 和 DifyServeRepository 接口 - 创建 AppsResponse 实体类,用于存储应用响应数据 - 新增 V1ServeController 控制器,提供应用列表接口 - 在 application-dev.yml 中添加 Dify 服务器配置信息 - 移除不必要的 SseController 和 WebConfig 类 --- .../dify/controller/V1ChatController.java | 3 ++ .../dify/controller/V1ServeController.java | 25 +++++++++++ .../modules/dify/entity/AppsResponse.java | 30 +++++++++++++ .../modules/dify/mapper/DifyServeMapper.java | 12 ++++++ .../dify/repo/DifyServeRepository.java | 8 ++++ .../modules/dify/service/DifyChatService.java | 8 ++++ .../dify/service/DifyServeService.java | 42 +++++++++++++++++++ .../edu/dify/modules/sse/SseController.java | 33 --------------- .../zsc/edu/dify/modules/sse/WebConfig.java | 19 --------- src/main/resources/application-dev.yml | 5 +++ src/main/resources/persistent_logins.sql | 12 ++++++ 11 files changed, 145 insertions(+), 52 deletions(-) create mode 100644 src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ServeController.java create mode 100644 src/main/java/com/zsc/edu/dify/modules/dify/entity/AppsResponse.java create mode 100644 src/main/java/com/zsc/edu/dify/modules/dify/mapper/DifyServeMapper.java create mode 100644 src/main/java/com/zsc/edu/dify/modules/dify/repo/DifyServeRepository.java create mode 100644 src/main/java/com/zsc/edu/dify/modules/dify/service/DifyServeService.java delete mode 100644 src/main/java/com/zsc/edu/dify/modules/sse/SseController.java delete mode 100644 src/main/java/com/zsc/edu/dify/modules/sse/WebConfig.java create mode 100644 src/main/resources/persistent_logins.sql diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ChatController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ChatController.java index 01cd0f1..289473e 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ChatController.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ChatController.java @@ -3,8 +3,10 @@ package com.zsc.edu.dify.modules.dify.controller; import com.zsc.edu.dify.modules.dify.service.DifyChatService; import io.github.guoshiqiufeng.dify.chat.dto.request.ChatMessageSendRequest; import io.github.guoshiqiufeng.dify.chat.dto.request.MessageConversationsRequest; +import io.github.guoshiqiufeng.dify.chat.dto.request.MessageFeedbackRequest; import io.github.guoshiqiufeng.dify.chat.dto.response.ChatMessageSendCompletionResponse; import io.github.guoshiqiufeng.dify.chat.dto.response.MessageConversationsResponse; +import io.github.guoshiqiufeng.dify.chat.dto.response.MessageFeedbackResponse; import io.github.guoshiqiufeng.dify.core.pojo.DifyPageResult; import jakarta.annotation.Resource; import org.springframework.http.MediaType; @@ -44,4 +46,5 @@ public class V1ChatController { return difyChatService.conversations(request); } + } \ No newline at end of file diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ServeController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ServeController.java new file mode 100644 index 0000000..add5cf9 --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ServeController.java @@ -0,0 +1,25 @@ +package com.zsc.edu.dify.modules.dify.controller; + +import com.zsc.edu.dify.modules.dify.service.DifyServeService; +import io.github.guoshiqiufeng.dify.autoconfigure.DifyServerAutoConfiguration; +import io.github.guoshiqiufeng.dify.server.dto.response.AppsResponseVO; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author zhuang + */ +@RestController +@RequestMapping("/v1/serve") +public class V1ServeController { + @Resource + private DifyServeService difyServeService; + @GetMapping("/apps") + public List apps(String mode, String name) { + return difyServeService.apps(mode, name); + } +} diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/entity/AppsResponse.java b/src/main/java/com/zsc/edu/dify/modules/dify/entity/AppsResponse.java new file mode 100644 index 0000000..e47e489 --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/entity/AppsResponse.java @@ -0,0 +1,30 @@ +package com.zsc.edu.dify.modules.dify.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.zsc.edu.dify.framework.json.JsonbTypeHandler; +import io.github.guoshiqiufeng.dify.server.dto.response.AppsResponseVO; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; +import java.util.Map; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@TableName("apps_response") +public class AppsResponse extends AppsResponseVO { + + @TableField(typeHandler = JsonbTypeHandler.class) + public Map workflow; + + @TableField(typeHandler = JsonbTypeHandler.class) + public List tags; + + @TableField(typeHandler = JsonbTypeHandler.class) + public Map modelConfig; +} diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/mapper/DifyServeMapper.java b/src/main/java/com/zsc/edu/dify/modules/dify/mapper/DifyServeMapper.java new file mode 100644 index 0000000..a42aff0 --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/mapper/DifyServeMapper.java @@ -0,0 +1,12 @@ +package com.zsc.edu.dify.modules.dify.mapper; + +import com.zsc.edu.dify.common.mapstruct.BaseMapper; +import com.zsc.edu.dify.modules.dify.entity.AppsResponse; +import io.github.guoshiqiufeng.dify.server.dto.response.AppsResponseVO; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; +import org.mapstruct.ReportingPolicy; + +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface DifyServeMapper extends BaseMapper { +} diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/repo/DifyServeRepository.java b/src/main/java/com/zsc/edu/dify/modules/dify/repo/DifyServeRepository.java new file mode 100644 index 0000000..9258b9c --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/repo/DifyServeRepository.java @@ -0,0 +1,8 @@ +package com.zsc.edu.dify.modules.dify.repo; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zsc.edu.dify.modules.dify.entity.AppsResponse; +import io.github.guoshiqiufeng.dify.server.dto.response.AppsResponseVO; + +public interface DifyServeRepository extends BaseMapper { +} diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/service/DifyChatService.java b/src/main/java/com/zsc/edu/dify/modules/dify/service/DifyChatService.java index 2150824..8340d54 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/service/DifyChatService.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/service/DifyChatService.java @@ -1,16 +1,21 @@ package com.zsc.edu.dify.modules.dify.service; import io.github.guoshiqiufeng.dify.chat.DifyChat; +import io.github.guoshiqiufeng.dify.chat.dto.request.BaseChatRequest; import io.github.guoshiqiufeng.dify.chat.dto.request.ChatMessageSendRequest; import io.github.guoshiqiufeng.dify.chat.dto.request.MessageConversationsRequest; +import io.github.guoshiqiufeng.dify.chat.dto.request.MessageFeedbackRequest; import io.github.guoshiqiufeng.dify.chat.dto.response.ChatMessageSendCompletionResponse; import io.github.guoshiqiufeng.dify.chat.dto.response.MessageConversationsResponse; +import io.github.guoshiqiufeng.dify.chat.dto.response.MessageFeedbackResponse; import io.github.guoshiqiufeng.dify.core.pojo.DifyPageResult; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; +import java.lang.reflect.Field; + /** * @author yanghq * @version 1.0 @@ -25,11 +30,14 @@ public class DifyChatService { public Flux sendChatMessageStream(ChatMessageSendRequest sendRequest) { // 可以进行自定义逻辑处理:参数转换、权限校验等 + (sendRequest).setApiKey("app-mM2UGTE5QVPLCwGvwifnV0g7"); return difyChat.sendChatMessageStream(sendRequest); } public DifyPageResult conversations(MessageConversationsRequest request) { + (request).setApiKey("app-mM2UGTE5QVPLCwGvwifnV0g7"); return difyChat.conversations(request); } + } diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/service/DifyServeService.java b/src/main/java/com/zsc/edu/dify/modules/dify/service/DifyServeService.java new file mode 100644 index 0000000..f84d5c4 --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/service/DifyServeService.java @@ -0,0 +1,42 @@ +package com.zsc.edu.dify.modules.dify.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.zsc.edu.dify.modules.dify.entity.AppsResponse; +import com.zsc.edu.dify.modules.dify.mapper.DifyServeMapper; +import com.zsc.edu.dify.modules.dify.repo.DifyServeRepository; +import io.github.guoshiqiufeng.dify.server.DifyServer; +import io.github.guoshiqiufeng.dify.server.dto.response.AppsResponseVO; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author zhuang + */ +@Slf4j +@Service +public class DifyServeService { + @Resource + DifyServer difyServer; + @Resource + DifyServeRepository difyServeRepository; + @Resource + DifyServeMapper difyServeMapper; + public List apps(String mode, String name) { + return addApps(difyServer.apps(mode, name)); + } + + public List addApps(List apps) { + for(AppsResponseVO app : apps){ + boolean isHave = difyServeRepository.exists(new LambdaQueryWrapper().eq(AppsResponse::getId, app.getId())); + if(isHave){ + difyServeRepository.updateById(difyServeMapper.toEntity(app)); + }else { + difyServeRepository.insert(difyServeMapper.toEntity(app)); + } + } + return apps; + } +} diff --git a/src/main/java/com/zsc/edu/dify/modules/sse/SseController.java b/src/main/java/com/zsc/edu/dify/modules/sse/SseController.java deleted file mode 100644 index 9b6e626..0000000 --- a/src/main/java/com/zsc/edu/dify/modules/sse/SseController.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.zsc.edu.dify.modules.sse; - -import lombok.AllArgsConstructor; -import org.springframework.http.MediaType; -import org.springframework.http.codec.ServerSentEvent; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Sinks; -import reactor.util.concurrent.Queues; - -import java.time.Duration; - -@AllArgsConstructor -@RestController -@RequestMapping("/api/rest/sse") -public class SseController { - - private final Sinks.Many> sink = Sinks.many().multicast().onBackpressureBuffer(Queues.SMALL_BUFFER_SIZE); - - @GetMapping(value = "/send", produces = MediaType.TEXT_EVENT_STREAM_VALUE) - public Flux> sendSse() { - return sink.asFlux() - .doOnSubscribe(subscription -> { - // 模拟发送事件 - sink.tryEmitNext(ServerSentEvent.builder("Hello, SSE!").build()); - sink.tryEmitNext(ServerSentEvent.builder("This is a Server-Sent Event.").build()); - sink.tryEmitNext(ServerSentEvent.builder("SSE is working.").build()); - }) - .delayElements(Duration.ofSeconds(1)); - } -} diff --git a/src/main/java/com/zsc/edu/dify/modules/sse/WebConfig.java b/src/main/java/com/zsc/edu/dify/modules/sse/WebConfig.java deleted file mode 100644 index 91a0b7e..0000000 --- a/src/main/java/com/zsc/edu/dify/modules/sse/WebConfig.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.zsc.edu.dify.modules.sse; - -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -public class WebConfig implements WebMvcConfigurer { - - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/api/rest/sse/**") - .allowedOrigins("http://localhost:8081") - .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") - .allowedHeaders("*") - .allowCredentials(true) - .maxAge(3600); - } -} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 3aa7cca..b3607de 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -57,3 +57,8 @@ storage: jwt: secret: your_secret_key_here expiration: 3600 + +dify: + server: + email: 2913129173@qq.com + password: tian14384, diff --git a/src/main/resources/persistent_logins.sql b/src/main/resources/persistent_logins.sql new file mode 100644 index 0000000..b7fdff7 --- /dev/null +++ b/src/main/resources/persistent_logins.sql @@ -0,0 +1,12 @@ +create table persistent_logins +( + username varchar(64) not null, + series varchar(64) not null + primary key, + token varchar(64) not null, + last_used timestamp not null +); + +alter table persistent_logins + owner to gitea; +