From b0020f66232a4851ccf8d56e1453effe3d3e3fbe Mon Sep 17 00:00:00 2001 From: v Date: Fri, 29 Aug 2025 23:32:20 +0800 Subject: [PATCH] =?UTF-8?q?up.=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/entity/gateway/script/BaseScript.php | 18 ++++++++++ .../gateway/{el => script}/ElNotification.php | 32 ++++++------------ app/entity/gateway/script/Swal.php | 27 +++++++++++++++ app/entity/gateway/ws/OutMessage.php | 33 +++++++++++++------ app/entity/gateway/ws/PutMessage.php | 19 +++++++---- app/enum/gateway/WsTypeEnum.php | 13 -------- app/enum/gateway/message/MessageType.php | 15 +++++++++ app/enum/gateway/message/ScriptEnum.php | 21 ++++++++++++ .../SystemEnum.php} | 8 ++--- app/event/SysGatewayEvent.php | 18 +++++----- app/subscribe/GatewaySubscribe.php | 25 +++++++++----- 11 files changed, 153 insertions(+), 76 deletions(-) create mode 100644 app/entity/gateway/script/BaseScript.php rename app/entity/gateway/{el => script}/ElNotification.php (51%) create mode 100644 app/entity/gateway/script/Swal.php delete mode 100644 app/enum/gateway/WsTypeEnum.php create mode 100644 app/enum/gateway/message/MessageType.php create mode 100644 app/enum/gateway/message/ScriptEnum.php rename app/enum/gateway/{WsEventEnum.php => message/SystemEnum.php} (60%) diff --git a/app/entity/gateway/script/BaseScript.php b/app/entity/gateway/script/BaseScript.php new file mode 100644 index 0000000..c9db6ad --- /dev/null +++ b/app/entity/gateway/script/BaseScript.php @@ -0,0 +1,18 @@ + $value) { + $this->$key = $value; + } + } + + public function toArray(): array + { + return get_object_vars($this); + } +} \ No newline at end of file diff --git a/app/entity/gateway/el/ElNotification.php b/app/entity/gateway/script/ElNotification.php similarity index 51% rename from app/entity/gateway/el/ElNotification.php rename to app/entity/gateway/script/ElNotification.php index 779e970..bc051ff 100644 --- a/app/entity/gateway/el/ElNotification.php +++ b/app/entity/gateway/script/ElNotification.php @@ -1,19 +1,17 @@ title = $title; @@ -31,15 +28,6 @@ class ElNotification $this->icon = $icon; $this->duration = $duration; $this->position = $position; - if (!empty($_attr)) { - foreach ($_attr as $key => $value) { - $this->$key = $value; - } - } - } - - public function toArray(): array - { - return get_object_vars($this); + parent::__construct($_bind); } } \ No newline at end of file diff --git a/app/entity/gateway/script/Swal.php b/app/entity/gateway/script/Swal.php new file mode 100644 index 0000000..35e5791 --- /dev/null +++ b/app/entity/gateway/script/Swal.php @@ -0,0 +1,27 @@ +title = $title; + $this->text = $text; + $this->icon = $icon; + parent::__construct($_bind); + } +} \ No newline at end of file diff --git a/app/entity/gateway/ws/OutMessage.php b/app/entity/gateway/ws/OutMessage.php index 26b2849..70ce605 100644 --- a/app/entity/gateway/ws/OutMessage.php +++ b/app/entity/gateway/ws/OutMessage.php @@ -2,9 +2,8 @@ namespace app\entity\gateway\ws; -use app\entity\gateway\el\ElNotification; -use app\enum\gateway\WsEventEnum; -use app\enum\gateway\WsTypeEnum; +use app\entity\gateway\script\BaseScript; +use app\enum\gateway\message\{ScriptEnum, SystemEnum}; class OutMessage { @@ -12,14 +11,28 @@ class OutMessage private string $event; private array $data; - public function __construct(WsTypeEnum $type, WsEventEnum $event, mixed $data = []) + public function __construct( + BaseScript|ScriptEnum|SystemEnum|array $event, + mixed $data = [] + ) { - $this->type = $type->value; - $this->event = $event->value; - - if($data instanceof ElNotification) { + // 通过Base::create();创建的 + if (is_array($event) && count($event) == 3) { + $this->type = $event[0]; + $this->event = $event[1]; + $this->data = $data; + return; + } else if ($event instanceof ScriptEnum) { + $this->type = 'script'; + $this->event = $event->value; + } else if ($event instanceof SystemEnum) { + $this->type = 'system'; + $this->event = $event->value; + } + // data处理 + if ($data instanceof BaseScript) { $this->data = $data->toArray(); - }else{ + } else { $this->data = (array)$data; } } @@ -29,7 +42,7 @@ class OutMessage return json_encode([ 'type' => $this->type, 'event' => $this->event, - 'data' => $this->data, + 'data' => $this->data, ], JSON_UNESCAPED_UNICODE); } } \ No newline at end of file diff --git a/app/entity/gateway/ws/PutMessage.php b/app/entity/gateway/ws/PutMessage.php index ca6abba..3c11209 100644 --- a/app/entity/gateway/ws/PutMessage.php +++ b/app/entity/gateway/ws/PutMessage.php @@ -2,17 +2,18 @@ namespace app\entity\gateway\ws; -use app\enum\gateway\WsEventEnum; -use app\enum\gateway\WsTypeEnum; +use app\enum\gateway\message\MessageType; +use app\enum\gateway\message\ScriptEnum; +use app\enum\gateway\message\SystemEnum; /** * Ws消息入参 */ class PutMessage { - readonly public ?WsTypeEnum $type; - readonly public ?WsEventEnum $event; - readonly public array $data; + readonly public ?MessageType $type; + readonly public SystemEnum|ScriptEnum|null $event; + readonly public array $data; public string $wsClientId; public int $userId = 0; @@ -22,8 +23,10 @@ class PutMessage public function __construct(string $ws_client_id, string $type, string $event, array $data = []) { $this->wsClientId = $ws_client_id; - $this->type = WsTypeEnum::tryFrom($type); - $this->event = WsEventEnum::tryFrom($event); + if ($type == MessageType::System) { + $this->type = MessageType::System; + $this->event = SystemEnum::tryFrom($event); + } $this->data = $data; } @@ -43,10 +46,12 @@ class PutMessage return true; } + public function getClientId(): string { return $this->userClient['id'] ?? ''; } + public function getClientName() { return $this->userClient['name'] ?? ''; diff --git a/app/enum/gateway/WsTypeEnum.php b/app/enum/gateway/WsTypeEnum.php deleted file mode 100644 index 477cfee..0000000 --- a/app/enum/gateway/WsTypeEnum.php +++ /dev/null @@ -1,13 +0,0 @@ -toArray(); + return ['script', $event, $data]; + } +} \ No newline at end of file diff --git a/app/enum/gateway/WsEventEnum.php b/app/enum/gateway/message/SystemEnum.php similarity index 60% rename from app/enum/gateway/WsEventEnum.php rename to app/enum/gateway/message/SystemEnum.php index e6627e8..ff22f37 100644 --- a/app/enum/gateway/WsEventEnum.php +++ b/app/enum/gateway/message/SystemEnum.php @@ -1,17 +1,15 @@ type == WsTypeEnum::System && $put->event == WsEventEnum::Login) { + if ($put->type == MessageType::System && $put->event == SystemEnum::Login) { self::authEvent($put); return; } @@ -56,12 +56,12 @@ class SysGatewayEvent // 3. 调度: 根据类型执行不同的业务 switch ($put->type) { // 客户端回应服务端的心跳 - case WsTypeEnum::Pong: + case MessageType::Pong: break; // 系统类型组操作 - case WsTypeEnum::System: + case MessageType::System: switch ($put->event) { - case WsEventEnum::Lock_Client: + case SystemEnum::Lock_Client: /** * 触发后续其他事件 */ @@ -82,8 +82,7 @@ class SysGatewayEvent * 客户端退出了某个房间 */ GatewayClientService::sendToGroup($group, new OutMessage( - WsTypeEnum::System, - WsEventEnum::Client_quit_room, + SystemEnum::Client_quit_room )); } } @@ -137,8 +136,7 @@ class SysGatewayEvent * 推送登录成功的消息到客户端 */ GatewayClientService::sendToClient($put->wsClientId, new OutMessage( - WsTypeEnum::System, - WsEventEnum::Login_SUCCESS, + SystemEnum::Login_SUCCESS, ['userId' => $auth->userId] )); /** diff --git a/app/subscribe/GatewaySubscribe.php b/app/subscribe/GatewaySubscribe.php index 951cf15..159e64b 100644 --- a/app/subscribe/GatewaySubscribe.php +++ b/app/subscribe/GatewaySubscribe.php @@ -2,14 +2,15 @@ namespace app\subscribe; -use app\entity\gateway\el\ElNotification; +use app\entity\gateway\script\ElNotification; +use app\entity\gateway\script\Swal; use app\entity\gateway\ws\OutMessage; use app\entity\gateway\ws\PutMessage; use app\entity\SysUser; use app\entity\SysUserClient; use app\entity\SysUserClientLog; -use app\enum\gateway\WsEventEnum; -use app\enum\gateway\WsTypeEnum; +use app\enum\gateway\message\ScriptEnum; +use app\enum\gateway\message\SystemEnum; use app\service\GatewayClientService; use think\db\exception\DataNotFoundException; use think\db\exception\DbException; @@ -61,19 +62,26 @@ class GatewaySubscribe if($client && $client['is_lock']) { // 通知客户端锁定屏幕 GatewayClientService::sendToClient($put->wsClientId,new OutMessage( - WsTypeEnum::System, - WsEventEnum::Lock_Client, + SystemEnum::Lock_Client )); } /* * 客户端登录通知 */ $ip = $_SERVER['REMOTE_ADDR'] ?? ''; + + // 方式0. 通过enum枚举类型指定 GatewayClientService::sendToClient($put->wsClientId, new OutMessage( - WsTypeEnum::System, - WsEventEnum::Notification, + ScriptEnum::ElNotification, new ElNotification(title: '登录成功,欢迎您', message: "当前登录Ip: $ip", position: 'bottom-right'), )); + + // 方式1. 通过注入Array + GatewayClientService::sendToClient($put->wsClientId, new OutMessage( + ScriptEnum::create( + new Swal(title: '登录成功,欢迎您', text: "当前登录Ip: $ip") + ), + )); } /** @@ -110,8 +118,7 @@ class GatewaySubscribe ]); // 通知客户端锁定屏幕 GatewayClientService::sendToClient($put->wsClientId,new OutMessage( - WsTypeEnum::System, - WsEventEnum::Lock_Client, + SystemEnum::Lock_Client )); }