You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
OMS.NET/GlobalArea.cs

356 lines
11 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
using OMS.NET.Common;
using OMS.NET.DbClass;
namespace OMS.NET
{
class GlobalArea
{
#region 用户登录列表相关
private static readonly List<UserConnect> _UserConnectList = new();
private static readonly object _UserConnectListLock = new();
/// <summary>
/// 连接客户端数量
/// </summary>
public static int ConnectClientsCount
{
get
{
lock (_UserConnectListLock)
{
return _UserConnectList.Count;
}
}
}
public static int LoginUserCount
{
get
{
lock (_UserConnectListLock)
{
return _UserConnectList
.Where(u => u.UserEmail != null) // 过滤出UserEmail不为空的项
.Select(u => u.UserEmail) // 选择UserEmail
.Distinct().Count(); // 去重且计算数量
}
}
}
public static List<UserConnect> UserConnects
{
get
{
lock (_UserConnectListLock)
{
return _UserConnectList;
}
}
}
/// <summary>
/// 添加ws连接记录
/// </summary>
public static void AddUserConnect(string wsid, IPEndPoint iPEndPoint)
{
lock (_UserConnectListLock)
{
UserConnect userConnect = new(wsid, iPEndPoint);
_UserConnectList.Add(userConnect);
}
}
public static void RemoveUserConnectByID(string wsid)
{
lock (_UserConnectListLock)
{
UserConnect? userConnect = _UserConnectList.Find(u => u.ID == wsid);
if (userConnect != null)
{
_UserConnectList.Remove(userConnect);
}
}
}
public static bool LoginCheckByID(string wsid)
{
lock (_UserConnectListLock)
{
return _UserConnectList.Exists(u => u.ID == wsid && u.UserEmail != null);
}
}
/// <summary>
/// 通过wsid查询连接的Email信息
/// </summary>
/// <returns>Email信息可能是空字符串</returns>
public static string GetLoginEmailByID(string wsid)
{
lock (_UserConnectListLock)
{
return _UserConnectList.First(u => u.ID == wsid).UserEmail!;
}
}
public static bool LoginCheckByEmail(string email)
{
lock (_UserConnectListLock)
{
return _UserConnectList.Exists(u => u.UserEmail == email);
}
}
/// <summary>
/// 添加登录记录
/// </summary>
public static void Login(string wsid, string email)
{
lock (_UserConnectListLock)
{
UserConnect? userConnect = _UserConnectList.Find(u => u.ID == wsid);
if (userConnect != null)
{
userConnect.UserEmail = email;
}
}
}
#endregion
#region 服务器配置相关
private static ServerConfig _ServerConfig = new();
private static readonly object _ServerConfigLock = new();
/// <summary>
/// 提供只读服务器配置访问
/// </summary>
public static ServerConfig ServerConfig
{
get
{
lock (_ServerConfigLock)
{
return _ServerConfig;
}
}
}
/// <summary>
/// 提供完整的数据库连接字符串,带数据库名称
/// </summary>
public static string ConnectionStringWithDbName
{
get
{
lock (_ServerConfigLock)
{
return _ServerConfig.ConnectionString + ";database=" + _ServerConfig.DataBaseName;
}
}
}
public static void LoadServerConfig()
{
lock (_ServerConfigLock)
{
string configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"server.yaml");
//读取配置文件
_ServerConfig = new(configPath);
Console.WriteLine("已读取到配置文件..." + Environment.NewLine + _ServerConfig.ToString());
}
}
#endregion
#region RSA加解密相关
private static readonly RSA _Rsa = RSA.Create();
private static readonly object _RsaLock = new();
public static RSA Rsa
{
get
{
lock (_RsaLock)
{
return _Rsa;
}
}
}
/// <summary>
/// 导入指定私钥,如果不存在则创建并保存
/// </summary>
public static void LoadRsaPkey()
{
lock (_RsaLock)
{
string pkeyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @".pkey");
if (File.Exists(pkeyPath))
{
DateTime lastModifyTime = File.GetLastWriteTime(pkeyPath);
bool isOneYearApart = Math.Abs((DateTime.Now - lastModifyTime).TotalDays) >= 365;
if (isOneYearApart)
{
File.WriteAllText(pkeyPath, Convert.ToBase64String(_Rsa.ExportPkcs8PrivateKey()));
}
else
{
string pkey = File.ReadAllText(pkeyPath);
Console.WriteLine("继续使用现有pkey: " + pkey);
_Rsa.ImportPkcs8PrivateKey(Convert.FromBase64String(pkey), out _);
}
}
else
{
File.WriteAllText(pkeyPath, Convert.ToBase64String(_Rsa.ExportPkcs8PrivateKey()));
Console.WriteLine("创建pkey:" + File.ReadAllText(pkeyPath));
}
}
}
/// <summary>
/// 以base64格式导出公钥字符串
/// </summary>
/// <returns>公钥字符串base64格式</returns>
public static string GetRsaPublickKey()
{
lock (_RsaLock)
{
return Convert.ToBase64String(_Rsa.ExportRSAPublicKey());
}
}
/// <summary>
/// 解密
/// </summary>
/// <param name="base64">base64编码的密文</param>
/// <returns>原文字符串 utf-8编码</returns>
public static string DecryptFromBase64String(string base64)
{
lock (_RsaLock)
{
byte[] decrypt = _Rsa.Decrypt(Convert.FromBase64String(base64),
RSAEncryptionPadding.Pkcs1);
return Encoding.UTF8.GetString(decrypt);
}
}
/// <summary>
/// 加密
/// </summary>
/// <param name="src">原文字符串 utf-8编码</param>
/// <returns>base64编码的密文</returns>
public static string EncryptToBase64String(string src)
{
lock (_RsaLock)
{
byte[] encrypt = _Rsa.Encrypt(Encoding.UTF8.GetBytes(src),
RSAEncryptionPadding.Pkcs1);
return Convert.ToBase64String(encrypt);
}
}
#endregion
#region 缓存与活动数据
private static readonly List<AccountData> _AccountDataList = new();
private static readonly object _AccountDataListLock = new();
/// <summary>
/// 缓存已查询用户数据,如果已存在则替换,需要在数据更新后调用
/// </summary>
public static void AddLoginAccountData(AccountData? accountData)
{
if (accountData == null) return;
lock (_AccountDataListLock)
{
int index = _AccountDataList.FindIndex(u => u.UserEmail == accountData.UserEmail);
if (index == -1)
{
_AccountDataList.Add(accountData);
}
else
{
_AccountDataList[index] = accountData;
}
}
}
/// <summary>
/// 提供一个简单获取登录数据的方法,而不需要重复进行数据库查询
/// </summary>
public static AccountData? GetLoginAccountData(string? email)
{
if (email == null) return null;
lock (_AccountDataListLock)
{
return _AccountDataList.Find(u => u.UserEmail == email);
}
}
private static readonly List<LayerData> _LayerDataList = new();
private static readonly object _LayerDataListLock = new();
/// <summary>
/// 从数据库中构建layerid 和 templateid的对应关系
/// </summary>
public static void BuildLayerData()
{
List<MapLayer> mapLayer = MapLayer.GetMapLayerList();
lock (_LayerDataListLock)
{
foreach (MapLayer layer in mapLayer)
{
LayerData layerData = new(null, layer);
if (layerData.Type != "order")
{
string temId = layerData.Structure!.AsArray().ElementAt(1)!["template"]!["id"]!.GetValue<string>();
layerData.TemplateId = temId;
}
_LayerDataList.Add(layerData);
Console.WriteLine($"{layerData.TemplateId}--{layerData.LayerId}");
}
}
}
public static LayerData? GetLayerDataByTemplateId(string templateId)
{
lock (_LayerDataListLock)
{
try
{
return _LayerDataList.Where(x => x.TemplateId == templateId).First();
}
catch
{
Log.Warn("通过模板id未获取到图层数据");
return null;
}
}
}
#endregion
/// <summary>
/// 默认loglevel为3发布版本需要改成2
/// </summary>
private static Logger _Logger = new(3);
private static readonly object _LoggerLock = new();
public static Logger Log
{
get
{
lock (_LoggerLock)
{
return _Logger;
}
}
}
public static string GetCurrentTime()
{
string format = "yyyy-MM-dd HH:mm:ss";
return DateTime.Now.ToString(format);
}
}
}