Browse Source

Merge pull request #231 from colinin/4.2

add dynamic localization support
pull/252/head
cKey 5 years ago
committed by GitHub
parent
commit
2a5574cdaa
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      README.md
  2. 18
      RELEASE.md
  3. 67
      aspnet-core/LINGYUN.MicroService.All.sln
  4. 37
      aspnet-core/configuration/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/appsettings.Development.json
  5. 37
      aspnet-core/configuration/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/appsettings.Development.json
  6. 91
      aspnet-core/configuration/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/appsettings.Development.json
  7. 3
      aspnet-core/configuration/platform/LINGYUN.Platform.HttpApi.Host/appsettings.Development.json
  8. 33
      aspnet-core/database/ApiGateway-Init-SqlServer.sql
  9. 164
      aspnet-core/database/ApiGateway-Init.sql
  10. 15
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN.Abp.Localization.Dynamic.csproj
  11. 13
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/AbpLocalizationDynamicModule.cs
  12. 30
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DefaultLocalizationStore.cs
  13. 42
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DynamicLanguageProvider.cs
  14. 120
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DynamicLocalizationResourceContributor.cs
  15. 14
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/ILocalizationDispatcher.cs
  16. 36
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/ILocalizationStore.cs
  17. 17
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/ILocalizationSubscriber.cs
  18. 23
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/LanguageInfoComparer.cs
  19. 51
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/LocalizationCacheItem.cs
  20. 23
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/LocalizationResetSynchronizer.cs
  21. 33
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/LocalizationSubscriber.cs
  22. 29
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/LocalizedStringCacheResetEventData.cs
  23. 37
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/README.md
  24. 42
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/Volo/Abp/Localization/LocalizationResourceDictionaryExtensions.cs
  25. 20
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/Volo/Abp/Localization/LocalizationResourceExtensions.cs
  26. 16
      aspnet-core/modules/localization/LINGYUN.Abp.Localization.Json/README.md
  27. 19
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN.Abp.LocalizationManagement.Application.Contracts.csproj
  28. 13
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/AbpLocalizationManagementApplicationContractsModule.cs
  29. 25
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/CreateOrUpdateLanguageInput.cs
  30. 20
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/CreateOrUpdateResourceInput.cs
  31. 10
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/CreateOrUpdateTextInput.cs
  32. 20
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/CreateTextInput.cs
  33. 9
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/GetLanguagesInput.cs
  34. 9
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/GetResourcesInput.cs
  35. 20
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/GetTextByKeyInput.cs
  36. 24
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/GetTextsInput.cs
  37. 19
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ILanguageAppService.cs
  38. 18
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/IResourceAppService.cs
  39. 17
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ITextAppService.cs
  40. 14
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageDto.cs
  41. 7
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LocalizationRemoteServiceConsts.cs
  42. 73
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/Permissions/LocalizationManagementPermissionDefinitionProvider.cs
  43. 40
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/Permissions/LocalizationManagementPermissions.cs
  44. 13
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceDto.cs
  45. 14
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/TextDifferenceDto.cs
  46. 12
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/TextDto.cs
  47. 6
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/UpdateTextInput.cs
  48. 19
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN.Abp.LocalizationManagement.Application.csproj
  49. 24
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/AbpLocalizationManagementApplicationModule.cs
  50. 73
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LanguageAppService.cs
  51. 15
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LocalizationManagementApplicationMapperProfile.cs
  52. 78
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/ResourceAppService.cs
  53. 73
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/TextAppService.cs
  54. 25
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN.Abp.LocalizationManagement.Domain.Shared.csproj
  55. 29
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/AbpLocalizationManagementDomainSharedModule.cs
  56. 10
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/LanguageConsts.cs
  57. 9
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/LocalizationManagementResource.cs
  58. 41
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/en.json
  59. 41
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/zh-Hans.json
  60. 9
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/ResourceConsts.cs
  61. 8
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/TextConsts.cs
  62. 33
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/TextDifference.cs
  63. 10
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/TextEto.cs
  64. 20
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN.Abp.LocalizationManagement.Domain.csproj
  65. 44
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/AbpLocalizationManagementDomainModule.cs
  66. 17
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/ILanguageRepository.cs
  67. 18
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/IResourceRepository.cs
  68. 45
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/ITextRepository.cs
  69. 53
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Language.cs
  70. 11
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LocalizationDbProperties.cs
  71. 12
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LocalizationManagementDomainMapperProfile.cs
  72. 86
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LocalizationStore.cs
  73. 53
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LocalizationSynchronizer.cs
  74. 28
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Resource.cs
  75. 37
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Text.cs
  76. 18
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore.csproj
  77. 24
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/AbpLocalizationManagementEntityFrameworkCoreModule.cs
  78. 34
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/EfCoreLanguageRepository.cs
  79. 34
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/EfCoreResourceRepository.cs
  80. 135
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/EfCoreTextRepository.cs
  81. 10
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/ILocalizationDbContext.cs
  82. 25
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/LocalizationDbContext.cs
  83. 99
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/LocalizationDbContextModelBuilderExtensions.cs
  84. 18
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/LocalizationModelBuilderConfigurationOptions.cs
  85. 18
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN.Abp.LocalizationManagement.HttpApi.csproj
  86. 42
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/AbpLocalizationManagementHttpApiModule.cs
  87. 62
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/LanguageController.cs
  88. 62
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/ResourceController.cs
  89. 61
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/TextController.cs
  90. 39
      aspnet-core/modules/lt/README.md
  91. 86
      aspnet-core/modules/platform/LINGYUN.Platform.Domain/LINGYUN/Platform/PlatformDataSeedContributor.cs
  92. 8
      aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/BackendAdminHostModule.cs
  93. 3
      aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/LINGYUN.Abp.BackendAdmin.HttpApi.Host.csproj
  94. BIN
      aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/event-bus-cap.db
  95. 7
      aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/AbpIdentityServerAdminHttpApiHostModule.cs
  96. 1
      aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/LINGYUN.Abp.IdentityServer4.HttpApi.Host.csproj
  97. 268
      aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/AbpLocalizationManagementHttpApiHostModule.cs
  98. 13
      aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/Dockerfile
  99. 22
      aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/EntityFrameworkCore/LocalizationManagementHttpApiHostMigrationsDbContext.cs
  100. 30
      aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/EntityFrameworkCore/LocalizationManagementHttpApiHostMigrationsDbContextFactory.cs

2
README.md

@ -1,6 +1,8 @@
[English](./README.en.md) | 简体中文 [English](./README.en.md) | 简体中文
[更新说明](./RELEASE.MD) 更新说明
## 总览 ## 总览
这是一个基于 [vue-typescript-admin-template](http://armour.github.io/vue-typescript-admin-template) 的Abp框架后台管理界面 这是一个基于 [vue-typescript-admin-template](http://armour.github.io/vue-typescript-admin-template) 的Abp框架后台管理界面

18
RELEASE.md

@ -0,0 +1,18 @@
## 总览
# [2021-03-29]
1、增加动态本地化组件支持,用于在运行时替换本地化文本,需要实现 ILocalizationStore;
2、增加本地化文档管理项目,实现了 ILocalizationStore持久化本地资源到数据库;
使用须知: 需要先定位到 [LocalizationManagement](./aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host) 目录下
执行Ef迁移命令: **dotnet ef database update**
3、增加一个dotnet-compose配置文件[docker-compose.configuration.yml](./docker-compose.configuration.yml);
4、vueJs 增加本地化管理组件视图: views/localization-management;
5、vueJs 用户登录后的异步等待调用修改为通过store来调用abp模块初始化事件;
6、vueJs 修复了HttpProxy模块传递的params与data使用情况混淆的问题;
7、同步本地化管理组件的网关路由初始化配置。

67
aspnet-core/LINGYUN.MicroService.All.sln

@ -300,7 +300,30 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Xm
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Json", "modules\localization\LINGYUN.Abp.Localization.Json\LINGYUN.Abp.Localization.Json.csproj", "{EA563F48-A6EF-4886-B607-2A83F7795F1B}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Json", "modules\localization\LINGYUN.Abp.Localization.Json\LINGYUN.Abp.Localization.Json.csproj", "{EA563F48-A6EF-4886-B607-2A83F7795F1B}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.Localization.Json.Tests", "tests\LINGYUN.Abp.Localization.Json.Tests\LINGYUN.Abp.Localization.Json.Tests.csproj", "{EBCF7D88-49E2-413D-A7A6-1A76BC2E8161}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Json.Tests", "tests\LINGYUN.Abp.Localization.Json.Tests\LINGYUN.Abp.Localization.Json.Tests.csproj", "{EBCF7D88-49E2-413D-A7A6-1A76BC2E8161}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Dynamic", "modules\common\LINGYUN.Abp.Localization.Dynamic\LINGYUN.Abp.Localization.Dynamic.csproj", "{4A9043FD-24A3-4A4A-956B-9CB71876F415}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization-management", "localization-management", "{D3BAA44E-8395-4E8A-AA96-6B463356C537}"
ProjectSection(SolutionItems) = preProject
modules\lt\README.md = modules\lt\README.md
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Domain.Shared", "modules\lt\LINGYUN.Abp.LocalizationManagement.Domain.Shared\LINGYUN.Abp.LocalizationManagement.Domain.Shared.csproj", "{5BE18D72-0D02-4854-966E-745CE5DAF77F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Domain", "modules\lt\LINGYUN.Abp.LocalizationManagement.Domain\LINGYUN.Abp.LocalizationManagement.Domain.csproj", "{73EAD4FE-B44F-44A7-904E-FFA5096D91BD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Application.Contracts", "modules\lt\LINGYUN.Abp.LocalizationManagement.Application.Contracts\LINGYUN.Abp.LocalizationManagement.Application.Contracts.csproj", "{06D34108-01BA-4C77-A704-4DD9E6F7E32C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Application", "modules\lt\LINGYUN.Abp.LocalizationManagement.Application\LINGYUN.Abp.LocalizationManagement.Application.csproj", "{A98C939C-9F48-414A-A2D3-853BE4447397}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore", "modules\lt\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore.csproj", "{A94BE05F-7DAB-461C-93E7-914CBDF4FA93}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.HttpApi", "modules\lt\LINGYUN.Abp.LocalizationManagement.HttpApi\LINGYUN.Abp.LocalizationManagement.HttpApi.csproj", "{FBE91498-D83B-4873-A67E-0FB9D1C366F0}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization", "localization", "{A2EA6B3F-AD1A-4FDA-B12E-F71B20A43A6B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.HttpApi.Host", "services\localization\LINGYUN.Abp.LocalizationManagement.HttpApi.Host\LINGYUN.Abp.LocalizationManagement.HttpApi.Host.csproj", "{6FFC14FE-F659-4B23-9746-4B767CE520D2}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -796,6 +819,38 @@ Global
{EBCF7D88-49E2-413D-A7A6-1A76BC2E8161}.Debug|Any CPU.Build.0 = Debug|Any CPU {EBCF7D88-49E2-413D-A7A6-1A76BC2E8161}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EBCF7D88-49E2-413D-A7A6-1A76BC2E8161}.Release|Any CPU.ActiveCfg = Release|Any CPU {EBCF7D88-49E2-413D-A7A6-1A76BC2E8161}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EBCF7D88-49E2-413D-A7A6-1A76BC2E8161}.Release|Any CPU.Build.0 = Release|Any CPU {EBCF7D88-49E2-413D-A7A6-1A76BC2E8161}.Release|Any CPU.Build.0 = Release|Any CPU
{4A9043FD-24A3-4A4A-956B-9CB71876F415}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4A9043FD-24A3-4A4A-956B-9CB71876F415}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4A9043FD-24A3-4A4A-956B-9CB71876F415}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4A9043FD-24A3-4A4A-956B-9CB71876F415}.Release|Any CPU.Build.0 = Release|Any CPU
{5BE18D72-0D02-4854-966E-745CE5DAF77F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5BE18D72-0D02-4854-966E-745CE5DAF77F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5BE18D72-0D02-4854-966E-745CE5DAF77F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5BE18D72-0D02-4854-966E-745CE5DAF77F}.Release|Any CPU.Build.0 = Release|Any CPU
{73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Release|Any CPU.Build.0 = Release|Any CPU
{06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Release|Any CPU.Build.0 = Release|Any CPU
{A98C939C-9F48-414A-A2D3-853BE4447397}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A98C939C-9F48-414A-A2D3-853BE4447397}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A98C939C-9F48-414A-A2D3-853BE4447397}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A98C939C-9F48-414A-A2D3-853BE4447397}.Release|Any CPU.Build.0 = Release|Any CPU
{A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Release|Any CPU.Build.0 = Release|Any CPU
{FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Release|Any CPU.Build.0 = Release|Any CPU
{6FFC14FE-F659-4B23-9746-4B767CE520D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6FFC14FE-F659-4B23-9746-4B767CE520D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6FFC14FE-F659-4B23-9746-4B767CE520D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6FFC14FE-F659-4B23-9746-4B767CE520D2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -946,6 +1001,16 @@ Global
{A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F}
{EA563F48-A6EF-4886-B607-2A83F7795F1B} = {90E88EAC-4291-4406-8D88-EFDF61B11292} {EA563F48-A6EF-4886-B607-2A83F7795F1B} = {90E88EAC-4291-4406-8D88-EFDF61B11292}
{EBCF7D88-49E2-413D-A7A6-1A76BC2E8161} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} {EBCF7D88-49E2-413D-A7A6-1A76BC2E8161} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F}
{4A9043FD-24A3-4A4A-956B-9CB71876F415} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E}
{D3BAA44E-8395-4E8A-AA96-6B463356C537} = {C5CAD011-DF84-4914-939C-0C029DCEF26F}
{5BE18D72-0D02-4854-966E-745CE5DAF77F} = {D3BAA44E-8395-4E8A-AA96-6B463356C537}
{73EAD4FE-B44F-44A7-904E-FFA5096D91BD} = {D3BAA44E-8395-4E8A-AA96-6B463356C537}
{06D34108-01BA-4C77-A704-4DD9E6F7E32C} = {D3BAA44E-8395-4E8A-AA96-6B463356C537}
{A98C939C-9F48-414A-A2D3-853BE4447397} = {D3BAA44E-8395-4E8A-AA96-6B463356C537}
{A94BE05F-7DAB-461C-93E7-914CBDF4FA93} = {D3BAA44E-8395-4E8A-AA96-6B463356C537}
{FBE91498-D83B-4873-A67E-0FB9D1C366F0} = {D3BAA44E-8395-4E8A-AA96-6B463356C537}
{A2EA6B3F-AD1A-4FDA-B12E-F71B20A43A6B} = {672E1170-7B18-474B-85C7-1961BF2A48AE}
{6FFC14FE-F659-4B23-9746-4B767CE520D2} = {A2EA6B3F-AD1A-4FDA-B12E-F71B20A43A6B}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C95FDF91-16F2-4A8B-A4BE-0E62D1B66718} SolutionGuid = {C95FDF91-16F2-4A8B-A4BE-0E62D1B66718}

37
aspnet-core/configuration/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/appsettings.Development.json

@ -15,7 +15,8 @@
"AbpIdentityServer": "Server=127.0.0.1;Database=IdentityServer;User Id=root;Password=123456", "AbpIdentityServer": "Server=127.0.0.1;Database=IdentityServer;User Id=root;Password=123456",
"AbpTenantManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456", "AbpTenantManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
"AbpSettingManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456", "AbpSettingManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
"AbpPermissionManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456" "AbpPermissionManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
"AbpLocalizationManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456"
}, },
"Location": { "Location": {
"Baidu": { "Baidu": {
@ -31,40 +32,6 @@
"VisableErrorToClient": true "VisableErrorToClient": true
} }
}, },
"Aliyun": {
"Auth": {
"AccessKeyId": "你自己的阿里云Sms服务Key",
"AccessKeySecret": "你自己的阿里云Sms服务KeySecret"
},
"Sms": {
"RegionId": "cn-hangzhou",
"Domain": "dysmsapi.aliyuncs.com",
"Version": "2017-05-25",
"DefaultSignName": "你自己的阿里云Sms服务签名",
"DefaultTemplateCode": "你自己的阿里云Sms服务模板",
"DeveloperPhoneNumber": "你自己的手机号码,用于开发模式统一接收短信的手机号",
"VisableErrorToClient": true
}
},
"Identity": {
"Password": {
"RequiredLength": 6,
"RequiredUniqueChars": 0,
"RequireNonAlphanumeric": false,
"RequireLowercase": false,
"RequireUppercase": false,
"RequireDigit": false
},
"Lockout": {
"AllowedForNewUsers": false,
"LockoutDuration": 5,
"MaxFailedAccessAttempts": 5
},
"SignIn": {
"RequireConfirmedEmail": false,
"RequireConfirmedPhoneNumber": false
}
},
"CAP": { "CAP": {
"EventBus": { "EventBus": {
"DefaultGroup": "BackendAdmin", "DefaultGroup": "BackendAdmin",

37
aspnet-core/configuration/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/appsettings.Development.json

@ -15,41 +15,8 @@
"AbpTenantManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456", "AbpTenantManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
"AbpSettingManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456", "AbpSettingManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
"AbpFeatureManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456", "AbpFeatureManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
"AbpPermissionManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456" "AbpPermissionManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
}, "AbpLocalizationManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456"
"Identity": {
"Password": {
"RequiredLength": 6,
"RequiredUniqueChars": 0,
"RequireNonAlphanumeric": false,
"RequireLowercase": false,
"RequireUppercase": false,
"RequireDigit": false
},
"Lockout": {
"AllowedForNewUsers": false,
"LockoutDuration": 5,
"MaxFailedAccessAttempts": 5
},
"SignIn": {
"RequireConfirmedEmail": false,
"RequireConfirmedPhoneNumber": false
}
},
"Aliyun": {
"Auth": {
"AccessKeyId": "你自己的阿里云Sms服务Key",
"AccessKeySecret": "你自己的阿里云Sms服务KeySecret"
},
"Sms": {
"RegionId": "cn-hangzhou",
"Domain": "dysmsapi.aliyuncs.com",
"Version": "2017-05-25",
"DefaultSignName": "你自己的阿里云Sms服务签名",
"DefaultTemplateCode": "你自己的阿里云Sms服务模板",
"DeveloperPhoneNumber": "你自己的手机号码,用于开发模式统一接收短信的手机号",
"VisableErrorToClient": true
}
}, },
"CAP": { "CAP": {
"EventBus": { "EventBus": {

91
aspnet-core/configuration/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/appsettings.Development.json

@ -0,0 +1,91 @@
{
"ConnectionStrings": {
"Default": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
"AbpLocalizationManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
"AbpTenantManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
"AbpSettingManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456",
"AbpPermissionManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456"
},
"CAP": {
"EventBus": {
"DefaultGroup": "Platform",
"Version": "v1",
"FailedRetryInterval": 300,
"FailedRetryCount": 10
},
"RabbitMQ": {
"HostName": "Your RabbitMQ server connection address",
"Port": 5672,
"UserName": "Your RabbitMQ server connection user",
"Password": "Your RabbitMQ server connection user password",
"ExchangeName": "The name of your RabbitMQ server switch",
"VirtualHost": "Name of your RabbitMQ server VirtualHost"
}
},
"Redis": {
"Configuration": "127.0.0.1,defaultDatabase=11",
"InstanceName": "LINGYUN.Abp.Application"
},
"AuthServer": {
"Authority": "http://localhost:44385/",
"ApiName": "lingyun-abp-application"
}
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft.EntityFrameworkCore": "Debug",
"System": "Warning",
"Microsoft": "Warning"
}
},
"Enrich": [ "FromLogContext", "WithProcessId", "WithThreadId" ],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs/Debug-.log",
"restrictedToMinimumLevel": "Debug",
"rollingInterval": "Day",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}"
}
},
{
"Name": "File",
"Args": {
"path": "Logs/Info-.log",
"restrictedToMinimumLevel": "Information",
"rollingInterval": "Day",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}"
}
},
{
"Name": "File",
"Args": {
"path": "Logs/Warn-.log",
"restrictedToMinimumLevel": "Warning",
"rollingInterval": "Day",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}"
}
},
{
"Name": "File",
"Args": {
"path": "Logs/Error-.log",
"restrictedToMinimumLevel": "Error",
"rollingInterval": "Day",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}"
}
},
{
"Name": "File",
"Args": {
"path": "Logs/Fatal-.log",
"restrictedToMinimumLevel": "Fatal",
"rollingInterval": "Day",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}"
}
}
]
}
}

3
aspnet-core/configuration/platform/LINGYUN.Platform.HttpApi.Host/appsettings.Development.json

@ -13,7 +13,8 @@
"AppPlatform": "Server=127.0.0.1;Database=Platform;User Id=colin;Password=123456", "AppPlatform": "Server=127.0.0.1;Database=Platform;User Id=colin;Password=123456",
"AbpTenantManagement": "Server=127.0.0.1;Database=Platform;User Id=colin;Password=123456", "AbpTenantManagement": "Server=127.0.0.1;Database=Platform;User Id=colin;Password=123456",
"AbpSettingManagement": "Server=127.0.0.1;Database=Platform;User Id=colin;Password=123456", "AbpSettingManagement": "Server=127.0.0.1;Database=Platform;User Id=colin;Password=123456",
"AbpPermissionManagement": "Server=127.0.0.1;Database=Platform;User Id=colin;Password=123456" "AbpPermissionManagement": "Server=127.0.0.1;Database=Platform;User Id=colin;Password=123456",
"AbpLocalizationManagement": "Server=127.0.0.1;Database=Platform;User Id=root;Password=123456"
}, },
"Features": { "Features": {
"Validation": { "Validation": {

33
aspnet-core/database/ApiGateway-Init-SqlServer.sql

File diff suppressed because one or more lines are too long

164
aspnet-core/database/ApiGateway-Init.sql

@ -11,7 +11,7 @@
Target Server Version : 80020 Target Server Version : 80020
File Encoding : 65001 File Encoding : 65001
Date: 14/03/2021 08:56:20 Date: 29/03/2021 21:22:25
*/ */
SET NAMES utf8mb4; SET NAMES utf8mb4;
@ -54,12 +54,12 @@ CREATE TABLE `appapigatewayaggregate` (
`Priority` int(0) NULL DEFAULT NULL, `Priority` int(0) NULL DEFAULT NULL,
`UpstreamHttpMethod` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `UpstreamHttpMethod` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`Id`) USING BTREE PRIMARY KEY (`Id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewayaggregate -- Records of appapigatewayaggregate
-- ---------------------------- -- ----------------------------
INSERT INTO `appapigatewayaggregate` VALUES (5, '{}', 'db569f15577848568bee9616d6b8b53c', 'TEST-APP', 'abp接口代理服务', 1263083077348196352, 'platform-api-definition,backend-admin-api-definition,messages-api-definition,apigateway-api-definition,identity-server-api-definition,', '/api/abp/api-definition', '', 1, 'AbpApiDefinitionAggregator', NULL, ''); INSERT INTO `appapigatewayaggregate` VALUES (5, '{}', '90044e20fde546bab1bdd45999f8208a', 'TEST-APP', 'abp接口代理服务', 1263083077348196352, 'platform-api-definition,backend-admin-api-definition,messages-api-definition,apigateway-api-definition,identity-server-api-definition,localization-api-definition,', '/api/abp/api-definition', '', 1, 'AbpApiDefinitionAggregator', NULL, '');
INSERT INTO `appapigatewayaggregate` VALUES (6, '{}', '870a2c5df9b34f8c9514aef0250fbb47', 'TEST-APP', 'abp框架配置', 1263102116090970112, 'apigateway-configuration,platform-configuration,backend-admin-configuration,messages-configuration,identity-server-configuration,', '/api/abp/application-configuration', '', 1, 'AbpApiDefinitionAggregator', NULL, ''); INSERT INTO `appapigatewayaggregate` VALUES (6, '{}', '870a2c5df9b34f8c9514aef0250fbb47', 'TEST-APP', 'abp框架配置', 1263102116090970112, 'apigateway-configuration,platform-configuration,backend-admin-configuration,messages-configuration,identity-server-configuration,', '/api/abp/application-configuration', '', 1, 'AbpApiDefinitionAggregator', NULL, '');
INSERT INTO `appapigatewayaggregate` VALUES (8, '{}', 'edc962f7e0844bb09cb0fb731f358b4b', 'TEST-APP', '我的消息订阅', 1322503807309881344, 'assignables-notifilers,my-subscribes,', '/api/my-subscribes/assignables-notifilers', '', 1, 'AbpApiDefinitionAggregator', NULL, ''); INSERT INTO `appapigatewayaggregate` VALUES (8, '{}', 'edc962f7e0844bb09cb0fb731f358b4b', 'TEST-APP', '我的消息订阅', 1322503807309881344, 'assignables-notifilers,my-subscribes,', '/api/my-subscribes/assignables-notifilers', '', 1, 'AbpApiDefinitionAggregator', NULL, '');
INSERT INTO `appapigatewayaggregate` VALUES (9, '{}', 'c65227b8a0e143b2a0b6186ffde3dfc1', 'TEST-APP', '全局设置', 1329708867127799808, 'setting-global,wechat-setting-global,aliyun-setting-global,oss-management-global,', '/api/setting-management/settings/by-global', '', 1, 'AbpApiDefinitionAggregator', NULL, ''); INSERT INTO `appapigatewayaggregate` VALUES (9, '{}', 'c65227b8a0e143b2a0b6186ffde3dfc1', 'TEST-APP', '全局设置', 1329708867127799808, 'setting-global,wechat-setting-global,aliyun-setting-global,oss-management-global,', '/api/setting-management/settings/by-global', '', 1, 'AbpApiDefinitionAggregator', NULL, '');
@ -79,7 +79,7 @@ CREATE TABLE `appapigatewayaggregateconfig` (
PRIMARY KEY (`Id`) USING BTREE, PRIMARY KEY (`Id`) USING BTREE,
INDEX `IX_AppApiGatewayAggregateConfig_AggregateReRouteId`(`AggregateReRouteId`) USING BTREE, INDEX `IX_AppApiGatewayAggregateConfig_AggregateReRouteId`(`AggregateReRouteId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewayAggregateConfig_AppApiGatewayAggregate_Aggregat~` FOREIGN KEY (`AggregateReRouteId`) REFERENCES `appapigatewayaggregate` (`Id`) ON DELETE RESTRICT ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewayAggregateConfig_AppApiGatewayAggregate_Aggregat~` FOREIGN KEY (`AggregateReRouteId`) REFERENCES `appapigatewayaggregate` (`Id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Table structure for appapigatewayauthoptions -- Table structure for appapigatewayauthoptions
@ -93,7 +93,7 @@ CREATE TABLE `appapigatewayauthoptions` (
PRIMARY KEY (`Id`) USING BTREE, PRIMARY KEY (`Id`) USING BTREE,
UNIQUE INDEX `IX_AppApiGatewayAuthOptions_ReRouteId`(`ReRouteId`) USING BTREE, UNIQUE INDEX `IX_AppApiGatewayAuthOptions_ReRouteId`(`ReRouteId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewayAuthOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewayAuthOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 190 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 205 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewayauthoptions -- Records of appapigatewayauthoptions
@ -246,6 +246,20 @@ INSERT INTO `appapigatewayauthoptions` VALUES (187, 1368856927887581184, '', '')
INSERT INTO `appapigatewayauthoptions` VALUES (188, 1368857128383700992, '', ''); INSERT INTO `appapigatewayauthoptions` VALUES (188, 1368857128383700992, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (189, 1369560306297233408, '', ''); INSERT INTO `appapigatewayauthoptions` VALUES (189, 1369560306297233408, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (190, 1369560450472239104, '', ''); INSERT INTO `appapigatewayauthoptions` VALUES (190, 1369560450472239104, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (191, 1371705034307375104, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (192, 1376442078396276736, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (193, 1376442309850554368, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (194, 1376442440536678400, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (195, 1376442557943635968, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (196, 1376442689674141696, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (197, 1376442971032248320, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (198, 1376443123021242368, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (199, 1376443238851141632, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (200, 1376443392249421824, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (201, 1376443586777047040, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (202, 1376467826087682048, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (203, 1376467990894469120, '', '');
INSERT INTO `appapigatewayauthoptions` VALUES (204, 1376468110214029312, '', '');
-- ---------------------------- -- ----------------------------
-- Table structure for appapigatewaybalanceroptions -- Table structure for appapigatewaybalanceroptions
@ -263,7 +277,7 @@ CREATE TABLE `appapigatewaybalanceroptions` (
UNIQUE INDEX `IX_AppApiGatewayBalancerOptions_ReRouteId`(`ReRouteId`) USING BTREE, UNIQUE INDEX `IX_AppApiGatewayBalancerOptions_ReRouteId`(`ReRouteId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewayBalancerOptions_AppApiGatewayGlobalConfiguratio~` FOREIGN KEY (`ItemId`) REFERENCES `appapigatewayglobalconfiguration` (`ItemId`) ON DELETE CASCADE ON UPDATE RESTRICT, CONSTRAINT `FK_AppApiGatewayBalancerOptions_AppApiGatewayGlobalConfiguratio~` FOREIGN KEY (`ItemId`) REFERENCES `appapigatewayglobalconfiguration` (`ItemId`) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT `FK_AppApiGatewayBalancerOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewayBalancerOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 193 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 208 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewaybalanceroptions -- Records of appapigatewaybalanceroptions
@ -417,6 +431,20 @@ INSERT INTO `appapigatewaybalanceroptions` VALUES (190, NULL, 136885692788758118
INSERT INTO `appapigatewaybalanceroptions` VALUES (191, NULL, 1368857128383700992, '', '', 0); INSERT INTO `appapigatewaybalanceroptions` VALUES (191, NULL, 1368857128383700992, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (192, NULL, 1369560306297233408, '', '', 0); INSERT INTO `appapigatewaybalanceroptions` VALUES (192, NULL, 1369560306297233408, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (193, NULL, 1369560450472239104, '', '', 0); INSERT INTO `appapigatewaybalanceroptions` VALUES (193, NULL, 1369560450472239104, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (194, NULL, 1371705034307375104, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (195, NULL, 1376442078396276736, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (196, NULL, 1376442309850554368, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (197, NULL, 1376442440536678400, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (198, NULL, 1376442557943635968, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (199, NULL, 1376442689674141696, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (200, NULL, 1376442971032248320, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (201, NULL, 1376443123021242368, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (202, NULL, 1376443238851141632, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (203, NULL, 1376443392249421824, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (204, NULL, 1376443586777047040, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (205, NULL, 1376467826087682048, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (206, NULL, 1376467990894469120, '', '', 0);
INSERT INTO `appapigatewaybalanceroptions` VALUES (207, NULL, 1376468110214029312, '', '', 0);
-- ---------------------------- -- ----------------------------
-- Table structure for appapigatewaycacheoptions -- Table structure for appapigatewaycacheoptions
@ -430,7 +458,7 @@ CREATE TABLE `appapigatewaycacheoptions` (
PRIMARY KEY (`Id`) USING BTREE, PRIMARY KEY (`Id`) USING BTREE,
UNIQUE INDEX `IX_AppApiGatewayCacheOptions_ReRouteId`(`ReRouteId`) USING BTREE, UNIQUE INDEX `IX_AppApiGatewayCacheOptions_ReRouteId`(`ReRouteId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewayCacheOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewayCacheOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 190 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 205 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewaycacheoptions -- Records of appapigatewaycacheoptions
@ -583,6 +611,20 @@ INSERT INTO `appapigatewaycacheoptions` VALUES (187, 1368856927887581184, NULL,
INSERT INTO `appapigatewaycacheoptions` VALUES (188, 1368857128383700992, 0, ''); INSERT INTO `appapigatewaycacheoptions` VALUES (188, 1368857128383700992, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (189, 1369560306297233408, 0, ''); INSERT INTO `appapigatewaycacheoptions` VALUES (189, 1369560306297233408, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (190, 1369560450472239104, 0, ''); INSERT INTO `appapigatewaycacheoptions` VALUES (190, 1369560450472239104, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (191, 1371705034307375104, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (192, 1376442078396276736, NULL, NULL);
INSERT INTO `appapigatewaycacheoptions` VALUES (193, 1376442309850554368, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (194, 1376442440536678400, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (195, 1376442557943635968, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (196, 1376442689674141696, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (197, 1376442971032248320, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (198, 1376443123021242368, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (199, 1376443238851141632, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (200, 1376443392249421824, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (201, 1376443586777047040, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (202, 1376467826087682048, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (203, 1376467990894469120, 0, '');
INSERT INTO `appapigatewaycacheoptions` VALUES (204, 1376468110214029312, 0, '');
-- ---------------------------- -- ----------------------------
-- Table structure for appapigatewaydiscovery -- Table structure for appapigatewaydiscovery
@ -602,7 +644,7 @@ CREATE TABLE `appapigatewaydiscovery` (
PRIMARY KEY (`Id`) USING BTREE, PRIMARY KEY (`Id`) USING BTREE,
UNIQUE INDEX `IX_AppApiGatewayDiscovery_ItemId`(`ItemId`) USING BTREE, UNIQUE INDEX `IX_AppApiGatewayDiscovery_ItemId`(`ItemId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewayDiscovery_AppApiGatewayGlobalConfiguration_Item~` FOREIGN KEY (`ItemId`) REFERENCES `appapigatewayglobalconfiguration` (`ItemId`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewayDiscovery_AppApiGatewayGlobalConfiguration_Item~` FOREIGN KEY (`ItemId`) REFERENCES `appapigatewayglobalconfiguration` (`ItemId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewaydiscovery -- Records of appapigatewaydiscovery
@ -623,7 +665,7 @@ CREATE TABLE `appapigatewaydynamicreroute` (
`AppId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `AppId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
PRIMARY KEY (`Id`) USING BTREE, PRIMARY KEY (`Id`) USING BTREE,
UNIQUE INDEX `AK_AppApiGatewayDynamicReRoute_DynamicReRouteId`(`DynamicReRouteId`) USING BTREE UNIQUE INDEX `AK_AppApiGatewayDynamicReRoute_DynamicReRouteId`(`DynamicReRouteId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Table structure for appapigatewayglobalconfiguration -- Table structure for appapigatewayglobalconfiguration
@ -643,7 +685,7 @@ CREATE TABLE `appapigatewayglobalconfiguration` (
`AppId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `AppId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
PRIMARY KEY (`Id`) USING BTREE, PRIMARY KEY (`Id`) USING BTREE,
UNIQUE INDEX `AK_AppApiGatewayGlobalConfiguration_ItemId`(`ItemId`) USING BTREE UNIQUE INDEX `AK_AppApiGatewayGlobalConfiguration_ItemId`(`ItemId`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewayglobalconfiguration -- Records of appapigatewayglobalconfiguration
@ -692,7 +734,7 @@ CREATE TABLE `appapigatewayhttpoptions` (
UNIQUE INDEX `IX_AppApiGatewayHttpOptions_ReRouteId`(`ReRouteId`) USING BTREE, UNIQUE INDEX `IX_AppApiGatewayHttpOptions_ReRouteId`(`ReRouteId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewayHttpOptions_AppApiGatewayGlobalConfiguration_It~` FOREIGN KEY (`ItemId`) REFERENCES `appapigatewayglobalconfiguration` (`ItemId`) ON DELETE CASCADE ON UPDATE RESTRICT, CONSTRAINT `FK_AppApiGatewayHttpOptions_AppApiGatewayGlobalConfiguration_It~` FOREIGN KEY (`ItemId`) REFERENCES `appapigatewayglobalconfiguration` (`ItemId`) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT `FK_AppApiGatewayHttpOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewayHttpOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 193 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 208 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewayhttpoptions -- Records of appapigatewayhttpoptions
@ -846,6 +888,20 @@ INSERT INTO `appapigatewayhttpoptions` VALUES (190, NULL, 1368856927887581184, 0
INSERT INTO `appapigatewayhttpoptions` VALUES (191, NULL, 1368857128383700992, 0, 0, 0, 0, 0); INSERT INTO `appapigatewayhttpoptions` VALUES (191, NULL, 1368857128383700992, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (192, NULL, 1369560306297233408, 0, 0, 0, 0, 0); INSERT INTO `appapigatewayhttpoptions` VALUES (192, NULL, 1369560306297233408, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (193, NULL, 1369560450472239104, 0, 0, 0, 0, 0); INSERT INTO `appapigatewayhttpoptions` VALUES (193, NULL, 1369560450472239104, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (194, NULL, 1371705034307375104, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (195, NULL, 1376442078396276736, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (196, NULL, 1376442309850554368, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (197, NULL, 1376442440536678400, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (198, NULL, 1376442557943635968, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (199, NULL, 1376442689674141696, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (200, NULL, 1376442971032248320, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (201, NULL, 1376443123021242368, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (202, NULL, 1376443238851141632, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (203, NULL, 1376443392249421824, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (204, NULL, 1376443586777047040, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (205, NULL, 1376467826087682048, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (206, NULL, 1376467990894469120, 0, 0, 0, 0, 0);
INSERT INTO `appapigatewayhttpoptions` VALUES (207, NULL, 1376468110214029312, 0, 0, 0, 0, 0);
-- ---------------------------- -- ----------------------------
-- Table structure for appapigatewayqosoptions -- Table structure for appapigatewayqosoptions
@ -863,7 +919,7 @@ CREATE TABLE `appapigatewayqosoptions` (
UNIQUE INDEX `IX_AppApiGatewayQoSOptions_ReRouteId`(`ReRouteId`) USING BTREE, UNIQUE INDEX `IX_AppApiGatewayQoSOptions_ReRouteId`(`ReRouteId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewayQoSOptions_AppApiGatewayGlobalConfiguration_Ite~` FOREIGN KEY (`ItemId`) REFERENCES `appapigatewayglobalconfiguration` (`ItemId`) ON DELETE CASCADE ON UPDATE RESTRICT, CONSTRAINT `FK_AppApiGatewayQoSOptions_AppApiGatewayGlobalConfiguration_Ite~` FOREIGN KEY (`ItemId`) REFERENCES `appapigatewayglobalconfiguration` (`ItemId`) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT `FK_AppApiGatewayQoSOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewayQoSOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 193 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 208 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewayqosoptions -- Records of appapigatewayqosoptions
@ -1017,6 +1073,20 @@ INSERT INTO `appapigatewayqosoptions` VALUES (190, NULL, 1368856927887581184, 50
INSERT INTO `appapigatewayqosoptions` VALUES (191, NULL, 1368857128383700992, 50, 60000, 30000); INSERT INTO `appapigatewayqosoptions` VALUES (191, NULL, 1368857128383700992, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (192, NULL, 1369560306297233408, 50, 60000, 30000); INSERT INTO `appapigatewayqosoptions` VALUES (192, NULL, 1369560306297233408, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (193, NULL, 1369560450472239104, 50, 60000, 30000); INSERT INTO `appapigatewayqosoptions` VALUES (193, NULL, 1369560450472239104, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (194, NULL, 1371705034307375104, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (195, NULL, 1376442078396276736, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (196, NULL, 1376442309850554368, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (197, NULL, 1376442440536678400, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (198, NULL, 1376442557943635968, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (199, NULL, 1376442689674141696, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (200, NULL, 1376442971032248320, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (201, NULL, 1376443123021242368, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (202, NULL, 1376443238851141632, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (203, NULL, 1376443392249421824, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (204, NULL, 1376443586777047040, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (205, NULL, 1376467826087682048, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (206, NULL, 1376467990894469120, 50, 60000, 30000);
INSERT INTO `appapigatewayqosoptions` VALUES (207, NULL, 1376468110214029312, 50, 60000, 30000);
-- ---------------------------- -- ----------------------------
-- Table structure for appapigatewayratelimitoptions -- Table structure for appapigatewayratelimitoptions
@ -1033,7 +1103,7 @@ CREATE TABLE `appapigatewayratelimitoptions` (
PRIMARY KEY (`Id`) USING BTREE, PRIMARY KEY (`Id`) USING BTREE,
UNIQUE INDEX `IX_AppApiGatewayRateLimitOptions_ItemId`(`ItemId`) USING BTREE, UNIQUE INDEX `IX_AppApiGatewayRateLimitOptions_ItemId`(`ItemId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewayRateLimitOptions_AppApiGatewayGlobalConfigurati~` FOREIGN KEY (`ItemId`) REFERENCES `appapigatewayglobalconfiguration` (`ItemId`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewayRateLimitOptions_AppApiGatewayGlobalConfigurati~` FOREIGN KEY (`ItemId`) REFERENCES `appapigatewayglobalconfiguration` (`ItemId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewayratelimitoptions -- Records of appapigatewayratelimitoptions
@ -1058,7 +1128,7 @@ CREATE TABLE `appapigatewayratelimitrule` (
UNIQUE INDEX `IX_AppApiGatewayRateLimitRule_ReRouteId`(`ReRouteId`) USING BTREE, UNIQUE INDEX `IX_AppApiGatewayRateLimitRule_ReRouteId`(`ReRouteId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewayRateLimitRule_AppApiGatewayDynamicReRoute_Dynam~` FOREIGN KEY (`DynamicReRouteId`) REFERENCES `appapigatewaydynamicreroute` (`DynamicReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT, CONSTRAINT `FK_AppApiGatewayRateLimitRule_AppApiGatewayDynamicReRoute_Dynam~` FOREIGN KEY (`DynamicReRouteId`) REFERENCES `appapigatewaydynamicreroute` (`DynamicReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT `FK_AppApiGatewayRateLimitRule_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewayRateLimitRule_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 190 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 205 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewayratelimitrule -- Records of appapigatewayratelimitrule
@ -1211,6 +1281,20 @@ INSERT INTO `appapigatewayratelimitrule` VALUES (187, 1368856927887581184, NULL,
INSERT INTO `appapigatewayratelimitrule` VALUES (188, 1368857128383700992, NULL, '', 0, NULL, NULL, NULL); INSERT INTO `appapigatewayratelimitrule` VALUES (188, 1368857128383700992, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (189, 1369560306297233408, NULL, '', 0, NULL, NULL, NULL); INSERT INTO `appapigatewayratelimitrule` VALUES (189, 1369560306297233408, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (190, 1369560450472239104, NULL, '', 0, NULL, NULL, NULL); INSERT INTO `appapigatewayratelimitrule` VALUES (190, 1369560450472239104, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (191, 1371705034307375104, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (192, 1376442078396276736, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (193, 1376442309850554368, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (194, 1376442440536678400, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (195, 1376442557943635968, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (196, 1376442689674141696, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (197, 1376442971032248320, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (198, 1376443123021242368, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (199, 1376443238851141632, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (200, 1376443392249421824, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (201, 1376443586777047040, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (202, 1376467826087682048, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (203, 1376467990894469120, NULL, '', 0, NULL, NULL, NULL);
INSERT INTO `appapigatewayratelimitrule` VALUES (204, 1376468110214029312, NULL, '', 0, NULL, NULL, NULL);
-- ---------------------------- -- ----------------------------
-- Table structure for appapigatewayreroute -- Table structure for appapigatewayreroute
@ -1250,7 +1334,7 @@ CREATE TABLE `appapigatewayreroute` (
PRIMARY KEY (`Id`) USING BTREE, PRIMARY KEY (`Id`) USING BTREE,
UNIQUE INDEX `AK_AppApiGatewayReRoute_ReRouteId`(`ReRouteId`) USING BTREE, UNIQUE INDEX `AK_AppApiGatewayReRoute_ReRouteId`(`ReRouteId`) USING BTREE,
UNIQUE INDEX `IX_AppApiGatewayReRoute_AppId_DownstreamPathTemplate_UpstreamPa~`(`AppId`, `DownstreamPathTemplate`, `UpstreamPathTemplate`) USING BTREE UNIQUE INDEX `IX_AppApiGatewayReRoute_AppId_DownstreamPathTemplate_UpstreamPa~`(`AppId`, `DownstreamPathTemplate`, `UpstreamPathTemplate`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 197 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 212 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewayreroute -- Records of appapigatewayreroute
@ -1403,6 +1487,20 @@ INSERT INTO `appapigatewayreroute` VALUES (194, '{}', '6c1a0f98129d418cba55a52db
INSERT INTO `appapigatewayreroute` VALUES (195, '{}', 'de285bf4b6114032a45d5611ea8e3101', 1368857128383700992, '【Oss对象存储】- 静态文件管理', '/api/files/static/{everything}', '', '', '/api/api/files/static/{everything}', 'POST,GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30025,', '', '', '', 0, 30000, 1, '', 'TEST-APP'); INSERT INTO `appapigatewayreroute` VALUES (195, '{}', 'de285bf4b6114032a45d5611ea8e3101', 1368857128383700992, '【Oss对象存储】- 静态文件管理', '/api/files/static/{everything}', '', '', '/api/api/files/static/{everything}', 'POST,GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30025,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (196, '{}', '6287c30d31c147faae917cb6e52636ec', 1369560306297233408, '【Oss对象存储】- 获取公共配置', '/api/setting-management/oss-management/by-global', '', '', '/api/setting-management/oss-management/by-global', 'GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30025,', '', '', 'oss-management-global', 0, 30000, 1, '', 'TEST-APP'); INSERT INTO `appapigatewayreroute` VALUES (196, '{}', '6287c30d31c147faae917cb6e52636ec', 1369560306297233408, '【Oss对象存储】- 获取公共配置', '/api/setting-management/oss-management/by-global', '', '', '/api/setting-management/oss-management/by-global', 'GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30025,', '', '', 'oss-management-global', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (197, '{}', '1012bb902aba47ada9a374fc73ed2632', 1369560450472239104, '【Oss对象存储】- 获取租户配置', '/api/setting-management/oss-management/by-current-tenant', '', '', '/api/setting-management/oss-management/by-current-tenant', 'GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30025,', '', '', 'oss-management-current-tenant', 0, 30000, 1, '', 'TEST-APP'); INSERT INTO `appapigatewayreroute` VALUES (197, '{}', '1012bb902aba47ada9a374fc73ed2632', 1369560450472239104, '【Oss对象存储】- 获取租户配置', '/api/setting-management/oss-management/by-current-tenant', '', '', '/api/setting-management/oss-management/by-current-tenant', 'GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30025,', '', '', 'oss-management-current-tenant', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (198, '{}', '3ff4788f62744b27bc30f7247fb76b08', 1371705034307375104, '【Oss对象存储】- 静态文件', '/api/files/static/{everything}', '', '', '/api/files/static/{everything}', 'GET,POST,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30025,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (199, '{}', '2203b1db040942a3bbe1ed86b57a8501', 1376442078396276736, '【本地化管理】- 接口代理', '/api/abp/api-definition', '', '', '/api/abp/localization/api-definition', 'GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30030,', '', '', 'localization-api-definition', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (200, '{}', '67206f8a85d94666a0c707697e706742', 1376442309850554368, '【本地化管理】- 资源管理', '/api/localization/resources', '', '', '/api/localization/resources', 'POST,GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30030,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (201, '{}', '055929710e414c5e97fc9168a1c25182', 1376442440536678400, '【本地化管理】- 管理单个资源', '/api/localization/resources/{id}', '', '', '/api/localization/resources/{id}', 'GET,PUT,DELETE,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30030,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (202, '{}', 'c314a94d515045a4a27763aa5d3631de', 1376442557943635968, '【本地化管理】- 获取所有资源', '/api/localization/resources/all', '', '', '/api/localization/resources/all', 'GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30030,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (203, '{}', '67fb0a90132c4a02b7ff44f82bf9fd13', 1376442689674141696, '【本地化管理】- 语言管理', '/api/localization/languages', '', '', '/api/localization/languages', 'GET,POST,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30030,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (204, '{}', 'c6fab01d2b37434886f07bb601c36599', 1376442971032248320, '【本地化管理】- 管理单个语言', '/api/localization/languages/{id}', '', '', '/api/localization/languages/{id}', 'GET,PUT,DELETE,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30030,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (205, '{}', '074c20491b294a068fbb1df7874d0d4d', 1376443123021242368, '【本地化管理】- 获取所有语言', '/api/localization/languages/all', '', '', '/api/localization/languages/all', 'GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30030,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (206, '{}', '75e48367d8f14ef99541abdb86d30b96', 1376443238851141632, '【本地化管理】- 文档管理', '/api/localization/texts', '', '', '/api/localization/texts', 'GET,POST,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30030,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (207, '{}', '5f8d7d88a97f4ff7b3bdb6fb105d527e', 1376443392249421824, '【本地化管理】- 管理单个文档', '/api/localization/texts/{id}', '', '', '/api/localization/texts/{id}', 'GET,PUT,DELETE,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30030,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (208, '{}', '35f470892bf04571ab49efadb2cb1eb5', 1376443586777047040, '【本地化管理】- 通过文化名称查询文档', '/api/localization/texts/by-culture-key', '', '', '/api/localization/texts/by-culture-key', 'GET,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30030,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (209, '{}', '72073c75c2fa4e1db162c7a74004558f', 1376467826087682048, '【身份认证服务】- 发送登录验证码', '/api/account/phone/send-signin-code', '', '', '/api/account/phone/send-signin-code', 'POST,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30015,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (210, '{}', 'e8e2f943dd56456f8f5dd957dd30e8b9', 1376467990894469120, '【身份认证服务】- 发送重置密码短信', '/api/account/phone/send-password-reset-code', '', '', '/api/account/phone/send-password-reset-code', 'POST,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30015,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
INSERT INTO `appapigatewayreroute` VALUES (211, '{}', '89fd6b8a830d457f9d1d43263c7074b4', 1376468110214029312, '【身份认证服务】- 发送注册短信', '/api/account/phone/send-register-code', '', '', '/api/account/phone/send-register-code', 'POST,', '', '', '', '', '', '', '', 1, '', '', 'HTTP', '127.0.0.1:30015,', '', '', '', 0, 30000, 1, '', 'TEST-APP');
-- ---------------------------- -- ----------------------------
-- Table structure for appapigatewayroutegroup -- Table structure for appapigatewayroutegroup
@ -1446,7 +1544,7 @@ CREATE TABLE `appapigatewaysecurityoptions` (
PRIMARY KEY (`Id`) USING BTREE, PRIMARY KEY (`Id`) USING BTREE,
UNIQUE INDEX `IX_AppApiGatewaySecurityOptions_ReRouteId`(`ReRouteId`) USING BTREE, UNIQUE INDEX `IX_AppApiGatewaySecurityOptions_ReRouteId`(`ReRouteId`) USING BTREE,
CONSTRAINT `FK_AppApiGatewaySecurityOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT CONSTRAINT `FK_AppApiGatewaySecurityOptions_AppApiGatewayReRoute_ReRouteId` FOREIGN KEY (`ReRouteId`) REFERENCES `appapigatewayreroute` (`ReRouteId`) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 190 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB AUTO_INCREMENT = 205 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
-- ---------------------------- -- ----------------------------
-- Records of appapigatewaysecurityoptions -- Records of appapigatewaysecurityoptions
@ -1599,6 +1697,20 @@ INSERT INTO `appapigatewaysecurityoptions` VALUES (187, 1368856927887581184, '',
INSERT INTO `appapigatewaysecurityoptions` VALUES (188, 1368857128383700992, '', ''); INSERT INTO `appapigatewaysecurityoptions` VALUES (188, 1368857128383700992, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (189, 1369560306297233408, '', ''); INSERT INTO `appapigatewaysecurityoptions` VALUES (189, 1369560306297233408, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (190, 1369560450472239104, '', ''); INSERT INTO `appapigatewaysecurityoptions` VALUES (190, 1369560450472239104, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (191, 1371705034307375104, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (192, 1376442078396276736, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (193, 1376442309850554368, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (194, 1376442440536678400, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (195, 1376442557943635968, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (196, 1376442689674141696, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (197, 1376442971032248320, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (198, 1376443123021242368, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (199, 1376443238851141632, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (200, 1376443392249421824, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (201, 1376443586777047040, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (202, 1376467826087682048, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (203, 1376467990894469120, '', '');
INSERT INTO `appapigatewaysecurityoptions` VALUES (204, 1376468110214029312, '', '');
-- ---------------------------- -- ----------------------------
-- Table structure for cap.published -- Table structure for cap.published
@ -1617,6 +1729,26 @@ CREATE TABLE `cap.published` (
INDEX `IX_ExpiresAt`(`ExpiresAt`) USING BTREE INDEX `IX_ExpiresAt`(`ExpiresAt`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of cap.published
-- ----------------------------
INSERT INTO `cap.published` VALUES (1376442080048832512, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-abp-user-id\":\"bf289dbb-838e-a89b-c622-39f51dcc4f43\",\"cap-abp-client-id\":\"vue-admin-element\",\"cap-abp-tenant-id\":\"\",\"cap-msg-id\":\"1376442080048832512\",\"cap-corr-id\":\"1376442080048832512\",\"cap-corr-seq\":\"0\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2021/3/29 下午3:52:19 +08:00\"},\"Value\":{\"DateTime\":\"2021-03-29T15:52:19.593051+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2021-03-29 15:52:20', '2021-03-30 15:52:20', 'Succeeded');
INSERT INTO `cap.published` VALUES (1376442309972189184, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-abp-user-id\":\"bf289dbb-838e-a89b-c622-39f51dcc4f43\",\"cap-abp-client-id\":\"vue-admin-element\",\"cap-abp-tenant-id\":\"\",\"cap-msg-id\":\"1376442309972189184\",\"cap-corr-id\":\"1376442309972189184\",\"cap-corr-seq\":\"0\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2021/3/29 下午3:53:14 +08:00\"},\"Value\":{\"DateTime\":\"2021-03-29T15:53:14.4154232+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2021-03-29 15:53:14', '2021-03-30 15:53:14', 'Succeeded');
INSERT INTO `cap.published` VALUES (1376442440738004992, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-abp-user-id\":\"bf289dbb-838e-a89b-c622-39f51dcc4f43\",\"cap-abp-client-id\":\"vue-admin-element\",\"cap-abp-tenant-id\":\"\",\"cap-msg-id\":\"1376442440738004992\",\"cap-corr-id\":\"1376442440738004992\",\"cap-corr-seq\":\"0\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2021/3/29 下午3:53:45 +08:00\"},\"Value\":{\"DateTime\":\"2021-03-29T15:53:45.5924626+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2021-03-29 15:53:46', '2021-03-30 15:53:46', 'Succeeded');
INSERT INTO `cap.published` VALUES (1376442558023327744, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-abp-user-id\":\"bf289dbb-838e-a89b-c622-39f51dcc4f43\",\"cap-abp-client-id\":\"vue-admin-element\",\"cap-abp-tenant-id\":\"\",\"cap-msg-id\":\"1376442558023327744\",\"cap-corr-id\":\"1376442558023327744\",\"cap-corr-seq\":\"0\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2021/3/29 下午3:54:13 +08:00\"},\"Value\":{\"DateTime\":\"2021-03-29T15:54:13.5549538+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2021-03-29 15:54:14', '2021-03-30 15:54:14', 'Succeeded');
INSERT INTO `cap.published` VALUES (1376442689783193600, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-abp-user-id\":\"bf289dbb-838e-a89b-c622-39f51dcc4f43\",\"cap-abp-client-id\":\"vue-admin-element\",\"cap-abp-tenant-id\":\"\",\"cap-msg-id\":\"1376442689783193600\",\"cap-corr-id\":\"1376442689783193600\",\"cap-corr-seq\":\"0\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2021/3/29 下午3:54:44 +08:00\"},\"Value\":{\"DateTime\":\"2021-03-29T15:54:44.9636224+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2021-03-29 15:54:45', '2021-03-30 15:54:45', 'Succeeded');
INSERT INTO `cap.published` VALUES (1376442971116134400, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-abp-user-id\":\"bf289dbb-838e-a89b-c622-39f51dcc4f43\",\"cap-abp-client-id\":\"vue-admin-element\",\"cap-abp-tenant-id\":\"\",\"cap-msg-id\":\"1376442971116134400\",\"cap-corr-id\":\"1376442971116134400\",\"cap-corr-seq\":\"0\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2021/3/29 下午3:55:52 +08:00\"},\"Value\":{\"DateTime\":\"2021-03-29T15:55:52.0442879+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2021-03-29 15:55:52', '2021-03-30 15:55:52', 'Succeeded');
INSERT INTO `cap.published` VALUES (1376443123109322752, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-abp-user-id\":\"bf289dbb-838e-a89b-c622-39f51dcc4f43\",\"cap-abp-client-id\":\"vue-admin-element\",\"cap-abp-tenant-id\":\"\",\"cap-msg-id\":\"1376443123109322752\",\"cap-corr-id\":\"1376443123109322752\",\"cap-corr-seq\":\"0\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2021/3/29 下午3:56:28 +08:00\"},\"Value\":{\"DateTime\":\"2021-03-29T15:56:28.2817305+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2021-03-29 15:56:28', '2021-03-30 15:56:28', 'Succeeded');
INSERT INTO `cap.published` VALUES (1376443238922444800, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-abp-user-id\":\"bf289dbb-838e-a89b-c622-39f51dcc4f43\",\"cap-abp-client-id\":\"vue-admin-element\",\"cap-abp-tenant-id\":\"\",\"cap-msg-id\":\"1376443238922444800\",\"cap-corr-id\":\"1376443238922444800\",\"cap-corr-seq\":\"0\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2021/3/29 下午3:56:55 +08:00\"},\"Value\":{\"DateTime\":\"2021-03-29T15:56:55.8946549+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2021-03-29 15:56:56', '2021-03-30 15:56:56', 'Succeeded');
INSERT INTO `cap.published` VALUES (1376443392333307904, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-abp-user-id\":\"bf289dbb-838e-a89b-c622-39f51dcc4f43\",\"cap-abp-client-id\":\"vue-admin-element\",\"cap-abp-tenant-id\":\"\",\"cap-msg-id\":\"1376443392333307904\",\"cap-corr-id\":\"1376443392333307904\",\"cap-corr-seq\":\"0\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2021/3/29 下午3:57:32 +08:00\"},\"Value\":{\"DateTime\":\"2021-03-29T15:57:32.4706372+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2021-03-29 15:57:32', '2021-03-30 15:57:32', 'Succeeded');
INSERT INTO `cap.published` VALUES (1376443586886098944, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-abp-user-id\":\"bf289dbb-838e-a89b-c622-39f51dcc4f43\",\"cap-abp-client-id\":\"vue-admin-element\",\"cap-abp-tenant-id\":\"\",\"cap-msg-id\":\"1376443586886098944\",\"cap-corr-id\":\"1376443586886098944\",\"cap-corr-seq\":\"0\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2021/3/29 下午3:58:18 +08:00\"},\"Value\":{\"DateTime\":\"2021-03-29T15:58:18.8481239+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2021-03-29 15:58:19', '2021-03-30 15:58:19', 'Succeeded');
INSERT INTO `cap.published` VALUES (1376467826179956736, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-abp-user-id\":\"bf289dbb-838e-a89b-c622-39f51dcc4f43\",\"cap-abp-client-id\":\"vue-admin-element\",\"cap-abp-tenant-id\":\"\",\"cap-msg-id\":\"1376467826179956736\",\"cap-corr-id\":\"1376467826179956736\",\"cap-corr-seq\":\"0\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2021/3/29 下午5:34:37 +08:00\"},\"Value\":{\"DateTime\":\"2021-03-29T17:34:37.9529723+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2021-03-29 17:34:38', '2021-03-30 17:34:38', 'Succeeded');
INSERT INTO `cap.published` VALUES (1376467990969966592, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-abp-user-id\":\"bf289dbb-838e-a89b-c622-39f51dcc4f43\",\"cap-abp-client-id\":\"vue-admin-element\",\"cap-abp-tenant-id\":\"\",\"cap-msg-id\":\"1376467990969966592\",\"cap-corr-id\":\"1376467990969966592\",\"cap-corr-seq\":\"0\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2021/3/29 下午5:35:17 +08:00\"},\"Value\":{\"DateTime\":\"2021-03-29T17:35:17.2420976+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2021-03-29 17:35:17', '2021-03-30 17:35:17', 'Succeeded');
INSERT INTO `cap.published` VALUES (1376468110281138176, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-abp-user-id\":\"bf289dbb-838e-a89b-c622-39f51dcc4f43\",\"cap-abp-client-id\":\"vue-admin-element\",\"cap-abp-tenant-id\":\"\",\"cap-msg-id\":\"1376468110281138176\",\"cap-corr-id\":\"1376468110281138176\",\"cap-corr-seq\":\"0\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2021/3/29 下午5:35:45 +08:00\"},\"Value\":{\"DateTime\":\"2021-03-29T17:35:45.6880229+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Create\",\"Object\":\"ReRoute\"}}', 0, '2021-03-29 17:35:46', '2021-03-30 17:35:46', 'Succeeded');
INSERT INTO `cap.published` VALUES (1376516577204494336, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-abp-user-id\":\"bf289dbb-838e-a89b-c622-39f51dcc4f43\",\"cap-abp-client-id\":\"vue-admin-element\",\"cap-abp-tenant-id\":\"\",\"cap-msg-id\":\"1376516577204494336\",\"cap-corr-id\":\"1376516577204494336\",\"cap-corr-seq\":\"0\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2021/3/29 下午8:48:21 +08:00\"},\"Value\":{\"DateTime\":\"2021-03-29T20:48:21.103384+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Modify\",\"Object\":\"ReRoute\"}}', 0, '2021-03-29 20:48:21', '2021-03-30 20:48:21', 'Succeeded');
INSERT INTO `cap.published` VALUES (1376516622045798400, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-abp-user-id\":\"bf289dbb-838e-a89b-c622-39f51dcc4f43\",\"cap-abp-client-id\":\"vue-admin-element\",\"cap-abp-tenant-id\":\"\",\"cap-msg-id\":\"1376516622045798400\",\"cap-corr-id\":\"1376516622045798400\",\"cap-corr-seq\":\"0\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2021/3/29 下午8:48:31 +08:00\"},\"Value\":{\"DateTime\":\"2021-03-29T20:48:31.7941785+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Update\",\"Object\":\"AggregateRoute\"}}', 0, '2021-03-29 20:48:32', '2021-03-30 20:48:32', 'Succeeded');
INSERT INTO `cap.published` VALUES (1376516635597594624, 'v1', 'LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData', '{\"Headers\":{\"cap-abp-user-id\":\"bf289dbb-838e-a89b-c622-39f51dcc4f43\",\"cap-abp-client-id\":\"vue-admin-element\",\"cap-abp-tenant-id\":\"\",\"cap-msg-id\":\"1376516635597594624\",\"cap-corr-id\":\"1376516635597594624\",\"cap-corr-seq\":\"0\",\"cap-msg-name\":\"LINGYUN.ApiGateway.EventBus.ApigatewayConfigChangeEventData\",\"cap-msg-type\":\"Object\",\"cap-senttime\":\"2021/3/29 下午8:48:35 +08:00\"},\"Value\":{\"DateTime\":\"2021-03-29T20:48:35.0253124+08:00\",\"AppId\":\"TEST-APP\",\"Method\":\"Update\",\"Object\":\"AggregateRoute\"}}', 0, '2021-03-29 20:48:35', '2021-03-30 20:48:35', 'Succeeded');
-- ---------------------------- -- ----------------------------
-- Table structure for cap.received -- Table structure for cap.received
-- ---------------------------- -- ----------------------------

15
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN.Abp.Localization.Dynamic.csproj

@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.EventBus" Version="4.2.1" />
<PackageReference Include="Volo.Abp.Localization" Version="4.2.1" />
</ItemGroup>
</Project>

13
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/AbpLocalizationDynamicModule.cs

@ -0,0 +1,13 @@
using Volo.Abp.EventBus;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.Localization.Dynamic
{
[DependsOn(
typeof(AbpEventBusModule),
typeof(AbpLocalizationModule))]
public class AbpLocalizationDynamicModule : AbpModule
{
}
}

30
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DefaultLocalizationStore.cs

@ -0,0 +1,30 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization;
namespace LINGYUN.Abp.Localization.Dynamic
{
public class DefaultLocalizationStore : ILocalizationStore, ITransientDependency
{
public DefaultLocalizationStore()
{
}
public Task<List<LanguageInfo>> GetLanguageListAsync(CancellationToken cancellationToken = default)
{
return Task.FromResult(new List<LanguageInfo>());
}
public Task<Dictionary<string, ILocalizationDictionary>> GetLocalizationDictionaryAsync(string resourceName, CancellationToken cancellationToken = default)
{
return Task.FromResult(new Dictionary<string, ILocalizationDictionary>());
}
public Task<bool> ResourceExistsAsync(string resourceName, CancellationToken cancellationToken = default)
{
return Task.FromResult(false);
}
}
}

42
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DynamicLanguageProvider.cs

@ -0,0 +1,42 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization;
namespace LINGYUN.Abp.Localization.Dynamic
{
[Dependency(ServiceLifetime.Transient, ReplaceServices = true)]
[ExposeServices(
typeof(ILanguageProvider),
typeof(DynamicLanguageProvider))]
public class DynamicLanguageProvider : ILanguageProvider
{
protected ILocalizationStore Store { get; }
protected AbpLocalizationOptions Options { get; }
public DynamicLanguageProvider(
ILocalizationStore store,
IOptions<AbpLocalizationOptions> options)
{
Store = store;
Options = options.Value;
}
public virtual async Task<IReadOnlyList<LanguageInfo>> GetLanguagesAsync()
{
var languages = await Store.GetLanguageListAsync();
if (!languages.Any())
{
return Options.Languages;
}
return languages
.Distinct(new LanguageInfoComparer())
.ToList();
}
}
}

120
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DynamicLocalizationResourceContributor.cs

@ -0,0 +1,120 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using Nito.AsyncEx;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Localization;
using Volo.Abp.Threading;
namespace LINGYUN.Abp.Localization.Dynamic
{
public class DynamicLocalizationResourceContributor : ILocalizationResourceContributor
{
private ILogger _logger;
private ILocalizationSubscriber _subscriber;
private ILocalizationStore _store;
protected ILocalizationStore Store => _store;
private Dictionary<string, ILocalizationDictionary> _dictionaries;
private readonly string _resourceName;
private readonly AsyncLock _asyncLock = new AsyncLock();
public DynamicLocalizationResourceContributor(string resourceName)
{
_resourceName = resourceName;
}
public virtual void Initialize(LocalizationResourceInitializationContext context)
{
_logger = context.ServiceProvider.GetService<ILogger<DynamicLocalizationResourceContributor>>();
_store = context.ServiceProvider.GetRequiredService<ILocalizationStore>();
_subscriber = context.ServiceProvider.GetRequiredService<ILocalizationSubscriber>();
_subscriber.Subscribe(OnChanged);
}
public virtual void Fill(string cultureName, Dictionary<string, LocalizedString> dictionary)
{
GetDictionaries().GetOrDefault(cultureName)?.Fill(dictionary);
}
public virtual LocalizedString GetOrNull(string cultureName, string name)
{
return GetDictionaries().GetOrDefault(cultureName)?.GetOrNull(name);
}
protected virtual Dictionary<string, ILocalizationDictionary> GetDictionaries()
{
var dictionaries = _dictionaries;
if (dictionaries != null)
{
return dictionaries;
}
try
{
using (_asyncLock.Lock())
{
dictionaries = _dictionaries = AsyncHelper.RunSync(async () =>
await Store.GetLocalizationDictionaryAsync(_resourceName));
}
}
catch(Exception ex)
{
// 错误不应该影响到应用程序,而是记录到日志
_logger?.LogWarning("Failed to get localized text, error: ", ex.Message);
}
return dictionaries;
}
private Task OnChanged(LocalizedStringCacheResetEventData data)
{
if (string.Equals(_resourceName, data.ResourceName))
{
if (!_dictionaries.ContainsKey(data.CultureName))
{
// TODO: 需要处理 data.Key data.Value 空引用
var dictionary = new Dictionary<string, LocalizedString>();
dictionary.Add(data.Key, new LocalizedString(data.Key, data.Value.NormalizeLineEndings()));
var newLocalizationDictionary = new StaticLocalizationDictionary(data.CultureName, dictionary);
_dictionaries.Add(data.CultureName, newLocalizationDictionary);
}
else
{
// 取出当前的缓存写入到新字典进行处理
var nowLocalizationDictionary = _dictionaries[data.CultureName];
var dictionary = new Dictionary<string, LocalizedString>();
nowLocalizationDictionary.Fill(dictionary);
var existsKey = dictionary.ContainsKey(data.Key);
if (!existsKey)
{
// 如果不存在,则新增
dictionary.Add(data.Key, new LocalizedString(data.Key, data.Value.NormalizeLineEndings()));
}
else if (existsKey && data.IsDeleted)
{
// 如果删掉了本地化的节点,删掉当前的缓存
dictionary.Remove(data.Key);
}
var newLocalizationDictionary = new StaticLocalizationDictionary(data.CultureName, dictionary);
if (newLocalizationDictionary != null)
{
// 重新赋值变更过的缓存
_dictionaries[data.CultureName] = newLocalizationDictionary;
}
}
}
return Task.CompletedTask;
}
}
}

14
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/ILocalizationDispatcher.cs

@ -0,0 +1,14 @@
using System.Threading.Tasks;
namespace LINGYUN.Abp.Localization.Dynamic
{
internal interface ILocalizationDispatcher
{
/// <summary>
/// 发布变更事件
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
Task DispatchAsync(LocalizedStringCacheResetEventData data);
}
}

36
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/ILocalizationStore.cs

@ -0,0 +1,36 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Localization;
namespace LINGYUN.Abp.Localization.Dynamic
{
public interface ILocalizationStore
{
/// <summary>
/// 获取语言列表
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<List<LanguageInfo>> GetLanguageListAsync(
CancellationToken cancellationToken = default);
/// <summary>
/// 资源是否存在
/// </summary>
/// <param name="resourceName">资源名称</param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<bool> ResourceExistsAsync(
string resourceName,
CancellationToken cancellationToken = default);
/// <summary>
/// 获取当前资源下的本地化字典
/// </summary>
/// <param name="resourceName">资源名称</param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<Dictionary<string, ILocalizationDictionary>> GetLocalizationDictionaryAsync(
string resourceName,
CancellationToken cancellationToken = default);
}
}

17
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/ILocalizationSubscriber.cs

@ -0,0 +1,17 @@
using System;
using System.Threading.Tasks;
namespace LINGYUN.Abp.Localization.Dynamic
{
/// <summary>
/// 本地化资源订阅
/// </summary>
internal interface ILocalizationSubscriber
{
/// <summary>
/// 订阅变更事件
/// </summary>
/// <param name="func"></param>
void Subscribe(Func<LocalizedStringCacheResetEventData, Task> func);
}
}

23
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/LanguageInfoComparer.cs

@ -0,0 +1,23 @@
using System.Collections.Generic;
using Volo.Abp.Localization;
namespace LINGYUN.Abp.Localization.Dynamic
{
public class LanguageInfoComparer : IEqualityComparer<LanguageInfo>
{
public bool Equals(LanguageInfo x, LanguageInfo y)
{
if (x == null || y == null)
{
return false;
}
return x.CultureName.Equals(y.CultureName);
}
public int GetHashCode(LanguageInfo obj)
{
return obj?.CultureName.GetHashCode() ?? GetHashCode();
}
}
}

51
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/LocalizationCacheItem.cs

@ -0,0 +1,51 @@
using System.Collections.Generic;
namespace LINGYUN.Abp.Localization.Dynamic
{
public class LocalizationCacheItem
{
public string Resource { get; set; }
public string Culture { get; set; }
public List<LocalizationText> Texts { get; set; }
public LocalizationCacheItem()
{
Texts = new List<LocalizationText>();
}
public LocalizationCacheItem(
string resource,
string culture,
List<LocalizationText> texts)
{
Resource = resource;
Culture = culture;
Texts = texts;
}
public static string NormalizeKey(
string resource,
string culture)
{
return $"p:Localization,r:{resource},c:{culture}";
}
}
public class LocalizationText
{
public string Key { get; set; }
public string Value { get; set; }
public LocalizationText()
{
}
public LocalizationText(
string key,
string value)
{
Key = key;
Value = value;
}
}
}

23
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/LocalizationResetSynchronizer.cs

@ -0,0 +1,23 @@
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus.Distributed;
namespace LINGYUN.Abp.Localization.Dynamic
{
internal class LocalizationResetSynchronizer :
IDistributedEventHandler<LocalizedStringCacheResetEventData>,
ITransientDependency
{
private readonly ILocalizationDispatcher _dispatcher;
public LocalizationResetSynchronizer(
ILocalizationDispatcher dispatcher)
{
_dispatcher = dispatcher;
}
public async Task HandleEventAsync(LocalizedStringCacheResetEventData eventData)
{
await _dispatcher.DispatchAsync(eventData);
}
}
}

33
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/LocalizationSubscriber.cs

@ -0,0 +1,33 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.Localization.Dynamic
{
[ExposeServices(
typeof(ILocalizationSubscriber),
typeof(ILocalizationDispatcher),
typeof(LocalizationSubscriber))]
internal class LocalizationSubscriber : ILocalizationSubscriber, ILocalizationDispatcher, ISingletonDependency
{
private Func<LocalizedStringCacheResetEventData, Task> _handler;
public LocalizationSubscriber()
{
_handler = (d) =>
{
return Task.CompletedTask;
};
}
public void Subscribe(Func<LocalizedStringCacheResetEventData, Task> func)
{
_handler += func;
}
public virtual async Task DispatchAsync(LocalizedStringCacheResetEventData data)
{
await _handler(data);
}
}
}

29
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/LocalizedStringCacheResetEventData.cs

@ -0,0 +1,29 @@
namespace LINGYUN.Abp.Localization.Dynamic
{
public class LocalizedStringCacheResetEventData
{
public bool IsDeleted { get; set; }
public string ResourceName { get; set; }
public string CultureName { get; set; }
public string Key { get; set; }
public string Value { get; set; }
public LocalizedStringCacheResetEventData()
{
}
public LocalizedStringCacheResetEventData(
string resourceName,
string cultureName,
string key,
string value)
{
ResourceName = resourceName;
CultureName = cultureName;
Key = key;
Value = value;
IsDeleted = false;
}
}
}

37
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/README.md

@ -0,0 +1,37 @@
# LINGYUN.Abp.Localization.Dynamic
动态本地化提供者组件,添加动态提供者可实现运行时替换本地化文本
需要实现 ILocalizationStore 接口
LocalizationManagement项目提供支持
由于框架设计为延迟初始化,当某个本地化资源被使用的时候才会进行初始化
当资源被第一次使用到的时候,才会注册动态变更事件
详情见: [DynamicLocalizationResourceContributor](./LINGYUN/Abp/Localization/Dynamic/DynamicLocalizationResourceContributor.cs#L29-L34)
## 配置使用
```csharp
[DependsOn(typeof(AbpLocalizationDynamicModule))]
public class YouProjectModule : AbpModule
{
// other
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Get<YouProjectResource>()
.AddDynamic(); // 添加动态本地化文档支持
// 添加所有资源的动态文档支持,将监听所有的资源包文档变更事件
// options.Resources.AddDynamic();
// 添加所有资源的动态文档支持,忽略 IdentityResource 资源
// options.Resources.AddDynamic(typeof(IdentityResource));
});
}
}
```

42
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/Volo/Abp/Localization/LocalizationResourceDictionaryExtensions.cs

@ -0,0 +1,42 @@
using LINGYUN.Abp.Localization.Dynamic;
using System;
using System.Linq;
namespace Volo.Abp.Localization
{
public static class LocalizationResourceDictionaryExtensions
{
public static LocalizationResourceDictionary AddDynamic(
this LocalizationResourceDictionary resources,
params Type[] ignoreResourceTypes)
{
foreach (var resource in resources)
{
if (ShouldIgnoreType(resource.Key, ignoreResourceTypes))
{
continue;
}
if (ShouldIgnoreType(resource.Value))
{
continue;
}
resource.Value.AddDynamic();
}
return resources;
}
private static bool ShouldIgnoreType(Type resourceType, params Type[] ignoreResourceTypes)
{
if (ignoreResourceTypes == null)
{
return false;
}
return ignoreResourceTypes.Any(x => x == resourceType);
}
private static bool ShouldIgnoreType(LocalizationResource resource)
{
return resource.Contributors.Exists(x => x is DynamicLocalizationResourceContributor);
}
}
}

20
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/Volo/Abp/Localization/LocalizationResourceExtensions.cs

@ -0,0 +1,20 @@
using JetBrains.Annotations;
using LINGYUN.Abp.Localization.Dynamic;
namespace Volo.Abp.Localization
{
public static class DynamicLocalizationResourceExtensions
{
public static LocalizationResource AddDynamic(
[NotNull] this LocalizationResource localizationResource)
{
Check.NotNull(localizationResource, nameof(localizationResource));
localizationResource.Contributors.Add(
new DynamicLocalizationResourceContributor(
localizationResource.ResourceName));
return localizationResource;
}
}
}

16
aspnet-core/modules/localization/LINGYUN.Abp.Localization.Json/README.md

@ -2,7 +2,7 @@
## 模块说明 ## 模块说明
本地化组件的Json本地文件系统集成,Abp内置组件仅集成了基于IVirtualFileProvider的实现 本地化组件的Json本地文件系统集成
此组件基于PhysicalFileProvider 此组件基于PhysicalFileProvider
@ -36,6 +36,20 @@
// 详情见: https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.fileproviders.physicalfileprovider?view=dotnet-plat-ext-5.0 // 详情见: https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.fileproviders.physicalfileprovider?view=dotnet-plat-ext-5.0
.AddPhysicalJson(Path.Combine(Directory.GetCurrentDirectory(), "Resources")); .AddPhysicalJson(Path.Combine(Directory.GetCurrentDirectory(), "Resources"));
}); });
// 等同于如下方法
Configure<AbpVirtualFileSystemOptions>(options =>
{
// 将本地文件系统映射为虚拟文件系统
options.FileSets.AddPhysical(Path.Combine(Directory.GetCurrentDirectory(), "Resources"));
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<YouResource>("en")
.AddVirtualJson("/Resources"); // json本地化虚拟文件路径
});
} }
} }

19
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN.Abp.LocalizationManagement.Application.Contracts.csproj

@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Authorization" Version="4.2.1" />
<PackageReference Include="Volo.Abp.Ddd.Application.Contracts" Version="4.2.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\LINGYUN.Abp.LocalizationManagement.Domain.Shared\LINGYUN.Abp.LocalizationManagement.Domain.Shared.csproj" />
</ItemGroup>
</Project>

13
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/AbpLocalizationManagementApplicationContractsModule.cs

@ -0,0 +1,13 @@
using Volo.Abp.Authorization;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.LocalizationManagement
{
[DependsOn(
typeof(AbpAuthorizationModule),
typeof(AbpLocalizationManagementDomainSharedModule))]
public class AbpLocalizationManagementApplicationContractsModule : AbpModule
{
}
}

25
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/CreateOrUpdateLanguageInput.cs

@ -0,0 +1,25 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.LocalizationManagement
{
public class CreateOrUpdateLanguageInput
{
public virtual bool Enable { get; set; }
[Required]
[DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxCultureNameLength))]
public string CultureName { get; set; }
[Required]
[DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxUiCultureNameLength))]
public string UiCultureName { get; set; }
[Required]
[DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxDisplayNameLength))]
public string DisplayName { get; set; }
[DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxFlagIconLength))]
public string FlagIcon { get; set; }
}
}

20
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/CreateOrUpdateResourceInput.cs

@ -0,0 +1,20 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.LocalizationManagement
{
public class CreateOrUpdateResourceInput
{
public bool Enable { get; set; }
[Required]
[DynamicStringLength(typeof(ResourceConsts), nameof(ResourceConsts.MaxNameLength))]
public string Name { get; set; }
[DynamicStringLength(typeof(ResourceConsts), nameof(ResourceConsts.MaxDisplayNameLength))]
public string DisplayName { get; set; }
[DynamicStringLength(typeof(ResourceConsts), nameof(ResourceConsts.MaxDescriptionLength))]
public string Description { get; set; }
}
}

10
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/CreateOrUpdateTextInput.cs

@ -0,0 +1,10 @@
using Volo.Abp.Validation;
namespace LINGYUN.Abp.LocalizationManagement
{
public class CreateOrUpdateTextInput
{
[DynamicStringLength(typeof(TextConsts), nameof(TextConsts.MaxValueLength))]
public string Value { get; set; }
}
}

20
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/CreateTextInput.cs

@ -0,0 +1,20 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.LocalizationManagement
{
public class CreateTextInput : CreateOrUpdateTextInput
{
[Required]
[DynamicStringLength(typeof(ResourceConsts), nameof(ResourceConsts.MaxNameLength))]
public string ResourceName { get; set; }
[Required]
[DynamicStringLength(typeof(TextConsts), nameof(TextConsts.MaxKeyLength))]
public string Key { get; set; }
[Required]
[DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxCultureNameLength))]
public string CultureName { get; set; }
}
}

9
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/GetLanguagesInput.cs

@ -0,0 +1,9 @@
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.LocalizationManagement
{
public class GetLanguagesInput : PagedAndSortedResultRequestDto
{
public string Filter { get; set; }
}
}

9
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/GetResourcesInput.cs

@ -0,0 +1,9 @@
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.LocalizationManagement
{
public class GetResourcesInput : PagedAndSortedResultRequestDto
{
public string Filter { get; set; }
}
}

20
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/GetTextByKeyInput.cs

@ -0,0 +1,20 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.LocalizationManagement
{
public class GetTextByKeyInput
{
[Required]
[DynamicStringLength(typeof(TextConsts), nameof(TextConsts.MaxKeyLength))]
public string Key { get; set; }
[Required]
[DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxCultureNameLength))]
public string CultureName { get; set; }
[Required]
[DynamicStringLength(typeof(ResourceConsts), nameof(ResourceConsts.MaxNameLength))]
public string ResourceName { get; set; }
}
}

24
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/GetTextsInput.cs

@ -0,0 +1,24 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.LocalizationManagement
{
public class GetTextsInput : PagedAndSortedResultRequestDto
{
[Required]
[DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxCultureNameLength))]
public string CultureName { get; set; }
[Required]
[DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxCultureNameLength))]
public string TargetCultureName { get; set; }
[DynamicStringLength(typeof(ResourceConsts), nameof(ResourceConsts.MaxNameLength))]
public string ResourceName { get; set; }
public bool? OnlyNull { get; set; }
public string Filter { get; set; }
}
}

19
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ILanguageAppService.cs

@ -0,0 +1,19 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.LocalizationManagement
{
public interface ILanguageAppService :
ICrudAppService<
LanguageDto,
Guid,
GetLanguagesInput,
CreateOrUpdateLanguageInput,
CreateOrUpdateLanguageInput
>
{
Task<ListResultDto<LanguageDto>> GetAllAsync();
}
}

18
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/IResourceAppService.cs

@ -0,0 +1,18 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.LocalizationManagement
{
public interface IResourceAppService :
ICrudAppService<
ResourceDto,
Guid,
GetResourcesInput,
CreateOrUpdateResourceInput,
CreateOrUpdateResourceInput>
{
Task<ListResultDto<ResourceDto>> GetAllAsync();
}
}

17
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ITextAppService.cs

@ -0,0 +1,17 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.LocalizationManagement
{
public interface ITextAppService :
ICrudAppService<
TextDto,
TextDifferenceDto,
int,
GetTextsInput,
CreateTextInput,
UpdateTextInput>
{
Task<TextDto> GetByCultureKeyAsync(GetTextByKeyInput input);
}
}

14
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageDto.cs

@ -0,0 +1,14 @@
using System;
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.LocalizationManagement
{
public class LanguageDto : AuditedEntityDto<Guid>
{
public bool Enable { get; set; }
public string CultureName { get; set; }
public string UiCultureName { get; set; }
public string DisplayName { get; set; }
public string FlagIcon { get; set; }
}
}

7
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LocalizationRemoteServiceConsts.cs

@ -0,0 +1,7 @@
namespace LINGYUN.Abp.LocalizationManagement
{
public static class LocalizationRemoteServiceConsts
{
public const string RemoteServiceName = "LocalizationManagement";
}
}

73
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/Permissions/LocalizationManagementPermissionDefinitionProvider.cs

@ -0,0 +1,73 @@
using LINGYUN.Abp.LocalizationManagement.Localization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Localization;
namespace LINGYUN.Abp.LocalizationManagement.Permissions
{
public class LocalizationManagementPermissionDefinitionProvider : PermissionDefinitionProvider
{
public override void Define(IPermissionDefinitionContext context)
{
var permissionGroup = context.AddGroup(
LocalizationManagementPermissions.GroupName,
L("Permissions:LocalizationManagement"),
Volo.Abp.MultiTenancy.MultiTenancySides.Host);
var resourcePermission = permissionGroup.AddPermission(
LocalizationManagementPermissions.Resource.Default,
L("Permissions:Resource"),
Volo.Abp.MultiTenancy.MultiTenancySides.Host);
resourcePermission.AddChild(
LocalizationManagementPermissions.Resource.Create,
L("Permissions:Create"),
Volo.Abp.MultiTenancy.MultiTenancySides.Host);
resourcePermission.AddChild(
LocalizationManagementPermissions.Resource.Update,
L("Permissions:Update"),
Volo.Abp.MultiTenancy.MultiTenancySides.Host);
resourcePermission.AddChild(
LocalizationManagementPermissions.Resource.Delete,
L("Permissions:Delete"),
Volo.Abp.MultiTenancy.MultiTenancySides.Host);
var languagePermission = permissionGroup.AddPermission(
LocalizationManagementPermissions.Language.Default,
L("Permissions:Language"),
Volo.Abp.MultiTenancy.MultiTenancySides.Host);
languagePermission.AddChild(
LocalizationManagementPermissions.Language.Create,
L("Permissions:Create"),
Volo.Abp.MultiTenancy.MultiTenancySides.Host);
languagePermission.AddChild(
LocalizationManagementPermissions.Language.Update,
L("Permissions:Update"),
Volo.Abp.MultiTenancy.MultiTenancySides.Host);
languagePermission.AddChild(
LocalizationManagementPermissions.Language.Delete,
L("Permissions:Delete"),
Volo.Abp.MultiTenancy.MultiTenancySides.Host);
var textPermission = permissionGroup.AddPermission(
LocalizationManagementPermissions.Text.Default,
L("Permissions:Text"),
Volo.Abp.MultiTenancy.MultiTenancySides.Host);
textPermission.AddChild(
LocalizationManagementPermissions.Text.Create,
L("Permissions:Create"),
Volo.Abp.MultiTenancy.MultiTenancySides.Host);
textPermission.AddChild(
LocalizationManagementPermissions.Text.Update,
L("Permissions:Update"),
Volo.Abp.MultiTenancy.MultiTenancySides.Host);
textPermission.AddChild(
LocalizationManagementPermissions.Text.Delete,
L("Permissions:Delete"),
Volo.Abp.MultiTenancy.MultiTenancySides.Host);
}
private static LocalizableString L(string name)
{
return LocalizableString.Create<LocalizationManagementResource>(name);
}
}
}

40
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/Permissions/LocalizationManagementPermissions.cs

@ -0,0 +1,40 @@
namespace LINGYUN.Abp.LocalizationManagement.Permissions
{
public static class LocalizationManagementPermissions
{
public const string GroupName = "LocalizationManagement";
public class Resource
{
public const string Default = GroupName + ".Resource";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
public class Language
{
public const string Default = GroupName + ".Language";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
public class Text
{
public const string Default = GroupName + ".Text";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
}
}

13
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceDto.cs

@ -0,0 +1,13 @@
using System;
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.LocalizationManagement
{
public class ResourceDto : AuditedEntityDto<Guid>
{
public bool Enable { get; set; }
public string Name { get; set; }
public string DisplayName { get; set; }
public string Description { get; set; }
}
}

14
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/TextDifferenceDto.cs

@ -0,0 +1,14 @@
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.LocalizationManagement
{
public class TextDifferenceDto : EntityDto<int>
{
public string CultureName { get; set; }
public string Key { get; set; }
public string Value { get; set; }
public string ResourceName { get; set; }
public string TargetCultureName { get; set; }
public string TargetValue { get; set; }
}
}

12
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/TextDto.cs

@ -0,0 +1,12 @@
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.LocalizationManagement
{
public class TextDto : EntityDto<int>
{
public string Key { get; set; }
public string Value { get; set; }
public string CultureName { get; set; }
public string ResourceName { get; set; }
}
}

6
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/UpdateTextInput.cs

@ -0,0 +1,6 @@
namespace LINGYUN.Abp.LocalizationManagement
{
public class UpdateTextInput : CreateOrUpdateTextInput
{
}
}

19
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN.Abp.LocalizationManagement.Application.csproj

@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Ddd.Application" Version="4.2.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\LINGYUN.Abp.LocalizationManagement.Domain\LINGYUN.Abp.LocalizationManagement.Domain.csproj" />
<ProjectReference Include="..\LINGYUN.Abp.LocalizationManagement.Application.Contracts\LINGYUN.Abp.LocalizationManagement.Application.Contracts.csproj" />
</ItemGroup>
</Project>

24
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/AbpLocalizationManagementApplicationModule.cs

@ -0,0 +1,24 @@
using Volo.Abp.Application;
using Volo.Abp.Modularity;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AutoMapper;
namespace LINGYUN.Abp.LocalizationManagement
{
[DependsOn(
typeof(AbpDddApplicationModule),
typeof(AbpLocalizationManagementDomainModule),
typeof(AbpLocalizationManagementApplicationContractsModule))]
public class AbpLocalizationManagementApplicationModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddAutoMapperObjectMapper<AbpLocalizationManagementApplicationModule>();
Configure<AbpAutoMapperOptions>(options =>
{
options.AddProfile<LocalizationManagementApplicationMapperProfile>(validate: true);
});
}
}
}

73
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LanguageAppService.cs

@ -0,0 +1,73 @@
using LINGYUN.Abp.LocalizationManagement.Permissions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.LocalizationManagement
{
public class LanguageAppService :
CrudAppService<
Language,
LanguageDto,
Guid,
GetLanguagesInput,
CreateOrUpdateLanguageInput,
CreateOrUpdateLanguageInput>,
ILanguageAppService
{
public LanguageAppService(ILanguageRepository repository) : base(repository)
{
GetPolicyName = LocalizationManagementPermissions.Language.Default;
GetListPolicyName = LocalizationManagementPermissions.Language.Default;
CreatePolicyName = LocalizationManagementPermissions.Language.Create;
UpdatePolicyName = LocalizationManagementPermissions.Language.Update;
DeletePolicyName = LocalizationManagementPermissions.Language.Delete;
}
public virtual async Task<ListResultDto<LanguageDto>> GetAllAsync()
{
await CheckGetListPolicyAsync();
var languages = await Repository.GetListAsync();
return new ListResultDto<LanguageDto>(
ObjectMapper.Map<List<Language>, List<LanguageDto>>(languages));
}
protected override Language MapToEntity(CreateOrUpdateLanguageInput createInput)
{
return new Language(
createInput.CultureName,
createInput.UiCultureName,
createInput.DisplayName,
createInput.FlagIcon)
{
Enable = createInput.Enable
};
}
protected override void MapToEntity(CreateOrUpdateLanguageInput updateInput, Language entity)
{
if (!string.Equals(entity.FlagIcon, updateInput.FlagIcon, StringComparison.InvariantCultureIgnoreCase))
{
entity.FlagIcon = updateInput.FlagIcon;
}
entity.ChangeCulture(updateInput.CultureName, updateInput.UiCultureName, updateInput.DisplayName);
entity.Enable = updateInput.Enable;
}
protected override async Task<IQueryable<Language>> CreateFilteredQueryAsync(GetLanguagesInput input)
{
var query = await base.CreateFilteredQueryAsync(input);
query = query.WhereIf(!input.Filter.IsNullOrWhiteSpace(),
x => x.CultureName.Contains(input.Filter) || x.UiCultureName.Contains(input.Filter) ||
x.DisplayName.Contains(input.Filter));
return query;
}
}
}

15
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LocalizationManagementApplicationMapperProfile.cs

@ -0,0 +1,15 @@
using AutoMapper;
namespace LINGYUN.Abp.LocalizationManagement
{
public class LocalizationManagementApplicationMapperProfile : Profile
{
public LocalizationManagementApplicationMapperProfile()
{
CreateMap<Language, LanguageDto>();
CreateMap<Resource, ResourceDto>();
CreateMap<Text, TextDto>();
CreateMap<TextDifference, TextDifferenceDto>();
}
}
}

78
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/ResourceAppService.cs

@ -0,0 +1,78 @@
using LINGYUN.Abp.LocalizationManagement.Permissions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.LocalizationManagement
{
public class ResourceAppService :
CrudAppService<
Resource,
ResourceDto,
Guid,
GetResourcesInput,
CreateOrUpdateResourceInput,
CreateOrUpdateResourceInput>,
IResourceAppService
{
public ResourceAppService(IResourceRepository repository) : base(repository)
{
GetPolicyName = LocalizationManagementPermissions.Resource.Default;
GetListPolicyName = LocalizationManagementPermissions.Resource.Default;
CreatePolicyName = LocalizationManagementPermissions.Resource.Create;
UpdatePolicyName = LocalizationManagementPermissions.Resource.Update;
DeletePolicyName = LocalizationManagementPermissions.Resource.Delete;
}
public virtual async Task<ListResultDto<ResourceDto>> GetAllAsync()
{
await CheckGetListPolicyAsync();
var resources = await Repository.GetListAsync();
return new ListResultDto<ResourceDto>(
ObjectMapper.Map<List<Resource>, List<ResourceDto>>(resources));
}
protected override Resource MapToEntity(CreateOrUpdateResourceInput createInput)
{
return new Resource(
createInput.Name,
createInput.DisplayName,
createInput.Description)
{
Enable = createInput.Enable
};
}
protected override void MapToEntity(CreateOrUpdateResourceInput updateInput, Resource entity)
{
if (!string.Equals(entity.Name, updateInput.Name, StringComparison.InvariantCultureIgnoreCase))
{
entity.Name = updateInput.Name;
}
if (!string.Equals(entity.DisplayName, updateInput.DisplayName, StringComparison.InvariantCultureIgnoreCase))
{
entity.DisplayName = updateInput.DisplayName;
}
if (!string.Equals(entity.Description, updateInput.Description, StringComparison.InvariantCultureIgnoreCase))
{
entity.Description = updateInput.Description;
}
entity.Enable = updateInput.Enable;
}
protected override async Task<IQueryable<Resource>> CreateFilteredQueryAsync(GetResourcesInput input)
{
var query = await base.CreateFilteredQueryAsync(input);
query = query.WhereIf(!input.Filter.IsNullOrWhiteSpace(),
x => x.Name.Contains(input.Filter) || x.DisplayName.Contains(input.Filter));
return query;
}
}
}

73
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/TextAppService.cs

@ -0,0 +1,73 @@
using LINGYUN.Abp.LocalizationManagement.Permissions;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.LocalizationManagement
{
public class TextAppService :
CrudAppService<
Text,
TextDto,
TextDifferenceDto,
int,
GetTextsInput,
CreateTextInput,
UpdateTextInput>,
ITextAppService
{
private readonly ITextRepository _textRepository;
public TextAppService(ITextRepository repository) : base(repository)
{
_textRepository = repository;
GetPolicyName = LocalizationManagementPermissions.Text.Default;
GetListPolicyName = LocalizationManagementPermissions.Text.Default;
CreatePolicyName = LocalizationManagementPermissions.Text.Create;
UpdatePolicyName = LocalizationManagementPermissions.Text.Update;
DeletePolicyName = LocalizationManagementPermissions.Text.Delete;
}
public virtual async Task<TextDto> GetByCultureKeyAsync(GetTextByKeyInput input)
{
await CheckGetPolicyAsync();
var text = await _textRepository.GetByCultureKeyAsync(
input.ResourceName, input.CultureName, input.Key);
return await MapToGetOutputDtoAsync(text);
}
public override async Task<PagedResultDto<TextDifferenceDto>> GetListAsync(GetTextsInput input)
{
await CheckGetListPolicyAsync();
var count = await _textRepository.GetDifferenceCountAsync(
input.CultureName, input.TargetCultureName,
input.ResourceName, input.OnlyNull, input.Filter);
var texts = await _textRepository.GetDifferencePagedListAsync(
input.CultureName, input.TargetCultureName,
input.ResourceName, input.OnlyNull, input.Filter,
input.Sorting, input.SkipCount, input.MaxResultCount);
return new PagedResultDto<TextDifferenceDto>(count,
ObjectMapper.Map<List<TextDifference>, List<TextDifferenceDto>>(texts));
}
protected override Text MapToEntity(CreateTextInput createInput)
{
return new Text(
createInput.ResourceName,
createInput.CultureName,
createInput.Key,
createInput.Value);
}
protected override void MapToEntity(UpdateTextInput updateInput, Text entity)
{
entity.SetValue(updateInput.Value);
}
}
}

25
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN.Abp.LocalizationManagement.Domain.Shared.csproj

@ -0,0 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<None Remove="LINGYUN\Abp\LocalizationManagement\Localization\Resources\en.json" />
<None Remove="LINGYUN\Abp\LocalizationManagement\Localization\Resources\zh-Hans.json" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="LINGYUN\Abp\LocalizationManagement\Localization\Resources\en.json" />
<EmbeddedResource Include="LINGYUN\Abp\LocalizationManagement\Localization\Resources\zh-Hans.json" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Validation" Version="4.2.1" />
<PackageReference Include="Volo.Abp.Localization" Version="4.2.1" />
</ItemGroup>
</Project>

29
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/AbpLocalizationManagementDomainSharedModule.cs

@ -0,0 +1,29 @@
using LINGYUN.Abp.LocalizationManagement.Localization;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.Validation;
using Volo.Abp.VirtualFileSystem;
namespace LINGYUN.Abp.LocalizationManagement
{
[DependsOn(
typeof(AbpValidationModule),
typeof(AbpLocalizationModule))]
public class AbpLocalizationManagementDomainSharedModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpLocalizationManagementDomainSharedModule>();
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<LocalizationManagementResource>("en")
.AddVirtualJson("/LINGYUN/Abp/LocalizationManagement/Localization/Resources");
});
}
}
}

10
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/LanguageConsts.cs

@ -0,0 +1,10 @@
namespace LINGYUN.Abp.LocalizationManagement
{
public static class LanguageConsts
{
public static int MaxCultureNameLength { get; set; } = 20;
public static int MaxUiCultureNameLength { get; set; } = 20;
public static int MaxDisplayNameLength { get; set; } = 64;
public static int MaxFlagIconLength { get; set; } = 30;
}
}

9
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/LocalizationManagementResource.cs

@ -0,0 +1,9 @@
using Volo.Abp.Localization;
namespace LINGYUN.Abp.LocalizationManagement.Localization
{
[LocalizationResourceName("LocalizationManagement")]
public class LocalizationManagementResource
{
}
}

41
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/en.json

@ -0,0 +1,41 @@
{
"culture": "en",
"texts": {
"Delete": "Delete",
"DisplayName:Any": "Any",
"DisplayName:CreationTime": "Creation Time",
"DisplayName:CultureName": "Culture",
"DisplayName:Description": "Description",
"DisplayName:DisplayName": "Display Name",
"DisplayName:Enable": "Enable",
"DisplayName:FlagIcon": "Flag Icon",
"DisplayName:Key": "Key",
"DisplayName:LastModificationTime": "Modification Time",
"DisplayName:Name": "Name",
"DisplayName:OnlyNull": "Only Null",
"DisplayName:ResourceName": "Resource",
"DisplayName:SaveAndNext": "Save & Next",
"DisplayName:TargetCultureName": "Target Culture",
"DisplayName:TargetValue": "Target Value",
"DisplayName:UiCultureName": "Ui Culture",
"DisplayName:Value": "Value",
"Permissions:LocalizationManagement": "Localization",
"Permissions:Language": "Language",
"Permissions:Resource": "Resource",
"Permissions:Text": "Text",
"Permissions:Create": "Create",
"Permissions:Update": "Update",
"Permissions:Delete": "Delete",
"Edit": "Edit",
"EditByName": "Edit - {0}",
"Filter": "Filter",
"Language:AddNew": "Add New Language",
"Resource:AddNew": "Add New Resource",
"SaveAndNext": "Save & Next",
"SearchFilter": "Search",
"Text:AddNew": "Add New Text",
"WillDeleteLanguage": "Language to be deleted {0}",
"WillDeleteResource": "Resource to be deleted {0}",
"WillDeleteText": "Document to be deleted {0}"
}
}

41
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/zh-Hans.json

@ -0,0 +1,41 @@
{
"culture": "zh-Hans",
"texts": {
"Delete": "删除",
"DisplayName:Any": "所有",
"DisplayName:CreationTime": "创建时间",
"DisplayName:CultureName": "文化名称",
"DisplayName:Description": "描述",
"DisplayName:DisplayName": "显示名称",
"DisplayName:Enable": "启用",
"DisplayName:FlagIcon": "旗帜图标",
"DisplayName:Key": "键",
"DisplayName:LastModificationTime": "变更时间",
"DisplayName:Name": "名称",
"DisplayName:OnlyNull": "仅空值",
"DisplayName:ResourceName": "资源名称",
"DisplayName:SaveAndNext": "保存并下一步",
"DisplayName:TargetCultureName": "目标文化",
"DisplayName:TargetValue": "目标值",
"DisplayName:UiCultureName": "界面文化",
"DisplayName:Value": "值",
"Permissions:LocalizationManagement": "本地化管理",
"Permissions:Language": "语言管理",
"Permissions:Resource": "资源管理",
"Permissions:Text": "文档管理",
"Permissions:Create": "新增",
"Permissions:Update": "编辑",
"Permissions:Delete": "删除",
"Edit": "编辑",
"EditByName": "编辑 - {0}",
"Filter": "过滤字符",
"Language:AddNew": "添加新语言",
"Resource:AddNew": "添加新资源",
"SaveAndNext": "保存并下一步",
"SearchFilter": "请输入过滤字符",
"Text:AddNew": "添加新文档",
"WillDeleteLanguage": "将要删除语言 {0}",
"WillDeleteResource": "将要删除资源 {0}",
"WillDeleteText": "将要删除文档 {0}"
}
}

9
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/ResourceConsts.cs

@ -0,0 +1,9 @@
namespace LINGYUN.Abp.LocalizationManagement
{
public static class ResourceConsts
{
public static int MaxNameLength { get; set; } = 50;
public static int MaxDisplayNameLength { get; set; } = 64;
public static int MaxDescriptionLength { get; set; } = 64;
}
}

8
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/TextConsts.cs

@ -0,0 +1,8 @@
namespace LINGYUN.Abp.LocalizationManagement
{
public static class TextConsts
{
public static int MaxKeyLength { get; set; } = 512;
public static int MaxValueLength { get; set; } = 2 * 1024;
}
}

33
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/TextDifference.cs

@ -0,0 +1,33 @@
namespace LINGYUN.Abp.LocalizationManagement
{
public class TextDifference
{
public int Id { get; set; }
public string CultureName { get; set; }
public string Key { get; set; }
public string Value { get; set; }
public string ResourceName { get; set; }
public string TargetCultureName { get; set; }
public string TargetValue { get; set; }
public TextDifference() { }
public TextDifference(
int id,
string cultureName,
string key,
string value,
string targetCultureName,
string targetValue = null,
string resourceName = null)
{
Id = id;
Key = key;
Value = value;
CultureName = cultureName;
TargetCultureName = targetCultureName;
TargetValue = targetValue;
ResourceName = resourceName;
}
}
}

10
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/TextEto.cs

@ -0,0 +1,10 @@
namespace LINGYUN.Abp.LocalizationManagement
{
public class TextEto
{
public string CultureName { get; set; }
public string Key { get; set; }
public string Value { get; set; }
public string ResourceName { get; set; }
}
}

20
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN.Abp.LocalizationManagement.Domain.csproj

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.AutoMapper" Version="4.2.1" />
<PackageReference Include="Volo.Abp.Ddd.Domain" Version="4.2.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\common\LINGYUN.Abp.Localization.Dynamic\LINGYUN.Abp.Localization.Dynamic.csproj" />
<ProjectReference Include="..\LINGYUN.Abp.LocalizationManagement.Domain.Shared\LINGYUN.Abp.LocalizationManagement.Domain.Shared.csproj" />
</ItemGroup>
</Project>

44
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/AbpLocalizationManagementDomainModule.cs

@ -0,0 +1,44 @@
using LINGYUN.Abp.Localization.Dynamic;
using LINGYUN.Abp.LocalizationManagement.Localization;
using Volo.Abp.AutoMapper;
using Volo.Abp.Domain;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.EventBus.Distributed;
using Volo.Abp.Domain.Entities.Events.Distributed;
using Microsoft.Extensions.DependencyInjection;
namespace LINGYUN.Abp.LocalizationManagement
{
[DependsOn(
typeof(AbpAutoMapperModule),
typeof(AbpDddDomainModule),
typeof(AbpLocalizationDynamicModule),
typeof(AbpLocalizationManagementDomainSharedModule))]
public class AbpLocalizationManagementDomainModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddAutoMapperObjectMapper<AbpLocalizationManagementDomainModule>();
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Get<LocalizationManagementResource>()
.AddDynamic();
});
Configure<AbpAutoMapperOptions>(options =>
{
options.AddProfile<LocalizationManagementDomainMapperProfile>(validate: true);
});
// 分布式事件
//Configure<AbpDistributedEntityEventOptions>(options =>
//{
// options.AutoEventSelectors.Add<Text>();
// options.EtoMappings.Add<Text, TextEto>();
//});
}
}
}

17
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/ILanguageRepository.cs

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
namespace LINGYUN.Abp.LocalizationManagement
{
public interface ILanguageRepository : IRepository<Language, Guid>
{
Task<Language> FindByCultureNameAsync(
string cultureName,
CancellationToken cancellationToken = default);
Task<List<Language>> GetActivedListAsync(CancellationToken cancellationToken = default);
}
}

18
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/IResourceRepository.cs

@ -0,0 +1,18 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
namespace LINGYUN.Abp.LocalizationManagement
{
public interface IResourceRepository : IRepository<Resource, Guid>
{
Task<bool> ExistsAsync(
string name,
CancellationToken cancellationToken = default);
Task<Resource> FindByNameAsync(
string name,
CancellationToken cancellationToken = default);
}
}

45
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/ITextRepository.cs

@ -0,0 +1,45 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
namespace LINGYUN.Abp.LocalizationManagement
{
public interface ITextRepository : IRepository<Text, int>
{
Task<Text> GetByCultureKeyAsync(
string resourceName,
string cultureName,
string key,
CancellationToken cancellationToken = default
);
Task<List<Text>> GetListAsync(
string resourceName,
CancellationToken cancellationToken = default);
Task<List<Text>> GetListAsync(
string resourceName,
string cultureName,
CancellationToken cancellationToken = default);
Task<int> GetDifferenceCountAsync(
string cultureName,
string targetCultureName,
string resourceName = null,
bool? onlyNull = null,
string filter = null,
CancellationToken cancellationToken = default);
Task<List<TextDifference>> GetDifferencePagedListAsync(
string cultureName,
string targetCultureName,
string resourceName = null,
bool? onlyNull = null,
string filter = null,
string sorting = nameof(Text.Key),
int skipCount = 1,
int maxResultCount = 10,
CancellationToken cancellationToken = default);
}
}

53
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Language.cs

@ -0,0 +1,53 @@
using JetBrains.Annotations;
using System;
using Volo.Abp;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.Localization;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.LocalizationManagement
{
public class Language : AuditedEntity<Guid>, ILanguageInfo
{
public virtual bool Enable { get; set; }
public virtual string CultureName { get; protected set; }
public virtual string UiCultureName { get; protected set; }
public virtual string DisplayName { get; protected set; }
public virtual string FlagIcon { get; set; }
protected Language() { }
public Language(
[NotNull] string cultureName,
[NotNull] string uiCultureName,
[NotNull] string displayName,
string flagIcon = null)
{
CultureName = Check.NotNullOrWhiteSpace(cultureName, nameof(cultureName), LanguageConsts.MaxCultureNameLength);
UiCultureName = Check.NotNullOrWhiteSpace(uiCultureName, nameof(uiCultureName), LanguageConsts.MaxUiCultureNameLength);
DisplayName = Check.NotNullOrWhiteSpace(displayName, nameof(displayName), LanguageConsts.MaxDisplayNameLength);
FlagIcon = !flagIcon.IsNullOrWhiteSpace()
? Check.Length(flagIcon, nameof(flagIcon), LanguageConsts.MaxFlagIconLength)
: null;
Enable = true;
}
public virtual void ChangeCulture(string cultureName, string uiCultureName = null, string displayName = null)
{
ChangeCultureInternal(cultureName, uiCultureName, displayName);
}
private void ChangeCultureInternal(string cultureName, string uiCultureName, string displayName)
{
CultureName = Check.NotNullOrWhiteSpace(cultureName, nameof(cultureName), LanguageConsts.MaxCultureNameLength);
UiCultureName = !uiCultureName.IsNullOrWhiteSpace()
? Check.Length(uiCultureName, nameof(uiCultureName), LanguageConsts.MaxUiCultureNameLength)
: cultureName;
DisplayName = !displayName.IsNullOrWhiteSpace()
? Check.Length(displayName, nameof(displayName), LanguageConsts.MaxDisplayNameLength)
: cultureName;
}
}
}

11
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LocalizationDbProperties.cs

@ -0,0 +1,11 @@
namespace LINGYUN.Abp.LocalizationManagement
{
public static class LocalizationDbProperties
{
public static string DbTablePrefix { get; set; } = "AbpLocalization";
public static string DbSchema { get; set; } = null;
public const string ConnectionStringName = "AbpLocalizationManagement";
}
}

12
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LocalizationManagementDomainMapperProfile.cs

@ -0,0 +1,12 @@
using AutoMapper;
namespace LINGYUN.Abp.LocalizationManagement
{
public class LocalizationManagementDomainMapperProfile : Profile
{
public LocalizationManagementDomainMapperProfile()
{
CreateMap<Text, TextEto>();
}
}
}

86
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LocalizationStore.cs

@ -0,0 +1,86 @@
using LINGYUN.Abp.Localization.Dynamic;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization;
namespace LINGYUN.Abp.LocalizationManagement
{
[Dependency(ServiceLifetime.Singleton, ReplaceServices = true)]
[ExposeServices(
typeof(ILocalizationStore),
typeof(LocalizationStore))]
public class LocalizationStore : ILocalizationStore
{
protected ILanguageRepository LanguageRepository { get; }
protected ITextRepository TextRepository { get; }
protected IResourceRepository ResourceRepository { get; }
public LocalizationStore(
ILanguageRepository languageRepository,
ITextRepository textRepository,
IResourceRepository resourceRepository)
{
TextRepository = textRepository;
LanguageRepository = languageRepository;
ResourceRepository = resourceRepository;
}
public virtual async Task<List<LanguageInfo>> GetLanguageListAsync(
CancellationToken cancellationToken = default)
{
var languages = await LanguageRepository.GetActivedListAsync(cancellationToken);
return languages
.Select(x => new LanguageInfo(x.CultureName, x.UiCultureName, x.DisplayName, x.FlagIcon))
.ToList();
}
public virtual async Task<Dictionary<string, ILocalizationDictionary>> GetLocalizationDictionaryAsync(
string resourceName,
CancellationToken cancellationToken = default)
{
// TODO: 引用缓存?
var dictionaries = new Dictionary<string, ILocalizationDictionary>();
var resource = await ResourceRepository.FindByNameAsync(resourceName, cancellationToken);
if (resource == null || !resource.Enable)
{
// 资源不存在或未启用返回空
return dictionaries;
}
var texts = await TextRepository.GetListAsync(resourceName, cancellationToken);
foreach (var textGroup in texts.GroupBy(x => x.CultureName))
{
var cultureTextDictionaires = new Dictionary<string, LocalizedString>();
foreach (var text in textGroup)
{
// 本地化名称去重
if (!cultureTextDictionaires.ContainsKey(text.Key))
{
cultureTextDictionaires[text.Key] = new LocalizedString(text.Key, text.Value.NormalizeLineEndings());
}
}
// 本地化语言去重
if (!dictionaries.ContainsKey(textGroup.Key))
{
dictionaries[textGroup.Key] = new StaticLocalizationDictionary(textGroup.Key, cultureTextDictionaires);
}
}
return dictionaries;
}
public virtual async Task<bool> ResourceExistsAsync(string resourceName, CancellationToken cancellationToken = default)
{
return await ResourceRepository.ExistsAsync(resourceName, cancellationToken);
}
}
}

53
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LocalizationSynchronizer.cs

@ -0,0 +1,53 @@
using LINGYUN.Abp.Localization.Dynamic;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Entities.Events;
using Volo.Abp.EventBus;
using Volo.Abp.EventBus.Distributed;
namespace LINGYUN.Abp.LocalizationManagement
{
public class LocalizationSynchronizer :
ILocalEventHandler<EntityCreatedEventData<Text>>,
ILocalEventHandler<EntityUpdatedEventData<Text>>,
ILocalEventHandler<EntityDeletedEventData<Text>>,
ITransientDependency
{
private readonly IDistributedEventBus _eventBus;
public LocalizationSynchronizer(
IDistributedEventBus eventBus)
{
_eventBus = eventBus;
}
public virtual async Task HandleEventAsync(EntityCreatedEventData<Text> eventData)
{
await HandleEventAsync(BuildResetEventData(eventData.Entity));
}
public virtual async Task HandleEventAsync(EntityUpdatedEventData<Text> eventData)
{
await HandleEventAsync(BuildResetEventData(eventData.Entity));
}
public virtual async Task HandleEventAsync(EntityDeletedEventData<Text> eventData)
{
var data = BuildResetEventData(eventData.Entity);
data.IsDeleted = true;
await HandleEventAsync(data);
}
private LocalizedStringCacheResetEventData BuildResetEventData(Text text)
{
return new LocalizedStringCacheResetEventData(
text.ResourceName, text.CultureName, text.Key, text.Value);
}
private async Task HandleEventAsync(LocalizedStringCacheResetEventData eventData)
{
await _eventBus.PublishAsync(eventData);
}
}
}

28
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Resource.cs

@ -0,0 +1,28 @@
using JetBrains.Annotations;
using System;
using Volo.Abp;
using Volo.Abp.Domain.Entities.Auditing;
namespace LINGYUN.Abp.LocalizationManagement
{
public class Resource : AuditedEntity<Guid>
{
public virtual bool Enable { get; set; }
public virtual string Name { get; set; }
public virtual string DisplayName { get; set; }
public virtual string Description { get; set; }
protected Resource() { }
public Resource(
[NotNull] string name,
[CanBeNull] string displayName = null,
[CanBeNull] string description = null)
{
Name = Check.NotNullOrWhiteSpace(name, nameof(name), ResourceConsts.MaxNameLength);
DisplayName = displayName ?? Name;
Description = description;
Enable = true;
}
}
}

37
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Text.cs

@ -0,0 +1,37 @@
using JetBrains.Annotations;
using System;
using Volo.Abp;
using Volo.Abp.Domain.Entities;
namespace LINGYUN.Abp.LocalizationManagement
{
public class Text : Entity<int>
{
public virtual string CultureName { get; protected set; }
public virtual string Key { get; protected set; }
public virtual string Value { get; protected set; }
public virtual string ResourceName { get; protected set; }
protected Text() { }
public Text(
[NotNull] string resourceName,
[NotNull] string cultureName,
[NotNull] string key,
[CanBeNull] string value)
{
ResourceName = Check.NotNull(resourceName, nameof(resourceName), ResourceConsts.MaxNameLength);
CultureName = Check.NotNullOrWhiteSpace(cultureName, nameof(cultureName), LanguageConsts.MaxCultureNameLength);
Key = Check.NotNullOrWhiteSpace(key, nameof(key), TextConsts.MaxKeyLength);
Value = !value.IsNullOrWhiteSpace()
? Check.NotNullOrWhiteSpace(value, nameof(value), TextConsts.MaxValueLength)
: "";
}
public void SetValue(string value)
{
Value = !value.IsNullOrWhiteSpace()
? Check.NotNullOrWhiteSpace(value, nameof(value), TextConsts.MaxValueLength)
: Value;
}
}
}

18
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore.csproj

@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.EntityFrameworkCore" Version="4.2.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\LINGYUN.Abp.LocalizationManagement.Domain\LINGYUN.Abp.LocalizationManagement.Domain.csproj" />
</ItemGroup>
</Project>

24
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/AbpLocalizationManagementEntityFrameworkCoreModule.cs

@ -0,0 +1,24 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore
{
[DependsOn(
typeof(AbpEntityFrameworkCoreModule),
typeof(AbpLocalizationManagementDomainModule))]
public class AbpLocalizationManagementEntityFrameworkCoreModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddAbpDbContext<LocalizationDbContext>(options =>
{
options.AddRepository<Text, EfCoreTextRepository>();
options.AddRepository<Language, EfCoreLanguageRepository>();
options.AddRepository<Resource, EfCoreResourceRepository>();
options.AddDefaultRepositories(includeAllEntities: true);
});
}
}
}

34
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/EfCoreLanguageRepository.cs

@ -0,0 +1,34 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore
{
public class EfCoreLanguageRepository : EfCoreRepository<LocalizationDbContext, Language, Guid>,
ILanguageRepository
{
public EfCoreLanguageRepository(
IDbContextProvider<LocalizationDbContext> dbContextProvider) : base(dbContextProvider)
{
}
public virtual async Task<Language> FindByCultureNameAsync(
string cultureName,
CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync()).Where(x => x.CultureName.Equals(cultureName))
.FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<Language>> GetActivedListAsync(CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync()).Where(x => x.Enable)
.ToListAsync(GetCancellationToken(cancellationToken));
}
}
}

34
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/EfCoreResourceRepository.cs

@ -0,0 +1,34 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore
{
public class EfCoreResourceRepository : EfCoreRepository<LocalizationDbContext, Resource, Guid>,
IResourceRepository
{
public EfCoreResourceRepository(
IDbContextProvider<LocalizationDbContext> dbContextProvider) : base(dbContextProvider)
{
}
public virtual async Task<bool> ExistsAsync(
string name,
CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync()).AnyAsync(x => x.Name.Equals(name));
}
public virtual async Task<Resource> FindByNameAsync(
string name,
CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync()).Where(x => x.Name.Equals(name))
.FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
}
}
}

135
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/EfCoreTextRepository.cs

@ -0,0 +1,135 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore
{
public class EfCoreTextRepository : EfCoreRepository<LocalizationDbContext, Text, int>,
ITextRepository
{
public EfCoreTextRepository(
IDbContextProvider<LocalizationDbContext> dbContextProvider) : base(dbContextProvider)
{
}
public virtual async Task<Text> GetByCultureKeyAsync(
string resourceName,
string cultureName,
string key,
CancellationToken cancellationToken = default
)
{
return await (await GetDbSetAsync())
.Where(x => x.ResourceName.Equals(resourceName) && x.CultureName.Equals(cultureName) && x.Key.Equals(key))
.FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<int> GetDifferenceCountAsync(
string cultureName,
string targetCultureName,
string resourceName = null,
bool? onlyNull = null,
string filter = null,
CancellationToken cancellationToken = default)
{
return await (await BuildTextDifferenceQueryAsync(
cultureName,
targetCultureName,
resourceName,
onlyNull,
filter))
.CountAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<Text>> GetListAsync(
string resourceName,
CancellationToken cancellationToken = default)
{
var languages = (await GetDbContextAsync()).Set<Language>();
var texts = await GetDbSetAsync();
return await (from txts in texts
join lg in languages
on txts.CultureName equals lg.CultureName
where txts.ResourceName.Equals(resourceName) &&
lg.Enable
select txts)
.ToListAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<Text>> GetListAsync(
string resourceName,
string cultureName,
CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.Where(x => x.ResourceName.Equals(resourceName) && x.CultureName.Equals(cultureName))
.ToListAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<TextDifference>> GetDifferencePagedListAsync(
string cultureName,
string targetCultureName,
string resourceName = null,
bool? onlyNull = null,
string filter = null,
string sorting = nameof(TextDifference.Key),
int skipCount = 1,
int maxResultCount = 10,
CancellationToken cancellationToken = default)
{
return await (await BuildTextDifferenceQueryAsync(
cultureName,
targetCultureName,
resourceName,
onlyNull,
filter,
sorting))
.PageBy(skipCount, maxResultCount)
.ToListAsync(GetCancellationToken(cancellationToken));
}
protected virtual async Task<IQueryable<TextDifference>> BuildTextDifferenceQueryAsync(
string cultureName,
string targetCultureName,
string resourceName = null,
bool? onlyNull = null,
string filter = null,
string sorting = nameof(TextDifference.Key))
{
var textQuery = (await GetDbSetAsync())
.Where(x => x.CultureName.Equals(cultureName))
.WhereIf(!resourceName.IsNullOrWhiteSpace(), x => x.ResourceName.Equals(resourceName))
.WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Key.Contains(filter))
.OrderBy(sorting ?? nameof(TextDifference.Key));
var targetTextQuery = (await GetDbSetAsync())
.Where(x => x.CultureName.Equals(targetCultureName))
.WhereIf(!resourceName.IsNullOrWhiteSpace(), x => x.ResourceName.Equals(resourceName));
var query = from crtText in textQuery
join tgtText in targetTextQuery
on crtText.Key equals tgtText.Key
into tgt
from tt in tgt.DefaultIfEmpty()
where onlyNull.HasValue && onlyNull.Value
? tt.Value == null
: 1 == 1
select new TextDifference(
crtText.Id,
crtText.CultureName,
crtText.Key,
crtText.Value,
targetCultureName,
tt != null ? tt.Value : null,
crtText.ResourceName);
return query;
}
}
}

10
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/ILocalizationDbContext.cs

@ -0,0 +1,10 @@
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
namespace LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore
{
[ConnectionStringName(LocalizationDbProperties.ConnectionStringName)]
public interface ILocalizationDbContext : IEfCoreDbContext
{
}
}

25
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/LocalizationDbContext.cs

@ -0,0 +1,25 @@
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
namespace LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore
{
[ConnectionStringName(LocalizationDbProperties.ConnectionStringName)]
public class LocalizationDbContext : AbpDbContext<LocalizationDbContext>, ILocalizationDbContext
{
public virtual DbSet<Resource> Resources { get; set; }
public virtual DbSet<Language> Languages { get; set; }
public virtual DbSet<Text> Texts { get; set; }
public LocalizationDbContext(
DbContextOptions<LocalizationDbContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ConfigureLocalization();
}
}
}

99
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/LocalizationDbContextModelBuilderExtensions.cs

@ -0,0 +1,99 @@
using Microsoft.EntityFrameworkCore;
using System;
using Volo.Abp;
using Volo.Abp.EntityFrameworkCore.Modeling;
namespace LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore
{
public static class LocalizationDbContextModelBuilderExtensions
{
public static void ConfigureLocalization(
this ModelBuilder builder,
Action<LocalizationModelBuilderConfigurationOptions> optionsAction = null)
{
Check.NotNull(builder, nameof(builder));
var options = new LocalizationModelBuilderConfigurationOptions(
LocalizationDbProperties.DbTablePrefix,
LocalizationDbProperties.DbSchema
);
optionsAction?.Invoke(options);
builder.Entity<Language>(x =>
{
x.ToTable(options.TablePrefix + "Languages", options.Schema);
x.Property(p => p.CultureName)
.IsRequired()
.HasMaxLength(LanguageConsts.MaxCultureNameLength)
.HasColumnName(nameof(Language.CultureName));
x.Property(p => p.UiCultureName)
.IsRequired()
.HasMaxLength(LanguageConsts.MaxUiCultureNameLength)
.HasColumnName(nameof(Language.UiCultureName));
x.Property(p => p.DisplayName)
.IsRequired()
.HasMaxLength(LanguageConsts.MaxDisplayNameLength)
.HasColumnName(nameof(Language.DisplayName));
x.Property(p => p.FlagIcon)
.IsRequired(false)
.HasMaxLength(LanguageConsts.MaxFlagIconLength)
.HasColumnName(nameof(Language.FlagIcon));
x.Property(p => p.Enable)
.HasDefaultValue(true);
x.ConfigureByConvention();
x.HasIndex(p => p.CultureName);
});
builder.Entity<Resource>(x =>
{
x.ToTable(options.TablePrefix + "Resources", options.Schema);
x.Property(p => p.Name)
.IsRequired()
.HasMaxLength(ResourceConsts.MaxNameLength)
.HasColumnName(nameof(Resource.Name));
x.Property(p => p.DisplayName)
.HasMaxLength(ResourceConsts.MaxDisplayNameLength)
.HasColumnName(nameof(Resource.DisplayName));
x.Property(p => p.Description)
.HasMaxLength(ResourceConsts.MaxDescriptionLength)
.HasColumnName(nameof(Resource.Description));
x.Property(p => p.Enable)
.HasDefaultValue(true);
x.ConfigureByConvention();
x.HasIndex(p => p.Name);
});
builder.Entity<Text>(x =>
{
x.ToTable(options.TablePrefix + "Texts", options.Schema);
x.Property(p => p.CultureName)
.IsRequired()
.HasMaxLength(LanguageConsts.MaxCultureNameLength)
.HasColumnName(nameof(Text.CultureName));
x.Property(p => p.Key)
.IsRequired()
.HasMaxLength(TextConsts.MaxKeyLength)
.HasColumnName(nameof(Text.Key));
x.Property(p => p.Value)
.HasMaxLength(TextConsts.MaxValueLength)
.HasColumnName(nameof(Text.Value));
x.ConfigureByConvention();
x.HasIndex(p => p.Key);
});
}
}
}

18
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore/LINGYUN/Abp/LocalizationManagement/EntityFrameworkCore/LocalizationModelBuilderConfigurationOptions.cs

@ -0,0 +1,18 @@
using JetBrains.Annotations;
using Volo.Abp.EntityFrameworkCore.Modeling;
namespace LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore
{
public class LocalizationModelBuilderConfigurationOptions : AbpModelBuilderConfigurationOptions
{
public LocalizationModelBuilderConfigurationOptions(
[NotNull] string tablePrefix = "",
[CanBeNull] string schema = null)
: base(
tablePrefix,
schema)
{
}
}
}

18
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN.Abp.LocalizationManagement.HttpApi.csproj

@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="4.2.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\LINGYUN.Abp.LocalizationManagement.Application.Contracts\LINGYUN.Abp.LocalizationManagement.Application.Contracts.csproj" />
</ItemGroup>
</Project>

42
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/AbpLocalizationManagementHttpApiModule.cs

@ -0,0 +1,42 @@
using LINGYUN.Abp.LocalizationManagement.Localization;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.Localization;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.Validation.Localization;
namespace LINGYUN.Abp.LocalizationManagement
{
[DependsOn(
typeof(AbpAspNetCoreMvcModule),
typeof(AbpLocalizationManagementApplicationContractsModule))]
public class AbpLocalizationManagementHttpApiModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
// Dto验证本地化
PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options =>
{
options.AddAssemblyResource(
typeof(LocalizationManagementResource),
typeof(AbpLocalizationManagementApplicationContractsModule).Assembly);
});
PreConfigure<IMvcBuilder>(mvcBuilder =>
{
mvcBuilder.AddApplicationPartIfNotExists(typeof(AbpLocalizationManagementApplicationContractsModule).Assembly);
});
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Get<LocalizationManagementResource>()
.AddBaseTypes(typeof(AbpValidationResource));
});
}
}
}

62
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/LanguageController.cs

@ -0,0 +1,62 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
namespace LINGYUN.Abp.LocalizationManagement
{
[RemoteService(Name = LocalizationRemoteServiceConsts.RemoteServiceName)]
[Area("localization")]
[Route("api/localization/languages")]
public class LanguageController : AbpController, ILanguageAppService
{
private readonly ILanguageAppService _service;
public LanguageController(ILanguageAppService service)
{
_service = service;
}
[HttpPost]
public virtual async Task<LanguageDto> CreateAsync(CreateOrUpdateLanguageInput input)
{
return await _service.CreateAsync(input);
}
[HttpDelete]
[Route("{id}")]
public virtual async Task DeleteAsync(Guid id)
{
await _service.DeleteAsync(id);
}
[HttpGet]
[Route("all")]
public virtual async Task<ListResultDto<LanguageDto>> GetAllAsync()
{
return await _service.GetAllAsync();
}
[HttpGet]
[Route("{id}")]
public virtual async Task<LanguageDto> GetAsync(Guid id)
{
return await _service.GetAsync(id);
}
[HttpGet]
public virtual async Task<PagedResultDto<LanguageDto>> GetListAsync(GetLanguagesInput input)
{
return await _service.GetListAsync(input);
}
[HttpPut]
[Route("{id}")]
public virtual async Task<LanguageDto> UpdateAsync(Guid id, CreateOrUpdateLanguageInput input)
{
return await _service.UpdateAsync(id, input);
}
}
}

62
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/ResourceController.cs

@ -0,0 +1,62 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
namespace LINGYUN.Abp.LocalizationManagement
{
[RemoteService(Name = LocalizationRemoteServiceConsts.RemoteServiceName)]
[Area("localization")]
[Route("api/localization/resources")]
public class ResourceController : AbpController, IResourceAppService
{
private readonly IResourceAppService _service;
public ResourceController(IResourceAppService service)
{
_service = service;
}
[HttpPost]
public virtual async Task<ResourceDto> CreateAsync(CreateOrUpdateResourceInput input)
{
return await _service.CreateAsync(input);
}
[HttpDelete]
[Route("{id}")]
public virtual async Task DeleteAsync(Guid id)
{
await _service.DeleteAsync(id);
}
[HttpGet]
[Route("all")]
public virtual async Task<ListResultDto<ResourceDto>> GetAllAsync()
{
return await _service.GetAllAsync();
}
[HttpGet]
[Route("{id}")]
public virtual async Task<ResourceDto> GetAsync(Guid id)
{
return await _service.GetAsync(id);
}
[HttpGet]
public virtual async Task<PagedResultDto<ResourceDto>> GetListAsync(GetResourcesInput input)
{
return await _service.GetListAsync(input);
}
[HttpPut]
[Route("{id}")]
public virtual async Task<ResourceDto> UpdateAsync(Guid id, CreateOrUpdateResourceInput input)
{
return await _service.UpdateAsync(id, input);
}
}
}

61
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/TextController.cs

@ -0,0 +1,61 @@
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
namespace LINGYUN.Abp.LocalizationManagement
{
[RemoteService(Name = LocalizationRemoteServiceConsts.RemoteServiceName)]
[Area("localization")]
[Route("api/localization/texts")]
public class TextController : AbpController, ITextAppService
{
private readonly ITextAppService _service;
public TextController(ITextAppService service)
{
_service = service;
}
[HttpPost]
public virtual async Task<TextDto> CreateAsync(CreateTextInput input)
{
return await _service.CreateAsync(input);
}
[HttpDelete]
[Route("{id}")]
public virtual async Task DeleteAsync(int id)
{
await _service.DeleteAsync(id);
}
[HttpGet]
[Route("{id}")]
public virtual async Task<TextDto> GetAsync(int id)
{
return await _service.GetAsync(id);
}
[HttpGet]
[Route("by-culture-key")]
public virtual async Task<TextDto> GetByCultureKeyAsync(GetTextByKeyInput input)
{
return await _service.GetByCultureKeyAsync(input);
}
[HttpGet]
public virtual async Task<PagedResultDto<TextDifferenceDto>> GetListAsync(GetTextsInput input)
{
return await _service.GetListAsync(input);
}
[HttpPut]
[Route("{id}")]
public virtual async Task<TextDto> UpdateAsync(int id, UpdateTextInput input)
{
return await _service.UpdateAsync(id, input);
}
}
}

39
aspnet-core/modules/lt/README.md

@ -0,0 +1,39 @@
# Localization Management
本地化文档管理模块,因项目路径太长Windows系统不支持,项目目录取简称 lt
## 模块说明
### 基础模块
* [LINGYUN.Abp.Localization.Dynamic](../common/LINGYUN.Abp.Localization.Dynamic/LINGYUN.Abp.Localization.Dynamic) 本地化扩展模块,增加 DynamicLocalizationResourceContributor 通过 ILocalizationStore 接口获取动态的本地化资源信息
* [LINGYUN.Abp.LocalizationManagement.Domain.Shared](./LINGYUN.Abp.LocalizationManagement.Domain.Shared) 领域层公共模块,定义了错误代码、本地化、模块设置
* [LINGYUN.Abp.LocalizationManagement.Domain](./LINGYUN.Abp.LocalizationManagement.Domain) 领域层模块,实现 ILocalizationStore 接口
* [LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore](./LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore) 数据访问层模块,集成EfCore
* [LINGYUN.Abp.LocalizationManagement.Application.Contracts](./LINGYUN.Abp.LocalizationManagement.Application.Contracts) 应用服务层公共模块,定义了管理本地化对象的外部接口、权限、功能限制策略
* [LINGYUN.Abp.LocalizationManagement.Application](./LINGYUN.Abp.LocalizationManagement.Application) 应用服务层实现,实现了本地化对象管理接口
* [LINGYUN.Abp.LocalizationManagement.HttpApi](./LINGYUN.Abp.LocalizationManagement.HttpApi) RestApi实现,实现了独立的对外RestApi接口
### 高阶模块
### 权限定义
* LocalizationManagement.Resource 授权对象是否允许访问资源
* LocalizationManagement.Resource.Create 授权对象是否允许创建资源
* LocalizationManagement.Resource.Update 授权对象是否允许修改资源
* LocalizationManagement.Resource.Delete 授权对象是否允许删除资源
* LocalizationManagement.Language 授权对象是否允许访问语言
* LocalizationManagement.Language.Create 授权对象是否允许创建语言
* LocalizationManagement.Language.Update 授权对象是否允许修改语言
* LocalizationManagement.Language.Delete 授权对象是否允许删除语言
* LocalizationManagement.Text 授权对象是否允许访问文档
* LocalizationManagement.Text.Create 授权对象是否允许创建文档
* LocalizationManagement.Text.Update 授权对象是否允许删除Oss对象
* LocalizationManagement.Text.Delete 授权对象是否允许下载Oss对象
### 功能定义
### 配置定义
## 更新日志

86
aspnet-core/modules/platform/LINGYUN.Platform.Domain/LINGYUN/Platform/PlatformDataSeedContributor.cs

@ -61,6 +61,8 @@ namespace LINGYUN.Platform
await SeedApiGatewayMenuAsync(layout, data); await SeedApiGatewayMenuAsync(layout, data);
// Oss对象管理菜单数据 // Oss对象管理菜单数据
await SeedOssManagementMenuAsync(layout, data); await SeedOssManagementMenuAsync(layout, data);
// 本地化管理菜单数据
await SeedLocalizationManagementMenuAsync(layout, data);
} }
} }
@ -775,6 +777,90 @@ namespace LINGYUN.Platform
new string[] { "admin" }); new string[] { "admin" });
} }
private async Task SeedLocalizationManagementMenuAsync(Layout layout, Data data)
{
var localizationManagementMenu = await SeedMenuAsync(
layout,
data,
"localization-management",
"/localization-management",
CodeNumberGenerator.CreateCode(9),
layout.Path,
"Manage Localization",
"/localization",
"Manage Localization",
null,
layout.TenantId,
new Dictionary<string, object>()
{
{ "title", "localization" },
{ "icon", "localization" },
{ "alwaysShow", true },
{ "roles", new string[] { "LocalizationManagement.Resource", "LocalizationManagement.Language", "LocalizationManagement.Text" } },
},
new string[] { "admin" });
await SeedMenuAsync(
layout,
data,
"resource",
"resource",
CodeNumberGenerator.AppendCode(localizationManagementMenu.Code, CodeNumberGenerator.CreateCode(1)),
"views/localization-management/resources/index.vue",
"Manage Resource",
"",
"Manage Resource",
localizationManagementMenu.Id,
localizationManagementMenu.TenantId,
new Dictionary<string, object>()
{
{ "title", "resource" },
{ "icon", "resource" },
{ "roles", new string[] { "LocalizationManagement.Resource" } }
},
new string[] { "admin" });
await SeedMenuAsync(
layout,
data,
"language",
"language",
CodeNumberGenerator.AppendCode(localizationManagementMenu.Code, CodeNumberGenerator.CreateCode(2)),
"views/localization-management/languages/index.vue",
"Manage Language",
"",
"Manage Language",
localizationManagementMenu.Id,
localizationManagementMenu.TenantId,
new Dictionary<string, object>()
{
{ "title", "language" },
{ "icon", "language" },
{ "roles", new string[] { "LocalizationManagement.Language" } }
},
new string[] { "admin" });
await SeedMenuAsync(
layout,
data,
"text",
"text",
CodeNumberGenerator.AppendCode(localizationManagementMenu.Code, CodeNumberGenerator.CreateCode(3)),
"views/localization-management/texts/index.vue",
"Manage Text",
"",
"Manage Text",
localizationManagementMenu.Id,
localizationManagementMenu.TenantId,
new Dictionary<string, object>()
{
{ "title", "text" },
{ "icon", "text" },
{ "roles", new string[] { "LocalizationManagement.Text" } }
},
new string[] { "admin" });
}
private async Task<Menu> SeedMenuAsync( private async Task<Menu> SeedMenuAsync(
Layout layout, Layout layout,
Data data, Data data,

8
aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/BackendAdminHostModule.cs

@ -5,6 +5,8 @@ using LINGYUN.Abp.EventBus.CAP;
using LINGYUN.Abp.ExceptionHandling; using LINGYUN.Abp.ExceptionHandling;
using LINGYUN.Abp.ExceptionHandling.Emailing; using LINGYUN.Abp.ExceptionHandling.Emailing;
using LINGYUN.Abp.FeatureManagement; using LINGYUN.Abp.FeatureManagement;
using LINGYUN.Abp.LocalizationManagement;
using LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore;
using LINGYUN.Abp.MessageService; using LINGYUN.Abp.MessageService;
using LINGYUN.Abp.MultiTenancy.DbFinder; using LINGYUN.Abp.MultiTenancy.DbFinder;
using LINGYUN.Abp.OssManagement; using LINGYUN.Abp.OssManagement;
@ -15,6 +17,7 @@ using LINGYUN.Abp.TenantManagement;
using LINGYUN.Abp.WeChat.SettingManagement; using LINGYUN.Abp.WeChat.SettingManagement;
using LINGYUN.ApiGateway; using LINGYUN.ApiGateway;
using LINGYUN.Platform; using LINGYUN.Platform;
using Localization.Resources.AbpUi;
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.DataProtection;
@ -62,6 +65,7 @@ using Volo.Abp.Security.Encryption;
using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.TenantManagement.EntityFrameworkCore; using Volo.Abp.TenantManagement.EntityFrameworkCore;
using Volo.Abp.Threading; using Volo.Abp.Threading;
using Volo.Abp.Validation.Localization;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
namespace LINGYUN.Abp.BackendAdmin namespace LINGYUN.Abp.BackendAdmin
@ -72,6 +76,7 @@ namespace LINGYUN.Abp.BackendAdmin
typeof(ApiGatewayApplicationContractsModule), typeof(ApiGatewayApplicationContractsModule),
typeof(AbpOssManagementApplicationContractsModule), typeof(AbpOssManagementApplicationContractsModule),
typeof(AbpMessageServiceApplicationContractsModule), typeof(AbpMessageServiceApplicationContractsModule),
typeof(AbpLocalizationManagementApplicationContractsModule),
typeof(LINGYUN.Abp.Account.AbpAccountApplicationContractsModule),// 引用类似的包主要用于聚合权限管理和设置 typeof(LINGYUN.Abp.Account.AbpAccountApplicationContractsModule),// 引用类似的包主要用于聚合权限管理和设置
typeof(LINGYUN.Abp.Identity.AbpIdentityApplicationContractsModule), typeof(LINGYUN.Abp.Identity.AbpIdentityApplicationContractsModule),
typeof(LINGYUN.Abp.IdentityServer.AbpIdentityServerApplicationContractsModule), typeof(LINGYUN.Abp.IdentityServer.AbpIdentityServerApplicationContractsModule),
@ -98,6 +103,7 @@ namespace LINGYUN.Abp.BackendAdmin
typeof(AbpPermissionManagementDomainIdentityServerModule), typeof(AbpPermissionManagementDomainIdentityServerModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule), typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpFeatureManagementEntityFrameworkCoreModule), typeof(AbpFeatureManagementEntityFrameworkCoreModule),
typeof(AbpLocalizationManagementEntityFrameworkCoreModule),
typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
typeof(AbpEmailingExceptionHandlingModule), typeof(AbpEmailingExceptionHandlingModule),
typeof(AbpCAPEventBusModule), typeof(AbpCAPEventBusModule),
@ -309,6 +315,8 @@ namespace LINGYUN.Abp.BackendAdmin
"vue-admin-element-ui", "vue-admin-element-ui",
new NameValue("zh-Hans", "zh"), new NameValue("zh-Hans", "zh"),
new NameValue("en", "en")); new NameValue("en", "en"));
options.Resources.AddDynamic();
}); });
Configure<AbpClaimsMapOptions>(options => Configure<AbpClaimsMapOptions>(options =>

3
aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/LINGYUN.Abp.BackendAdmin.HttpApi.Host.csproj

@ -66,7 +66,10 @@
<ProjectReference Include="..\..\..\modules\cloud-aliyun\LINGYUN.Abp.Aliyun.SettingManagement\LINGYUN.Abp.Aliyun.SettingManagement.csproj" /> <ProjectReference Include="..\..\..\modules\cloud-aliyun\LINGYUN.Abp.Aliyun.SettingManagement\LINGYUN.Abp.Aliyun.SettingManagement.csproj" />
<ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" /> <ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj" />
<ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" /> <ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj" />
<ProjectReference Include="..\..\..\modules\common\LINGYUN.Abp.Localization.Dynamic\LINGYUN.Abp.Localization.Dynamic.csproj" />
<ProjectReference Include="..\..\..\modules\features\LINGYUN.Abp.FeatureManagement.Client\LINGYUN.Abp.FeatureManagement.Client.csproj" /> <ProjectReference Include="..\..\..\modules\features\LINGYUN.Abp.FeatureManagement.Client\LINGYUN.Abp.FeatureManagement.Client.csproj" />
<ProjectReference Include="..\..\..\modules\lt\LINGYUN.Abp.LocalizationManagement.Application.Contracts\LINGYUN.Abp.LocalizationManagement.Application.Contracts.csproj" />
<ProjectReference Include="..\..\..\modules\lt\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\modules\oss-management\LINGYUN.Abp.OssManagement.Application.Contracts\LINGYUN.Abp.OssManagement.Application.Contracts.csproj" /> <ProjectReference Include="..\..\..\modules\oss-management\LINGYUN.Abp.OssManagement.Application.Contracts\LINGYUN.Abp.OssManagement.Application.Contracts.csproj" />
<ProjectReference Include="..\..\..\modules\identityServer\LINGYUN.Abp.IdentityServer.Application.Contracts\LINGYUN.Abp.IdentityServer.Application.Contracts.csproj" /> <ProjectReference Include="..\..\..\modules\identityServer\LINGYUN.Abp.IdentityServer.Application.Contracts\LINGYUN.Abp.IdentityServer.Application.Contracts.csproj" />
<ProjectReference Include="..\..\..\modules\identity\LINGYUN.Abp.Identity.Application.Contracts\LINGYUN.Abp.Identity.Application.Contracts.csproj" /> <ProjectReference Include="..\..\..\modules\identity\LINGYUN.Abp.Identity.Application.Contracts\LINGYUN.Abp.Identity.Application.Contracts.csproj" />

BIN
aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/event-bus-cap.db

Binary file not shown.

7
aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/AbpIdentityServerAdminHttpApiHostModule.cs

@ -2,8 +2,10 @@ using DotNetCore.CAP;
using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.EventBus.CAP;
using LINGYUN.Abp.ExceptionHandling; using LINGYUN.Abp.ExceptionHandling;
using LINGYUN.Abp.ExceptionHandling.Emailing; using LINGYUN.Abp.ExceptionHandling.Emailing;
using LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore;
using LINGYUN.Abp.MultiTenancy.DbFinder; using LINGYUN.Abp.MultiTenancy.DbFinder;
using LINGYUN.Abp.Sms.Aliyun; using LINGYUN.Abp.Sms.Aliyun;
using Localization.Resources.AbpUi;
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.DataProtection;
@ -33,6 +35,7 @@ using Volo.Abp.Domain.Entities.Events.Distributed;
using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.MySQL; using Volo.Abp.EntityFrameworkCore.MySQL;
using Volo.Abp.Identity.Localization; using Volo.Abp.Identity.Localization;
using Volo.Abp.IdentityServer.Localization;
using Volo.Abp.Json; using Volo.Abp.Json;
using Volo.Abp.Json.SystemTextJson; using Volo.Abp.Json.SystemTextJson;
using Volo.Abp.Localization; using Volo.Abp.Localization;
@ -44,6 +47,7 @@ using Volo.Abp.Security.Claims;
using Volo.Abp.Security.Encryption; using Volo.Abp.Security.Encryption;
using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.TenantManagement.EntityFrameworkCore; using Volo.Abp.TenantManagement.EntityFrameworkCore;
using Volo.Abp.Validation.Localization;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
namespace LINGYUN.Abp.IdentityServer4 namespace LINGYUN.Abp.IdentityServer4
@ -63,6 +67,7 @@ namespace LINGYUN.Abp.IdentityServer4
typeof(AbpTenantManagementEntityFrameworkCoreModule), typeof(AbpTenantManagementEntityFrameworkCoreModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule), typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule), typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpLocalizationManagementEntityFrameworkCoreModule),
typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
typeof(AbpEmailingExceptionHandlingModule), typeof(AbpEmailingExceptionHandlingModule),
typeof(AbpCAPEventBusModule), typeof(AbpCAPEventBusModule),
@ -274,6 +279,8 @@ namespace LINGYUN.Abp.IdentityServer4
options.Resources options.Resources
.Get<IdentityResource>() .Get<IdentityResource>()
.AddVirtualJson("/LINGYUN/Abp/IdentityServer4/Localization"); .AddVirtualJson("/LINGYUN/Abp/IdentityServer4/Localization");
options.Resources.AddDynamic(typeof(IdentityResource));
}); });
Configure<AbpClaimsMapOptions>(options => Configure<AbpClaimsMapOptions>(options =>

1
aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/LINGYUN.Abp.IdentityServer4.HttpApi.Host.csproj

@ -63,6 +63,7 @@
<ProjectReference Include="..\..\..\modules\identity\LINGYUN.Abp.Identity.Application\LINGYUN.Abp.Identity.Application.csproj" /> <ProjectReference Include="..\..\..\modules\identity\LINGYUN.Abp.Identity.Application\LINGYUN.Abp.Identity.Application.csproj" />
<ProjectReference Include="..\..\..\modules\identity\LINGYUN.Abp.Identity.EntityFrameworkCore\LINGYUN.Abp.Identity.EntityFrameworkCore.csproj" /> <ProjectReference Include="..\..\..\modules\identity\LINGYUN.Abp.Identity.EntityFrameworkCore\LINGYUN.Abp.Identity.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\modules\identity\LINGYUN.Abp.Identity.HttpApi\LINGYUN.Abp.Identity.HttpApi.csproj" /> <ProjectReference Include="..\..\..\modules\identity\LINGYUN.Abp.Identity.HttpApi\LINGYUN.Abp.Identity.HttpApi.csproj" />
<ProjectReference Include="..\..\..\modules\lt\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\modules\tenants\LINGYUN.Abp.MultiTenancy.DbFinder\LINGYUN.Abp.MultiTenancy.DbFinder.csproj" /> <ProjectReference Include="..\..\..\modules\tenants\LINGYUN.Abp.MultiTenancy.DbFinder\LINGYUN.Abp.MultiTenancy.DbFinder.csproj" />
</ItemGroup> </ItemGroup>

268
aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/AbpLocalizationManagementHttpApiHostModule.cs

@ -0,0 +1,268 @@
using DotNetCore.CAP;
using LINGYUN.Abp.EventBus.CAP;
using LINGYUN.Abp.ExceptionHandling;
using LINGYUN.Abp.ExceptionHandling.Emailing;
using LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore;
using LINGYUN.Abp.MultiTenancy.DbFinder;
using Localization.Resources.AbpUi;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.Extensions.Caching.StackExchangeRedis;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.OpenApi.Models;
using StackExchange.Redis;
using System;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Unicode;
using Volo.Abp;
using Volo.Abp.AspNetCore.Authentication.JwtBearer;
using Volo.Abp.AspNetCore.MultiTenancy;
using Volo.Abp.Autofac;
using Volo.Abp.Caching;
using Volo.Abp.Caching.StackExchangeRedis;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.MySQL;
using Volo.Abp.Json;
using Volo.Abp.Json.SystemTextJson;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.PermissionManagement.EntityFrameworkCore;
using Volo.Abp.Security.Encryption;
using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.TenantManagement.EntityFrameworkCore;
using Volo.Abp.Threading;
using Volo.Abp.Validation.Localization;
namespace LINGYUN.Abp.LocalizationManagement
{
[DependsOn(
typeof(AbpLocalizationManagementApplicationModule),
typeof(AbpLocalizationManagementHttpApiModule),
typeof(AbpLocalizationManagementEntityFrameworkCoreModule),
typeof(AbpAspNetCoreMultiTenancyModule),
typeof(AbpEntityFrameworkCoreMySQLModule),
typeof(AbpTenantManagementEntityFrameworkCoreModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpAspNetCoreAuthenticationJwtBearerModule),
typeof(AbpEmailingExceptionHandlingModule),
typeof(AbpCAPEventBusModule),
typeof(AbpDbFinderMultiTenancyModule),
typeof(AbpCachingStackExchangeRedisModule),
typeof(AbpAutofacModule)
)]
public class AbpLocalizationManagementHttpApiHostModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
PreConfigure<CapOptions>(options =>
{
options
.UseMySql(configuration.GetConnectionString("Default"))
.UseRabbitMQ(rabbitMQOptions =>
{
configuration.GetSection("CAP:RabbitMQ").Bind(rabbitMQOptions);
})
.UseDashboard();
});
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
var hostingEnvironment = context.Services.GetHostingEnvironment();
var configuration = context.Services.GetConfiguration();
// 配置Ef
Configure<AbpDbContextOptions>(options =>
{
options.UseMySQL();
});
// 解决某些不支持类型的序列化
Configure<AbpJsonOptions>(options =>
{
options.UseHybridSerializer = true;
});
// 中文序列化的编码问题
Configure<AbpSystemTextJsonSerializerOptions>(options =>
{
options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
});
// 加解密
Configure<AbpStringEncryptionOptions>(options =>
{
var encryptionConfiguration = configuration.GetSection("Encryption");
if (encryptionConfiguration.Exists())
{
options.DefaultPassPhrase = encryptionConfiguration["PassPhrase"] ?? options.DefaultPassPhrase;
options.DefaultSalt = encryptionConfiguration.GetSection("Salt").Exists()
? Encoding.ASCII.GetBytes(encryptionConfiguration["Salt"])
: options.DefaultSalt;
options.InitVectorBytes = encryptionConfiguration.GetSection("InitVector").Exists()
? Encoding.ASCII.GetBytes(encryptionConfiguration["InitVector"])
: options.InitVectorBytes;
}
});
// 自定义需要处理的异常
Configure<AbpExceptionHandlingOptions>(options =>
{
// 加入需要处理的异常类型
options.Handlers.Add<Volo.Abp.Data.AbpDbConcurrencyException>();
options.Handlers.Add<AbpInitializationException>();
options.Handlers.Add<ObjectDisposedException>();
options.Handlers.Add<StackOverflowException>();
options.Handlers.Add<OutOfMemoryException>();
options.Handlers.Add<System.Data.Common.DbException>();
options.Handlers.Add<Microsoft.EntityFrameworkCore.DbUpdateException>();
options.Handlers.Add<System.Data.DBConcurrencyException>();
});
// 自定义需要发送邮件通知的异常类型
Configure<AbpEmailExceptionHandlingOptions>(options =>
{
// 是否发送堆栈信息
options.SendStackTrace = true;
// 未指定异常接收者的默认接收邮件
// 指定自己的邮件地址
// options.DefaultReceiveEmail = "colin.in@foxmail.com";
});
Configure<AbpDistributedCacheOptions>(options =>
{
// 最好统一命名,不然某个缓存变动其他应用服务有例外发生
options.KeyPrefix = "LINGYUN.Abp.Application";
// 滑动过期30天
options.GlobalCacheEntryOptions.SlidingExpiration = TimeSpan.FromDays(30);
// 绝对过期60天
options.GlobalCacheEntryOptions.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(60);
});
Configure<RedisCacheOptions>(options =>
{
var redisConfig = ConfigurationOptions.Parse(options.Configuration);
options.ConfigurationOptions = redisConfig;
options.InstanceName = configuration["Redis:InstanceName"];
});
// 可以禁用多租户
Configure<AbpMultiTenancyOptions>(options =>
{
options.IsEnabled = false;
});
// 添加动态本地化组件
Configure<AbpLocalizationOptions>(options =>
{
options.Resources.AddDynamic();
});
// Swagger
context.Services.AddSwaggerGen(
options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "Localization Management API", Version = "v1" });
options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName);
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
Name = "Authorization",
In = ParameterLocation.Header,
Scheme = "bearer",
Type = SecuritySchemeType.Http,
BearerFormat = "JWT"
});
options.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }
},
new string[] { }
}
});
});
// 默认支持的本地化语言类型
Configure<AbpLocalizationOptions>(options =>
{
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
});
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = false;
options.Audience = configuration["AuthServer:ApiName"];
});
if (!hostingEnvironment.IsDevelopment())
{
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
context.Services
.AddDataProtection()
.PersistKeysToStackExchangeRedis(redis, "Localization-Management-Protection-Keys");
}
}
//public override void OnPostApplicationInitialization(ApplicationInitializationContext context)
//{
// // 注释代码取消启动时缓存本地化信息
// var initialize = context.ServiceProvider.GetRequiredService<ILocalizationCacheInitialize>();
// AsyncHelper.RunSync(async () => await initialize.InitializeAsync());
//}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
// http调用链
app.UseCorrelationId();
// 虚拟文件系统
app.UseVirtualFiles();
// 本地化
app.UseAbpRequestLocalization();
// 多租户
// app.UseMultiTenancy();
//路由
app.UseRouting();
// 认证
app.UseAuthentication();
// jwt
app.UseJwtTokenMiddleware();
// 授权
app.UseAuthorization();
// Swagger
app.UseSwagger();
// Swagger可视化界面
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support Localization Management API");
});
// 审计日志
app.UseAuditing();
// 路由
app.UseConfiguredEndpoints();
if (env.IsDevelopment())
{
AsyncHelper.RunSync(async () =>
await app.ApplicationServices.GetRequiredService<IDataSeeder>()
.SeedAsync());
}
}
}
}

13
aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/Dockerfile

@ -0,0 +1,13 @@
FROM mcr.microsoft.com/dotnet/aspnet:5.0
LABEL maintainer="colin.in@foxmail.com"
WORKDIR /app
COPY . /app
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone
EXPOSE 80/tcp
VOLUME [ "./app/Logs" ]
ENTRYPOINT ["dotnet", "LINGYUN.Abp.LocalizationManagement.HttpApi.Host.dll"]

22
aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/EntityFrameworkCore/LocalizationManagementHttpApiHostMigrationsDbContext.cs

@ -0,0 +1,22 @@
using Microsoft.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore
{
public class LocalizationManagementHttpApiHostMigrationsDbContext : AbpDbContext<LocalizationManagementHttpApiHostMigrationsDbContext>
{
public LocalizationManagementHttpApiHostMigrationsDbContext(
DbContextOptions<LocalizationManagementHttpApiHostMigrationsDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ConfigureLocalization();
}
}
}

30
aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/EntityFrameworkCore/LocalizationManagementHttpApiHostMigrationsDbContextFactory.cs

@ -0,0 +1,30 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using System.IO;
namespace LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore
{
public class LocalizationManagementHttpApiHostMigrationsDbContextFactory : IDesignTimeDbContextFactory<LocalizationManagementHttpApiHostMigrationsDbContext>
{
public LocalizationManagementHttpApiHostMigrationsDbContext CreateDbContext(string[] args)
{
var configuration = BuildConfiguration();
var connectionString = configuration.GetConnectionString("Default");
var builder = new DbContextOptionsBuilder<LocalizationManagementHttpApiHostMigrationsDbContext>()
.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString));
return new LocalizationManagementHttpApiHostMigrationsDbContext(builder.Options);
}
private static IConfigurationRoot BuildConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.Development.json", optional: false);
return builder.Build();
}
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save