diff --git a/Directory.Build.props b/Directory.Build.props index 21d37017b..b8046faa6 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -13,14 +13,14 @@ NU1510;SYSLIB5007;CS8603;CS8618;CS1591;CS8625;CS8602;CS8604;CS8600;CS8601;CS8714;CS8619;CS8629;CS8765;CS8634;CS8621;CS8767;CS8633;CS8620;CS8610;CS8631;CS8605;CS8622;CS8613;NU5100;NU5104;NU1903;NU1902;CA1863;CA1812;CA1805;CA1515;CA1508;CA1819;CA1852;CA5394;CA1822;CA1815;CA1813;CA2000;CA5358;CA5384;CA5400;CA5401;CA1814;CA1835;CA5392;CA5350;CA2100;CA1848;CA1810;CA1513;CA5351;CA1510;CA1512;CA1823;RCS1102;RCS1194;NETSDK1206 4.0.0-rc.49 - 12.2.12 - 12.2.1 - 12.2.3 - 12.2.3 - 12.2.9 + 12.4.4 + 12.4.4 + 12.4.4 + 12.4.4 + 12.4.4 - 12.2.1 + 12.4.4 preview diff --git a/ThingsGateway.slnx b/ThingsGateway.slnx index 61ee63243..cb6db4988 100644 --- a/ThingsGateway.slnx +++ b/ThingsGateway.slnx @@ -3,6 +3,7 @@ + diff --git a/src/ThingsGateway.Debug.Photino/SingleFilePublish.cs b/src/ThingsGateway.Debug.Photino/SingleFilePublish.cs new file mode 100644 index 000000000..c49f8d17a --- /dev/null +++ b/src/ThingsGateway.Debug.Photino/SingleFilePublish.cs @@ -0,0 +1,50 @@ +//------------------------------------------------------------------------------ +// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充 +// 此代码版权(除特别声明外的代码)归作者本人Diego所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议 +// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway +// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway +// 使用文档:https://thingsgateway.cn/ +// QQ群:605534569 +//------------------------------------------------------------------------------ + +using System.Reflection; + +namespace ThingsGateway.Server; + +/// +/// 解决单文件发布程序集扫描问题 +/// +public class SingleFilePublish : ISingleFilePublish +{ + /// + /// 解决单文件不能扫描的程序集 + /// + /// 和 可同时配置 + /// + public Assembly[] IncludeAssemblies() + { + return Array.Empty(); + } + + /// + /// 解决单文件不能扫描的程序集名称 + /// + /// 和 可同时配置 + /// + public string[] IncludeAssemblyNames() + { + return + [ + "ThingsGateway.AspNetCore", + "ThingsGateway.Foundation.Common", + "ThingsGateway.Common", + "ThingsGateway.Razor", + "ThingsGateway.Debug.ProRazor", + "ThingsGateway.Debug.Razor", + + "ThingsGateway.Foundation" , + "ThingsGateway.Foundation.Razor", + ]; + } +} diff --git a/src/ThingsGateway.Debug.Photino/ThingsGateway.Debug.Photino.csproj b/src/ThingsGateway.Debug.Photino/ThingsGateway.Debug.Photino.csproj index 389622cbc..084b1dfcc 100644 --- a/src/ThingsGateway.Debug.Photino/ThingsGateway.Debug.Photino.csproj +++ b/src/ThingsGateway.Debug.Photino/ThingsGateway.Debug.Photino.csproj @@ -35,19 +35,22 @@ + + + + + + + + + + + + - - - - - - - - - diff --git a/src/ThingsGateway.Foundation.Razor/ThingsGateway.Foundation.Razor.csproj b/src/ThingsGateway.Foundation.Razor/ThingsGateway.Foundation.Razor.csproj index 60b85e9c3..487fe580f 100644 --- a/src/ThingsGateway.Foundation.Razor/ThingsGateway.Foundation.Razor.csproj +++ b/src/ThingsGateway.Foundation.Razor/ThingsGateway.Foundation.Razor.csproj @@ -6,11 +6,21 @@ + + + + + + + + + + diff --git a/src/ThingsGateway.Gateway.Application/ThingsGateway.Gateway.Application.csproj b/src/ThingsGateway.Gateway.Application/ThingsGateway.Gateway.Application.csproj index fc623f6ec..21496f6ee 100644 --- a/src/ThingsGateway.Gateway.Application/ThingsGateway.Gateway.Application.csproj +++ b/src/ThingsGateway.Gateway.Application/ThingsGateway.Gateway.Application.csproj @@ -13,7 +13,6 @@ - @@ -54,15 +53,27 @@ - + + + + + + + + + + + + + diff --git a/src/ThingsGateway.Gateway.Razor.Common/GlobalUsings.cs b/src/ThingsGateway.Gateway.Razor.Common/GlobalUsings.cs new file mode 100644 index 000000000..ee83ca24f --- /dev/null +++ b/src/ThingsGateway.Gateway.Razor.Common/GlobalUsings.cs @@ -0,0 +1,42 @@ +//------------------------------------------------------------------------------ +// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充 +// 此代码版权(除特别声明外的代码)归作者本人Diego所有 +// 源代码使用协议遵循本仓库的开源协议及附加协议 +// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway +// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway +// 使用文档:https://thingsgateway.cn/ +// QQ群:605534569 +//------------------------------------------------------------------------------ + +global using BootstrapBlazor.Components; + +global using Microsoft.AspNetCore.Components; +global using Microsoft.Extensions.Localization; + +global using System.Diagnostics.CodeAnalysis; + +global using ThingsGateway.Common; +global using ThingsGateway.Foundation; +global using ThingsGateway.Foundation.Common; +global using ThingsGateway.Foundation.Common.Extension; +global using ThingsGateway.Gateway.Application; +global using ThingsGateway.Razor; + +#if !Management +global using ChannelRuntime = ThingsGateway.Gateway.Application.ChannelRuntime; +global using DeviceRuntime = ThingsGateway.Gateway.Application.DeviceRuntime; +global using VariableRuntime = ThingsGateway.Gateway.Application.VariableRuntime; +global using IVariablePageService = ThingsGateway.Gateway.Application.IVariablePageService; +global using IDevicePageService = ThingsGateway.Gateway.Application.IDevicePageService; +#else +global using ChannelRuntime = ThingsGateway.Management.Application.ChannelRuntime; +global using DeviceRuntime = ThingsGateway.Management.Application.DeviceRuntime; +global using VariableRuntime = ThingsGateway.Management.Application.VariableRuntime; +global using IVariablePageService = ThingsGateway.Management.Application.IVariablePageService; +global using IDevicePageService = ThingsGateway.Management.Application.IDevicePageService; +global using IChannelPageService = ThingsGateway.Management.Application.IChannelPageService; +#endif + +[assembly: SuppressMessage("Reliability", "CA2007", Justification = "<挂起>", Scope = "module")] + +[assembly: GlobalGenerateSetParametersAsync(true)] \ No newline at end of file diff --git a/src/ThingsGateway.Gateway.Razor/Mapper/GatewayMapper.cs b/src/ThingsGateway.Gateway.Razor.Common/Mapper/GatewayMapper.cs similarity index 100% rename from src/ThingsGateway.Gateway.Razor/Mapper/GatewayMapper.cs rename to src/ThingsGateway.Gateway.Razor.Common/Mapper/GatewayMapper.cs diff --git a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/PropertyComponent.razor b/src/ThingsGateway.Gateway.Razor.Common/PropertyComponent.razor similarity index 90% rename from src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/PropertyComponent.razor rename to src/ThingsGateway.Gateway.Razor.Common/PropertyComponent.razor index d0455d446..f635ddf8f 100644 --- a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/PropertyComponent.razor +++ b/src/ThingsGateway.Gateway.Razor.Common/PropertyComponent.razor @@ -24,8 +24,8 @@
-
@@ -34,8 +34,8 @@
-
@@ -44,8 +44,8 @@
-
diff --git a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/PropertyComponent.razor.cs b/src/ThingsGateway.Gateway.Razor.Common/PropertyComponent.razor.cs similarity index 99% rename from src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/PropertyComponent.razor.cs rename to src/ThingsGateway.Gateway.Razor.Common/PropertyComponent.razor.cs index 8d2721b00..9098d0013 100644 --- a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/PropertyComponent.razor.cs +++ b/src/ThingsGateway.Gateway.Razor.Common/PropertyComponent.razor.cs @@ -36,9 +36,6 @@ public partial class PropertyComponent : IPropertyUIBase return base.OnParametersSetAsync(); } - [Inject] - private IStringLocalizer Localizer { get; set; } - public static async Task CheckScript(BusinessPropertyWithCacheIntervalScript businessProperty, string pname, string title, object receiver, DialogService dialogService) { string script = null; diff --git a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/ScriptCheck.razor b/src/ThingsGateway.Gateway.Razor.Common/ScriptCheck.razor similarity index 82% rename from src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/ScriptCheck.razor rename to src/ThingsGateway.Gateway.Razor.Common/ScriptCheck.razor index ae69f6c73..f71a6a337 100644 --- a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/ScriptCheck.razor +++ b/src/ThingsGateway.Gateway.Razor.Common/ScriptCheck.razor @@ -6,13 +6,13 @@
- +
- + @(new MarkupString("注意 raw 参数 为 object 类型,需要转换为实际类型操作")) @(new MarkupString("获取设备类实体,可用 GlobalData.ReadOnlyDevices 字典对象,键为设备名称,值为设备对象")) @(new MarkupString("获取变量类实体,可用方法 GlobalData.GetVariable(\"设备名称1\",\"变量名称1\") ")) @@ -22,18 +22,18 @@
- +
- +
diff --git a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/ScriptCheck.razor.cs b/src/ThingsGateway.Gateway.Razor.Common/ScriptCheck.razor.cs similarity index 95% rename from src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/ScriptCheck.razor.cs rename to src/ThingsGateway.Gateway.Razor.Common/ScriptCheck.razor.cs index 4f1505c3d..3156b4d26 100644 --- a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/ScriptCheck.razor.cs +++ b/src/ThingsGateway.Gateway.Razor.Common/ScriptCheck.razor.cs @@ -44,8 +44,6 @@ public partial class ScriptCheck Output = ex.ToString(); } } - [Inject] - private IStringLocalizer Localizer { get; set; } private async Task GetDemo(Microsoft.AspNetCore.Components.Web.MouseEventArgs args) { diff --git a/src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/ScriptCheck.razor.css b/src/ThingsGateway.Gateway.Razor.Common/ScriptCheck.razor.css similarity index 100% rename from src/ThingsGateway.Gateway.Razor/Pages/GatewayMonitorPage/Device/ScriptCheck.razor.css rename to src/ThingsGateway.Gateway.Razor.Common/ScriptCheck.razor.css diff --git a/src/ThingsGateway.Gateway.Razor/Components/TcpServiceComponent.razor b/src/ThingsGateway.Gateway.Razor.Common/TcpServiceComponent.razor similarity index 100% rename from src/ThingsGateway.Gateway.Razor/Components/TcpServiceComponent.razor rename to src/ThingsGateway.Gateway.Razor.Common/TcpServiceComponent.razor diff --git a/src/ThingsGateway.Gateway.Razor/Components/TcpServiceComponent.razor.cs b/src/ThingsGateway.Gateway.Razor.Common/TcpServiceComponent.razor.cs similarity index 100% rename from src/ThingsGateway.Gateway.Razor/Components/TcpServiceComponent.razor.cs rename to src/ThingsGateway.Gateway.Razor.Common/TcpServiceComponent.razor.cs diff --git a/src/ThingsGateway.Gateway.Razor/Components/TcpSessionClientDto.cs b/src/ThingsGateway.Gateway.Razor.Common/TcpSessionClientDto.cs similarity index 100% rename from src/ThingsGateway.Gateway.Razor/Components/TcpSessionClientDto.cs rename to src/ThingsGateway.Gateway.Razor.Common/TcpSessionClientDto.cs diff --git a/src/ThingsGateway.Gateway.Razor.Common/ThingsGateway.Gateway.Razor.Common.csproj b/src/ThingsGateway.Gateway.Razor.Common/ThingsGateway.Gateway.Razor.Common.csproj new file mode 100644 index 000000000..0c76548ff --- /dev/null +++ b/src/ThingsGateway.Gateway.Razor.Common/ThingsGateway.Gateway.Razor.Common.csproj @@ -0,0 +1,36 @@ + + + + + net8.0;$(OtherTargetFrameworks); + + + + + + + compile; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ThingsGateway.Gateway.Razor.Common/_Imports.razor b/src/ThingsGateway.Gateway.Razor.Common/_Imports.razor new file mode 100644 index 000000000..056c5b288 --- /dev/null +++ b/src/ThingsGateway.Gateway.Razor.Common/_Imports.razor @@ -0,0 +1,27 @@ + +@using System.Net.Http +@using System.Net.Http.Json +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.JSInterop +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.Extensions.Localization + +@using System.ComponentModel +@using System.ComponentModel.DataAnnotations + +@using BootstrapBlazor.Components + + +@using ThingsGateway.Razor; + + +@using ChannelRuntime = ThingsGateway.Gateway.Application.ChannelRuntime; +@using DeviceRuntime = ThingsGateway.Gateway.Application.DeviceRuntime; +@using VariableRuntime = ThingsGateway.Gateway.Application.VariableRuntime; +@using IVariablePageService = ThingsGateway.Gateway.Application.IVariablePageService; +@using IDevicePageService = ThingsGateway.Gateway.Application.IDevicePageService; +@using IChannelPageService = ThingsGateway.Gateway.Application.IChannelPageService; diff --git a/src/ThingsGateway.Gateway.Razor/ThingsGateway.Gateway.Razor.csproj b/src/ThingsGateway.Gateway.Razor/ThingsGateway.Gateway.Razor.csproj index 99e924ad6..ddd3fa1a3 100644 --- a/src/ThingsGateway.Gateway.Razor/ThingsGateway.Gateway.Razor.csproj +++ b/src/ThingsGateway.Gateway.Razor/ThingsGateway.Gateway.Razor.csproj @@ -5,13 +5,12 @@ net8.0;$(OtherTargetFrameworks); - + compile; build; native; contentfiles; analyzers; buildtransitive - @@ -25,9 +24,20 @@ true - - + + + + + + + + + + + + + diff --git a/src/ThingsGateway.Photino/Program.cs b/src/ThingsGateway.Photino/Program.cs index 9d3c12480..850e8ea16 100644 --- a/src/ThingsGateway.Photino/Program.cs +++ b/src/ThingsGateway.Photino/Program.cs @@ -134,6 +134,6 @@ internal sealed class Program return false; }; hybridApp.Run(); - Thread.Sleep(2000); + Thread.Sleep(1000); } } diff --git a/src/ThingsGateway.Photino/ThingsGateway.Photino.csproj b/src/ThingsGateway.Photino/ThingsGateway.Photino.csproj index dfdc78cf8..2eec80402 100644 --- a/src/ThingsGateway.Photino/ThingsGateway.Photino.csproj +++ b/src/ThingsGateway.Photino/ThingsGateway.Photino.csproj @@ -7,28 +7,31 @@ - + + + + - - + - - - - - - - + - + + + + + + + + diff --git a/src/ThingsGateway.ScriptDebug/ThingsGateway.ScriptDebug.csproj b/src/ThingsGateway.ScriptDebug/ThingsGateway.ScriptDebug.csproj index 56c31b012..72f834056 100644 --- a/src/ThingsGateway.ScriptDebug/ThingsGateway.ScriptDebug.csproj +++ b/src/ThingsGateway.ScriptDebug/ThingsGateway.ScriptDebug.csproj @@ -1,16 +1,23 @@ - - - + + + + + + + + + + + + diff --git a/src/ThingsGateway.ScriptDebug/targets/PluginDebug.targets b/src/ThingsGateway.ScriptDebug/targets/PluginDebug.targets index 6a72e913c..ccc93625e 100644 --- a/src/ThingsGateway.ScriptDebug/targets/PluginDebug.targets +++ b/src/ThingsGateway.ScriptDebug/targets/PluginDebug.targets @@ -1,16 +1,16 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/src/ThingsGateway.ScriptDebug/targets/Pro2.targets b/src/ThingsGateway.ScriptDebug/targets/Pro2.targets index b26b38f65..d899444ea 100644 --- a/src/ThingsGateway.ScriptDebug/targets/Pro2.targets +++ b/src/ThingsGateway.ScriptDebug/targets/Pro2.targets @@ -30,7 +30,7 @@ - + diff --git a/src/ThingsGateway.ScriptDebug/targets/ProPluginDebug.targets b/src/ThingsGateway.ScriptDebug/targets/ProPluginDebug.targets index be380f7f3..69f8cfff5 100644 --- a/src/ThingsGateway.ScriptDebug/targets/ProPluginDebug.targets +++ b/src/ThingsGateway.ScriptDebug/targets/ProPluginDebug.targets @@ -1,38 +1,38 @@ - + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - + + - - - - + + + + diff --git a/src/ThingsGateway.Server/DockerPush.ps1 b/src/ThingsGateway.Server/DockerPush.ps1 index 8e225bb63..b5efed0ad 100644 --- a/src/ThingsGateway.Server/DockerPush.ps1 +++ b/src/ThingsGateway.Server/DockerPush.ps1 @@ -1,4 +1,4 @@ -docker pull mcr.microsoft.com/dotnet/aspnet:8.0-noble +docker pull mcr.microsoft.com/dotnet/aspnet:10.0-noble-amd64 docker build -t registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway:latest . diff --git a/src/ThingsGateway.Server/DockerPush_arm64.ps1 b/src/ThingsGateway.Server/DockerPush_arm64.ps1 index 411b9cf63..acf1002a2 100644 --- a/src/ThingsGateway.Server/DockerPush_arm64.ps1 +++ b/src/ThingsGateway.Server/DockerPush_arm64.ps1 @@ -1,4 +1,4 @@ -docker pull mcr.microsoft.com/dotnet/aspnet:8.0-noble-arm64v8 +docker pull mcr.microsoft.com/dotnet/aspnet:10.0-noble-arm64v8 docker build -f Dockerfile_arm64 -t registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway_arm64:latest . diff --git a/src/ThingsGateway.Server/Dockerfile b/src/ThingsGateway.Server/Dockerfile index 5c5b4dbd1..140321461 100644 --- a/src/ThingsGateway.Server/Dockerfile +++ b/src/ThingsGateway.Server/Dockerfile @@ -4,8 +4,8 @@ #拉取:docker pull registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway #推送:docker push registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway -#aspnetcore8.0环境 -FROM mcr.microsoft.com/dotnet/aspnet:8.0-noble AS base +#aspnetcore10.0环境 +FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble-amd64 AS base COPY . /app WORKDIR /app #默认web @@ -13,10 +13,9 @@ EXPOSE 5000 # 添加时区环境变量,亚洲,上海 ENV TimeZone=Asia/Shanghai +ENV TZ=Asia/Shanghai # 转发头 ENV ASPNETCORE_FORWARDEDHEADERS_ENABLED=true -# 使用软连接,并且将时区配置覆盖/etc/timezone -RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone ENTRYPOINT ["dotnet", "ThingsGateway.Server.dll","--urls","http://*:5000"] diff --git a/src/ThingsGateway.Server/Dockerfile_arm64 b/src/ThingsGateway.Server/Dockerfile_arm64 index 4f0b31e19..bff219a2e 100644 --- a/src/ThingsGateway.Server/Dockerfile_arm64 +++ b/src/ThingsGateway.Server/Dockerfile_arm64 @@ -4,8 +4,8 @@ #拉取:docker pull registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway_arm64 #推送:docker push registry.cn-shenzhen.aliyuncs.com/thingsgateway/thingsgateway_arm64 -#aspnetcore8.0环境 -FROM mcr.microsoft.com/dotnet/aspnet:8.0-noble-arm64v8 AS base +#aspnetcore10.0环境 +FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble-arm64v8 AS base COPY . /app WORKDIR /app #默认web @@ -13,9 +13,8 @@ EXPOSE 5000 # 添加时区环境变量,亚洲,上海 ENV TimeZone=Asia/Shanghai +ENV TZ=Asia/Shanghai # 转发头 ENV ASPNETCORE_FORWARDEDHEADERS_ENABLED=true -# 使用软连接,并且将时区配置覆盖/etc/timezone -RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone ENTRYPOINT ["dotnet", "ThingsGateway.Server.dll","--urls","http://*:5000"] diff --git a/src/ThingsGateway.Server/ThingsGateway.Server.csproj b/src/ThingsGateway.Server/ThingsGateway.Server.csproj index 8ddb7e4d3..25b692ecc 100644 --- a/src/ThingsGateway.Server/ThingsGateway.Server.csproj +++ b/src/ThingsGateway.Server/ThingsGateway.Server.csproj @@ -1,23 +1,24 @@ - - + - - - - - - + - + + + + + + + + diff --git a/src/ThingsGateway.Server/targets/PluginDebug.targets b/src/ThingsGateway.Server/targets/PluginDebug.targets index 6a72e913c..ccc93625e 100644 --- a/src/ThingsGateway.Server/targets/PluginDebug.targets +++ b/src/ThingsGateway.Server/targets/PluginDebug.targets @@ -1,16 +1,16 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/src/ThingsGateway.Server/targets/Pro2.targets b/src/ThingsGateway.Server/targets/Pro2.targets index 2a90e97d0..0e805c79b 100644 --- a/src/ThingsGateway.Server/targets/Pro2.targets +++ b/src/ThingsGateway.Server/targets/Pro2.targets @@ -30,7 +30,7 @@ - + diff --git a/src/ThingsGateway.Server/targets/ProPluginDebug.targets b/src/ThingsGateway.Server/targets/ProPluginDebug.targets index 922805fd3..69f8cfff5 100644 --- a/src/ThingsGateway.Server/targets/ProPluginDebug.targets +++ b/src/ThingsGateway.Server/targets/ProPluginDebug.targets @@ -1,39 +1,38 @@ - + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - + + + + diff --git a/wiki.json b/wiki.json new file mode 100644 index 000000000..84b24f797 --- /dev/null +++ b/wiki.json @@ -0,0 +1,302 @@ +{ + "repo_notes": [ + { + "content": "" + } + ], + "pages": [ + { + "title": "Overview", + "purpose": "Introduce ThingsGateway, explaining what it is, its core purpose as an industrial IoT gateway, and the high-level architecture", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Key Features", + "purpose": "List and describe the main features including multi-protocol support, plugin architecture, data persistence options, and deployment models", + "parent": "Overview", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "System Requirements and Dependencies", + "purpose": "Document the .NET versions, target frameworks, required NuGet packages, and system requirements", + "parent": "Overview", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Getting Started", + "purpose": "Provide quick-start guide for installing and running ThingsGateway", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Installation and Deployment", + "purpose": "Explain deployment options including Docker (x64/ARM64), web server, desktop application, and configuration basics", + "parent": "Getting Started", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Initial Configuration", + "purpose": "Guide users through initial setup including appsettings.json, environment variables, logging configuration, and first channel/device setup", + "parent": "Getting Started", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Architecture Overview", + "purpose": "Explain the overall system architecture including layered design, separation of concerns, and component relationships", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Layered Architecture", + "purpose": "Describe the Foundation, Gateway Application, and UI/Admin layers and their responsibilities", + "parent": "Architecture Overview", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Plugin System Architecture", + "purpose": "Explain the plugin architecture including Foundation vs Plugin layer separation, dynamic loading with AssemblyLoadContext, and plugin types", + "parent": "Architecture Overview", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Build System and Conditional Compilation", + "purpose": "Document the MSBuild-based build system including Directory.Build.props, conditional plugin loading, multi-targeting, and NuGet package generation", + "parent": "Architecture Overview", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Foundation Layer", + "purpose": "Document the core foundation libraries that provide protocol implementations and communication primitives", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Device Communication", + "purpose": "Explain DeviceBase abstraction, IDevice interface, protocol implementations, read/write operations, and data parsing", + "parent": "Foundation Layer", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Channel Architecture", + "purpose": "Document IChannel interface, channel implementations (TCP/UDP/Serial), channel options, and connection lifecycle", + "parent": "Foundation Layer", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Data Handling and Transformation", + "purpose": "Describe DataHandlingAdapter, message parsing, ThingsGatewayBitConverter for endianness/format conversion, and WaitHandlePool for request-response correlation", + "parent": "Foundation Layer", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Core Utilities", + "purpose": "Document TimerX scheduling, ExpiringDictionary caching, WaitLock concurrency primitives, and Reflect utilities", + "parent": "Foundation Layer", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Gateway Application", + "purpose": "Explain the main gateway application layer that orchestrates device communication and data flow", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Runtime Management System", + "purpose": "Document the entity-to-runtime conversion, GlobalData static registry, RuntimeServiceHelper, and runtime synchronization", + "parent": "Gateway Application", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Device Lifecycle Management", + "purpose": "Explain DeviceThreadManage, driver initialization, StartAsync/StopAsync lifecycle, TaskSchedulerLoop, and thread management", + "parent": "Gateway Application", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Variable Management", + "purpose": "Document VariableRuntime, VariableSourceRead, variable packing optimization, and data collection workflow", + "parent": "Gateway Application", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Concurrency and Read/Write Coordination", + "purpose": "Explain AsyncReadWriteLock, reader/writer priority, duty cycle control, and concurrent operation management", + "parent": "Gateway Application", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Event System", + "purpose": "Document GlobalData event dispatchers, VariableValueChangeEvent, DeviceStatusChangeEvent, AlarmChangedEvent, and event flow", + "parent": "Gateway Application", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Redundancy and Failover", + "purpose": "Explain device redundancy system, master/slave configuration, failover triggers, and variable state transfer", + "parent": "Gateway Application", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Plugin Development", + "purpose": "Guide for developing custom plugins for data collection and business logic integration", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Collection Plugins (CollectBase)", + "purpose": "Document how to create data collection plugins including protocol implementation, variable loading, and scheduled tasks", + "parent": "Plugin Development", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Business Plugins (BusinessBase)", + "purpose": "Explain business plugin development for data persistence, distribution, and serving protocols", + "parent": "Plugin Development", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Plugin Service and Dynamic Loading", + "purpose": "Document PluginService, AssemblyLoadContext usage, plugin discovery, driver instantiation, and property configuration", + "parent": "Plugin Development", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Plugin Packaging and Distribution", + "purpose": "Explain how to package plugins as NuGet packages, versioning, and deployment via Directory.build.targets", + "parent": "Plugin Development", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Built-in Protocols", + "purpose": "Document the built-in protocol implementations including Modbus, Siemens S7, OPC UA, OPC DA, and Dlt645", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Modbus Protocol", + "purpose": "Document Modbus Master/Slave implementations, RTU/TCP/UDP support, function codes, and address parsing", + "parent": "Built-in Protocols", + "page_notes": [ + { + "content": "" + } + ] + }, + { + "title": "Siemens S7 Protocol", + "purpose": "Explain S7 Master implementation, PLC types, area addressing, and data block access", + "parent": "Built-in Protocols", + "page_notes": [ + { + "content": "" + } + ] + } + ] +}