Compare commits
19 Commits
dv_karl
...
28954870f6
| Author | SHA1 | Date | |
|---|---|---|---|
| 28954870f6 | |||
| 89c8236f99 | |||
| 69d2b460b6 | |||
| 1f5bc3e971 | |||
| f1c609b4be | |||
| 1419e37ed5 | |||
| 4e465563c4 | |||
| 8bb4f18be3 | |||
| 2709816ccd | |||
| ea0d6d21f0 | |||
| 36759da784 | |||
| 26db968945 | |||
| dbde1486e2 | |||
| b545a603b0 | |||
| ff0ec31ed0 | |||
| 6f2a1d1990 | |||
| a1038f1b7b | |||
| c667df1ce3 | |||
| 886cec11fb |
44
KonSoft.sln
44
KonSoft.sln
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio Version 17
|
# Visual Studio Version 17
|
||||||
VisualStudioVersion = 17.14.36414.22 d17.14
|
VisualStudioVersion = 17.14.36414.22
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "applications", "applications", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "applications", "applications", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}"
|
||||||
EndProject
|
EndProject
|
||||||
@ -49,8 +49,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E67FA5C3-132
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{1C06151A-45F0-4D48-8303-3D4CBE9517F7}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{1C06151A-45F0-4D48-8303-3D4CBE9517F7}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KonSoft.Shared", "shared\KonSoft.Shared\KonSoft.Shared.csproj", "{345B5CDA-DC77-4956-BF96-80707EC1B5B2}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KonSoft.Admin.Application", "modules\admin\src\KonSoft.Admin.Application\KonSoft.Admin.Application.csproj", "{9D9D979A-AFC7-F9D0-2D23-8809E83F9EF9}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KonSoft.Admin.Application", "modules\admin\src\KonSoft.Admin.Application\KonSoft.Admin.Application.csproj", "{9D9D979A-AFC7-F9D0-2D23-8809E83F9EF9}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KonSoft.Admin.Application.Contracts", "modules\admin\src\KonSoft.Admin.Application.Contracts\KonSoft.Admin.Application.Contracts.csproj", "{9F68B0E2-0B1D-E0E8-1BE7-079F693A4643}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KonSoft.Admin.Application.Contracts", "modules\admin\src\KonSoft.Admin.Application.Contracts\KonSoft.Admin.Application.Contracts.csproj", "{9F68B0E2-0B1D-E0E8-1BE7-079F693A4643}"
|
||||||
@ -185,6 +183,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KonSoft.Report.HttpApi.Host
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KonSoft.TenantManagement.HttpApi.Host", "microservices\KonSoft.TenantManagement.HttpApi.Host\KonSoft.TenantManagement.HttpApi.Host.csproj", "{3641CA05-99C5-2245-C663-6CE00730E87C}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KonSoft.TenantManagement.HttpApi.Host", "microservices\KonSoft.TenantManagement.HttpApi.Host\KonSoft.TenantManagement.HttpApi.Host.csproj", "{3641CA05-99C5-2245-C663-6CE00730E87C}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KonSoft.Shared.Localization", "shared\KonSoft.Shared.Localization\KonSoft.Shared.Localization.csproj", "{A773C53C-F145-043A-7F55-79ABDB11893B}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KonSoft.Shared.Hosting", "shared\KonSoft.Shared.Hosting\KonSoft.Shared.Hosting.csproj", "{2DBCE12E-4A5F-4AB9-82BB-4BDDE48AABBF}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KonSoft.Shared.Hosting.AspNetCore", "shared\KonSoft.Shared.Hosting.AspNetCore\KonSoft.Shared.Hosting.AspNetCore.csproj", "{8CA6B487-3AAF-4E77-ACE0-01D878DE4836}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KonSoft.Shared.Hosting.Gateways", "shared\KonSoft.Shared.Hosting.Gateways\KonSoft.Shared.Hosting.Gateways.csproj", "{BBB1A129-9ED7-4F08-B710-B6C287197BFB}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KonSoft.Shared.Hosting.Microservices", "shared\KonSoft.Shared.Hosting.Microservices\KonSoft.Shared.Hosting.Microservices.csproj", "{ADF28580-F8A0-4495-96D6-736C6C7CF3FF}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@ -203,10 +211,6 @@ Global
|
|||||||
{AEBC7053-743F-4F80-BD10-8ED6A8A7B3EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{AEBC7053-743F-4F80-BD10-8ED6A8A7B3EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{AEBC7053-743F-4F80-BD10-8ED6A8A7B3EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{AEBC7053-743F-4F80-BD10-8ED6A8A7B3EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{AEBC7053-743F-4F80-BD10-8ED6A8A7B3EE}.Release|Any CPU.Build.0 = Release|Any CPU
|
{AEBC7053-743F-4F80-BD10-8ED6A8A7B3EE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{345B5CDA-DC77-4956-BF96-80707EC1B5B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{345B5CDA-DC77-4956-BF96-80707EC1B5B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{345B5CDA-DC77-4956-BF96-80707EC1B5B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{345B5CDA-DC77-4956-BF96-80707EC1B5B2}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{9D9D979A-AFC7-F9D0-2D23-8809E83F9EF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{9D9D979A-AFC7-F9D0-2D23-8809E83F9EF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{9D9D979A-AFC7-F9D0-2D23-8809E83F9EF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{9D9D979A-AFC7-F9D0-2D23-8809E83F9EF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{9D9D979A-AFC7-F9D0-2D23-8809E83F9EF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{9D9D979A-AFC7-F9D0-2D23-8809E83F9EF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
@ -475,6 +479,26 @@ Global
|
|||||||
{3641CA05-99C5-2245-C663-6CE00730E87C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{3641CA05-99C5-2245-C663-6CE00730E87C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{3641CA05-99C5-2245-C663-6CE00730E87C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{3641CA05-99C5-2245-C663-6CE00730E87C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{3641CA05-99C5-2245-C663-6CE00730E87C}.Release|Any CPU.Build.0 = Release|Any CPU
|
{3641CA05-99C5-2245-C663-6CE00730E87C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{A773C53C-F145-043A-7F55-79ABDB11893B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{A773C53C-F145-043A-7F55-79ABDB11893B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{A773C53C-F145-043A-7F55-79ABDB11893B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{A773C53C-F145-043A-7F55-79ABDB11893B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{2DBCE12E-4A5F-4AB9-82BB-4BDDE48AABBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{2DBCE12E-4A5F-4AB9-82BB-4BDDE48AABBF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{2DBCE12E-4A5F-4AB9-82BB-4BDDE48AABBF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{2DBCE12E-4A5F-4AB9-82BB-4BDDE48AABBF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{8CA6B487-3AAF-4E77-ACE0-01D878DE4836}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{8CA6B487-3AAF-4E77-ACE0-01D878DE4836}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{8CA6B487-3AAF-4E77-ACE0-01D878DE4836}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{8CA6B487-3AAF-4E77-ACE0-01D878DE4836}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{BBB1A129-9ED7-4F08-B710-B6C287197BFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{BBB1A129-9ED7-4F08-B710-B6C287197BFB}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{BBB1A129-9ED7-4F08-B710-B6C287197BFB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{BBB1A129-9ED7-4F08-B710-B6C287197BFB}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{ADF28580-F8A0-4495-96D6-736C6C7CF3FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{ADF28580-F8A0-4495-96D6-736C6C7CF3FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{ADF28580-F8A0-4495-96D6-736C6C7CF3FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{ADF28580-F8A0-4495-96D6-736C6C7CF3FF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
@ -498,7 +522,6 @@ Global
|
|||||||
{6C762F40-30BB-4CDA-951B-01D45F7C2B53} = {AAF02051-771B-4CC0-BD17-1A3643F83E09}
|
{6C762F40-30BB-4CDA-951B-01D45F7C2B53} = {AAF02051-771B-4CC0-BD17-1A3643F83E09}
|
||||||
{E67FA5C3-132C-4F47-B6A6-8FA4376C70BB} = {CF59695F-7948-4743-A467-42E4B4C9EECA}
|
{E67FA5C3-132C-4F47-B6A6-8FA4376C70BB} = {CF59695F-7948-4743-A467-42E4B4C9EECA}
|
||||||
{1C06151A-45F0-4D48-8303-3D4CBE9517F7} = {CF59695F-7948-4743-A467-42E4B4C9EECA}
|
{1C06151A-45F0-4D48-8303-3D4CBE9517F7} = {CF59695F-7948-4743-A467-42E4B4C9EECA}
|
||||||
{345B5CDA-DC77-4956-BF96-80707EC1B5B2} = {7EFFD2C6-2041-4967-A715-0F817D70C433}
|
|
||||||
{9D9D979A-AFC7-F9D0-2D23-8809E83F9EF9} = {EBCB740D-07E7-4CED-A422-90EB824B9021}
|
{9D9D979A-AFC7-F9D0-2D23-8809E83F9EF9} = {EBCB740D-07E7-4CED-A422-90EB824B9021}
|
||||||
{9F68B0E2-0B1D-E0E8-1BE7-079F693A4643} = {EBCB740D-07E7-4CED-A422-90EB824B9021}
|
{9F68B0E2-0B1D-E0E8-1BE7-079F693A4643} = {EBCB740D-07E7-4CED-A422-90EB824B9021}
|
||||||
{D1A86C77-533D-5B68-04F1-7F7BFBF56AC7} = {EBCB740D-07E7-4CED-A422-90EB824B9021}
|
{D1A86C77-533D-5B68-04F1-7F7BFBF56AC7} = {EBCB740D-07E7-4CED-A422-90EB824B9021}
|
||||||
@ -566,6 +589,11 @@ Global
|
|||||||
{9A034977-0FBC-A3C8-8432-9FDD073F215A} = {4CBFE8AF-968B-453D-B763-3D0437C0883D}
|
{9A034977-0FBC-A3C8-8432-9FDD073F215A} = {4CBFE8AF-968B-453D-B763-3D0437C0883D}
|
||||||
{1C89424B-DA16-8840-4AB0-C446CFBD634C} = {4CBFE8AF-968B-453D-B763-3D0437C0883D}
|
{1C89424B-DA16-8840-4AB0-C446CFBD634C} = {4CBFE8AF-968B-453D-B763-3D0437C0883D}
|
||||||
{3641CA05-99C5-2245-C663-6CE00730E87C} = {4CBFE8AF-968B-453D-B763-3D0437C0883D}
|
{3641CA05-99C5-2245-C663-6CE00730E87C} = {4CBFE8AF-968B-453D-B763-3D0437C0883D}
|
||||||
|
{A773C53C-F145-043A-7F55-79ABDB11893B} = {7EFFD2C6-2041-4967-A715-0F817D70C433}
|
||||||
|
{2DBCE12E-4A5F-4AB9-82BB-4BDDE48AABBF} = {7EFFD2C6-2041-4967-A715-0F817D70C433}
|
||||||
|
{8CA6B487-3AAF-4E77-ACE0-01D878DE4836} = {7EFFD2C6-2041-4967-A715-0F817D70C433}
|
||||||
|
{BBB1A129-9ED7-4F08-B710-B6C287197BFB} = {7EFFD2C6-2041-4967-A715-0F817D70C433}
|
||||||
|
{ADF28580-F8A0-4495-96D6-736C6C7CF3FF} = {7EFFD2C6-2041-4967-A715-0F817D70C433}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {28315BFD-90E7-4E14-A2EA-F3D23AF4126F}
|
SolutionGuid = {28315BFD-90E7-4E14-A2EA-F3D23AF4126F}
|
||||||
|
|||||||
@ -1,23 +1,41 @@
|
|||||||
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
|
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
|
||||||
USER $APP_UID
|
USER $APP_UID
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
EXPOSE 8080
|
|
||||||
EXPOSE 8081
|
EXPOSE 8081
|
||||||
|
|
||||||
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
|
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
|
||||||
ARG BUILD_CONFIGURATION=Release
|
ARG BUILD_CONFIGURATION=Release
|
||||||
|
ARG NODE_VERSION=16.13.0
|
||||||
|
ARG YARN_VERSION=1.22.15
|
||||||
|
RUN apt-get update -yq \
|
||||||
|
&& apt-get install -yq curl gnupg \
|
||||||
|
&& curl -sL https://deb.nodesource.com/setup_16.x | bash - \
|
||||||
|
&& apt-get install -yq nodejs \
|
||||||
|
&& npm install -g yarn@${YARN_VERSION} \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
ARG BUILD_CONFIGURATION=Release
|
||||||
WORKDIR /src
|
WORKDIR /src
|
||||||
COPY ["NuGet.Config", "."]
|
COPY ["NuGet.Config", "."]
|
||||||
COPY ["applications/KonSoft.AuthServer/KonSoft.AuthServer.csproj", "applications/KonSoft.AuthServer/"]
|
COPY ["applications/KonSoft.AuthServer/KonSoft.AuthServer.csproj", "applications/KonSoft.AuthServer/"]
|
||||||
|
COPY ["shared/KonSoft.Shared.Hosting.Microservices/KonSoft.Shared.Hosting.Microservices.csproj", "shared/KonSoft.Shared.Hosting.Microservices/"]
|
||||||
|
COPY ["shared/KonSoft.Shared.Hosting.AspNetCore/KonSoft.Shared.Hosting.AspNetCore.csproj", "shared/KonSoft.Shared.Hosting.AspNetCore/"]
|
||||||
|
COPY ["shared/KonSoft.Shared.Hosting/KonSoft.Shared.Hosting.csproj", "shared/KonSoft.Shared.Hosting/"]
|
||||||
|
COPY ["shared/KonSoft.Shared.Localization/KonSoft.Shared.Localization.csproj", "shared/KonSoft.Shared.Localization/"]
|
||||||
RUN dotnet restore "./applications/KonSoft.AuthServer/KonSoft.AuthServer.csproj"
|
RUN dotnet restore "./applications/KonSoft.AuthServer/KonSoft.AuthServer.csproj"
|
||||||
COPY . .
|
COPY . .
|
||||||
WORKDIR "/src/applications/KonSoft.AuthServer"
|
WORKDIR "/src/applications/KonSoft.AuthServer"
|
||||||
|
RUN dotnet tool install -g Volo.Abp.Cli \
|
||||||
|
&& export PATH="$PATH:/root/.dotnet/tools" \
|
||||||
|
&& abp install-libs
|
||||||
RUN dotnet build "./KonSoft.AuthServer.csproj" -c $BUILD_CONFIGURATION -o /app/build
|
RUN dotnet build "./KonSoft.AuthServer.csproj" -c $BUILD_CONFIGURATION -o /app/build
|
||||||
|
|
||||||
|
# 此阶段用于发布要复制到最终阶段的服务项目
|
||||||
FROM build AS publish
|
FROM build AS publish
|
||||||
ARG BUILD_CONFIGURATION=Release
|
ARG BUILD_CONFIGURATION=Release
|
||||||
RUN dotnet publish "./KonSoft.AuthServer.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
|
RUN dotnet publish "./KonSoft.AuthServer.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
|
||||||
|
|
||||||
|
# 此阶段在生产中使用,或在常规模式下从 VS 运行时使用(在不使用调试配置时为默认值)
|
||||||
FROM base AS final
|
FROM base AS final
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY --from=publish /app/publish .
|
COPY --from=publish /app/publish .
|
||||||
|
|||||||
@ -40,21 +40,10 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.22.1" />
|
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.22.1" />
|
||||||
<PackageReference Include="Serilog.AspNetCore" Version="8.0.0" />
|
|
||||||
<PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="8.0.4" />
|
|
||||||
<PackageReference Include="DistributedLock.Redis" Version="1.0.2" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic" Version="8.3.4" />
|
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic" Version="8.3.4" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Volo.Abp.Autofac" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.DistributedLocking" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Serilog" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Account.Web.OpenIddict" Version="8.3.4" />
|
<PackageReference Include="Volo.Abp.Account.Web.OpenIddict" Version="8.3.4" />
|
||||||
<PackageReference Include="Volo.Abp.Account.Application" Version="8.3.4" />
|
<PackageReference Include="Volo.Abp.Account.Application" Version="8.3.4" />
|
||||||
<PackageReference Include="Volo.Abp.Account.HttpApi" Version="8.3.4" />
|
<PackageReference Include="Volo.Abp.Account.HttpApi" Version="8.3.4" />
|
||||||
@ -69,4 +58,8 @@
|
|||||||
<PackageReference Include="Volo.Abp.OpenIddict.EntityFrameworkCore" Version="8.3.4" />
|
<PackageReference Include="Volo.Abp.OpenIddict.EntityFrameworkCore" Version="8.3.4" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\shared\KonSoft.Shared.Hosting.Microservices\KonSoft.Shared.Hosting.Microservices.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@ -1,49 +1,32 @@
|
|||||||
|
using KonSoft.Shared.Hosting.AspNetCore;
|
||||||
|
using KonSoft.Shared.Hosting.Microservices;
|
||||||
|
using KonSoft.Shared.Localization.Localization;
|
||||||
using Localization.Resources.AbpUi;
|
using Localization.Resources.AbpUi;
|
||||||
using Medallion.Threading;
|
|
||||||
using Medallion.Threading.Redis;
|
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Cors;
|
|
||||||
using Microsoft.AspNetCore.DataProtection;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using StackExchange.Redis;
|
|
||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using Volo.Abp;
|
using Volo.Abp;
|
||||||
using Volo.Abp.Account;
|
using Volo.Abp.Account;
|
||||||
using Volo.Abp.Account.Localization;
|
using Volo.Abp.Account.Localization;
|
||||||
using Volo.Abp.Account.Web;
|
using Volo.Abp.Account.Web;
|
||||||
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
|
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
|
||||||
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic;
|
|
||||||
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling;
|
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling;
|
||||||
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared;
|
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared;
|
||||||
using Volo.Abp.AspNetCore.Serilog;
|
|
||||||
using Volo.Abp.Auditing;
|
using Volo.Abp.Auditing;
|
||||||
using Volo.Abp.Autofac;
|
|
||||||
using Volo.Abp.BackgroundJobs;
|
using Volo.Abp.BackgroundJobs;
|
||||||
using Volo.Abp.Caching;
|
|
||||||
using Volo.Abp.Caching.StackExchangeRedis;
|
|
||||||
using Volo.Abp.DistributedLocking;
|
|
||||||
using Volo.Abp.Localization;
|
using Volo.Abp.Localization;
|
||||||
using Volo.Abp.Modularity;
|
using Volo.Abp.Modularity;
|
||||||
using Volo.Abp.OpenIddict;
|
using Volo.Abp.OpenIddict;
|
||||||
using Volo.Abp.Security.Claims;
|
using Volo.Abp.Security.Claims;
|
||||||
using Volo.Abp.UI.Navigation.Urls;
|
|
||||||
using Volo.Abp.VirtualFileSystem;
|
|
||||||
|
|
||||||
namespace KonSoft;
|
namespace KonSoft;
|
||||||
|
|
||||||
[DependsOn(
|
[DependsOn(
|
||||||
typeof(AbpAutofacModule),
|
|
||||||
typeof(AbpCachingStackExchangeRedisModule),
|
|
||||||
typeof(AbpDistributedLockingModule),
|
|
||||||
typeof(AbpAccountWebOpenIddictModule),
|
typeof(AbpAccountWebOpenIddictModule),
|
||||||
typeof(AbpAccountApplicationModule),
|
typeof(AbpAccountApplicationModule),
|
||||||
typeof(AbpAccountHttpApiModule),
|
typeof(AbpAccountHttpApiModule),
|
||||||
typeof(AbpAspNetCoreMvcUiBasicThemeModule),
|
typeof(KonSoftSharedHostingMicroservicesModule)
|
||||||
typeof(AbpAspNetCoreSerilogModule)
|
)]
|
||||||
)]
|
|
||||||
public class KonSoftAuthServerModule : AbpModule
|
public class KonSoftAuthServerModule : AbpModule
|
||||||
{
|
{
|
||||||
public override void PreConfigureServices(ServiceConfigurationContext context)
|
public override void PreConfigureServices(ServiceConfigurationContext context)
|
||||||
@ -70,7 +53,8 @@ public class KonSoftAuthServerModule : AbpModule
|
|||||||
|
|
||||||
PreConfigure<OpenIddictServerBuilder>(serverBuilder =>
|
PreConfigure<OpenIddictServerBuilder>(serverBuilder =>
|
||||||
{
|
{
|
||||||
serverBuilder.AddProductionEncryptionAndSigningCertificate("openiddict.pfx", "59464dba-b66e-48cd-8b81-2e4a9c08c977");
|
serverBuilder.AddProductionEncryptionAndSigningCertificate("openiddict.pfx",
|
||||||
|
"59464dba-b66e-48cd-8b81-2e4a9c08c977");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -94,10 +78,7 @@ public class KonSoftAuthServerModule : AbpModule
|
|||||||
{
|
{
|
||||||
options.StyleBundles.Configure(
|
options.StyleBundles.Configure(
|
||||||
BasicThemeBundles.Styles.Global,
|
BasicThemeBundles.Styles.Global,
|
||||||
bundle =>
|
bundle => { bundle.AddFiles("/global-styles.css"); }
|
||||||
{
|
|
||||||
bundle.AddFiles("/global-styles.css");
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -107,53 +88,7 @@ public class KonSoftAuthServerModule : AbpModule
|
|||||||
options.ApplicationName = "AuthServer";
|
options.ApplicationName = "AuthServer";
|
||||||
});
|
});
|
||||||
|
|
||||||
Configure<AppUrlOptions>(options =>
|
Configure<AbpBackgroundJobOptions>(options => { options.IsJobExecutionEnabled = false; });
|
||||||
{
|
|
||||||
options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"];
|
|
||||||
options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"]?.Split(',') ?? []);
|
|
||||||
});
|
|
||||||
|
|
||||||
Configure<AbpBackgroundJobOptions>(options =>
|
|
||||||
{
|
|
||||||
options.IsJobExecutionEnabled = false;
|
|
||||||
});
|
|
||||||
|
|
||||||
Configure<AbpDistributedCacheOptions>(options =>
|
|
||||||
{
|
|
||||||
options.KeyPrefix = "KonSoft:";
|
|
||||||
});
|
|
||||||
|
|
||||||
var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("KonSoft");
|
|
||||||
if (!hostingEnvironment.IsDevelopment())
|
|
||||||
{
|
|
||||||
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
|
|
||||||
dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "KonSoft-Protection-Keys");
|
|
||||||
}
|
|
||||||
|
|
||||||
context.Services.AddSingleton<IDistributedLockProvider>(sp =>
|
|
||||||
{
|
|
||||||
var connection = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
|
|
||||||
return new RedisDistributedSynchronizationProvider(connection.GetDatabase());
|
|
||||||
});
|
|
||||||
|
|
||||||
context.Services.AddCors(options =>
|
|
||||||
{
|
|
||||||
options.AddDefaultPolicy(builder =>
|
|
||||||
{
|
|
||||||
builder
|
|
||||||
.WithOrigins(
|
|
||||||
configuration["App:CorsOrigins"]?
|
|
||||||
.Split(",", StringSplitOptions.RemoveEmptyEntries)
|
|
||||||
.Select(o => o.RemovePostFix("/"))
|
|
||||||
.ToArray() ?? []
|
|
||||||
)
|
|
||||||
.WithAbpExposedHeaders()
|
|
||||||
.SetIsOriginAllowedToAllowWildcardSubdomains()
|
|
||||||
.AllowAnyHeader()
|
|
||||||
.AllowAnyMethod()
|
|
||||||
.AllowCredentials();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
context.Services.Configure<AbpClaimsPrincipalFactoryOptions>(options =>
|
context.Services.Configure<AbpClaimsPrincipalFactoryOptions>(options =>
|
||||||
{
|
{
|
||||||
@ -185,7 +120,7 @@ public class KonSoftAuthServerModule : AbpModule
|
|||||||
app.UseAuthentication();
|
app.UseAuthentication();
|
||||||
app.UseAbpOpenIddictValidation();
|
app.UseAbpOpenIddictValidation();
|
||||||
|
|
||||||
if (MultiTenancyConsts.IsEnabled)
|
if (KonSoftConsts.MultiTenancyEnabled)
|
||||||
{
|
{
|
||||||
app.UseMultiTenancy();
|
app.UseMultiTenancy();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +1,14 @@
|
|||||||
using Microsoft.Extensions.Localization;
|
using KonSoft.Shared.Localization.Localization;
|
||||||
using KonSoft.Localization;
|
using Microsoft.Extensions.Localization;
|
||||||
using Volo.Abp.Ui.Branding;
|
|
||||||
using Volo.Abp.DependencyInjection;
|
using Volo.Abp.DependencyInjection;
|
||||||
|
using Volo.Abp.Ui.Branding;
|
||||||
|
|
||||||
namespace KonSoft;
|
namespace KonSoft;
|
||||||
|
|
||||||
[Dependency(ReplaceServices = true)]
|
[Dependency(ReplaceServices = true)]
|
||||||
public class KonSoftBrandingProvider : DefaultBrandingProvider
|
public class KonSoftBrandingProvider : DefaultBrandingProvider
|
||||||
{
|
{
|
||||||
private IStringLocalizer<KonSoftResource> _localizer;
|
private readonly IStringLocalizer<KonSoftResource> _localizer;
|
||||||
|
|
||||||
public KonSoftBrandingProvider(IStringLocalizer<KonSoftResource> localizer)
|
public KonSoftBrandingProvider(IStringLocalizer<KonSoftResource> localizer)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,12 +1,13 @@
|
|||||||
@page
|
@page
|
||||||
|
@using System.Net
|
||||||
|
@using KonSoft.Shared.Localization.Localization
|
||||||
@using Microsoft.AspNetCore.Http.Extensions
|
@using Microsoft.AspNetCore.Http.Extensions
|
||||||
@using Microsoft.AspNetCore.Mvc.Localization
|
@using Microsoft.AspNetCore.Mvc.Localization
|
||||||
@using KonSoft.Pages
|
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Grid
|
||||||
@using KonSoft.Localization
|
|
||||||
@using Volo.Abp.Users
|
|
||||||
@using Volo.Abp.AspNetCore.Mvc.UI.Theming
|
@using Volo.Abp.AspNetCore.Mvc.UI.Theming
|
||||||
@using Volo.Abp.Ui.Branding
|
@using Volo.Abp.Ui.Branding
|
||||||
@model IndexModel
|
@using Volo.Abp.Users
|
||||||
|
@model KonSoft.Pages.IndexModel
|
||||||
@inject IHtmlLocalizer<KonSoftResource> L
|
@inject IHtmlLocalizer<KonSoftResource> L
|
||||||
@inject ICurrentUser CurrentUser
|
@inject ICurrentUser CurrentUser
|
||||||
@inject IBrandingProvider BrandingProvider
|
@inject IBrandingProvider BrandingProvider
|
||||||
@ -50,7 +51,7 @@
|
|||||||
{
|
{
|
||||||
<div class="">
|
<div class="">
|
||||||
<a abp-button="Outline_Primary" asp-controller="Manage" asp-action="Index" asp-area="Account" class="me-2">@L["MyAccount"]</a>
|
<a abp-button="Outline_Primary" asp-controller="Manage" asp-action="Index" asp-area="Account" class="me-2">@L["MyAccount"]</a>
|
||||||
<a abp-button="Primary" asp-controller="Logout" asp-action="Index" asp-area="Account" asp-route-returnUrl="/" >@L["Logout"]</a>
|
<a abp-button="Primary" asp-controller="Logout" asp-action="Index" asp-area="Account" asp-route-returnUrl="/">@L["Logout"]</a>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -64,13 +65,13 @@
|
|||||||
<abp-column size="_6">
|
<abp-column size="_6">
|
||||||
<div class="ml-auto p-2 float-end">
|
<div class="ml-auto p-2 float-end">
|
||||||
<abp-dropdown>
|
<abp-dropdown>
|
||||||
<abp-dropdown-button text="@Model.CurrentLanguage" />
|
<abp-dropdown-button text="@Model.CurrentLanguage"/>
|
||||||
@if (@Model.Languages != null)
|
@if (Model.Languages != null)
|
||||||
{
|
{
|
||||||
<abp-dropdown-menu>
|
<abp-dropdown-menu>
|
||||||
@foreach (var language in Model.Languages)
|
@foreach (var language in Model.Languages)
|
||||||
{
|
{
|
||||||
var languageUrl = Url.Content($"~/Abp/Languages/Switch?culture={language.CultureName}&uiCulture={language.UiCultureName}&returnUrl={System.Net.WebUtility.UrlEncode(Request.GetEncodedPathAndQuery())}");
|
var languageUrl = Url.Content($"~/Abp/Languages/Switch?culture={language.CultureName}&uiCulture={language.UiCultureName}&returnUrl={WebUtility.UrlEncode(Request.GetEncodedPathAndQuery())}");
|
||||||
<abp-dropdown-item href="@languageUrl">@language.DisplayName</abp-dropdown-item>
|
<abp-dropdown-item href="@languageUrl">@language.DisplayName</abp-dropdown-item>
|
||||||
}
|
}
|
||||||
</abp-dropdown-menu>
|
</abp-dropdown-menu>
|
||||||
@ -82,12 +83,12 @@
|
|||||||
|
|
||||||
@if (Model.Applications != null)
|
@if (Model.Applications != null)
|
||||||
{
|
{
|
||||||
<hr class="m-2" />
|
<hr class="m-2"/>
|
||||||
|
|
||||||
<abp-row class="mt-3">
|
<abp-row class="mt-3">
|
||||||
@foreach (var application in Model.Applications)
|
@foreach (var application in Model.Applications)
|
||||||
{
|
{
|
||||||
<abp-column size-md="@Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Grid.ColumnSize._4" class="mb-2">
|
<abp-column size-md="@ColumnSize._4" class="mb-2">
|
||||||
<abp-card>
|
<abp-card>
|
||||||
<abp-card-body>
|
<abp-card-body>
|
||||||
@{
|
@{
|
||||||
|
|||||||
@ -9,6 +9,12 @@ namespace KonSoft.Pages;
|
|||||||
|
|
||||||
public class IndexModel : AbpPageModel
|
public class IndexModel : AbpPageModel
|
||||||
{
|
{
|
||||||
|
public IndexModel(IOpenIddictApplicationRepository openIdApplicationRepository, ILanguageProvider languageProvider)
|
||||||
|
{
|
||||||
|
OpenIdApplicationRepository = openIdApplicationRepository;
|
||||||
|
LanguageProvider = languageProvider;
|
||||||
|
}
|
||||||
|
|
||||||
public List<OpenIddictApplication>? Applications { get; protected set; }
|
public List<OpenIddictApplication>? Applications { get; protected set; }
|
||||||
|
|
||||||
public IReadOnlyList<LanguageInfo>? Languages { get; protected set; }
|
public IReadOnlyList<LanguageInfo>? Languages { get; protected set; }
|
||||||
@ -19,12 +25,6 @@ public class IndexModel : AbpPageModel
|
|||||||
|
|
||||||
protected ILanguageProvider LanguageProvider { get; }
|
protected ILanguageProvider LanguageProvider { get; }
|
||||||
|
|
||||||
public IndexModel(IOpenIddictApplicationRepository openIdApplicationRepository, ILanguageProvider languageProvider)
|
|
||||||
{
|
|
||||||
OpenIdApplicationRepository = openIdApplicationRepository;
|
|
||||||
LanguageProvider = languageProvider;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task OnGetAsync()
|
public async Task OnGetAsync()
|
||||||
{
|
{
|
||||||
Applications = await OpenIdApplicationRepository.GetListAsync();
|
Applications = await OpenIdApplicationRepository.GetListAsync();
|
||||||
|
|||||||
@ -10,7 +10,7 @@ namespace KonSoft;
|
|||||||
|
|
||||||
public class Program
|
public class Program
|
||||||
{
|
{
|
||||||
public async static Task<int> Main(string[] args)
|
public static async Task<int> Main(string[] args)
|
||||||
{
|
{
|
||||||
Log.Logger = new LoggerConfiguration()
|
Log.Logger = new LoggerConfiguration()
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
|
|||||||
@ -1,38 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"$schema": "http://json.schemastore.org/launchsettings.json",
|
||||||
"profiles": {
|
"profiles": {
|
||||||
"IIS Express": {
|
"http": {
|
||||||
"commandName": "IISExpress",
|
|
||||||
"launchBrowser": true,
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"KonSoft.AuthServer": {
|
|
||||||
"commandName": "Project",
|
"commandName": "Project",
|
||||||
"launchBrowser": true,
|
"launchBrowser": true,
|
||||||
"environmentVariables": {
|
"environmentVariables": {
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
},
|
},
|
||||||
"applicationUrl": "https://localhost:44322"
|
"applicationUrl": "https://localhost:44322"
|
||||||
},
|
|
||||||
"Container (Dockerfile)": {
|
|
||||||
"commandName": "Docker",
|
|
||||||
"launchBrowser": true,
|
|
||||||
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_HTTPS_PORTS": "8081",
|
|
||||||
"ASPNETCORE_HTTP_PORTS": "8080"
|
|
||||||
},
|
|
||||||
"publishAllPorts": true,
|
|
||||||
"useSSL": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"iisSettings": {
|
|
||||||
"windowsAuthentication": false,
|
|
||||||
"anonymousAuthentication": true,
|
|
||||||
"iisExpress": {
|
|
||||||
"applicationUrl": "https://localhost:44322",
|
|
||||||
"sslPort": 44322
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,11 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<location path="." inheritInChildApplications="false">
|
<location path="." inheritInChildApplications="false">
|
||||||
<system.webServer>
|
<system.webServer>
|
||||||
<handlers>
|
<handlers>
|
||||||
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
||||||
</handlers>
|
</handlers>
|
||||||
<aspNetCore processPath="dotnet" arguments=".\KonSoft.AuthServer.dll" stdoutLogEnabled="false" stdoutLogFile=".\Logs\stdout" hostingModel="inprocess" />
|
<aspNetCore processPath="dotnet" arguments=".\KonSoft.AuthServer.dll" stdoutLogEnabled="false"
|
||||||
|
stdoutLogFile=".\Logs\stdout" hostingModel="inprocess" />
|
||||||
</system.webServer>
|
</system.webServer>
|
||||||
</location>
|
</location>
|
||||||
<system.webServer>
|
<system.webServer>
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
namespace KonSoft.BackgroundJobs.Controllers
|
namespace KonSoft.BackgroundJobs.Controllers;
|
||||||
|
|
||||||
|
[ApiController]
|
||||||
|
[Route("[controller]")]
|
||||||
|
public class WeatherForecastController : ControllerBase
|
||||||
{
|
{
|
||||||
[ApiController]
|
|
||||||
[Route("[controller]")]
|
|
||||||
public class WeatherForecastController : ControllerBase
|
|
||||||
{
|
|
||||||
private static readonly string[] Summaries =
|
private static readonly string[] Summaries =
|
||||||
[
|
[
|
||||||
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
|
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
|
||||||
@ -29,5 +29,4 @@ namespace KonSoft.BackgroundJobs.Controllers
|
|||||||
})
|
})
|
||||||
.ToArray();
|
.ToArray();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@ -1,13 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "http://json.schemastore.org/launchsettings.json",
|
"$schema": "http://json.schemastore.org/launchsettings.json",
|
||||||
"iisSettings": {
|
|
||||||
"windowsAuthentication": false,
|
|
||||||
"anonymousAuthentication": true,
|
|
||||||
"iisExpress": {
|
|
||||||
"applicationUrl": "http://localhost:4773",
|
|
||||||
"sslPort": 44380
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"profiles": {
|
"profiles": {
|
||||||
"http": {
|
"http": {
|
||||||
"commandName": "Project",
|
"commandName": "Project",
|
||||||
@ -18,24 +10,6 @@
|
|||||||
"environmentVariables": {
|
"environmentVariables": {
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"https": {
|
|
||||||
"commandName": "Project",
|
|
||||||
"dotnetRunMessages": true,
|
|
||||||
"launchBrowser": true,
|
|
||||||
"launchUrl": "swagger",
|
|
||||||
"applicationUrl": "https://localhost:7094;http://localhost:5243",
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"IIS Express": {
|
|
||||||
"commandName": "IISExpress",
|
|
||||||
"launchBrowser": true,
|
|
||||||
"launchUrl": "swagger",
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
namespace KonSoft.BackgroundJobs
|
namespace KonSoft.BackgroundJobs;
|
||||||
|
|
||||||
|
public class WeatherForecast
|
||||||
{
|
{
|
||||||
public class WeatherForecast
|
|
||||||
{
|
|
||||||
public DateOnly Date { get; set; }
|
public DateOnly Date { get; set; }
|
||||||
|
|
||||||
public int TemperatureC { get; set; }
|
public int TemperatureC { get; set; }
|
||||||
@ -9,5 +9,4 @@ namespace KonSoft.BackgroundJobs
|
|||||||
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
|
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
|
||||||
|
|
||||||
public string? Summary { get; set; }
|
public string? Summary { get; set; }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@ -1,11 +1,11 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
namespace KonSoft.BackgroundWorker.Controllers
|
namespace KonSoft.BackgroundWorker.Controllers;
|
||||||
|
|
||||||
|
[ApiController]
|
||||||
|
[Route("[controller]")]
|
||||||
|
public class WeatherForecastController : ControllerBase
|
||||||
{
|
{
|
||||||
[ApiController]
|
|
||||||
[Route("[controller]")]
|
|
||||||
public class WeatherForecastController : ControllerBase
|
|
||||||
{
|
|
||||||
private static readonly string[] Summaries =
|
private static readonly string[] Summaries =
|
||||||
[
|
[
|
||||||
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
|
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
|
||||||
@ -29,5 +29,4 @@ namespace KonSoft.BackgroundWorker.Controllers
|
|||||||
})
|
})
|
||||||
.ToArray();
|
.ToArray();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@ -1,13 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "http://json.schemastore.org/launchsettings.json",
|
"$schema": "http://json.schemastore.org/launchsettings.json",
|
||||||
"iisSettings": {
|
|
||||||
"windowsAuthentication": false,
|
|
||||||
"anonymousAuthentication": true,
|
|
||||||
"iisExpress": {
|
|
||||||
"applicationUrl": "http://localhost:22937",
|
|
||||||
"sslPort": 44300
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"profiles": {
|
"profiles": {
|
||||||
"http": {
|
"http": {
|
||||||
"commandName": "Project",
|
"commandName": "Project",
|
||||||
@ -18,24 +10,6 @@
|
|||||||
"environmentVariables": {
|
"environmentVariables": {
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"https": {
|
|
||||||
"commandName": "Project",
|
|
||||||
"dotnetRunMessages": true,
|
|
||||||
"launchBrowser": true,
|
|
||||||
"launchUrl": "swagger",
|
|
||||||
"applicationUrl": "https://localhost:7183;http://localhost:5074",
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"IIS Express": {
|
|
||||||
"commandName": "IISExpress",
|
|
||||||
"launchBrowser": true,
|
|
||||||
"launchUrl": "swagger",
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
namespace KonSoft.BackgroundWorker
|
namespace KonSoft.BackgroundWorker;
|
||||||
|
|
||||||
|
public class WeatherForecast
|
||||||
{
|
{
|
||||||
public class WeatherForecast
|
|
||||||
{
|
|
||||||
public DateOnly Date { get; set; }
|
public DateOnly Date { get; set; }
|
||||||
|
|
||||||
public int TemperatureC { get; set; }
|
public int TemperatureC { get; set; }
|
||||||
@ -9,5 +9,4 @@ namespace KonSoft.BackgroundWorker
|
|||||||
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
|
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
|
||||||
|
|
||||||
public string? Summary { get; set; }
|
public string? Summary { get; set; }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@ -1,11 +1,11 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
namespace KonSoft.InternalGateway.Controllers
|
namespace KonSoft.InternalGateway.Controllers;
|
||||||
|
|
||||||
|
[ApiController]
|
||||||
|
[Route("[controller]")]
|
||||||
|
public class WeatherForecastController : ControllerBase
|
||||||
{
|
{
|
||||||
[ApiController]
|
|
||||||
[Route("[controller]")]
|
|
||||||
public class WeatherForecastController : ControllerBase
|
|
||||||
{
|
|
||||||
private static readonly string[] Summaries =
|
private static readonly string[] Summaries =
|
||||||
[
|
[
|
||||||
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
|
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
|
||||||
@ -29,5 +29,4 @@ namespace KonSoft.InternalGateway.Controllers
|
|||||||
})
|
})
|
||||||
.ToArray();
|
.ToArray();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@ -1,7 +1,7 @@
|
|||||||
namespace KonSoft.InternalGateway
|
namespace KonSoft.InternalGateway;
|
||||||
|
|
||||||
|
public class WeatherForecast
|
||||||
{
|
{
|
||||||
public class WeatherForecast
|
|
||||||
{
|
|
||||||
public DateOnly Date { get; set; }
|
public DateOnly Date { get; set; }
|
||||||
|
|
||||||
public int TemperatureC { get; set; }
|
public int TemperatureC { get; set; }
|
||||||
@ -9,5 +9,4 @@ namespace KonSoft.InternalGateway
|
|||||||
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
|
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
|
||||||
|
|
||||||
public string? Summary { get; set; }
|
public string? Summary { get; set; }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@ -1,11 +1,11 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
namespace KonSoft.PublicGateway.Controllers
|
namespace KonSoft.PublicGateway.Controllers;
|
||||||
|
|
||||||
|
[ApiController]
|
||||||
|
[Route("[controller]")]
|
||||||
|
public class WeatherForecastController : ControllerBase
|
||||||
{
|
{
|
||||||
[ApiController]
|
|
||||||
[Route("[controller]")]
|
|
||||||
public class WeatherForecastController : ControllerBase
|
|
||||||
{
|
|
||||||
private static readonly string[] Summaries =
|
private static readonly string[] Summaries =
|
||||||
[
|
[
|
||||||
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
|
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
|
||||||
@ -29,5 +29,4 @@ namespace KonSoft.PublicGateway.Controllers
|
|||||||
})
|
})
|
||||||
.ToArray();
|
.ToArray();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@ -1,7 +1,7 @@
|
|||||||
namespace KonSoft.PublicGateway
|
namespace KonSoft.PublicGateway;
|
||||||
|
|
||||||
|
public class WeatherForecast
|
||||||
{
|
{
|
||||||
public class WeatherForecast
|
|
||||||
{
|
|
||||||
public DateOnly Date { get; set; }
|
public DateOnly Date { get; set; }
|
||||||
|
|
||||||
public int TemperatureC { get; set; }
|
public int TemperatureC { get; set; }
|
||||||
@ -9,5 +9,4 @@ namespace KonSoft.PublicGateway
|
|||||||
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
|
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
|
||||||
|
|
||||||
public string? Summary { get; set; }
|
public string? Summary { get; set; }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@ -1,179 +1,39 @@
|
|||||||
using System;
|
using KonSoft.Admin.DbMigrations;
|
||||||
using System.Collections.Generic;
|
using KonSoft.Admin.EntityFrameworkCore;
|
||||||
using System.IO;
|
using KonSoft.Shared.Hosting.AspNetCore;
|
||||||
using System.Linq;
|
using KonSoft.Shared.Hosting.Microservices;
|
||||||
using Medallion.Threading;
|
|
||||||
using Medallion.Threading.Redis;
|
|
||||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Cors;
|
|
||||||
using Microsoft.AspNetCore.DataProtection;
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using KonSoft.Admin.EntityFrameworkCore;
|
using System.Threading.Tasks;
|
||||||
using KonSoft.Admin.MultiTenancy;
|
|
||||||
using StackExchange.Redis;
|
|
||||||
using Microsoft.OpenApi.Models;
|
|
||||||
using Volo.Abp;
|
using Volo.Abp;
|
||||||
using Volo.Abp.AspNetCore.Authentication.JwtBearer;
|
using Volo.Abp.BackgroundJobs;
|
||||||
using Volo.Abp.AspNetCore.Mvc;
|
|
||||||
using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy;
|
|
||||||
using Volo.Abp.AspNetCore.Serilog;
|
|
||||||
using Volo.Abp.Autofac;
|
|
||||||
using Volo.Abp.Caching;
|
|
||||||
using Volo.Abp.Caching.StackExchangeRedis;
|
|
||||||
using Volo.Abp.DistributedLocking;
|
|
||||||
using Volo.Abp.Identity;
|
|
||||||
using Volo.Abp.Localization;
|
|
||||||
using Volo.Abp.Modularity;
|
using Volo.Abp.Modularity;
|
||||||
using Volo.Abp.Security.Claims;
|
|
||||||
using Volo.Abp.Swashbuckle;
|
|
||||||
using Volo.Abp.VirtualFileSystem;
|
|
||||||
|
|
||||||
namespace KonSoft.Admin;
|
namespace KonSoft.Admin;
|
||||||
|
|
||||||
[DependsOn(
|
[DependsOn(
|
||||||
typeof(AdminHttpApiModule),
|
typeof(AdminHttpApiModule),
|
||||||
typeof(AbpAutofacModule),
|
|
||||||
typeof(AbpCachingStackExchangeRedisModule),
|
|
||||||
typeof(AbpDistributedLockingModule),
|
|
||||||
typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
|
|
||||||
typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
|
|
||||||
typeof(AdminApplicationModule),
|
typeof(AdminApplicationModule),
|
||||||
typeof(AdminEntityFrameworkCoreModule),
|
typeof(AdminEntityFrameworkCoreModule),
|
||||||
typeof(AbpAspNetCoreSerilogModule),
|
typeof(KonSoftSharedHostingMicroservicesModule)
|
||||||
typeof(AbpSwashbuckleModule)
|
|
||||||
)]
|
)]
|
||||||
public class AdminHttpApiHostModule : AbpModule
|
public class AdminHttpApiHostModule : AbpModule
|
||||||
{
|
{
|
||||||
public override void ConfigureServices(ServiceConfigurationContext context)
|
public override void ConfigureServices(ServiceConfigurationContext context)
|
||||||
{
|
{
|
||||||
var configuration = context.Services.GetConfiguration();
|
var configuration = context.Services.GetConfiguration();
|
||||||
var hostingEnvironment = context.Services.GetHostingEnvironment();
|
|
||||||
|
|
||||||
ConfigureConventionalControllers();
|
SwaggerConfigurationHelper.ConfigureWithOidc(
|
||||||
ConfigureAuthentication(context, configuration);
|
context,
|
||||||
ConfigureCache(configuration);
|
|
||||||
ConfigureVirtualFileSystem(context);
|
|
||||||
ConfigureDataProtection(context, configuration, hostingEnvironment);
|
|
||||||
ConfigureDistributedLocking(context, configuration);
|
|
||||||
ConfigureCors(context, configuration);
|
|
||||||
ConfigureSwaggerServices(context, configuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureCache(IConfiguration configuration)
|
|
||||||
{
|
|
||||||
Configure<AbpDistributedCacheOptions>(options => { options.KeyPrefix = "Admin:"; });
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureVirtualFileSystem(ServiceConfigurationContext context)
|
|
||||||
{
|
|
||||||
var hostingEnvironment = context.Services.GetHostingEnvironment();
|
|
||||||
|
|
||||||
if (hostingEnvironment.IsDevelopment())
|
|
||||||
{
|
|
||||||
Configure<AbpVirtualFileSystemOptions>(options =>
|
|
||||||
{
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<AdminDomainSharedModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.Admin.Domain.Shared"));
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<AdminDomainModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.Admin.Domain"));
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<AdminApplicationContractsModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.Admin.Application.Contracts"));
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<AdminApplicationModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.Admin.Application"));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureConventionalControllers()
|
|
||||||
{
|
|
||||||
Configure<AbpAspNetCoreMvcOptions>(options =>
|
|
||||||
{
|
|
||||||
options.ConventionalControllers.Create(typeof(AdminApplicationModule).Assembly);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
|
|
||||||
.AddAbpJwtBearer(options =>
|
|
||||||
{
|
|
||||||
options.Authority = configuration["AuthServer:Authority"];
|
|
||||||
options.RequireHttpsMetadata = configuration.GetValue<bool>("AuthServer:RequireHttpsMetadata");
|
|
||||||
options.Audience = "Admin";
|
|
||||||
});
|
|
||||||
|
|
||||||
context.Services.Configure<AbpClaimsPrincipalFactoryOptions>(options =>
|
|
||||||
{
|
|
||||||
options.IsDynamicClaimsEnabled = true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void ConfigureSwaggerServices(ServiceConfigurationContext context, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddAbpSwaggerGenWithOAuth(
|
|
||||||
configuration["AuthServer:Authority"]!,
|
configuration["AuthServer:Authority"]!,
|
||||||
new Dictionary<string, string>
|
["AdministrationService"],
|
||||||
{
|
discoveryEndpoint: configuration["AuthServer:MetadataAddress"],
|
||||||
{"Admin", "Admin API"}
|
apiTitle: "Administration Service API"
|
||||||
},
|
);
|
||||||
options =>
|
|
||||||
{
|
|
||||||
options.SwaggerDoc("v1", new OpenApiInfo { Title = "Admin API", Version = "v1" });
|
|
||||||
options.DocInclusionPredicate((docName, description) => true);
|
|
||||||
options.CustomSchemaIds(type => type.FullName);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureDataProtection(
|
// ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
||||||
ServiceConfigurationContext context,
|
Configure<AbpBackgroundJobOptions>(options => options.IsJobExecutionEnabled = false);
|
||||||
IConfiguration configuration,
|
|
||||||
IWebHostEnvironment hostingEnvironment)
|
|
||||||
{
|
|
||||||
var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("Admin");
|
|
||||||
if (!hostingEnvironment.IsDevelopment())
|
|
||||||
{
|
|
||||||
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
|
|
||||||
dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "Admin-Protection-Keys");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureDistributedLocking(
|
|
||||||
ServiceConfigurationContext context,
|
|
||||||
IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddSingleton<IDistributedLockProvider>(sp =>
|
|
||||||
{
|
|
||||||
var connection = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
|
|
||||||
return new RedisDistributedSynchronizationProvider(connection.GetDatabase());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureCors(ServiceConfigurationContext context, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddCors(options =>
|
|
||||||
{
|
|
||||||
options.AddDefaultPolicy(builder =>
|
|
||||||
{
|
|
||||||
builder
|
|
||||||
.WithOrigins(configuration["App:CorsOrigins"]?
|
|
||||||
.Split(",", StringSplitOptions.RemoveEmptyEntries)
|
|
||||||
.Select(o => o.RemovePostFix("/"))
|
|
||||||
.ToArray() ?? [])
|
|
||||||
.WithAbpExposedHeaders()
|
|
||||||
.SetIsOriginAllowedToAllowWildcardSubdomains()
|
|
||||||
.AllowAnyHeader()
|
|
||||||
.AllowAnyMethod()
|
|
||||||
.AllowCredentials();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnApplicationInitialization(ApplicationInitializationContext context)
|
public override void OnApplicationInitialization(ApplicationInitializationContext context)
|
||||||
@ -193,7 +53,7 @@ public class AdminHttpApiHostModule : AbpModule
|
|||||||
app.UseCors();
|
app.UseCors();
|
||||||
app.UseAuthentication();
|
app.UseAuthentication();
|
||||||
|
|
||||||
if (MultiTenancyConsts.IsEnabled)
|
if (KonSoftConsts.MultiTenancyEnabled)
|
||||||
{
|
{
|
||||||
app.UseMultiTenancy();
|
app.UseMultiTenancy();
|
||||||
}
|
}
|
||||||
@ -216,4 +76,10 @@ public class AdminHttpApiHostModule : AbpModule
|
|||||||
app.UseAbpSerilogEnrichers();
|
app.UseAbpSerilogEnrichers();
|
||||||
app.UseConfiguredEndpoints();
|
app.UseConfiguredEndpoints();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//public override async Task OnPostApplicationInitializationAsync(ApplicationInitializationContext context)
|
||||||
|
//{
|
||||||
|
// await context.ServiceProvider.GetRequiredService<AdminPendingEfCoreMigrationsChecker>()
|
||||||
|
// .CheckAndApplyDatabaseMigrationsAsync();
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
using System.Threading.Tasks;
|
||||||
|
using Volo.Abp.Data;
|
||||||
|
using Volo.Abp.DependencyInjection;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.DbMigrations;
|
||||||
|
|
||||||
|
public class AdminDataSeedContributor : IDataSeedContributor, ITransientDependency
|
||||||
|
{
|
||||||
|
public Task SeedAsync(DataSeedContext context)
|
||||||
|
{
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using KonSoft.Admin.EntityFrameworkCore;
|
||||||
|
using KonSoft.Shared.Hosting.Microservices.DbMigrations.EfCore;
|
||||||
|
using Volo.Abp.DistributedLocking;
|
||||||
|
using Volo.Abp.EventBus.Distributed;
|
||||||
|
using Volo.Abp.MultiTenancy;
|
||||||
|
using Volo.Abp.Uow;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.DbMigrations;
|
||||||
|
|
||||||
|
public class AdminPendingEfCoreMigrationsChecker : PendingEfCoreMigrationsChecker<AdminDbContext>
|
||||||
|
{
|
||||||
|
public AdminPendingEfCoreMigrationsChecker(IUnitOfWorkManager unitOfWorkManager,
|
||||||
|
IServiceProvider serviceProvider,
|
||||||
|
ICurrentTenant currentTenant,
|
||||||
|
IDistributedEventBus distributedEventBus,
|
||||||
|
IAbpDistributedLock abpDistributedLock) : base(unitOfWorkManager,
|
||||||
|
serviceProvider,
|
||||||
|
currentTenant,
|
||||||
|
distributedEventBus,
|
||||||
|
abpDistributedLock,
|
||||||
|
"Clean")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -2,8 +2,9 @@ FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
|
|||||||
USER $APP_UID
|
USER $APP_UID
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
EXPOSE 8081
|
|
||||||
|
|
||||||
|
|
||||||
|
# 此阶段用于生成服务项目
|
||||||
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
|
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
|
||||||
ARG BUILD_CONFIGURATION=Release
|
ARG BUILD_CONFIGURATION=Release
|
||||||
WORKDIR /src
|
WORKDIR /src
|
||||||
@ -15,6 +16,10 @@ COPY ["modules/admin/src/KonSoft.Admin.Domain.Shared/KonSoft.Admin.Domain.Shared
|
|||||||
COPY ["modules/admin/src/KonSoft.Admin.Application.Contracts/KonSoft.Admin.Application.Contracts.csproj", "modules/admin/src/KonSoft.Admin.Application.Contracts/"]
|
COPY ["modules/admin/src/KonSoft.Admin.Application.Contracts/KonSoft.Admin.Application.Contracts.csproj", "modules/admin/src/KonSoft.Admin.Application.Contracts/"]
|
||||||
COPY ["modules/admin/src/KonSoft.Admin.EntityFrameworkCore/KonSoft.Admin.EntityFrameworkCore.csproj", "modules/admin/src/KonSoft.Admin.EntityFrameworkCore/"]
|
COPY ["modules/admin/src/KonSoft.Admin.EntityFrameworkCore/KonSoft.Admin.EntityFrameworkCore.csproj", "modules/admin/src/KonSoft.Admin.EntityFrameworkCore/"]
|
||||||
COPY ["modules/admin/src/KonSoft.Admin.HttpApi/KonSoft.Admin.HttpApi.csproj", "modules/admin/src/KonSoft.Admin.HttpApi/"]
|
COPY ["modules/admin/src/KonSoft.Admin.HttpApi/KonSoft.Admin.HttpApi.csproj", "modules/admin/src/KonSoft.Admin.HttpApi/"]
|
||||||
|
COPY ["shared/KonSoft.Shared.Hosting.Microservices/KonSoft.Shared.Hosting.Microservices.csproj", "shared/KonSoft.Shared.Hosting.Microservices/"]
|
||||||
|
COPY ["shared/KonSoft.Shared.Hosting.AspNetCore/KonSoft.Shared.Hosting.AspNetCore.csproj", "shared/KonSoft.Shared.Hosting.AspNetCore/"]
|
||||||
|
COPY ["shared/KonSoft.Shared.Hosting/KonSoft.Shared.Hosting.csproj", "shared/KonSoft.Shared.Hosting/"]
|
||||||
|
COPY ["shared/KonSoft.Shared.Localization/KonSoft.Shared.Localization.csproj", "shared/KonSoft.Shared.Localization/"]
|
||||||
RUN dotnet restore "./microservices/KonSoft.Admin.HttpApi.Host/KonSoft.Admin.HttpApi.Host.csproj"
|
RUN dotnet restore "./microservices/KonSoft.Admin.HttpApi.Host/KonSoft.Admin.HttpApi.Host.csproj"
|
||||||
COPY . .
|
COPY . .
|
||||||
WORKDIR "/src/microservices/KonSoft.Admin.HttpApi.Host"
|
WORKDIR "/src/microservices/KonSoft.Admin.HttpApi.Host"
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
@ -10,22 +10,6 @@
|
|||||||
<DockerfileContext>..\..</DockerfileContext>
|
<DockerfileContext>..\..</DockerfileContext>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.22.1" />
|
|
||||||
<PackageReference Include="Serilog.AspNetCore" Version="8.0.0" />
|
|
||||||
<PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.4" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="8.0.4" />
|
|
||||||
<PackageReference Include="DistributedLock.Redis" Version="1.0.2" />
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Authentication.JwtBearer" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Autofac" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.DistributedLocking" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Serilog" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Swashbuckle" Version="8.3.4" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Remove="Logs\**" />
|
<Compile Remove="Logs\**" />
|
||||||
<Content Remove="Logs\**" />
|
<Content Remove="Logs\**" />
|
||||||
@ -37,6 +21,7 @@
|
|||||||
<ProjectReference Include="..\..\modules\admin\src\KonSoft.Admin.Application\KonSoft.Admin.Application.csproj" />
|
<ProjectReference Include="..\..\modules\admin\src\KonSoft.Admin.Application\KonSoft.Admin.Application.csproj" />
|
||||||
<ProjectReference Include="..\..\modules\admin\src\KonSoft.Admin.EntityFrameworkCore\KonSoft.Admin.EntityFrameworkCore.csproj" />
|
<ProjectReference Include="..\..\modules\admin\src\KonSoft.Admin.EntityFrameworkCore\KonSoft.Admin.EntityFrameworkCore.csproj" />
|
||||||
<ProjectReference Include="..\..\modules\admin\src\KonSoft.Admin.HttpApi\KonSoft.Admin.HttpApi.csproj" />
|
<ProjectReference Include="..\..\modules\admin\src\KonSoft.Admin.HttpApi\KonSoft.Admin.HttpApi.csproj" />
|
||||||
|
<ProjectReference Include="..\..\shared\KonSoft.Shared.Hosting.Microservices\KonSoft.Shared.Hosting.Microservices.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
1027
microservices/KonSoft.Admin.HttpApi.Host/Logs/logs.txt
Normal file
1027
microservices/KonSoft.Admin.HttpApi.Host/Logs/logs.txt
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,56 +1,28 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using KonSoft.Admin;
|
||||||
|
using KonSoft.Shared.Hosting.AspNetCore;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Microsoft.Extensions.Hosting;
|
|
||||||
using Serilog;
|
using Serilog;
|
||||||
using Serilog.Events;
|
|
||||||
|
|
||||||
namespace KonSoft.Admin;
|
var assemblyName = typeof(Program).Assembly.GetName().Name!;
|
||||||
|
|
||||||
public class Program
|
SerilogConfigurationHelper.Configure(assemblyName);
|
||||||
|
try
|
||||||
{
|
{
|
||||||
public async static Task<int> Main(string[] args)
|
Log.Information($"Starting {assemblyName}.");
|
||||||
{
|
var app = await ApplicationBuilderHelper
|
||||||
Log.Logger = new LoggerConfiguration()
|
.BuildApplicationAsync<AdminHttpApiHostModule>(args);
|
||||||
#if DEBUG
|
|
||||||
.MinimumLevel.Debug()
|
|
||||||
#else
|
|
||||||
.MinimumLevel.Information()
|
|
||||||
#endif
|
|
||||||
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
|
|
||||||
.MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning)
|
|
||||||
.Enrich.FromLogContext()
|
|
||||||
.WriteTo.Async(c => c.File("Logs/logs.txt"))
|
|
||||||
.WriteTo.Async(c => c.Console())
|
|
||||||
.CreateLogger();
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Log.Information("Starting KonSoft.Admin.HttpApi.Host.");
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
|
||||||
builder.Host.AddAppSettingsSecretsJson()
|
|
||||||
.UseAutofac()
|
|
||||||
.UseSerilog();
|
|
||||||
await builder.AddApplicationAsync<AdminHttpApiHostModule>();
|
|
||||||
var app = builder.Build();
|
|
||||||
await app.InitializeApplicationAsync();
|
await app.InitializeApplicationAsync();
|
||||||
await app.RunAsync();
|
await app.RunAsync();
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
if (ex is HostAbortedException)
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
|
|
||||||
Log.Fatal(ex, "Host terminated unexpectedly!");
|
return 0;
|
||||||
return 1;
|
}
|
||||||
}
|
catch (Exception ex)
|
||||||
finally
|
{
|
||||||
{
|
Log.Fatal(ex, $"{assemblyName} terminated unexpectedly!");
|
||||||
Log.CloseAndFlush();
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
finally
|
||||||
|
{
|
||||||
|
await Log.CloseAndFlushAsync();
|
||||||
}
|
}
|
||||||
@ -1,38 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"$schema": "http://json.schemastore.org/launchsettings.json",
|
||||||
"profiles": {
|
"profiles": {
|
||||||
"IIS Express": {
|
"http": {
|
||||||
"commandName": "IISExpress",
|
|
||||||
"launchBrowser": true,
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"KonSoft.Admin.HttpApi.Host": {
|
|
||||||
"commandName": "Project",
|
"commandName": "Project",
|
||||||
"launchBrowser": true,
|
"launchBrowser": true,
|
||||||
"environmentVariables": {
|
"environmentVariables": {
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
},
|
},
|
||||||
"applicationUrl": "https://localhost:44354"
|
"applicationUrl": "https://localhost:44354"
|
||||||
},
|
|
||||||
"Container (Dockerfile)": {
|
|
||||||
"commandName": "Docker",
|
|
||||||
"launchBrowser": true,
|
|
||||||
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_HTTPS_PORTS": "8081",
|
|
||||||
"ASPNETCORE_HTTP_PORTS": "8080"
|
|
||||||
},
|
|
||||||
"publishAllPorts": true,
|
|
||||||
"useSSL": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"iisSettings": {
|
|
||||||
"windowsAuthentication": false,
|
|
||||||
"anonymousAuthentication": true,
|
|
||||||
"iisExpress": {
|
|
||||||
"applicationUrl": "https://localhost:44354",
|
|
||||||
"sslPort": 44354
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"App": {
|
"App": {
|
||||||
"CorsOrigins": "https://*.Admin.com,https://localhost:44357"
|
"CorsOrigins": "https://*.KonSoft.top"
|
||||||
},
|
},
|
||||||
"ConnectionStrings": {
|
"ConnectionStrings": {
|
||||||
"Default": "Host=localhost;Port=5432;Database=Admin;User ID=root;Password=myPassword;"
|
"Default": "Host=1.94.99.47;Port=26666;Database=Clean;User ID=postgres;Password=zzx7845zzx;"
|
||||||
},
|
},
|
||||||
"Redis": {
|
"Redis": {
|
||||||
"Configuration": "127.0.0.1"
|
"Configuration": "1.94.99.47:26668"
|
||||||
},
|
},
|
||||||
"AuthServer": {
|
"AuthServer": {
|
||||||
"Authority": "https://localhost:44397",
|
"Authority": "https://localhost:44397",
|
||||||
@ -15,5 +15,15 @@
|
|||||||
},
|
},
|
||||||
"StringEncryption": {
|
"StringEncryption": {
|
||||||
"DefaultPassPhrase": "g3NdNOyDR9oYj0gK"
|
"DefaultPassPhrase": "g3NdNOyDR9oYj0gK"
|
||||||
|
},
|
||||||
|
"RabbitMQ": {
|
||||||
|
"Connections": {
|
||||||
|
"Default": {
|
||||||
|
"HostName": "1.94.99.47",
|
||||||
|
"Port": 26667,
|
||||||
|
"UserName": "admin",
|
||||||
|
"Password": "zzx7845zzx"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,11 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<location path="." inheritInChildApplications="false">
|
<location path="." inheritInChildApplications="false">
|
||||||
<system.webServer>
|
<system.webServer>
|
||||||
<handlers>
|
<handlers>
|
||||||
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
||||||
</handlers>
|
</handlers>
|
||||||
<aspNetCore processPath="dotnet" arguments=".\KonSoft.Admin.HttpApi.Host.dll" stdoutLogEnabled="false" stdoutLogFile=".\Logs\stdout" hostingModel="inprocess" />
|
<aspNetCore processPath="dotnet" arguments=".\KonSoft.Admin.HttpApi.Host.dll" stdoutLogEnabled="false"
|
||||||
|
stdoutLogFile=".\Logs\stdout" hostingModel="inprocess" />
|
||||||
</system.webServer>
|
</system.webServer>
|
||||||
</location>
|
</location>
|
||||||
<system.webServer>
|
<system.webServer>
|
||||||
|
|||||||
@ -1,179 +1,37 @@
|
|||||||
using System;
|
using KonSoft.Dispatch.EntityFrameworkCore;
|
||||||
using System.Collections.Generic;
|
using KonSoft.Shared.Hosting.AspNetCore;
|
||||||
using System.IO;
|
using KonSoft.Shared.Hosting.Microservices;
|
||||||
using System.Linq;
|
|
||||||
using Medallion.Threading;
|
|
||||||
using Medallion.Threading.Redis;
|
|
||||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Cors;
|
|
||||||
using Microsoft.AspNetCore.DataProtection;
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using KonSoft.Dispatch.EntityFrameworkCore;
|
|
||||||
using KonSoft.Dispatch.MultiTenancy;
|
|
||||||
using StackExchange.Redis;
|
|
||||||
using Microsoft.OpenApi.Models;
|
|
||||||
using Volo.Abp;
|
using Volo.Abp;
|
||||||
using Volo.Abp.AspNetCore.Authentication.JwtBearer;
|
using Volo.Abp.BackgroundJobs;
|
||||||
using Volo.Abp.AspNetCore.Mvc;
|
|
||||||
using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy;
|
|
||||||
using Volo.Abp.AspNetCore.Serilog;
|
|
||||||
using Volo.Abp.Autofac;
|
|
||||||
using Volo.Abp.Caching;
|
|
||||||
using Volo.Abp.Caching.StackExchangeRedis;
|
|
||||||
using Volo.Abp.DistributedLocking;
|
|
||||||
using Volo.Abp.Identity;
|
|
||||||
using Volo.Abp.Localization;
|
|
||||||
using Volo.Abp.Modularity;
|
using Volo.Abp.Modularity;
|
||||||
using Volo.Abp.Security.Claims;
|
|
||||||
using Volo.Abp.Swashbuckle;
|
|
||||||
using Volo.Abp.VirtualFileSystem;
|
|
||||||
|
|
||||||
namespace KonSoft.Dispatch;
|
namespace KonSoft.Dispatch;
|
||||||
|
|
||||||
[DependsOn(
|
[DependsOn(
|
||||||
typeof(DispatchHttpApiModule),
|
typeof(DispatchHttpApiModule),
|
||||||
typeof(AbpAutofacModule),
|
|
||||||
typeof(AbpCachingStackExchangeRedisModule),
|
|
||||||
typeof(AbpDistributedLockingModule),
|
|
||||||
typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
|
|
||||||
typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
|
|
||||||
typeof(DispatchApplicationModule),
|
typeof(DispatchApplicationModule),
|
||||||
typeof(DispatchEntityFrameworkCoreModule),
|
typeof(DispatchEntityFrameworkCoreModule),
|
||||||
typeof(AbpAspNetCoreSerilogModule),
|
typeof(KonSoftSharedHostingMicroservicesModule)
|
||||||
typeof(AbpSwashbuckleModule)
|
|
||||||
)]
|
)]
|
||||||
public class DispatchHttpApiHostModule : AbpModule
|
public class DispatchHttpApiHostModule : AbpModule
|
||||||
{
|
{
|
||||||
public override void ConfigureServices(ServiceConfigurationContext context)
|
public override void ConfigureServices(ServiceConfigurationContext context)
|
||||||
{
|
{
|
||||||
var configuration = context.Services.GetConfiguration();
|
var configuration = context.Services.GetConfiguration();
|
||||||
var hostingEnvironment = context.Services.GetHostingEnvironment();
|
|
||||||
|
|
||||||
ConfigureConventionalControllers();
|
SwaggerConfigurationHelper.ConfigureWithOidc(
|
||||||
ConfigureAuthentication(context, configuration);
|
context,
|
||||||
ConfigureCache(configuration);
|
|
||||||
ConfigureVirtualFileSystem(context);
|
|
||||||
ConfigureDataProtection(context, configuration, hostingEnvironment);
|
|
||||||
ConfigureDistributedLocking(context, configuration);
|
|
||||||
ConfigureCors(context, configuration);
|
|
||||||
ConfigureSwaggerServices(context, configuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureCache(IConfiguration configuration)
|
|
||||||
{
|
|
||||||
Configure<AbpDistributedCacheOptions>(options => { options.KeyPrefix = "Dispatch:"; });
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureVirtualFileSystem(ServiceConfigurationContext context)
|
|
||||||
{
|
|
||||||
var hostingEnvironment = context.Services.GetHostingEnvironment();
|
|
||||||
|
|
||||||
if (hostingEnvironment.IsDevelopment())
|
|
||||||
{
|
|
||||||
Configure<AbpVirtualFileSystemOptions>(options =>
|
|
||||||
{
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<DispatchDomainSharedModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.Dispatch.Domain.Shared"));
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<DispatchDomainModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.Dispatch.Domain"));
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<DispatchApplicationContractsModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.Dispatch.Application.Contracts"));
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<DispatchApplicationModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.Dispatch.Application"));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureConventionalControllers()
|
|
||||||
{
|
|
||||||
Configure<AbpAspNetCoreMvcOptions>(options =>
|
|
||||||
{
|
|
||||||
options.ConventionalControllers.Create(typeof(DispatchApplicationModule).Assembly);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
|
|
||||||
.AddAbpJwtBearer(options =>
|
|
||||||
{
|
|
||||||
options.Authority = configuration["AuthServer:Authority"];
|
|
||||||
options.RequireHttpsMetadata = configuration.GetValue<bool>("AuthServer:RequireHttpsMetadata");
|
|
||||||
options.Audience = "Dispatch";
|
|
||||||
});
|
|
||||||
|
|
||||||
context.Services.Configure<AbpClaimsPrincipalFactoryOptions>(options =>
|
|
||||||
{
|
|
||||||
options.IsDynamicClaimsEnabled = true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void ConfigureSwaggerServices(ServiceConfigurationContext context, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddAbpSwaggerGenWithOAuth(
|
|
||||||
configuration["AuthServer:Authority"]!,
|
configuration["AuthServer:Authority"]!,
|
||||||
new Dictionary<string, string>
|
["DispatchService"],
|
||||||
{
|
discoveryEndpoint: configuration["AuthServer:MetadataAddress"],
|
||||||
{"Dispatch", "Dispatch API"}
|
apiTitle: "Dispatch Service API"
|
||||||
},
|
);
|
||||||
options =>
|
|
||||||
{
|
|
||||||
options.SwaggerDoc("v1", new OpenApiInfo { Title = "Dispatch API", Version = "v1" });
|
|
||||||
options.DocInclusionPredicate((docName, description) => true);
|
|
||||||
options.CustomSchemaIds(type => type.FullName);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureDataProtection(
|
// ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
||||||
ServiceConfigurationContext context,
|
Configure<AbpBackgroundJobOptions>(options => options.IsJobExecutionEnabled = false);
|
||||||
IConfiguration configuration,
|
|
||||||
IWebHostEnvironment hostingEnvironment)
|
|
||||||
{
|
|
||||||
var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("Dispatch");
|
|
||||||
if (!hostingEnvironment.IsDevelopment())
|
|
||||||
{
|
|
||||||
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
|
|
||||||
dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "Dispatch-Protection-Keys");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureDistributedLocking(
|
|
||||||
ServiceConfigurationContext context,
|
|
||||||
IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddSingleton<IDistributedLockProvider>(sp =>
|
|
||||||
{
|
|
||||||
var connection = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
|
|
||||||
return new RedisDistributedSynchronizationProvider(connection.GetDatabase());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureCors(ServiceConfigurationContext context, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddCors(options =>
|
|
||||||
{
|
|
||||||
options.AddDefaultPolicy(builder =>
|
|
||||||
{
|
|
||||||
builder
|
|
||||||
.WithOrigins(configuration["App:CorsOrigins"]?
|
|
||||||
.Split(",", StringSplitOptions.RemoveEmptyEntries)
|
|
||||||
.Select(o => o.RemovePostFix("/"))
|
|
||||||
.ToArray() ?? [])
|
|
||||||
.WithAbpExposedHeaders()
|
|
||||||
.SetIsOriginAllowedToAllowWildcardSubdomains()
|
|
||||||
.AllowAnyHeader()
|
|
||||||
.AllowAnyMethod()
|
|
||||||
.AllowCredentials();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnApplicationInitialization(ApplicationInitializationContext context)
|
public override void OnApplicationInitialization(ApplicationInitializationContext context)
|
||||||
@ -193,7 +51,7 @@ public class DispatchHttpApiHostModule : AbpModule
|
|||||||
app.UseCors();
|
app.UseCors();
|
||||||
app.UseAuthentication();
|
app.UseAuthentication();
|
||||||
|
|
||||||
if (MultiTenancyConsts.IsEnabled)
|
if (KonSoftConsts.MultiTenancyEnabled)
|
||||||
{
|
{
|
||||||
app.UseMultiTenancy();
|
app.UseMultiTenancy();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
@ -8,21 +8,6 @@
|
|||||||
<UserSecretsId>KonSoft.Dispatch-4681b4fd-151f-4221-84a4-929d86723e4c</UserSecretsId>
|
<UserSecretsId>KonSoft.Dispatch-4681b4fd-151f-4221-84a4-929d86723e4c</UserSecretsId>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Serilog.AspNetCore" Version="8.0.0" />
|
|
||||||
<PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.4" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="8.0.4" />
|
|
||||||
<PackageReference Include="DistributedLock.Redis" Version="1.0.2" />
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Authentication.JwtBearer" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Autofac" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.DistributedLocking" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Serilog" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Swashbuckle" Version="8.3.4" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Remove="Logs\**" />
|
<Compile Remove="Logs\**" />
|
||||||
<Content Remove="Logs\**" />
|
<Content Remove="Logs\**" />
|
||||||
@ -34,6 +19,7 @@
|
|||||||
<ProjectReference Include="..\..\modules\dispatch\src\KonSoft.Dispatch.Application\KonSoft.Dispatch.Application.csproj" />
|
<ProjectReference Include="..\..\modules\dispatch\src\KonSoft.Dispatch.Application\KonSoft.Dispatch.Application.csproj" />
|
||||||
<ProjectReference Include="..\..\modules\dispatch\src\KonSoft.Dispatch.EntityFrameworkCore\KonSoft.Dispatch.EntityFrameworkCore.csproj" />
|
<ProjectReference Include="..\..\modules\dispatch\src\KonSoft.Dispatch.EntityFrameworkCore\KonSoft.Dispatch.EntityFrameworkCore.csproj" />
|
||||||
<ProjectReference Include="..\..\modules\dispatch\src\KonSoft.Dispatch.HttpApi\KonSoft.Dispatch.HttpApi.csproj" />
|
<ProjectReference Include="..\..\modules\dispatch\src\KonSoft.Dispatch.HttpApi\KonSoft.Dispatch.HttpApi.csproj" />
|
||||||
|
<ProjectReference Include="..\..\shared\KonSoft.Shared.Hosting.Microservices\KonSoft.Shared.Hosting.Microservices.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@ -10,7 +10,7 @@ namespace KonSoft.Dispatch;
|
|||||||
|
|
||||||
public class Program
|
public class Program
|
||||||
{
|
{
|
||||||
public async static Task<int> Main(string[] args)
|
public static async Task<int> Main(string[] args)
|
||||||
{
|
{
|
||||||
Log.Logger = new LoggerConfiguration()
|
Log.Logger = new LoggerConfiguration()
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
|
|||||||
@ -1,27 +1,13 @@
|
|||||||
{
|
{
|
||||||
"iisSettings": {
|
"$schema": "http://json.schemastore.org/launchsettings.json",
|
||||||
"windowsAuthentication": false,
|
|
||||||
"anonymousAuthentication": true,
|
|
||||||
"iisExpress": {
|
|
||||||
"applicationUrl": "https://localhost:44331",
|
|
||||||
"sslPort": 44331
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"profiles": {
|
"profiles": {
|
||||||
"IIS Express": {
|
"http": {
|
||||||
"commandName": "IISExpress",
|
|
||||||
"launchBrowser": true,
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"KonSoft.Dispatch.HttpApi.Host": {
|
|
||||||
"commandName": "Project",
|
"commandName": "Project",
|
||||||
"launchBrowser": true,
|
"launchBrowser": true,
|
||||||
"applicationUrl": "https://localhost:44331",
|
|
||||||
"environmentVariables": {
|
"environmentVariables": {
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
}
|
},
|
||||||
|
"applicationUrl": "https://localhost:44331"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,11 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<location path="." inheritInChildApplications="false">
|
<location path="." inheritInChildApplications="false">
|
||||||
<system.webServer>
|
<system.webServer>
|
||||||
<handlers>
|
<handlers>
|
||||||
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
||||||
</handlers>
|
</handlers>
|
||||||
<aspNetCore processPath="dotnet" arguments=".\KonSoft.Dispatch.HttpApi.Host.dll" stdoutLogEnabled="false" stdoutLogFile=".\Logs\stdout" hostingModel="inprocess" />
|
<aspNetCore processPath="dotnet" arguments=".\KonSoft.Dispatch.HttpApi.Host.dll" stdoutLogEnabled="false"
|
||||||
|
stdoutLogFile=".\Logs\stdout" hostingModel="inprocess" />
|
||||||
</system.webServer>
|
</system.webServer>
|
||||||
</location>
|
</location>
|
||||||
<system.webServer>
|
<system.webServer>
|
||||||
|
|||||||
@ -8,21 +8,6 @@
|
|||||||
<UserSecretsId>KonSoft.Payment-4681b4fd-151f-4221-84a4-929d86723e4c</UserSecretsId>
|
<UserSecretsId>KonSoft.Payment-4681b4fd-151f-4221-84a4-929d86723e4c</UserSecretsId>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Serilog.AspNetCore" Version="8.0.0" />
|
|
||||||
<PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.4" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="8.0.4" />
|
|
||||||
<PackageReference Include="DistributedLock.Redis" Version="1.0.2" />
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Authentication.JwtBearer" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Autofac" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.DistributedLocking" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Serilog" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Swashbuckle" Version="8.3.4" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Remove="Logs\**" />
|
<Compile Remove="Logs\**" />
|
||||||
<Content Remove="Logs\**" />
|
<Content Remove="Logs\**" />
|
||||||
@ -34,6 +19,7 @@
|
|||||||
<ProjectReference Include="..\..\modules\payment\src\KonSoft.Payment.Application\KonSoft.Payment.Application.csproj" />
|
<ProjectReference Include="..\..\modules\payment\src\KonSoft.Payment.Application\KonSoft.Payment.Application.csproj" />
|
||||||
<ProjectReference Include="..\..\modules\payment\src\KonSoft.Payment.EntityFrameworkCore\KonSoft.Payment.EntityFrameworkCore.csproj" />
|
<ProjectReference Include="..\..\modules\payment\src\KonSoft.Payment.EntityFrameworkCore\KonSoft.Payment.EntityFrameworkCore.csproj" />
|
||||||
<ProjectReference Include="..\..\modules\payment\src\KonSoft.Payment.HttpApi\KonSoft.Payment.HttpApi.csproj" />
|
<ProjectReference Include="..\..\modules\payment\src\KonSoft.Payment.HttpApi\KonSoft.Payment.HttpApi.csproj" />
|
||||||
|
<ProjectReference Include="..\..\shared\KonSoft.Shared.Hosting.Microservices\KonSoft.Shared.Hosting.Microservices.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@ -1,179 +1,37 @@
|
|||||||
using System;
|
using KonSoft.Payment.EntityFrameworkCore;
|
||||||
using System.Collections.Generic;
|
using KonSoft.Shared.Hosting.AspNetCore;
|
||||||
using System.IO;
|
using KonSoft.Shared.Hosting.Microservices;
|
||||||
using System.Linq;
|
|
||||||
using Medallion.Threading;
|
|
||||||
using Medallion.Threading.Redis;
|
|
||||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Cors;
|
|
||||||
using Microsoft.AspNetCore.DataProtection;
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using KonSoft.Payment.EntityFrameworkCore;
|
|
||||||
using KonSoft.Payment.MultiTenancy;
|
|
||||||
using StackExchange.Redis;
|
|
||||||
using Microsoft.OpenApi.Models;
|
|
||||||
using Volo.Abp;
|
using Volo.Abp;
|
||||||
using Volo.Abp.AspNetCore.Authentication.JwtBearer;
|
using Volo.Abp.BackgroundJobs;
|
||||||
using Volo.Abp.AspNetCore.Mvc;
|
|
||||||
using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy;
|
|
||||||
using Volo.Abp.AspNetCore.Serilog;
|
|
||||||
using Volo.Abp.Autofac;
|
|
||||||
using Volo.Abp.Caching;
|
|
||||||
using Volo.Abp.Caching.StackExchangeRedis;
|
|
||||||
using Volo.Abp.DistributedLocking;
|
|
||||||
using Volo.Abp.Identity;
|
|
||||||
using Volo.Abp.Localization;
|
|
||||||
using Volo.Abp.Modularity;
|
using Volo.Abp.Modularity;
|
||||||
using Volo.Abp.Security.Claims;
|
|
||||||
using Volo.Abp.Swashbuckle;
|
|
||||||
using Volo.Abp.VirtualFileSystem;
|
|
||||||
|
|
||||||
namespace KonSoft.Payment;
|
namespace KonSoft.Payment;
|
||||||
|
|
||||||
[DependsOn(
|
[DependsOn(
|
||||||
typeof(PaymentHttpApiModule),
|
typeof(PaymentHttpApiModule),
|
||||||
typeof(AbpAutofacModule),
|
|
||||||
typeof(AbpCachingStackExchangeRedisModule),
|
|
||||||
typeof(AbpDistributedLockingModule),
|
|
||||||
typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
|
|
||||||
typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
|
|
||||||
typeof(PaymentApplicationModule),
|
typeof(PaymentApplicationModule),
|
||||||
typeof(PaymentEntityFrameworkCoreModule),
|
typeof(PaymentEntityFrameworkCoreModule),
|
||||||
typeof(AbpAspNetCoreSerilogModule),
|
typeof(KonSoftSharedHostingMicroservicesModule)
|
||||||
typeof(AbpSwashbuckleModule)
|
|
||||||
)]
|
)]
|
||||||
public class PaymentHttpApiHostModule : AbpModule
|
public class PaymentHttpApiHostModule : AbpModule
|
||||||
{
|
{
|
||||||
public override void ConfigureServices(ServiceConfigurationContext context)
|
public override void ConfigureServices(ServiceConfigurationContext context)
|
||||||
{
|
{
|
||||||
var configuration = context.Services.GetConfiguration();
|
var configuration = context.Services.GetConfiguration();
|
||||||
var hostingEnvironment = context.Services.GetHostingEnvironment();
|
|
||||||
|
|
||||||
ConfigureConventionalControllers();
|
SwaggerConfigurationHelper.ConfigureWithOidc(
|
||||||
ConfigureAuthentication(context, configuration);
|
context,
|
||||||
ConfigureCache(configuration);
|
|
||||||
ConfigureVirtualFileSystem(context);
|
|
||||||
ConfigureDataProtection(context, configuration, hostingEnvironment);
|
|
||||||
ConfigureDistributedLocking(context, configuration);
|
|
||||||
ConfigureCors(context, configuration);
|
|
||||||
ConfigureSwaggerServices(context, configuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureCache(IConfiguration configuration)
|
|
||||||
{
|
|
||||||
Configure<AbpDistributedCacheOptions>(options => { options.KeyPrefix = "Payment:"; });
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureVirtualFileSystem(ServiceConfigurationContext context)
|
|
||||||
{
|
|
||||||
var hostingEnvironment = context.Services.GetHostingEnvironment();
|
|
||||||
|
|
||||||
if (hostingEnvironment.IsDevelopment())
|
|
||||||
{
|
|
||||||
Configure<AbpVirtualFileSystemOptions>(options =>
|
|
||||||
{
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<PaymentDomainSharedModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.Payment.Domain.Shared"));
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<PaymentDomainModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.Payment.Domain"));
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<PaymentApplicationContractsModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.Payment.Application.Contracts"));
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<PaymentApplicationModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.Payment.Application"));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureConventionalControllers()
|
|
||||||
{
|
|
||||||
Configure<AbpAspNetCoreMvcOptions>(options =>
|
|
||||||
{
|
|
||||||
options.ConventionalControllers.Create(typeof(PaymentApplicationModule).Assembly);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
|
|
||||||
.AddAbpJwtBearer(options =>
|
|
||||||
{
|
|
||||||
options.Authority = configuration["AuthServer:Authority"];
|
|
||||||
options.RequireHttpsMetadata = configuration.GetValue<bool>("AuthServer:RequireHttpsMetadata");
|
|
||||||
options.Audience = "Payment";
|
|
||||||
});
|
|
||||||
|
|
||||||
context.Services.Configure<AbpClaimsPrincipalFactoryOptions>(options =>
|
|
||||||
{
|
|
||||||
options.IsDynamicClaimsEnabled = true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void ConfigureSwaggerServices(ServiceConfigurationContext context, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddAbpSwaggerGenWithOAuth(
|
|
||||||
configuration["AuthServer:Authority"]!,
|
configuration["AuthServer:Authority"]!,
|
||||||
new Dictionary<string, string>
|
["PaymentService"],
|
||||||
{
|
discoveryEndpoint: configuration["AuthServer:MetadataAddress"],
|
||||||
{"Payment", "Payment API"}
|
apiTitle: "Payment Service API"
|
||||||
},
|
);
|
||||||
options =>
|
|
||||||
{
|
|
||||||
options.SwaggerDoc("v1", new OpenApiInfo { Title = "Payment API", Version = "v1" });
|
|
||||||
options.DocInclusionPredicate((docName, description) => true);
|
|
||||||
options.CustomSchemaIds(type => type.FullName);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureDataProtection(
|
// ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
||||||
ServiceConfigurationContext context,
|
Configure<AbpBackgroundJobOptions>(options => options.IsJobExecutionEnabled = false);
|
||||||
IConfiguration configuration,
|
|
||||||
IWebHostEnvironment hostingEnvironment)
|
|
||||||
{
|
|
||||||
var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("Payment");
|
|
||||||
if (!hostingEnvironment.IsDevelopment())
|
|
||||||
{
|
|
||||||
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
|
|
||||||
dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "Payment-Protection-Keys");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureDistributedLocking(
|
|
||||||
ServiceConfigurationContext context,
|
|
||||||
IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddSingleton<IDistributedLockProvider>(sp =>
|
|
||||||
{
|
|
||||||
var connection = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
|
|
||||||
return new RedisDistributedSynchronizationProvider(connection.GetDatabase());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureCors(ServiceConfigurationContext context, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddCors(options =>
|
|
||||||
{
|
|
||||||
options.AddDefaultPolicy(builder =>
|
|
||||||
{
|
|
||||||
builder
|
|
||||||
.WithOrigins(configuration["App:CorsOrigins"]?
|
|
||||||
.Split(",", StringSplitOptions.RemoveEmptyEntries)
|
|
||||||
.Select(o => o.RemovePostFix("/"))
|
|
||||||
.ToArray() ?? [])
|
|
||||||
.WithAbpExposedHeaders()
|
|
||||||
.SetIsOriginAllowedToAllowWildcardSubdomains()
|
|
||||||
.AllowAnyHeader()
|
|
||||||
.AllowAnyMethod()
|
|
||||||
.AllowCredentials();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnApplicationInitialization(ApplicationInitializationContext context)
|
public override void OnApplicationInitialization(ApplicationInitializationContext context)
|
||||||
@ -193,7 +51,7 @@ public class PaymentHttpApiHostModule : AbpModule
|
|||||||
app.UseCors();
|
app.UseCors();
|
||||||
app.UseAuthentication();
|
app.UseAuthentication();
|
||||||
|
|
||||||
if (MultiTenancyConsts.IsEnabled)
|
if (KonSoftConsts.MultiTenancyEnabled)
|
||||||
{
|
{
|
||||||
app.UseMultiTenancy();
|
app.UseMultiTenancy();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,7 +10,7 @@ namespace KonSoft.Payment;
|
|||||||
|
|
||||||
public class Program
|
public class Program
|
||||||
{
|
{
|
||||||
public async static Task<int> Main(string[] args)
|
public static async Task<int> Main(string[] args)
|
||||||
{
|
{
|
||||||
Log.Logger = new LoggerConfiguration()
|
Log.Logger = new LoggerConfiguration()
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
|
|||||||
@ -1,27 +1,13 @@
|
|||||||
{
|
{
|
||||||
"iisSettings": {
|
"$schema": "http://json.schemastore.org/launchsettings.json",
|
||||||
"windowsAuthentication": false,
|
|
||||||
"anonymousAuthentication": true,
|
|
||||||
"iisExpress": {
|
|
||||||
"applicationUrl": "https://localhost:44326",
|
|
||||||
"sslPort": 44326
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"profiles": {
|
"profiles": {
|
||||||
"IIS Express": {
|
"http": {
|
||||||
"commandName": "IISExpress",
|
|
||||||
"launchBrowser": true,
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"KonSoft.Payment.HttpApi.Host": {
|
|
||||||
"commandName": "Project",
|
"commandName": "Project",
|
||||||
"launchBrowser": true,
|
"launchBrowser": true,
|
||||||
"applicationUrl": "https://localhost:44326",
|
|
||||||
"environmentVariables": {
|
"environmentVariables": {
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
}
|
},
|
||||||
|
"applicationUrl": "https://localhost:44326"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,11 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<location path="." inheritInChildApplications="false">
|
<location path="." inheritInChildApplications="false">
|
||||||
<system.webServer>
|
<system.webServer>
|
||||||
<handlers>
|
<handlers>
|
||||||
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
||||||
</handlers>
|
</handlers>
|
||||||
<aspNetCore processPath="dotnet" arguments=".\KonSoft.Payment.HttpApi.Host.dll" stdoutLogEnabled="false" stdoutLogFile=".\Logs\stdout" hostingModel="inprocess" />
|
<aspNetCore processPath="dotnet" arguments=".\KonSoft.Payment.HttpApi.Host.dll" stdoutLogEnabled="false"
|
||||||
|
stdoutLogFile=".\Logs\stdout" hostingModel="inprocess" />
|
||||||
</system.webServer>
|
</system.webServer>
|
||||||
</location>
|
</location>
|
||||||
<system.webServer>
|
<system.webServer>
|
||||||
|
|||||||
@ -8,21 +8,6 @@
|
|||||||
<UserSecretsId>KonSoft.Report-4681b4fd-151f-4221-84a4-929d86723e4c</UserSecretsId>
|
<UserSecretsId>KonSoft.Report-4681b4fd-151f-4221-84a4-929d86723e4c</UserSecretsId>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Serilog.AspNetCore" Version="8.0.0" />
|
|
||||||
<PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.4" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="8.0.4" />
|
|
||||||
<PackageReference Include="DistributedLock.Redis" Version="1.0.2" />
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Authentication.JwtBearer" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Autofac" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.DistributedLocking" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Serilog" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Swashbuckle" Version="8.3.4" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Remove="Logs\**" />
|
<Compile Remove="Logs\**" />
|
||||||
<Content Remove="Logs\**" />
|
<Content Remove="Logs\**" />
|
||||||
@ -34,6 +19,7 @@
|
|||||||
<ProjectReference Include="..\..\modules\report\src\KonSoft.Report.Application\KonSoft.Report.Application.csproj" />
|
<ProjectReference Include="..\..\modules\report\src\KonSoft.Report.Application\KonSoft.Report.Application.csproj" />
|
||||||
<ProjectReference Include="..\..\modules\report\src\KonSoft.Report.EntityFrameworkCore\KonSoft.Report.EntityFrameworkCore.csproj" />
|
<ProjectReference Include="..\..\modules\report\src\KonSoft.Report.EntityFrameworkCore\KonSoft.Report.EntityFrameworkCore.csproj" />
|
||||||
<ProjectReference Include="..\..\modules\report\src\KonSoft.Report.HttpApi\KonSoft.Report.HttpApi.csproj" />
|
<ProjectReference Include="..\..\modules\report\src\KonSoft.Report.HttpApi\KonSoft.Report.HttpApi.csproj" />
|
||||||
|
<ProjectReference Include="..\..\shared\KonSoft.Shared.Hosting.Microservices\KonSoft.Shared.Hosting.Microservices.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@ -10,7 +10,7 @@ namespace KonSoft.Report;
|
|||||||
|
|
||||||
public class Program
|
public class Program
|
||||||
{
|
{
|
||||||
public async static Task<int> Main(string[] args)
|
public static async Task<int> Main(string[] args)
|
||||||
{
|
{
|
||||||
Log.Logger = new LoggerConfiguration()
|
Log.Logger = new LoggerConfiguration()
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
|
|||||||
@ -1,27 +1,13 @@
|
|||||||
{
|
{
|
||||||
"iisSettings": {
|
"$schema": "http://json.schemastore.org/launchsettings.json",
|
||||||
"windowsAuthentication": false,
|
|
||||||
"anonymousAuthentication": true,
|
|
||||||
"iisExpress": {
|
|
||||||
"applicationUrl": "https://localhost:44320",
|
|
||||||
"sslPort": 44320
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"profiles": {
|
"profiles": {
|
||||||
"IIS Express": {
|
"http": {
|
||||||
"commandName": "IISExpress",
|
|
||||||
"launchBrowser": true,
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"KonSoft.Report.HttpApi.Host": {
|
|
||||||
"commandName": "Project",
|
"commandName": "Project",
|
||||||
"launchBrowser": true,
|
"launchBrowser": true,
|
||||||
"applicationUrl": "https://localhost:44320",
|
|
||||||
"environmentVariables": {
|
"environmentVariables": {
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
}
|
},
|
||||||
|
"applicationUrl": "https://localhost:44320"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,179 +1,37 @@
|
|||||||
using System;
|
using KonSoft.Report.EntityFrameworkCore;
|
||||||
using System.Collections.Generic;
|
using KonSoft.Shared.Hosting.AspNetCore;
|
||||||
using System.IO;
|
using KonSoft.Shared.Hosting.Microservices;
|
||||||
using System.Linq;
|
|
||||||
using Medallion.Threading;
|
|
||||||
using Medallion.Threading.Redis;
|
|
||||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Cors;
|
|
||||||
using Microsoft.AspNetCore.DataProtection;
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using KonSoft.Report.EntityFrameworkCore;
|
|
||||||
using KonSoft.Report.MultiTenancy;
|
|
||||||
using StackExchange.Redis;
|
|
||||||
using Microsoft.OpenApi.Models;
|
|
||||||
using Volo.Abp;
|
using Volo.Abp;
|
||||||
using Volo.Abp.AspNetCore.Authentication.JwtBearer;
|
using Volo.Abp.BackgroundJobs;
|
||||||
using Volo.Abp.AspNetCore.Mvc;
|
|
||||||
using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy;
|
|
||||||
using Volo.Abp.AspNetCore.Serilog;
|
|
||||||
using Volo.Abp.Autofac;
|
|
||||||
using Volo.Abp.Caching;
|
|
||||||
using Volo.Abp.Caching.StackExchangeRedis;
|
|
||||||
using Volo.Abp.DistributedLocking;
|
|
||||||
using Volo.Abp.Identity;
|
|
||||||
using Volo.Abp.Localization;
|
|
||||||
using Volo.Abp.Modularity;
|
using Volo.Abp.Modularity;
|
||||||
using Volo.Abp.Security.Claims;
|
|
||||||
using Volo.Abp.Swashbuckle;
|
|
||||||
using Volo.Abp.VirtualFileSystem;
|
|
||||||
|
|
||||||
namespace KonSoft.Report;
|
namespace KonSoft.Report;
|
||||||
|
|
||||||
[DependsOn(
|
[DependsOn(
|
||||||
typeof(ReportHttpApiModule),
|
typeof(ReportHttpApiModule),
|
||||||
typeof(AbpAutofacModule),
|
|
||||||
typeof(AbpCachingStackExchangeRedisModule),
|
|
||||||
typeof(AbpDistributedLockingModule),
|
|
||||||
typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
|
|
||||||
typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
|
|
||||||
typeof(ReportApplicationModule),
|
typeof(ReportApplicationModule),
|
||||||
typeof(ReportEntityFrameworkCoreModule),
|
typeof(ReportEntityFrameworkCoreModule),
|
||||||
typeof(AbpAspNetCoreSerilogModule),
|
typeof(KonSoftSharedHostingMicroservicesModule)
|
||||||
typeof(AbpSwashbuckleModule)
|
|
||||||
)]
|
)]
|
||||||
public class ReportHttpApiHostModule : AbpModule
|
public class ReportHttpApiHostModule : AbpModule
|
||||||
{
|
{
|
||||||
public override void ConfigureServices(ServiceConfigurationContext context)
|
public override void ConfigureServices(ServiceConfigurationContext context)
|
||||||
{
|
{
|
||||||
var configuration = context.Services.GetConfiguration();
|
var configuration = context.Services.GetConfiguration();
|
||||||
var hostingEnvironment = context.Services.GetHostingEnvironment();
|
|
||||||
|
|
||||||
ConfigureConventionalControllers();
|
SwaggerConfigurationHelper.ConfigureWithOidc(
|
||||||
ConfigureAuthentication(context, configuration);
|
context,
|
||||||
ConfigureCache(configuration);
|
|
||||||
ConfigureVirtualFileSystem(context);
|
|
||||||
ConfigureDataProtection(context, configuration, hostingEnvironment);
|
|
||||||
ConfigureDistributedLocking(context, configuration);
|
|
||||||
ConfigureCors(context, configuration);
|
|
||||||
ConfigureSwaggerServices(context, configuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureCache(IConfiguration configuration)
|
|
||||||
{
|
|
||||||
Configure<AbpDistributedCacheOptions>(options => { options.KeyPrefix = "Report:"; });
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureVirtualFileSystem(ServiceConfigurationContext context)
|
|
||||||
{
|
|
||||||
var hostingEnvironment = context.Services.GetHostingEnvironment();
|
|
||||||
|
|
||||||
if (hostingEnvironment.IsDevelopment())
|
|
||||||
{
|
|
||||||
Configure<AbpVirtualFileSystemOptions>(options =>
|
|
||||||
{
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<ReportDomainSharedModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.Report.Domain.Shared"));
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<ReportDomainModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.Report.Domain"));
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<ReportApplicationContractsModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.Report.Application.Contracts"));
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<ReportApplicationModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.Report.Application"));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureConventionalControllers()
|
|
||||||
{
|
|
||||||
Configure<AbpAspNetCoreMvcOptions>(options =>
|
|
||||||
{
|
|
||||||
options.ConventionalControllers.Create(typeof(ReportApplicationModule).Assembly);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
|
|
||||||
.AddAbpJwtBearer(options =>
|
|
||||||
{
|
|
||||||
options.Authority = configuration["AuthServer:Authority"];
|
|
||||||
options.RequireHttpsMetadata = configuration.GetValue<bool>("AuthServer:RequireHttpsMetadata");
|
|
||||||
options.Audience = "Report";
|
|
||||||
});
|
|
||||||
|
|
||||||
context.Services.Configure<AbpClaimsPrincipalFactoryOptions>(options =>
|
|
||||||
{
|
|
||||||
options.IsDynamicClaimsEnabled = true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void ConfigureSwaggerServices(ServiceConfigurationContext context, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddAbpSwaggerGenWithOAuth(
|
|
||||||
configuration["AuthServer:Authority"]!,
|
configuration["AuthServer:Authority"]!,
|
||||||
new Dictionary<string, string>
|
["ReportService"],
|
||||||
{
|
discoveryEndpoint: configuration["AuthServer:MetadataAddress"],
|
||||||
{"Report", "Report API"}
|
apiTitle: "Report Service API"
|
||||||
},
|
);
|
||||||
options =>
|
|
||||||
{
|
|
||||||
options.SwaggerDoc("v1", new OpenApiInfo { Title = "Report API", Version = "v1" });
|
|
||||||
options.DocInclusionPredicate((docName, description) => true);
|
|
||||||
options.CustomSchemaIds(type => type.FullName);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureDataProtection(
|
// ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
||||||
ServiceConfigurationContext context,
|
Configure<AbpBackgroundJobOptions>(options => options.IsJobExecutionEnabled = false);
|
||||||
IConfiguration configuration,
|
|
||||||
IWebHostEnvironment hostingEnvironment)
|
|
||||||
{
|
|
||||||
var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("Report");
|
|
||||||
if (!hostingEnvironment.IsDevelopment())
|
|
||||||
{
|
|
||||||
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
|
|
||||||
dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "Report-Protection-Keys");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureDistributedLocking(
|
|
||||||
ServiceConfigurationContext context,
|
|
||||||
IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddSingleton<IDistributedLockProvider>(sp =>
|
|
||||||
{
|
|
||||||
var connection = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
|
|
||||||
return new RedisDistributedSynchronizationProvider(connection.GetDatabase());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureCors(ServiceConfigurationContext context, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddCors(options =>
|
|
||||||
{
|
|
||||||
options.AddDefaultPolicy(builder =>
|
|
||||||
{
|
|
||||||
builder
|
|
||||||
.WithOrigins(configuration["App:CorsOrigins"]?
|
|
||||||
.Split(",", StringSplitOptions.RemoveEmptyEntries)
|
|
||||||
.Select(o => o.RemovePostFix("/"))
|
|
||||||
.ToArray() ?? [])
|
|
||||||
.WithAbpExposedHeaders()
|
|
||||||
.SetIsOriginAllowedToAllowWildcardSubdomains()
|
|
||||||
.AllowAnyHeader()
|
|
||||||
.AllowAnyMethod()
|
|
||||||
.AllowCredentials();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnApplicationInitialization(ApplicationInitializationContext context)
|
public override void OnApplicationInitialization(ApplicationInitializationContext context)
|
||||||
@ -193,7 +51,7 @@ public class ReportHttpApiHostModule : AbpModule
|
|||||||
app.UseCors();
|
app.UseCors();
|
||||||
app.UseAuthentication();
|
app.UseAuthentication();
|
||||||
|
|
||||||
if (MultiTenancyConsts.IsEnabled)
|
if (KonSoftConsts.MultiTenancyEnabled)
|
||||||
{
|
{
|
||||||
app.UseMultiTenancy();
|
app.UseMultiTenancy();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,11 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<location path="." inheritInChildApplications="false">
|
<location path="." inheritInChildApplications="false">
|
||||||
<system.webServer>
|
<system.webServer>
|
||||||
<handlers>
|
<handlers>
|
||||||
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
||||||
</handlers>
|
</handlers>
|
||||||
<aspNetCore processPath="dotnet" arguments=".\KonSoft.Report.HttpApi.Host.dll" stdoutLogEnabled="false" stdoutLogFile=".\Logs\stdout" hostingModel="inprocess" />
|
<aspNetCore processPath="dotnet" arguments=".\KonSoft.Report.HttpApi.Host.dll" stdoutLogEnabled="false"
|
||||||
|
stdoutLogFile=".\Logs\stdout" hostingModel="inprocess" />
|
||||||
</system.webServer>
|
</system.webServer>
|
||||||
</location>
|
</location>
|
||||||
<system.webServer>
|
<system.webServer>
|
||||||
|
|||||||
@ -8,21 +8,6 @@
|
|||||||
<UserSecretsId>KonSoft.TenantManagement-4681b4fd-151f-4221-84a4-929d86723e4c</UserSecretsId>
|
<UserSecretsId>KonSoft.TenantManagement-4681b4fd-151f-4221-84a4-929d86723e4c</UserSecretsId>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Serilog.AspNetCore" Version="8.0.0" />
|
|
||||||
<PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.4" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="8.0.4" />
|
|
||||||
<PackageReference Include="DistributedLock.Redis" Version="1.0.2" />
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Authentication.JwtBearer" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Autofac" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.DistributedLocking" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.AspNetCore.Serilog" Version="8.3.4" />
|
|
||||||
<PackageReference Include="Volo.Abp.Swashbuckle" Version="8.3.4" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Remove="Logs\**" />
|
<Compile Remove="Logs\**" />
|
||||||
<Content Remove="Logs\**" />
|
<Content Remove="Logs\**" />
|
||||||
@ -34,6 +19,7 @@
|
|||||||
<ProjectReference Include="..\..\modules\tenant-management\src\KonSoft.TenantManagement.Application\KonSoft.TenantManagement.Application.csproj" />
|
<ProjectReference Include="..\..\modules\tenant-management\src\KonSoft.TenantManagement.Application\KonSoft.TenantManagement.Application.csproj" />
|
||||||
<ProjectReference Include="..\..\modules\tenant-management\src\KonSoft.TenantManagement.EntityFrameworkCore\KonSoft.TenantManagement.EntityFrameworkCore.csproj" />
|
<ProjectReference Include="..\..\modules\tenant-management\src\KonSoft.TenantManagement.EntityFrameworkCore\KonSoft.TenantManagement.EntityFrameworkCore.csproj" />
|
||||||
<ProjectReference Include="..\..\modules\tenant-management\src\KonSoft.TenantManagement.HttpApi\KonSoft.TenantManagement.HttpApi.csproj" />
|
<ProjectReference Include="..\..\modules\tenant-management\src\KonSoft.TenantManagement.HttpApi\KonSoft.TenantManagement.HttpApi.csproj" />
|
||||||
|
<ProjectReference Include="..\..\shared\KonSoft.Shared.Hosting.Microservices\KonSoft.Shared.Hosting.Microservices.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@ -10,7 +10,7 @@ namespace KonSoft.TenantManagement;
|
|||||||
|
|
||||||
public class Program
|
public class Program
|
||||||
{
|
{
|
||||||
public async static Task<int> Main(string[] args)
|
public static async Task<int> Main(string[] args)
|
||||||
{
|
{
|
||||||
Log.Logger = new LoggerConfiguration()
|
Log.Logger = new LoggerConfiguration()
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
|
|||||||
@ -1,27 +1,13 @@
|
|||||||
{
|
{
|
||||||
"iisSettings": {
|
"$schema": "http://json.schemastore.org/launchsettings.json",
|
||||||
"windowsAuthentication": false,
|
|
||||||
"anonymousAuthentication": true,
|
|
||||||
"iisExpress": {
|
|
||||||
"applicationUrl": "https://localhost:44348",
|
|
||||||
"sslPort": 44348
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"profiles": {
|
"profiles": {
|
||||||
"IIS Express": {
|
"http": {
|
||||||
"commandName": "IISExpress",
|
|
||||||
"launchBrowser": true,
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"KonSoft.TenantManagement.HttpApi.Host": {
|
|
||||||
"commandName": "Project",
|
"commandName": "Project",
|
||||||
"launchBrowser": true,
|
"launchBrowser": true,
|
||||||
"applicationUrl": "https://localhost:44348",
|
|
||||||
"environmentVariables": {
|
"environmentVariables": {
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
}
|
},
|
||||||
|
"applicationUrl": "https://localhost:44348"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,179 +1,37 @@
|
|||||||
using System;
|
using KonSoft.Shared.Hosting.AspNetCore;
|
||||||
using System.Collections.Generic;
|
using KonSoft.Shared.Hosting.Microservices;
|
||||||
using System.IO;
|
using KonSoft.TenantManagement.EntityFrameworkCore;
|
||||||
using System.Linq;
|
|
||||||
using Medallion.Threading;
|
|
||||||
using Medallion.Threading.Redis;
|
|
||||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Cors;
|
|
||||||
using Microsoft.AspNetCore.DataProtection;
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using KonSoft.TenantManagement.EntityFrameworkCore;
|
|
||||||
using KonSoft.TenantManagement.MultiTenancy;
|
|
||||||
using StackExchange.Redis;
|
|
||||||
using Microsoft.OpenApi.Models;
|
|
||||||
using Volo.Abp;
|
using Volo.Abp;
|
||||||
using Volo.Abp.AspNetCore.Authentication.JwtBearer;
|
using Volo.Abp.BackgroundJobs;
|
||||||
using Volo.Abp.AspNetCore.Mvc;
|
|
||||||
using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy;
|
|
||||||
using Volo.Abp.AspNetCore.Serilog;
|
|
||||||
using Volo.Abp.Autofac;
|
|
||||||
using Volo.Abp.Caching;
|
|
||||||
using Volo.Abp.Caching.StackExchangeRedis;
|
|
||||||
using Volo.Abp.DistributedLocking;
|
|
||||||
using Volo.Abp.Identity;
|
|
||||||
using Volo.Abp.Localization;
|
|
||||||
using Volo.Abp.Modularity;
|
using Volo.Abp.Modularity;
|
||||||
using Volo.Abp.Security.Claims;
|
|
||||||
using Volo.Abp.Swashbuckle;
|
|
||||||
using Volo.Abp.VirtualFileSystem;
|
|
||||||
|
|
||||||
namespace KonSoft.TenantManagement;
|
namespace KonSoft.TenantManagement;
|
||||||
|
|
||||||
[DependsOn(
|
[DependsOn(
|
||||||
typeof(TenantManagementHttpApiModule),
|
typeof(TenantManagementHttpApiModule),
|
||||||
typeof(AbpAutofacModule),
|
|
||||||
typeof(AbpCachingStackExchangeRedisModule),
|
|
||||||
typeof(AbpDistributedLockingModule),
|
|
||||||
typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
|
|
||||||
typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
|
|
||||||
typeof(TenantManagementApplicationModule),
|
typeof(TenantManagementApplicationModule),
|
||||||
typeof(TenantManagementEntityFrameworkCoreModule),
|
typeof(TenantManagementEntityFrameworkCoreModule),
|
||||||
typeof(AbpAspNetCoreSerilogModule),
|
typeof(KonSoftSharedHostingMicroservicesModule)
|
||||||
typeof(AbpSwashbuckleModule)
|
|
||||||
)]
|
)]
|
||||||
public class TenantManagementHttpApiHostModule : AbpModule
|
public class TenantManagementHttpApiHostModule : AbpModule
|
||||||
{
|
{
|
||||||
public override void ConfigureServices(ServiceConfigurationContext context)
|
public override void ConfigureServices(ServiceConfigurationContext context)
|
||||||
{
|
{
|
||||||
var configuration = context.Services.GetConfiguration();
|
var configuration = context.Services.GetConfiguration();
|
||||||
var hostingEnvironment = context.Services.GetHostingEnvironment();
|
|
||||||
|
|
||||||
ConfigureConventionalControllers();
|
SwaggerConfigurationHelper.ConfigureWithOidc(
|
||||||
ConfigureAuthentication(context, configuration);
|
context,
|
||||||
ConfigureCache(configuration);
|
|
||||||
ConfigureVirtualFileSystem(context);
|
|
||||||
ConfigureDataProtection(context, configuration, hostingEnvironment);
|
|
||||||
ConfigureDistributedLocking(context, configuration);
|
|
||||||
ConfigureCors(context, configuration);
|
|
||||||
ConfigureSwaggerServices(context, configuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureCache(IConfiguration configuration)
|
|
||||||
{
|
|
||||||
Configure<AbpDistributedCacheOptions>(options => { options.KeyPrefix = "TenantManagement:"; });
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureVirtualFileSystem(ServiceConfigurationContext context)
|
|
||||||
{
|
|
||||||
var hostingEnvironment = context.Services.GetHostingEnvironment();
|
|
||||||
|
|
||||||
if (hostingEnvironment.IsDevelopment())
|
|
||||||
{
|
|
||||||
Configure<AbpVirtualFileSystemOptions>(options =>
|
|
||||||
{
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<TenantManagementDomainSharedModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.TenantManagement.Domain.Shared"));
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<TenantManagementDomainModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.TenantManagement.Domain"));
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<TenantManagementApplicationContractsModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.TenantManagement.Application.Contracts"));
|
|
||||||
options.FileSets.ReplaceEmbeddedByPhysical<TenantManagementApplicationModule>(
|
|
||||||
Path.Combine(hostingEnvironment.ContentRootPath,
|
|
||||||
$"..{Path.DirectorySeparatorChar}KonSoft.TenantManagement.Application"));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureConventionalControllers()
|
|
||||||
{
|
|
||||||
Configure<AbpAspNetCoreMvcOptions>(options =>
|
|
||||||
{
|
|
||||||
options.ConventionalControllers.Create(typeof(TenantManagementApplicationModule).Assembly);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
|
|
||||||
.AddAbpJwtBearer(options =>
|
|
||||||
{
|
|
||||||
options.Authority = configuration["AuthServer:Authority"];
|
|
||||||
options.RequireHttpsMetadata = configuration.GetValue<bool>("AuthServer:RequireHttpsMetadata");
|
|
||||||
options.Audience = "TenantManagement";
|
|
||||||
});
|
|
||||||
|
|
||||||
context.Services.Configure<AbpClaimsPrincipalFactoryOptions>(options =>
|
|
||||||
{
|
|
||||||
options.IsDynamicClaimsEnabled = true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void ConfigureSwaggerServices(ServiceConfigurationContext context, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddAbpSwaggerGenWithOAuth(
|
|
||||||
configuration["AuthServer:Authority"]!,
|
configuration["AuthServer:Authority"]!,
|
||||||
new Dictionary<string, string>
|
["TenantManagementService"],
|
||||||
{
|
discoveryEndpoint: configuration["AuthServer:MetadataAddress"],
|
||||||
{"TenantManagement", "TenantManagement API"}
|
apiTitle: "TenantManagement Service API"
|
||||||
},
|
);
|
||||||
options =>
|
|
||||||
{
|
|
||||||
options.SwaggerDoc("v1", new OpenApiInfo { Title = "TenantManagement API", Version = "v1" });
|
|
||||||
options.DocInclusionPredicate((docName, description) => true);
|
|
||||||
options.CustomSchemaIds(type => type.FullName);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureDataProtection(
|
// ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
||||||
ServiceConfigurationContext context,
|
Configure<AbpBackgroundJobOptions>(options => options.IsJobExecutionEnabled = false);
|
||||||
IConfiguration configuration,
|
|
||||||
IWebHostEnvironment hostingEnvironment)
|
|
||||||
{
|
|
||||||
var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("TenantManagement");
|
|
||||||
if (!hostingEnvironment.IsDevelopment())
|
|
||||||
{
|
|
||||||
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
|
|
||||||
dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "TenantManagement-Protection-Keys");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureDistributedLocking(
|
|
||||||
ServiceConfigurationContext context,
|
|
||||||
IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddSingleton<IDistributedLockProvider>(sp =>
|
|
||||||
{
|
|
||||||
var connection = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
|
|
||||||
return new RedisDistributedSynchronizationProvider(connection.GetDatabase());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ConfigureCors(ServiceConfigurationContext context, IConfiguration configuration)
|
|
||||||
{
|
|
||||||
context.Services.AddCors(options =>
|
|
||||||
{
|
|
||||||
options.AddDefaultPolicy(builder =>
|
|
||||||
{
|
|
||||||
builder
|
|
||||||
.WithOrigins(configuration["App:CorsOrigins"]?
|
|
||||||
.Split(",", StringSplitOptions.RemoveEmptyEntries)
|
|
||||||
.Select(o => o.RemovePostFix("/"))
|
|
||||||
.ToArray() ?? [])
|
|
||||||
.WithAbpExposedHeaders()
|
|
||||||
.SetIsOriginAllowedToAllowWildcardSubdomains()
|
|
||||||
.AllowAnyHeader()
|
|
||||||
.AllowAnyMethod()
|
|
||||||
.AllowCredentials();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnApplicationInitialization(ApplicationInitializationContext context)
|
public override void OnApplicationInitialization(ApplicationInitializationContext context)
|
||||||
@ -193,7 +51,7 @@ public class TenantManagementHttpApiHostModule : AbpModule
|
|||||||
app.UseCors();
|
app.UseCors();
|
||||||
app.UseAuthentication();
|
app.UseAuthentication();
|
||||||
|
|
||||||
if (MultiTenancyConsts.IsEnabled)
|
if (KonSoftConsts.MultiTenancyEnabled)
|
||||||
{
|
{
|
||||||
app.UseMultiTenancy();
|
app.UseMultiTenancy();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,11 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
<configuration>
|
<configuration>
|
||||||
<location path="." inheritInChildApplications="false">
|
<location path="." inheritInChildApplications="false">
|
||||||
<system.webServer>
|
<system.webServer>
|
||||||
<handlers>
|
<handlers>
|
||||||
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
||||||
</handlers>
|
</handlers>
|
||||||
<aspNetCore processPath="dotnet" arguments=".\KonSoft.TenantManagement.HttpApi.Host.dll" stdoutLogEnabled="false" stdoutLogFile=".\Logs\stdout" hostingModel="inprocess" />
|
<aspNetCore processPath="dotnet" arguments=".\KonSoft.TenantManagement.HttpApi.Host.dll" stdoutLogEnabled="false"
|
||||||
|
stdoutLogFile=".\Logs\stdout" hostingModel="inprocess" />
|
||||||
</system.webServer>
|
</system.webServer>
|
||||||
</location>
|
</location>
|
||||||
<system.webServer>
|
<system.webServer>
|
||||||
|
|||||||
@ -1,12 +1,10 @@
|
|||||||
using Volo.Abp.Identity;
|
using Volo.Abp.Threading;
|
||||||
using Volo.Abp.ObjectExtending;
|
|
||||||
using Volo.Abp.Threading;
|
|
||||||
|
|
||||||
namespace KonSoft.Admin;
|
namespace KonSoft.Admin;
|
||||||
|
|
||||||
public static class AdminDtoExtensions
|
public static class AdminDtoExtensions
|
||||||
{
|
{
|
||||||
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();
|
private static readonly OneTimeRunner OneTimeRunner = new();
|
||||||
|
|
||||||
public static void Configure()
|
public static void Configure()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -0,0 +1,10 @@
|
|||||||
|
namespace KonSoft.Admin.Dtos;
|
||||||
|
|
||||||
|
public class AddressDto
|
||||||
|
{
|
||||||
|
public string ContactName { get; set; }
|
||||||
|
public string ContactPhone { get; set; }
|
||||||
|
public string DetailAddress { get; set; }
|
||||||
|
public string City { get; set; }
|
||||||
|
public string District { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
using System;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.Dtos;
|
||||||
|
|
||||||
|
public class CreateOrderDto
|
||||||
|
{
|
||||||
|
[Required] public Guid CustomerId { get; set; }
|
||||||
|
|
||||||
|
[Required] public Guid ServiceCategoryId { get; set; }
|
||||||
|
|
||||||
|
[Required] public DateTime ServiceTime { get; set; }
|
||||||
|
|
||||||
|
[Required] public decimal Amount { get; set; }
|
||||||
|
|
||||||
|
[Required] public AddressDto Address { get; set; }
|
||||||
|
|
||||||
|
public string Remark { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.Dtos;
|
||||||
|
|
||||||
|
public class CreateServiceCategoryDto
|
||||||
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
public Guid? ParentId { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
using KonSoft.Admin.Enums;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.Dtos;
|
||||||
|
|
||||||
|
public class OrderDto
|
||||||
|
{
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
public string OrderSN { get; set; }
|
||||||
|
public Guid CustomerId { get; set; }
|
||||||
|
public Guid? WorkerId { get; set; }
|
||||||
|
public ServiceCategoryDto? ServiceCategory { get; set; }
|
||||||
|
public DateTime ServiceTime { get; set; }
|
||||||
|
public OrderStatus Status { get; set; }
|
||||||
|
public decimal Amount { get; set; }
|
||||||
|
public decimal PaidAmount { get; set; }
|
||||||
|
public string PaymentMethod { get; set; }
|
||||||
|
public AddressDto Address { get; set; }
|
||||||
|
public string Remark { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
namespace KonSoft.Admin.Dtos;
|
||||||
|
|
||||||
|
public class PayOrderDto
|
||||||
|
{
|
||||||
|
}
|
||||||
@ -0,0 +1,60 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.Dtos;
|
||||||
|
|
||||||
|
public class ProductDto : CreateProductDto
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 嵌套子类
|
||||||
|
/// </summary>
|
||||||
|
public List<CreateProductDto> Children { get; set; } = new();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CreateProductDto
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 分类名称
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品编码
|
||||||
|
/// </summary>
|
||||||
|
public string Code { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品价格
|
||||||
|
/// </summary>
|
||||||
|
public decimal Price { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品描述
|
||||||
|
/// </summary>
|
||||||
|
public string Description { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 分类类型(大类或小类)
|
||||||
|
/// </summary>
|
||||||
|
public string Type { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 父分类ID
|
||||||
|
/// </summary>
|
||||||
|
public Guid? ParentId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品状态(在售/下架等)
|
||||||
|
/// </summary>
|
||||||
|
public string Status { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 排序字段
|
||||||
|
/// </summary>
|
||||||
|
public int Order { get; private set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class UpdateProductDto : CreateProductDto
|
||||||
|
{
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.Dtos;
|
||||||
|
|
||||||
|
public class ServiceCategoryDto
|
||||||
|
{
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
public string Name { get; set; }
|
||||||
|
public Guid? ParentId { get; set; }
|
||||||
|
public int Level { get; set; }
|
||||||
|
public List<ServiceCategoryDto> Children { get; set; } = new();
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Volo.Abp.Application.Dtos;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.Dtos;
|
||||||
|
|
||||||
|
public class WorkerDto : EntityDto<Guid>
|
||||||
|
{
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Phone { get; set; }
|
||||||
|
public List<Guid> SkillCategoryIds { get; set; } = new(); // 擅长服务类型
|
||||||
|
}
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using KonSoft.Admin.Dtos;
|
||||||
|
using Volo.Abp.Application.Dtos;
|
||||||
|
using Volo.Abp.Application.Services;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.IApplicationServices;
|
||||||
|
|
||||||
|
public interface IOrderAppService : IApplicationService
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 创建订单
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<OrderDto> CreateAsync(CreateOrderDto input);
|
||||||
|
|
||||||
|
Task<OrderDto> PayAsync(Guid orderId, PayOrderDto input);
|
||||||
|
Task AssignAsync(Guid orderId, Guid workerId);
|
||||||
|
Task StartServiceAsync(Guid orderId);
|
||||||
|
Task CompleteServiceAsync(Guid orderId);
|
||||||
|
Task ConfirmAsync(Guid orderId);
|
||||||
|
Task CancelAsync(Guid orderId, string reason);
|
||||||
|
Task DeleteAsync(params Guid[] ids);
|
||||||
|
Task EditAsync(OrderDto input);
|
||||||
|
Task<OrderDto> GetAsync(Guid id);
|
||||||
|
Task<PagedResultDto<OrderDto>> GetListAsync(PagedResultRequestDto input);
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using KonSoft.Admin.Dtos;
|
||||||
|
using Volo.Abp.Application.Dtos;
|
||||||
|
using Volo.Abp.Application.Services;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.IApplicationServices;
|
||||||
|
|
||||||
|
public interface IProductAppService : IApplicationService
|
||||||
|
{
|
||||||
|
Task CreateAsync(CreateProductDto input);
|
||||||
|
Task UpdateAsync(UpdateProductDto input);
|
||||||
|
Task DeleteAsync(Guid id);
|
||||||
|
Task<ProductDto> GetAsync(Guid id);
|
||||||
|
Task<PagedResultDto<ProductDto>> GetListAsync(PagedResultRequestDto input);
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using KonSoft.Admin.Dtos;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.IApplicationServices;
|
||||||
|
|
||||||
|
public interface IServiceCategoryAppService
|
||||||
|
{
|
||||||
|
Task<ServiceCategoryDto> CreateAsync(CreateServiceCategoryDto input);
|
||||||
|
Task DeleteAsync(Guid id);
|
||||||
|
Task<List<ServiceCategoryDto>> GetTreeAsync();
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
using Volo.Abp.Application.Services;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.IApplicationServices;
|
||||||
|
|
||||||
|
public interface IWorkerAppService : IApplicationService
|
||||||
|
{
|
||||||
|
}
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
namespace KonSoft.Admin.IApplicationServices;
|
||||||
|
|
||||||
|
public interface IWorkerAssignmentService
|
||||||
|
{
|
||||||
|
}
|
||||||
@ -1,7 +1,4 @@
|
|||||||
using System;
|
using KonSoft.Admin.Localization;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
using KonSoft.Admin.Localization;
|
|
||||||
using Volo.Abp.Application.Services;
|
using Volo.Abp.Application.Services;
|
||||||
|
|
||||||
namespace KonSoft.Admin;
|
namespace KonSoft.Admin;
|
||||||
|
|||||||
@ -1,4 +1,7 @@
|
|||||||
using AutoMapper;
|
using AutoMapper;
|
||||||
|
using KonSoft.Admin.Dtos;
|
||||||
|
using KonSoft.Admin.Entities;
|
||||||
|
using KonSoft.Admin.ValueObjects;
|
||||||
|
|
||||||
namespace KonSoft.Admin;
|
namespace KonSoft.Admin;
|
||||||
|
|
||||||
@ -9,5 +12,10 @@ public class AdminApplicationAutoMapperProfile : Profile
|
|||||||
/* You can configure your AutoMapper mapping configuration here.
|
/* You can configure your AutoMapper mapping configuration here.
|
||||||
* Alternatively, you can split your mapping configurations
|
* Alternatively, you can split your mapping configurations
|
||||||
* into multiple profile classes for a better organization. */
|
* into multiple profile classes for a better organization. */
|
||||||
|
|
||||||
|
CreateMap<Order, OrderDto>();
|
||||||
|
//CreateMap<CreateOrderDto, Order>();
|
||||||
|
CreateMap<AddressDto, AddressInfo>();
|
||||||
|
CreateMap<ServiceCategoryDto, ServiceCategory>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -18,14 +18,11 @@ namespace KonSoft.Admin;
|
|||||||
typeof(AbpTenantManagementApplicationModule),
|
typeof(AbpTenantManagementApplicationModule),
|
||||||
typeof(AbpFeatureManagementApplicationModule),
|
typeof(AbpFeatureManagementApplicationModule),
|
||||||
typeof(AbpSettingManagementApplicationModule)
|
typeof(AbpSettingManagementApplicationModule)
|
||||||
)]
|
)]
|
||||||
public class AdminApplicationModule : AbpModule
|
public class AdminApplicationModule : AbpModule
|
||||||
{
|
{
|
||||||
public override void ConfigureServices(ServiceConfigurationContext context)
|
public override void ConfigureServices(ServiceConfigurationContext context)
|
||||||
{
|
{
|
||||||
Configure<AbpAutoMapperOptions>(options =>
|
Configure<AbpAutoMapperOptions>(options => { options.AddMaps<AdminApplicationModule>(); });
|
||||||
{
|
|
||||||
options.AddMaps<AdminApplicationModule>();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -0,0 +1,167 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using KonSoft.Admin.Dtos;
|
||||||
|
using KonSoft.Admin.Entities;
|
||||||
|
using KonSoft.Admin.IApplicationServices;
|
||||||
|
using KonSoft.Admin.IRepositories;
|
||||||
|
using KonSoft.Admin.ValueObjects;
|
||||||
|
using Volo.Abp;
|
||||||
|
using Volo.Abp.Application.Dtos;
|
||||||
|
using Volo.Abp.Application.Services;
|
||||||
|
using Volo.Abp.Domain.Repositories;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.ApplicationServices;
|
||||||
|
|
||||||
|
public class OrderAppService(IOrderRepository orderRepository) : ApplicationService, IOrderAppService
|
||||||
|
{
|
||||||
|
private readonly IOrderRepository _orderRepository = orderRepository;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 分配师傅
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="orderId"></param>
|
||||||
|
/// <param name="workerId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
|
public async Task AssignAsync(Guid orderId, Guid workerId)
|
||||||
|
{
|
||||||
|
var order = await _orderRepository.GetAsync(o => o.Id == orderId);
|
||||||
|
order.AssignWorker(workerId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 取消订单
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="orderId"></param>
|
||||||
|
/// <param name="reason"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
|
public async Task CancelAsync(Guid orderId, string reason)
|
||||||
|
{
|
||||||
|
var order = await _orderRepository.GetAsync(o => o.Id == orderId);
|
||||||
|
order.Cancel(reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 完成订单
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="orderId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
|
public async Task CompleteServiceAsync(Guid orderId)
|
||||||
|
{
|
||||||
|
var order = await _orderRepository.GetAsync(o => o.Id == orderId);
|
||||||
|
order.CompleteService();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 确认订单
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="orderId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
|
public async Task ConfirmAsync(Guid orderId)
|
||||||
|
{
|
||||||
|
var order = await _orderRepository.GetAsync(o => o.Id == orderId);
|
||||||
|
order.ConfirmCompletion();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建订单
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
|
public async Task<OrderDto> CreateAsync(CreateOrderDto input)
|
||||||
|
{
|
||||||
|
// 生成订单号 TODO
|
||||||
|
var orderSN = "SN001";
|
||||||
|
var address = ObjectMapper.Map<AddressDto, AddressInfo>(input.Address);
|
||||||
|
var order = new Order(input.CustomerId, input.ServiceCategoryId, input.ServiceTime,
|
||||||
|
input.Amount, address, input.Remark);
|
||||||
|
|
||||||
|
await _orderRepository.InsertAsync(order);
|
||||||
|
return ObjectMapper.Map<Order, OrderDto>(order);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 根据订单ID删除订单
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id">订单ID</param>
|
||||||
|
public async Task DeleteAsync(params Guid[] ids)
|
||||||
|
{
|
||||||
|
// 根据ID删除订单
|
||||||
|
await _orderRepository.DeleteAsync(x => ids.Contains(x.Id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 修改订单信息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input">订单DTO对象</param>
|
||||||
|
/// s
|
||||||
|
public async Task EditAsync(OrderDto input)
|
||||||
|
{
|
||||||
|
// 根据ID查询订单,如果不存在则抛出异常【修改前端必然看到了,数据若查不到提示自定义异常信息】
|
||||||
|
var order = await _orderRepository.FindAsync(o => o.Id == input.Id) ??
|
||||||
|
throw new BusinessException("订单找不到").WithData("Id", input.Id);
|
||||||
|
|
||||||
|
// 将输入的DTO字段映射到订单实体
|
||||||
|
ObjectMapper.Map(input, order);
|
||||||
|
|
||||||
|
// 更新订单
|
||||||
|
await _orderRepository.UpdateAsync(order);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支付
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="orderId"></param>
|
||||||
|
/// <param name="input"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
|
public Task<OrderDto> PayAsync(Guid orderId, PayOrderDto input)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 开始订单
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="orderId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
|
public async Task StartServiceAsync(Guid orderId)
|
||||||
|
{
|
||||||
|
var order = await _orderRepository.GetAsync(o => o.Id == orderId);
|
||||||
|
order.StartService();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 根据订单ID获取单个订单
|
||||||
|
/// </summary>
|
||||||
|
public async Task<OrderDto> GetAsync(Guid id)
|
||||||
|
{
|
||||||
|
// 根据ID从数据库查询订单
|
||||||
|
var order = await _orderRepository.GetAsync(o => o.Id == id);
|
||||||
|
|
||||||
|
// 转换为OrderDto返回
|
||||||
|
return ObjectMapper.Map<Order, OrderDto>(order);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取所有订单列表
|
||||||
|
/// </summary>
|
||||||
|
public async Task<PagedResultDto<OrderDto>> GetListAsync(PagedResultRequestDto input)
|
||||||
|
{
|
||||||
|
// 查询所有订单
|
||||||
|
var orders = await _orderRepository.GetPagedListAsync(input.SkipCount, input.MaxResultCount, "Id");
|
||||||
|
|
||||||
|
var totalCount = await _orderRepository.CountAsync();
|
||||||
|
|
||||||
|
var orderDtos = ObjectMapper.Map<List<Order>, List<OrderDto>>(orders);
|
||||||
|
|
||||||
|
return new PagedResultDto<OrderDto>(totalCount, orderDtos);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,102 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using KonSoft.Admin.Dtos;
|
||||||
|
using KonSoft.Admin.Entities;
|
||||||
|
using KonSoft.Admin.IApplicationServices;
|
||||||
|
using KonSoft.Admin.IRepositories;
|
||||||
|
using Volo.Abp;
|
||||||
|
using Volo.Abp.Application.Dtos;
|
||||||
|
using Volo.Abp.Application.Services;
|
||||||
|
using Volo.Abp.Domain.Repositories;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.ApplicationServices;
|
||||||
|
|
||||||
|
public class ProductAppAppService(IProductRepository repository) : ApplicationService, IProductAppService
|
||||||
|
{
|
||||||
|
private readonly IProductRepository repository = repository;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建产品
|
||||||
|
/// </summary>
|
||||||
|
public async Task CreateAsync(CreateProductDto input)
|
||||||
|
{
|
||||||
|
var id = Guid.NewGuid();
|
||||||
|
var product = new Product(id, input.Name, input.Code, input.Price, input.Description, input.Type,
|
||||||
|
input.ParentId, input.Status, input.Order);
|
||||||
|
await repository.InsertAsync(product);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 删除
|
||||||
|
/// </summary>
|
||||||
|
public async Task DeleteAsync(Guid id)
|
||||||
|
{
|
||||||
|
await repository.DeleteAsync(x => x.Id == id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查询
|
||||||
|
/// </summary>
|
||||||
|
public async Task<ProductDto> GetAsync(Guid id)
|
||||||
|
{
|
||||||
|
var product = await repository.GetAsync(x => x.Id == id);
|
||||||
|
return ObjectMapper.Map<Product, ProductDto>(product);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查询集合
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<PagedResultDto<ProductDto>> GetListAsync(PagedResultRequestDto input)
|
||||||
|
{
|
||||||
|
var query = await repository.GetPageRootListAsync(input.SkipCount, input.MaxResultCount,
|
||||||
|
x => x.ParentId == null);
|
||||||
|
var all = await repository.GetListAsync(x => x.ParentId != null);
|
||||||
|
foreach (var item in query)
|
||||||
|
{
|
||||||
|
BuildChildren(item, all);
|
||||||
|
}
|
||||||
|
|
||||||
|
var totalCount = await repository.CountAsync(x => x.ParentId == null);
|
||||||
|
|
||||||
|
var productDtos = ObjectMapper.Map<List<Product>, List<ProductDto>>(query);
|
||||||
|
|
||||||
|
return new PagedResultDto<ProductDto>(totalCount, productDtos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 修改
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="input"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task UpdateAsync(UpdateProductDto input)
|
||||||
|
{
|
||||||
|
// 根据ID查询订单,如果不存在则抛出异常【修改前端必然看到了,数据若查不到提示自定义异常信息】
|
||||||
|
var order = await repository.FindAsync(o => o.Id == input.Id) ??
|
||||||
|
throw new BusinessException("商品找不到").WithData("Id", input.Id);
|
||||||
|
|
||||||
|
// 将输入的DTO字段映射到订单实体
|
||||||
|
ObjectMapper.Map(input, order);
|
||||||
|
|
||||||
|
// 更新订单
|
||||||
|
await repository.UpdateAsync(order);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void BuildChildren(Product parent, List<Product> all)
|
||||||
|
{
|
||||||
|
var children = all
|
||||||
|
.Where(x => x.ParentId == parent.Id)
|
||||||
|
.OrderBy(x => x.Order)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
parent.Children = children;
|
||||||
|
|
||||||
|
foreach (var child in children)
|
||||||
|
{
|
||||||
|
BuildChildren(child, all); // 递归
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,77 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using KonSoft.Admin.Dtos;
|
||||||
|
using KonSoft.Admin.Entities;
|
||||||
|
using KonSoft.Admin.IApplicationServices;
|
||||||
|
using Volo.Abp.Application.Services;
|
||||||
|
using Volo.Abp.Domain.Repositories;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.ApplicationServices;
|
||||||
|
|
||||||
|
public class ServiceCategoryAppService : ApplicationService, IServiceCategoryAppService
|
||||||
|
{
|
||||||
|
private readonly IRepository<ServiceCategory, Guid> _repository;
|
||||||
|
|
||||||
|
|
||||||
|
public ServiceCategoryAppService(IRepository<ServiceCategory, Guid> repository)
|
||||||
|
{
|
||||||
|
_repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<ServiceCategoryDto> CreateAsync(CreateServiceCategoryDto input)
|
||||||
|
{
|
||||||
|
ServiceCategory parent = null;
|
||||||
|
if (input.ParentId.HasValue)
|
||||||
|
{
|
||||||
|
parent = await _repository.GetAsync(input.ParentId.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
var category = new ServiceCategory(Guid.NewGuid(), input.Name);
|
||||||
|
category.SetParent(parent);
|
||||||
|
|
||||||
|
|
||||||
|
await _repository.InsertAsync(category);
|
||||||
|
|
||||||
|
|
||||||
|
return ObjectMapper.Map<ServiceCategory, ServiceCategoryDto>(category);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task DeleteAsync(Guid id)
|
||||||
|
{
|
||||||
|
var hasChildren = await _repository.AnyAsync(c => c.ParentId == id);
|
||||||
|
if (hasChildren)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("存在子节点无法删除!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
await _repository.DeleteAsync(o => o.Id == id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<ServiceCategoryDto>> GetTreeAsync()
|
||||||
|
{
|
||||||
|
var allCategories = await _repository.GetListAsync();
|
||||||
|
|
||||||
|
// 构建树
|
||||||
|
var lookup =
|
||||||
|
allCategories.ToDictionary(c => c.Id, c => ObjectMapper.Map<ServiceCategory, ServiceCategoryDto>(c));
|
||||||
|
var rootList = new List<ServiceCategoryDto>();
|
||||||
|
|
||||||
|
|
||||||
|
foreach (var dto in lookup.Values)
|
||||||
|
{
|
||||||
|
if (dto.ParentId.HasValue && lookup.ContainsKey(dto.ParentId.Value))
|
||||||
|
{
|
||||||
|
lookup[dto.ParentId.Value].Children.Add(dto);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rootList.Add(dto);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rootList.OrderBy(c => c.Name).ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -6,8 +6,8 @@
|
|||||||
<RootNamespace>KonSoft.Admin</RootNamespace>
|
<RootNamespace>KonSoft.Admin</RootNamespace>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\KonSoft.Admin.Domain\KonSoft.Admin.Domain.csproj"/>
|
<ProjectReference Include="..\KonSoft.Admin.Domain\KonSoft.Admin.Domain.csproj" />
|
||||||
<ProjectReference Include="..\KonSoft.Admin.Application.Contracts\KonSoft.Admin.Application.Contracts.csproj"/>
|
<ProjectReference Include="..\KonSoft.Admin.Application.Contracts\KonSoft.Admin.Application.Contracts.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Volo.Abp.Account.Application" Version="8.3.4" />
|
<PackageReference Include="Volo.Abp.Account.Application" Version="8.3.4" />
|
||||||
|
|||||||
@ -1,2 +1,3 @@
|
|||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
[assembly:InternalsVisibleToAttribute("KonSoft.Admin.Application.Tests")]
|
|
||||||
|
[assembly: InternalsVisibleToAttribute("KonSoft.Admin.Application.Tests")]
|
||||||
@ -24,7 +24,7 @@ namespace KonSoft.Admin;
|
|||||||
typeof(AbpPermissionManagementDomainSharedModule),
|
typeof(AbpPermissionManagementDomainSharedModule),
|
||||||
typeof(AbpSettingManagementDomainSharedModule),
|
typeof(AbpSettingManagementDomainSharedModule),
|
||||||
typeof(AbpTenantManagementDomainSharedModule)
|
typeof(AbpTenantManagementDomainSharedModule)
|
||||||
)]
|
)]
|
||||||
public class AdminDomainSharedModule : AbpModule
|
public class AdminDomainSharedModule : AbpModule
|
||||||
{
|
{
|
||||||
public override void PreConfigureServices(ServiceConfigurationContext context)
|
public override void PreConfigureServices(ServiceConfigurationContext context)
|
||||||
@ -35,10 +35,7 @@ public class AdminDomainSharedModule : AbpModule
|
|||||||
|
|
||||||
public override void ConfigureServices(ServiceConfigurationContext context)
|
public override void ConfigureServices(ServiceConfigurationContext context)
|
||||||
{
|
{
|
||||||
Configure<AbpVirtualFileSystemOptions>(options =>
|
Configure<AbpVirtualFileSystemOptions>(options => { options.FileSets.AddEmbedded<AdminDomainSharedModule>(); });
|
||||||
{
|
|
||||||
options.FileSets.AddEmbedded<AdminDomainSharedModule>();
|
|
||||||
});
|
|
||||||
|
|
||||||
Configure<AbpLocalizationOptions>(options =>
|
Configure<AbpLocalizationOptions>(options =>
|
||||||
{
|
{
|
||||||
|
|||||||
@ -4,7 +4,7 @@ namespace KonSoft.Admin;
|
|||||||
|
|
||||||
public static class AdminGlobalFeatureConfigurator
|
public static class AdminGlobalFeatureConfigurator
|
||||||
{
|
{
|
||||||
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();
|
private static readonly OneTimeRunner OneTimeRunner = new();
|
||||||
|
|
||||||
public static void Configure()
|
public static void Configure()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,13 +1,10 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using Volo.Abp.Threading;
|
||||||
using Volo.Abp.Identity;
|
|
||||||
using Volo.Abp.ObjectExtending;
|
|
||||||
using Volo.Abp.Threading;
|
|
||||||
|
|
||||||
namespace KonSoft.Admin;
|
namespace KonSoft.Admin;
|
||||||
|
|
||||||
public static class AdminModuleExtensionConfigurator
|
public static class AdminModuleExtensionConfigurator
|
||||||
{
|
{
|
||||||
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();
|
private static readonly OneTimeRunner OneTimeRunner = new();
|
||||||
|
|
||||||
public static void Configure()
|
public static void Configure()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -0,0 +1,14 @@
|
|||||||
|
namespace KonSoft.Admin.Enums;
|
||||||
|
|
||||||
|
public enum OrderStatus
|
||||||
|
{
|
||||||
|
PendingPayment, // 待支付
|
||||||
|
PaidWaitingAssign, // 已支付待派单
|
||||||
|
AssignedWaitingService, // 已派单待服务
|
||||||
|
InService, // 服务中
|
||||||
|
WaitingConfirm, // 待用户确认
|
||||||
|
Completed, // 已完成
|
||||||
|
Canceled, // 已取消
|
||||||
|
Refunding, // 退款中
|
||||||
|
Refunded // 已退款
|
||||||
|
}
|
||||||
@ -5,5 +5,4 @@ namespace KonSoft.Admin.Localization;
|
|||||||
[LocalizationResourceName("Admin")]
|
[LocalizationResourceName("Admin")]
|
||||||
public class AdminResource
|
public class AdminResource
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1,10 +0,0 @@
|
|||||||
namespace KonSoft.Admin.MultiTenancy;
|
|
||||||
|
|
||||||
public static class MultiTenancyConsts
|
|
||||||
{
|
|
||||||
/* Enable/disable multi-tenancy easily in a single point.
|
|
||||||
* If you will never need to multi-tenancy, you can remove
|
|
||||||
* related modules and code parts, including this file.
|
|
||||||
*/
|
|
||||||
public const bool IsEnabled = true;
|
|
||||||
}
|
|
||||||
@ -1,6 +1,5 @@
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||||
using KonSoft.Admin.MultiTenancy;
|
|
||||||
using Volo.Abp.AuditLogging;
|
using Volo.Abp.AuditLogging;
|
||||||
using Volo.Abp.BackgroundJobs;
|
using Volo.Abp.BackgroundJobs;
|
||||||
using Volo.Abp.Emailing;
|
using Volo.Abp.Emailing;
|
||||||
@ -8,7 +7,6 @@ using Volo.Abp.FeatureManagement;
|
|||||||
using Volo.Abp.Identity;
|
using Volo.Abp.Identity;
|
||||||
using Volo.Abp.Localization;
|
using Volo.Abp.Localization;
|
||||||
using Volo.Abp.Modularity;
|
using Volo.Abp.Modularity;
|
||||||
using Volo.Abp.MultiTenancy;
|
|
||||||
using Volo.Abp.OpenIddict;
|
using Volo.Abp.OpenIddict;
|
||||||
using Volo.Abp.PermissionManagement.Identity;
|
using Volo.Abp.PermissionManagement.Identity;
|
||||||
using Volo.Abp.PermissionManagement.OpenIddict;
|
using Volo.Abp.PermissionManagement.OpenIddict;
|
||||||
@ -56,10 +54,6 @@ public class AdminDomainModule : AbpModule
|
|||||||
options.Languages.Add(new LanguageInfo("es", "es", "Español"));
|
options.Languages.Add(new LanguageInfo("es", "es", "Español"));
|
||||||
});
|
});
|
||||||
|
|
||||||
Configure<AbpMultiTenancyOptions>(options =>
|
|
||||||
{
|
|
||||||
options.IsEnabled = MultiTenancyConsts.IsEnabled;
|
|
||||||
});
|
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>());
|
context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>());
|
||||||
|
|||||||
@ -17,12 +17,11 @@ namespace KonSoft.Admin.Data;
|
|||||||
|
|
||||||
public class AdminDbMigrationService : ITransientDependency
|
public class AdminDbMigrationService : ITransientDependency
|
||||||
{
|
{
|
||||||
public ILogger<AdminDbMigrationService> Logger { get; set; }
|
private readonly ICurrentTenant _currentTenant;
|
||||||
|
|
||||||
private readonly IDataSeeder _dataSeeder;
|
private readonly IDataSeeder _dataSeeder;
|
||||||
private readonly IEnumerable<IAdminDbSchemaMigrator> _dbSchemaMigrators;
|
private readonly IEnumerable<IAdminDbSchemaMigrator> _dbSchemaMigrators;
|
||||||
private readonly ITenantRepository _tenantRepository;
|
private readonly ITenantRepository _tenantRepository;
|
||||||
private readonly ICurrentTenant _currentTenant;
|
|
||||||
|
|
||||||
public AdminDbMigrationService(
|
public AdminDbMigrationService(
|
||||||
IDataSeeder dataSeeder,
|
IDataSeeder dataSeeder,
|
||||||
@ -38,6 +37,8 @@ public class AdminDbMigrationService : ITransientDependency
|
|||||||
Logger = NullLogger<AdminDbMigrationService>.Instance;
|
Logger = NullLogger<AdminDbMigrationService>.Instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ILogger<AdminDbMigrationService> Logger { get; set; }
|
||||||
|
|
||||||
public async Task MigrateAsync()
|
public async Task MigrateAsync()
|
||||||
{
|
{
|
||||||
var initialMigrationAdded = AddInitialMigrationIfNotExist();
|
var initialMigrationAdded = AddInitialMigrationIfNotExist();
|
||||||
@ -52,7 +53,7 @@ public class AdminDbMigrationService : ITransientDependency
|
|||||||
await MigrateDatabaseSchemaAsync();
|
await MigrateDatabaseSchemaAsync();
|
||||||
await SeedDataAsync();
|
await SeedDataAsync();
|
||||||
|
|
||||||
Logger.LogInformation($"Successfully completed host database migrations.");
|
Logger.LogInformation("Successfully completed host database migrations.");
|
||||||
|
|
||||||
var tenants = await _tenantRepository.GetListAsync(includeDetails: true);
|
var tenants = await _tenantRepository.GetListAsync(includeDetails: true);
|
||||||
|
|
||||||
@ -101,8 +102,10 @@ public class AdminDbMigrationService : ITransientDependency
|
|||||||
Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed...");
|
Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed...");
|
||||||
|
|
||||||
await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id)
|
await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id)
|
||||||
.WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, IdentityDataSeedContributor.AdminEmailDefaultValue)
|
.WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName,
|
||||||
.WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, IdentityDataSeedContributor.AdminPasswordDefaultValue)
|
IdentityDataSeedContributor.AdminEmailDefaultValue)
|
||||||
|
.WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName,
|
||||||
|
IdentityDataSeedContributor.AdminPasswordDefaultValue)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,11 +130,9 @@ public class AdminDbMigrationService : ITransientDependency
|
|||||||
AddInitialMigration();
|
AddInitialMigration();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Logger.LogWarning("Couldn't determinate if any migrations exist : " + e.Message);
|
Logger.LogWarning("Couldn't determinate if any migrations exist : " + e.Message);
|
||||||
@ -149,7 +150,8 @@ public class AdminDbMigrationService : ITransientDependency
|
|||||||
private bool MigrationsFolderExists()
|
private bool MigrationsFolderExists()
|
||||||
{
|
{
|
||||||
var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath();
|
var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath();
|
||||||
return dbMigrationsProjectFolder != null && Directory.Exists(Path.Combine(dbMigrationsProjectFolder, "Migrations"));
|
return dbMigrationsProjectFolder != null &&
|
||||||
|
Directory.Exists(Path.Combine(dbMigrationsProjectFolder, "Migrations"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddInitialMigration()
|
private void AddInitialMigration()
|
||||||
@ -207,7 +209,8 @@ public class AdminDbMigrationService : ITransientDependency
|
|||||||
{
|
{
|
||||||
currentDirectory = Directory.GetParent(currentDirectory.FullName);
|
currentDirectory = Directory.GetParent(currentDirectory.FullName);
|
||||||
|
|
||||||
if (currentDirectory != null && Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null)
|
if (currentDirectory != null &&
|
||||||
|
Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null)
|
||||||
{
|
{
|
||||||
return currentDirectory.FullName;
|
return currentDirectory.FullName;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,24 @@
|
|||||||
|
using Volo.Abp.Identity;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.Entities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 家政服务工人实体
|
||||||
|
/// </summary>
|
||||||
|
public class HouseholdWorker : IdentityUser
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 接单数
|
||||||
|
/// </summary>
|
||||||
|
public int OrderCount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 职业
|
||||||
|
/// </summary>
|
||||||
|
public required string Profession { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 能力范围
|
||||||
|
/// </summary>
|
||||||
|
public required string ScopeOfCompetence { get; set; }
|
||||||
|
}
|
||||||
158
modules/admin/src/KonSoft.Admin.Domain/Entities/Order.cs
Normal file
158
modules/admin/src/KonSoft.Admin.Domain/Entities/Order.cs
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
using System;
|
||||||
|
using KonSoft.Admin.Enums;
|
||||||
|
using KonSoft.Admin.ValueObjects;
|
||||||
|
using Volo.Abp.Domain.Entities.Auditing;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.Entities;
|
||||||
|
|
||||||
|
public class Order : FullAuditedAggregateRoot<Guid>
|
||||||
|
{
|
||||||
|
private Order()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Order(Guid customerId, Guid serviceCategoryId, DateTime serviceTime, decimal amount,
|
||||||
|
AddressInfo address, string? remark = null)
|
||||||
|
{
|
||||||
|
CustomerId = customerId;
|
||||||
|
ServiceCategoryId = serviceCategoryId;
|
||||||
|
ServiceTime = serviceTime;
|
||||||
|
Amount = amount;
|
||||||
|
Address = address;
|
||||||
|
Remark = remark;
|
||||||
|
Status = OrderStatus.PendingPayment;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 用户ID
|
||||||
|
/// </summary>
|
||||||
|
public Guid CustomerId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 家政人员ID
|
||||||
|
/// </summary>
|
||||||
|
public Guid? WorkerId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 服务项目ID
|
||||||
|
/// </summary>
|
||||||
|
public Guid ServiceCategoryId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 服务预约时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime ServiceTime { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 订单状态
|
||||||
|
/// </summary>
|
||||||
|
public OrderStatus Status { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 应付金额
|
||||||
|
/// </summary>
|
||||||
|
public decimal Amount { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 实付金额
|
||||||
|
/// </summary>
|
||||||
|
public decimal PaidAmount { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 支付方式
|
||||||
|
/// </summary>
|
||||||
|
public string PaymentMethod { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 地址
|
||||||
|
/// </summary>
|
||||||
|
public AddressInfo Address { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 备注
|
||||||
|
/// </summary>
|
||||||
|
public string? Remark { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 取消原因
|
||||||
|
/// </summary>
|
||||||
|
public string? CancelReason { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
|
public void MarkPaid(decimal paidAmount, string method)
|
||||||
|
{
|
||||||
|
if (Status != OrderStatus.PendingPayment)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("订单不在待付款状态");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PaidAmount = paidAmount;
|
||||||
|
PaymentMethod = method;
|
||||||
|
Status = OrderStatus.PaidWaitingAssign;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void AssignWorker(Guid workerId)
|
||||||
|
{
|
||||||
|
if (Status != OrderStatus.PaidWaitingAssign)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("订单无法分配师傅");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
WorkerId = workerId;
|
||||||
|
Status = OrderStatus.AssignedWaitingService;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void StartService()
|
||||||
|
{
|
||||||
|
if (Status != OrderStatus.AssignedWaitingService)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("订单无法开始");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Status = OrderStatus.InService;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void CompleteService()
|
||||||
|
{
|
||||||
|
if (Status != OrderStatus.InService)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("订单未开始服务,无法完成");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Status = OrderStatus.WaitingConfirm;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void ConfirmCompletion()
|
||||||
|
{
|
||||||
|
if (Status != OrderStatus.WaitingConfirm)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("订单无法确认");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Status = OrderStatus.Completed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void Cancel(string reason)
|
||||||
|
{
|
||||||
|
// 若已完成或退款中则不可取消
|
||||||
|
if (Status == OrderStatus.Completed || Status == OrderStatus.Refunding || Status == OrderStatus.Refunded)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("订单无法被取消");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CancelReason = reason;
|
||||||
|
Status = OrderStatus.Canceled;
|
||||||
|
}
|
||||||
|
}
|
||||||
105
modules/admin/src/KonSoft.Admin.Domain/Entities/Product.cs
Normal file
105
modules/admin/src/KonSoft.Admin.Domain/Entities/Product.cs
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
using Volo.Abp.Domain.Entities.Auditing;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.Entities;
|
||||||
|
|
||||||
|
public class Product(
|
||||||
|
Guid id,
|
||||||
|
string name,
|
||||||
|
string code,
|
||||||
|
decimal price,
|
||||||
|
string description,
|
||||||
|
string type,
|
||||||
|
Guid? parentId,
|
||||||
|
string status = "在售",
|
||||||
|
int order = 0) : FullAuditedAggregateRoot<Guid>(id)
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 分类名称
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; private set; } = name;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品编码
|
||||||
|
/// </summary>
|
||||||
|
public string Code { get; private set; } = code;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品价格
|
||||||
|
/// </summary>
|
||||||
|
public decimal Price { get; private set; } = price;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品描述
|
||||||
|
/// </summary>
|
||||||
|
public string Description { get; private set; } = description;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 分类类型(大类或小类)
|
||||||
|
/// </summary>
|
||||||
|
public string Type { get; private set; } = type;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 父分类ID
|
||||||
|
/// </summary>
|
||||||
|
public Guid? ParentId { get; private set; } = parentId;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 商品状态(在售/下架等)
|
||||||
|
/// </summary>
|
||||||
|
public string Status { get; private set; } = status;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 排序字段
|
||||||
|
/// </summary>
|
||||||
|
public int Order { get; private set; } = order;
|
||||||
|
|
||||||
|
[NotMapped] public List<Product> Children { get; set; } = new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 修改商品信息
|
||||||
|
/// </summary>
|
||||||
|
public void Update(string name, string code, decimal price, string description, int order)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
Code = code;
|
||||||
|
Price = price;
|
||||||
|
Description = description;
|
||||||
|
Order = order;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 修改商品分类
|
||||||
|
/// </summary>
|
||||||
|
public void ChangeCategory(string type, Guid? parentId)
|
||||||
|
{
|
||||||
|
Type = type;
|
||||||
|
ParentId = parentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 上架商品
|
||||||
|
/// </summary>
|
||||||
|
public void PutOnSale()
|
||||||
|
{
|
||||||
|
Status = "在售";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 下架商品
|
||||||
|
/// </summary>
|
||||||
|
public void TakeOffSale()
|
||||||
|
{
|
||||||
|
Status = "下架";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 修改价格
|
||||||
|
/// </summary>
|
||||||
|
public void ChangePrice(decimal newPrice)
|
||||||
|
{
|
||||||
|
Price = newPrice;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
using System;
|
||||||
|
using Volo.Abp.Domain.Entities.Auditing;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.Entities;
|
||||||
|
|
||||||
|
public class ServiceCategory : FullAuditedAggregateRoot<Guid>
|
||||||
|
{
|
||||||
|
protected ServiceCategory()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceCategory(Guid id, string name)
|
||||||
|
: base(id)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceCategory(Guid id, string name, Guid? parentId = null, string path = null, int level = 0) : base(id)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
ParentId = parentId;
|
||||||
|
Path = path ?? id.ToString();
|
||||||
|
Level = level;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Name { get; private set; }
|
||||||
|
public Guid? ParentId { get; private set; }
|
||||||
|
public string Path { get; private set; }
|
||||||
|
public int Level { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
|
public void UpdateName(string name)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void SetParent(ServiceCategory parent)
|
||||||
|
{
|
||||||
|
ParentId = parent?.Id;
|
||||||
|
Level = (parent?.Level ?? 0) + 1;
|
||||||
|
Path = parent != null ? $"{parent.Path}/{Id}" : Id.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
using KonSoft.Admin.Entities;
|
||||||
|
using Volo.Abp.Domain.Repositories;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.IRepositories;
|
||||||
|
|
||||||
|
public interface IHouseholdWorkerRepository : IRepository<HouseholdWorker>
|
||||||
|
{
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
using KonSoft.Admin.Entities;
|
||||||
|
using Volo.Abp.Domain.Repositories;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.IRepositories;
|
||||||
|
|
||||||
|
public interface IOrderRepository : IRepository<Order>
|
||||||
|
{
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using KonSoft.Admin.Entities;
|
||||||
|
using Volo.Abp.Domain.Repositories;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.IRepositories;
|
||||||
|
|
||||||
|
public interface IProductRepository : IRepository<Product>
|
||||||
|
{
|
||||||
|
Task<List<Product>> GetPageRootListAsync(int skipCount, int maxResult, Expression<Func<Product, bool>> where);
|
||||||
|
}
|
||||||
@ -23,12 +23,12 @@ namespace KonSoft.Admin.OpenIddict;
|
|||||||
*/
|
*/
|
||||||
public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDependency
|
public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDependency
|
||||||
{
|
{
|
||||||
|
private readonly IAbpApplicationManager _applicationManager;
|
||||||
private readonly IConfiguration _configuration;
|
private readonly IConfiguration _configuration;
|
||||||
private readonly IOpenIddictApplicationRepository _openIddictApplicationRepository;
|
private readonly IOpenIddictApplicationRepository _openIddictApplicationRepository;
|
||||||
private readonly IAbpApplicationManager _applicationManager;
|
|
||||||
private readonly IOpenIddictScopeRepository _openIddictScopeRepository;
|
private readonly IOpenIddictScopeRepository _openIddictScopeRepository;
|
||||||
private readonly IOpenIddictScopeManager _scopeManager;
|
|
||||||
private readonly IPermissionDataSeeder _permissionDataSeeder;
|
private readonly IPermissionDataSeeder _permissionDataSeeder;
|
||||||
|
private readonly IOpenIddictScopeManager _scopeManager;
|
||||||
private readonly IStringLocalizer<OpenIddictResponse> L;
|
private readonly IStringLocalizer<OpenIddictResponse> L;
|
||||||
|
|
||||||
public OpenIddictDataSeedContributor(
|
public OpenIddictDataSeedContributor(
|
||||||
@ -38,7 +38,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
|
|||||||
IOpenIddictScopeRepository openIddictScopeRepository,
|
IOpenIddictScopeRepository openIddictScopeRepository,
|
||||||
IOpenIddictScopeManager scopeManager,
|
IOpenIddictScopeManager scopeManager,
|
||||||
IPermissionDataSeeder permissionDataSeeder,
|
IPermissionDataSeeder permissionDataSeeder,
|
||||||
IStringLocalizer<OpenIddictResponse> l )
|
IStringLocalizer<OpenIddictResponse> l)
|
||||||
{
|
{
|
||||||
_configuration = configuration;
|
_configuration = configuration;
|
||||||
_openIddictApplicationRepository = openIddictApplicationRepository;
|
_openIddictApplicationRepository = openIddictApplicationRepository;
|
||||||
@ -60,7 +60,8 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
|
|||||||
{
|
{
|
||||||
if (await _openIddictScopeRepository.FindByNameAsync("Admin") == null)
|
if (await _openIddictScopeRepository.FindByNameAsync("Admin") == null)
|
||||||
{
|
{
|
||||||
await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor {
|
await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor
|
||||||
|
{
|
||||||
Name = "Admin", DisplayName = "Admin API", Resources = { "Admin" }
|
Name = "Admin", DisplayName = "Admin API", Resources = { "Admin" }
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -68,7 +69,8 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
|
|||||||
|
|
||||||
private async Task CreateApplicationsAsync()
|
private async Task CreateApplicationsAsync()
|
||||||
{
|
{
|
||||||
var commonScopes = new List<string> {
|
var commonScopes = new List<string>
|
||||||
|
{
|
||||||
OpenIddictConstants.Permissions.Scopes.Address,
|
OpenIddictConstants.Permissions.Scopes.Address,
|
||||||
OpenIddictConstants.Permissions.Scopes.Email,
|
OpenIddictConstants.Permissions.Scopes.Email,
|
||||||
OpenIddictConstants.Permissions.Scopes.Phone,
|
OpenIddictConstants.Permissions.Scopes.Phone,
|
||||||
@ -80,10 +82,6 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
|
|||||||
var configurationSection = _configuration.GetSection("OpenIddict:Applications");
|
var configurationSection = _configuration.GetSection("OpenIddict:Applications");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Swagger Client
|
// Swagger Client
|
||||||
var swaggerClientId = configurationSection["Admin_Swagger:ClientId"];
|
var swaggerClientId = configurationSection["Admin_Swagger:ClientId"];
|
||||||
if (!swaggerClientId.IsNullOrWhiteSpace())
|
if (!swaggerClientId.IsNullOrWhiteSpace())
|
||||||
@ -91,13 +89,13 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
|
|||||||
var swaggerRootUrl = configurationSection["Admin_Swagger:RootUrl"]?.TrimEnd('/');
|
var swaggerRootUrl = configurationSection["Admin_Swagger:RootUrl"]?.TrimEnd('/');
|
||||||
|
|
||||||
await CreateApplicationAsync(
|
await CreateApplicationAsync(
|
||||||
name: swaggerClientId!,
|
swaggerClientId!,
|
||||||
type: OpenIddictConstants.ClientTypes.Public,
|
OpenIddictConstants.ClientTypes.Public,
|
||||||
consentType: OpenIddictConstants.ConsentTypes.Implicit,
|
OpenIddictConstants.ConsentTypes.Implicit,
|
||||||
displayName: "Swagger Application",
|
"Swagger Application",
|
||||||
secret: null,
|
null,
|
||||||
grantTypes: [OpenIddictConstants.GrantTypes.AuthorizationCode],
|
[OpenIddictConstants.GrantTypes.AuthorizationCode],
|
||||||
scopes: commonScopes,
|
commonScopes,
|
||||||
redirectUri: $"{swaggerRootUrl}/swagger/oauth2-redirect.html",
|
redirectUri: $"{swaggerRootUrl}/swagger/oauth2-redirect.html",
|
||||||
clientUri: swaggerRootUrl
|
clientUri: swaggerRootUrl
|
||||||
);
|
);
|
||||||
@ -131,13 +129,14 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
|
|||||||
|
|
||||||
var client = await _openIddictApplicationRepository.FindByClientIdAsync(name);
|
var client = await _openIddictApplicationRepository.FindByClientIdAsync(name);
|
||||||
|
|
||||||
var application = new AbpApplicationDescriptor {
|
var application = new AbpApplicationDescriptor
|
||||||
|
{
|
||||||
ClientId = name,
|
ClientId = name,
|
||||||
ClientType = type,
|
ClientType = type,
|
||||||
ClientSecret = secret,
|
ClientSecret = secret,
|
||||||
ConsentType = consentType,
|
ConsentType = consentType,
|
||||||
DisplayName = displayName,
|
DisplayName = displayName,
|
||||||
ClientUri = clientUri,
|
ClientUri = clientUri
|
||||||
};
|
};
|
||||||
|
|
||||||
Check.NotNullOrEmpty(grantTypes, nameof(grantTypes));
|
Check.NotNullOrEmpty(grantTypes, nameof(grantTypes));
|
||||||
@ -160,7 +159,8 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
|
|||||||
application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Logout);
|
application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Logout);
|
||||||
}
|
}
|
||||||
|
|
||||||
var buildInGrantTypes = new[] {
|
var buildInGrantTypes = new[]
|
||||||
|
{
|
||||||
OpenIddictConstants.GrantTypes.Implicit, OpenIddictConstants.GrantTypes.Password,
|
OpenIddictConstants.GrantTypes.Implicit, OpenIddictConstants.GrantTypes.Password,
|
||||||
OpenIddictConstants.GrantTypes.AuthorizationCode, OpenIddictConstants.GrantTypes.ClientCredentials,
|
OpenIddictConstants.GrantTypes.AuthorizationCode, OpenIddictConstants.GrantTypes.ClientCredentials,
|
||||||
OpenIddictConstants.GrantTypes.DeviceCode, OpenIddictConstants.GrantTypes.RefreshToken
|
OpenIddictConstants.GrantTypes.DeviceCode, OpenIddictConstants.GrantTypes.RefreshToken
|
||||||
@ -233,7 +233,8 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var buildInScopes = new[] {
|
var buildInScopes = new[]
|
||||||
|
{
|
||||||
OpenIddictConstants.Permissions.Scopes.Address, OpenIddictConstants.Permissions.Scopes.Email,
|
OpenIddictConstants.Permissions.Scopes.Address, OpenIddictConstants.Permissions.Scopes.Email,
|
||||||
OpenIddictConstants.Permissions.Scopes.Phone, OpenIddictConstants.Permissions.Scopes.Profile,
|
OpenIddictConstants.Permissions.Scopes.Phone, OpenIddictConstants.Permissions.Scopes.Profile,
|
||||||
OpenIddictConstants.Permissions.Scopes.Roles
|
OpenIddictConstants.Permissions.Scopes.Roles
|
||||||
@ -289,8 +290,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
|
|||||||
await _permissionDataSeeder.SeedAsync(
|
await _permissionDataSeeder.SeedAsync(
|
||||||
ClientPermissionValueProvider.ProviderName,
|
ClientPermissionValueProvider.ProviderName,
|
||||||
name,
|
name,
|
||||||
permissions,
|
permissions
|
||||||
null
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -302,8 +302,10 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
|
|||||||
|
|
||||||
if (!HasSameRedirectUris(client, application))
|
if (!HasSameRedirectUris(client, application))
|
||||||
{
|
{
|
||||||
client.RedirectUris = JsonSerializer.Serialize(application.RedirectUris.Select(q => q.ToString().TrimEnd('/')));
|
client.RedirectUris =
|
||||||
client.PostLogoutRedirectUris = JsonSerializer.Serialize(application.PostLogoutRedirectUris.Select(q => q.ToString().TrimEnd('/')));
|
JsonSerializer.Serialize(application.RedirectUris.Select(q => q.ToString().TrimEnd('/')));
|
||||||
|
client.PostLogoutRedirectUris =
|
||||||
|
JsonSerializer.Serialize(application.PostLogoutRedirectUris.Select(q => q.ToString().TrimEnd('/')));
|
||||||
|
|
||||||
await _applicationManager.UpdateAsync(client.ToModel());
|
await _applicationManager.UpdateAsync(client.ToModel());
|
||||||
}
|
}
|
||||||
@ -317,11 +319,13 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep
|
|||||||
|
|
||||||
private bool HasSameRedirectUris(OpenIddictApplication existingClient, AbpApplicationDescriptor application)
|
private bool HasSameRedirectUris(OpenIddictApplication existingClient, AbpApplicationDescriptor application)
|
||||||
{
|
{
|
||||||
return existingClient.RedirectUris == JsonSerializer.Serialize(application.RedirectUris.Select(q => q.ToString().TrimEnd('/')));
|
return existingClient.RedirectUris ==
|
||||||
|
JsonSerializer.Serialize(application.RedirectUris.Select(q => q.ToString().TrimEnd('/')));
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool HasSameScopes(OpenIddictApplication existingClient, AbpApplicationDescriptor application)
|
private bool HasSameScopes(OpenIddictApplication existingClient, AbpApplicationDescriptor application)
|
||||||
{
|
{
|
||||||
return existingClient.Permissions == JsonSerializer.Serialize(application.Permissions.Select(q => q.ToString().TrimEnd('/')));
|
return existingClient.Permissions ==
|
||||||
|
JsonSerializer.Serialize(application.Permissions.Select(q => q.ToString().TrimEnd('/')));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,3 +1,4 @@
|
|||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
[assembly:InternalsVisibleToAttribute("KonSoft.Admin.Domain.Tests")]
|
|
||||||
[assembly:InternalsVisibleToAttribute("KonSoft.Admin.TestBase")]
|
[assembly: InternalsVisibleToAttribute("KonSoft.Admin.Domain.Tests")]
|
||||||
|
[assembly: InternalsVisibleToAttribute("KonSoft.Admin.TestBase")]
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Volo.Abp.Domain.Values;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.ValueObjects;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 地址
|
||||||
|
/// </summary>
|
||||||
|
public class AddressInfo : ValueObject
|
||||||
|
{
|
||||||
|
public AddressInfo(string contactName, string contactPhone, string detailAddress, string city, string district)
|
||||||
|
{
|
||||||
|
ContactName = contactName;
|
||||||
|
ContactPhone = contactPhone;
|
||||||
|
DetailAddress = detailAddress;
|
||||||
|
City = city;
|
||||||
|
District = district;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 联系人
|
||||||
|
/// </summary>
|
||||||
|
public string ContactName { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 手机号
|
||||||
|
/// </summary>
|
||||||
|
public string ContactPhone { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 详细地址
|
||||||
|
/// </summary>
|
||||||
|
public string DetailAddress { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 城市
|
||||||
|
/// </summary>
|
||||||
|
public string City { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 区域
|
||||||
|
/// </summary>
|
||||||
|
public string District { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
|
protected override IEnumerable<object> GetAtomicValues()
|
||||||
|
{
|
||||||
|
yield return ContactName;
|
||||||
|
yield return ContactPhone;
|
||||||
|
yield return DetailAddress;
|
||||||
|
yield return City;
|
||||||
|
yield return District;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,4 +1,5 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using KonSoft.Admin.EntityFrameworkCore.Configures;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Volo.Abp.AuditLogging.EntityFrameworkCore;
|
using Volo.Abp.AuditLogging.EntityFrameworkCore;
|
||||||
using Volo.Abp.BackgroundJobs.EntityFrameworkCore;
|
using Volo.Abp.BackgroundJobs.EntityFrameworkCore;
|
||||||
using Volo.Abp.Data;
|
using Volo.Abp.Data;
|
||||||
@ -23,48 +24,15 @@ public class AdminDbContext :
|
|||||||
IIdentityDbContext,
|
IIdentityDbContext,
|
||||||
ITenantManagementDbContext
|
ITenantManagementDbContext
|
||||||
{
|
{
|
||||||
/* Add DbSet properties for your Aggregate Roots / Entities here. */
|
|
||||||
|
|
||||||
#region Entities from the modules
|
|
||||||
|
|
||||||
/* Notice: We only implemented IIdentityDbContext and ITenantManagementDbContext
|
|
||||||
* and replaced them for this DbContext. This allows you to perform JOIN
|
|
||||||
* queries for the entities of these modules over the repositories easily. You
|
|
||||||
* typically don't need that for other modules. But, if you need, you can
|
|
||||||
* implement the DbContext interface of the needed module and use ReplaceDbContext
|
|
||||||
* attribute just like IIdentityDbContext and ITenantManagementDbContext.
|
|
||||||
*
|
|
||||||
* More info: Replacing a DbContext of a module ensures that the related module
|
|
||||||
* uses this DbContext on runtime. Otherwise, it will use its own DbContext class.
|
|
||||||
*/
|
|
||||||
|
|
||||||
//Identity
|
|
||||||
public DbSet<IdentityUser> Users { get; set; }
|
|
||||||
public DbSet<IdentityRole> Roles { get; set; }
|
|
||||||
public DbSet<IdentityClaimType> ClaimTypes { get; set; }
|
|
||||||
public DbSet<OrganizationUnit> OrganizationUnits { get; set; }
|
|
||||||
public DbSet<IdentitySecurityLog> SecurityLogs { get; set; }
|
|
||||||
public DbSet<IdentityLinkUser> LinkUsers { get; set; }
|
|
||||||
public DbSet<IdentityUserDelegation> UserDelegations { get; set; }
|
|
||||||
public DbSet<IdentitySession> Sessions { get; set; }
|
|
||||||
// Tenant Management
|
|
||||||
public DbSet<Tenant> Tenants { get; set; }
|
|
||||||
public DbSet<TenantConnectionString> TenantConnectionStrings { get; set; }
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
public AdminDbContext(DbContextOptions<AdminDbContext> options)
|
public AdminDbContext(DbContextOptions<AdminDbContext> options)
|
||||||
: base(options)
|
: base(options)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnModelCreating(ModelBuilder builder)
|
protected override void OnModelCreating(ModelBuilder builder)
|
||||||
{
|
{
|
||||||
base.OnModelCreating(builder);
|
base.OnModelCreating(builder);
|
||||||
|
|
||||||
/* Include modules to your migration db context */
|
|
||||||
|
|
||||||
builder.ConfigurePermissionManagement();
|
builder.ConfigurePermissionManagement();
|
||||||
builder.ConfigureSettingManagement();
|
builder.ConfigureSettingManagement();
|
||||||
builder.ConfigureBackgroundJobs();
|
builder.ConfigureBackgroundJobs();
|
||||||
@ -74,13 +42,19 @@ public class AdminDbContext :
|
|||||||
builder.ConfigureFeatureManagement();
|
builder.ConfigureFeatureManagement();
|
||||||
builder.ConfigureTenantManagement();
|
builder.ConfigureTenantManagement();
|
||||||
|
|
||||||
/* Configure your own tables/entities inside here */
|
builder.ConfigureApplication();
|
||||||
|
|
||||||
//builder.Entity<YourEntity>(b =>
|
|
||||||
//{
|
|
||||||
// b.ToTable(AdminConsts.DbTablePrefix + "YourEntities", AdminConsts.DbSchema);
|
|
||||||
// b.ConfigureByConvention(); //auto configure for the base class props
|
|
||||||
// //...
|
|
||||||
//});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DbSet<IdentityUser> Users { get; set; }
|
||||||
|
public DbSet<IdentityRole> Roles { get; set; }
|
||||||
|
public DbSet<IdentityClaimType> ClaimTypes { get; set; }
|
||||||
|
public DbSet<OrganizationUnit> OrganizationUnits { get; set; }
|
||||||
|
public DbSet<IdentitySecurityLog> SecurityLogs { get; set; }
|
||||||
|
public DbSet<IdentityLinkUser> LinkUsers { get; set; }
|
||||||
|
public DbSet<IdentityUserDelegation> UserDelegations { get; set; }
|
||||||
|
|
||||||
|
public DbSet<IdentitySession> Sessions { get; set; }
|
||||||
|
|
||||||
|
public DbSet<Tenant> Tenants { get; set; }
|
||||||
|
public DbSet<TenantConnectionString> TenantConnectionStrings { get; set; }
|
||||||
}
|
}
|
||||||
@ -28,8 +28,8 @@ public class AdminDbContextFactory : IDesignTimeDbContextFactory<AdminDbContext>
|
|||||||
private static IConfigurationRoot BuildConfiguration()
|
private static IConfigurationRoot BuildConfiguration()
|
||||||
{
|
{
|
||||||
var builder = new ConfigurationBuilder()
|
var builder = new ConfigurationBuilder()
|
||||||
.SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../KonSoft.Admin.DbMigrator/"))
|
.SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../../../../microservices/KonSoft.Admin.HttpApi.Host/"))
|
||||||
.AddJsonFile("appsettings.json", optional: false);
|
.AddJsonFile("appsettings.json", false);
|
||||||
|
|
||||||
return builder.Build();
|
return builder.Build();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,13 +1,10 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Volo.Abp.Threading;
|
||||||
using Volo.Abp.Identity;
|
|
||||||
using Volo.Abp.ObjectExtending;
|
|
||||||
using Volo.Abp.Threading;
|
|
||||||
|
|
||||||
namespace KonSoft.Admin.EntityFrameworkCore;
|
namespace KonSoft.Admin.EntityFrameworkCore;
|
||||||
|
|
||||||
public static class AdminEfCoreEntityExtensionMappings
|
public static class AdminEfCoreEntityExtensionMappings
|
||||||
{
|
{
|
||||||
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();
|
private static readonly OneTimeRunner OneTimeRunner = new();
|
||||||
|
|
||||||
public static void Configure()
|
public static void Configure()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Volo.Abp.Uow;
|
|
||||||
using Volo.Abp.AuditLogging.EntityFrameworkCore;
|
using Volo.Abp.AuditLogging.EntityFrameworkCore;
|
||||||
using Volo.Abp.BackgroundJobs.EntityFrameworkCore;
|
using Volo.Abp.BackgroundJobs.EntityFrameworkCore;
|
||||||
using Volo.Abp.EntityFrameworkCore;
|
using Volo.Abp.EntityFrameworkCore;
|
||||||
@ -26,7 +25,7 @@ namespace KonSoft.Admin.EntityFrameworkCore;
|
|||||||
typeof(AbpAuditLoggingEntityFrameworkCoreModule),
|
typeof(AbpAuditLoggingEntityFrameworkCoreModule),
|
||||||
typeof(AbpTenantManagementEntityFrameworkCoreModule),
|
typeof(AbpTenantManagementEntityFrameworkCoreModule),
|
||||||
typeof(AbpFeatureManagementEntityFrameworkCoreModule)
|
typeof(AbpFeatureManagementEntityFrameworkCoreModule)
|
||||||
)]
|
)]
|
||||||
public class AdminEntityFrameworkCoreModule : AbpModule
|
public class AdminEntityFrameworkCoreModule : AbpModule
|
||||||
{
|
{
|
||||||
public override void PreConfigureServices(ServiceConfigurationContext context)
|
public override void PreConfigureServices(ServiceConfigurationContext context)
|
||||||
@ -43,7 +42,7 @@ public class AdminEntityFrameworkCoreModule : AbpModule
|
|||||||
{
|
{
|
||||||
/* Remove "includeAllEntities: true" to create
|
/* Remove "includeAllEntities: true" to create
|
||||||
* default repositories only for aggregate roots */
|
* default repositories only for aggregate roots */
|
||||||
options.AddDefaultRepositories(includeAllEntities: true);
|
options.AddDefaultRepositories(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
Configure<AbpDbContextOptions>(options =>
|
Configure<AbpDbContextOptions>(options =>
|
||||||
@ -52,6 +51,5 @@ public class AdminEntityFrameworkCoreModule : AbpModule
|
|||||||
* See also AdminMigrationsDbContextFactory for EF Core tooling. */
|
* See also AdminMigrationsDbContextFactory for EF Core tooling. */
|
||||||
options.UseNpgsql();
|
options.UseNpgsql();
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -0,0 +1,48 @@
|
|||||||
|
using KonSoft.Admin.Entities;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using Volo.Abp;
|
||||||
|
using Volo.Abp.EntityFrameworkCore.Modeling;
|
||||||
|
using Volo.Abp.Identity;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.EntityFrameworkCore.Configures;
|
||||||
|
|
||||||
|
public static class ApplicationDbContextModelBuilderExtensions
|
||||||
|
{
|
||||||
|
public static void ConfigureApplication([NotNull] this ModelBuilder builder)
|
||||||
|
{
|
||||||
|
Check.NotNull(builder, nameof(builder));
|
||||||
|
|
||||||
|
builder.Entity<Order>(e =>
|
||||||
|
{
|
||||||
|
e.ToTable(AdminConsts.DbTablePrefix + nameof(Order) + AdminConsts.DbSchema);
|
||||||
|
e.ConfigureByConvention();
|
||||||
|
|
||||||
|
e.ComplexProperty(b => b.Address);
|
||||||
|
|
||||||
|
e.ApplyObjectExtensionMappings();
|
||||||
|
});
|
||||||
|
|
||||||
|
builder.Entity<Product>(e =>
|
||||||
|
{
|
||||||
|
e.ToTable(AdminConsts.DbTablePrefix + nameof(Product) + AdminConsts.DbSchema);
|
||||||
|
e.ConfigureByConvention();
|
||||||
|
e.ApplyObjectExtensionMappings();
|
||||||
|
});
|
||||||
|
|
||||||
|
builder.Entity<HouseholdWorker>(e =>
|
||||||
|
{
|
||||||
|
e.ToTable(AbpIdentityDbProperties.DbTablePrefix + "Users" + AbpIdentityDbProperties.DbSchema);
|
||||||
|
e.ConfigureByConvention();
|
||||||
|
e.ApplyObjectExtensionMappings();
|
||||||
|
});
|
||||||
|
|
||||||
|
builder.Entity<ServiceCategory>(e =>
|
||||||
|
{
|
||||||
|
e.ToTable(AdminConsts.DbTablePrefix + nameof(ServiceCategory) + AdminConsts.DbSchema);
|
||||||
|
e.ConfigureByConvention();
|
||||||
|
e.ApplyObjectExtensionMappings();
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,8 +1,8 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using KonSoft.Admin.Data;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using KonSoft.Admin.Data;
|
|
||||||
using Volo.Abp.DependencyInjection;
|
using Volo.Abp.DependencyInjection;
|
||||||
|
|
||||||
namespace KonSoft.Admin.EntityFrameworkCore;
|
namespace KonSoft.Admin.EntityFrameworkCore;
|
||||||
|
|||||||
@ -0,0 +1,16 @@
|
|||||||
|
using KonSoft.Admin.Entities;
|
||||||
|
using KonSoft.Admin.IRepositories;
|
||||||
|
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
|
||||||
|
using Volo.Abp.EntityFrameworkCore;
|
||||||
|
using Volo.Abp.TenantManagement.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.EntityFrameworkCore.Repositories;
|
||||||
|
|
||||||
|
public class HouseholdWorkerRepository : EfCoreRepository<TenantManagementDbContext, HouseholdWorker>,
|
||||||
|
IHouseholdWorkerRepository
|
||||||
|
{
|
||||||
|
public HouseholdWorkerRepository(IDbContextProvider<TenantManagementDbContext> dbContextProvider) : base(
|
||||||
|
dbContextProvider)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
using KonSoft.Admin.Entities;
|
||||||
|
using KonSoft.Admin.IRepositories;
|
||||||
|
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
|
||||||
|
using Volo.Abp.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.EntityFrameworkCore.Repositories;
|
||||||
|
|
||||||
|
public class OrderRepository : EfCoreRepository<AdminDbContext, Order>, IOrderRepository
|
||||||
|
{
|
||||||
|
public OrderRepository(IDbContextProvider<AdminDbContext> dbContextProvider) : base(dbContextProvider)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using KonSoft.Admin.Entities;
|
||||||
|
using KonSoft.Admin.IRepositories;
|
||||||
|
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
|
||||||
|
using Volo.Abp.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace KonSoft.Admin.EntityFrameworkCore.Repositories;
|
||||||
|
|
||||||
|
public class ProductRepository : EfCoreRepository<AdminDbContext, Product>, IProductRepository
|
||||||
|
{
|
||||||
|
public ProductRepository(IDbContextProvider<AdminDbContext> dbContextProvider) : base(dbContextProvider)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<Product>> GetPageRootListAsync(int skipCount, int maxResultCount,
|
||||||
|
Expression<Func<Product, bool>> where)
|
||||||
|
{
|
||||||
|
var queryable = await GetQueryableAsync();
|
||||||
|
return queryable.PageBy(skipCount, maxResultCount).Where(where).OrderBy(x => x.Order).ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
2294
modules/admin/src/KonSoft.Admin.EntityFrameworkCore/Migrations/20251017042956_V1.0.0.Designer.cs
generated
Normal file
2294
modules/admin/src/KonSoft.Admin.EntityFrameworkCore/Migrations/20251017042956_V1.0.0.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user