Browse Source

upgrade: upgrade abp framework to 7.0.2

pull/787/head 7.0.1
cKey 3 years ago
parent
commit
646845c77e
  1. 2
      .github/workflows/release.yml
  2. 46
      apps/vue/src/api/text-templating/contents/index.ts
  3. 19
      apps/vue/src/api/text-templating/contents/model/index.ts
  4. 67
      apps/vue/src/api/text-templating/definitions/index.ts
  5. 30
      apps/vue/src/api/text-templating/definitions/model/index.ts
  6. 63
      apps/vue/src/api/text-templating/templates/index.ts
  7. 34
      apps/vue/src/api/text-templating/templates/model/index.ts
  8. 16
      apps/vue/src/views/text-templating/templates/components/TemplateContentCultureModal.vue
  9. 13
      apps/vue/src/views/text-templating/templates/components/TemplateContentModal.vue
  10. 111
      apps/vue/src/views/text-templating/templates/components/TemplateDefinitionTable.vue
  11. 71
      apps/vue/src/views/text-templating/templates/components/TemplateTable.vue
  12. 32
      apps/vue/src/views/text-templating/templates/datas/ModalData.ts
  13. 36
      apps/vue/src/views/text-templating/templates/datas/TableData.ts
  14. 8
      apps/vue/src/views/text-templating/templates/index.vue
  15. 7
      aspnet-core/Directory.Build.props
  16. 20
      aspnet-core/LINGYUN.MicroService.All.sln
  17. 2
      aspnet-core/common.props
  18. 2
      aspnet-core/migrations/LY.MicroService.AuthServer.EntityFrameworkCore/LY.MicroService.AuthServer.EntityFrameworkCore.csproj
  19. 2
      aspnet-core/migrations/LY.MicroService.BackendAdmin.EntityFrameworkCore/LY.MicroService.BackendAdmin.EntityFrameworkCore.csproj
  20. 578
      aspnet-core/migrations/LY.MicroService.BackendAdmin.EntityFrameworkCore/Migrations/20230304062910_Add-Text-Template-Definition.Designer.cs
  21. 50
      aspnet-core/migrations/LY.MicroService.BackendAdmin.EntityFrameworkCore/Migrations/20230304062910_Add-Text-Template-Definition.cs
  22. 581
      aspnet-core/migrations/LY.MicroService.BackendAdmin.EntityFrameworkCore/Migrations/20230304083526_Add-IsStatic-Field.Designer.cs
  23. 29
      aspnet-core/migrations/LY.MicroService.BackendAdmin.EntityFrameworkCore/Migrations/20230304083526_Add-IsStatic-Field.cs
  24. 59
      aspnet-core/migrations/LY.MicroService.BackendAdmin.EntityFrameworkCore/Migrations/BackendAdminMigrationsDbContextModelSnapshot.cs
  25. 2
      aspnet-core/migrations/LY.MicroService.IdentityServer.EntityFrameworkCore/LY.MicroService.IdentityServer.EntityFrameworkCore.csproj
  26. 30
      aspnet-core/migrations/LY.MicroService.LocalizationManagement.EntityFrameworkCore/FodyWeavers.xsd
  27. 5
      aspnet-core/migrations/LY.MicroService.LocalizationManagement.EntityFrameworkCore/LY.MicroService.LocalizationManagement.EntityFrameworkCore.csproj
  28. 30
      aspnet-core/migrations/LY.MicroService.Platform.EntityFrameworkCore/FodyWeavers.xsd
  29. 5
      aspnet-core/migrations/LY.MicroService.Platform.EntityFrameworkCore/LY.MicroService.Platform.EntityFrameworkCore.csproj
  30. 30
      aspnet-core/migrations/LY.MicroService.RealtimeMessage.EntityFrameworkCore/FodyWeavers.xsd
  31. 5
      aspnet-core/migrations/LY.MicroService.RealtimeMessage.EntityFrameworkCore/LY.MicroService.RealtimeMessage.EntityFrameworkCore.csproj
  32. 2
      aspnet-core/migrations/LY.MicroService.TaskManagement.EntityFrameworkCore/LY.MicroService.TaskManagement.EntityFrameworkCore.csproj
  33. 2
      aspnet-core/migrations/LY.MicroService.WebhooksManagement.EntityFrameworkCore/LY.MicroService.WebhooksManagement.EntityFrameworkCore.csproj
  34. 2
      aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/AuditLogInfoToAuditLogConverter.cs
  35. 2
      aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/ElasticsearchAuditLogManager.cs
  36. 8
      aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/AuditLog.cs
  37. 2
      aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/AuditingStore.cs
  38. 2
      aspnet-core/modules/authorization/LINGYUN.Abp.Identity.OrganizaztionUnits/LINGYUN/Abp/Identity/OrganizaztionUnits/OrganizationUnitClaimsPrincipalContributor.cs
  39. 2
      aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN.Abp.Cli.csproj
  40. 26
      aspnet-core/modules/common/LINGYUN.Abp.ExceptionHandling/LINGYUN/Abp/ExceptionHandling/AbpExceptionSubscriberBase.cs
  41. 56
      aspnet-core/modules/common/LINGYUN.Abp.Features.LimitValidation/LINGYUN/Abp/Features/LimitValidation/AbpFeaturesLimitValidationOptions.cs
  42. 17
      aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs
  43. 11
      aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/Hubs/NotificationsHub.cs
  44. 4
      aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/Localization/Resources/en.json
  45. 4
      aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/Localization/Resources/zh-Hans.json
  46. 21
      aspnet-core/modules/elsa/LINGYUN.Abp.Elsa/LINGYUN/Abp/Elsa/Scripting/JavaScript/ConfigureJavaScriptEngine.cs
  47. 11
      aspnet-core/modules/localization/LINGYUN.Abp.Localization.Persistence/LINGYUN/Abp/Localization/Persistence/StaticLocalizationSaverHostService.cs
  48. 22
      aspnet-core/modules/mvc/LINGYUN.Abp.AspNetCore.Mvc.Wrapper/LINGYUN/Abp/AspNetCore/Mvc/Wrapper/AbpAspNetCoreMvcWrapperModule.cs
  49. 17
      aspnet-core/modules/mvc/LINGYUN.Abp.AspNetCore.Mvc.Wrapper/README.md
  50. 118
      aspnet-core/modules/notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/AbpNotificationsDomainModule.cs
  51. 8
      aspnet-core/modules/notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/DynamicNotificationDefinitionInMemoryCache.cs
  52. 93
      aspnet-core/modules/notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/NotificationDefinitionInitializer.cs
  53. 39
      aspnet-core/modules/notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/NotificationTypeConverter.cs
  54. 3
      aspnet-core/modules/platform/LINGYUN.Platform.Domain/LINGYUN/Platform/Packages/FileSystemPackageBlobNormalizer.cs
  55. 3
      aspnet-core/modules/platform/LINGYUN.Platform.Domain/LINGYUN/Platform/Packages/PackageBlobManager.cs
  56. 18
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/ITextTemplateAppService.cs
  57. 13
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/ITextTemplateContentAppService.cs
  58. 18
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/ITextTemplateDefinitionAppService.cs
  59. 12
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/Permissions/AbpTextTemplatingPermissionDefinitionProvider.cs
  60. 11
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/Permissions/AbpTextTemplatingPermissions.cs
  61. 6
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateContentUpdateDto.cs
  62. 11
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionCreateDto.cs
  63. 24
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionCreateOrUpdateDto.cs
  64. 8
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionDto.cs
  65. 7
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionUpdateDto.cs
  66. 7
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateRestoreInput.cs
  67. 4
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN.Abp.TextTemplating.Application.csproj
  68. 1
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/AbpTextTemplatingApplicationAutoMapperProfile.cs
  69. 174
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/TextTemplateAppService.cs
  70. 127
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/TextTemplateContentAppService.cs
  71. 257
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionAppService.cs
  72. 17
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/AbpTextTemplatingErrorCodes.cs
  73. 15
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/en.json
  74. 15
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/zh-Hans.json
  75. 9
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionConsts.cs
  76. 5
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN.Abp.TextTemplating.Domain.csproj
  77. 29
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/AbpTextTemplatingCachingOptions.cs
  78. 38
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/AbpTextTemplatingDomainModule.cs
  79. 7
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/IStaticTemplateDefinitionSaver.cs
  80. 24
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/ITemplateDefinitionStore.cs
  81. 24
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/ITemplateDefinitionStoreCache.cs
  82. 24
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/ITextTemplateDefinitionRepository.cs
  83. 12
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/ITextTemplateDefinitionSerializer.cs
  84. 86
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/InMemoryTemplateDefinitionStoreCache.cs
  85. 96
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/StaticTemplateDefinitionSaver.cs
  86. 5
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TemplateContentCacheItem.cs
  87. 209
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TemplateDefinitionStore.cs
  88. 37
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TextTemplateContentProvider.cs
  89. 41
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TextTemplateDefinition.cs
  90. 113
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionInitializer.cs
  91. 57
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TextTemplateRenderer.cs
  92. 28
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/AbpTextTemplatingDbContextModelCreatingExtensions.cs
  93. 1
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/AbpTextTemplatingEntityFrameworkCoreModule.cs
  94. 55
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/EfCoreTextTemplateDefinitionRepository.cs
  95. 2
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/ITextTemplatingDbContext.cs
  96. 2
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/TextTemplatingDbContext.cs
  97. 45
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.HttpApi/LINGYUN/Abp/TextTemplating/TextTemplateContentController.cs
  98. 59
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.HttpApi/LINGYUN/Abp/TextTemplating/TextTemplateController.cs
  99. 58
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.HttpApi/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionController.cs
  100. 3
      aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Razor/FodyWeavers.xml

2
.github/workflows/release.yml

@ -2,7 +2,7 @@ name: "Tagged Release"
on:
push:
branches: [ master ]
branches: [ rel-7.0.2 ]
jobs:
tagged-release:

46
apps/vue/src/api/text-templating/contents/index.ts

@ -0,0 +1,46 @@
import { defAbpHttp } from '/@/utils/http/abp';
import {
TextTemplateContentDto,
TextTemplateContentGetInput,
TextTemplateRestoreInput,
TextTemplateContentUpdateDto
} from './model';
const remoteServiceName = 'AbpTextTemplating';
const controllerName = 'TextTemplate';
export const GetAsyncByInput = (input: TextTemplateContentGetInput) => {
return defAbpHttp.request<TextTemplateContentDto>({
service: remoteServiceName,
controller: controllerName,
action: 'GetAsync',
uniqueName: 'GetAsyncByInput',
params: input,
});
};
export const RestoreToDefaultAsyncByNameAndInput = (name: string, input: TextTemplateRestoreInput) => {
return defAbpHttp.request<void>({
service: remoteServiceName,
controller: controllerName,
action: 'RestoreToDefaultAsync',
uniqueName: 'RestoreToDefaultAsyncByNameAndInput',
params: {
name: name,
},
data: input,
});
};
export const UpdateAsyncByNameAndInput = (name: string, input: TextTemplateContentUpdateDto) => {
return defAbpHttp.request<TextTemplateContentDto>({
service: remoteServiceName,
controller: controllerName,
action: 'UpdateAsync',
uniqueName: 'UpdateAsyncByNameAndInput',
params: {
name: name,
},
data: input,
});
};

19
apps/vue/src/api/text-templating/contents/model/index.ts

@ -0,0 +1,19 @@
export interface TextTemplateContentDto {
name: string;
content?: string;
culture?: string;
}
export interface TextTemplateContentGetInput {
name: string;
culture?: string;
}
export interface TextTemplateRestoreInput {
culture?: string;
}
export interface TextTemplateContentUpdateDto {
culture?: string;
content: string;
}

67
apps/vue/src/api/text-templating/definitions/index.ts

@ -0,0 +1,67 @@
import { defAbpHttp } from '/@/utils/http/abp';
import {
TextTemplateDefinitionDto,
TextTemplateDefinitionCreateDto,
TextTemplateDefinitionUpdateDto,
TextTemplateDefinitionGetListInput
} from './model';
const remoteServiceName = 'AbpTextTemplating';
const controllerName = 'TextTemplateDefinition';
export const CreateAsyncByInput = (input: TextTemplateDefinitionCreateDto) => {
return defAbpHttp.request<TextTemplateDefinitionDto>({
service: remoteServiceName,
controller: controllerName,
action: 'CreateAsync',
uniqueName: 'CreateAsyncByInput',
params: input,
});
};
export const DeleteAsyncByName = (name: string) => {
return defAbpHttp.request<void>({
service: remoteServiceName,
controller: controllerName,
action: 'DeleteAsync',
uniqueName: 'DeleteAsyncByName',
params: {
name: name,
},
});
};
export const GetByNameAsyncByName = (name: string) => {
return defAbpHttp.request<TextTemplateDefinitionDto>({
service: remoteServiceName,
controller: controllerName,
action: 'GetByNameAsync',
uniqueName: 'GetByNameAsyncByName',
params: {
name: name,
},
});
};
export const GetListAsyncByInput = (input: TextTemplateDefinitionGetListInput) => {
return defAbpHttp.request<PagedResultDto<TextTemplateDefinitionDto>>({
service: remoteServiceName,
controller: controllerName,
action: 'GetListAsync',
uniqueName: 'GetListAsyncByInput',
params: input,
});
};
export const UpdateAsyncByNameAndInput = (name: string, input: TextTemplateDefinitionUpdateDto) => {
return defAbpHttp.request<TextTemplateDefinitionDto>({
service: remoteServiceName,
controller: controllerName,
action: 'UpdateAsync',
uniqueName: 'UpdateAsyncByNameAndInput',
params: {
name: name,
},
data: input,
});
};

30
apps/vue/src/api/text-templating/definitions/model/index.ts

@ -0,0 +1,30 @@
export interface TextTemplateDefinitionDto {
name: string;
displayName: string;
defaultCultureName?: string;
isInlineLocalized: boolean;
isLayout: boolean;
layout: string;
isStatic: boolean;
renderEngine?: string;
}
interface TextTemplateDefinitionCreateOrUpdateDto {
displayName: string;
defaultCultureName?: string;
isInlineLocalized: boolean;
isLayout: boolean;
layout: string;
isStatic: boolean;
renderEngine?: string;
}
export interface TextTemplateDefinitionCreateDto extends TextTemplateDefinitionCreateOrUpdateDto {
name: string;
}
export interface TextTemplateDefinitionUpdateDto extends TextTemplateDefinitionCreateOrUpdateDto, IHasConcurrencyStamp { }
export interface TextTemplateDefinitionGetListInput extends PagedAndSortedResultRequestDto {
filter?: string;
}

63
apps/vue/src/api/text-templating/templates/index.ts

@ -1,63 +0,0 @@
import { defAbpHttp } from '/@/utils/http/abp';
import {
TextTemplateDefinition,
TextTemplateContent,
TextTemplateContentGetInput,
TextTemplateUpdateInput,
TextTemplateRestoreInput,
TextTemplateDefinitionGetListInput,
} from './model';
const remoteServiceName = 'AbpTextTemplating';
const controllerName = 'TextTemplate';
export const get = (name: string) => {
return defAbpHttp.request<TextTemplateDefinition>({
service: remoteServiceName,
controller: controllerName,
action: 'GetAsync',
params: {
name: name,
},
});
};
export const getContent = (input: TextTemplateContentGetInput) => {
return defAbpHttp.request<TextTemplateContent>({
service: remoteServiceName,
controller: controllerName,
action: 'GetContentAsync',
params: {
input: input,
},
});
}
export const getList = (input: TextTemplateDefinitionGetListInput) => {
return defAbpHttp.request<PagedResultDto<TextTemplateDefinition>>({
service: remoteServiceName,
controller: controllerName,
action: 'GetListAsync',
params: {
input: input,
},
});
};
export const restoreToDefault = (input: TextTemplateRestoreInput) => {
return defAbpHttp.request<void>({
service: remoteServiceName,
controller: controllerName,
action: 'RestoreToDefaultAsync',
data: input,
});
};
export const update = (input: TextTemplateUpdateInput) => {
return defAbpHttp.request<TextTemplateDefinition>({
service: remoteServiceName,
controller: controllerName,
action: 'UpdateAsync',
data: input,
});
};

34
apps/vue/src/api/text-templating/templates/model/index.ts

@ -1,34 +0,0 @@
export interface TextTemplateDefinition {
name: string;
displayName: string;
defaultCultureName?: string;
isInlineLocalized: boolean;
isLayout: boolean;
layout?: string;
}
export interface TextTemplateContent {
name: string;
content?: string;
culture?: string;
}
export interface TextTemplateContentGetInput {
name: string;
culture?: string;
}
export interface TextTemplateRestoreInput {
name: string;
culture?: string;
}
export interface TextTemplateUpdateInput {
name: string;
culture?: string;
content: string;
}
export interface TextTemplateDefinitionGetListInput extends PagedAndSortedResultRequestDto {
filter?: string;
}

16
apps/vue/src/views/text-templating/templates/components/TemplateContentCultureModal.vue

@ -23,15 +23,15 @@
import { BasicModal, useModalInner } from '/@/components/Modal';
import { useMessage } from '/@/hooks/web/useMessage';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { TextTemplateDefinition } from '/@/api/text-templating/templates/model';
import { getContent, restoreToDefault, update } from '/@/api/text-templating/templates';
import { TextTemplateDefinitionDto } from '/@/api/text-templating/definitions/model';
import { GetAsyncByInput, RestoreToDefaultAsyncByNameAndInput, UpdateAsyncByNameAndInput } from '/@/api/text-templating/contents';
import { useAbpStoreWithOut } from '/@/store/modules/abp';
const abpStore = useAbpStoreWithOut();
const { L } = useLocalization('AbpTextTemplating');
const { createConfirm, createMessage } = useMessage();
const { localization } = abpStore.getApplication;
const textTemplateRef = ref<TextTemplateDefinition>();
const textTemplateRef = ref<TextTemplateDefinitionDto>();
const buttonEnabled = computed(() => {
const textTemplate = unref(textTemplateRef);
if (textTemplate && textTemplate.name) {
@ -118,7 +118,7 @@
});
function fetchDefaultContent(name: string) {
getContent({
GetAsyncByInput({
name: name,
culture: localization.currentCulture.name,
}).then((res) => {
@ -130,7 +130,7 @@
}
function handleCultureChange(setField: string, selectedValue: string) {
getContent({
GetAsyncByInput({
name: textTemplateRef.value!.name,
culture: selectedValue,
}).then((res) => {
@ -150,8 +150,7 @@
onOk: () => {
return new Promise((resolve, reject) => {
const textTemplate = unref(textTemplateRef);
restoreToDefault({
name: textTemplate!.name,
RestoreToDefaultAsyncByNameAndInput(textTemplate!.name, {
culture: input.baseCultureName,
}).then(() => {
createMessage.success(L('TemplateContentRestoredToDefault'));
@ -170,8 +169,7 @@
validateFields(['targetCultureName', 'targetContent']).then((input) => {
changeOkLoading(true);
const textTemplate = unref(textTemplateRef);
update({
name: textTemplate!.name,
UpdateAsyncByNameAndInput(textTemplate!.name, {
culture: input.targetCultureName,
content: input.targetContent,
}).then(() => {

13
apps/vue/src/views/text-templating/templates/components/TemplateContentModal.vue

@ -33,13 +33,13 @@
import { BasicModal, useModal, useModalInner } from '/@/components/Modal';
import { useMessage } from '/@/hooks/web/useMessage';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { TextTemplateDefinition } from '/@/api/text-templating/templates/model';
import { getContent, restoreToDefault, update } from '/@/api/text-templating/templates';
import { TextTemplateDefinitionDto } from '/@/api/text-templating/definitions/model';
import { GetAsyncByInput, RestoreToDefaultAsyncByNameAndInput, UpdateAsyncByNameAndInput } from '/@/api/text-templating/contents';
import TemplateContentCultureModal from './TemplateContentCultureModal.vue';
const { L } = useLocalization('AbpTextTemplating');
const { createConfirm, createMessage } = useMessage();
const textTemplateRef = ref<TextTemplateDefinition>();
const textTemplateRef = ref<TextTemplateDefinitionDto>();
const buttonEnabled = computed(() => {
const textTemplate = unref(textTemplateRef);
if (textTemplate && textTemplate.name) {
@ -85,7 +85,7 @@
const [registerCultureModal, { openModal: openCultureModal }] = useModal();
function fetchContent(name: string) {
getContent({
GetAsyncByInput({
name: name,
}).then((res) => {
setFieldsValue(res);
@ -104,7 +104,7 @@
onOk: () => {
return new Promise((resolve, reject) => {
const textTemplate = unref(textTemplateRef);
restoreToDefault({ name: textTemplate!.name }).then(() => {
RestoreToDefaultAsyncByNameAndInput(textTemplate!.name, { }).then(() => {
createMessage.success(L('TemplateContentRestoredToDefault'));
fetchContent(textTemplate!.name);
return resolve(textTemplate!.name);
@ -120,8 +120,7 @@
validate().then((input) => {
changeOkLoading(true);
const textTemplate = unref(textTemplateRef);
update({
name: textTemplate!.name,
UpdateAsyncByNameAndInput(textTemplate!.name, {
content: input.content,
}).then(() => {
createMessage.success(L('TemplateContentUpdated'));

111
apps/vue/src/views/text-templating/templates/components/TemplateDefinitionTable.vue

@ -0,0 +1,111 @@
<template>
<div>
<BasicTable @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'isStatic'">
<CheckOutlined v-if="record.isStatic" class="enable" />
<CloseOutlined v-else class="disable" />
</template>
<template v-else-if="column.key === 'isInlineLocalized'">
<CheckOutlined v-if="record.isInlineLocalized" class="enable" />
<CloseOutlined v-else class="disable" />
</template>
<template v-else-if="column.key === 'isLayout'">
<CheckOutlined v-if="record.isLayout" class="enable" />
<CloseOutlined v-else class="disable" />
</template>
<template v-else-if="column.key === 'action'">
<TableAction
v-auth="['AbpTextTemplating.TextTemplateDefinitions', 'AbpTextTemplating.TextTemplateDefinitions.Delete']"
:stop-button-propagation="true"
:actions="[
{
auth: 'AbpTextTemplating.TextTemplateDefinitions.Update',
label: L('Update'),
icon: 'ant-design:edit-outlined',
onClick: handleEdit.bind(null, record),
},
{
auth: 'AbpTextTemplating.TextTemplateDefinitions.Delete',
label: L('Delete'),
color: 'error',
icon: 'ant-design:delete-outlined',
onClick: handleDelete.bind(null, record),
},
]"
:dropDownActions="[
{
auth: 'AbpTextTemplating.TextTemplateContent.Update',
label: L('EditContents'),
icon: 'ant-design:edit-outlined',
onClick: handleEditContent.bind(null, record),
},
]"
/>
</template>
</template>
</BasicTable>
<TemplateContentModal @register="registerModal" />
</div>
</template>
<script lang="ts" setup>
import { CheckOutlined, CloseOutlined } from '@ant-design/icons-vue';
import { useModal } from '/@/components/Modal';
import { BasicTable, TableAction, useTable } from '/@/components/Table';
import { getDataColumns } from '../datas/TableData';
import { getSearchFormSchemas } from '../datas/ModalData';
import { useMessage } from '/@/hooks/web/useMessage';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { GetListAsyncByInput, DeleteAsyncByName } from '/@/api/text-templating/definitions';
import { TextTemplateDefinitionDto } from '/@/api/text-templating/definitions/model';
import { formatPagedRequest } from '/@/utils/http/abp/helper';
import TemplateContentModal from './TemplateContentModal.vue';
const { L } = useLocalization(['AbpTextTemplating', 'AbpUi']);
const { createConfirm, createMessage } = useMessage();
const [registerModal, { openModal }] = useModal();
const [registerTable, { reload }] = useTable({
rowKey: 'name',
title: L('TextTemplates'),
columns: getDataColumns(),
api: GetListAsyncByInput,
beforeFetch: formatPagedRequest,
pagination: true,
striped: false,
useSearchForm: true,
formConfig: getSearchFormSchemas(),
showIndexColumn: false,
showTableSetting: true,
bordered: true,
canResize: true,
immediate: true,
actionColumn: {
width: 150,
title: L('Actions'),
dataIndex: 'action',
},
});
function handleEdit(record: TextTemplateDefinitionDto) {
console.log('This method is not implemented', record);
}
function handleEditContent(record: TextTemplateDefinitionDto) {
openModal(true, record);
}
function handleDelete(record: TextTemplateDefinitionDto) {
createConfirm({
iconType: 'warning',
title: L('AreYouSure'),
content: record.isStatic ? L('RestoreTemplateToDefaultMessage') : L('ItemWillBeDeletedMessage'),
onOk: () => {
return DeleteAsyncByName(record.name).then(() => {
createMessage.success(record.isStatic ? L('TemplateUpdated') : L('SuccessfullyDeleted'));
reload();
});
},
});
}
</script>

71
apps/vue/src/views/text-templating/templates/components/TemplateTable.vue

@ -1,71 +0,0 @@
<template>
<div>
<BasicTable @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'isInlineLocalized'">
<!-- <Switch readonly :checked="record.isInlineLocalized" /> -->
<CheckOutlined v-if="record.isInlineLocalized" class="enable" />
<CloseOutlined v-else class="disable" />
</template>
<template v-else-if="column.key === 'isLayout'">
<!-- <Switch readonly :checked="record.isLayout" /> -->
<CheckOutlined v-if="record.isLayout" class="enable" />
<CloseOutlined v-else class="disable" />
</template>
<template v-else-if="column.key === 'action'">
<TableAction
:stop-button-propagation="true"
:actions="[
{
label: L('EditContents'),
icon: 'ant-design:edit-outlined',
onClick: handleEditContent.bind(null, record),
},
]"
/>
</template>
</template>
</BasicTable>
<TemplateContentModal @register="registerModal" />
</div>
</template>
<script lang="ts" setup>
import { CheckOutlined, CloseOutlined } from '@ant-design/icons-vue';
import { useModal } from '/@/components/Modal';
import { BasicTable, TableAction, useTable } from '/@/components/Table';
import { getDataColumns } from '../datas/TableData';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { getList } from '/@/api/text-templating/templates';
import { TextTemplateDefinition } from '/@/api/text-templating/templates/model';
import { formatPagedRequest } from '/@/utils/http/abp/helper';
import TemplateContentModal from './TemplateContentModal.vue';
const { L } = useLocalization('AbpTextTemplating');
const [registerModal, { openModal }] = useModal();
const [registerTable] = useTable({
rowKey: 'id',
title: L('TextTemplates'),
columns: getDataColumns(),
api: getList,
beforeFetch: formatPagedRequest,
pagination: true,
striped: false,
useSearchForm: false,
showIndexColumn: false,
showTableSetting: true,
bordered: true,
canResize: true,
immediate: true,
actionColumn: {
width: 150,
title: L('Actions'),
dataIndex: 'action',
},
});
function handleEditContent(record: TextTemplateDefinition) {
openModal(true, record);
}
</script>

32
apps/vue/src/views/text-templating/templates/datas/ModalData.ts

@ -1,32 +1,30 @@
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { FormProps } from '/@/components/Form';
import { NotificationReadState } from '/@/api/messages/model/notificationsModel';
import { FormProps, FormSchema } from '/@/components/Form';
const { L } = useLocalization(['AbpMessageService', 'AbpUi']);
const { L } = useLocalization(['AbpTextTemplating', 'AbpUi']);
export function getSearchFormSchemas(): Partial<FormProps> {
return {
labelWidth: 100,
schemas: [
{
field: 'readState',
component: 'Select',
label: L('Notifications:State'),
colProps: { span: 8 },
defaultValue: NotificationReadState.UnRead,
componentProps: {
options: [
{ label: L('Read'), value: NotificationReadState.Read, },
{ label: L('UnRead'), value: NotificationReadState.UnRead, },
],
},
},
{
field: 'filter',
component: 'Input',
label: L('Search'),
colProps: { span: 16 },
colProps: { span: 24 },
},
],
};
}
export function getModalFormSchemas(): FormSchema[] {
return [
{
field: 'name',
component: 'Input',
label: L('DisplayName:Name'),
colProps: { span: 24 },
required: true,
},
];
}

36
apps/vue/src/views/text-templating/templates/datas/TableData.ts

@ -1,17 +1,37 @@
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { BasicColumn } from '/@/components/Table';
const { L } = useLocalization('AbpTextTemplating');
const { L } = useLocalization(['AbpTextTemplating']);
export function getDataColumns(): BasicColumn[] {
return [
{
title: L('DisplayName:Name'),
dataIndex: 'name',
align: 'left',
width: 100,
sorter: true,
ellipsis: true,
defaultHidden: true,
resizable: true,
},
{
title: L('DisplayName:DisplayName'),
dataIndex: 'displayName',
align: 'left',
width: 200,
sorter: true,
ellipsis: true,
resizable: true,
},
{
title: L('DisplayName:IsStatic'),
dataIndex: 'isStatic',
align: 'center',
width: 150,
sorter: true,
ellipsis: true,
resizable: true,
},
{
title: L('DisplayName:IsInlineLocalized'),
@ -20,6 +40,7 @@ export function getDataColumns(): BasicColumn[] {
width: 150,
sorter: true,
ellipsis: true,
resizable: true,
},
{
title: L('DisplayName:IsLayout'),
@ -28,6 +49,7 @@ export function getDataColumns(): BasicColumn[] {
width: 150,
sorter: true,
ellipsis: true,
resizable: true,
},
{
title: L('Layout'),
@ -36,6 +58,7 @@ export function getDataColumns(): BasicColumn[] {
width: 200,
sorter: true,
ellipsis: true,
resizable: true,
},
{
title: L('DisplayName:DefaultCultureName'),
@ -44,6 +67,17 @@ export function getDataColumns(): BasicColumn[] {
width: 200,
sorter: true,
ellipsis: true,
resizable: true,
},
{
title: L('DisplayName:RenderEngine'),
dataIndex: 'renderEngine',
align: 'left',
width: 150,
sorter: true,
ellipsis: true,
resizable: true,
defaultHidden: true,
},
];
}

8
apps/vue/src/views/text-templating/templates/index.vue

@ -1,13 +1,13 @@
<template>
<TemplateTable />
<TemplateDefinitionTable />
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import TemplateTable from './components/TemplateTable.vue';
import TemplateDefinitionTable from './components/TemplateDefinitionTable.vue';
export default defineComponent({
name: 'Templates',
components: { TemplateTable },
name: 'TemplateDefinitions',
components: { TemplateDefinitionTable },
});
</script>

7
aspnet-core/Directory.Build.props

@ -1,9 +1,9 @@
<Project>
<PropertyGroup>
<VoloAbpPackageVersion>7.0.1</VoloAbpPackageVersion>
<VoloAbpPackageVersion>7.0.2</VoloAbpPackageVersion>
<VoloAbpLeptonXThemePackageVersion>2.0.1</VoloAbpLeptonXThemePackageVersion>
<LINGYUNAbpPackageVersion>7.0.1</LINGYUNAbpPackageVersion>
<DaprPackageVersion>1.9.0</DaprPackageVersion>
<LINGYUNAbpPackageVersion>7.0.2</LINGYUNAbpPackageVersion>
<DaprPackageVersion>1.10.0</DaprPackageVersion>
<DistributedLockRedisPackageVersion>1.0.2</DistributedLockRedisPackageVersion>
<DotNetCoreCAPPackageVersion>7.0.2</DotNetCoreCAPPackageVersion>
<ElsaPackageVersion>2.10.1</ElsaPackageVersion>
@ -36,6 +36,7 @@
<SwashbuckleAspNetCorePackageVersion>6.1.5</SwashbuckleAspNetCorePackageVersion>
<PollyPackageVersion>7.2.3</PollyPackageVersion>
<MicrosoftPackageVersion>7.0.*</MicrosoftPackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>7.0.2</MicrosoftEntityFrameworkCorePackageVersion>
<XunitTestPackageVersion>2.4.1</XunitTestPackageVersion>
<ShouldlyPackageVersion>3.0.2</ShouldlyPackageVersion>
<NSubstitutePackageVersion>4.2.1</NSubstitutePackageVersion>

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

@ -562,11 +562,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LY.MicroService.AuthServer.
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LY.MicroService.IdentityServer.EntityFrameworkCore", "migrations\LY.MicroService.IdentityServer.EntityFrameworkCore\LY.MicroService.IdentityServer.EntityFrameworkCore.csproj", "{F74D8A4E-737F-4144-94BF-9EE80AFC8E9B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LY.MicroService.LocalizationManagement.EntityFrameworkCore", "migrations\LY.MicroService.LocalizationManagement.EntityFrameworkCore\LY.MicroService.LocalizationManagement.EntityFrameworkCore.csproj", "{7DBC2821-22B2-497F-A594-18CF3EE79940}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LY.MicroService.LocalizationManagement.EntityFrameworkCore", "migrations\LY.MicroService.LocalizationManagement.EntityFrameworkCore\LY.MicroService.LocalizationManagement.EntityFrameworkCore.csproj", "{7DBC2821-22B2-497F-A594-18CF3EE79940}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LY.MicroService.Platform.EntityFrameworkCore", "migrations\LY.MicroService.Platform.EntityFrameworkCore\LY.MicroService.Platform.EntityFrameworkCore.csproj", "{B9421FC5-47EB-428D-92C6-F688D02ABE06}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LY.MicroService.Platform.EntityFrameworkCore", "migrations\LY.MicroService.Platform.EntityFrameworkCore\LY.MicroService.Platform.EntityFrameworkCore.csproj", "{B9421FC5-47EB-428D-92C6-F688D02ABE06}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LY.MicroService.RealtimeMessage.EntityFrameworkCore", "migrations\LY.MicroService.RealtimeMessage.EntityFrameworkCore\LY.MicroService.RealtimeMessage.EntityFrameworkCore.csproj", "{6AC6AC37-0163-4EF2-A49C-2E0B87F73AE9}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LY.MicroService.RealtimeMessage.EntityFrameworkCore", "migrations\LY.MicroService.RealtimeMessage.EntityFrameworkCore\LY.MicroService.RealtimeMessage.EntityFrameworkCore.csproj", "{6AC6AC37-0163-4EF2-A49C-2E0B87F73AE9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.TextTemplating.Scriban", "modules\text-templating\LINGYUN.Abp.TextTemplating.Scriban\LINGYUN.Abp.TextTemplating.Scriban.csproj", "{E2019836-1C67-47E4-B3AF-D62F4AFC7679}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.TextTemplating.Razor", "modules\text-templating\LINGYUN.Abp.TextTemplating.Razor\LINGYUN.Abp.TextTemplating.Razor.csproj", "{5F83F8D0-822B-4316-B7DD-85DAFDFAA0E2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -1446,6 +1450,14 @@ Global
{6AC6AC37-0163-4EF2-A49C-2E0B87F73AE9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6AC6AC37-0163-4EF2-A49C-2E0B87F73AE9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6AC6AC37-0163-4EF2-A49C-2E0B87F73AE9}.Release|Any CPU.Build.0 = Release|Any CPU
{E2019836-1C67-47E4-B3AF-D62F4AFC7679}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E2019836-1C67-47E4-B3AF-D62F4AFC7679}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E2019836-1C67-47E4-B3AF-D62F4AFC7679}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E2019836-1C67-47E4-B3AF-D62F4AFC7679}.Release|Any CPU.Build.0 = Release|Any CPU
{5F83F8D0-822B-4316-B7DD-85DAFDFAA0E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5F83F8D0-822B-4316-B7DD-85DAFDFAA0E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5F83F8D0-822B-4316-B7DD-85DAFDFAA0E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5F83F8D0-822B-4316-B7DD-85DAFDFAA0E2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -1720,6 +1732,8 @@ Global
{7DBC2821-22B2-497F-A594-18CF3EE79940} = {B18CF0D3-3D01-4A64-A9C4-DC0C214BEE42}
{B9421FC5-47EB-428D-92C6-F688D02ABE06} = {F260FB5F-C6C7-4948-B638-E4D6986D07ED}
{6AC6AC37-0163-4EF2-A49C-2E0B87F73AE9} = {B1AC656F-8F4C-43D5-B5A0-CCF5F119EA44}
{E2019836-1C67-47E4-B3AF-D62F4AFC7679} = {ABD89F39-62D9-439E-8662-BE4F36BFA04F}
{5F83F8D0-822B-4316-B7DD-85DAFDFAA0E2} = {ABD89F39-62D9-439E-8662-BE4F36BFA04F}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C95FDF91-16F2-4A8B-A4BE-0E62D1B66718}

2
aspnet-core/common.props

@ -1,7 +1,7 @@
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
<Version>7.0.1</Version>
<Version>7.0.2</Version>
<Authors>colin</Authors>
<NoWarn>$(NoWarn);CS1591;CS0436;CS8618;NU1803</NoWarn>
<PackageProjectUrl>https://github.com/colinin/abp-next-admin</PackageProjectUrl>

2
aspnet-core/migrations/LY.MicroService.AuthServer.EntityFrameworkCore/LY.MicroService.AuthServer.EntityFrameworkCore.csproj

@ -9,7 +9,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftPackageVersion)">
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftEntityFrameworkCorePackageVersion)">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

2
aspnet-core/migrations/LY.MicroService.BackendAdmin.EntityFrameworkCore/LY.MicroService.BackendAdmin.EntityFrameworkCore.csproj

@ -9,7 +9,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftPackageVersion)">
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftEntityFrameworkCorePackageVersion)">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

578
aspnet-core/migrations/LY.MicroService.BackendAdmin.EntityFrameworkCore/Migrations/20230304062910_Add-Text-Template-Definition.Designer.cs

@ -0,0 +1,578 @@
// <auto-generated />
using System;
using LY.MicroService.BackendAdmin.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Volo.Abp.EntityFrameworkCore;
#nullable disable
namespace LY.MicroService.BackendAdmin.EntityFrameworkCore.Migrations
{
[DbContext(typeof(BackendAdminMigrationsDbContext))]
[Migration("20230304062910_Add-Text-Template-Definition")]
partial class AddTextTemplateDefinition
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.MySql)
.HasAnnotation("ProductVersion", "7.0.2")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
modelBuilder.Entity("LINGYUN.Abp.Saas.Editions.Edition", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("varchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("char(36)")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("char(36)")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime(6)")
.HasColumnName("DeletionTime");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("tinyint(1)")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime(6)")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("char(36)")
.HasColumnName("LastModifierId");
b.HasKey("Id");
b.HasIndex("DisplayName");
b.ToTable("AbpEditions", (string)null);
});
modelBuilder.Entity("LINGYUN.Abp.Saas.Tenants.Tenant", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("varchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("char(36)")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("char(36)")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime(6)")
.HasColumnName("DeletionTime");
b.Property<DateTime?>("DisableTime")
.HasColumnType("datetime(6)");
b.Property<Guid?>("EditionId")
.HasColumnType("char(36)");
b.Property<DateTime?>("EnableTime")
.HasColumnType("datetime(6)");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<bool>("IsActive")
.HasColumnType("tinyint(1)");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("tinyint(1)")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime(6)")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("char(36)")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.HasKey("Id");
b.HasIndex("EditionId");
b.HasIndex("Name");
b.ToTable("AbpTenants", (string)null);
});
modelBuilder.Entity("LINGYUN.Abp.Saas.Tenants.TenantConnectionString", b =>
{
b.Property<Guid>("TenantId")
.HasColumnType("char(36)");
b.Property<string>("Name")
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<string>("Value")
.IsRequired()
.HasMaxLength(1024)
.HasColumnType("varchar(1024)");
b.HasKey("TenantId", "Name");
b.ToTable("AbpTenantConnectionStrings", (string)null);
});
modelBuilder.Entity("LINGYUN.Abp.TextTemplating.TextTemplate", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("Content")
.HasMaxLength(1048576)
.HasColumnType("longtext")
.HasColumnName("Content");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("char(36)")
.HasColumnName("CreatorId");
b.Property<string>("Culture")
.HasMaxLength(30)
.HasColumnType("varchar(30)")
.HasColumnName("Culture");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("varchar(100)")
.HasColumnName("DisplayName");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime(6)")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("char(36)")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("varchar(100)")
.HasColumnName("Name");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
b.HasKey("Id");
b.HasIndex("TenantId", "Name")
.HasDatabaseName("IX_Tenant_Text_Template_Name");
b.ToTable("AbpTextTemplates", (string)null);
});
modelBuilder.Entity("LINGYUN.Abp.TextTemplating.TextTemplateDefinition", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("varchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<string>("DefaultCultureName")
.HasMaxLength(30)
.HasColumnType("varchar(30)")
.HasColumnName("DefaultCultureName");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(512)
.HasColumnType("varchar(512)")
.HasColumnName("DisplayName");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<bool>("IsInlineLocalized")
.HasColumnType("tinyint(1)");
b.Property<bool>("IsLayout")
.HasColumnType("tinyint(1)");
b.Property<string>("Layout")
.HasMaxLength(60)
.HasColumnType("varchar(60)")
.HasColumnName("Layout");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)")
.HasColumnName("Name");
b.Property<string>("RenderEngine")
.HasMaxLength(30)
.HasColumnType("varchar(30)")
.HasColumnName("RenderEngine");
b.HasKey("Id");
b.ToTable("AbpTextTemplateDefinitions", (string)null);
});
modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("AllowedProviders")
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<string>("DefaultValue")
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<string>("Description")
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<string>("GroupName")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<bool>("IsAvailableToHost")
.HasColumnType("tinyint(1)");
b.Property<bool>("IsVisibleToClients")
.HasColumnType("tinyint(1)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<string>("ParentName")
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<string>("ValueType")
.HasMaxLength(2048)
.HasColumnType("varchar(2048)");
b.HasKey("Id");
b.HasIndex("GroupName");
b.HasIndex("Name")
.IsUnique();
b.ToTable("AbpFeatures", (string)null);
});
modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureGroupDefinitionRecord", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.HasKey("Id");
b.HasIndex("Name")
.IsUnique();
b.ToTable("AbpFeatureGroups", (string)null);
});
modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<string>("ProviderKey")
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<string>("ProviderName")
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<string>("Value")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.HasKey("Id");
b.HasIndex("Name", "ProviderName", "ProviderKey")
.IsUnique();
b.ToTable("AbpFeatureValues", (string)null);
});
modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<string>("GroupName")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<bool>("IsEnabled")
.HasColumnType("tinyint(1)");
b.Property<byte>("MultiTenancySide")
.HasColumnType("tinyint unsigned");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<string>("ParentName")
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<string>("Providers")
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<string>("StateCheckers")
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.HasKey("Id");
b.HasIndex("GroupName");
b.HasIndex("Name")
.IsUnique();
b.ToTable("AbpPermissions", (string)null);
});
modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<string>("ProviderKey")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<string>("ProviderName")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
b.HasKey("Id");
b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey")
.IsUnique();
b.ToTable("AbpPermissionGrants", (string)null);
});
modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.HasKey("Id");
b.HasIndex("Name")
.IsUnique();
b.ToTable("AbpPermissionGroups", (string)null);
});
modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<string>("ProviderKey")
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<string>("ProviderName")
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<string>("Value")
.IsRequired()
.HasMaxLength(2048)
.HasColumnType("varchar(2048)");
b.HasKey("Id");
b.HasIndex("Name", "ProviderName", "ProviderKey")
.IsUnique();
b.ToTable("AbpSettings", (string)null);
});
modelBuilder.Entity("LINGYUN.Abp.Saas.Tenants.Tenant", b =>
{
b.HasOne("LINGYUN.Abp.Saas.Editions.Edition", "Edition")
.WithMany()
.HasForeignKey("EditionId");
b.Navigation("Edition");
});
modelBuilder.Entity("LINGYUN.Abp.Saas.Tenants.TenantConnectionString", b =>
{
b.HasOne("LINGYUN.Abp.Saas.Tenants.Tenant", null)
.WithMany("ConnectionStrings")
.HasForeignKey("TenantId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("LINGYUN.Abp.Saas.Tenants.Tenant", b =>
{
b.Navigation("ConnectionStrings");
});
#pragma warning restore 612, 618
}
}
}

50
aspnet-core/migrations/LY.MicroService.BackendAdmin.EntityFrameworkCore/Migrations/20230304062910_Add-Text-Template-Definition.cs

@ -0,0 +1,50 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace LY.MicroService.BackendAdmin.EntityFrameworkCore.Migrations
{
/// <inheritdoc />
public partial class AddTextTemplateDefinition : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "AbpTextTemplateDefinitions",
columns: table => new
{
Id = table.Column<Guid>(type: "char(36)", nullable: false, collation: "ascii_general_ci"),
Name = table.Column<string>(type: "varchar(128)", maxLength: 128, nullable: false)
.Annotation("MySql:CharSet", "utf8mb4"),
DisplayName = table.Column<string>(type: "varchar(512)", maxLength: 512, nullable: false)
.Annotation("MySql:CharSet", "utf8mb4"),
IsLayout = table.Column<bool>(type: "tinyint(1)", nullable: false),
Layout = table.Column<string>(type: "varchar(60)", maxLength: 60, nullable: true)
.Annotation("MySql:CharSet", "utf8mb4"),
IsInlineLocalized = table.Column<bool>(type: "tinyint(1)", nullable: false),
DefaultCultureName = table.Column<string>(type: "varchar(30)", maxLength: 30, nullable: true)
.Annotation("MySql:CharSet", "utf8mb4"),
RenderEngine = table.Column<string>(type: "varchar(30)", maxLength: 30, nullable: true)
.Annotation("MySql:CharSet", "utf8mb4"),
ExtraProperties = table.Column<string>(type: "longtext", nullable: true)
.Annotation("MySql:CharSet", "utf8mb4"),
ConcurrencyStamp = table.Column<string>(type: "varchar(40)", maxLength: 40, nullable: true)
.Annotation("MySql:CharSet", "utf8mb4")
},
constraints: table =>
{
table.PrimaryKey("PK_AbpTextTemplateDefinitions", x => x.Id);
})
.Annotation("MySql:CharSet", "utf8mb4");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "AbpTextTemplateDefinitions");
}
}
}

581
aspnet-core/migrations/LY.MicroService.BackendAdmin.EntityFrameworkCore/Migrations/20230304083526_Add-IsStatic-Field.Designer.cs

@ -0,0 +1,581 @@
// <auto-generated />
using System;
using LY.MicroService.BackendAdmin.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Volo.Abp.EntityFrameworkCore;
#nullable disable
namespace LY.MicroService.BackendAdmin.EntityFrameworkCore.Migrations
{
[DbContext(typeof(BackendAdminMigrationsDbContext))]
[Migration("20230304083526_Add-IsStatic-Field")]
partial class AddIsStaticField
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.MySql)
.HasAnnotation("ProductVersion", "7.0.2")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
modelBuilder.Entity("LINGYUN.Abp.Saas.Editions.Edition", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("varchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("char(36)")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("char(36)")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime(6)")
.HasColumnName("DeletionTime");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("tinyint(1)")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime(6)")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("char(36)")
.HasColumnName("LastModifierId");
b.HasKey("Id");
b.HasIndex("DisplayName");
b.ToTable("AbpEditions", (string)null);
});
modelBuilder.Entity("LINGYUN.Abp.Saas.Tenants.Tenant", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("varchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("char(36)")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("char(36)")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime(6)")
.HasColumnName("DeletionTime");
b.Property<DateTime?>("DisableTime")
.HasColumnType("datetime(6)");
b.Property<Guid?>("EditionId")
.HasColumnType("char(36)");
b.Property<DateTime?>("EnableTime")
.HasColumnType("datetime(6)");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<bool>("IsActive")
.HasColumnType("tinyint(1)");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("tinyint(1)")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime(6)")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("char(36)")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.HasKey("Id");
b.HasIndex("EditionId");
b.HasIndex("Name");
b.ToTable("AbpTenants", (string)null);
});
modelBuilder.Entity("LINGYUN.Abp.Saas.Tenants.TenantConnectionString", b =>
{
b.Property<Guid>("TenantId")
.HasColumnType("char(36)");
b.Property<string>("Name")
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<string>("Value")
.IsRequired()
.HasMaxLength(1024)
.HasColumnType("varchar(1024)");
b.HasKey("TenantId", "Name");
b.ToTable("AbpTenantConnectionStrings", (string)null);
});
modelBuilder.Entity("LINGYUN.Abp.TextTemplating.TextTemplate", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("Content")
.HasMaxLength(1048576)
.HasColumnType("longtext")
.HasColumnName("Content");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("char(36)")
.HasColumnName("CreatorId");
b.Property<string>("Culture")
.HasMaxLength(30)
.HasColumnType("varchar(30)")
.HasColumnName("Culture");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("varchar(100)")
.HasColumnName("DisplayName");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime(6)")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("char(36)")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("varchar(100)")
.HasColumnName("Name");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
b.HasKey("Id");
b.HasIndex("TenantId", "Name")
.HasDatabaseName("IX_Tenant_Text_Template_Name");
b.ToTable("AbpTextTemplates", (string)null);
});
modelBuilder.Entity("LINGYUN.Abp.TextTemplating.TextTemplateDefinition", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("varchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<string>("DefaultCultureName")
.HasMaxLength(30)
.HasColumnType("varchar(30)")
.HasColumnName("DefaultCultureName");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(512)
.HasColumnType("varchar(512)")
.HasColumnName("DisplayName");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<bool>("IsInlineLocalized")
.HasColumnType("tinyint(1)");
b.Property<bool>("IsLayout")
.HasColumnType("tinyint(1)");
b.Property<bool>("IsStatic")
.HasColumnType("tinyint(1)");
b.Property<string>("Layout")
.HasMaxLength(60)
.HasColumnType("varchar(60)")
.HasColumnName("Layout");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)")
.HasColumnName("Name");
b.Property<string>("RenderEngine")
.HasMaxLength(30)
.HasColumnType("varchar(30)")
.HasColumnName("RenderEngine");
b.HasKey("Id");
b.ToTable("AbpTextTemplateDefinitions", (string)null);
});
modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("AllowedProviders")
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<string>("DefaultValue")
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<string>("Description")
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<string>("GroupName")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<bool>("IsAvailableToHost")
.HasColumnType("tinyint(1)");
b.Property<bool>("IsVisibleToClients")
.HasColumnType("tinyint(1)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<string>("ParentName")
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<string>("ValueType")
.HasMaxLength(2048)
.HasColumnType("varchar(2048)");
b.HasKey("Id");
b.HasIndex("GroupName");
b.HasIndex("Name")
.IsUnique();
b.ToTable("AbpFeatures", (string)null);
});
modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureGroupDefinitionRecord", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.HasKey("Id");
b.HasIndex("Name")
.IsUnique();
b.ToTable("AbpFeatureGroups", (string)null);
});
modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<string>("ProviderKey")
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<string>("ProviderName")
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<string>("Value")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.HasKey("Id");
b.HasIndex("Name", "ProviderName", "ProviderKey")
.IsUnique();
b.ToTable("AbpFeatureValues", (string)null);
});
modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<string>("GroupName")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<bool>("IsEnabled")
.HasColumnType("tinyint(1)");
b.Property<byte>("MultiTenancySide")
.HasColumnType("tinyint unsigned");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<string>("ParentName")
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<string>("Providers")
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<string>("StateCheckers")
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.HasKey("Id");
b.HasIndex("GroupName");
b.HasIndex("Name")
.IsUnique();
b.ToTable("AbpPermissions", (string)null);
});
modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<string>("ProviderKey")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<string>("ProviderName")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
b.HasKey("Id");
b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey")
.IsUnique();
b.ToTable("AbpPermissionGrants", (string)null);
});
modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.HasKey("Id");
b.HasIndex("Name")
.IsUnique();
b.ToTable("AbpPermissionGroups", (string)null);
});
modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<string>("ProviderKey")
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<string>("ProviderName")
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<string>("Value")
.IsRequired()
.HasMaxLength(2048)
.HasColumnType("varchar(2048)");
b.HasKey("Id");
b.HasIndex("Name", "ProviderName", "ProviderKey")
.IsUnique();
b.ToTable("AbpSettings", (string)null);
});
modelBuilder.Entity("LINGYUN.Abp.Saas.Tenants.Tenant", b =>
{
b.HasOne("LINGYUN.Abp.Saas.Editions.Edition", "Edition")
.WithMany()
.HasForeignKey("EditionId");
b.Navigation("Edition");
});
modelBuilder.Entity("LINGYUN.Abp.Saas.Tenants.TenantConnectionString", b =>
{
b.HasOne("LINGYUN.Abp.Saas.Tenants.Tenant", null)
.WithMany("ConnectionStrings")
.HasForeignKey("TenantId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("LINGYUN.Abp.Saas.Tenants.Tenant", b =>
{
b.Navigation("ConnectionStrings");
});
#pragma warning restore 612, 618
}
}
}

29
aspnet-core/migrations/LY.MicroService.BackendAdmin.EntityFrameworkCore/Migrations/20230304083526_Add-IsStatic-Field.cs

@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace LY.MicroService.BackendAdmin.EntityFrameworkCore.Migrations
{
/// <inheritdoc />
public partial class AddIsStaticField : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<bool>(
name: "IsStatic",
table: "AbpTextTemplateDefinitions",
type: "tinyint(1)",
nullable: false,
defaultValue: false);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "IsStatic",
table: "AbpTextTemplateDefinitions");
}
}
}

59
aspnet-core/migrations/LY.MicroService.BackendAdmin.EntityFrameworkCore/Migrations/BackendAdminMigrationsDbContextModelSnapshot.cs

@ -18,7 +18,7 @@ namespace LY.MicroService.BackendAdmin.EntityFrameworkCore.Migrations
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.MySql)
.HasAnnotation("ProductVersion", "7.0.1")
.HasAnnotation("ProductVersion", "7.0.2")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
modelBuilder.Entity("LINGYUN.Abp.Saas.Editions.Edition", b =>
@ -226,6 +226,63 @@ namespace LY.MicroService.BackendAdmin.EntityFrameworkCore.Migrations
b.ToTable("AbpTextTemplates", (string)null);
});
modelBuilder.Entity("LINGYUN.Abp.TextTemplating.TextTemplateDefinition", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("char(36)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("varchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<string>("DefaultCultureName")
.HasMaxLength(30)
.HasColumnType("varchar(30)")
.HasColumnName("DefaultCultureName");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(512)
.HasColumnType("varchar(512)")
.HasColumnName("DisplayName");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<bool>("IsInlineLocalized")
.HasColumnType("tinyint(1)");
b.Property<bool>("IsLayout")
.HasColumnType("tinyint(1)");
b.Property<bool>("IsStatic")
.HasColumnType("tinyint(1)");
b.Property<string>("Layout")
.HasMaxLength(60)
.HasColumnType("varchar(60)")
.HasColumnName("Layout");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("varchar(128)")
.HasColumnName("Name");
b.Property<string>("RenderEngine")
.HasMaxLength(30)
.HasColumnType("varchar(30)")
.HasColumnName("RenderEngine");
b.HasKey("Id");
b.ToTable("AbpTextTemplateDefinitions", (string)null);
});
modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b =>
{
b.Property<Guid>("Id")

2
aspnet-core/migrations/LY.MicroService.IdentityServer.EntityFrameworkCore/LY.MicroService.IdentityServer.EntityFrameworkCore.csproj

@ -9,7 +9,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftPackageVersion)">
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftEntityFrameworkCorePackageVersion)">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

30
aspnet-core/migrations/LY.MicroService.LocalizationManagement.EntityFrameworkCore/FodyWeavers.xsd

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. -->
<xs:element name="Weavers">
<xs:complexType>
<xs:all>
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" />
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="VerifyAssembly" type="xs:boolean">
<xs:annotation>
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="VerifyIgnoreCodes" type="xs:string">
<xs:annotation>
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="GenerateXsd" type="xs:boolean">
<xs:annotation>
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>

5
aspnet-core/migrations/LY.MicroService.LocalizationManagement.EntityFrameworkCore/LY.MicroService.LocalizationManagement.EntityFrameworkCore.csproj

@ -1,12 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\configureawait.props" />
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<RootNamespace>LY.MicroService.LocalizationManagement.EntityFrameworkCore</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftPackageVersion)">
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftEntityFrameworkCorePackageVersion)">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

30
aspnet-core/migrations/LY.MicroService.Platform.EntityFrameworkCore/FodyWeavers.xsd

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. -->
<xs:element name="Weavers">
<xs:complexType>
<xs:all>
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" />
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="VerifyAssembly" type="xs:boolean">
<xs:annotation>
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="VerifyIgnoreCodes" type="xs:string">
<xs:annotation>
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="GenerateXsd" type="xs:boolean">
<xs:annotation>
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>

5
aspnet-core/migrations/LY.MicroService.Platform.EntityFrameworkCore/LY.MicroService.Platform.EntityFrameworkCore.csproj

@ -1,12 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\configureawait.props" />
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<RootNamespace>LY.MicroService.Platform.EntityFrameworkCore</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftPackageVersion)">
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftEntityFrameworkCorePackageVersion)">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

30
aspnet-core/migrations/LY.MicroService.RealtimeMessage.EntityFrameworkCore/FodyWeavers.xsd

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. -->
<xs:element name="Weavers">
<xs:complexType>
<xs:all>
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" />
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="VerifyAssembly" type="xs:boolean">
<xs:annotation>
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="VerifyIgnoreCodes" type="xs:string">
<xs:annotation>
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="GenerateXsd" type="xs:boolean">
<xs:annotation>
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>

5
aspnet-core/migrations/LY.MicroService.RealtimeMessage.EntityFrameworkCore/LY.MicroService.RealtimeMessage.EntityFrameworkCore.csproj

@ -1,12 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\configureawait.props" />
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<RootNamespace>LY.MicroService.RealtimeMessage.EntityFrameworkCore</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftPackageVersion)">
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftEntityFrameworkCorePackageVersion)">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

2
aspnet-core/migrations/LY.MicroService.TaskManagement.EntityFrameworkCore/LY.MicroService.TaskManagement.EntityFrameworkCore.csproj

@ -9,7 +9,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftPackageVersion)">
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftEntityFrameworkCorePackageVersion)">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

2
aspnet-core/migrations/LY.MicroService.WebhooksManagement.EntityFrameworkCore/LY.MicroService.WebhooksManagement.EntityFrameworkCore.csproj

@ -9,7 +9,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftPackageVersion)">
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftEntityFrameworkCorePackageVersion)">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

2
aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/AuditLogInfoToAuditLogConverter.cs

@ -99,7 +99,9 @@ namespace LINGYUN.Abp.AuditLogging
auditLogInfo.Url,
auditLogInfo.HttpStatusCode,
auditLogInfo.ImpersonatorUserId,
auditLogInfo.ImpersonatorUserName,
auditLogInfo.ImpersonatorTenantId,
auditLogInfo.ImpersonatorTenantName,
extraProperties,
entityChanges,
actions,

2
aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/ElasticsearchAuditLogManager.cs

@ -184,6 +184,8 @@ namespace LINGYUN.Abp.AuditLogging.Elasticsearch
cancellationToken);
}
// 避免循环记录
[DisableAuditing]
public async virtual Task<string> SaveAsync(
AuditLogInfo auditInfo,
CancellationToken cancellationToken = default(CancellationToken))

8
aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/AuditLog.cs

@ -22,8 +22,12 @@ namespace LINGYUN.Abp.AuditLogging
public Guid? ImpersonatorUserId { get; set; }
public string ImpersonatorUserName { get; set; }
public Guid? ImpersonatorTenantId { get; set; }
public string ImpersonatorTenantName { get; set; }
public DateTime ExecutionTime { get; set; }
public int ExecutionDuration { get; set; }
@ -79,7 +83,9 @@ namespace LINGYUN.Abp.AuditLogging
string url,
int? httpStatusCode,
Guid? impersonatorUserId,
string impersonatorUserName,
Guid? impersonatorTenantId,
string impersonatorTenantName,
ExtraPropertyDictionary extraPropertyDictionary,
List<EntityChange> entityChanges,
List<AuditLogAction> actions,
@ -103,7 +109,9 @@ namespace LINGYUN.Abp.AuditLogging
Url = url;
HttpStatusCode = httpStatusCode;
ImpersonatorUserId = impersonatorUserId;
ImpersonatorUserName = impersonatorUserName;
ImpersonatorTenantId = impersonatorTenantId;
ImpersonatorTenantName = impersonatorTenantName;
ExtraProperties = extraPropertyDictionary;
EntityChanges = entityChanges;

2
aspnet-core/modules/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/AuditingStore.cs

@ -15,6 +15,8 @@ namespace LINGYUN.Abp.AuditLogging
_manager = manager;
}
// 避免循环记录
[DisableAuditing]
public async virtual Task SaveAsync(AuditLogInfo auditInfo)
{
await _manager.SaveAsync(auditInfo);

2
aspnet-core/modules/authorization/LINGYUN.Abp.Identity.OrganizaztionUnits/LINGYUN/Abp/Identity/OrganizaztionUnits/OrganizationUnitClaimsPrincipalContributor.cs

@ -10,7 +10,7 @@ namespace LINGYUN.Abp.Identity.OrganizationUnits;
public class OrganizationUnitClaimsPrincipalContributor : IAbpClaimsPrincipalContributor, ITransientDependency
{
// https://github.com/dotnet/aspnetcore/blob/v5.0.0/src/Identity/Extensions.Core/src/UserClaimsPrincipalFactory.cs#L79
// https://github.com/dotnet/aspnetcore/blob/main/src/Identity/Extensions.Core/src/UserClaimsPrincipalFactory.cs#L74
private static string IdentityAuthenticationType => "Identity.Application";
private readonly IIdentityUserRepository _identityUserRepository;

2
aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN.Abp.Cli.csproj

@ -5,7 +5,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<Version>7.0.1</Version>
<Version>7.0.2</Version>
<Copyright>colin</Copyright>
<Description>Use LINGYUN.MicroService.Templates command line</Description>
<PackAsTool>true</PackAsTool>

26
aspnet-core/modules/common/LINGYUN.Abp.ExceptionHandling/LINGYUN/Abp/ExceptionHandling/AbpExceptionSubscriberBase.cs

@ -4,6 +4,7 @@ using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using System;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.ExceptionHandling;
namespace LINGYUN.Abp.ExceptionHandling
@ -13,30 +14,9 @@ namespace LINGYUN.Abp.ExceptionHandling
protected IServiceScopeFactory ServiceScopeFactory { get; }
protected AbpExceptionHandlingOptions Options { get; }
public IServiceProvider ServiceProvider { get; set; }
protected readonly object ServiceProviderLock = new object();
public IAbpLazyServiceProvider ServiceProvider { get; set; }
protected TService LazyGetRequiredService<TService>(ref TService reference)
=> LazyGetRequiredService(typeof(TService), ref reference);
protected TRef LazyGetRequiredService<TRef>(Type serviceType, ref TRef reference)
{
if (reference == null)
{
lock (ServiceProviderLock)
{
if (reference == null)
{
reference = (TRef)ServiceProvider.GetRequiredService(serviceType);
}
}
}
return reference;
}
protected ILoggerFactory LoggerFactory => LazyGetRequiredService(ref _loggerFactory);
private ILoggerFactory _loggerFactory;
protected ILoggerFactory LoggerFactory => ServiceProvider.LazyGetService<ILoggerFactory>();
protected ILogger Logger => _lazyLogger.Value;
private Lazy<ILogger> _lazyLogger => new Lazy<ILogger>(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true);

56
aspnet-core/modules/common/LINGYUN.Abp.Features.LimitValidation/LINGYUN/Abp/Features/LimitValidation/AbpFeaturesLimitValidationOptions.cs

@ -1,6 +1,7 @@
using JetBrains.Annotations;
using System;
using System.Collections.Generic;
using System.Globalization;
using Volo.Abp;
namespace LINGYUN.Abp.Features.LimitValidation
@ -36,12 +37,55 @@ namespace LINGYUN.Abp.Features.LimitValidation
internal void MapDefaultEffectPolicys()
{
MapEffectPolicy(LimitPolicy.Minute, (time) => { return (long)(DateTimeOffset.UtcNow.AddMinutes(time) - DateTimeOffset.UtcNow).TotalSeconds; });
MapEffectPolicy(LimitPolicy.Hours, (time) => { return (long)(DateTimeOffset.UtcNow.AddHours(time) - DateTimeOffset.UtcNow).TotalSeconds; });
MapEffectPolicy(LimitPolicy.Days, (time) => { return (long)(DateTimeOffset.UtcNow.AddDays(time) - DateTimeOffset.UtcNow).TotalSeconds; });
MapEffectPolicy(LimitPolicy.Weeks, (time) => { return (long)(DateTimeOffset.UtcNow.AddDays(time * 7) - DateTimeOffset.UtcNow).TotalSeconds; });
MapEffectPolicy(LimitPolicy.Month, (time) => { return (long)(DateTimeOffset.UtcNow.AddMonths(time) - DateTimeOffset.UtcNow).TotalSeconds; });
MapEffectPolicy(LimitPolicy.Years, (time) => { return (long)(DateTimeOffset.UtcNow.AddYears(time) - DateTimeOffset.UtcNow).TotalSeconds; });
MapEffectPolicy(LimitPolicy.Minute, (time) =>
{
var utcNow = DateTime.UtcNow;
return (long)(utcNow.AddMinutes(time) - utcNow).TotalSeconds;
});
MapEffectPolicy(LimitPolicy.Hours, (time) =>
{
var utcNow = DateTime.UtcNow;
return (long)(utcNow.AddHours(time) - utcNow).TotalSeconds;
});
MapEffectPolicy(LimitPolicy.Days, (time) =>
{
// 按天计算应取当天
return (long)(DateTime.UtcNow.Date.AddDays(time) - DateTime.UtcNow).TotalSeconds;
});
MapEffectPolicy(LimitPolicy.Weeks,(time) =>
{
// 按周计算应取当周
var utcNow = DateTime.UtcNow.Date;
var dayOfWeek = (int)utcNow.DayOfWeek - 1;
if (utcNow.DayOfWeek == DayOfWeek.Sunday)
{
dayOfWeek = 6;
}
var utcOnceDayOfWeek = utcNow.AddDays(-dayOfWeek);
return (long)(utcOnceDayOfWeek.AddDays(time) - DateTime.UtcNow).TotalSeconds;
});
MapEffectPolicy(LimitPolicy.Month, (time) =>
{
// 按月计算应取当月
var utcNow = DateTime.UtcNow;
var utcOnceDayOfMonth = new DateTime(utcNow.Year, utcNow.Month, 1, 1, 0, 0, 0);
return (long)(utcOnceDayOfMonth.AddMonths(time) - utcNow).TotalSeconds;
});
MapEffectPolicy(LimitPolicy.Years, (time) =>
{
// 按年计算应取当年
var utcNow = DateTime.UtcNow;
var utcOnceDayOfYear = new DateTime(utcNow.Year, 1, 1, 1, 0, 0, 0);
return (long)(utcOnceDayOfYear.AddYears(time) - utcNow).TotalSeconds;
});
}
}
}

17
aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs

@ -49,7 +49,12 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs
{
await SendUserOnlineStateAsync();
}
catch(Exception ex)
catch (OperationCanceledException)
{
// Ignore
return;
}
catch (Exception ex)
{
Logger.LogWarning("An error occurred in the OnConnected method:{message}", ex.Message);
}
@ -63,6 +68,11 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs
{
await SendUserOnlineStateAsync(false);
}
catch (OperationCanceledException)
{
// Ignore
return;
}
catch (Exception ex)
{
Logger.LogWarning("An error occurred in the OnDisconnected method:{message}", ex.Message);
@ -183,6 +193,11 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs
{
await Processor?.ReadAsync(chatMessage);
}
catch (OperationCanceledException)
{
// Ignore
return;
}
catch (Exception ex)
{
Logger.LogWarning("An error occurred in the Read method:{message}", ex.Message);

11
aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/Hubs/NotificationsHub.cs

@ -22,11 +22,11 @@ namespace LINGYUN.Abp.Notifications.SignalR.Hubs
if (CurrentTenant.IsAvailable)
{
// 以租户为分组,将用户加入租户通讯组
await Groups.AddToGroupAsync(Context.ConnectionId, CurrentTenant.GetId().ToString(), Context.ConnectionAborted);
await Groups.AddToGroupAsync(Context.ConnectionId, CurrentTenant.GetId().ToString());
}
else
{
await Groups.AddToGroupAsync(Context.ConnectionId, "Global", Context.ConnectionAborted);
await Groups.AddToGroupAsync(Context.ConnectionId, "Global");
}
}
@ -38,11 +38,11 @@ namespace LINGYUN.Abp.Notifications.SignalR.Hubs
if (CurrentTenant.IsAvailable)
{
// 以租户为分组,将移除租户通讯组
await Groups.RemoveFromGroupAsync(Context.ConnectionId, CurrentTenant.GetId().ToString(), Context.ConnectionAborted);
await Groups.RemoveFromGroupAsync(Context.ConnectionId, CurrentTenant.GetId().ToString());
}
else
{
await Groups.RemoveFromGroupAsync(Context.ConnectionId, "Global", Context.ConnectionAborted);
await Groups.RemoveFromGroupAsync(Context.ConnectionId, "Global");
}
}
@ -76,8 +76,7 @@ namespace LINGYUN.Abp.Notifications.SignalR.Hubs
CurrentTenant.Id,
CurrentUser.GetId(),
long.Parse(id),
readState,
Context.ConnectionAborted);
readState);
}
}
}

4
aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/Localization/Resources/en.json

@ -28,6 +28,10 @@
"Notifications:SystemNotice": "System",
"Notifications:SystemNoticeDesc": "System global notification push",
"MarkSelectedAsRead": "Mark selected as read",
"NotificationType:Application": "Platform",
"NotificationType:System": "System",
"NotificationType:User": "User",
"NotificationType:ServiceCallback": "Service Callback",
"MarkAs": "Mark as",
"Read": "Read",
"UnRead": "Un Read"

4
aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/Localization/Resources/zh-Hans.json

@ -28,6 +28,10 @@
"Notifications:SystemNotice": "系统通知",
"Notifications:SystemNoticeDesc": "系统全局消息推送",
"MarkSelectedAsRead": "标记选中已读",
"NotificationType:Application": "平台",
"NotificationType:System": "系统",
"NotificationType:User": "用户",
"NotificationType:ServiceCallback": "服务回调",
"MarkAs": "标记为",
"Read": "已读",
"UnRead": "未读"

21
aspnet-core/modules/elsa/LINGYUN.Abp.Elsa/LINGYUN/Abp/Elsa/Scripting/JavaScript/ConfigureJavaScriptEngine.cs

@ -8,6 +8,7 @@ using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Features;
using Volo.Abp.Guids;
using Volo.Abp.Localization;
using Volo.Abp.MultiTenancy;
@ -23,6 +24,7 @@ public class ConfigureJavaScriptEngine : INotificationHandler<EvaluatingJavaScri
private readonly AbpLocalizationOptions _localizationOptions;
private readonly IStringLocalizerFactory _localizerFactory;
private readonly IGuidGenerator _guidGenerator;
private readonly IFeatureChecker _featureChecker;
private readonly ISettingProvider _settingProvider;
private readonly IPermissionChecker _permissionChecker;
@ -32,6 +34,7 @@ public class ConfigureJavaScriptEngine : INotificationHandler<EvaluatingJavaScri
IOptions<AbpLocalizationOptions> localizationOptions,
IStringLocalizerFactory localizerFactory,
IGuidGenerator guidGenerator,
IFeatureChecker featureChecker,
ISettingProvider settingProvider,
IPermissionChecker permissionChecker)
{
@ -40,6 +43,7 @@ public class ConfigureJavaScriptEngine : INotificationHandler<EvaluatingJavaScri
_localizationOptions = localizationOptions.Value;
_localizerFactory = localizerFactory;
_guidGenerator = guidGenerator;
_featureChecker = featureChecker;
_settingProvider = settingProvider;
_permissionChecker = permissionChecker;
}
@ -49,8 +53,8 @@ public class ConfigureJavaScriptEngine : INotificationHandler<EvaluatingJavaScri
var output = notification.Output;
output.AppendLine("declare interface Clock {");
output.AppendLine(" now(): DateTime;");
output.AppendLine(" normalize(dateTime: DateTime): DateTime;");
output.AppendLine(" now(): Date;");
output.AppendLine(" normalize(dateTime: Date): Date;");
output.AppendLine("}");
output.AppendLine("declare interface CurrentTenant {");
@ -72,6 +76,11 @@ public class ConfigureJavaScriptEngine : INotificationHandler<EvaluatingJavaScri
output.AppendLine(" getBoolean(name: string): boolean;");
output.AppendLine("}");
output.AppendLine("declare interface Feature {");
output.AppendLine(" get(name: string): any;");
output.AppendLine(" isEnabled(name: string): boolean;");
output.AppendLine("}");
output.AppendLine("declare interface Auth {");
output.AppendLine(" isGranted(name: string): boolean;");
output.AppendLine(" isAnyGranted(names: string[]): boolean;");
@ -84,6 +93,7 @@ public class ConfigureJavaScriptEngine : INotificationHandler<EvaluatingJavaScri
output.AppendLine(" utils: Utils;");
output.AppendLine(" localization: Localization;");
output.AppendLine(" setting: Setting;");
output.AppendLine(" feature: Feature;");
output.AppendLine(" auth: Auth;");
output.AppendLine("}");
@ -152,6 +162,13 @@ public class ConfigureJavaScriptEngine : INotificationHandler<EvaluatingJavaScri
};
abpFunctions["setting"] = settingModel;
var featureModel = new Dictionary<string, object?>
{
["get"] = (Func<string, object?>)((name) => _featureChecker.GetOrNullAsync(name).GetAwaiter().GetResult()),
["isEnabled"] = (Func<string, bool>)((name) => _featureChecker.IsEnabledAsync(name).GetAwaiter().GetResult()),
};
abpFunctions["feature"] = featureModel;
var authModel = new Dictionary<string, object?>
{
["isGranted"] = (Func<string, bool>)((name) => _permissionChecker.IsGrantedAsync(name).GetAwaiter().GetResult()),

11
aspnet-core/modules/localization/LINGYUN.Abp.Localization.Persistence/LINGYUN/Abp/Localization/Persistence/StaticLocalizationSaverHostService.cs

@ -1,5 +1,6 @@
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using System;
using System.Threading;
using System.Threading.Tasks;
@ -22,7 +23,15 @@ public class StaticLocalizationSaverHostService : BackgroundService
{
if (_options.SaveStaticLocalizationsToPersistence)
{
await _staticLocalizationSaver.SaveAsync();
try
{
await _staticLocalizationSaver.SaveAsync();
}
catch (OperationCanceledException)
{
// Ignore
return;
}
}
}
}

22
aspnet-core/modules/mvc/LINGYUN.Abp.AspNetCore.Mvc.Wrapper/LINGYUN/Abp/AspNetCore/Mvc/Wrapper/AbpAspNetCoreMvcWrapperModule.cs

@ -2,6 +2,7 @@
using LINGYUN.Abp.AspNetCore.Mvc.Wrapper.Localization;
using LINGYUN.Abp.Wrapper;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ViewEngines;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using Volo.Abp.AspNetCore.Mvc;
@ -48,10 +49,29 @@ namespace LINGYUN.Abp.AspNetCore.Mvc.Wrapper
options.IgnoreReturnTypes.Add<ApplicationApiDescriptionModel>();
// api/abp/application-configuration
options.IgnoreReturnTypes.Add<ApplicationConfigurationDto>();
//
// api/abp/application-localization
options.IgnoreReturnTypes.Add<ApplicationLocalizationDto>();
// 文件流
options.IgnoreReturnTypes.Add<IRemoteStreamContent>();
options.IgnoreReturnTypes.Add<FileResult>();
//options.IgnoreReturnTypes.Add<ViewResult>();
//options.IgnoreReturnTypes.Add<ViewEngineResult>();
//options.IgnoreReturnTypes.Add<ViewComponentResult>();
//options.IgnoreReturnTypes.Add<RedirectToActionResult>();
//options.IgnoreReturnTypes.Add<RedirectToPageResult>();
//options.IgnoreReturnTypes.Add<RedirectToRouteResult>();
//options.IgnoreReturnTypes.Add<SignInResult>();
//options.IgnoreReturnTypes.Add<SignOutResult>();
//options.IgnoreReturnTypes.Add<ForbidResult>();
// Abp/ServiceProxyScript
options.IgnoreControllers.Add<AbpServiceProxyScriptController>();
options.IgnoreControllers.Add<AbpApplicationLocalizationController>();
options.IgnoreControllers.Add<AbpApplicationConfigurationController>();
options.IgnoreControllers.Add<AbpApplicationConfigurationScriptController>();
// 官方模块不包装结果
options.IgnoreNamespaces.Add("Volo.Abp");

17
aspnet-core/modules/mvc/LINGYUN.Abp.AspNetCore.Mvc.Wrapper/README.md

@ -1,6 +1,6 @@
# LINGYUN.Abp.AspNetCore.Mvc.Wrapper
返回值包装器
包装器 MVC 实现模块
## 配置使用
@ -10,7 +10,7 @@ public class YouProjectModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpAspNetCoreMvcWrapperOptions>(options =>
Configure<AbpWrapperOptions>(options =>
{
// 启用包装器
options.IsEnabled = true;
@ -20,18 +20,5 @@ public class YouProjectModule : AbpModule
```
## 配置项说明
* AbpAspNetCoreMvcWrapperOptions.IsEnabled 是否包装返回结果,默认: false
* AbpAspNetCoreMvcWrapperOptions.CodeWithFound 响应成功代码,默认: 0
* AbpAspNetCoreMvcWrapperOptions.HttpStatusCode 包装后的Http响应代码, 默认: 200
* AbpAspNetCoreMvcWrapperOptions.CodeWithEmptyResult 当返回空对象时返回错误代码,默认: 404
* AbpAspNetCoreMvcWrapperOptions.MessageWithEmptyResult 当返回空对象时返回错误消息, 默认: 本地化之后的 NotFound
* AbpAspNetCoreMvcWrapperOptions.IgnorePrefixUrls 指定哪些Url开头的地址不需要处理
* AbpAspNetCoreMvcWrapperOptions.IgnoreNamespaces 指定哪些命名空间开头不需要处理
* AbpAspNetCoreMvcWrapperOptions.IgnoreControllers 指定哪些控制器不需要处理
* AbpAspNetCoreMvcWrapperOptions.IgnoreReturnTypes 指定哪些返回结果类型不需要处理
* AbpAspNetCoreMvcWrapperOptions.IgnoreExceptions 指定哪些异常类型不需要处理
## 其他

118
aspnet-core/modules/notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/AbpNotificationsDomainModule.cs

@ -1,16 +1,10 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Polly;
using System;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.AutoMapper;
using Volo.Abp.Caching;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Modularity;
using Volo.Abp.Threading;
@ -44,8 +38,9 @@ public class AbpNotificationsDomainModule : AbpModule
public override Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
{
InitializeDynamicNotifications(context);
return Task.CompletedTask;
return context.ServiceProvider
.GetRequiredService<NotificationDefinitionInitializer>()
.InitializeDynamicNotifications(_cancellationTokenSource.Token);
}
public override Task OnApplicationShutdownAsync(ApplicationShutdownContext context)
@ -53,111 +48,4 @@ public class AbpNotificationsDomainModule : AbpModule
_cancellationTokenSource.Cancel();
return Task.CompletedTask;
}
private void InitializeDynamicNotifications(ApplicationInitializationContext context)
{
var options = context
.ServiceProvider
.GetRequiredService<IOptions<AbpNotificationsManagementOptions>>()
.Value;
if (!options.SaveStaticNotificationsToDatabase && !options.IsDynamicNotificationsStoreEnabled)
{
return;
}
var rootServiceProvider = context.ServiceProvider.GetRequiredService<IRootServiceProvider>();
Task.Run(async () =>
{
using var scope = rootServiceProvider.CreateScope();
var applicationLifetime = scope.ServiceProvider.GetService<IHostApplicationLifetime>();
var cancellationTokenProvider = scope.ServiceProvider.GetRequiredService<ICancellationTokenProvider>();
var cancellationToken = applicationLifetime?.ApplicationStopping ?? _cancellationTokenSource.Token;
try
{
using (cancellationTokenProvider.Use(cancellationToken))
{
if (cancellationTokenProvider.Token.IsCancellationRequested)
{
return;
}
await SaveStaticNotificationsToDatabaseAsync(options, scope, cancellationTokenProvider);
if (cancellationTokenProvider.Token.IsCancellationRequested)
{
return;
}
await PreCacheDynamicNotificationsAsync(options, scope);
}
}
// ReSharper disable once EmptyGeneralCatchClause (No need to log since it is logged above)
catch { }
});
}
private async static Task SaveStaticNotificationsToDatabaseAsync(
AbpNotificationsManagementOptions options,
IServiceScope scope,
ICancellationTokenProvider cancellationTokenProvider)
{
if (!options.SaveStaticNotificationsToDatabase)
{
return;
}
await Policy
.Handle<Exception>()
.WaitAndRetryAsync(8, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt) * 10))
.ExecuteAsync(async _ =>
{
try
{
// ReSharper disable once AccessToDisposedClosure
await scope
.ServiceProvider
.GetRequiredService<IStaticNotificationSaver>()
.SaveAsync();
}
catch (Exception ex)
{
// ReSharper disable once AccessToDisposedClosure
scope.ServiceProvider
.GetService<ILogger<AbpNotificationsDomainModule>>()?
.LogException(ex);
throw; // Polly will catch it
}
}, cancellationTokenProvider.Token);
}
private async static Task PreCacheDynamicNotificationsAsync(AbpNotificationsManagementOptions options, IServiceScope scope)
{
if (!options.IsDynamicNotificationsStoreEnabled)
{
return;
}
try
{
// Pre-cache Notifications, so first request doesn't wait
await scope
.ServiceProvider
.GetRequiredService<IDynamicNotificationDefinitionStore>()
.GetGroupsAsync();
}
catch (Exception ex)
{
// ReSharper disable once AccessToDisposedClosure
scope
.ServiceProvider
.GetService<ILogger<AbpNotificationsDomainModule>>()?
.LogException(ex);
throw; // It will be cached in InitializeDynamicNotifications
}
}
}

8
aspnet-core/modules/notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/DynamicNotificationDefinitionInMemoryCache.cs

@ -32,7 +32,7 @@ public class DynamicNotificationDefinitionInMemoryCache : IDynamicNotificationDe
NotificationDefinitions = new Dictionary<string, NotificationDefinition>();
}
public Task FillAsync(
public virtual Task FillAsync(
List<NotificationDefinitionGroupRecord> notificationGroupRecords,
List<NotificationDefinitionRecord> notificationRecords)
{
@ -69,17 +69,17 @@ public class DynamicNotificationDefinitionInMemoryCache : IDynamicNotificationDe
return Task.CompletedTask;
}
public NotificationDefinition GetNotificationOrNull(string name)
public virtual NotificationDefinition GetNotificationOrNull(string name)
{
return NotificationDefinitions.GetOrDefault(name);
}
public IReadOnlyList<NotificationDefinition> GetNotifications()
public virtual IReadOnlyList<NotificationDefinition> GetNotifications()
{
return NotificationDefinitions.Values.ToList();
}
public IReadOnlyList<NotificationGroupDefinition> GetGroups()
public virtual IReadOnlyList<NotificationGroupDefinition> GetGroups()
{
return NotificationGroupDefinitions.Values.ToList();
}

93
aspnet-core/modules/notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/NotificationDefinitionInitializer.cs

@ -0,0 +1,93 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Threading;
using Volo.Abp.Uow;
namespace LINGYUN.Abp.Notifications;
public class NotificationDefinitionInitializer : ITransientDependency
{
protected IRootServiceProvider RootServiceProvider { get; }
protected ICancellationTokenProvider CancellationTokenProvider { get; }
protected AbpNotificationsManagementOptions NotificationsManagementOptions { get; }
public NotificationDefinitionInitializer(
IRootServiceProvider rootServiceProvider,
ICancellationTokenProvider cancellationTokenProvider,
IOptions<AbpNotificationsManagementOptions> notificationsManagementOptions)
{
RootServiceProvider = rootServiceProvider;
CancellationTokenProvider = cancellationTokenProvider;
NotificationsManagementOptions = notificationsManagementOptions.Value;
}
[UnitOfWork]
public async virtual Task InitializeDynamicNotifications(CancellationToken cancellationToken)
{
if (!NotificationsManagementOptions.SaveStaticNotificationsToDatabase && !NotificationsManagementOptions.IsDynamicNotificationsStoreEnabled)
{
return;
}
using var scope = RootServiceProvider.CreateScope();
var applicationLifetime = scope.ServiceProvider.GetService<IHostApplicationLifetime>();
var token = applicationLifetime?.ApplicationStopping ?? cancellationToken;
try
{
using (CancellationTokenProvider.Use(cancellationToken))
{
if (CancellationTokenProvider.Token.IsCancellationRequested)
{
return;
}
await SaveStaticNotificationsToDatabaseAsync(scope);
if (CancellationTokenProvider.Token.IsCancellationRequested)
{
return;
}
await PreCacheDynamicNotificationsAsync(scope);
}
}
catch (OperationCanceledException)
{
// ignore
}
catch(Exception ex)
{
scope.ServiceProvider
.GetService<ILogger<NotificationDefinitionInitializer>>()?
.LogException(ex);
}
}
private async Task SaveStaticNotificationsToDatabaseAsync(IServiceScope serviceScope)
{
if (!NotificationsManagementOptions.SaveStaticNotificationsToDatabase)
{
return;
}
var saver = serviceScope.ServiceProvider.GetRequiredService<IStaticNotificationSaver>();
await saver.SaveAsync();
}
private async Task PreCacheDynamicNotificationsAsync(IServiceScope serviceScope)
{
if (!NotificationsManagementOptions.IsDynamicNotificationsStoreEnabled)
{
return;
}
var store = serviceScope.ServiceProvider.GetRequiredService<IDynamicNotificationDefinitionStore>();
await store.GetGroupsAsync();
}
}

39
aspnet-core/modules/notifications/LINGYUN.Abp.Notifications.Domain/LINGYUN/Abp/Notifications/NotificationTypeConverter.cs

@ -1,39 +0,0 @@
using AutoMapper;
using System;
using Volo.Abp;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.Notifications
{
public class NotificationTypeConverter : ITypeConverter<Notification, NotificationInfo>, ISingletonDependency
{
public NotificationInfo Convert(Notification source, NotificationInfo destination, ResolutionContext context)
{
destination = new NotificationInfo
{
Name = source.NotificationName,
Type = source.Type,
ContentType = source.ContentType,
Severity = source.Severity,
CreationTime = source.CreationTime,
TenantId = source.TenantId
};
destination.SetId(source.NotificationId);
var dataType = Type.GetType(source.NotificationTypeName);
Check.NotNull(dataType, source.NotificationTypeName);
var data = Activator.CreateInstance(dataType);
if (data != null && data is NotificationData notificationData)
{
notificationData.ExtraProperties = source.ExtraProperties;
destination.Data = NotificationDataConverter.Convert(notificationData);
}
else
{
destination.Data = new NotificationData();
destination.Data.ExtraProperties = source.ExtraProperties;
}
return destination;
}
}
}

3
aspnet-core/modules/platform/LINGYUN.Platform.Domain/LINGYUN/Platform/Packages/FileSystemPackageBlobNormalizer.cs

@ -1,4 +1,5 @@
using System.IO;
using System.Web;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Platform.Packages;
@ -15,6 +16,6 @@ public class FileSystemPackageBlobNormalizer : IPackageBlobNormalizer, ISingleto
var pk = package.Name;
var pv = package.Version;
return Path.Combine(pk, "v" + pv, "blobs", blob.Name);
return Path.Combine(pk, "v" + pv, "blobs", HttpUtility.HtmlDecode(blob.Name));
}
}

3
aspnet-core/modules/platform/LINGYUN.Platform.Domain/LINGYUN/Platform/Packages/PackageBlobManager.cs

@ -3,6 +3,7 @@ using System.IO;
using System.Security.Cryptography;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using Volo.Abp.BlobStoring;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Services;
@ -56,7 +57,7 @@ public class PackageBlobManager : DomainService, IPackageBlobManager, ITransient
stream.Seek(0, SeekOrigin.Begin);
packageBlob.SHA256 = ComputeHash(stream);
packageBlob.SetUrl($"api/platform/packages/{packageBlob.PackageId}/blob/{packageBlob.Name}");
packageBlob.SetUrl($"api/platform/packages/{packageBlob.PackageId}/blob/{HttpUtility.HtmlEncode(packageBlob.Name)}");
}
protected async virtual Task<Stream> DownloadFromBlobAsync(

18
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/ITextTemplateAppService.cs

@ -1,18 +0,0 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.TextTemplating;
public interface ITextTemplateAppService : IApplicationService
{
Task<TextTemplateDefinitionDto> GetAsync(string name);
Task<TextTemplateContentDto> GetContentAsync(TextTemplateContentGetInput input);
Task RestoreToDefaultAsync(TextTemplateRestoreInput input);
Task<TextTemplateDefinitionDto> UpdateAsync(TextTemplateUpdateInput input);
Task<PagedResultDto<TextTemplateDefinitionDto>> GetListAsync(TextTemplateDefinitionGetListInput input);
}

13
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/ITextTemplateContentAppService.cs

@ -0,0 +1,13 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.TextTemplating;
public interface ITextTemplateContentAppService : IApplicationService
{
Task<TextTemplateContentDto> GetAsync(TextTemplateContentGetInput input);
Task RestoreToDefaultAsync(string name, TextTemplateRestoreInput input);
Task<TextTemplateContentDto> UpdateAsync(string name, TextTemplateContentUpdateDto input);
}

18
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/ITextTemplateDefinitionAppService.cs

@ -0,0 +1,18 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.TextTemplating;
public interface ITextTemplateDefinitionAppService : IApplicationService
{
Task<TextTemplateDefinitionDto> GetByNameAsync(string name);
Task<TextTemplateDefinitionDto> CreateAsync(TextTemplateDefinitionCreateDto input);
Task<TextTemplateDefinitionDto> UpdateAsync(string name, TextTemplateDefinitionUpdateDto input);
Task DeleteAsync(string name);
Task<PagedResultDto<TextTemplateDefinitionDto>> GetListAsync(TextTemplateDefinitionGetListInput input);
}

12
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/Permissions/AbpTextTemplatingPermissionDefinitionProvider.cs

@ -10,10 +10,14 @@ public class AbpTextTemplatingPermissionDefinitionProvider : PermissionDefinitio
{
var textTemplatingGroup = context.AddGroup(AbpTextTemplatingPermissions.GroupName, L("Permission:TextTemplating"));
var textTemplatePermission = textTemplatingGroup.AddPermission(AbpTextTemplatingPermissions.TextTemplate.Default, L("Permission:TextTemplates"));
textTemplatePermission.AddChild(AbpTextTemplatingPermissions.TextTemplate.Create, L("Permission:Create"));
textTemplatePermission.AddChild(AbpTextTemplatingPermissions.TextTemplate.Update, L("Permission:Edit"));
textTemplatePermission.AddChild(AbpTextTemplatingPermissions.TextTemplate.Delete, L("Permission:Delete"));
var textTemplateDefinition = textTemplatingGroup.AddPermission(AbpTextTemplatingPermissions.TextTemplateDefinition.Default, L("Permission:TextTemplateDefinitions"));
textTemplateDefinition.AddChild(AbpTextTemplatingPermissions.TextTemplateDefinition.Create, L("Permission:Create"));
textTemplateDefinition.AddChild(AbpTextTemplatingPermissions.TextTemplateDefinition.Update, L("Permission:Edit"));
textTemplateDefinition.AddChild(AbpTextTemplatingPermissions.TextTemplateDefinition.Delete, L("Permission:Delete"));
var textTemplateContent = textTemplatingGroup.AddPermission(AbpTextTemplatingPermissions.TextTemplateContent.Default, L("Permission:TextTemplateContents"));
textTemplateContent.AddChild(AbpTextTemplatingPermissions.TextTemplateContent.Update, L("Permission:Edit"));
textTemplateContent.AddChild(AbpTextTemplatingPermissions.TextTemplateContent.Delete, L("Permission:Delete"));
}
private static LocalizableString L(string name)

11
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/Permissions/AbpTextTemplatingPermissions.cs

@ -6,9 +6,16 @@ public static class AbpTextTemplatingPermissions
{
public const string GroupName = "AbpTextTemplating";
public static class TextTemplate
public static class TextTemplateContent
{
public const string Default = GroupName + ".TextTemplates";
public const string Default = GroupName + ".TextTemplateContents";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}
public static class TextTemplateDefinition
{
public const string Default = GroupName + ".TextTemplateDefinitions";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";

6
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateUpdateInput.cs → aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateContentUpdateDto.cs

@ -3,12 +3,8 @@ using Volo.Abp.Validation;
namespace LINGYUN.Abp.TextTemplating;
public class TextTemplateUpdateInput
public class TextTemplateContentUpdateDto
{
[Required]
[DynamicStringLength(typeof(TextTemplateConsts), nameof(TextTemplateConsts.MaxNameLength))]
public string Name { get; set; }
[DynamicStringLength(typeof(TextTemplateConsts), nameof(TextTemplateConsts.MaxCultureLength))]
public string Culture { get; set; }

11
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionCreateDto.cs

@ -0,0 +1,11 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.TextTemplating;
public class TextTemplateDefinitionCreateDto : TextTemplateDefinitionCreateOrUpdateDto
{
[Required]
[DynamicStringLength(typeof(TextTemplateDefinitionConsts), nameof(TextTemplateDefinitionConsts.MaxNameLength))]
public string Name { get; set; }
}

24
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionCreateOrUpdateDto.cs

@ -0,0 +1,24 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.TextTemplating;
public abstract class TextTemplateDefinitionCreateOrUpdateDto
{
[Required]
[DynamicStringLength(typeof(TextTemplateDefinitionConsts), nameof(TextTemplateDefinitionConsts.MaxDisplayNameLength))]
public string DisplayName { get; set; }
[DynamicStringLength(typeof(TextTemplateDefinitionConsts), nameof(TextTemplateDefinitionConsts.MaxDefaultCultureNameLength))]
public string DefaultCultureName { get; set; }
public bool IsInlineLocalized { get; set; }
public bool IsLayout { get; set; }
[DynamicStringLength(typeof(TextTemplateDefinitionConsts), nameof(TextTemplateDefinitionConsts.MaxLayoutLength))]
public string Layout { get; set; }
[DynamicStringLength(typeof(TextTemplateDefinitionConsts), nameof(TextTemplateDefinitionConsts.MaxRenderEngineLength))]
public string RenderEngine { get; set; }
}

8
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionDto.cs

@ -1,6 +1,8 @@
namespace LINGYUN.Abp.TextTemplating;
using Volo.Abp.Domain.Entities;
public class TextTemplateDefinitionDto
namespace LINGYUN.Abp.TextTemplating;
public class TextTemplateDefinitionDto : IHasConcurrencyStamp
{
public string Name { get; set; }
public string DisplayName { get; set; }
@ -8,4 +10,6 @@ public class TextTemplateDefinitionDto
public bool IsInlineLocalized { get; set; }
public bool IsLayout { get; set; }
public string Layout { get; set; }
public bool IsStatic { get; set; }
public string ConcurrencyStamp { get; set; }
}

7
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionUpdateDto.cs

@ -0,0 +1,7 @@
using Volo.Abp.Domain.Entities;
namespace LINGYUN.Abp.TextTemplating;
public class TextTemplateDefinitionUpdateDto : TextTemplateDefinitionCreateOrUpdateDto, IHasConcurrencyStamp
{
public string ConcurrencyStamp { get; set; }
}

7
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateRestoreInput.cs

@ -1,14 +1,9 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.TextTemplating;
public class TextTemplateRestoreInput
{
[Required]
[DynamicStringLength(typeof(TextTemplateConsts), nameof(TextTemplateConsts.MaxNameLength))]
public string Name { get; set; }
[DynamicStringLength(typeof(TextTemplateConsts), nameof(TextTemplateConsts.MaxCultureLength))]
public string Culture { get; set; }
}

4
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN.Abp.TextTemplating.Application.csproj

@ -8,6 +8,10 @@
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<None Remove="LINGYUN\Abp\TextTemplating\TextTemplateDefinitionAppService.cs~RF1f4f741d.TMP" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Ddd.Application" Version="$(VoloAbpPackageVersion)" />
<PackageReference Include="Volo.Abp.AutoMapper" Version="$(VoloAbpPackageVersion)" />

1
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/AbpTextTemplatingApplicationAutoMapperProfile.cs

@ -6,5 +6,6 @@ public class AbpTextTemplatingApplicationAutoMapperProfile : Profile
{
public AbpTextTemplatingApplicationAutoMapperProfile()
{
CreateMap<TextTemplateDefinition, TextTemplateDefinitionDto>();
}
}

174
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/TextTemplateAppService.cs

@ -1,174 +0,0 @@
using Microsoft.AspNetCore.Authorization;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Localization;
using Volo.Abp.TextTemplating;
namespace LINGYUN.Abp.TextTemplating;
[Authorize(AbpTextTemplatingPermissions.TextTemplate.Default)]
public class TextTemplateAppService : AbpTextTemplatingAppServiceBase, ITextTemplateAppService
{
protected ITextTemplateRepository TextTemplateRepository { get; }
protected ITemplateContentProvider TemplateContentProvider { get; }
protected ITemplateDefinitionManager TemplateDefinitionManager { get; }
public TextTemplateAppService(
ITextTemplateRepository textTemplateRepository,
ITemplateContentProvider templateContentProvider,
ITemplateDefinitionManager templateDefinitionManager)
{
TextTemplateRepository = textTemplateRepository;
TemplateContentProvider = templateContentProvider;
TemplateDefinitionManager = templateDefinitionManager;
}
public virtual Task<TextTemplateDefinitionDto> GetAsync(string name)
{
var templateDefinition = GetTemplateDefinition(name);
var layout = templateDefinition.Layout;
if (!layout.IsNullOrWhiteSpace())
{
var layoutDefinition = GetTemplateDefinition(templateDefinition.Layout);
layout = layoutDefinition.DisplayName.Localize(StringLocalizerFactory);
}
var result = new TextTemplateDefinitionDto
{
DefaultCultureName = templateDefinition.DefaultCultureName,
IsInlineLocalized = templateDefinition.IsInlineLocalized,
IsLayout = templateDefinition.IsLayout,
Layout = layout,
Name = templateDefinition.Name,
DisplayName = templateDefinition.DisplayName.Localize(StringLocalizerFactory),
};
return Task.FromResult(result);
}
public async virtual Task<TextTemplateContentDto> GetContentAsync(TextTemplateContentGetInput input)
{
var templateDefinition = GetTemplateDefinition(input.Name);
var content = await TemplateContentProvider.GetContentOrNullAsync(templateDefinition.Name, input.Culture);
return new TextTemplateContentDto
{
Name = templateDefinition.Name,
Culture = input.Culture,
Content = content,
};
}
public virtual Task<PagedResultDto<TextTemplateDefinitionDto>> GetListAsync(TextTemplateDefinitionGetListInput input)
{
var templates = new List<TextTemplateDefinitionDto>();
var templateDefinitions = TemplateDefinitionManager.GetAll();
var filterTemplates = templateDefinitions
.WhereIf(!input.Filter.IsNullOrWhiteSpace(), x =>
x.Name.Contains(input.Filter) || x.Layout.Contains(input.Filter))
.Skip(input.SkipCount)
.Take(input.MaxResultCount);
foreach (var templateDefinition in filterTemplates)
{
var layout = templateDefinition.Layout;
if (!layout.IsNullOrWhiteSpace())
{
var layoutDefinition = GetTemplateDefinition(templateDefinition.Layout);
layout = layoutDefinition.DisplayName.Localize(StringLocalizerFactory);
}
var result = new TextTemplateDefinitionDto
{
DefaultCultureName = templateDefinition.DefaultCultureName,
IsInlineLocalized = templateDefinition.IsInlineLocalized,
IsLayout = templateDefinition.IsLayout,
Layout = layout,
Name = templateDefinition.Name,
DisplayName = templateDefinition.DisplayName.Localize(StringLocalizerFactory),
};
templates.Add(result);
}
return Task.FromResult(new PagedResultDto<TextTemplateDefinitionDto>(templateDefinitions.Count, templates));
}
[Authorize(AbpTextTemplatingPermissions.TextTemplate.Delete)]
public async virtual Task RestoreToDefaultAsync(TextTemplateRestoreInput input)
{
var templateDefinition = GetTemplateDefinition(input.Name);
var templates = await TextTemplateRepository
.GetListAsync(x => x.Name.Equals(templateDefinition.Name) && x.Culture.Equals(input.Culture));
await TextTemplateRepository.DeleteManyAsync(templates);
await CurrentUnitOfWork.SaveChangesAsync();
}
[Authorize(AbpTextTemplatingPermissions.TextTemplate.Update)]
public async virtual Task<TextTemplateDefinitionDto> UpdateAsync(TextTemplateUpdateInput input)
{
var templateDefinition = GetTemplateDefinition(input.Name);
var template = await TextTemplateRepository.FindByNameAsync(input.Name, input.Culture);
if (template == null)
{
template = new TextTemplate(
GuidGenerator.Create(),
templateDefinition.Name,
templateDefinition.DisplayName.Localize(StringLocalizerFactory),
input.Content,
input.Culture);
await TextTemplateRepository.InsertAsync(template);
}
else
{
template.SetContent(input.Content);
await TextTemplateRepository.UpdateAsync(template);
}
await CurrentUnitOfWork.SaveChangesAsync();
var layout = templateDefinition.Layout;
if (!layout.IsNullOrWhiteSpace())
{
var layoutDefinition = GetTemplateDefinition(templateDefinition.Layout);
layout = layoutDefinition.DisplayName.Localize(StringLocalizerFactory);
}
return new TextTemplateDefinitionDto
{
DefaultCultureName = templateDefinition.DefaultCultureName,
IsInlineLocalized = templateDefinition.IsInlineLocalized,
IsLayout = templateDefinition.IsLayout,
Layout = layout,
Name = templateDefinition.Name,
DisplayName = templateDefinition.DisplayName.Localize(StringLocalizerFactory),
};
}
protected virtual TemplateDefinition GetTemplateDefinition(string name)
{
var template = TemplateDefinitionManager.GetOrNull(name);
if (template == null)
{
throw new BusinessException(
AbpTextTemplatingErrorCodes.TemplateNotFound,
$"The text template {name} does not exist!")
.WithData("Name", name);
}
return template;
}
}

127
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/TextTemplateContentAppService.cs

@ -0,0 +1,127 @@
using Microsoft.AspNetCore.Authorization;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.TextTemplating;
namespace LINGYUN.Abp.TextTemplating;
[Authorize(AbpTextTemplatingPermissions.TextTemplateContent.Default)]
public class TextTemplateContentAppService : AbpTextTemplatingAppServiceBase, ITextTemplateContentAppService
{
protected ITextTemplateRepository TextTemplateRepository { get; }
protected ITemplateContentProvider TemplateContentProvider { get; }
protected ITemplateDefinitionStore TemplateDefinitionStore { get; }
public TextTemplateContentAppService(
ITextTemplateRepository textTemplateRepository,
ITemplateContentProvider templateContentProvider,
ITemplateDefinitionStore templateDefinitionStore)
{
TextTemplateRepository = textTemplateRepository;
TemplateContentProvider = templateContentProvider;
TemplateDefinitionStore = templateDefinitionStore;
}
public async virtual Task<TextTemplateContentDto> GetAsync(TextTemplateContentGetInput input)
{
var templateDefinition = await GetTemplateDefinition(input.Name);
var content = await TemplateContentProvider.GetContentOrNullAsync(templateDefinition.Name, input.Culture);
return new TextTemplateContentDto
{
Name = templateDefinition.Name,
Culture = input.Culture,
Content = content,
};
}
//public virtual Task<PagedResultDto<TextTemplateDefinitionDto>> GetListAsync(TextTemplateDefinitionGetListInput input)
//{
// var templates = new List<TextTemplateDefinitionDto>();
// var templateDefinitions = TemplateDefinitionManager.GetAll();
// var filterTemplates = templateDefinitions
// .WhereIf(!input.Filter.IsNullOrWhiteSpace(), x =>
// x.Name.Contains(input.Filter) || x.Layout.Contains(input.Filter))
// .Skip(input.SkipCount)
// .Take(input.MaxResultCount);
// foreach (var templateDefinition in filterTemplates)
// {
// var layout = templateDefinition.Layout;
// if (!layout.IsNullOrWhiteSpace())
// {
// var layoutDefinition = GetTemplateDefinition(templateDefinition.Layout);
// layout = layoutDefinition.DisplayName.Localize(StringLocalizerFactory);
// }
// var result = new TextTemplateDefinitionDto
// {
// DefaultCultureName = templateDefinition.DefaultCultureName,
// IsInlineLocalized = templateDefinition.IsInlineLocalized,
// IsLayout = templateDefinition.IsLayout,
// Layout = layout,
// Name = templateDefinition.Name,
// DisplayName = templateDefinition.DisplayName.Localize(StringLocalizerFactory),
// };
// templates.Add(result);
// }
// return Task.FromResult(new PagedResultDto<TextTemplateDefinitionDto>(templateDefinitions.Count, templates));
//}
[Authorize(AbpTextTemplatingPermissions.TextTemplateContent.Delete)]
public async virtual Task RestoreToDefaultAsync(string name, TextTemplateRestoreInput input)
{
var templateDefinition = await GetTemplateDefinition(name);
var templates = await TextTemplateRepository
.GetListAsync(x => x.Name.Equals(templateDefinition.Name) && x.Culture.Equals(input.Culture));
await TextTemplateRepository.DeleteManyAsync(templates);
await CurrentUnitOfWork.SaveChangesAsync();
}
[Authorize(AbpTextTemplatingPermissions.TextTemplateContent.Update)]
public async virtual Task<TextTemplateContentDto> UpdateAsync(string name, TextTemplateContentUpdateDto input)
{
var templateDefinition = await GetTemplateDefinition(name);
var template = await TextTemplateRepository.FindByNameAsync(name, input.Culture);
if (template == null)
{
template = new TextTemplate(
GuidGenerator.Create(),
templateDefinition.Name,
templateDefinition.DisplayName.Localize(StringLocalizerFactory),
input.Content,
input.Culture);
await TextTemplateRepository.InsertAsync(template);
}
else
{
template.SetContent(input.Content);
await TextTemplateRepository.UpdateAsync(template);
}
await CurrentUnitOfWork.SaveChangesAsync();
return new TextTemplateContentDto
{
Name = templateDefinition.Name,
Culture = input.Culture,
Content = template.Content,
};
}
protected async virtual Task<TemplateDefinition> GetTemplateDefinition(string name)
{
return await TemplateDefinitionStore.GetOrNullAsync(name)
?? throw new BusinessException(AbpTextTemplatingErrorCodes.TextTemplateDefinition.TemplateNotFound)
.WithData(nameof(TextTemplateDefinition.Name), name);
}
}

257
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionAppService.cs

@ -0,0 +1,257 @@
using Microsoft.AspNetCore.Authorization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Localization;
using Volo.Abp.TextTemplating;
namespace LINGYUN.Abp.TextTemplating;
[Authorize(AbpTextTemplatingPermissions.TextTemplateDefinition.Default)]
public class TextTemplateDefinitionAppService : AbpTextTemplatingAppServiceBase, ITextTemplateDefinitionAppService
{
private readonly ITemplateDefinitionStore _store;
private readonly ITextTemplateDefinitionRepository _repository;
private readonly ILocalizableStringSerializer _localizableStringSerializer;
public TextTemplateDefinitionAppService(
ITemplateDefinitionStore store,
ITextTemplateDefinitionRepository repository,
ILocalizableStringSerializer localizableStringSerializer)
{
_store = store;
_repository = repository;
_localizableStringSerializer = localizableStringSerializer;
}
[Authorize(AbpTextTemplatingPermissions.TextTemplateDefinition.Create)]
public async virtual Task<TextTemplateDefinitionDto> CreateAsync(TextTemplateDefinitionCreateDto input)
{
var template = await _store.GetOrNullAsync(input.Name);
if (template != null)
{
throw new BusinessException(AbpTextTemplatingErrorCodes.TextTemplateDefinition.NameAlreadyExists)
.WithData(nameof(TextTemplateDefinition.Name), input.Name);
}
var layout = input.Layout;
if (!layout.IsNullOrWhiteSpace())
{
var layoutDefinition = await _store.GetAsync(layout);
layout = await layoutDefinition.DisplayName.LocalizeAsync(StringLocalizerFactory);
}
var formatDisplayName = input.DisplayName;
if (!formatDisplayName.IsNullOrWhiteSpace())
{
var displayName = _localizableStringSerializer.Deserialize(formatDisplayName);
formatDisplayName = await displayName.LocalizeAsync(StringLocalizerFactory);
}
var templateDefinition = new TextTemplateDefinition(
GuidGenerator.Create(),
input.Name,
input.DisplayName,
input.IsLayout,
input.Layout,
input.IsInlineLocalized,
input.DefaultCultureName,
input.RenderEngine);
await _store.CreateAsync(templateDefinition);
await CurrentUnitOfWork.SaveChangesAsync();
var result = new TextTemplateDefinitionDto
{
DefaultCultureName = templateDefinition.DefaultCultureName,
IsInlineLocalized = templateDefinition.IsInlineLocalized,
IsLayout = templateDefinition.IsLayout,
Layout = layout,
Name = templateDefinition.Name,
DisplayName = formatDisplayName,
IsStatic = templateDefinition.IsStatic,
ConcurrencyStamp = templateDefinition.ConcurrencyStamp,
};
return result;
}
[Authorize(AbpTextTemplatingPermissions.TextTemplateDefinition.Delete)]
public async virtual Task DeleteAsync(string name)
{
await _store.DeleteAsync(name);
}
public async virtual Task<TextTemplateDefinitionDto> GetByNameAsync(string name)
{
var template = await _store.GetAsync(name);
var layout = template.Layout;
if (!layout.IsNullOrWhiteSpace())
{
var layoutDefinition = await _store.GetAsync(template.Layout);
layout = await layoutDefinition.DisplayName.LocalizeAsync(StringLocalizerFactory);
}
var result = new TextTemplateDefinitionDto
{
DefaultCultureName = template.DefaultCultureName,
IsInlineLocalized = template.IsInlineLocalized,
IsLayout = template.IsLayout,
Layout = layout,
Name = template.Name,
DisplayName = await template.DisplayName.LocalizeAsync(StringLocalizerFactory),
};
var staticState = template.Properties.GetOrDefault(nameof(TextTemplateDefinition.IsStatic));
if (staticState != null && staticState is bool isStatic)
{
result.IsStatic = isStatic;
}
return result;
}
public async virtual Task<PagedResultDto<TextTemplateDefinitionDto>> GetListAsync(TextTemplateDefinitionGetListInput input)
{
var templates = new List<TextTemplateDefinitionDto>();
var templateDefinitions = await _store.GetAllAsync();
var sorting = input.Sorting;
if (sorting.IsNullOrWhiteSpace())
{
sorting = nameof(TextTemplateDefinition.Name);
}
var filterTemplates = templateDefinitions.AsQueryable()
.WhereIf(!input.Filter.IsNullOrWhiteSpace(), x =>
x.Name.Contains(input.Filter) || x.Layout.Contains(input.Filter))
.OrderBy(sorting)
.Skip(input.SkipCount)
.Take(input.MaxResultCount);
foreach (var templateDefinition in filterTemplates)
{
var layout = templateDefinition.Layout;
if (!layout.IsNullOrWhiteSpace())
{
var layoutDefinition = await _store.GetOrNullAsync(templateDefinition.Layout);
if (layoutDefinition != null)
{
layout = await layoutDefinition.DisplayName.LocalizeAsync(StringLocalizerFactory);
}
}
var result = new TextTemplateDefinitionDto
{
DefaultCultureName = templateDefinition.DefaultCultureName,
IsInlineLocalized = templateDefinition.IsInlineLocalized,
IsLayout = templateDefinition.IsLayout,
Layout = layout,
Name = templateDefinition.Name,
DisplayName = templateDefinition.DisplayName.Localize(StringLocalizerFactory),
};
var staticState = templateDefinition.Properties.GetOrDefault(nameof(TextTemplateDefinition.IsStatic));
if (staticState != null && staticState is bool isStatic)
{
result.IsStatic = isStatic;
}
templates.Add(result);
}
return new PagedResultDto<TextTemplateDefinitionDto>(templateDefinitions.Count, templates);
}
[Authorize(AbpTextTemplatingPermissions.TextTemplateDefinition.Update)]
public async virtual Task<TextTemplateDefinitionDto> UpdateAsync(string name, TextTemplateDefinitionUpdateDto input)
{
var templateDefinitionRecord = await _repository.FindByNameAsync(name);
if (templateDefinitionRecord == null)
{
var templateDefinition = await _store.GetAsync(name);
templateDefinitionRecord = new TextTemplateDefinition(
GuidGenerator.Create(),
templateDefinition.Name,
_localizableStringSerializer.Serialize(templateDefinition.DisplayName),
templateDefinition.IsLayout,
templateDefinition.Layout,
templateDefinition.IsInlineLocalized,
templateDefinition.DefaultCultureName,
templateDefinition.RenderEngine);
UpdateByInput(templateDefinitionRecord, input);
await _store.CreateAsync(templateDefinitionRecord);
}
else
{
UpdateByInput(templateDefinitionRecord, input);
if (!string.Equals(templateDefinitionRecord.DisplayName, input.DisplayName, StringComparison.InvariantCultureIgnoreCase))
{
var displayNameD = _localizableStringSerializer.Deserialize(input.DisplayName);
templateDefinitionRecord.DisplayName = await displayNameD.LocalizeAsync(StringLocalizerFactory);
}
await _store.UpdateAsync(templateDefinitionRecord);
}
await CurrentUnitOfWork.SaveChangesAsync();
var layout = templateDefinitionRecord.Layout;
if (!layout.IsNullOrWhiteSpace())
{
var layoutDefinition = await _store.GetAsync(layout);
layout = await layoutDefinition.DisplayName.LocalizeAsync(StringLocalizerFactory);
}
var displayName = templateDefinitionRecord.DisplayName;
if (!displayName.IsNullOrWhiteSpace())
{
var displayNameD = _localizableStringSerializer.Deserialize(displayName);
displayName = await displayNameD.LocalizeAsync(StringLocalizerFactory);
}
var result = new TextTemplateDefinitionDto
{
DefaultCultureName = templateDefinitionRecord.DefaultCultureName,
IsInlineLocalized = templateDefinitionRecord.IsInlineLocalized,
IsLayout = templateDefinitionRecord.IsLayout,
Layout = layout,
Name = templateDefinitionRecord.Name,
DisplayName = displayName,
IsStatic = templateDefinitionRecord.IsStatic,
ConcurrencyStamp = templateDefinitionRecord.ConcurrencyStamp,
};
return result;
}
protected virtual void UpdateByInput(TextTemplateDefinition templateDefinition, TextTemplateDefinitionCreateOrUpdateDto input)
{
templateDefinition.IsInlineLocalized = input.IsInlineLocalized;
templateDefinition.IsLayout = input.IsLayout;
if (!string.Equals(templateDefinition.Layout, input.Layout, StringComparison.InvariantCultureIgnoreCase))
{
templateDefinition.Layout = input.Layout;
}
if (!string.Equals(templateDefinition.DefaultCultureName, input.DefaultCultureName, StringComparison.InvariantCultureIgnoreCase))
{
templateDefinition.DefaultCultureName = input.DefaultCultureName;
}
if (!string.Equals(templateDefinition.RenderEngine, input.RenderEngine, StringComparison.InvariantCultureIgnoreCase))
{
templateDefinition.RenderEngine = input.RenderEngine;
}
}
}

17
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/AbpTextTemplatingErrorCodes.cs

@ -3,9 +3,16 @@
public static class AbpTextTemplatingErrorCodes
{
public const string Namespace = "TextTemplating";
/// <summary>
/// 模板不存在!
/// </summary>
public const string TemplateNotFound = Namespace + ":01404";
public static class TextTemplateDefinition
{
private const string Prefix = Namespace + ":01";
/// <summary>
/// 模板 {Name} 已经存在
/// </summary>
public const string NameAlreadyExists = Prefix + "100";
/// <summary>
/// 模板 {Name} 不存在!
/// </summary>
public const string TemplateNotFound = Prefix + "404";
}
}

15
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/en.json

@ -2,18 +2,24 @@
"culture": "en",
"texts": {
"Permission:TextTemplating": "Templating",
"Permission:TextTemplates": "Text Templates",
"Permission:TextTemplateContents": "Template Contents",
"Permission:TextTemplateDefinitions": "Template Definitions",
"Permission:Create": "Create",
"Permission:Edit": "Edit",
"Permission:Delete": "Delete",
"TextTemplates": "Text Templates",
"DisplayName:Name": "Name",
"DisplayName:Culture": "Culture",
"DisplayName:Content": "Content",
"DisplayName:DisplayName": "DisplayName",
"DisplayName:IsInlineLocalized": "Is Inline Localized",
"DisplayName:IsLayout": "Is Layout",
"DisplayName:Layout": "Layout",
"DisplayName:DefaultCultureName": "Default Culture",
"DisplayName:RenderEngine": "Render Engine",
"DisplayName:IsStatic": "Static",
"TextTemplating:01100": "Text template {Name} already exists!",
"TextTemplating:01404": "No text template named {Name} found!",
"TextTemplates": "Text Templates",
"Contents": "Contents",
"Layout": "Layout",
"LocalizationResource": "Localization Resource",
@ -30,6 +36,9 @@
"TemplateContentUpdated": "The template content has been updated",
"TemplateContentRestoredToDefault": "The template content is restored to the default value.",
"CustomizePerCulture": "Customize per culture",
"InlineContentDescription": "This template uses inline localization. You can use the <b>L<\/b> function to localize a text, like <b>{{L \"Hello\"}}<\/b>. If you still want to define a completely new template for a culture, use the \"Customize per culture\" button. <br /> To get more information about syntax and other details, please check the <a href=\"https://docs.abp.io/en/abp/latest/Text-Templating\" target=\"_blank\">Text Templates documentation<\/a>.."
"InlineContentDescription": "This template uses inline localization. You can use the <b>L<\/b> function to localize a text, like <b>{{L \"Hello\"}}<\/b>. If you still want to define a completely new template for a culture, use the \"Customize per culture\" button. <br /> To get more information about syntax and other details, please check the <a href=\"https://docs.abp.io/en/abp/latest/Text-Templating\" target=\"_blank\">Text Templates documentation<\/a>..",
"RestoreTemplateToDefault": "Revert to the default template",
"RestoreTemplateToDefaultMessage": "Are you sure? This is a built-in template. This operation restores the template to its default properties.",
"TemplateUpdated": "Template properties have been updated"
}
}

15
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/zh-Hans.json

@ -2,18 +2,24 @@
"culture": "zh-Hans",
"texts": {
"Permission:TextTemplating": "模板管理",
"Permission:TextTemplates": "文本模板",
"Permission:TextTemplateContents": "模板内容",
"Permission:TextTemplateDefinitions": "定义模板",
"Permission:Create": "新增",
"Permission:Edit": "修改",
"Permission:Delete": "删除",
"TextTemplates": "文本模板",
"DisplayName:Name": "名称",
"DisplayName:Culture": "区域",
"DisplayName:Content": "内容",
"DisplayName:DisplayName": "显示名称",
"DisplayName:IsInlineLocalized": "内联本地化",
"DisplayName:IsLayout": "是否为布局页",
"DisplayName:Layout": "布局页",
"DisplayName:DefaultCultureName": "默认文化名称",
"DisplayName:RenderEngine": "渲染引擎",
"DisplayName:IsStatic": "内置",
"TextTemplating:01100": "文本模板 {Name} 已经存在!",
"TextTemplating:01404": "没有找到名为 {Name} 的文本模板!",
"TextTemplates": "文本模板",
"Contents": "内容",
"Layout": "布局页",
"LocalizationResource": "本地化资源",
@ -30,6 +36,9 @@
"TemplateContentUpdated": "模板内容已更新",
"TemplateContentRestoredToDefault": "模板内容恢复为默认值.",
"CustomizePerCulture": "根据文化定制",
"InlineContentDescription": "该模板使用内联本地化. 你可以使用<b>L</b>函数对文本进行本地化,例如 <b>{{L \"Hello\"}}</b>如果你仍想为区域性定义一个全新的模板,请使用\"根据文化定制\"按钮. <br />请检查<a href=\"https://docs.abp.io/en/abp/latest/Text-Templating\" target=\"_blank\">文本模板文档</a>获取更多信息."
"InlineContentDescription": "该模板使用内联本地化. 你可以使用<b>L</b>函数对文本进行本地化,例如 <b>{{L \"Hello\"}}</b>如果你仍想为区域性定义一个全新的模板,请使用\"根据文化定制\"按钮. <br />请检查<a href=\"https://docs.abp.io/en/abp/latest/Text-Templating\" target=\"_blank\">文本模板文档</a>获取更多信息.",
"RestoreTemplateToDefault": "还原到默认模板",
"RestoreTemplateToDefaultMessage": "你确定吗? 此模板为内置模板, 此操作将还原模板为默认属性.",
"TemplateUpdated": "模板属性已更新"
}
}

9
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionConsts.cs

@ -0,0 +1,9 @@
namespace LINGYUN.Abp.TextTemplating;
public static class TextTemplateDefinitionConsts
{
public static int MaxNameLength { get; set; } = 128;
public static int MaxDisplayNameLength { get; set; } = 512;
public static int MaxLayoutLength { get; set; } = 60;
public static int MaxDefaultCultureNameLength { get; set; } = 30;
public static int MaxRenderEngineLength { get; set; } = 30;
}

5
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN.Abp.TextTemplating.Domain.csproj

@ -8,10 +8,15 @@
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<None Remove="LINGYUN\Abp\TextTemplating\55rcuzt3.mzx~" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.Caching" Version="$(VoloAbpPackageVersion)" />
<PackageReference Include="Volo.Abp.Ddd.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageReference Include="Volo.Abp.TextTemplating.Core" Version="$(VoloAbpPackageVersion)" />
<PackageReference Include="Polly" Version="$(PollyPackageVersion)" />
</ItemGroup>
<ItemGroup>

29
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/AbpTextTemplatingCachingOptions.cs

@ -12,10 +12,39 @@ public class AbpTextTemplatingCachingOptions
/// 文本模板缓存绝对过期时间
/// </summary>
public TimeSpan? MaximumCacheDuration { get; set; }
/// <summary>
/// Default: true.
/// </summary>
public bool SaveStaticTemplateDefinitionToDatabase { get; set; }
/// <summary>
/// Default: false.
/// </summary>
public bool IsDynamicTemplateDefinitionStoreEnabled { get; set; }
/// <summary>
/// 缓存刷新时间
/// default: 2 hours
/// </summary>
public TimeSpan TemplateDefinitionsCacheRefreshInterval { get; set; }
/// <summary>
/// 申请时间戳超时时间
/// default: 1 minutes
/// </summary>
public TimeSpan TemplateDefinitionsCacheStampTimeOut { get; set; }
/// <summary>
/// 时间戳过期时间
/// default: 30 days
/// </summary>
public TimeSpan TemplateDefinitionsCacheStampExpiration { get; set; }
public AbpTextTemplatingCachingOptions()
{
MinimumCacheDuration = TimeSpan.FromHours(1);
MaximumCacheDuration = TimeSpan.FromDays(30);
SaveStaticTemplateDefinitionToDatabase = true;
IsDynamicTemplateDefinitionStoreEnabled = false;
TemplateDefinitionsCacheRefreshInterval = TimeSpan.FromHours(2);
TemplateDefinitionsCacheStampTimeOut = TimeSpan.FromMinutes(1);
TemplateDefinitionsCacheStampExpiration = TimeSpan.FromDays(30);
}
}

38
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/AbpTextTemplatingDomainModule.cs

@ -1,6 +1,12 @@
using Volo.Abp.Caching;
using Microsoft.Extensions.DependencyInjection;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Caching;
using Volo.Abp.Data;
using Volo.Abp.Modularity;
using Volo.Abp.TextTemplating;
using Volo.Abp.Threading;
namespace LINGYUN.Abp.TextTemplating;
@ -10,5 +16,35 @@ namespace LINGYUN.Abp.TextTemplating;
typeof(AbpCachingModule))]
public class AbpTextTemplatingDomainModule : AbpModule
{
private readonly CancellationTokenSource _cancellationTokenSource = new();
public override void ConfigureServices(ServiceConfigurationContext context)
{
if (context.Services.IsDataMigrationEnvironment())
{
Configure<AbpTextTemplatingCachingOptions>(options =>
{
options.SaveStaticTemplateDefinitionToDatabase = false;
options.IsDynamicTemplateDefinitionStoreEnabled = false;
});
}
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
AsyncHelper.RunSync(() => OnApplicationInitializationAsync(context));
}
public override Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
{
return context.ServiceProvider
.GetRequiredService<TextTemplateDefinitionInitializer>()
.InitializeDynamicTemplates(_cancellationTokenSource.Token);
}
public override Task OnApplicationShutdownAsync(ApplicationShutdownContext context)
{
_cancellationTokenSource.Cancel();
return Task.CompletedTask;
}
}

7
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/IStaticTemplateDefinitionSaver.cs

@ -0,0 +1,7 @@
using System.Threading.Tasks;
namespace LINGYUN.Abp.TextTemplating;
public interface IStaticTemplateDefinitionSaver
{
Task SaveAsync();
}

24
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/ITemplateDefinitionStore.cs

@ -0,0 +1,24 @@
using JetBrains.Annotations;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.TextTemplating;
namespace LINGYUN.Abp.TextTemplating;
public interface ITemplateDefinitionStore
{
Task CreateAsync(TextTemplateDefinition template);
Task UpdateAsync(TextTemplateDefinition template);
Task DeleteAsync(string name, CancellationToken cancellationToken = default);
[NotNull]
Task<TemplateDefinition> GetAsync(string name, CancellationToken cancellationToken = default);
[NotNull]
Task<IReadOnlyList<TemplateDefinition>> GetAllAsync(CancellationToken cancellationToken = default);
[CanBeNull]
Task<TemplateDefinition> GetOrNullAsync(string name, CancellationToken cancellationToken = default);
}

24
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/ITemplateDefinitionStoreCache.cs

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.TextTemplating;
namespace LINGYUN.Abp.TextTemplating;
public interface ITemplateDefinitionStoreCache
{
string CacheStamp { get; set; }
SemaphoreSlim SyncSemaphore { get; }
DateTime? LastCheckTime { get; set; }
Task FillAsync(
List<TextTemplateDefinition> templateDefinitionRecords,
IReadOnlyList<TemplateDefinition> templateDefinitions);
TemplateDefinition GetOrNull(string name);
IReadOnlyList<TemplateDefinition> GetAll();
}

24
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/ITextTemplateDefinitionRepository.cs

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
namespace LINGYUN.Abp.TextTemplating;
public interface ITextTemplateDefinitionRepository : IBasicRepository<TextTemplateDefinition, Guid>
{
Task<TextTemplateDefinition> FindByNameAsync(
string name,
CancellationToken cancellationToken = default);
Task<long> GetCountAsync(
string filter = null,
CancellationToken cancellationToken = default);
Task<List<TextTemplateDefinition>> GetListAsync(
string filter = null,
string sorting = nameof(TextTemplateDefinition.Name),
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default);
}

12
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/ITextTemplateDefinitionSerializer.cs

@ -0,0 +1,12 @@
using JetBrains.Annotations;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.TextTemplating;
namespace LINGYUN.Abp.TextTemplating;
public interface ITextTemplateDefinitionSerializer
{
Task<TextTemplateDefinition> SerializeAsync(TemplateDefinition template);
}

86
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/InMemoryTemplateDefinitionStoreCache.cs

@ -0,0 +1,86 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization;
using Volo.Abp.TextTemplating;
namespace LINGYUN.Abp.TextTemplating;
public class InMemoryTemplateDefinitionStoreCache : ITemplateDefinitionStoreCache, ISingletonDependency
{
public string CacheStamp { get; set; }
public SemaphoreSlim SyncSemaphore { get; }
public DateTime? LastCheckTime { get; set; }
protected IDictionary<string, TemplateDefinition> TemplateDefinitions { get; }
protected ILocalizableStringSerializer LocalizableStringSerializer { get; }
public InMemoryTemplateDefinitionStoreCache(ILocalizableStringSerializer localizableStringSerializer)
{
LocalizableStringSerializer = localizableStringSerializer;
SyncSemaphore = new(1, 1);
TemplateDefinitions = new ConcurrentDictionary<string, TemplateDefinition>();
}
public virtual Task FillAsync(
List<TextTemplateDefinition> templateDefinitionRecords,
IReadOnlyList<TemplateDefinition> templateDefinitions)
{
TemplateDefinitions.Clear();
foreach (var templateDefinitionRecord in templateDefinitionRecords)
{
var templateDefinition = new TemplateDefinition(
templateDefinitionRecord.Name,
typeof(NonTypedLocalizationResource),
LocalizableStringSerializer.Deserialize(templateDefinitionRecord.DisplayName),
templateDefinitionRecord.IsLayout,
templateDefinitionRecord.Layout,
templateDefinitionRecord.DefaultCultureName)
{
IsInlineLocalized = templateDefinitionRecord.IsInlineLocalized,
};
if (!templateDefinitionRecord.RenderEngine.IsNullOrWhiteSpace())
{
templateDefinition.WithRenderEngine(templateDefinitionRecord.RenderEngine);
}
foreach (var property in templateDefinitionRecord.ExtraProperties)
{
templateDefinition.WithProperty(property.Key, property.Value);
}
templateDefinition.WithProperty(nameof(TextTemplateDefinition.IsStatic), templateDefinitionRecord.IsStatic);
TemplateDefinitions[templateDefinition.Name] = templateDefinition;
}
foreach (var templateDefinition in templateDefinitions)
{
if (TemplateDefinitions.TryGetValue(templateDefinition.Name, out var inCacheTemplate))
{
inCacheTemplate.WithProperty(nameof(TextTemplateDefinition.IsStatic), true);
}
else
{
templateDefinition.WithProperty(nameof(TextTemplateDefinition.IsStatic), true);
TemplateDefinitions[templateDefinition.Name] = templateDefinition;
}
}
return Task.CompletedTask;
}
public virtual TemplateDefinition GetOrNull(string name)
{
return TemplateDefinitions.GetOrDefault(name);
}
public virtual IReadOnlyList<TemplateDefinition> GetAll()
{
return TemplateDefinitions.Values.ToImmutableList();
}
}

96
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/StaticTemplateDefinitionSaver.cs

@ -0,0 +1,96 @@
using Microsoft.Extensions.Options;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Caching;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.DistributedLocking;
using Volo.Abp.Guids;
using Volo.Abp.Localization;
using Volo.Abp.TextTemplating;
using Volo.Abp.Uow;
namespace LINGYUN.Abp.TextTemplating;
public class StaticTemplateDefinitionSaver : IStaticTemplateDefinitionSaver, ITransientDependency
{
protected AbpDistributedCacheOptions CacheOptions { get; }
protected IGuidGenerator GuidGenerator { get; }
protected IAbpDistributedLock DistributedLock { get; }
protected ITextTemplateDefinitionRepository TemplateDefinitionRepository { get; }
protected AbpTextTemplatingCachingOptions TemplatingCachingOptions { get; }
protected ITemplateDefinitionManager TemplateDefinitionManager { get; }
protected ILocalizableStringSerializer LocalizableStringSerializer { get; }
public StaticTemplateDefinitionSaver(
IOptions<AbpDistributedCacheOptions> cacheOptions,
IOptions<AbpTextTemplatingCachingOptions> templatingCachingOptions,
IGuidGenerator guidGenerator,
IAbpDistributedLock distributedLock,
ITextTemplateDefinitionRepository templateDefinitionRepository,
ITemplateDefinitionManager templateDefinitionManager,
ILocalizableStringSerializer localizableStringSerializer)
{
CacheOptions = cacheOptions.Value;
GuidGenerator = guidGenerator;
DistributedLock = distributedLock;
TemplateDefinitionRepository = templateDefinitionRepository;
TemplatingCachingOptions = templatingCachingOptions.Value;
TemplateDefinitionManager = templateDefinitionManager;
LocalizableStringSerializer = localizableStringSerializer;
}
[UnitOfWork]
public async virtual Task SaveAsync()
{
if (TemplatingCachingOptions.SaveStaticTemplateDefinitionToDatabase)
{
await using var commonLockHandle = await DistributedLock
.TryAcquireAsync(GetCommonDistributedLockKey(), TemplatingCachingOptions.TemplateDefinitionsCacheStampTimeOut);
if (commonLockHandle == null)
{
return;
}
var templateDefinitions = TemplateDefinitionManager.GetAll();
var saveNewTemplateDefinitionRecords = new List<TextTemplateDefinition>();
foreach (var templateDefinition in templateDefinitions)
{
if (await TemplateDefinitionRepository.FindByNameAsync(templateDefinition.Name) != null)
{
continue;
}
var templateDefinitionRecord = new TextTemplateDefinition(
GuidGenerator.Create(),
templateDefinition.Name,
LocalizableStringSerializer.Serialize(templateDefinition.DisplayName),
templateDefinition.IsLayout,
templateDefinition.Layout,
templateDefinition.IsInlineLocalized,
templateDefinition.DefaultCultureName,
templateDefinition.RenderEngine)
{
IsStatic = true
};
foreach (var property in templateDefinition.Properties)
{
templateDefinitionRecord.SetProperty(property.Key, property.Value);
}
saveNewTemplateDefinitionRecords.Add(templateDefinitionRecord);
}
await TemplateDefinitionRepository.InsertManyAsync(saveNewTemplateDefinitionRecords);
}
}
protected virtual string GetCommonDistributedLockKey()
{
return $"{CacheOptions.KeyPrefix}_Common_AbpTemplateDefinitionStaticSaverLock";
}
}

5
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TemplateContentCacheItem.cs

@ -1,5 +1,8 @@
namespace LINGYUN.Abp.TextTemplating;
using System;
namespace LINGYUN.Abp.TextTemplating;
[Serializable]
public class TemplateContentCacheItem
{
private const string CacheKeyFormat = "pn:template-content,n:{0},c:{1}";

209
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TemplateDefinitionStore.cs

@ -0,0 +1,209 @@
using JetBrains.Annotations;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
using Volo.Abp.DistributedLocking;
using Volo.Abp.TextTemplating;
using Volo.Abp.Threading;
namespace LINGYUN.Abp.TextTemplating;
public class TemplateDefinitionStore : ITemplateDefinitionStore, ITransientDependency
{
protected AbpDistributedCacheOptions CacheOptions { get; }
protected AbpTextTemplatingCachingOptions TemplatingCachingOptions { get; }
protected IAbpDistributedLock DistributedLock { get; }
protected IDistributedCache DistributedCache { get; }
protected ITextTemplateDefinitionRepository TextTemplateDefinitionRepository { get; }
protected ITemplateDefinitionManager TemplateDefinitionManager { get; }
protected ITemplateDefinitionStoreCache TemplateDefinitionStoreCache { get; }
public TemplateDefinitionStore(
IOptions<AbpDistributedCacheOptions> cacheOptions,
IOptions<AbpTextTemplatingCachingOptions> templatingCachingOptions,
IAbpDistributedLock distributedLock,
IDistributedCache distributedCache,
ITextTemplateDefinitionRepository textTemplateDefinitionRepository,
ITemplateDefinitionManager templateDefinitionManager,
ITemplateDefinitionStoreCache templateDefinitionStoreCache)
{
CacheOptions = cacheOptions.Value;
TemplatingCachingOptions = templatingCachingOptions.Value;
DistributedLock = distributedLock;
DistributedCache = distributedCache;
TextTemplateDefinitionRepository = textTemplateDefinitionRepository;
TemplateDefinitionManager = templateDefinitionManager;
TemplateDefinitionStoreCache = templateDefinitionStoreCache;
}
public async virtual Task CreateAsync(TextTemplateDefinition template)
{
await TextTemplateDefinitionRepository.InsertAsync(template);
TemplateDefinitionStoreCache.LastCheckTime = DateTime.Now;
}
public async virtual Task UpdateAsync(TextTemplateDefinition template)
{
await TextTemplateDefinitionRepository.UpdateAsync(template);
TemplateDefinitionStoreCache.LastCheckTime = DateTime.Now;
}
public async virtual Task DeleteAsync(string name, CancellationToken cancellationToken = default)
{
if (!TemplatingCachingOptions.IsDynamicTemplateDefinitionStoreEnabled)
{
return;
}
using (await TemplateDefinitionStoreCache.SyncSemaphore.LockAsync())
{
var templateDefinitionRecord = await TextTemplateDefinitionRepository.FindByNameAsync(name);
if (templateDefinitionRecord != null)
{
await TextTemplateDefinitionRepository.DeleteAsync(templateDefinitionRecord);
// 及时更新便于下次检索刷新缓存
TemplateDefinitionStoreCache.LastCheckTime = DateTime.Now;
}
}
}
public async virtual Task<TemplateDefinition> GetAsync([NotNull] string name, CancellationToken cancellationToken = default)
{
if (!TemplatingCachingOptions.IsDynamicTemplateDefinitionStoreEnabled)
{
return TemplateDefinitionManager.Get(name);
}
using (await TemplateDefinitionStoreCache.SyncSemaphore.LockAsync())
{
await EnsureCacheIsUptoDateAsync();
var templateDefinition = TemplateDefinitionStoreCache.GetOrNull(name);
templateDefinition ??= TemplateDefinitionManager.Get(name);
return templateDefinition;
}
}
public async virtual Task<IReadOnlyList<TemplateDefinition>> GetAllAsync(CancellationToken cancellationToken = default)
{
if (!TemplatingCachingOptions.IsDynamicTemplateDefinitionStoreEnabled)
{
return TemplateDefinitionManager.GetAll();
}
using (await TemplateDefinitionStoreCache.SyncSemaphore.LockAsync())
{
await EnsureCacheIsUptoDateAsync();
return TemplateDefinitionStoreCache.GetAll();
}
}
public async virtual Task<TemplateDefinition> GetOrNullAsync(string name, CancellationToken cancellationToken = default)
{
if (!TemplatingCachingOptions.IsDynamicTemplateDefinitionStoreEnabled)
{
return TemplateDefinitionManager.GetOrNull(name);
}
using (await TemplateDefinitionStoreCache.SyncSemaphore.LockAsync())
{
await EnsureCacheIsUptoDateAsync();
var templateDefinition = TemplateDefinitionStoreCache.GetOrNull(name);
return templateDefinition;
}
}
protected async virtual Task EnsureCacheIsUptoDateAsync()
{
if (TemplateDefinitionStoreCache.LastCheckTime.HasValue &&
DateTime.Now.Subtract(TemplateDefinitionStoreCache.LastCheckTime.Value) < TemplatingCachingOptions.TemplateDefinitionsCacheRefreshInterval)
{
return;
}
var stampInDistributedCache = await GetOrSetStampInDistributedCache();
if (stampInDistributedCache == TemplateDefinitionStoreCache.CacheStamp)
{
TemplateDefinitionStoreCache.LastCheckTime = DateTime.Now;
return;
}
await UpdateInMemoryStoreCache();
TemplateDefinitionStoreCache.CacheStamp = stampInDistributedCache;
TemplateDefinitionStoreCache.LastCheckTime = DateTime.Now;
}
protected async virtual Task UpdateInMemoryStoreCache()
{
var templateDefinitions = TemplateDefinitionManager.GetAll();
var textTemplateDefinitions = await TextTemplateDefinitionRepository.GetListAsync(includeDetails: false);
await TemplateDefinitionStoreCache.FillAsync(textTemplateDefinitions, templateDefinitions);
}
protected async virtual Task<string> GetOrSetStampInDistributedCache()
{
var cacheKey = GetCommonStampCacheKey();
var stampInDistributedCache = await DistributedCache.GetStringAsync(cacheKey);
if (stampInDistributedCache != null)
{
return stampInDistributedCache;
}
await using (var commonLockHandle = await DistributedLock
.TryAcquireAsync(GetCommonDistributedLockKey(), TemplatingCachingOptions.TemplateDefinitionsCacheStampTimeOut))
{
if (commonLockHandle == null)
{
/* This request will fail */
throw new AbpException(
"Could not acquire distributed lock for template definition common stamp check!"
);
}
stampInDistributedCache = await DistributedCache.GetStringAsync(cacheKey);
if (stampInDistributedCache != null)
{
return stampInDistributedCache;
}
stampInDistributedCache = Guid.NewGuid().ToString();
await DistributedCache.SetStringAsync(
cacheKey,
stampInDistributedCache,
new DistributedCacheEntryOptions
{
SlidingExpiration = TemplatingCachingOptions.TemplateDefinitionsCacheStampExpiration
}
);
}
return stampInDistributedCache;
}
protected virtual string GetCommonStampCacheKey()
{
return $"{CacheOptions.KeyPrefix}_AbpInMemoryTemplateDefinitionCacheStamp";
}
protected virtual string GetCommonDistributedLockKey()
{
return $"{CacheOptions.KeyPrefix}_Common_AbpTemplateDefinitionUpdateLock";
}
}

37
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TextTemplateContentProvider.cs

@ -0,0 +1,37 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.TextTemplating;
namespace LINGYUN.Abp.TextTemplating;
[Dependency(ReplaceServices = true)]
[ExposeServices(
typeof(ITemplateContentProvider),
typeof(TemplateContentProvider))]
public class TextTemplateContentProvider : TemplateContentProvider, ITransientDependency
{
protected ITemplateDefinitionStore TemplateDefinitionStore { get; }
public TextTemplateContentProvider(
ITemplateDefinitionManager templateDefinitionManager,
ITemplateDefinitionStore templateDefinitionStore,
IServiceScopeFactory serviceScopeFactory,
IOptions<AbpTextTemplatingOptions> options)
: base(templateDefinitionManager, serviceScopeFactory, options)
{
TemplateDefinitionStore = templateDefinitionStore;
}
public async override Task<string> GetContentOrNullAsync(
string templateName,
string cultureName = null,
bool tryDefaults = true,
bool useCurrentCultureIfCultureNameIsNull = true)
{
var template = await TemplateDefinitionStore.GetAsync(templateName);
return await GetContentOrNullAsync(template, cultureName);
}
}

41
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TextTemplateDefinition.cs

@ -0,0 +1,41 @@
using System;
using Volo.Abp;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
namespace LINGYUN.Abp.TextTemplating;
public class TextTemplateDefinition : AggregateRoot<Guid>, IHasExtraProperties
{
public virtual string Name { get; protected set; }
public virtual string DisplayName { get; set; }
public virtual bool IsLayout { get; set; }
public virtual string Layout { get; set; }
public virtual bool IsInlineLocalized { get; set; }
public virtual string DefaultCultureName { get; set; }
public virtual string RenderEngine { get; set; }
public virtual bool IsStatic { get; set; }
protected TextTemplateDefinition()
{
}
public TextTemplateDefinition(
Guid id,
string name,
string displayName,
bool isLayout = false,
string layout = null,
bool isInlineLocalized = false,
string defaultCultureName = null,
string renderEngine = null)
: base(id)
{
Name = Check.NotNullOrWhiteSpace(name, nameof(name), TextTemplateDefinitionConsts.MaxNameLength);
DisplayName = Check.NotNullOrWhiteSpace(displayName, nameof(displayName), TextTemplateDefinitionConsts.MaxDisplayNameLength);
IsLayout = isLayout;
Layout = Check.Length(layout, nameof(layout), TextTemplateDefinitionConsts.MaxLayoutLength);
IsInlineLocalized = isInlineLocalized;
DefaultCultureName = Check.Length(defaultCultureName, nameof(defaultCultureName), TextTemplateDefinitionConsts.MaxDefaultCultureNameLength);
RenderEngine = Check.Length(renderEngine, nameof(renderEngine), TextTemplateDefinitionConsts.MaxRenderEngineLength);
}
}

113
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionInitializer.cs

@ -0,0 +1,113 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Polly;
using System;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Threading;
namespace LINGYUN.Abp.TextTemplating;
public class TextTemplateDefinitionInitializer : ITransientDependency
{
protected IRootServiceProvider RootServiceProvider { get; }
protected ICancellationTokenProvider CancellationTokenProvider { get; }
protected AbpTextTemplatingCachingOptions TextTemplatingCachingOptions { get; }
public TextTemplateDefinitionInitializer(
IRootServiceProvider rootServiceProvider,
ICancellationTokenProvider cancellationTokenProvider,
IOptions<AbpTextTemplatingCachingOptions> textTemplatingCachingOptions)
{
RootServiceProvider = rootServiceProvider;
CancellationTokenProvider = cancellationTokenProvider;
TextTemplatingCachingOptions = textTemplatingCachingOptions.Value;
}
public async virtual Task InitializeDynamicTemplates(CancellationToken cancellationToken)
{
if (!TextTemplatingCachingOptions.SaveStaticTemplateDefinitionToDatabase && !TextTemplatingCachingOptions.IsDynamicTemplateDefinitionStoreEnabled)
{
return;
}
using var scope = RootServiceProvider.CreateScope();
var applicationLifetime = scope.ServiceProvider.GetService<IHostApplicationLifetime>();
var token = applicationLifetime?.ApplicationStopping ?? cancellationToken;
using (CancellationTokenProvider.Use(cancellationToken))
{
if (CancellationTokenProvider.Token.IsCancellationRequested)
{
return;
}
await SaveStaticTemplateDefinitionsToDatabaseAsync(scope);
if (CancellationTokenProvider.Token.IsCancellationRequested)
{
return;
}
await PreCacheDynamicTemplateDefinitionsAsync(scope);
}
}
private async Task SaveStaticTemplateDefinitionsToDatabaseAsync(IServiceScope serviceScope)
{
if (!TextTemplatingCachingOptions.SaveStaticTemplateDefinitionToDatabase)
{
return;
}
await Policy
.Handle<Exception>()
.WaitAndRetryAsync(8, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt) * 10))
.ExecuteAsync(async _ =>
{
try
{
// ReSharper disable once AccessToDisposedClosure
var saver = serviceScope.ServiceProvider.GetRequiredService<IStaticTemplateDefinitionSaver>();
await saver.SaveAsync();
}
catch (Exception ex)
{
// ReSharper disable once AccessToDisposedClosure
serviceScope.ServiceProvider
.GetService<ILogger<TextTemplateDefinitionInitializer>>()?
.LogException(ex);
throw; // Polly will catch it
}
}, CancellationTokenProvider.Token);
}
private async Task PreCacheDynamicTemplateDefinitionsAsync(IServiceScope serviceScope)
{
if (!TextTemplatingCachingOptions.IsDynamicTemplateDefinitionStoreEnabled)
{
return;
}
try
{
// ReSharper disable once AccessToDisposedClosure
var store = serviceScope.ServiceProvider.GetRequiredService<ITemplateDefinitionStore>();
await store.GetAllAsync();
}
catch (Exception ex)
{
// ReSharper disable once AccessToDisposedClosure
serviceScope.ServiceProvider
.GetService<ILogger<TextTemplateDefinitionInitializer>>()?
.LogException(ex);
throw; // Polly will catch it
}
}
}

57
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TextTemplateRenderer.cs

@ -0,0 +1,57 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.DependencyInjection;
using Volo.Abp.TextTemplating;
namespace LINGYUN.Abp.TextTemplating;
[Dependency(ReplaceServices = true)]
[ExposeServices(
typeof(ITemplateRenderer),
typeof(AbpTemplateRenderer))]
public class TextTemplateRenderer : AbpTemplateRenderer, ITransientDependency
{
protected ITemplateDefinitionStore TemplateDefinitionStore { get; }
public TextTemplateRenderer(
IServiceScopeFactory serviceScopeFactory,
ITemplateDefinitionManager templateDefinitionManager,
ITemplateDefinitionStore templateDefinitionStore,
IOptions<AbpTextTemplatingOptions> options)
: base(serviceScopeFactory, templateDefinitionManager, options)
{
TemplateDefinitionStore = templateDefinitionStore;
}
public override async Task<string> RenderAsync(
string templateName,
object model = null,
string cultureName = null,
Dictionary<string, object> globalContext = null)
{
var templateDefinition = await TemplateDefinitionStore.GetAsync(templateName);
var renderEngine = templateDefinition.RenderEngine;
if (renderEngine.IsNullOrWhiteSpace())
{
renderEngine = Options.DefaultRenderingEngine;
}
var providerType = Options.RenderingEngines.GetOrDefault(renderEngine);
if (providerType != null && typeof(ITemplateRenderingEngine).IsAssignableFrom(providerType))
{
using (var scope = ServiceScopeFactory.CreateScope())
{
var templateRenderingEngine = (ITemplateRenderingEngine)scope.ServiceProvider.GetRequiredService(providerType);
return await templateRenderingEngine.RenderAsync(templateName, model, cultureName, globalContext);
}
}
throw new AbpException("There is no rendering engine found with template name: " + templateName);
}
}

28
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/AbpTextTemplatingDbContextModelCreatingExtensions.cs

@ -39,6 +39,34 @@ public static class AbpTextTemplatingDbContextModelCreatingExtensions
b.ApplyObjectExtensionMappings();
});
builder.Entity<TextTemplateDefinition>(b =>
{
b.ToTable(AbpTextTemplatingDbProperties.DbTablePrefix + "TextTemplateDefinitions", AbpTextTemplatingDbProperties.DbSchema);
b.ConfigureByConvention();
b.Property(t => t.Name)
.HasColumnName(nameof(TextTemplateDefinition.Name))
.HasMaxLength(TextTemplateDefinitionConsts.MaxNameLength)
.IsRequired();
b.Property(t => t.DisplayName)
.HasColumnName(nameof(TextTemplateDefinition.DisplayName))
.HasMaxLength(TextTemplateDefinitionConsts.MaxDisplayNameLength)
.IsRequired();
b.Property(t => t.Layout)
.HasColumnName(nameof(TextTemplateDefinition.Layout))
.HasMaxLength(TextTemplateDefinitionConsts.MaxLayoutLength);
b.Property(t => t.DefaultCultureName)
.HasColumnName(nameof(TextTemplateDefinition.DefaultCultureName))
.HasMaxLength(TextTemplateDefinitionConsts.MaxDefaultCultureNameLength);
b.Property(t => t.RenderEngine)
.HasColumnName(nameof(TextTemplateDefinition.RenderEngine))
.HasMaxLength(TextTemplateDefinitionConsts.MaxRenderEngineLength);
b.ApplyObjectExtensionMappings();
});
builder.TryConfigureObjectExtensions<TextTemplatingDbContext>();
}
}

1
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/AbpTextTemplatingEntityFrameworkCoreModule.cs

@ -14,6 +14,7 @@ public class AbpTextTemplatingEntityFrameworkCoreModule : AbpModule
context.Services.AddAbpDbContext<TextTemplatingDbContext>(options =>
{
options.AddRepository<TextTemplate, EfCoreTextTemplateRepository>();
options.AddRepository<TextTemplateDefinition, EfCoreTextTemplateDefinitionRepository>();
options.AddDefaultRepositories<ITextTemplatingDbContext>();
});

55
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/EfCoreTextTemplateDefinitionRepository.cs

@ -0,0 +1,55 @@
using LINGYUN.Abp.TextTemplating.EntityFrameworkCore;
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.TextTemplating;
public class EfCoreTextTemplateDefinitionRepository : EfCoreRepository<ITextTemplatingDbContext, TextTemplateDefinition, Guid>, ITextTemplateDefinitionRepository
{
public EfCoreTextTemplateDefinitionRepository(
IDbContextProvider<ITextTemplatingDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public async virtual Task<TextTemplateDefinition> FindByNameAsync(string name, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.Where(x => x.Name == name)
.FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
}
public async virtual Task<long> GetCountAsync(string filter = null, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Name.Contains(filter) ||
x.DefaultCultureName.Contains(filter) || x.Layout.Contains(filter))
.CountAsync(GetCancellationToken(cancellationToken));
}
public async virtual Task<List<TextTemplateDefinition>> GetListAsync(
string filter = null,
string sorting = "Name",
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default)
{
if (sorting.IsNullOrWhiteSpace())
{
sorting = nameof(TextTemplateDefinition.Name);
}
return await (await GetDbSetAsync())
.WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Name.Contains(filter) ||
x.DefaultCultureName.Contains(filter) || x.Layout.Contains(filter))
.OrderBy(sorting)
.PageBy(skipCount, maxResultCount)
.ToListAsync(GetCancellationToken(cancellationToken));
}
}

2
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/ITextTemplatingDbContext.cs

@ -10,4 +10,6 @@ namespace LINGYUN.Abp.TextTemplating.EntityFrameworkCore;
public interface ITextTemplatingDbContext : IEfCoreDbContext
{
DbSet<TextTemplate> TextTemplates { get; }
DbSet<TextTemplateDefinition> TextTemplateDefinitions { get; }
}

2
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/TextTemplatingDbContext.cs

@ -11,6 +11,8 @@ public class TextTemplatingDbContext : AbpDbContext<TextTemplatingDbContext>, IT
{
public DbSet<TextTemplate> TextTemplates { get; set; }
public DbSet<TextTemplateDefinition> TextTemplateDefinitions { get; set; }
public TextTemplatingDbContext(DbContextOptions<TextTemplatingDbContext> options)
: base(options)
{

45
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.HttpApi/LINGYUN/Abp/TextTemplating/TextTemplateContentController.cs

@ -0,0 +1,45 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using Volo.Abp;
namespace LINGYUN.Abp.TextTemplating;
[Controller]
[Authorize(AbpTextTemplatingPermissions.TextTemplateContent.Default)]
[RemoteService(Name = AbpTextTemplatingRemoteServiceConsts.RemoteServiceName)]
[Area(AbpTextTemplatingRemoteServiceConsts.ModuleName)]
[Route("api/text-templating/templates/content")]
public class TextTemplateContentController : AbpTextTemplatingControllerBase, ITextTemplateContentAppService
{
private readonly ITextTemplateContentAppService _service;
public TextTemplateContentController(ITextTemplateContentAppService service)
{
_service = service;
}
[HttpGet]
[Route("{Name}")]
[Route("{Culture}/{Name}")]
public virtual Task<TextTemplateContentDto> GetAsync(TextTemplateContentGetInput input)
{
return _service.GetAsync(input);
}
[HttpPut]
[Route("{name}/restore-to-default")]
[Authorize(AbpTextTemplatingPermissions.TextTemplateContent.Delete)]
public virtual Task RestoreToDefaultAsync(string name, TextTemplateRestoreInput input)
{
return _service.RestoreToDefaultAsync(name, input);
}
[HttpPut]
[Authorize(AbpTextTemplatingPermissions.TextTemplateContent.Update)]
[Route("{name}")]
public virtual Task<TextTemplateContentDto> UpdateAsync(string name, TextTemplateContentUpdateDto input)
{
return _service.UpdateAsync(name, input);
}
}

59
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.HttpApi/LINGYUN/Abp/TextTemplating/TextTemplateController.cs

@ -1,59 +0,0 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.TextTemplating;
[Controller]
[Authorize(AbpTextTemplatingPermissions.TextTemplate.Default)]
[RemoteService(Name = AbpTextTemplatingRemoteServiceConsts.RemoteServiceName)]
[Area(AbpTextTemplatingRemoteServiceConsts.ModuleName)]
[Route("api/text-templating/templates")]
public class TextTemplateController : AbpTextTemplatingControllerBase, ITextTemplateAppService
{
protected ITextTemplateAppService TextTemplateAppService { get; }
public TextTemplateController(
ITextTemplateAppService textTemplateAppService)
{
TextTemplateAppService = textTemplateAppService;
}
[HttpGet]
[Route("{name}")]
public virtual Task<TextTemplateDefinitionDto> GetAsync(string name)
{
return TextTemplateAppService.GetAsync(name);
}
[HttpGet]
[Route("content/{Name}")]
[Route("content/{Culture}/{Name}")]
public virtual Task<TextTemplateContentDto> GetContentAsync(TextTemplateContentGetInput input)
{
return TextTemplateAppService.GetContentAsync(input);
}
[HttpGet]
public virtual Task<PagedResultDto<TextTemplateDefinitionDto>> GetListAsync(TextTemplateDefinitionGetListInput input)
{
return TextTemplateAppService.GetListAsync(input);
}
[HttpPut]
[Route("restore-to-default")]
[Authorize(AbpTextTemplatingPermissions.TextTemplate.Delete)]
public virtual Task RestoreToDefaultAsync(TextTemplateRestoreInput input)
{
return TextTemplateAppService.RestoreToDefaultAsync(input);
}
[HttpPost]
[Authorize(AbpTextTemplatingPermissions.TextTemplate.Update)]
public virtual Task<TextTemplateDefinitionDto> UpdateAsync(TextTemplateUpdateInput input)
{
return TextTemplateAppService.UpdateAsync(input);
}
}

58
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.HttpApi/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionController.cs

@ -0,0 +1,58 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.TextTemplating;
[Controller]
[Authorize(AbpTextTemplatingPermissions.TextTemplateDefinition.Default)]
[RemoteService(Name = AbpTextTemplatingRemoteServiceConsts.RemoteServiceName)]
[Area(AbpTextTemplatingRemoteServiceConsts.ModuleName)]
[Route("api/text-templating/template/definitions")]
public class TextTemplateDefinitionController : AbpTextTemplatingControllerBase, ITextTemplateDefinitionAppService
{
private readonly ITextTemplateDefinitionAppService _service;
public TextTemplateDefinitionController(ITextTemplateDefinitionAppService service)
{
_service = service;
}
[Authorize(AbpTextTemplatingPermissions.TextTemplateDefinition.Create)]
[HttpPost]
public virtual Task<TextTemplateDefinitionDto> CreateAsync(TextTemplateDefinitionCreateDto input)
{
return _service.CreateAsync(input);
}
[Authorize(AbpTextTemplatingPermissions.TextTemplateDefinition.Delete)]
[HttpDelete]
[Route("{name}")]
public virtual Task DeleteAsync(string name)
{
return _service.DeleteAsync(name);
}
[HttpGet]
[Route("{name}")]
public virtual Task<TextTemplateDefinitionDto> GetByNameAsync(string name)
{
return _service.GetByNameAsync(name);
}
[HttpGet]
public virtual Task<PagedResultDto<TextTemplateDefinitionDto>> GetListAsync(TextTemplateDefinitionGetListInput input)
{
return _service.GetListAsync(input);
}
[Authorize(AbpTextTemplatingPermissions.TextTemplateDefinition.Update)]
[HttpPut]
[Route("{name}")]
public virtual Task<TextTemplateDefinitionDto> UpdateAsync(string name, TextTemplateDefinitionUpdateDto input)
{
return _service.UpdateAsync(name, input);
}
}

3
aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Razor/FodyWeavers.xml

@ -0,0 +1,3 @@
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<ConfigureAwait />
</Weavers>

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

Loading…
Cancel
Save