From c88d934febd4eba67d11337f08981a3590d965e2 Mon Sep 17 00:00:00 2001 From: ChenYi <296215406@outlook.com> Date: Fri, 23 May 2025 14:19:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=A1=B9=E7=9B=AE=E6=9E=B6?= =?UTF-8?q?=E6=9E=84=EF=BC=8C=E6=96=B0=E5=A2=9E=E7=BB=9F=E4=B8=80=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E9=9B=86=E4=B8=AD=E5=A4=84=E7=90=86=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JiShe.CollectBus.sln | 62 +++++- .../SourceEntityAccessorFactory3.cs | 52 +++++ .../CollectBusApplicationModule.cs | 5 + .../BasicScheduledMeterReadingService.cs | 8 +- ...nergySystemScheduledMeterReadingService.cs | 4 +- .../CollectBusDomainModule.cs | 5 +- ...CollectBusEPOApplicationContractsModule.cs | 16 ++ .../CollectBusEPODtoExtensions.cs | 25 +++ .../Files/FileUploadOutputDto.cs | 7 + .../GlobalUsings.cs | 11 + ...CollectBusEPO.Application.Contracts.csproj | 17 ++ .../Jobs/IRecurringJob.cs | 11 + ...llectBusEPOPermissionDefinitionProvider.cs | 17 ++ .../Permissions/CollectBusEPOPermissions.cs | 15 ++ .../CollectBusEPOAppService.cs | 30 +++ .../CollectBusEPOApplicationModule.cs | 32 +++ .../EntityHandler.cs | 21 ++ .../GlobalUsings.cs | 9 + .../JiShe.CollectBusEPO.Application.csproj | 17 ++ .../Properties/AssemblyInfo.cs | 2 + .../SourceEntityAccessorFactory2.cs | 1 + .../.config/dotnet-tools.json | 13 ++ .../CollectBusEPOHttpApiHostConst.cs | 45 ++++ ...ollectBusEPOHttpApiHostModule.Configure.cs | 179 ++++++++++++++++ .../CollectBusEPOHttpApiHostModule.cs | 73 +++++++ .../Controllers/HomeController.cs | 31 +++ .../Docker/Dockerfile | 47 +++++ .../Docker/dockerbuild_dev.ps1 | 26 +++ .../Docker/dockerbuild_pro.ps1 | 26 +++ .../Docker/sources.list | 10 + .../Extensions/HealthCheck/Extensions.cs | 88 ++++++++ .../HealthCheck/HealthCheckResponse.cs | 25 +++ .../GlobalUsings.cs | 32 +++ .../JiShe.CollectBusEPO.HttpApi.Host.csproj | 62 ++++++ .../Pages/Monitor.cshtml | 193 ++++++++++++++++++ .../Pages/Monitor.cshtml.cs | 12 ++ .../Program.cs | 39 ++++ .../Properties/launchSettings.json | 13 ++ .../Startup.cs | 23 +++ .../Swaggers/EnumSchemaFilter.cs | 24 +++ .../Swaggers/HiddenAbpDefaultApiFilter.cs | 54 +++++ .../Swaggers/SwaggerConfig.cs | 11 + .../appsettings.Development.json | 3 + .../appsettings.Production.json | 3 + .../appsettings.json | 104 ++++++++++ .../tempkey.jwk | 1 + .../tempkey.rsa | 1 + .../wwwroot/TemporaryFiles/.gitkeep | 0 .../wwwroot/images/cap.png | Bin 0 -> 11113 bytes .../wwwroot/images/hangfire.png | Bin 0 -> 36278 bytes .../wwwroot/images/healthchecks.png | Bin 0 -> 8990 bytes .../wwwroot/images/miniprofiler.png | Bin 0 -> 22147 bytes .../wwwroot/images/more.png | Bin 0 -> 20558 bytes .../wwwroot/images/swagger.png | Bin 0 -> 38571 bytes .../CollectBusEPOHttpApiModule.cs | 39 ++++ .../Controllers/CollectBusEPOController.cs | 14 ++ .../GlobalUsings.cs | 6 + .../JiShe.CollectBusEPO.HttpApi.csproj | 19 ++ 58 files changed, 1566 insertions(+), 17 deletions(-) create mode 100644 modules/JiShe.CollectBus.IoTDB/SourceEntityAccessorFactory3.cs create mode 100644 services/JiShe.CollectBusEPO.Application.Contracts/CollectBusEPOApplicationContractsModule.cs create mode 100644 services/JiShe.CollectBusEPO.Application.Contracts/CollectBusEPODtoExtensions.cs create mode 100644 services/JiShe.CollectBusEPO.Application.Contracts/Files/FileUploadOutputDto.cs create mode 100644 services/JiShe.CollectBusEPO.Application.Contracts/GlobalUsings.cs create mode 100644 services/JiShe.CollectBusEPO.Application.Contracts/JiShe.CollectBusEPO.Application.Contracts.csproj create mode 100644 services/JiShe.CollectBusEPO.Application.Contracts/Jobs/IRecurringJob.cs create mode 100644 services/JiShe.CollectBusEPO.Application.Contracts/Permissions/CollectBusEPOPermissionDefinitionProvider.cs create mode 100644 services/JiShe.CollectBusEPO.Application.Contracts/Permissions/CollectBusEPOPermissions.cs create mode 100644 services/JiShe.CollectBusEPO.Application/CollectBusEPOAppService.cs create mode 100644 services/JiShe.CollectBusEPO.Application/CollectBusEPOApplicationModule.cs create mode 100644 services/JiShe.CollectBusEPO.Application/EntityHandler.cs create mode 100644 services/JiShe.CollectBusEPO.Application/GlobalUsings.cs create mode 100644 services/JiShe.CollectBusEPO.Application/JiShe.CollectBusEPO.Application.csproj create mode 100644 services/JiShe.CollectBusEPO.Application/Properties/AssemblyInfo.cs create mode 100644 shared/JiShe.CollectBus.Analyzers.Shared/SourceEntityAccessorFactory2.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/.config/dotnet-tools.json create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/CollectBusEPOHttpApiHostConst.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/CollectBusEPOHttpApiHostModule.Configure.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/CollectBusEPOHttpApiHostModule.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/Controllers/HomeController.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/Docker/Dockerfile create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/Docker/dockerbuild_dev.ps1 create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/Docker/dockerbuild_pro.ps1 create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/Docker/sources.list create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/Extensions/HealthCheck/Extensions.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/Extensions/HealthCheck/HealthCheckResponse.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/GlobalUsings.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/JiShe.CollectBusEPO.HttpApi.Host.csproj create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/Pages/Monitor.cshtml create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/Pages/Monitor.cshtml.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/Program.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/Properties/launchSettings.json create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/Startup.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/Swaggers/EnumSchemaFilter.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/Swaggers/HiddenAbpDefaultApiFilter.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/Swaggers/SwaggerConfig.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/appsettings.Development.json create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/appsettings.Production.json create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/appsettings.json create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/tempkey.jwk create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/tempkey.rsa create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/TemporaryFiles/.gitkeep create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/images/cap.png create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/images/hangfire.png create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/images/healthchecks.png create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/images/miniprofiler.png create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/images/more.png create mode 100644 web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/images/swagger.png create mode 100644 web/JiShe.CollectBusEPO.HttpApi/CollectBusEPOHttpApiModule.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi/Controllers/CollectBusEPOController.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi/GlobalUsings.cs create mode 100644 web/JiShe.CollectBusEPO.HttpApi/JiShe.CollectBusEPO.HttpApi.csproj diff --git a/JiShe.CollectBus.sln b/JiShe.CollectBus.sln index 272514c..c32791b 100644 --- a/JiShe.CollectBus.sln +++ b/JiShe.CollectBus.sln @@ -74,6 +74,26 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JiShe.CollectBus.Migration. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JiShe.CollectBus.Migration.HttpApi", "web\JiShe.CollectBus.Migration.HttpApi\JiShe.CollectBus.Migration.HttpApi.csproj", "{8A113DE5-7D50-6E6B-739F-B6EEAD5E13B4}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MainService", "MainService", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "EPOService", "EPOService", "{18207368-3C39-4346-85F7-A8B499B0B458}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MigrationService", "MigrationService", "{A31EC18C-956B-4FD2-AED6-609C33B467E9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JiShe.CollectBusEPO.Application.Contracts", "services\JiShe.CollectBusEPO.Application.Contracts\JiShe.CollectBusEPO.Application.Contracts.csproj", "{3B32D838-33BF-C08A-C447-3172CA62D42F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JiShe.CollectBusEPO.Application", "services\JiShe.CollectBusEPO.Application\JiShe.CollectBusEPO.Application.csproj", "{C71FF348-FB47-67E6-AF0D-6A8E48C5EDEA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JiShe.CollectBusEPO.HttpApi", "web\JiShe.CollectBusEPO.HttpApi\JiShe.CollectBusEPO.HttpApi.csproj", "{98FE468D-0C34-83D9-31BD-F59C44D00357}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JiShe.CollectBusEPO.HttpApi.Host", "web\JiShe.CollectBusEPO.HttpApi.Host\JiShe.CollectBusEPO.HttpApi.Host.csproj", "{A2DDA6F0-C760-0633-D576-E23A186504E4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MainHost", "MainHost", "{A38B5EB3-2F55-44A2-944B-31A73DE91402}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MigrationHost", "MigrationHost", "{C61007F8-51F5-409C-9FAF-DEF6A24DCDED}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "EPOHost", "EPOHost", "{8D1FD3D9-3FF0-4581-ACF0-45AF9D595774}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -184,6 +204,22 @@ Global {8A113DE5-7D50-6E6B-739F-B6EEAD5E13B4}.Debug|Any CPU.Build.0 = Debug|Any CPU {8A113DE5-7D50-6E6B-739F-B6EEAD5E13B4}.Release|Any CPU.ActiveCfg = Release|Any CPU {8A113DE5-7D50-6E6B-739F-B6EEAD5E13B4}.Release|Any CPU.Build.0 = Release|Any CPU + {3B32D838-33BF-C08A-C447-3172CA62D42F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B32D838-33BF-C08A-C447-3172CA62D42F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B32D838-33BF-C08A-C447-3172CA62D42F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B32D838-33BF-C08A-C447-3172CA62D42F}.Release|Any CPU.Build.0 = Release|Any CPU + {C71FF348-FB47-67E6-AF0D-6A8E48C5EDEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C71FF348-FB47-67E6-AF0D-6A8E48C5EDEA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C71FF348-FB47-67E6-AF0D-6A8E48C5EDEA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C71FF348-FB47-67E6-AF0D-6A8E48C5EDEA}.Release|Any CPU.Build.0 = Release|Any CPU + {98FE468D-0C34-83D9-31BD-F59C44D00357}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {98FE468D-0C34-83D9-31BD-F59C44D00357}.Debug|Any CPU.Build.0 = Debug|Any CPU + {98FE468D-0C34-83D9-31BD-F59C44D00357}.Release|Any CPU.ActiveCfg = Release|Any CPU + {98FE468D-0C34-83D9-31BD-F59C44D00357}.Release|Any CPU.Build.0 = Release|Any CPU + {A2DDA6F0-C760-0633-D576-E23A186504E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2DDA6F0-C760-0633-D576-E23A186504E4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2DDA6F0-C760-0633-D576-E23A186504E4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2DDA6F0-C760-0633-D576-E23A186504E4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -191,11 +227,11 @@ Global GlobalSection(NestedProjects) = preSolution {D64C1577-4929-4B60-939E-96DE1534891A} = {EBF7C01F-9B4F-48E6-8418-2CBFDA51EB0B} {F2840BC7-0188-4606-9126-DADD0F5ABF7A} = {BA4DA3E7-9AD0-47AD-A0E6-A0BB6700DA23} - {BD65D04F-08D5-40C1-8C24-77CA0BACB877} = {BA4DA3E7-9AD0-47AD-A0E6-A0BB6700DA23} - {78040F9E-3501-4A40-82DF-00A597710F35} = {BA4DA3E7-9AD0-47AD-A0E6-A0BB6700DA23} + {BD65D04F-08D5-40C1-8C24-77CA0BACB877} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {78040F9E-3501-4A40-82DF-00A597710F35} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} {F1C58097-4C08-4D88-8976-6B3389391481} = {2E0FE301-34C3-4561-9CAE-C7A9E65AEE59} - {077AA5F8-8B61-420C-A6B5-0150A66FDB34} = {A02F7D8A-04DC-44D6-94D4-3F65712D6B94} - {35829A15-4127-4F69-8BDE-9405DEAACA9A} = {A02F7D8A-04DC-44D6-94D4-3F65712D6B94} + {077AA5F8-8B61-420C-A6B5-0150A66FDB34} = {A38B5EB3-2F55-44A2-944B-31A73DE91402} + {35829A15-4127-4F69-8BDE-9405DEAACA9A} = {A38B5EB3-2F55-44A2-944B-31A73DE91402} {AD2F1928-4411-4511-B564-5FB996EC08B9} = {EBF7C01F-9B4F-48E6-8418-2CBFDA51EB0B} {8BA01C3D-297D-42DF-BD63-EF07202A0A67} = {BA4DA3E7-9AD0-47AD-A0E6-A0BB6700DA23} {FE0457D9-4038-4A17-8808-DCAD06CFC0A0} = {2E0FE301-34C3-4561-9CAE-C7A9E65AEE59} @@ -211,10 +247,20 @@ Global {75B7D419-C261-577D-58D6-AA3ACED9129F} = {3C3F9DB2-EC97-4464-B49F-BF1A0C2B46DC} {DD68F314-BC66-5601-B094-B1A7BE93F4E0} = {EBF7C01F-9B4F-48E6-8418-2CBFDA51EB0B} {EB97C7BB-1E4A-CBA4-04C1-22DBF48A253A} = {2E0FE301-34C3-4561-9CAE-C7A9E65AEE59} - {E01625B5-B5B7-7A4B-468F-EC12C1BDBA2A} = {BA4DA3E7-9AD0-47AD-A0E6-A0BB6700DA23} - {B955C5DA-3C20-35D2-0770-8FE473C41C44} = {BA4DA3E7-9AD0-47AD-A0E6-A0BB6700DA23} - {995D3D91-7221-D4A3-A7B2-FEC202328A18} = {A02F7D8A-04DC-44D6-94D4-3F65712D6B94} - {8A113DE5-7D50-6E6B-739F-B6EEAD5E13B4} = {A02F7D8A-04DC-44D6-94D4-3F65712D6B94} + {E01625B5-B5B7-7A4B-468F-EC12C1BDBA2A} = {A31EC18C-956B-4FD2-AED6-609C33B467E9} + {B955C5DA-3C20-35D2-0770-8FE473C41C44} = {A31EC18C-956B-4FD2-AED6-609C33B467E9} + {995D3D91-7221-D4A3-A7B2-FEC202328A18} = {C61007F8-51F5-409C-9FAF-DEF6A24DCDED} + {8A113DE5-7D50-6E6B-739F-B6EEAD5E13B4} = {C61007F8-51F5-409C-9FAF-DEF6A24DCDED} + {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} = {BA4DA3E7-9AD0-47AD-A0E6-A0BB6700DA23} + {18207368-3C39-4346-85F7-A8B499B0B458} = {BA4DA3E7-9AD0-47AD-A0E6-A0BB6700DA23} + {A31EC18C-956B-4FD2-AED6-609C33B467E9} = {BA4DA3E7-9AD0-47AD-A0E6-A0BB6700DA23} + {3B32D838-33BF-C08A-C447-3172CA62D42F} = {18207368-3C39-4346-85F7-A8B499B0B458} + {C71FF348-FB47-67E6-AF0D-6A8E48C5EDEA} = {18207368-3C39-4346-85F7-A8B499B0B458} + {98FE468D-0C34-83D9-31BD-F59C44D00357} = {8D1FD3D9-3FF0-4581-ACF0-45AF9D595774} + {A2DDA6F0-C760-0633-D576-E23A186504E4} = {8D1FD3D9-3FF0-4581-ACF0-45AF9D595774} + {A38B5EB3-2F55-44A2-944B-31A73DE91402} = {A02F7D8A-04DC-44D6-94D4-3F65712D6B94} + {C61007F8-51F5-409C-9FAF-DEF6A24DCDED} = {A02F7D8A-04DC-44D6-94D4-3F65712D6B94} + {8D1FD3D9-3FF0-4581-ACF0-45AF9D595774} = {A02F7D8A-04DC-44D6-94D4-3F65712D6B94} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4324B3B4-B60B-4E3C-91D8-59576B4E26DD} diff --git a/modules/JiShe.CollectBus.IoTDB/SourceEntityAccessorFactory3.cs b/modules/JiShe.CollectBus.IoTDB/SourceEntityAccessorFactory3.cs new file mode 100644 index 0000000..4712b67 --- /dev/null +++ b/modules/JiShe.CollectBus.IoTDB/SourceEntityAccessorFactory3.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Concurrent; +using System.Reflection; + +namespace JiShe.CollectBus.Analyzers.Shared; + +public static class SourceEntityAccessorFactory3 +{ + private static readonly ConcurrentDictionary _accessors = new(); + + public static ISourceEntityAccessor GetAccessor() + { + return (ISourceEntityAccessor)_accessors.GetOrAdd(typeof(T), t => + { + // 获取泛型类型定义信息(如果是泛型类型) + var isGeneric = t.IsGenericType; + var genericTypeDef = isGeneric ? t.GetGenericTypeDefinition() : null; + var arity = isGeneric ? genericTypeDef!.GetGenericArguments().Length : 0; + + // 构建访问器类名 + var typeName = isGeneric + ? $"{t.Namespace}.{genericTypeDef!.Name.Split('`')[0]}Accessor`{arity}" + : $"{t.Namespace}.{t.Name}Accessor"; + + // 尝试从当前程序集加载 + var accessorType = Assembly.GetAssembly(t)!.GetType(typeName) + ?? throw new InvalidOperationException($"Accessor type {typeName} not found"); + + // 处理泛型参数 + if (isGeneric && accessorType.IsGenericTypeDefinition) + { + accessorType = accessorType.MakeGenericType(t.GetGenericArguments()); + } + + return Activator.CreateInstance(accessorType)!; + }); + } + + public static object GetAccessor(Type type) + { + MethodInfo getAccessorMethod = typeof(SourceEntityAccessorFactory) + .GetMethod( + name: nameof(GetAccessor), + bindingAttr: BindingFlags.Public | BindingFlags.Static, + + types: Type.EmptyTypes + ); + + MethodInfo genericMethod = getAccessorMethod.MakeGenericMethod(type); + return genericMethod.Invoke(null, null); + } +} \ No newline at end of file diff --git a/services/JiShe.CollectBus.Application/CollectBusApplicationModule.cs b/services/JiShe.CollectBus.Application/CollectBusApplicationModule.cs index b146d6f..942befc 100644 --- a/services/JiShe.CollectBus.Application/CollectBusApplicationModule.cs +++ b/services/JiShe.CollectBus.Application/CollectBusApplicationModule.cs @@ -19,8 +19,10 @@ using System.Threading.Channels; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Application; +using Volo.Abp.AuditLogging; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; +using Volo.Abp.BackgroundJobs; using Volo.Abp.BackgroundWorkers; using Volo.Abp.BackgroundWorkers.Hangfire; using Volo.Abp.Modularity; @@ -38,6 +40,9 @@ namespace JiShe.CollectBus; typeof(CollectBusFreeSqlModule), typeof(CollectBusKafkaModule), typeof(CollectBusIoTDbModule), + typeof(CollectBusDomainSharedModule), + typeof(AbpAuditLoggingDomainModule), + typeof(AbpBackgroundJobsDomainModule), typeof(CollectBusCassandraModule), typeof(CollectBusProtocolModule) )] diff --git a/services/JiShe.CollectBus.Application/ScheduledMeterReading/BasicScheduledMeterReadingService.cs b/services/JiShe.CollectBus.Application/ScheduledMeterReading/BasicScheduledMeterReadingService.cs index f53b21a..85a71d8 100644 --- a/services/JiShe.CollectBus.Application/ScheduledMeterReading/BasicScheduledMeterReadingService.cs +++ b/services/JiShe.CollectBus.Application/ScheduledMeterReading/BasicScheduledMeterReadingService.cs @@ -1169,19 +1169,19 @@ namespace JiShe.CollectBus.ScheduledMeterReading item.ItemCodes = new List() { T37612012PacketItemCodeConst.AFN0CHFN129H }; } } - else if (item.MeterTypeName.Trim().Equals("西恩超声波流量计")) + else if (item.MeterTypeName.Equals("流量计") && item.BrandType.Trim().Equals("西恩超声波流量计")) { item.ItemCodes = new List() { T37612012PacketItemCodeConst.AFN09HFN01H }; } - else if (item.MeterTypeName.Trim().Equals("江苏华海涡街流量计积算仪")) + else if (item.MeterTypeName.Equals("流量计") && item.BrandType.Trim().Equals("江苏华海涡街流量计积算仪")) { item.ItemCodes = new List() { T37612012PacketItemCodeConst.AFN09HFN01H }; } - else if (item.MeterTypeName.Trim().Equals("V880BR涡街流量计")) + else if (item.MeterTypeName.Equals("流量计") && item.BrandType.Trim().Equals("V880BR涡街流量计")) { item.ItemCodes = new List() { T37612012PacketItemCodeConst.AFN09HFN01H }; } - else if (item.MeterTypeName.Trim().Equals("拓思特涡街流量计H880BR")) + else if (item.MeterTypeName.Equals("流量计") && item.BrandType.Trim().Equals("拓思特涡街流量计H880BR")) { item.ItemCodes = new List() { T37612012PacketItemCodeConst.AFN09HFN01H }; } diff --git a/services/JiShe.CollectBus.Application/ScheduledMeterReading/EnergySystemScheduledMeterReadingService.cs b/services/JiShe.CollectBus.Application/ScheduledMeterReading/EnergySystemScheduledMeterReadingService.cs index f13a158..762d001 100644 --- a/services/JiShe.CollectBus.Application/ScheduledMeterReading/EnergySystemScheduledMeterReadingService.cs +++ b/services/JiShe.CollectBus.Application/ScheduledMeterReading/EnergySystemScheduledMeterReadingService.cs @@ -600,12 +600,14 @@ namespace JiShe.CollectBus.ScheduledMeterReading TypeName = 1, TimeDensity = 60, BrandType = "云集", + MeterTypeName = "水表", MeterType = MeterTypeEnum.WaterMeter, ProjectID = 1, MeteringPort = MeteringPortConst.MeteringPortTwo, Password = "000000", LinkType = "RS-485", - TimesRate = 1.0000m, + TimesRate = 1.0000m, + Protocol = 30, }); FreeRedisProvider.Instance.Set(redisCacheDeviceInfoHashKeyTemp, deviceInfos); diff --git a/services/JiShe.CollectBus.Domain/CollectBusDomainModule.cs b/services/JiShe.CollectBus.Domain/CollectBusDomainModule.cs index 24945de..b09cbf8 100644 --- a/services/JiShe.CollectBus.Domain/CollectBusDomainModule.cs +++ b/services/JiShe.CollectBus.Domain/CollectBusDomainModule.cs @@ -10,10 +10,7 @@ using Volo.Abp.Emailing; namespace JiShe.CollectBus; [DependsOn( - typeof(CollectBusDomainSharedModule), - typeof(AbpAuditLoggingDomainModule), - typeof(AbpCachingModule), - typeof(AbpBackgroundJobsDomainModule) + typeof(AbpCachingModule) )] public class CollectBusDomainModule : AbpModule { diff --git a/services/JiShe.CollectBusEPO.Application.Contracts/CollectBusEPOApplicationContractsModule.cs b/services/JiShe.CollectBusEPO.Application.Contracts/CollectBusEPOApplicationContractsModule.cs new file mode 100644 index 0000000..1f538b1 --- /dev/null +++ b/services/JiShe.CollectBusEPO.Application.Contracts/CollectBusEPOApplicationContractsModule.cs @@ -0,0 +1,16 @@ +using JiShe.CollectBus; + +namespace JiShe.CollectBusEPO +{ + [DependsOn( + typeof(CollectBusDomainSharedModule), + typeof(AbpObjectExtendingModule) + )] + public class CollectBusEPOApplicationContractsModule : AbpModule + { + public override void PreConfigureServices(ServiceConfigurationContext context) + { + CollectBusEPODtoExtensions.Configure(); + } + } +} diff --git a/services/JiShe.CollectBusEPO.Application.Contracts/CollectBusEPODtoExtensions.cs b/services/JiShe.CollectBusEPO.Application.Contracts/CollectBusEPODtoExtensions.cs new file mode 100644 index 0000000..02e750a --- /dev/null +++ b/services/JiShe.CollectBusEPO.Application.Contracts/CollectBusEPODtoExtensions.cs @@ -0,0 +1,25 @@ +namespace JiShe.CollectBusEPO +{ + public static class CollectBusEPODtoExtensions + { + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + OneTimeRunner.Run(() => + { + /* You can add extension properties to DTOs + * defined in the depended modules. + * + * Example: + * + * ObjectExtensionManager.Instance + * .AddOrUpdateProperty("Title"); + * + * See the documentation for more: + * https://docs.abp.io/en/abp/latest/Object-Extensions + */ + }); + } + } +} \ No newline at end of file diff --git a/services/JiShe.CollectBusEPO.Application.Contracts/Files/FileUploadOutputDto.cs b/services/JiShe.CollectBusEPO.Application.Contracts/Files/FileUploadOutputDto.cs new file mode 100644 index 0000000..4ddfa20 --- /dev/null +++ b/services/JiShe.CollectBusEPO.Application.Contracts/Files/FileUploadOutputDto.cs @@ -0,0 +1,7 @@ +namespace JiShe.CollectBusEPO.Files; + +public class FileUploadOutputDto +{ + public string Name { get; set; } + public string Path { get; set; } +} diff --git a/services/JiShe.CollectBusEPO.Application.Contracts/GlobalUsings.cs b/services/JiShe.CollectBusEPO.Application.Contracts/GlobalUsings.cs new file mode 100644 index 0000000..7e82668 --- /dev/null +++ b/services/JiShe.CollectBusEPO.Application.Contracts/GlobalUsings.cs @@ -0,0 +1,11 @@ +// Global using directives + +global using System; +global using System.Threading.Tasks; +global using Volo.Abp.Application.Services; +global using Volo.Abp.Authorization.Permissions; +global using Volo.Abp.DependencyInjection; +global using Volo.Abp.Localization; +global using Volo.Abp.Modularity; +global using Volo.Abp.ObjectExtending; +global using Volo.Abp.Threading; \ No newline at end of file diff --git a/services/JiShe.CollectBusEPO.Application.Contracts/JiShe.CollectBusEPO.Application.Contracts.csproj b/services/JiShe.CollectBusEPO.Application.Contracts/JiShe.CollectBusEPO.Application.Contracts.csproj new file mode 100644 index 0000000..23e52c4 --- /dev/null +++ b/services/JiShe.CollectBusEPO.Application.Contracts/JiShe.CollectBusEPO.Application.Contracts.csproj @@ -0,0 +1,17 @@ + + + net8.0 + JiShe.CollectBusEPO + + + + + + + + + + + + + diff --git a/services/JiShe.CollectBusEPO.Application.Contracts/Jobs/IRecurringJob.cs b/services/JiShe.CollectBusEPO.Application.Contracts/Jobs/IRecurringJob.cs new file mode 100644 index 0000000..6f4df53 --- /dev/null +++ b/services/JiShe.CollectBusEPO.Application.Contracts/Jobs/IRecurringJob.cs @@ -0,0 +1,11 @@ +namespace JiShe.CollectBusEPO.Jobs +{ + public interface IRecurringJob : ITransientDependency + { + /// + /// 执行任务 + /// + /// + Task ExecuteAsync(); + } +} \ No newline at end of file diff --git a/services/JiShe.CollectBusEPO.Application.Contracts/Permissions/CollectBusEPOPermissionDefinitionProvider.cs b/services/JiShe.CollectBusEPO.Application.Contracts/Permissions/CollectBusEPOPermissionDefinitionProvider.cs new file mode 100644 index 0000000..1b673bd --- /dev/null +++ b/services/JiShe.CollectBusEPO.Application.Contracts/Permissions/CollectBusEPOPermissionDefinitionProvider.cs @@ -0,0 +1,17 @@ +using JiShe.CollectBus.Localization; + +namespace JiShe.CollectBusEPO.Permissions +{ + public class CollectBusEPOPermissionDefinitionProvider : PermissionDefinitionProvider + { + public override void Define(IPermissionDefinitionContext context) + { + var myGroup = context.AddGroup(CollectBusEPOPermissions.GroupName, L("Permission:CollectBus")); + } + + private static LocalizableString L(string name) + { + return LocalizableString.Create(name); + } + } +} \ No newline at end of file diff --git a/services/JiShe.CollectBusEPO.Application.Contracts/Permissions/CollectBusEPOPermissions.cs b/services/JiShe.CollectBusEPO.Application.Contracts/Permissions/CollectBusEPOPermissions.cs new file mode 100644 index 0000000..7acba86 --- /dev/null +++ b/services/JiShe.CollectBusEPO.Application.Contracts/Permissions/CollectBusEPOPermissions.cs @@ -0,0 +1,15 @@ +using Volo.Abp.Reflection; + +namespace JiShe.CollectBusEPO.Permissions +{ + public static class CollectBusEPOPermissions + { + public const string GroupName = "CollectBusEPO"; + + public static string[] GetAll() + { + return ReflectionHelper.GetPublicConstantsRecursively(typeof(CollectBusEPOPermissions)); + } + + } +} \ No newline at end of file diff --git a/services/JiShe.CollectBusEPO.Application/CollectBusEPOAppService.cs b/services/JiShe.CollectBusEPO.Application/CollectBusEPOAppService.cs new file mode 100644 index 0000000..79d0366 --- /dev/null +++ b/services/JiShe.CollectBusEPO.Application/CollectBusEPOAppService.cs @@ -0,0 +1,30 @@ +using JiShe.CollectBus; +using JiShe.CollectBus.FreeRedis; +using JiShe.CollectBus.FreeSql; +using JiShe.CollectBus.Localization; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Threading; + +namespace JiShe.CollectBusEPO +{ + /* Inherit your application services from this class. + */ + [Authorize] + [ApiExplorerSettings(GroupName = CollectBusDomainSharedConsts.Business)] + public abstract class CollectBusEPOAppService : ApplicationService + { + public IFreeSqlProvider SqlProvider => LazyServiceProvider.LazyGetRequiredService(); + protected IFreeRedisProvider FreeRedisProvider => LazyServiceProvider.LazyGetService()!; + private ICancellationTokenProvider CancellationTokenProvider => + LazyServiceProvider.LazyGetService(NullCancellationTokenProvider.Instance); + + protected CollectBusEPOAppService() + { + LocalizationResource = typeof(CollectBusResource); + ObjectMapperContext = typeof(CollectBusEPOApplicationModule); + } + + + + } +} diff --git a/services/JiShe.CollectBusEPO.Application/CollectBusEPOApplicationModule.cs b/services/JiShe.CollectBusEPO.Application/CollectBusEPOApplicationModule.cs new file mode 100644 index 0000000..47e8079 --- /dev/null +++ b/services/JiShe.CollectBusEPO.Application/CollectBusEPOApplicationModule.cs @@ -0,0 +1,32 @@ +using JiShe.CollectBus; +using JiShe.CollectBus.FreeRedis; +using JiShe.CollectBus.FreeSql; +using JiShe.CollectBus.IoTDB; +using JiShe.CollectBus.Kafka; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AuditLogging; +using Volo.Abp.BackgroundJobs; + +namespace JiShe.CollectBusEPO +{ + [DependsOn( + typeof(CollectBusDomainModule), + typeof(CollectBusFreeRedisModule), + typeof(CollectBusFreeSqlModule), + typeof(CollectBusKafkaModule), + typeof(CollectBusIoTDbModule) + )] + public class CollectBusEPOApplicationModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => { options.AddMaps(); }); + + Configure(options => + { + options.ConventionalControllers.Create(typeof(CollectBusEPOApplicationModule).Assembly); + }); + } + + } +} \ No newline at end of file diff --git a/services/JiShe.CollectBusEPO.Application/EntityHandler.cs b/services/JiShe.CollectBusEPO.Application/EntityHandler.cs new file mode 100644 index 0000000..7ca2822 --- /dev/null +++ b/services/JiShe.CollectBusEPO.Application/EntityHandler.cs @@ -0,0 +1,21 @@ +using Volo.Abp.Domain.Entities.Auditing; +using Volo.Abp.Domain.Entities.Events; +using Volo.Abp.EventBus; +using Volo.Abp.MultiTenancy; + +namespace JiShe.CollectBusEPO; + +public class EntityHandler : ILocalEventHandler>>, + ITransientDependency +{ + public IAbpLazyServiceProvider LazyServiceProvider { get; set; } + + protected ICurrentTenant CurrentTenant => LazyServiceProvider.LazyGetRequiredService(); + + + public Task HandleEventAsync(EntityCreatedEventData> eventData) + { + // TO DO SOMETHING + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/services/JiShe.CollectBusEPO.Application/GlobalUsings.cs b/services/JiShe.CollectBusEPO.Application/GlobalUsings.cs new file mode 100644 index 0000000..eacabe1 --- /dev/null +++ b/services/JiShe.CollectBusEPO.Application/GlobalUsings.cs @@ -0,0 +1,9 @@ +// Global using directives + +global using Microsoft.AspNetCore.Authorization; +global using System; +global using System.Threading.Tasks; +global using Volo.Abp.Application.Services; +global using Volo.Abp.AutoMapper; +global using Volo.Abp.DependencyInjection; +global using Volo.Abp.Modularity; diff --git a/services/JiShe.CollectBusEPO.Application/JiShe.CollectBusEPO.Application.csproj b/services/JiShe.CollectBusEPO.Application/JiShe.CollectBusEPO.Application.csproj new file mode 100644 index 0000000..0bb7da1 --- /dev/null +++ b/services/JiShe.CollectBusEPO.Application/JiShe.CollectBusEPO.Application.csproj @@ -0,0 +1,17 @@ + + + + + net8.0 + JiShe.CollectBusEPO + + + + + + + + + + + diff --git a/services/JiShe.CollectBusEPO.Application/Properties/AssemblyInfo.cs b/services/JiShe.CollectBusEPO.Application/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f46e19e --- /dev/null +++ b/services/JiShe.CollectBusEPO.Application/Properties/AssemblyInfo.cs @@ -0,0 +1,2 @@ +using System.Runtime.CompilerServices; +[assembly:InternalsVisibleToAttribute("JiShe.MicroService.Application.Tests")] diff --git a/shared/JiShe.CollectBus.Analyzers.Shared/SourceEntityAccessorFactory2.cs b/shared/JiShe.CollectBus.Analyzers.Shared/SourceEntityAccessorFactory2.cs new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/shared/JiShe.CollectBus.Analyzers.Shared/SourceEntityAccessorFactory2.cs @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/.config/dotnet-tools.json b/web/JiShe.CollectBusEPO.HttpApi.Host/.config/dotnet-tools.json new file mode 100644 index 0000000..76ca931 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/.config/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "8.0.10", + "commands": [ + "dotnet-ef" + ], + "rollForward": false + } + } +} \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/CollectBusEPOHttpApiHostConst.cs b/web/JiShe.CollectBusEPO.HttpApi.Host/CollectBusEPOHttpApiHostConst.cs new file mode 100644 index 0000000..e4783b7 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/CollectBusEPOHttpApiHostConst.cs @@ -0,0 +1,45 @@ +namespace JiShe.CollectBusEPO +{ + public static class CollectBusEPOHttpApiHostConst + { + /// + /// 跨域策略名 + /// + public const string DefaultCorsPolicyName = "Default"; + + /// + /// Cookies名称 + /// + public const string DefaultCookieName = "JiShe.MicroService.Http.Api"; + + /// + /// SwaggerUi 端点 + /// + public const string SwaggerUiEndPoint = "/swagger"; + + /// + /// Hangfire 端点 + /// + public const string HangfireDashboardEndPoint = "/hangfire"; + + /// + /// CAP 端点 + /// + public const string CapDashboardEndPoint = "/cap"; + + + public const string MoreEndPoint = "https://doc.cncore.club/"; + + + /// + /// HMiniprofiler端点 + /// + public const string MiniprofilerEndPoint = "/profiler/results-index"; + + /// + /// HealthCheck端点 + /// + public const string HealthCheckEndPoint = "/health"; + + } +} \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/CollectBusEPOHttpApiHostModule.Configure.cs b/web/JiShe.CollectBusEPO.HttpApi.Host/CollectBusEPOHttpApiHostModule.Configure.cs new file mode 100644 index 0000000..8f5f93a --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/CollectBusEPOHttpApiHostModule.Configure.cs @@ -0,0 +1,179 @@ +using JiShe.CollectBusEPO.HttpApi.Host.Swaggers; + +namespace JiShe.CollectBusEPO; + +public partial class CollectBusEPOHttpApiHostModule +{ + + /// + /// 配置JWT + /// + private void ConfigureJwtAuthentication(ServiceConfigurationContext context, IConfiguration configuration) + { + context.Services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + }) + .AddJwtBearer(options => + { + options.TokenValidationParameters = + new TokenValidationParameters() + { + // 是否开启签名认证 + ValidateIssuerSigningKey = true, + ValidateIssuer = true, + ValidateAudience = true, + ValidateLifetime = true, + ClockSkew = TimeSpan.Zero, + ValidIssuer = configuration["Jwt:Issuer"], + ValidAudience = configuration["Jwt:Audience"], + IssuerSigningKey = + new SymmetricSecurityKey( + Encoding.ASCII.GetBytes(configuration["Jwt:SecurityKey"])) + }; + + options.Events = new JwtBearerEvents + { + OnMessageReceived = currentContext => + { + var path = currentContext.HttpContext.Request.Path; + if (path.StartsWithSegments("/login")) + { + return Task.CompletedTask; + } + + var accessToken = string.Empty; + if (currentContext.HttpContext.Request.Headers.ContainsKey("Authorization")) + { + accessToken = currentContext.HttpContext.Request.Headers["Authorization"]; + if (!string.IsNullOrWhiteSpace(accessToken)) + { + accessToken = accessToken.Split(" ").LastOrDefault(); + } + } + + if (accessToken.IsNullOrWhiteSpace()) + { + accessToken = currentContext.Request.Query["access_token"].FirstOrDefault(); + } + + if (accessToken.IsNullOrWhiteSpace()) + { + accessToken = currentContext.Request.Cookies[@CollectBusEPOHttpApiHostConst.DefaultCookieName]; + } + + currentContext.Token = accessToken; + currentContext.Request.Headers.Remove("Authorization"); + currentContext.Request.Headers.Add("Authorization", $"Bearer {accessToken}"); + + return Task.CompletedTask; + } + }; + }); + } + + + /// + /// Redis缓存 + /// + private void ConfigureCache(ServiceConfigurationContext context) + { + Configure( + options => { options.KeyPrefix = "MicroService:"; }); + var configuration = context.Services.GetConfiguration(); + var redis = ConnectionMultiplexer.Connect(configuration.GetValue("Redis:Configuration")); + context.Services + .AddDataProtection() + .PersistKeysToStackExchangeRedis(redis, "MicroService-Protection-Keys"); + } + + /// + /// 配置Identity + /// + private void ConfigureIdentity(ServiceConfigurationContext context) + { + context.Services.Configure(options => { options.Lockout = new LockoutOptions() { AllowedForNewUsers = false }; }); + } + + + private void ConfigureSwaggerServices(ServiceConfigurationContext context, IConfiguration configuration) + { + context.Services.AddSwaggerGen( + options => + { + configuration.GetSection("SwaggerConfig").Get>().ForEach(group => + { + options.SwaggerDoc(group.GroupName, + new OpenApiInfo { Title = group.Title, Version = group.Version }); + }); + + options.DocInclusionPredicate((docName, apiDes) => + { + if (docName == "Basic" && apiDes.GroupName.IsNullOrWhiteSpace()) return true; + return docName == apiDes.GroupName; + }); + + options.EnableAnnotations(); + options.DocumentFilter(); + options.SchemaFilter(); + var xmlPaths = Directory.GetFiles(AppContext.BaseDirectory, "*.xml") + .Where(a => a.EndsWith("Application.App.xml") || + a.EndsWith("Application.Contracts.App.xml") || + a.EndsWith("Application.xml") || + a.EndsWith("Application.Contracts.xml") || + a.EndsWith("HttpApi.xml") || + a.EndsWith("HttpApi.Host.xml")) + .Distinct() + .ToList(); + foreach (var xml in xmlPaths) options.IncludeXmlComments(xml, true); + }); + } + + + + /// + /// 审计日志 + /// + private void ConfigureAuditLog(ServiceConfigurationContext context) + { + Configure + ( + options => + { + options.IsEnabled = true; + options.EntityHistorySelectors.AddAllEntities(); + options.ApplicationName = "JiShe.MicroService"; + } + ); + + Configure( + options => + { + options.IgnoredUrls.Add("/AuditLogs/page"); + options.IgnoredUrls.Add("/hangfire/stats"); + options.IgnoredUrls.Add("/hangfire/recurring/trigger"); + options.IgnoredUrls.Add("/cap"); + options.IgnoredUrls.Add("/"); + }); + } + + //private void ConfigurationMultiTenancy() + //{ + // Configure(options => { options.IsEnabled = MultiTenancyConsts.IsEnabled; }); + //} + + private void ConfigureCustom(ServiceConfigurationContext context, IConfiguration configuration) + { + context.Services.AddSingleton(); + //context.Services.AddStorage(configuration); + } + + /// + /// 配置Serilog + /// + private void ConfigureSerilog(ServiceConfigurationContext context) + { + context.Services.AddSerilog(); + } +} \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/CollectBusEPOHttpApiHostModule.cs b/web/JiShe.CollectBusEPO.HttpApi.Host/CollectBusEPOHttpApiHostModule.cs new file mode 100644 index 0000000..e97e840 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/CollectBusEPOHttpApiHostModule.cs @@ -0,0 +1,73 @@ +using JiShe.CollectBusEPO.Extensions.HealthCheck; +using JiShe.CollectBusEPO.HttpApi.Host.Swaggers; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Volo.Abp.Swashbuckle; + +namespace JiShe.CollectBusEPO; + +[DependsOn( + typeof(CollectBusEPOHttpApiModule), + typeof(AbpAspNetCoreAuthenticationJwtBearerModule), + typeof(AbpAspNetCoreSerilogModule), + typeof(AbpSwashbuckleModule), + typeof(CollectBusEPOApplicationModule) +)] +public partial class CollectBusEPOHttpApiHostModule : AbpModule +{ + public override void OnPostApplicationInitialization(ApplicationInitializationContext context) + { + base.OnPostApplicationInitialization(context); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + var configuration = context.Services.GetConfiguration(); + ConfigureSerilog(context); + + ConfigureCache(context); + ConfigureSwaggerServices(context, configuration); + ConfigureJwtAuthentication(context, configuration); + ConfigureIdentity(context); + ConfigureAuditLog(context); + ConfigureCustom(context, configuration); + + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + var configuration = context.GetConfiguration(); + app.UseCorrelationId(); + app.UseStaticFiles(); + + + app.UseRouting(); + app.UseCors(CollectBusEPOHttpApiHostConst.DefaultCorsPolicyName); + + + app.UseAuthorization(); + app.UseSwagger(); + app.UseAbpSwaggerUI(options => + { + configuration.GetSection("SwaggerConfig").Get>().ForEach(group => + { + options.SwaggerEndpoint($"/swagger/{group.GroupName}/swagger.json", group.Title); //分组显示 + }); + options.DocExpansion(DocExpansion.None); + options.DefaultModelsExpandDepth(-1); + }); + + app.UseAuditing(); + app.UseAbpSerilogEnrichers(); + app.UseUnitOfWork(); + app.UseConfiguredEndpoints(endpoints => + { + //endpoints.MapHealthChecks("/health", new HealthCheckOptions + //{ + // Predicate = _ => true, + // ResponseWriter = HealthCheckResponse.Writer + //}); + }); + + } +} \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/Controllers/HomeController.cs b/web/JiShe.CollectBusEPO.HttpApi.Host/Controllers/HomeController.cs new file mode 100644 index 0000000..4e5ab2f --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/Controllers/HomeController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Authorization; + +namespace JiShe.CollectBusEPO.Controllers +{ + public class HomeController : AbpController + { + private readonly ILogger _logger; + private readonly IConfiguration configuration; + + public HomeController(ILogger logger, IConfiguration configuration) + { + _logger = logger; + this.configuration = configuration; + } + + public ActionResult Index() + { + return Redirect("/Monitor"); + } + + /// + /// ������� + /// + /// + [HttpGet] + public IActionResult Health() + { + return Ok(); + } + } +} diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/Docker/Dockerfile b/web/JiShe.CollectBusEPO.HttpApi.Host/Docker/Dockerfile new file mode 100644 index 0000000..75a20a7 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/Docker/Dockerfile @@ -0,0 +1,47 @@ +FROM docker.jisheyun.com/jisheyun/aspnetcore:8.0.10_basic_ub24 AS base + +# 这里确定使用的端口 +EXPOSE 8080 +EXPOSE 443 + + +COPY publish /app + +WORKDIR /app +ARG BUD_ENV=Development + +# 这里确定生产环境还是DEV环境等 +ENV RUN_ENV=$BUD_ENV + +# 根据 RUN_ENV 的值删除特定的配置文件 +# 只在构建过程中执行的指令 +RUN if [ "$RUN_ENV" = "Development" ]; then \ + rm -f ./appsettings.Production.json; \ + fi + +RUN if [ "$RUN_ENV" = "Production" ]; then \ + rm -f ./appsettings.Development.json; \ + fi + +ENTRYPOINT ["dotnet", "JiShe.MicroService.HttpApi.Host.dll"] + +##See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. +# +#FROM mcr.microsoft.com/dotnet/aspnet:8.0.10-noble AS base + # +#WORKDIR /app +# +##USER root +# +## apt-get源 使用aliyun的源 +#COPY ["sources.list", "/etc/apt/"] +# +## 转换时区 +#RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + #&& echo 'Asia/Shanghai' >/etc/timezone \ +## 更新系统并安装网络调试工具 + #&& apt-get update \ + #&& apt-get install -y \ + #vim \ + #net-tools \ + #iputils-ping \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/Docker/dockerbuild_dev.ps1 b/web/JiShe.CollectBusEPO.HttpApi.Host/Docker/dockerbuild_dev.ps1 new file mode 100644 index 0000000..09dc2cd --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/Docker/dockerbuild_dev.ps1 @@ -0,0 +1,26 @@ +# 汾 +$version = "1.0.2" + +$csprojFile = '..\.\*.csproj' +$files = Get-ChildItem -Path $csprojFile +$fullPath = $files[0] +$name = $fullPath.BaseName + +Write-Host "׼¼ֿ" +docker login 192.168.111.248:10001 --username=jenkins --password GTCz3pV8kdme4rh5 + +$lowerName = $name.toLower() + +$tagName = "$($lowerName):$($version)" + +Write-Host "ʼ" +Write-Host $tagName + +docker build --build-arg BUD_ENV=Development --progress=plain -t $tagName . + +Write-Host "ɹ"; + +docker tag $tagName "192.168.111.248:10001/jisheyun/jishe.testservice:$($version)" + +Write-Host "ʼ;"; +#docker push "192.168.111.248:10001/jisheyun/jishe.testservice:$($version)" diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/Docker/dockerbuild_pro.ps1 b/web/JiShe.CollectBusEPO.HttpApi.Host/Docker/dockerbuild_pro.ps1 new file mode 100644 index 0000000..5145ec3 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/Docker/dockerbuild_pro.ps1 @@ -0,0 +1,26 @@ +# 汾 +$version = "1.0.2" + +$csprojFile = '..\.\*.csproj' +$files = Get-ChildItem -Path $csprojFile +$fullPath = $files[0] +$name = $fullPath.BaseName + +Write-Host "׼¼ֿ" +docker login 192.168.111.248:10001 --username=jenkins --password GTCz3pV8kdme4rh5 + +$lowerName = $name.toLower() + +$tagName = "$($lowerName):$($version)" + +Write-Host "ʼ" +Write-Host $tagName + +docker build --build-arg BUD_ENV=Production --progress=plain -t $tagName . + +Write-Host "ɹ"; + +docker tag $tagName "192.168.111.248:10001/jisheyun/jishe.testservice:$($version)" + +Write-Host "ʼ;"; +#docker push "192.168.111.248:10001/jisheyun/jishe.testservice:$($version)" diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/Docker/sources.list b/web/JiShe.CollectBusEPO.HttpApi.Host/Docker/sources.list new file mode 100644 index 0000000..d2814c4 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/Docker/sources.list @@ -0,0 +1,10 @@ +deb http://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse +deb http://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse +deb http://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse +deb http://mirrors.aliyun.com/ubuntu/ noble-proposed main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ noble-proposed main restricted universe multiverse +deb http://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/Extensions/HealthCheck/Extensions.cs b/web/JiShe.CollectBusEPO.HttpApi.Host/Extensions/HealthCheck/Extensions.cs new file mode 100644 index 0000000..9a65556 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/Extensions/HealthCheck/Extensions.cs @@ -0,0 +1,88 @@ +using Microsoft.Extensions.Diagnostics.HealthChecks; + +namespace JiShe.CollectBusEPO.Extensions.HealthCheck +{ + public static class Extensions + { + /// + /// 添加监控检查,支持配置文件配置 + /// + /// + /// + /// + public static IServiceCollection AddHealthChecks( + this IServiceCollection services, IConfiguration configuration) + { + if (Convert.ToBoolean(configuration["HealthCheck:IsEnable"])) + { + var healthChecksService = services + .AddHealthChecks(); + + //添加对mysql的监控检查 + //if (Convert.ToBoolean(configuration["HealthCheck:MySql:IsEnable"])) + //{ + // var connectionString = configuration["HealthCheck:MySql:Connection"]; + // if (connectionString.IsNullOrWhiteSpace()) + // connectionString = configuration.GetConnectionString("Default"); + // healthChecksService.AddMySql( + // connectionString, + // "Mysql", + // HealthStatus.Degraded, + // new string[] { "db", "sql", "mysql" } + // ); + //} + //添加对Pings的监控检查 + //if (Convert.ToBoolean(configuration["HealthCheck:Pings:IsEnable"])) + // healthChecksService.AddPingHealthCheck(setup => + // { + // setup.AddHost(configuration["HealthCheck:Pings:Host"], Convert.ToInt32(configuration["HealthCheck:Pings:TimeOut"])); + // }, tags: new string[] { "ping" }); + + ////添加对postgresql的监控检查 + //if (Convert.ToBoolean(configuration["HealthCheck:PostgreSql:IsEnable"])) + // healthChecksService.AddNpgSql( + // configuration["ConnectionStrings:Default"], + // name: configuration["HealthCheck:PostgreSql:Name"], + // failureStatus: HealthStatus.Degraded, + // tags: new string[] { "db", "sql", "postgresql" } + // ); + + ////添加对Redis的监控检查 + //if (Convert.ToBoolean(configuration["HealthCheck:Redis:IsEnable"])) + // healthChecksService.AddRedis( + // configuration["HealthCheck:Redis:ConnectionString"], + // tags: new string[] { "redis" } + // ); + + ////添加对RabbitMq的监控检查 + //if (Convert.ToBoolean(configuration["HealthCheck:RabbitMq:IsEnable"])) + // healthChecksService.AddRabbitMQ( + // rabbitConnectionString: configuration["HealthCheck:RabbitMq:ConnectionString"], + // tags: new string[] { "redis" } + // ); + + ////添加对sql server的监控检查 + //if (Convert.ToBoolean(configuration["HealthCheck:SqlServer:IsEnable"])) + // healthChecksService.AddSqlServer( + // configuration["ConnectionStrings:Default"], + // "SELECT 1;", + // configuration["HealthCheck:SqlServer:Name"], + // HealthStatus.Degraded, + // new string[] { "db", "sql", "sqlserver" } + + ////添加对Hangfire的监控检查 + //if (Convert.ToBoolean(configuration["HealthCheck:Hangfire:IsEnable"])) + // healthChecksService.AddHangfire(options => + // { + // options.MaximumJobsFailed = Convert.ToInt32(configuration["HealthCheck:Hangfire:MaximumJobsFailed"]); + // options.MinimumAvailableServers = Convert.ToInt32(configuration["HealthCheck:Hangfire:MinimumAvailableServers"]); + // }, tags: new string[] { "hangfire" }); + + ////添加对SignalR的监控检查 + //if (Convert.ToBoolean(configuration["HealthCheck:SignalR:IsEnable"])) + // healthChecksService.AddSignalRHub(configuration["HealthCheck:SignalR:Url"], tags: new string[] { "signalr" }); + } + return services; + } + } +} \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/Extensions/HealthCheck/HealthCheckResponse.cs b/web/JiShe.CollectBusEPO.HttpApi.Host/Extensions/HealthCheck/HealthCheckResponse.cs new file mode 100644 index 0000000..9fe52ef --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/Extensions/HealthCheck/HealthCheckResponse.cs @@ -0,0 +1,25 @@ +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Newtonsoft.Json; + +namespace JiShe.CollectBusEPO.Extensions.HealthCheck +{ + public class HealthCheckResponse + { + public static Task Writer(HttpContext context, HealthReport healthReport) + { + context.Response.ContentType = "application/json"; + + var result = JsonConvert.SerializeObject(new + { + status = healthReport.Status.ToString(), + errors = healthReport.Entries.Select(e => new + { + key = e.Key, + value = e.Value.Status.ToString() + }) + }); + return context.Response.WriteAsync(result); + + } + } +} diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/GlobalUsings.cs b/web/JiShe.CollectBusEPO.HttpApi.Host/GlobalUsings.cs new file mode 100644 index 0000000..c588db2 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/GlobalUsings.cs @@ -0,0 +1,32 @@ +// Global using directives + +global using Microsoft.AspNetCore.Authentication.JwtBearer; +global using Microsoft.AspNetCore.Builder; +global using Microsoft.AspNetCore.DataProtection; +global using Microsoft.AspNetCore.Hosting; +global using Microsoft.AspNetCore.Http; +global using Microsoft.AspNetCore.Identity; +global using Microsoft.AspNetCore.Mvc; +global using Microsoft.Extensions.Configuration; +global using Microsoft.Extensions.DependencyInjection; +global using Microsoft.Extensions.Hosting; +global using Microsoft.Extensions.Logging; +global using Microsoft.IdentityModel.Tokens; +global using Microsoft.OpenApi.Models; +global using Serilog; +global using StackExchange.Redis; +global using Swashbuckle.AspNetCore.SwaggerUI; +global using System; +global using System.Collections.Generic; +global using System.IO; +global using System.Linq; +global using System.Text; +global using System.Threading.Tasks; +global using Volo.Abp; +global using Volo.Abp.AspNetCore.Auditing; +global using Volo.Abp.AspNetCore.Authentication.JwtBearer; +global using Volo.Abp.AspNetCore.Mvc; +global using Volo.Abp.AspNetCore.Serilog; +global using Volo.Abp.Auditing; +global using Volo.Abp.Caching; +global using Volo.Abp.Modularity; diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/JiShe.CollectBusEPO.HttpApi.Host.csproj b/web/JiShe.CollectBusEPO.HttpApi.Host/JiShe.CollectBusEPO.HttpApi.Host.csproj new file mode 100644 index 0000000..1c0e309 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/JiShe.CollectBusEPO.HttpApi.Host.csproj @@ -0,0 +1,62 @@ + + + net8.0 + JiShe.CollectBusEPO + true + JiShe.MicroService-4681b4fd-151f-4221-84a4-929d86723e4c + Linux + ..\.. + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ContentIncludedByDefault Remove="wwwroot\files\a.txt" /> + + + + + + diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/Pages/Monitor.cshtml b/web/JiShe.CollectBusEPO.HttpApi.Host/Pages/Monitor.cshtml new file mode 100644 index 0000000..1825dbb --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/Pages/Monitor.cshtml @@ -0,0 +1,193 @@ +@page "/Monitor" +@using JiShe.CollectBusEPO +@model JiShe.CollectBusEPO.Pages.Monitor + + +@{ + Layout = null; +} + + + + + + + + + + 后端服务 + + + +
+ +
+
+
+ + + +
+

+ SwaggerUI +

+
+
+
+ +
+
+ + + +
+

+ CAP面板 +

+
+
+
+ +
+
+ + + +
+

+ Hangfire面板 +

+
+
+
+
+
+ + + +
+

+ Miniprofiler +

+
+
+
+
+
+ + + +
+

+ HealthCheck +

+
+
+
+
+
+ + + \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/Pages/Monitor.cshtml.cs b/web/JiShe.CollectBusEPO.HttpApi.Host/Pages/Monitor.cshtml.cs new file mode 100644 index 0000000..d57d898 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/Pages/Monitor.cshtml.cs @@ -0,0 +1,12 @@ +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace JiShe.CollectBusEPO.Pages +{ + public class Monitor : PageModel + { + public void OnGet() + { + + } + } +} \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/Program.cs b/web/JiShe.CollectBusEPO.HttpApi.Host/Program.cs new file mode 100644 index 0000000..20b7d21 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/Program.cs @@ -0,0 +1,39 @@ +namespace JiShe.CollectBusEPO +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + + } + + private static IHostBuilder CreateHostBuilder(string[] args) + { + var env = Environment.GetEnvironmentVariable("RUN_ENV") ?? "Development"; + + return Host.CreateDefaultBuilder(args) + .UseEnvironment(env) + .ConfigureAppConfiguration((context, builder) => + { + var c = builder.Build(); + + builder.AddJsonFile($"appsettings.json", false, true); + builder.AddJsonFile($"appsettings.{env}.json", false, true); + + //builder.AddNacosV2Configuration(c.GetSection("NacosConfig")); + }) + .ConfigureWebHostDefaults(webBuilder => + { + var runPort = Environment.GetEnvironmentVariable("RUN_PORT") ?? "8088"; + webBuilder.ConfigureKestrel((context, options) => { options.Limits.MaxRequestBodySize = 1024 * 50; }); + webBuilder.UseStartup(); + webBuilder.UseUrls($"http://*:{runPort}"); + }) + .UseSerilog((context, loggerConfiguration) => + { + loggerConfiguration.ReadFrom.Configuration(context.Configuration); + }).UseAutofac(); + } + } +} diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/Properties/launchSettings.json b/web/JiShe.CollectBusEPO.HttpApi.Host/Properties/launchSettings.json new file mode 100644 index 0000000..8481021 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/Properties/launchSettings.json @@ -0,0 +1,13 @@ +{ + "profiles": { + "JiShe.MicroService.HttpApi.Host": { + "commandName": "Project", + "commandLineArgs": "serviceip=192.168.111.174 serviceport=8088", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://localhost:8088" + } + } +} \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/Startup.cs b/web/JiShe.CollectBusEPO.HttpApi.Host/Startup.cs new file mode 100644 index 0000000..f655483 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/Startup.cs @@ -0,0 +1,23 @@ +namespace JiShe.CollectBusEPO +{ + public class Startup + { + private readonly IConfiguration _configuration; + + public Startup(IConfiguration configuration) + { + _configuration = configuration; + } + + + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(); + } + + public void Configure(IApplicationBuilder app,IHostApplicationLifetime lifetime) + { + app.InitializeApplication(); + } + } +} diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/Swaggers/EnumSchemaFilter.cs b/web/JiShe.CollectBusEPO.HttpApi.Host/Swaggers/EnumSchemaFilter.cs new file mode 100644 index 0000000..c31c8c2 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/Swaggers/EnumSchemaFilter.cs @@ -0,0 +1,24 @@ +using Microsoft.OpenApi.Any; +using Microsoft.OpenApi.Interfaces; +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; + +namespace JiShe.CollectBusEPO.HttpApi.Host.Swaggers +{ + /// + /// swagger 枚举映射, + /// 原因:前端代理生成枚举是数字 + /// + public class EnumSchemaFilter : ISchemaFilter + { + public void Apply(OpenApiSchema schema, SchemaFilterContext context) + { + if (!context.Type.IsEnum) + return; + OpenApiArray openApiArray = new OpenApiArray(); + openApiArray.AddRange((IEnumerable)Enum.GetNames(context.Type).Select(n => new OpenApiString(n))); + schema.Extensions.Add("x-enumNames", openApiArray); + schema.Extensions.Add("x-enum-varnames", openApiArray); + } + } +} diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/Swaggers/HiddenAbpDefaultApiFilter.cs b/web/JiShe.CollectBusEPO.HttpApi.Host/Swaggers/HiddenAbpDefaultApiFilter.cs new file mode 100644 index 0000000..31dbca5 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/Swaggers/HiddenAbpDefaultApiFilter.cs @@ -0,0 +1,54 @@ +using System.Reflection; +using Microsoft.AspNetCore.Mvc.ApiExplorer; +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; + +namespace JiShe.CollectBusEPO.HttpApi.Host.Swaggers +{ + /// + /// 在使用nswag的时候,原生默认的api导致生产的代理类存在问题 + /// 所有隐藏原生的api,重写路由 + /// + public class HiddenAbpDefaultApiFilter : IDocumentFilter + { + public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context) + { + foreach (ApiDescription apiDescription in context.ApiDescriptions) + { + if (apiDescription.TryGetMethodInfo(out MethodInfo _)) + { + string key = "/" + apiDescription.RelativePath; + if (IsHidden(key)) + swaggerDoc.Paths.Remove(key); + } + } + } + + private bool IsHidden(string key) + { + foreach (string hiddenAbpDefaultApi in GetHiddenAbpDefaultApiList()) + { + if (key.Contains(hiddenAbpDefaultApi)) + return true; + } + return false; + } + + private List GetHiddenAbpDefaultApiList() + { + return new List() + { + "/api/abp/multi-tenancy/tenants", + "/api/account", + "/api/feature-management/features", + "/api/permission-management/permissions", + "/api/identity/my-profile", + "/api/identity", + "/api/multi-tenancy/tenants", + "/api/setting-management/emailing", + "/configuration", + "/outputcache" + }; + } + } +} diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/Swaggers/SwaggerConfig.cs b/web/JiShe.CollectBusEPO.HttpApi.Host/Swaggers/SwaggerConfig.cs new file mode 100644 index 0000000..9b6de43 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/Swaggers/SwaggerConfig.cs @@ -0,0 +1,11 @@ +namespace JiShe.CollectBusEPO.HttpApi.Host.Swaggers +{ + public class SwaggerConfig + { + public string GroupName { get; set; } + + public string Title { get; set; } + + public string Version { get; set; } + } +} diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/appsettings.Development.json b/web/JiShe.CollectBusEPO.HttpApi.Host/appsettings.Development.json new file mode 100644 index 0000000..c1860fa --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/appsettings.Development.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/appsettings.Production.json b/web/JiShe.CollectBusEPO.HttpApi.Host/appsettings.Production.json new file mode 100644 index 0000000..c1860fa --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/appsettings.Production.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/appsettings.json b/web/JiShe.CollectBusEPO.HttpApi.Host/appsettings.json new file mode 100644 index 0000000..92d8dc2 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/appsettings.json @@ -0,0 +1,104 @@ +{ + "Serilog": { + "Using": [ + "Serilog.Sinks.Console", + "Serilog.Sinks.File" + ], + "MinimumLevel": { + "Default": "Debug", + "Override": { + "Microsoft": "Information", + "Volo.Abp": "Information", + "Hangfire": "Information", + "DotNetCore.CAP": "Information", + "Serilog.AspNetCore": "Information", + "Microsoft.EntityFrameworkCore": "Warning", + "Microsoft.AspNetCore": "Information" + } + }, + "WriteTo": [ + { + "Name": "Console" + }, + { + "Name": "File", + "Args": { + "path": "logs/logs-.txt", + "rollingInterval": "Day" + } + } + ] + }, + "ConnectionStrings": { + "Default": "mongodb://mongo_PmEeF3:lixiao1980@192.168.5.9:27017/JiSheCollectBus?authSource=admin&maxPoolSize=400&minPoolSize=10&waitQueueTimeoutMS=5000", + "Kafka": "192.168.5.9:29092,192.168.5.9:39092,192.168.5.9:49092", + "PrepayDB": "server=118.190.144.92;database=jishe.sysdb;uid=sa;pwd=admin@2023;Encrypt=False;Trust Server Certificate=False", + "EnergyDB": "server=118.190.144.92;database=db_energy;uid=sa;pwd=admin@2023;Encrypt=False;Trust Server Certificate=False" + }, + "Redis": { + "Configuration": "192.168.5.9:6380,password=1q2w3e!@#,syncTimeout=30000,abortConnect=false,connectTimeout=30000,allowAdmin=true", + "MaxPoolSize": "50", + "DefaultDB": "14", + "HangfireDB": "13" + }, + "Kafka": { + "BootstrapServers": "192.168.5.9:29092,192.168.5.9:39092,192.168.5.9:49092", + "EnableFilter": true, + "EnableAuthorization": false, + "SecurityProtocol": "SaslPlaintext", + "SaslMechanism": "Plain", + "SaslUserName": "lixiao", + "SaslPassword": "lixiao1980", + "KafkaReplicationFactor": 3, + "NumPartitions": 30, + "FirstCollectionTime": "2025-04-22 16:07:00" + }, + "IoTDBOptions": { + "UserName": "root", + "Password": "root", + "ClusterList": [ "121.42.175.177:16667" ], + "PoolSize": 32, + "DataBaseName": "energy", + "OpenDebugMode": true, + "UseTableSessionPoolByDefault": false + }, + "App": { + "SelfUrl": "http://localhost:44315", + "CorsOrigins": "http://localhost:4200,http://localhost:3100" + }, + "Jwt": { + "Audience": "JiShe.CollectBus", + "SecurityKey": "dzehzRz9a8asdfasfdadfasdfasdfafsdadfasbasdf=", + "Issuer": "JiShe.CollectBus", + "ExpirationTime": 2 + }, + "HealthChecks": { + "IsEnable": false, + "HealthCheckDatabaseName": "HealthChecks", + "EvaluationTimeInSeconds": 10, + "MinimumSecondsBetweenFailureNotifications": 60 + }, + "SwaggerConfig": [ + { + "GroupName": "Basic", + "Title": "【后台管理】基础模块", + "Version": "V1" + }, + { + "GroupName": "Business", + "Title": "【后台管理】业务模块", + "Version": "V1" + } + ], + "ServerApplicationOptions": { + "ServerTagName": "JiSheCollectBus99", + "SystemType": "Energy", + "FirstCollectionTime": "2025-04-28 15:07:00", + "AutomaticVerificationTime": "16:07:00", + "AutomaticTerminalVersionTime": "17:07:00", + "AutomaticTelematicsModuleTime": "17:30:00", + "AutomaticDayFreezeTime": "02:30:00", + "AutomaticMonthFreezeTime": "03:30:00", + "DefaultProtocolPlugin": "T37612012ProtocolPlugin" + } +} \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/tempkey.jwk b/web/JiShe.CollectBusEPO.HttpApi.Host/tempkey.jwk new file mode 100644 index 0000000..b4f8b7d --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/tempkey.jwk @@ -0,0 +1 @@ +{"AdditionalData":{},"Alg":"RS256","Crv":null,"D":"eH-Ld45J684VguyI2jACQEEVGtTx79Nt7ElT20JeUi-pbVnhJxxAJwnAe68d9Q8skpv6BxZs5QuyIORwfGpJK-lKVuo8EtyUQTuUuPmP4o1YK4cv2FIi5xN18tddTltg2JmJi1sN2AD5z-zwm45YNvoFxdQYlnUlA9lJL8QfG0HQLMQX1sv2_lgND8RfRGQBCpVXC2kcap4GvkFVQpKaQ5xaUqvNdH6ftwkGMdFfMRlHGhyYyabIjs4T16HslofvXiHbOCAzk37HtBNNsBpeoQuZul1-G7tAndHe1XtuGvuE-k1fyqdm3YiCU8wK7FpvQU3x6JqvfqmWgMAPnWKOtQ","DP":"hd3I9Nc3LlaZDoPg20JZu48kpv9rMMQ0rLtcZ0UPB_HpZWBC_No-3t3t1HFRbD4iz0MCpCR6gb5q4UsL2N2xh3Q8OhQ1Zrl76UKDZrVKs3oE0VVr9K2VUU3s1sytE4OWSv7PAHYURygcx_MrunMn8Ryd4ZJBQ_g5M2GvpBj1o5M","DQ":"T3ibciK4KxGGHqau9dnWxE6l3fGtcNw1GcjV93Lxe0NKTbfrwPEIFVVAyPsFS8QdmRXEgyunkDFKLHyq2hXBi2fZCwXGoWkUqVUKAKMaNYZaDDd_XeJKOu7mwNY8rgxNETHCyMSnnNNPNabBf2iiXmrBnMwesle2L1kwky42yns","E":"AQAB","K":null,"KeyId":"0D94529E740F5FD50EC6B8A19FF460D6","Kid":"0D94529E740F5FD50EC6B8A19FF460D6","Kty":"RSA","N":"w2jhtWb6a3kH4VqAPfuuvdF5hBh7U6gwMRnddHAH7zaVL6aYwjpCzNW56RQy4W4Zabv1My4Yw9GZpjrOcyr3Bm669eZjn_JC0O00eRTNStNgmg2kB_6AB6ROkEW7br1JC0jKr_dXhOYPBMmR-KHvpwaZXA9R1xOqY02S3JD0KB-TGMSC9q1RlVydt81aMOHFzWVyruLsYGdmcKhRPKDtL6GXpU_DG1gzzOYbk795x_D_UUTOJYuhIDEj7aYi3o32yXLEBvh4Q7HPLjLcWzV-EzCn6Ossl-EVJ2TrR53Eln03R93Vmo63DzQbLIOi3yTcZD2a3O6mpGLiqyZjUducIQ","Oth":null,"P":"y84cEtE6IRBeU2sDJxjDYb50HB4nAF7-bfvbEq0haQL2sFBz-Q-uOUAeXhaS74Gh_IagmW1TzOKblVilijMHCsfOFTWlCljaDoNfdl31enh50HMFvUu8IFjcWiQ9fjR5no8n5-jDeRO5zVfgcWoRHfVTOq4Di7WlVHJRr8FB-R8","Q":"9XRZvvMIvoumlDAVxWZHkb7_an0_dFwBLqc8v74XBZhiK5SLuBqmsJICB5kwNTKzORH7yedx-RXOJWkchJLlEtmH_cQO_6WKQQAyc1PMnLPa0tYkhjotWo8VRE9bAdVmrR0cnJeudfSJ-6gDpUBQYy9g1m8cAfWbTAk3at2_gr8","QI":"xRLXLwhTdNbevlEzANlDDnU9lDeKZWV9-YrvUxHMJBBygBNVqkNFWiee7LNUi82YgTHRn46rpHY9TZf6oQbgk6xa86MyDYXGU2uGO8DHm5oh20Spp7A-RlzZ4JRXAJ3eAYMZHQIP45JApVvKbgHh_pUGjNaiqZKZ9IN6H_L9k1s","Use":null,"X":null,"X5t":null,"X5tS256":null,"X5u":null,"Y":null,"KeySize":2048,"HasPrivateKey":true,"CryptoProviderFactory":{"CryptoProviderCache":{},"CustomCryptoProvider":null,"CacheSignatureProviders":true}} \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/tempkey.rsa b/web/JiShe.CollectBusEPO.HttpApi.Host/tempkey.rsa new file mode 100644 index 0000000..ed0defa --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi.Host/tempkey.rsa @@ -0,0 +1 @@ +{"KeyId":"600caa200caf5d805eba9f06ace9e236","Parameters":{"D":"KCNDHA96eimN+UqchSKocgYITGflaAIwxzCS5KqSTkYAFliPthQx7LySuLor4F1+uLvwnh3ZocyI3y43GZu+eVHD256sxdV8/UsQz1HC23RRFqcUiAZjze8K5VMVStrBOxaa/Ds1U9/bpuNE7jZdcgFIEHsdZtCACqwtlE4nlIs1/GLiokqjBOESgxJMy9WUeDbWcvoo+YdwgKf5jt6AZHOYSS+TokLL+Y7TEfGMXe3jZD9VtSMkBSM8wGB89zNGR0FZB9maCG/BCoRJqxdYRyeb4FFXJclQtK3DexyDVqlNZQaNKVHu0tVAnVNKKcd7Iex8gA+5DNqqucUA7C/F6Q==","DP":"fr9iaNb1W4YZ/NJ56+N3SCeDQYuKobq1qeaQWmHlQsOHKoHhNZJQZ5x0M9PQilou16AwVlNGCJncMwxsSUxXn6itG0LcBnvfMeo2v3xKcij1BtFR9qfXecwEn2nnhI3mpXtZxyCdP3NIYUp9qViLJUjGJqrbQk+OIAGRQd2rRe0=","DQ":"o1umLkDodtwvpCsDguQYSjd3iob+WHNmfe/9HyjADmUehP8b9SpUgcrb+QF301J8YmQMnYZKWW5rEwKOtwsWNswgXfMnXeWerlZmz0tj9y38YczS70liU0vETsRefhrRCaXHraMvneqYNNedhsrCNalWK+DNwcixi4L59vA8ofs=","Exponent":"AQAB","InverseQ":"btd1nwwxl/E3ryfDi2bN12TuVDvv7yoPvryIlLgu+FiLpe4vaA1omDLliQBcl7oeyA563HBUop4D5oE7si+jD64N8XgFz37dD3KqUokeQ4lrTSSOePT1K+nWIl30sqDd7YE4auz4CvSjm2wXmN31+CXW1hp3YWN2972yrUt+R5U=","Modulus":"uwMB6reAVtm/Cq0BRPZ0ozBq6g3wDh2kzqFKBf8I7u8d9p7i5ExLSrOWPupHwPr/IW1VUn2TKHrJ8OnyYhznKIRxqlxj0U3D2GXijz5kfFOoHK+mlfKaDMqweRoS0UzEz58kMlgwUoDraUj6dTHTPCVPo3TqA2ImRw50j6D+jobFrY5321EFvlirZViMPDAgB8Ca7wGCqNBcCxvIPYw1O6WZmcVmjG7umelD3XjcUIQlEbIyAmi/3gXAo7NdPmgOamla6bnSWsy429HfsNpXyCfPBzV3QS3ubpTekWPoPcOVZbWwVPYtFQbhRh8PmWATRx0cV6oePZNZGxGeJl8WYQ==","P":"wplelBfVmiOPmr6iUxtOgIzuvwSqvP6Rqmh8dhaGDiJjU8OqZ0tZhuh0G+xnMLPIHb2fMeg0dqZMJZ5iXaIi1QycYn/JKz1i4cUonJ6IIQeKKf67tvzn/BY0V0N8rJw8hVfzou+/5sRBCbiHtJ2KIN1YJQuWGFFfrZJOJzc95ss=","Q":"9gTGKoDiOdrY8kqIXJ2nMhoeNryAH4q3EUrROJ7simqc28oYlGx24Sco/wOoeB2xxrdcF5JYOlyJ7H2YY/huLvJISaw/wHLPskiKiYQ78tuNwW0ip+5ceB1dSToHcEe3sR30+OeTh0Z4ZKoqthKziFGIt3EhEgiGq1gjZuWB5gM="}} \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/TemporaryFiles/.gitkeep b/web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/TemporaryFiles/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/images/cap.png b/web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/images/cap.png new file mode 100644 index 0000000000000000000000000000000000000000..76c667e0525b3368071af5abc103685afcb1894d GIT binary patch literal 11113 zcmdUV=R2HV)UJde`slq3gQ!uWmxR$GTJ+u`dM7#&Z4iVg(PK!2=)Lz&FnaWEM2$A0 zo@ajV^`3v=d^#T(<9eQ5*1Ffd?zQ%g)>Ky_#G}Q-z`!6>QHH+8z<9_D{5^n+4g6-i zM>qf<4?JHh$zha@((eLauxwwby}-bzOu)afd<1-d?51q!iGe}XjsAJi@A~5n1_sxi z3iO4Jui3#;l#kAAEB`U-z9rMc)7T|oZ@J`pnKz!nM4w(WPO{5qSY)%FO&F8(rj=BiXIUfi}|(CB*4H269s z6b6G0U{M>PKgjJIJX@y5J9Ss)Cy5UbZ<7uAT z$S?+F#Br>(Q{K1kdOa@j$?04Yf=kE2INuTQLb2MHFl}c^uDItB?z_9`Dk4lM{&qa4zE^YzUjO)`&qnr_QeLWR@UnwJQBsW09y?`nS}eX~7wbEYizp$hL- z#eAqP6Z1GY)*qELHW3RE1k-J6J|8+C16Eyi~6TJ$4IPu&j>S7QEgZGci z35SM%U}+42^4%uaba=Ef#&O_nImK|j>Z$ILN&Eg;VV(m5j$uR($=nqqORtw@rMG3q zN*lkdgt#HM@ueDfKcTWgxFrFGy@GC1U-DS>eC_~AmBPron)~*NgN-h*!b(>r`Awqgba9Y4+t+tJT2ib+eadu38ng>3jQsz^Y+?}4YJBHq6rj%tf?<}~~Ao&Hiycm0ia zLrNbjLIp{|NM^q}8At+FImzr|rQ)mxnADMbW$8@j!*6PuvDA!k23 z74C@hLm>j$z0lTP>@*u{#>`sZV-`SzaP5S3pPMZ@|4+-uQCOEWqfCTO<34YW1r5qKkz5AKSA z(ChRJLO|cCU&A;P1!_ooqh06X;#)X;&+O|2m3#7`nnkx4O(s{M>(|(hO(bVHHGuz; z=Kz?kKX-aXp~}DE9rei|rg&NReVr$*U^5?hsT!0>1^5}t-jHO`67H|iy53T0PKQ*eSTT?x9(R0YDN96y8paB`!hargd{)O=+;5hH zmJ41qa&!hw6In1}YyCXr6cy;~Y9Gn10Cb`hB7c-S)C)XtOG>Tu#Md>vq)*M~KPVX4z zJgWt=Jm@iT+7*trYmsJxJ184d5vn>hM~j7sH9y5Wo*nst0k)L57pRGFE%squeJ)5{d21ZWvbp6UtVV`DWKMg;zRZ*-G z8gJiGHAov(m`z@xd7Wy=^wsrRk)SY#04M$WSVV+bOpIBcv>PAPiU(l$qr|D>@$u(V zz#LHN--!tzkU^jCE0niX)a`4Lt9LF6sP*5-j0=&b@9M836TZBZ(v}LilB@{->Do`( z5Oc(etZ>W?hbhMa;e*}ALIvcYkA^>k-Q}wrSR^)?njtJZrH;t^ZB+w(J}9cizG5Ws zUg3x4qj&+%;Stn$s~fhHu}r7(49%s)Lal}(^sFDf$#L&mqOG6(+py}nsq34-M}YvJ zh-_eGt2eyFL$te!mT*&c2-*rZeedJ{@ncAE!_kvw)xck47e&P4waECJ6KxfSd%3ObT<_l+##TL@BEm@fLyVRlYmq6T>?hzn^~R#h+C~ zK=4?1?J1;dxZ|#TwIzToST&8n6nb_AB%lcvCgC3y;e!b4go$+PL z%+�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 literal 0 HcmV?d00001 diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/images/hangfire.png b/web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/images/hangfire.png new file mode 100644 index 0000000000000000000000000000000000000000..5cdeb40f0157e93361de3ca004454f7e840639f8 GIT binary patch literal 36278 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 literal 0 HcmV?d00001 diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/images/healthchecks.png b/web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/images/healthchecks.png new file mode 100644 index 0000000000000000000000000000000000000000..63950e40afe4d63b6ba37d9fd6b65c684b08e474 GIT binary patch literal 8990 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 Q(?X`9qODw}_$1_i0Pre=od5s; literal 0 HcmV?d00001 diff --git a/web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/images/miniprofiler.png b/web/JiShe.CollectBusEPO.HttpApi.Host/wwwroot/images/miniprofiler.png new file mode 100644 index 0000000000000000000000000000000000000000..244c7029ac13d24d9f11101d0d4ff550cf233dfd GIT binary patch literal 22147 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 P1AKI~4YbPcScm-=eWKC$ literal 0 HcmV?d00001 diff --git a/web/JiShe.CollectBusEPO.HttpApi/CollectBusEPOHttpApiModule.cs b/web/JiShe.CollectBusEPO.HttpApi/CollectBusEPOHttpApiModule.cs new file mode 100644 index 0000000..100383b --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi/CollectBusEPOHttpApiModule.cs @@ -0,0 +1,39 @@ + +using JiShe.CollectBus; +using JiShe.CollectBus.Localization; +using Microsoft.Extensions.DependencyInjection; + +namespace JiShe.CollectBusEPO +{ + [DependsOn( + typeof(CollectBusEPOApplicationContractsModule), + typeof(CollectBusEPOApplicationModule), + typeof(AbpAspNetCoreMvcModule) + )] + public class CollectBusEPOHttpApiModule : AbpModule + { + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(mvcBuilder => + { + mvcBuilder.AddApplicationPartIfNotExists(typeof(CollectBusEPOHttpApiModule).Assembly); + }); + + Configure(options => + { + options.ConventionalControllers + .Create(typeof(CollectBusEPOHttpApiModule).Assembly); + }); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.Resources + .Get() + .AddBaseTypes(typeof(AbpUiResource)); + }); + } + } +} diff --git a/web/JiShe.CollectBusEPO.HttpApi/Controllers/CollectBusEPOController.cs b/web/JiShe.CollectBusEPO.HttpApi/Controllers/CollectBusEPOController.cs new file mode 100644 index 0000000..cd8ffa8 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi/Controllers/CollectBusEPOController.cs @@ -0,0 +1,14 @@ +using JiShe.CollectBus.Localization; + +namespace JiShe.CollectBusEPO.Controllers +{ + /* Inherit your controllers from this class. + */ + public abstract class CollectBusEPOController : AbpController + { + protected CollectBusEPOController() + { + LocalizationResource = typeof(CollectBusResource); + } + } +} \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi/GlobalUsings.cs b/web/JiShe.CollectBusEPO.HttpApi/GlobalUsings.cs new file mode 100644 index 0000000..99bd72c --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi/GlobalUsings.cs @@ -0,0 +1,6 @@ +// Global using directives + +global using Localization.Resources.AbpUi; +global using Volo.Abp.AspNetCore.Mvc; +global using Volo.Abp.Localization; +global using Volo.Abp.Modularity; \ No newline at end of file diff --git a/web/JiShe.CollectBusEPO.HttpApi/JiShe.CollectBusEPO.HttpApi.csproj b/web/JiShe.CollectBusEPO.HttpApi/JiShe.CollectBusEPO.HttpApi.csproj new file mode 100644 index 0000000..52da299 --- /dev/null +++ b/web/JiShe.CollectBusEPO.HttpApi/JiShe.CollectBusEPO.HttpApi.csproj @@ -0,0 +1,19 @@ + + + + + + net8.0 + JiShe.CollectBusEPO + + + + + + + + + + + +