From ba03edbc0055a05af5e37f2ad36996e61f5934b7 Mon Sep 17 00:00:00 2001 From: zhuangtianxiang <2913129173@qq.com> Date: Tue, 22 Apr 2025 20:33:42 +0800 Subject: [PATCH] =?UTF-8?q?refactor(menu):=20=E7=A7=BB=E9=99=A4=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E7=9B=B8=E5=85=B3=E7=9A=84=E6=97=A0=E7=94=A8=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=B9=B6=E6=B7=BB=E5=8A=A0=20SSE=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除了 MenuServiceImplTest 中与 IoT 相关的菜单和操作 - 在V1ChatController 中添加了 Flux相关的导入 - 新增 SseController 类实现 Server-Sent Events 功能 - 添加 WebConfig 配置类以支持 SSE相关的跨域请求 --- .../dify/controller/V1ChatController.java | 3 ++ .../edu/dify/modules/sse/SseController.java | 33 +++++++++++++++++++ .../zsc/edu/dify/modules/sse/WebConfig.java | 19 +++++++++++ src/main/resources/dify.sql | 0 .../service/impl/MenuServiceImplTest.java | 33 ++----------------- 5 files changed, 57 insertions(+), 31 deletions(-) create mode 100644 src/main/java/com/zsc/edu/dify/modules/sse/SseController.java create mode 100644 src/main/java/com/zsc/edu/dify/modules/sse/WebConfig.java create mode 100644 src/main/resources/dify.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 2e431a5..01cd0f1 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 @@ -11,6 +11,9 @@ import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Flux; +import java.time.Duration; +import java.util.stream.Stream; + /** * @author yanghq * @version 1.0 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 new file mode 100644 index 0000000..9b6e626 --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/sse/SseController.java @@ -0,0 +1,33 @@ +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 new file mode 100644 index 0000000..91a0b7e --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/sse/WebConfig.java @@ -0,0 +1,19 @@ +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/dify.sql b/src/main/resources/dify.sql new file mode 100644 index 0000000..e69de29 diff --git a/src/test/java/com/zsc/edu/dify/modules/system/service/impl/MenuServiceImplTest.java b/src/test/java/com/zsc/edu/dify/modules/system/service/impl/MenuServiceImplTest.java index 50946cd..b113b52 100644 --- a/src/test/java/com/zsc/edu/dify/modules/system/service/impl/MenuServiceImplTest.java +++ b/src/test/java/com/zsc/edu/dify/modules/system/service/impl/MenuServiceImplTest.java @@ -31,9 +31,8 @@ class MenuServiceImplTest { Menu system = new Menu(null, Menu.Type.PAGE, "System", "/system", "menu.system", "icon-computer", true, false, 2, "system", ""); Menu user = new Menu(null, Menu.Type.PAGE, "User", "/user", "menu.user", "icon-user", true, false, 3, "user", ""); Menu message = new Menu(null, Menu.Type.PAGE, "Message", "/message", "消息管理", "icon-message", true, false, 4, "message", ""); - Menu iot = new Menu(null, Menu.Type.PAGE, "Iot", "/iot", "物联网管理", "icon-iot", true, false, 5, "iot", ""); Menu operationLog = new Menu(null, Menu.Type.PAGE, "OperationLog", "/operationLog", "操作日志", "icon-log", true, false, 6, "operationLog", ""); - menuService.saveBatch(List.of(dashboard, system, user, message, iot, operationLog)); + menuService.saveBatch(List.of(dashboard, system, user, message, operationLog)); Menu workplace = new Menu(dashboard.getId(), Menu.Type.PAGE, "Workplace", "workplace", "工作台", "icon-dashboard", true, false, 1, "dashboard:workplace", ""); Menu role = new Menu(system.getId(), Menu.Type.PAGE, "Role", "role", "角色管理", null, true, false, 1, "system:role", ""); Menu dept = new Menu(system.getId(), Menu.Type.PAGE, "Dept", "dept", "部门管理", null, true, false, 2, "system:dept", ""); @@ -42,11 +41,8 @@ class MenuServiceImplTest { Menu menu = new Menu(system.getId(), Menu.Type.PAGE, "Menu", "menu", "菜单管理", null, true, false, 5, "system:menu", ""); Menu notice = new Menu(message.getId(), Menu.Type.PAGE, "Notice", "notice", "通知管理", null, true, false, 1, "message:notice", ""); Menu bulletin = new Menu(message.getId(), Menu.Type.PAGE, "Bulletin", "bulletin", "公告管理", null, true, false, 2, "message:bulletin", ""); - Menu device = new Menu(iot.getId(), Menu.Type.PAGE, "Device", "device", "设备管理", null, true, false, 1, "iot:device", ""); - Menu product = new Menu(iot.getId(), Menu.Type.PAGE, "Product", "product", "产品管理", null, true, false, 2, "iot:product", ""); - Menu tsl = new Menu(product.getId(), Menu.Type.PAGE, "Tsl", "tsl", "物模型管理", null, true, true, 3, "iot:tsl", ""); Menu log = new Menu(operationLog.getId(), Menu.Type.PAGE, "OperationLog", "operationLog", "操作日志", null, true, false, 1, "operationLog", ""); - menuService.saveBatch(List.of(workplace, dept, users, authority, menu, notice, bulletin, device, product, tsl, role, log)); + menuService.saveBatch(List.of(workplace, dept, users, authority, menu, notice, bulletin, role, log)); Menu roleCreate = new Menu(role.getId(), Menu.Type.OPERATION, "roleCreate", null, "角色新增", null, true, false, 1, "system:role:create", ""); Menu roleDelete = new Menu(role.getId(), Menu.Type.OPERATION, "roleDelete", null, "角色删除", null, true, false, 1, "system:role:delete", ""); Menu roleUpdate = new Menu(role.getId(), Menu.Type.OPERATION, "roleUpdate", null, "角色修改", null, true, false, 1, "system:role:update", ""); @@ -71,26 +67,6 @@ class MenuServiceImplTest { Menu bulletinUpdate = new Menu(bulletin.getId(), Menu.Type.OPERATION, "bulletinUpdate", null, "公告修改", null, true, false, 1, "message:bulletin:update", ""); Menu bulletinQuery = new Menu(bulletin.getId(), Menu.Type.OPERATION, "bulletinQuery", null, "公告查询", null, true, false, 1, "message:bulletin:query", ""); Menu bulletinDelete = new Menu(bulletin.getId(), Menu.Type.OPERATION, "bulletinDelete", null, "公告删除", null, true, false, 1, "message:bulletin:delete", ""); - Menu deviceQuery = new Menu(device.getId(), Menu.Type.OPERATION, "deviceQuery", null, "设备查询", null, true, false, 1, "iot:device:query", ""); - Menu deviceCreate = new Menu(device.getId(), Menu.Type.OPERATION, "deviceCreate", null, "设备新增", null, true, false, 1, "iot:device:create", ""); - Menu deviceUpdate = new Menu(device.getId(), Menu.Type.OPERATION, "deviceUpdate", null, "设备修改", null, true, false, 1, "iot:device:update", ""); - Menu deviceDelete = new Menu(device.getId(), Menu.Type.OPERATION, "deviceDelete", null, "设备删除", null, true, false, 1, "iot:device:delete", ""); - Menu productQuery = new Menu(product.getId(), Menu.Type.OPERATION, "productQuery", null, "产品查询", null, true, false, 1, "iot:product:query", ""); - Menu productCreate = new Menu(product.getId(), Menu.Type.OPERATION, "productCreate", null, "产品新增", null, true, false, 1, "iot:product:create", ""); - Menu productUpdate = new Menu(product.getId(), Menu.Type.OPERATION, "productUpdate", null, "产品修改", null, true, false, 1, "iot:product:update", ""); - Menu productDelete = new Menu(product.getId(), Menu.Type.OPERATION, "productDelete", null, "产品删除", null, true, false, 1, "iot:product:delete", ""); - Menu eventQuery = new Menu(tsl.getId(), Menu.Type.OPERATION, "eventQuery", null, "事件查询", null, true, false, 1, "iot:event:query", ""); - Menu eventCreate = new Menu(tsl.getId(), Menu.Type.OPERATION, "eventCreate", null, "事件新增", null, true, false, 1, "iot:event:create", ""); - Menu eventUpdate = new Menu(tsl.getId(), Menu.Type.OPERATION, "eventUpdate", null, "事件修改", null, true, false, 1, "iot:event:update", ""); - Menu eventDelete = new Menu(tsl.getId(), Menu.Type.OPERATION, "eventDelete", null, "事件删除", null, true, false, 1, "iot:event:delete", ""); - Menu propertyQuery = new Menu(tsl.getId(), Menu.Type.OPERATION, "propertyQuery", null, "属性查询", null, true, false, 1, "iot:property:query", ""); - Menu propertyCreate = new Menu(tsl.getId(), Menu.Type.OPERATION, "propertyCreate", null, "属性新增", null, true, false, 1, "iot:property:create", ""); - Menu propertyUpdate = new Menu(tsl.getId(), Menu.Type.OPERATION, "propertyUpdate", null, "属性修改", null, true, false, 1, "iot:property:update", ""); - Menu propertyDelete = new Menu(tsl.getId(), Menu.Type.OPERATION, "propertyDelete", null, "属性删除", null, true, false, 1, "iot:property:delete", ""); - Menu serverQuery = new Menu(tsl.getId(), Menu.Type.OPERATION, "serverQuery", null, "服务查询", null, true, false, 1, "iot:server:query", ""); - Menu serverCreate = new Menu(tsl.getId(), Menu.Type.OPERATION, "serverCreate", null, "服务新增", null, true, false, 1, "iot:server:create", ""); - Menu serverUpdate = new Menu(tsl.getId(), Menu.Type.OPERATION, "serverUpdate", null, "服务修改", null, true, false, 1, "iot:server:update", ""); - Menu serverDelete = new Menu(tsl.getId(), Menu.Type.OPERATION, "serverDelete", null, "服务删除", null, true, false, 1, "iot:server:delete", ""); Menu operationLogQuery = new Menu(operationLog.getId(), Menu.Type.OPERATION, "operationLogQuery", null, "操作日志查询", null, true, false, 1, "operationLog:query", ""); Menu operationLogDelete = new Menu(operationLog.getId(), Menu.Type.OPERATION, "operationLogDelete", null, "操作日志删除", null, true, false, 1, "operationLog:delete", ""); menuService.saveBatch(List.of(roleCreate, roleDelete, roleUpdate, roleQuery, @@ -99,11 +75,6 @@ class MenuServiceImplTest { menuSave, menuUpdate, menuQuery, menuDelete, noticeCreate, noticeUpdate, noticeQuery, noticeDelete, bulletinCreate, bulletinUpdate, bulletinQuery, bulletinDelete, - deviceQuery, deviceCreate, deviceUpdate, deviceDelete, - productQuery, productCreate, productUpdate, productDelete, - eventQuery, eventCreate, eventUpdate, eventDelete, - propertyQuery, propertyCreate, propertyUpdate, propertyDelete, - serverQuery, serverCreate, serverUpdate, serverDelete, operationLogQuery, operationLogDelete )); }