添加redis锁定用户
parent
85c005596d
commit
332f0f7805
|
|
@ -54,10 +54,41 @@ namespace Infrastructure.Cache
|
||||||
{
|
{
|
||||||
return iDatabase.KeyDelete(key);
|
return iDatabase.KeyDelete(key);
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// HSET - 异步设置哈希表中的多个字段。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
/// <param name="hashFields"></param>
|
||||||
|
/// <param name="flags"></param>
|
||||||
|
public void HashSetAsync(RedisKey key, HashEntry[] hashFields, CommandFlags flags = CommandFlags.None)
|
||||||
|
{
|
||||||
|
iDatabase.HashSetAsync(key, hashFields, CommandFlags.None);
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// HGETALL - 异步获取哈希表中的所有字段和值。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
/// <param name="flags"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public Task<HashEntry[]> HashGetAllAsync(RedisKey key, CommandFlags flags = CommandFlags.None)
|
||||||
|
{
|
||||||
|
return iDatabase.HashGetAllAsync(key, CommandFlags.None);
|
||||||
|
}
|
||||||
public override Task<T> Lock<T>(string id, Func<string, Task<T>> func, string key = "hc")
|
public override Task<T> Lock<T>(string id, Func<string, Task<T>> func, string key = "hc")
|
||||||
{
|
{
|
||||||
return func(id);
|
return func(id);
|
||||||
}
|
}
|
||||||
|
public Task<RedisValue[]> SetMembersAsync(RedisKey key, CommandFlags flags = CommandFlags.None)
|
||||||
|
{
|
||||||
|
return iDatabase.SetMembersAsync(key, CommandFlags.None);
|
||||||
|
}
|
||||||
|
public Task<bool> SetAddAsync(RedisKey key, RedisValue value, CommandFlags flags = CommandFlags.None)
|
||||||
|
{
|
||||||
|
return iDatabase.SetAddAsync(key, value, CommandFlags.None);
|
||||||
|
}
|
||||||
|
public Task<bool> SetRemoveAsync(RedisKey key, RedisValue value, CommandFlags flags = CommandFlags.None)
|
||||||
|
{
|
||||||
|
return iDatabase.SetRemoveAsync(key, value, CommandFlags.None);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace OpenAuth.App.ServiceApp.DroneDockManage
|
||||||
|
{
|
||||||
|
public class AirportMaintenanceApp
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace OpenAuth.App.ServiceApp.DroneDockManage.Response
|
||||||
|
{
|
||||||
|
public class MqttClientResp
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 客户端ID
|
||||||
|
/// </summary>
|
||||||
|
public string ClientId { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 用户id
|
||||||
|
/// </summary>
|
||||||
|
public string UserId { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 用户名
|
||||||
|
/// </summary>
|
||||||
|
public string UserName { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 连接时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime ConnectTime { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 是否控制
|
||||||
|
/// </summary>
|
||||||
|
public bool IsLock { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,150 @@
|
||||||
|
using Infrastructure;
|
||||||
|
using Infrastructure.Cache;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using OpenAuth.App.ServiceApp.DroneDockManage;
|
||||||
|
using OpenAuth.App.ServiceApp.DroneDockManage.Response;
|
||||||
|
using StackExchange.Redis;
|
||||||
|
|
||||||
|
namespace OpenAuth.WebApi.Controllers.ServiceControllers.DroneDockManage
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 机场运维
|
||||||
|
/// </summary>
|
||||||
|
[Route("api/[controller]/[action]")]
|
||||||
|
[ApiController]
|
||||||
|
public class AirportMaintenanceController : ControllerBase
|
||||||
|
{
|
||||||
|
private readonly AirportMaintenanceApp _app;
|
||||||
|
private readonly RedisCacheContext _cache;
|
||||||
|
private readonly HttpClient _httpClient;
|
||||||
|
|
||||||
|
public AirportMaintenanceController(AirportMaintenanceApp app,
|
||||||
|
RedisCacheContext cache, HttpClient httpClient)
|
||||||
|
{
|
||||||
|
_app = app;
|
||||||
|
_cache = cache;
|
||||||
|
_httpClient = httpClient;
|
||||||
|
}
|
||||||
|
#region redis 多用户控制
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 添加修改mqtt客户端信息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="info"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<Response<bool>> AddOrUpdateRedisUser(MqttClientResp info)
|
||||||
|
{
|
||||||
|
var result = new Response<bool>();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var clientKey = $"client:{info.UserId}";
|
||||||
|
string lockSetKey = "locked_users";
|
||||||
|
|
||||||
|
// 查询所有锁定用户
|
||||||
|
var existingLocked = await _cache.SetMembersAsync(lockSetKey);
|
||||||
|
|
||||||
|
// 如果有锁定用户,并且锁定的用户不是当前用户,则拒绝
|
||||||
|
if (existingLocked.Length > 0 && info.IsLock == true)
|
||||||
|
{
|
||||||
|
bool isCurrentUserLocked = existingLocked.Any(u => u == info.UserId);
|
||||||
|
if (!isCurrentUserLocked)
|
||||||
|
{
|
||||||
|
result.Code = 400;
|
||||||
|
result.Message = "已有其他用户处于锁定状态,不能添加新的锁定用户。";
|
||||||
|
result.Result = false;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 存客户端信息
|
||||||
|
_cache.HashSetAsync(clientKey, new HashEntry[]
|
||||||
|
{
|
||||||
|
new("ClientId", info.ClientId),
|
||||||
|
new("UserId", info.UserId),
|
||||||
|
new("UserName", info.UserName),
|
||||||
|
new("ConnectTime", info.ConnectTime.ToString("O")),
|
||||||
|
new("IsLock", info.IsLock ? "true" : "false")
|
||||||
|
});
|
||||||
|
|
||||||
|
if (info.IsLock)
|
||||||
|
{
|
||||||
|
await _cache.SetAddAsync(lockSetKey, info.UserId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await _cache.SetRemoveAsync(lockSetKey, info.UserId);
|
||||||
|
}
|
||||||
|
|
||||||
|
result.Result = true;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
result.Code = 500;
|
||||||
|
result.Message = ex.Message;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取当前用户mqtt客户端信息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<Response<MqttClientResp>> GetRedisUser(string id)
|
||||||
|
{
|
||||||
|
var result = new Response<MqttClientResp>();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
result.Result = ParseClient(await _cache.HashGetAllAsync($"client:{id}"));
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
result.Code = 500;
|
||||||
|
result.Message = ex.Message;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private MqttClientResp ParseClient(HashEntry[] entries)
|
||||||
|
{
|
||||||
|
if (entries == null || entries.Length == 0)
|
||||||
|
return null;
|
||||||
|
var dict = entries.ToDictionary(e => e.Name.ToString(), e => e.Value.ToString());
|
||||||
|
return new MqttClientResp
|
||||||
|
{
|
||||||
|
ClientId = dict["ClientId"],
|
||||||
|
UserId = dict["UserId"],
|
||||||
|
UserName = dict["UserName"],
|
||||||
|
ConnectTime = DateTime.Parse(dict["ConnectTime"]),
|
||||||
|
IsLock = bool.Parse(dict["IsLock"])
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取所有锁定的用户客户端信息
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<List<MqttClientResp>> GetLockedClients()
|
||||||
|
{
|
||||||
|
var userIds = await _cache.SetMembersAsync("locked_users");
|
||||||
|
|
||||||
|
var result = new List<MqttClientResp>();
|
||||||
|
|
||||||
|
foreach (var userId in userIds)
|
||||||
|
{
|
||||||
|
var entries = await _cache.HashGetAllAsync($"client:{userId}");
|
||||||
|
if (entries.Length > 0)
|
||||||
|
result.Add(ParseClient(entries));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -18,10 +18,9 @@
|
||||||
},
|
},
|
||||||
"UploadPath": "", //附件上传的路径,如果为空则保存在站点根目录
|
"UploadPath": "", //附件上传的路径,如果为空则保存在站点根目录
|
||||||
"RedisConf": {
|
"RedisConf": {
|
||||||
"Conn": "175.27.168.120:6050,password=HopetryRedis1406",
|
"Conn": "123.132.248.154:9253,password=HopetryRedis1406",
|
||||||
//"Conn": "127.0.0.1:6379,password=123456",
|
"Database": 1
|
||||||
"Database": 5
|
}, //redis配置
|
||||||
},
|
|
||||||
"HttpHost": "http://*:10010 ", //启动绑定地址及端口
|
"HttpHost": "http://*:10010 ", //启动绑定地址及端口
|
||||||
"SYSTEM_USERPWD": "123456"
|
"SYSTEM_USERPWD": "123456"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -22,9 +22,9 @@
|
||||||
"UploadPath": "",
|
"UploadPath": "",
|
||||||
//附件上传的路径,如果为空则保存在站点根目录
|
//附件上传的路径,如果为空则保存在站点根目录
|
||||||
"RedisConf": {
|
"RedisConf": {
|
||||||
"Conn": "175.27.168.120:6050,password=HopetryRedis1406",
|
"Conn": "192.168.10.163:6379,password=123456",
|
||||||
//"Conn": "127.0.0.1:6379,password=123456",
|
//"Conn": "127.0.0.1:6379,password=123456",
|
||||||
"Database": 5
|
"Database": 7
|
||||||
},
|
},
|
||||||
//redis配置
|
//redis配置
|
||||||
"HttpHost": "http://*:10070 ",
|
"HttpHost": "http://*:10070 ",
|
||||||
|
|
@ -67,6 +67,12 @@
|
||||||
"TiffStoreNamePrefix": "tiff_store",
|
"TiffStoreNamePrefix": "tiff_store",
|
||||||
"TiffDir": "E:/tiff"
|
"TiffDir": "E:/tiff"
|
||||||
},
|
},
|
||||||
|
"MQTT": {
|
||||||
|
"Server": "175.27.168.120",
|
||||||
|
"Port": 6011,
|
||||||
|
"UserName": "sdhc",
|
||||||
|
"Password": ""
|
||||||
|
},
|
||||||
"FlyImageDir": "e:/fly",
|
"FlyImageDir": "e:/fly",
|
||||||
"WebSocket": "ws://192.168.10.106:5698/ws"
|
"WebSocket": "ws://192.168.10.106:5698/ws"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue