From faa692a001deab5420a9af58044571b0f6481c49 Mon Sep 17 00:00:00 2001 From: zhangbin <460190368@qq.com> Date: Mon, 1 Dec 2025 13:31:20 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=94=A8=E6=88=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Infrastructure/Cache/RedisCacheContext.cs | 24 ++++++- .../AirportMaintenanceController.cs | 70 +++++++++++++++++-- OpenAuth.WebApi/Startup.cs | 2 +- 3 files changed, 87 insertions(+), 9 deletions(-) diff --git a/Infrastructure/Cache/RedisCacheContext.cs b/Infrastructure/Cache/RedisCacheContext.cs index 5939a43..0af5bdf 100644 --- a/Infrastructure/Cache/RedisCacheContext.cs +++ b/Infrastructure/Cache/RedisCacheContext.cs @@ -177,6 +177,28 @@ namespace Infrastructure.Cache { return server.Keys(pattern: new RedisValue(pattern)); } + public async Task> ScanKeysAsync(string pattern) + { + var keys = new List(); + + foreach (var endpoint in _conn.GetEndPoints()) + { + var server = _conn.GetServer(endpoint); + + // 必须跳过从节点 + if (server.IsSlave || server.IsReplica) + continue; + + var scan = server.Keys( + database: iDatabase.Database, + pattern: pattern, + pageSize: 1000); + + keys.AddRange(scan); + } + + return keys; + } /// /// HSET - 异步设置哈希表中的多个字段。 /// @@ -195,7 +217,7 @@ namespace Infrastructure.Cache /// public Task HashGetAllAsync(RedisKey key, CommandFlags flags = CommandFlags.None) { - return iDatabase.HashGetAllAsync(key, CommandFlags.None); + return iDatabase.HashGetAllAsync(key, CommandFlags.None); } /// /// Returns all the members of the set value stored at key diff --git a/OpenAuth.WebApi/Controllers/ServiceControllers/AirportMaintenanceController.cs b/OpenAuth.WebApi/Controllers/ServiceControllers/AirportMaintenanceController.cs index 16cafc4..6947e05 100644 --- a/OpenAuth.WebApi/Controllers/ServiceControllers/AirportMaintenanceController.cs +++ b/OpenAuth.WebApi/Controllers/ServiceControllers/AirportMaintenanceController.cs @@ -1,24 +1,25 @@ using DocumentFormat.OpenXml.EMMA; using DocumentFormat.OpenXml.Math; using DocumentFormat.OpenXml.Spreadsheet; +using HidSharp; using Infrastructure; using Infrastructure.Cache; +using Infrastructure.CloudSdk.minio; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Minio; using MQTTnet; using OpenAuth.App.ServiceApp; using OpenAuth.App.ServiceApp.Response; using OpenAuth.Repository.Domain; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats.Jpeg; +using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp.Processing; using StackExchange.Redis; using System.Text; using System.Text.Json; using System.Threading.Tasks; -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.Processing; -using SixLabors.ImageSharp.Formats.Jpeg; -using SixLabors.ImageSharp.PixelFormats; -using Minio; -using Infrastructure.CloudSdk.minio; namespace OpenAuth.WebApi.Controllers.ServiceControllers { @@ -580,7 +581,7 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers /// /// [HttpGet] - public async Task> GetRedisUser(string id) + public async Task> GetRedisUserold(string id) { var result = new Response(); try @@ -595,6 +596,61 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers return result; } + /// + /// 获取当前用户mqtt客户端信息 + /// + /// + /// + [HttpGet] + [AllowAnonymous] + public async Task> GetRedisUser(string id) + { + var result = new Response(); + try + { + var keys = await _cache.ScanKeysAsync("client:*"); + foreach (var key in keys) + { + // 2. 获取 hash 全部字段 + var hashEntries = await _cache.HashGetAllAsync(key); + + if (hashEntries == null || hashEntries.Length == 0) + continue; + + // 3. 取 UserId 字段 + var userIdEntry = hashEntries.FirstOrDefault(x => x.Name == "UserId"); + + if (userIdEntry.Value == RedisValue.Null) + continue; + + // 4. 判断是否等于目标 UserId + if (userIdEntry.Value.ToString() == id) + { + // 将 HashEntry[] 转成字典 + var dict = hashEntries.ToDictionary( + x => x.Name.ToString(), + x => x.Value.ToString() + ); + MqttClientResp mqttClientResp = new MqttClientResp(); + + mqttClientResp.ClientId = dict["ClientId"]; + mqttClientResp.UserId = dict["UserId"]; + mqttClientResp.UserName = dict["UserName"]; + mqttClientResp.ConnectTime = DateTime.Parse(dict["ConnectTime"]); + mqttClientResp.DeviceSn = dict["DeviceSn"]; + mqttClientResp.IsLock = bool.Parse(dict["IsLock"]); + result.Result = mqttClientResp; + } + } + } + catch (Exception ex) + { + result.Code = 500; + result.Message = ex.Message; + } + + return result; + } private MqttClientResp ParseClient(HashEntry[] entries) { diff --git a/OpenAuth.WebApi/Startup.cs b/OpenAuth.WebApi/Startup.cs index df01e12..64b7083 100644 --- a/OpenAuth.WebApi/Startup.cs +++ b/OpenAuth.WebApi/Startup.cs @@ -344,7 +344,7 @@ namespace OpenAuth.WebApi #endregion #region Quartz - services.AddHostedService(); + //services.AddHostedService(); #endregion