mirror of
				https://gitee.com/ThingsGateway/ThingsGateway.git
				synced 2025-10-31 23:53:58 +08:00 
			
		
		
		
	Compare commits
	
		
			13 Commits
		
	
	
		
			10.11.80.0
			...
			10.11.94.0
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 0fef7dcf3b | ||
|   | 19d9702606 | ||
|   | a8a9774932 | ||
|   | aad0f0e8c3 | ||
|   | e74eae50a7 | ||
|   | 3b16d7019f | ||
|   | 3e038028c2 | ||
|   | b1d8041f7e | ||
|   | 53a98b26cd | ||
|   | 42c740fa1b | ||
|   | 556819c90c | ||
|   | 2522333a9c | ||
|   | bd4ce7c09b | 
| @@ -45,6 +45,7 @@ public class VerificatInfo : PrimaryIdEntity | ||||
|     /// 登录IP | ||||
|     /// </summary> | ||||
|     [AutoGenerateColumn(Filterable = true, Sortable = true, Width = 200)] | ||||
|     [SugarColumn(IsNullable = true)] | ||||
|     public string LoginIp { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
| @@ -78,5 +79,6 @@ public class VerificatInfo : PrimaryIdEntity | ||||
|     /// 登录设备 | ||||
|     /// </summary> | ||||
|     [AutoGenerateColumn(Filterable = true, Sortable = true, Width = 100)] | ||||
|     [SugarColumn(IsNullable = true)] | ||||
|     public string Device { get; set; } | ||||
| } | ||||
|   | ||||
| @@ -145,7 +145,7 @@ public class AdminOAuthHandler<TOptions>( | ||||
|         var loginEvent = new LoginEvent | ||||
|         { | ||||
|             Ip = appService.RemoteIpAddress, | ||||
|             Device = appService.UserAgent?.Platform, | ||||
|             Device = appService.UserAgent?.Platform ?? "Unknown", | ||||
|             Expire = expire, | ||||
|             SysUser = sysUser, | ||||
|             VerificatId = CommonUtils.GetSingleId() | ||||
| @@ -156,7 +156,7 @@ public class AdminOAuthHandler<TOptions>( | ||||
|         //生成verificat信息 | ||||
|         var verificatInfo = new VerificatInfo | ||||
|         { | ||||
|             Device = loginEvent.Device, | ||||
|             Device = loginEvent.Device ?? "Unknown", | ||||
|             Expire = loginEvent.Expire, | ||||
|             VerificatTimeout = tokenTimeout, | ||||
|             Id = loginEvent.VerificatId, | ||||
|   | ||||
| @@ -26,7 +26,7 @@ | ||||
|       "Module": 2, | ||||
|       "Title": "权限管理", | ||||
|       "Code": "System", | ||||
|       "NavLinkMatch": "All", | ||||
|       "NavLinkMatch": "Prefix", | ||||
|       "Category": "MENU", | ||||
|       "Target": "_self", | ||||
|       "Href": null, | ||||
| @@ -47,7 +47,7 @@ | ||||
|       "ParentId": 0, | ||||
|       "Module": 2, | ||||
|       "Title": "系统运维", | ||||
|       "NavLinkMatch": "All", | ||||
|       "NavLinkMatch": "Prefix", | ||||
|       "Code": "System", | ||||
|       "Category": "MENU", | ||||
|       "Target": "_self", | ||||
|   | ||||
| @@ -235,7 +235,7 @@ public class AuthService : IAuthService | ||||
|         var logingEvent = new LoginEvent | ||||
|         { | ||||
|             Ip = _appService.RemoteIpAddress, | ||||
|             Device = _appService.UserAgent?.Platform, | ||||
|             Device = _appService.UserAgent?.Platform ?? "Unknown", | ||||
|             Expire = expire, | ||||
|             SysUser = sysUser, | ||||
|             VerificatId = verificatId | ||||
| @@ -344,7 +344,7 @@ public class AuthService : IAuthService | ||||
|         //生成verificat信息 | ||||
|         var verificatInfo = new VerificatInfo | ||||
|         { | ||||
|             Device = loginEvent.Device, | ||||
|             Device = loginEvent.Device ?? "Unknown", | ||||
|             Expire = loginEvent.Expire, | ||||
|             VerificatTimeout = tokenTimeout, | ||||
|             Id = loginEvent.VerificatId, | ||||
|   | ||||
| @@ -125,13 +125,22 @@ public class BlazorAppContext | ||||
|             var ownMenus = OwnMenus.Where(a => a.Module == CurrentModuleId); | ||||
|             OwnMenuItems = AdminResourceUtil.BuildMenuTrees(ownMenus).ToList(); | ||||
|             AllOwnMenuItems = AdminResourceUtil.BuildMenuTrees(OwnMenus).ToList(); | ||||
|             OwnSameLevelMenuItems = ownMenus.Where(a => !a.Href.IsNullOrWhiteSpace()).Select(item => new MenuItem() | ||||
|             OwnSameLevelMenuItems = ownMenus.Where(a => !a.Href.IsNullOrWhiteSpace()).Select(item => | ||||
|             { | ||||
|                 Match = item.NavLinkMatch ?? Microsoft.AspNetCore.Components.Routing.NavLinkMatch.All, | ||||
|                 Text = item.Title, | ||||
|                 Icon = item.Icon, | ||||
|                 Url = item.Href, | ||||
|                 Target = item.Target.ToString(), | ||||
|                 var menu = new MenuItem() | ||||
|                 { | ||||
|                     Match = item.NavLinkMatch ?? Microsoft.AspNetCore.Components.Routing.NavLinkMatch.Prefix, | ||||
|                     Text = item.Title, | ||||
|                     Icon = item.Icon, | ||||
|                     Url = item.Href, | ||||
|                     Target = item.Target.ToString(), | ||||
|                 }; | ||||
|                 if (menu.Url.IsNullOrEmpty()) | ||||
|                 { | ||||
|                     menu.Match = Microsoft.AspNetCore.Components.Routing.NavLinkMatch.Prefix; | ||||
|                 } | ||||
|                 return menu; | ||||
|  | ||||
|             }).ToList(); | ||||
|             UserWorkbenchOutputs = AllMenus.Where(it => UserWorkBench.Shortcuts.Contains(it.Id)).ToList(); | ||||
|         } | ||||
|   | ||||
| @@ -41,15 +41,22 @@ public static class AdminResourceUtil | ||||
|         return items | ||||
|         .Where(it => it.ParentId == parentId) | ||||
|         .Select((item, index) => | ||||
|             new MenuItem() | ||||
|         { | ||||
|             var menu = new MenuItem() | ||||
|             { | ||||
|                 Match = item.NavLinkMatch ?? Microsoft.AspNetCore.Components.Routing.NavLinkMatch.All, | ||||
|                 Match = item.NavLinkMatch ?? Microsoft.AspNetCore.Components.Routing.NavLinkMatch.Prefix, | ||||
|                 Text = item.Title, | ||||
|                 Icon = item.Icon, | ||||
|                 Url = item.Href, | ||||
|                 Target = item.Target.ToString(), | ||||
|                 Items = BuildMenuTrees(items, item.Id).ToList() | ||||
|             }; | ||||
|             if (menu.Url.IsNullOrEmpty()) | ||||
|             { | ||||
|                 menu.Match = Microsoft.AspNetCore.Components.Routing.NavLinkMatch.Prefix; | ||||
|             } | ||||
|             return menu; | ||||
|         } | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -16,6 +16,8 @@ using System.Runtime.CompilerServices; | ||||
| using System.Text.Json; | ||||
| using System.Text.RegularExpressions; | ||||
|  | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.Common.Extension; | ||||
| /// <summary> | ||||
| /// 对象拓展类 | ||||
| @@ -48,113 +50,7 @@ public static class ObjectExtensions | ||||
|         bool IsTheRawGenericType(Type type) => generic == (type.IsGenericType ? type.GetGenericTypeDefinition() : type); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 将 DateTimeOffset 转换成本地 DateTime | ||||
|     /// </summary> | ||||
|     /// <param name="dateTime"></param> | ||||
|     /// <returns></returns> | ||||
|     public static DateTime ConvertToDateTime(this DateTimeOffset dateTime) | ||||
|     { | ||||
|         if (dateTime.Offset.Equals(TimeSpan.Zero)) | ||||
|             return dateTime.UtcDateTime; | ||||
|         if (dateTime.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(dateTime.DateTime))) | ||||
|             return dateTime.ToLocalTime().DateTime; | ||||
|         else | ||||
|             return dateTime.DateTime; | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 将 DateTimeOffset? 转换成本地 DateTime? | ||||
|     /// </summary> | ||||
|     /// <param name="dateTime"></param> | ||||
|     /// <returns></returns> | ||||
|     public static DateTime? ConvertToDateTime(this DateTimeOffset? dateTime) | ||||
|     { | ||||
|         return dateTime.HasValue ? dateTime.Value.ConvertToDateTime() : null; | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 将 DateTime 转换成 DateTimeOffset | ||||
|     /// </summary> | ||||
|     /// <param name="dateTime"></param> | ||||
|     /// <returns></returns> | ||||
|     public static DateTimeOffset ConvertToDateTimeOffset(this DateTime dateTime) | ||||
|     { | ||||
|         return DateTime.SpecifyKind(dateTime, DateTimeKind.Local); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 将 DateTime? 转换成 DateTimeOffset? | ||||
|     /// </summary> | ||||
|     /// <param name="dateTime"></param> | ||||
|     /// <returns></returns> | ||||
|     public static DateTimeOffset? ConvertToDateTimeOffset(this DateTime? dateTime) | ||||
|     { | ||||
|         return dateTime.HasValue ? dateTime.Value.ConvertToDateTimeOffset() : null; | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 将流保存到本地磁盘 | ||||
|     /// </summary> | ||||
|     /// <param name="stream"></param> | ||||
|     /// <param name="path"></param> | ||||
|     /// <returns></returns> | ||||
|     public static void CopyToSave(this Stream stream, string path) | ||||
|     { | ||||
|         // 空检查 | ||||
|         if (string.IsNullOrWhiteSpace(path)) throw new ArgumentNullException(nameof(path)); | ||||
|  | ||||
|         using var fileStream = File.Create(path); | ||||
|         stream.CopyTo(fileStream); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 将字节数组保存到本地磁盘 | ||||
|     /// </summary> | ||||
|     /// <param name="bytes"></param> | ||||
|     /// <param name="path"></param> | ||||
|     /// <returns></returns> | ||||
|     public static void CopyToSave(this byte[] bytes, string path) | ||||
|     { | ||||
|         using var stream = new MemoryStream(bytes); | ||||
|         stream.CopyToSave(path); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 将流保存到本地磁盘 | ||||
|     /// </summary> | ||||
|     /// <param name="stream"></param> | ||||
|     /// <param name="path">需包含文件名完整路径</param> | ||||
|     /// <returns></returns> | ||||
|     public static async Task CopyToSaveAsync(this Stream stream, string path) | ||||
|     { | ||||
|         // 空检查 | ||||
|         if (string.IsNullOrWhiteSpace(path)) | ||||
|         { | ||||
|             throw new ArgumentNullException(nameof(path)); | ||||
|         } | ||||
|  | ||||
|         // 文件名判断 | ||||
|         if (string.IsNullOrWhiteSpace(Path.GetFileName(path))) | ||||
|         { | ||||
|             throw new ArgumentException("The parameter of <path> parameter must include the complete file name."); | ||||
|         } | ||||
|  | ||||
|         using var fileStream = File.Create(path); | ||||
|         await stream.CopyToAsync(fileStream).ConfigureAwait(false); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 将字节数组保存到本地磁盘 | ||||
|     /// </summary> | ||||
|     /// <param name="bytes"></param> | ||||
|     /// <param name="path"></param> | ||||
|     /// <returns></returns> | ||||
|     public static async Task CopyToSaveAsync(this byte[] bytes, string path) | ||||
|     { | ||||
|         using var stream = new MemoryStream(bytes); | ||||
|         await stream.CopyToSaveAsync(path).ConfigureAwait(false); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 合并两个字典 | ||||
|   | ||||
| @@ -12,9 +12,9 @@ | ||||
| 	</PropertyGroup> | ||||
| 	 | ||||
| 	<ItemGroup> | ||||
| 		<PackageReference Include="BootstrapBlazor.TableExport" Version="9.2.6" /> | ||||
| 		<PackageReference Include="BootstrapBlazor.TableExport" Version="9.2.7" /> | ||||
| 		<PackageReference Include="Yitter.IdGenerator" Version="1.0.14" /> | ||||
| 		<PackageReference Include="BootstrapBlazor" Version="9.11.0" /> | ||||
| 		<PackageReference Include="BootstrapBlazor" Version="9.11.1" /> | ||||
| 	</ItemGroup> | ||||
|  | ||||
| 	<ItemGroup> | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| using Microsoft.AspNetCore.Hosting; | ||||
|  | ||||
| using ThingsGateway; | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.Reflection; | ||||
|  | ||||
| namespace Microsoft.Extensions.Hosting; | ||||
|   | ||||
| @@ -20,7 +20,7 @@ using System.Text.RegularExpressions; | ||||
|  | ||||
| using ThingsGateway.NewLife; | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| /// 对象拓展类 | ||||
| @@ -28,70 +28,10 @@ namespace ThingsGateway.Extensions; | ||||
| [SuppressSniffer] | ||||
| public static class ObjectExtensions | ||||
| { | ||||
|     /// <summary> | ||||
|     /// 将 DateTimeOffset 转换成本地 DateTime | ||||
|     /// </summary> | ||||
|     /// <param name="dateTime"></param> | ||||
|     /// <returns></returns> | ||||
|     public static DateTime ConvertToDateTime(this DateTimeOffset dateTime) | ||||
|     { | ||||
|         if (dateTime.Offset.Equals(TimeSpan.Zero)) | ||||
|             return dateTime.UtcDateTime; | ||||
|         if (dateTime.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(dateTime.DateTime))) | ||||
|             return dateTime.ToLocalTime().DateTime; | ||||
|         else | ||||
|             return dateTime.DateTime; | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 将 DateTimeOffset? 转换成本地 DateTime? | ||||
|     /// </summary> | ||||
|     /// <param name="dateTime"></param> | ||||
|     /// <returns></returns> | ||||
|     public static DateTime? ConvertToDateTime(this DateTimeOffset? dateTime) | ||||
|     { | ||||
|         return dateTime.HasValue ? dateTime.Value.ConvertToDateTime() : null; | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 将 DateTime 转换成 DateTimeOffset | ||||
|     /// </summary> | ||||
|     /// <param name="dateTime"></param> | ||||
|     /// <returns></returns> | ||||
|     public static DateTimeOffset ConvertToDateTimeOffset(this DateTime dateTime) | ||||
|     { | ||||
|         return DateTime.SpecifyKind(dateTime, DateTimeKind.Local); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 将 DateTime? 转换成 DateTimeOffset? | ||||
|     /// </summary> | ||||
|     /// <param name="dateTime"></param> | ||||
|     /// <returns></returns> | ||||
|     public static DateTimeOffset? ConvertToDateTimeOffset(this DateTime? dateTime) | ||||
|     { | ||||
|         return dateTime.HasValue ? dateTime.Value.ConvertToDateTimeOffset() : null; | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 将时间戳转换为 DateTime | ||||
|     /// </summary> | ||||
|     /// <param name="timestamp"></param> | ||||
|     /// <returns></returns> | ||||
|     internal static DateTime ConvertToDateTime(this long timestamp) | ||||
|     { | ||||
|         var timeStampDateTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); | ||||
|         var digitCount = (int)Math.Floor(Math.Log10(timestamp) + 1); | ||||
|  | ||||
|         if (digitCount != 13 && digitCount != 10) | ||||
|         { | ||||
|             throw new ArgumentException("Data is not a valid timestamp format."); | ||||
|         } | ||||
|  | ||||
|         return (digitCount == 13 | ||||
|             ? timeStampDateTime.AddMilliseconds(timestamp)  // 13 位时间戳 | ||||
|             : timeStampDateTime.AddSeconds(timestamp)).ToLocalTime();   // 10 位时间戳 | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// 将 IFormFile 转换成 byte[] | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using Microsoft.AspNetCore.Mvc.ModelBinding; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.AspNetCore; | ||||
|  | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using Microsoft.AspNetCore.Mvc.ModelBinding; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.AspNetCore; | ||||
|  | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| using Microsoft.AspNetCore.Mvc.ModelBinding; | ||||
| using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.AspNetCore; | ||||
|  | ||||
|   | ||||
| @@ -18,7 +18,7 @@ using System.Reflection; | ||||
|  | ||||
| using ThingsGateway; | ||||
| using ThingsGateway.ConfigurableOptions; | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace Microsoft.Extensions.DependencyInjection; | ||||
|  | ||||
|   | ||||
| @@ -16,7 +16,7 @@ using System.ComponentModel.DataAnnotations; | ||||
| using System.Reflection; | ||||
| using System.Text.RegularExpressions; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.Templates.Extensions; | ||||
|  | ||||
| namespace ThingsGateway.DataValidation; | ||||
|   | ||||
| @@ -21,7 +21,7 @@ using System.Collections.Concurrent; | ||||
| using System.Reflection; | ||||
| using System.Text.RegularExpressions; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.UnifyResult; | ||||
|  | ||||
| namespace ThingsGateway.DynamicApiController; | ||||
|   | ||||
| @@ -17,7 +17,7 @@ using System.ComponentModel.DataAnnotations; | ||||
| using System.Diagnostics; | ||||
| using System.Reflection; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.Templates.Extensions; | ||||
|  | ||||
| namespace ThingsGateway.FriendlyException; | ||||
|   | ||||
| @@ -16,7 +16,7 @@ using Microsoft.AspNetCore.SignalR; | ||||
| using System.Reflection; | ||||
|  | ||||
| using ThingsGateway; | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.InstantMessaging; | ||||
|  | ||||
| namespace Microsoft.AspNetCore.Builder; | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
| // 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。 | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.Logging; | ||||
|  | ||||
|   | ||||
| @@ -36,7 +36,7 @@ using System.Text.Json; | ||||
|  | ||||
| using ThingsGateway; | ||||
| using ThingsGateway.DataValidation; | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.FriendlyException; | ||||
| using ThingsGateway.JsonSerialization; | ||||
| using ThingsGateway.Logging; | ||||
|   | ||||
| @@ -16,7 +16,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions; | ||||
| using System.Linq.Expressions; | ||||
| using System.Reflection; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.Options; | ||||
|  | ||||
| namespace Microsoft.Extensions.Options; | ||||
|   | ||||
| @@ -31,7 +31,7 @@ using System.Xml.Linq; | ||||
| using System.Xml.XPath; | ||||
|  | ||||
| using ThingsGateway.DynamicApiController; | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.Reflection; | ||||
|  | ||||
| namespace ThingsGateway.SpecificationDocument; | ||||
|   | ||||
| @@ -20,7 +20,7 @@ using System.Reflection; | ||||
| using System.Text; | ||||
| using System.Text.RegularExpressions; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.SpecificationDocument; | ||||
|  | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using System.Text.RegularExpressions; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.Templates.Extensions; | ||||
|  | ||||
|   | ||||
| @@ -29,7 +29,7 @@ | ||||
| 	</ItemGroup> | ||||
|  | ||||
| 	<ItemGroup> | ||||
| 		<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.4" /> | ||||
| 		<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.6" /> | ||||
| 		<PackageReference Include="System.Text.Encoding.CodePages" Version="$(NET10Version)" /> | ||||
| 	</ItemGroup> | ||||
|  | ||||
|   | ||||
| @@ -13,7 +13,7 @@ using Microsoft.AspNetCore.Http; | ||||
|  | ||||
| using System.Reflection; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.UnifyResult; | ||||
|  | ||||
| namespace Microsoft.AspNetCore.Mvc; | ||||
|   | ||||
| @@ -22,7 +22,7 @@ using Microsoft.Extensions.Options; | ||||
| using System.Collections.Concurrent; | ||||
| using System.Reflection; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.FriendlyException; | ||||
|  | ||||
| namespace ThingsGateway.UnifyResult; | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| using System.Text.Json; | ||||
| using System.Text.Json.Serialization; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.Converters.Json; | ||||
|  | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using System.Reflection; | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     <see cref="Assembly" /> 拓展类 | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using System.Collections.Concurrent; | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     <see cref="ConcurrentDictionary{TKey, TValue}" /> 拓展类 | ||||
|   | ||||
| @@ -15,7 +15,7 @@ using Microsoft.Extensions.Hosting; | ||||
|  | ||||
| using System.Reflection; | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     核心模块 <see cref="IServiceCollection" /> 拓展类 | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using System.Data; | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     <see cref="DataTable" /> 和 <see cref="DataSet" /> 拓展类 | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
| // 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。 | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     委托拓展类 | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| using System.ComponentModel; | ||||
| using System.Reflection; | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     枚举拓展类 | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
| // 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。 | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     <see cref="EventHandler{TEventArgs}" /> 拓展类 | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using System.Diagnostics.CodeAnalysis; | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     <see cref="ICollection{T}" /> 拓展类 | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using System.Collections.Concurrent; | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     <see cref="IDictionary{TKey, TValue}" /> 拓展类 | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
| // 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。 | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     <see cref="IEnumerable" /> 拓展类 | ||||
|   | ||||
| @@ -18,7 +18,7 @@ using System.Text.RegularExpressions; | ||||
| using System.Xml; | ||||
| using System.Xml.Linq; | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     System.Text.Json 拓展类 | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| using System.Linq.Expressions; | ||||
| using System.Reflection; | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     <see cref="Expression" /> 拓展类 | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| using System.Diagnostics.CodeAnalysis; | ||||
| using System.Reflection; | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     <see cref="MethodInfo" /> 拓展类 | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
| // 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。 | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     数值类型拓展类 | ||||
|   | ||||
| @@ -17,7 +17,7 @@ using System.Reflection; | ||||
| using System.Text; | ||||
| using System.Text.RegularExpressions; | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     <see cref="string" /> 拓展类 | ||||
|   | ||||
| @@ -15,7 +15,7 @@ using System.Reflection; | ||||
| using System.Reflection.Emit; | ||||
| using System.Runtime.CompilerServices; | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     <see cref="Type" /> 拓展类 | ||||
|   | ||||
| @@ -13,7 +13,7 @@ using System.Buffers; | ||||
| using System.Text; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     <see cref="Utf8JsonReader" /> 拓展类 | ||||
|   | ||||
| @@ -16,7 +16,7 @@ using System.Text.Json; | ||||
|  | ||||
| using ThingsGateway.Utilities; | ||||
|  | ||||
| namespace ThingsGateway.Extensions; | ||||
| namespace ThingsGateway.Extension; | ||||
|  | ||||
| /// <summary> | ||||
| ///     <see cref="object" /> 拓展类 | ||||
|   | ||||
| @@ -13,7 +13,7 @@ using System.Collections.Concurrent; | ||||
| using System.Diagnostics.CodeAnalysis; | ||||
| using System.Reflection; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.Reflection; | ||||
|  | ||||
|   | ||||
| @@ -13,7 +13,7 @@ using System.Collections.Concurrent; | ||||
| using System.Diagnostics.CodeAnalysis; | ||||
| using System.Reflection; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.Reflection; | ||||
|  | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using System.Diagnostics.CodeAnalysis; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.Utilities; | ||||
|  | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using System.Text; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.Utilities; | ||||
|  | ||||
|   | ||||
| @@ -18,7 +18,7 @@ using Microsoft.Net.Http.Headers; | ||||
| using System.Net.Mime; | ||||
|  | ||||
| using ThingsGateway.AspNetCore.Extensions; | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| using MediaTypeHeaderValue = System.Net.Http.Headers.MediaTypeHeaderValue; | ||||
|  | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| using System.Net.Http.Headers; | ||||
| using System.Threading.Channels; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.Utilities; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|   | ||||
| @@ -16,7 +16,7 @@ using System.Text; | ||||
| using System.Text.Json; | ||||
| using System.Threading.Channels; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.Utilities; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|   | ||||
| @@ -16,7 +16,7 @@ using Microsoft.Extensions.Logging; | ||||
| using System.Reflection; | ||||
| using System.Text; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -17,7 +17,7 @@ using System.Net.Mime; | ||||
| using System.Text; | ||||
| using System.Text.Json; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.Utilities; | ||||
|  | ||||
| using MediaTypeHeaderValue = System.Net.Http.Headers.MediaTypeHeaderValue; | ||||
|   | ||||
| @@ -16,7 +16,7 @@ using System.Globalization; | ||||
| using System.Net.Http.Headers; | ||||
| using System.Net.Mime; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| using CacheControlHeaderValue = System.Net.Http.Headers.CacheControlHeaderValue; | ||||
| using StringWithQualityHeaderValue = System.Net.Http.Headers.StringWithQualityHeaderValue; | ||||
|   | ||||
| @@ -14,7 +14,7 @@ | ||||
| using System.Collections.Concurrent; | ||||
| using System.Reflection; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| using System.Net.Mime; | ||||
| using System.Reflection; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using System.Reflection; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.Utilities; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using System.Reflection; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.Utilities; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|   | ||||
| @@ -14,7 +14,7 @@ using System.Net.Mime; | ||||
| using System.Reflection; | ||||
| using System.Text; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
| // 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。 | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.Utilities; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using System.Reflection; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.Utilities; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using System.Reflection; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.Utilities; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| using System.ComponentModel.DataAnnotations; | ||||
| using System.Reflection; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| using System.Diagnostics.CodeAnalysis; | ||||
| using System.Reflection; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -14,7 +14,7 @@ using Microsoft.Extensions.DependencyInjection; | ||||
|  | ||||
| using System.Net.Http.Headers; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote.Extensions; | ||||
|  | ||||
|   | ||||
| @@ -18,7 +18,7 @@ using System.Net.Http.Headers; | ||||
| using System.Text; | ||||
| using System.Text.RegularExpressions; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.Utilities; | ||||
|  | ||||
| using StringWithQualityHeaderValue = System.Net.Http.Headers.StringWithQualityHeaderValue; | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using System.Text; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -14,7 +14,7 @@ using Microsoft.AspNetCore.Mvc; | ||||
| using Microsoft.AspNetCore.Mvc.Controllers; | ||||
| using Microsoft.AspNetCore.Mvc.Filters; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.HttpRemote.Extensions; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|  | ||||
| using System.Globalization; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -15,7 +15,7 @@ using Microsoft.Extensions.Options; | ||||
| using System.Diagnostics; | ||||
| using System.Threading.Channels; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -15,7 +15,7 @@ using Microsoft.Extensions.Options; | ||||
| using System.Diagnostics; | ||||
| using System.Threading.Channels; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -14,7 +14,7 @@ using Microsoft.Extensions.Options; | ||||
|  | ||||
| using System.Threading.Channels; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -16,7 +16,7 @@ using System.Diagnostics.CodeAnalysis; | ||||
| using System.Text; | ||||
| using System.Threading.Channels; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
| // 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。 | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.Utilities; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|   | ||||
| @@ -14,7 +14,7 @@ using System.Net.Http.Headers; | ||||
| using System.Net.Mime; | ||||
| using System.Text; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -14,7 +14,7 @@ using System.Net.Http.Headers; | ||||
| using System.Reflection; | ||||
| using System.Text; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| using System.Net.Mime; | ||||
| using System.Text; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -13,7 +13,7 @@ using System.Globalization; | ||||
| using System.Net.Http.Headers; | ||||
| using System.Text; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -20,7 +20,7 @@ using System.Text; | ||||
| using System.Text.Json; | ||||
| using System.Text.Json.Nodes; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -18,7 +18,7 @@ using System.Net; | ||||
| using System.Reflection; | ||||
| using System.Text.RegularExpressions; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
| // 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。 | ||||
| // ------------------------------------------------------------------------ | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| using System.Net.WebSockets; | ||||
| using System.Text; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.HttpRemote; | ||||
|  | ||||
|   | ||||
| @@ -19,7 +19,7 @@ using System.Net.Mime; | ||||
| using System.Reflection; | ||||
| using System.Web; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.Shapeless; | ||||
|  | ||||
|   | ||||
| @@ -17,7 +17,7 @@ using System.Text.Json.Nodes; | ||||
| using System.Xml; | ||||
| using System.Xml.Linq; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.Shapeless; | ||||
|  | ||||
|   | ||||
| @@ -13,7 +13,7 @@ using System.Dynamic; | ||||
| using System.Reflection; | ||||
| using System.Text.Json; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| using ThingsGateway.Shapeless.Extensions; | ||||
|  | ||||
| using Binder = Microsoft.CSharp.RuntimeBinder.Binder; | ||||
|   | ||||
| @@ -15,7 +15,7 @@ using System.Dynamic; | ||||
| using System.Text.Json; | ||||
| using System.Text.Json.Nodes; | ||||
|  | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
|  | ||||
| namespace ThingsGateway.Shapeless; | ||||
|  | ||||
|   | ||||
| @@ -66,7 +66,7 @@ public sealed class WaitLock : IDisposable | ||||
|             } | ||||
|             catch (SemaphoreFullException) | ||||
|             { | ||||
|                 XTrace.WriteException(new Exception($"WaitLock {_name} 释放失败,当前信号量无需释放")); | ||||
|                 //XTrace.WriteException(new Exception($"WaitLock {_name} 释放失败,当前信号量无需释放")); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -155,7 +155,7 @@ public static class DateExtensions | ||||
|     /// </summary> | ||||
|     /// <param name="timestamp"></param> | ||||
|     /// <returns></returns> | ||||
|     internal static DateTime ConvertToDateTime(this long timestamp) | ||||
|     public static DateTime ConvertToDateTime(this long timestamp) | ||||
|     { | ||||
|         var timeStampDateTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); | ||||
|         var digitCount = (int)Math.Floor(Math.Log10(timestamp) + 1); | ||||
| @@ -169,4 +169,5 @@ public static class DateExtensions | ||||
|             ? timeStampDateTime.AddMilliseconds(timestamp)  // 13 位时间戳 | ||||
|             : timeStampDateTime.AddSeconds(timestamp)).ToLocalTime();   // 10 位时间戳 | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -8,13 +8,14 @@ | ||||
| // 项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。 | ||||
| // 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。 | ||||
| // ------------------------------------------------------------------------ | ||||
| 
 | ||||
| using Newtonsoft.Json; | ||||
| using Newtonsoft.Json.Linq; | ||||
| 
 | ||||
| #if NET6_0_OR_GREATER | ||||
| using System.Text.Json; | ||||
| #endif | ||||
| 
 | ||||
| using ThingsGateway.Extensions; | ||||
| using ThingsGateway.Extension; | ||||
| 
 | ||||
| namespace ThingsGateway.JsonSerialization; | ||||
| 
 | ||||
| @@ -23,6 +24,7 @@ namespace ThingsGateway.JsonSerialization; | ||||
| /// </summary> | ||||
| internal static class Penetrates | ||||
| { | ||||
| #if NET6_0_OR_GREATER | ||||
|     /// <summary> | ||||
|     /// 转换 | ||||
|     /// </summary> | ||||
| @@ -35,7 +37,6 @@ internal static class Penetrates | ||||
|         { | ||||
|             return longValue.ConvertToDateTime(); | ||||
|         } | ||||
| 
 | ||||
|         var stringValue = reader.GetString(); | ||||
| 
 | ||||
|         // 处理时间戳自动转换 | ||||
| @@ -46,6 +47,9 @@ internal static class Penetrates | ||||
| 
 | ||||
|         return Convert.ToDateTime(stringValue); | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     /// <summary> | ||||
|     /// 转换 | ||||
| @@ -69,4 +73,6 @@ internal static class Penetrates | ||||
| 
 | ||||
|         return Convert.ToDateTime(stringValue); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| @@ -53,12 +53,16 @@ public static class LinqExtensions | ||||
|     /// <inheritdoc/> | ||||
|     public static void RemoveWhere<T>(this ICollection<T> @this, Func<T, bool> @where) | ||||
|     { | ||||
|         foreach (var obj in @this.Where(where).ToList()) | ||||
|         var del = new List<T>(); | ||||
|         foreach (var obj in @this.Where(where)) | ||||
|         { | ||||
|             del.Add(obj); | ||||
|         } | ||||
|         foreach (var obj in del) | ||||
|         { | ||||
|             @this.Remove(obj); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     public static IEnumerable<T> WhereIf<T>(this IEnumerable<T> thisValue, bool isOk, Func<T, bool> predicate) | ||||
|     { | ||||
|   | ||||
| @@ -0,0 +1,34 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| //  此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充 | ||||
| //  此代码版权(除特别声明外的代码)归作者本人Diego所有 | ||||
| //  源代码使用协议遵循本仓库的开源协议及附加协议 | ||||
| //  Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway | ||||
| //  Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway | ||||
| //  使用文档:https://thingsgateway.cn/ | ||||
| //  QQ群:605534569 | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| using Newtonsoft.Json; | ||||
|  | ||||
| using System.Text; | ||||
|  | ||||
| namespace ThingsGateway.Foundation; | ||||
|  | ||||
|  | ||||
| /// <inheritdoc/> | ||||
| public class NewtonsoftEncodingConverter : Newtonsoft.Json.JsonConverter<Encoding> | ||||
| { | ||||
|     /// <inheritdoc/> | ||||
|     public override Encoding? ReadJson(JsonReader reader, Type objectType, Encoding? existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer) | ||||
|     { | ||||
|         // 从 JSON 字符串中读取编码名称,并创建相应的 Encoding 对象 | ||||
|         string? encodingName = reader.Value as string; | ||||
|         return Encoding.GetEncoding(encodingName ?? Encoding.UTF8.WebName); | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc/> | ||||
|     public override void WriteJson(JsonWriter writer, Encoding? value, Newtonsoft.Json.JsonSerializer serializer) | ||||
|     { | ||||
|         writer.WriteValue(value.WebName); | ||||
|     } | ||||
| } | ||||
| @@ -8,6 +8,7 @@ | ||||
| // 项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。 | ||||
| // 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。 | ||||
| // ------------------------------------------------------------------------ | ||||
| #if NET6_0_OR_GREATER | ||||
| 
 | ||||
| using Newtonsoft.Json; | ||||
| using Newtonsoft.Json.Linq; | ||||
| @@ -17,7 +18,6 @@ namespace ThingsGateway.JsonSerialization; | ||||
| /// <summary> | ||||
| /// DateOnly 类型序列化 | ||||
| /// </summary> | ||||
| [SuppressSniffer] | ||||
| public class NewtonsoftJsonDateOnlyJsonConverter : JsonConverter<DateOnly> | ||||
| { | ||||
|     /// <summary> | ||||
| @@ -72,7 +72,6 @@ public class NewtonsoftJsonDateOnlyJsonConverter : JsonConverter<DateOnly> | ||||
| /// <summary> | ||||
| /// DateOnly? 类型序列化 | ||||
| /// </summary> | ||||
| [SuppressSniffer] | ||||
| public class NewtonsoftJsonNullableDateOnlyJsonConverter : JsonConverter<DateOnly?> | ||||
| { | ||||
|     /// <summary> | ||||
| @@ -123,4 +122,6 @@ public class NewtonsoftJsonNullableDateOnlyJsonConverter : JsonConverter<DateOnl | ||||
|         if (value == null) writer.WriteNull(); | ||||
|         else writer.WriteValue(value.Value.ToString(Format)); | ||||
|     } | ||||
| } | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| @@ -16,7 +16,7 @@ namespace ThingsGateway.JsonSerialization; | ||||
| /// <summary> | ||||
| /// DateTime 类型序列化 | ||||
| /// </summary> | ||||
| [SuppressSniffer] | ||||
| 
 | ||||
| public class NewtonsoftJsonDateTimeJsonConverter : JsonConverter<DateTime> | ||||
| { | ||||
|     /// <summary> | ||||
| @@ -90,7 +90,7 @@ public class NewtonsoftJsonDateTimeJsonConverter : JsonConverter<DateTime> | ||||
| /// <summary> | ||||
| /// DateTime 类型序列化 | ||||
| /// </summary> | ||||
| [SuppressSniffer] | ||||
| 
 | ||||
| public class NewtonsoftNullableJsonDateTimeJsonConverter : JsonConverter<DateTime?> | ||||
| { | ||||
|     /// <summary> | ||||
| @@ -16,7 +16,6 @@ namespace ThingsGateway.JsonSerialization; | ||||
| /// <summary> | ||||
| /// DateTimeOffset 类型序列化 | ||||
| /// </summary> | ||||
| [SuppressSniffer] | ||||
| public class NewtonsoftJsonDateTimeOffsetJsonConverter : JsonConverter<DateTimeOffset> | ||||
| { | ||||
|     /// <summary> | ||||
| @@ -90,7 +89,6 @@ public class NewtonsoftJsonDateTimeOffsetJsonConverter : JsonConverter<DateTimeO | ||||
| /// <summary> | ||||
| /// DateTimeOffset 类型序列化 | ||||
| /// </summary> | ||||
| [SuppressSniffer] | ||||
| public class NewtonsoftJsonNullableDateTimeOffsetJsonConverter : JsonConverter<DateTimeOffset?> | ||||
| { | ||||
|     /// <summary> | ||||
| @@ -8,7 +8,7 @@ | ||||
| // 项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。 | ||||
| // 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。 | ||||
| // ------------------------------------------------------------------------ | ||||
| 
 | ||||
| #if NET6_0_OR_GREATER | ||||
| using Newtonsoft.Json; | ||||
| using Newtonsoft.Json.Linq; | ||||
| 
 | ||||
| @@ -18,7 +18,6 @@ namespace ThingsGateway.JsonSerialization; | ||||
| /// <summary> | ||||
| /// <see cref="System.Text.Json.Nodes.JsonObject"/> 类型序列化 | ||||
| /// </summary> | ||||
| [SuppressSniffer] | ||||
| public class NewtonsoftJsonJsonObjectJsonConverter : JsonConverter<System.Text.Json.Nodes.JsonObject> | ||||
| { | ||||
|     /// <summary> | ||||
| @@ -50,7 +49,6 @@ public class NewtonsoftJsonJsonObjectJsonConverter : JsonConverter<System.Text.J | ||||
| /// <summary> | ||||
| /// <see cref="System.Text.Json.Nodes.JsonArray"/> 类型序列化 | ||||
| /// </summary> | ||||
| [SuppressSniffer] | ||||
| public class NewtonsoftJsonJsonArrayJsonConverter : JsonConverter<System.Text.Json.Nodes.JsonArray> | ||||
| { | ||||
|     /// <summary> | ||||
| @@ -77,4 +75,6 @@ public class NewtonsoftJsonJsonArrayJsonConverter : JsonConverter<System.Text.Js | ||||
|     { | ||||
|         writer.WriteRawValue(value.ToJsonString()); | ||||
|     } | ||||
| } | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| @@ -17,7 +17,6 @@ namespace ThingsGateway.JsonSerialization; | ||||
| /// <summary> | ||||
| /// 解决 long 精度问题 | ||||
| /// </summary> | ||||
| [SuppressSniffer] | ||||
| public class NewtonsoftJsonLongToStringJsonConverter : JsonConverter<long> | ||||
| { | ||||
|     /// <summary> | ||||
| @@ -79,7 +78,6 @@ public class NewtonsoftJsonLongToStringJsonConverter : JsonConverter<long> | ||||
| /// <summary> | ||||
| /// 解决 long? 精度问题 | ||||
| /// </summary> | ||||
| [SuppressSniffer] | ||||
| public class NewtonsoftJsonNullableLongToStringJsonConverter : JsonConverter<long?> | ||||
| { | ||||
|     /// <summary> | ||||
| @@ -8,7 +8,7 @@ | ||||
| // 项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。 | ||||
| // 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。 | ||||
| // ------------------------------------------------------------------------ | ||||
| 
 | ||||
| #if NET6_0_OR_GREATER | ||||
| using Newtonsoft.Json; | ||||
| using Newtonsoft.Json.Linq; | ||||
| 
 | ||||
| @@ -17,7 +17,6 @@ namespace ThingsGateway.JsonSerialization; | ||||
| /// <summary> | ||||
| /// TimeOnly 类型序列化 | ||||
| /// </summary> | ||||
| [SuppressSniffer] | ||||
| public class NewtonsoftJsonTimeOnlyJsonConverter : JsonConverter<TimeOnly> | ||||
| { | ||||
|     /// <summary> | ||||
| @@ -72,7 +71,6 @@ public class NewtonsoftJsonTimeOnlyJsonConverter : JsonConverter<TimeOnly> | ||||
| /// <summary> | ||||
| /// TimeOnly? 类型序列化 | ||||
| /// </summary> | ||||
| [SuppressSniffer] | ||||
| public class NewtonsoftJsonNullableTimeOnlyJsonConverter : JsonConverter<TimeOnly?> | ||||
| { | ||||
|     /// <summary> | ||||
| @@ -123,4 +121,6 @@ public class NewtonsoftJsonNullableTimeOnlyJsonConverter : JsonConverter<TimeOnl | ||||
|         if (value == null) writer.WriteNull(); | ||||
|         else writer.WriteValue(value.Value.ToString(Format)); | ||||
|     } | ||||
| } | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user