From c96587ea4ee8155fdb561f04fa6384c8428cf9be Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Tue, 28 Jun 2022 13:27:04 +0800 Subject: [PATCH 1/2] feat: alter column Culture Allow Br Null --- .../Notifications/Localization/Common/en.json | 1 + .../Localization/Common/zh-Hans.json | 1 + .../NotificationsCommonTemplateProvider.cs | 10 +- ...ueVbenAdminNavigationDefinitionProvider.cs | 21 ++ .../TextTemplating/ITextTemplateAppService.cs | 10 +- ...mplateDto.cs => TextTemplateContentDto.cs} | 3 +- .../TextTemplateContentGetInput.cs | 14 + .../TextTemplateDefinitionDto.cs | 11 + .../TextTemplateDefinitionGetListInput.cs | 8 + ...etInput.cs => TextTemplateRestoreInput.cs} | 2 +- .../TextTemplating/TextTemplateUpdateInput.cs | 1 - ...tTemplatingApplicationAutoMapperProfile.cs | 1 - .../TextTemplating/TextTemplateAppService.cs | 151 +++++--- .../Localization/Resources/en.json | 22 +- .../Localization/Resources/zh-Hans.json | 22 +- .../TextTemplating/ITextTemplateRepository.cs | 2 +- .../Abp/TextTemplating/TextTemplate.cs | 4 +- ...platingDbContextModelCreatingExtensions.cs | 5 +- .../EfCoreTextTemplateRepository.cs | 3 +- .../TextTemplating/TextTemplateController.cs | 30 +- ...er-Culture-Field-Allow-Be-Null.Designer.cs | 353 ++++++++++++++++++ ...50554_Alter-Culture-Field-Allow-Be-Null.cs | 47 +++ ...minHostMigrationsDbContextModelSnapshot.cs | 1 - 23 files changed, 632 insertions(+), 91 deletions(-) rename aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/{TextTemplateDto.cs => TextTemplateContentDto.cs} (66%) create mode 100644 aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateContentGetInput.cs create mode 100644 aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionDto.cs create mode 100644 aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionGetListInput.cs rename aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/{TextTemplateGetInput.cs => TextTemplateRestoreInput.cs} (88%) create mode 100644 aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Migrations/20220628050554_Alter-Culture-Field-Allow-Be-Null.Designer.cs create mode 100644 aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Migrations/20220628050554_Alter-Culture-Field-Allow-Be-Null.cs diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Common/LINGYUN/Abp/Notifications/Localization/Common/en.json b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Common/LINGYUN/Abp/Notifications/Localization/Common/en.json index b12c0c053..35c578996 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Common/LINGYUN/Abp/Notifications/Localization/Common/en.json +++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Common/LINGYUN/Abp/Notifications/Localization/Common/en.json @@ -1,6 +1,7 @@ { "culture": "en", "texts": { + "EmailNotifierLayout": "Email Notifier Layout", "Notifications:MultiTenancy": "Multi Tenancy", "Notifications:Users": "Users", "Notifications:NewTenantRegisterd": "Tenant creation notification", diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Common/LINGYUN/Abp/Notifications/Localization/Common/zh-Hans.json b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Common/LINGYUN/Abp/Notifications/Localization/Common/zh-Hans.json index bde90e888..562879882 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Common/LINGYUN/Abp/Notifications/Localization/Common/zh-Hans.json +++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Common/LINGYUN/Abp/Notifications/Localization/Common/zh-Hans.json @@ -1,6 +1,7 @@ { "culture": "zh-Hans", "texts": { + "EmailNotifierLayout": "邮件通知模板", "Notifications:MultiTenancy": "租户通知", "Notifications:Users": "用户通知", "Notifications:NewTenantRegisterd": "租户创建通知", diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Common/LINGYUN/Abp/Notifications/Templates/NotificationsCommonTemplateProvider.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Common/LINGYUN/Abp/Notifications/Templates/NotificationsCommonTemplateProvider.cs index 8e6cdcfbb..abf85f415 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Common/LINGYUN/Abp/Notifications/Templates/NotificationsCommonTemplateProvider.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Common/LINGYUN/Abp/Notifications/Templates/NotificationsCommonTemplateProvider.cs @@ -1,4 +1,6 @@ -using Volo.Abp.TextTemplating; +using LINGYUN.Abp.Notifications.Localization; +using Volo.Abp.Localization; +using Volo.Abp.TextTemplating; namespace LINGYUN.Abp.Notifications; @@ -15,9 +17,15 @@ public class NotificationsCommonTemplateProvider : TemplateDefinitionProvider { new TemplateDefinition( name: "EmailNotifierLayout", + displayName: L("EmailNotifierLayout"), defaultCultureName: "en", isLayout: true) .WithVirtualFilePath( "/LINGYUN/Abp/Notifications/Templates/layout.tpl", isInlineLocalized: true) }; } + + protected LocalizableString L(string name) + { + return LocalizableString.Create(name); + } } diff --git a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminNavigationDefinitionProvider.cs b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminNavigationDefinitionProvider.cs index 6bc6c03aa..9069b6a08 100644 --- a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminNavigationDefinitionProvider.cs +++ b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminNavigationDefinitionProvider.cs @@ -17,6 +17,7 @@ namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin context.Add(GetOssManagement()); context.Add(GetTaskManagement()); context.Add(GetWebhooksManagement()); + context.Add(GetMessages()); } private static NavigationDefinition GetDashboard() @@ -431,5 +432,25 @@ namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin return new NavigationDefinition(webhooks); } + + private static NavigationDefinition GetMessages() + { + var messages = new ApplicationMenu( + name: "Messages", + displayName: "消息管理", + url: "/messages", + component: "", + description: "消息管理", + icon: "ant-design:message-outlined"); + messages.AddItem( + new ApplicationMenu( + name: "Notifications", + displayName: "通知管理", + url: "/messages/notifications", + component: "/messages/notifications/index.vue", + description: "通知管理")); + + return new NavigationDefinition(messages); + } } } diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/ITextTemplateAppService.cs b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/ITextTemplateAppService.cs index 287111b29..d2cd91891 100644 --- a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/ITextTemplateAppService.cs +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/ITextTemplateAppService.cs @@ -6,11 +6,13 @@ namespace LINGYUN.Abp.TextTemplating; public interface ITextTemplateAppService : IApplicationService { - Task GetAsync(TextTemplateGetInput input); + Task GetAsync(string name); - Task ResetDefaultAsync(TextTemplateGetInput input); + Task GetContentAsync(TextTemplateContentGetInput input); - Task UpdateAsync(TextTemplateUpdateInput input); + Task RestoreToDefaultAsync(TextTemplateRestoreInput input); - Task> GetListAsync(); + Task UpdateAsync(TextTemplateUpdateInput input); + + Task> GetListAsync(TextTemplateDefinitionGetListInput input); } diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDto.cs b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateContentDto.cs similarity index 66% rename from aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDto.cs rename to aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateContentDto.cs index 664dde8f4..163fcfe98 100644 --- a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDto.cs +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateContentDto.cs @@ -1,9 +1,8 @@ namespace LINGYUN.Abp.TextTemplating; -public class TextTemplateDto +public class TextTemplateContentDto { public string Name { get; set; } - public string DisplayName { get; set; } public string Content { get; set; } public string Culture { get; set; } } diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateContentGetInput.cs b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateContentGetInput.cs new file mode 100644 index 000000000..4c13b5595 --- /dev/null +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateContentGetInput.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Validation; + +namespace LINGYUN.Abp.TextTemplating; + +public class TextTemplateContentGetInput +{ + [Required] + [DynamicStringLength(typeof(TextTemplateConsts), nameof(TextTemplateConsts.MaxNameLength))] + public string Name { get; set; } + + [DynamicStringLength(typeof(TextTemplateConsts), nameof(TextTemplateConsts.MaxCultureLength))] + public string Culture { get; set; } +} diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionDto.cs b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionDto.cs new file mode 100644 index 000000000..a2852b36c --- /dev/null +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionDto.cs @@ -0,0 +1,11 @@ +namespace LINGYUN.Abp.TextTemplating; + +public class TextTemplateDefinitionDto +{ + public string Name { get; set; } + public string DisplayName { get; set; } + public string DefaultCultureName { get; set; } + public bool IsInlineLocalized { get; set; } + public bool IsLayout { get; set; } + public string Layout { get; set; } +} diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionGetListInput.cs b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionGetListInput.cs new file mode 100644 index 000000000..d2292cb34 --- /dev/null +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateDefinitionGetListInput.cs @@ -0,0 +1,8 @@ +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.TextTemplating; + +public class TextTemplateDefinitionGetListInput : PagedAndSortedResultRequestDto +{ + public string Filter { get; set; } +} diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateGetInput.cs b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateRestoreInput.cs similarity index 88% rename from aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateGetInput.cs rename to aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateRestoreInput.cs index a863d62c6..eb6239b97 100644 --- a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateGetInput.cs +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateRestoreInput.cs @@ -3,7 +3,7 @@ using Volo.Abp.Validation; namespace LINGYUN.Abp.TextTemplating; -public class TextTemplateGetInput +public class TextTemplateRestoreInput { [Required] [DynamicStringLength(typeof(TextTemplateConsts), nameof(TextTemplateConsts.MaxNameLength))] diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateUpdateInput.cs b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateUpdateInput.cs index a8804ec1c..54fcfadbf 100644 --- a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateUpdateInput.cs +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application.Contracts/LINGYUN/Abp/TextTemplating/TextTemplateUpdateInput.cs @@ -9,7 +9,6 @@ public class TextTemplateUpdateInput [DynamicStringLength(typeof(TextTemplateConsts), nameof(TextTemplateConsts.MaxNameLength))] public string Name { get; set; } - [Required] [DynamicStringLength(typeof(TextTemplateConsts), nameof(TextTemplateConsts.MaxCultureLength))] public string Culture { get; set; } diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/AbpTextTemplatingApplicationAutoMapperProfile.cs b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/AbpTextTemplatingApplicationAutoMapperProfile.cs index 5360f8525..cc1c7ff57 100644 --- a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/AbpTextTemplatingApplicationAutoMapperProfile.cs +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/AbpTextTemplatingApplicationAutoMapperProfile.cs @@ -6,6 +6,5 @@ public class AbpTextTemplatingApplicationAutoMapperProfile : Profile { public AbpTextTemplatingApplicationAutoMapperProfile() { - CreateMap(); } } diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/TextTemplateAppService.cs b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/TextTemplateAppService.cs index 0eccb770a..b6311c0c6 100644 --- a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/TextTemplateAppService.cs +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/TextTemplateAppService.cs @@ -1,6 +1,8 @@ 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; @@ -26,97 +28,130 @@ public class TextTemplateAppService : AbpTextTemplatingAppServiceBase, ITextTemp TemplateDefinitionManager = templateDefinitionManager; } - public async virtual Task GetAsync(TextTemplateGetInput input) + public virtual Task 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 GetContentAsync(TextTemplateContentGetInput input) + { var templateDefinition = GetTemplateDefinition(input.Name); - var culture = input.Culture ?? CultureInfo.CurrentCulture.Name ?? templateDefinition.DefaultCultureName; + var content = await TemplateContentProvider.GetContentOrNullAsync(templateDefinition.Name, input.Culture); - using (CultureHelper.Use(culture, culture)) + return new TextTemplateContentDto { - var content = await TemplateContentProvider.GetContentOrNullAsync(templateDefinition.Name, culture); - - return new TextTemplateDto - { - Culture = culture, - Content = content, - Name = templateDefinition.Name, - DisplayName = templateDefinition.DisplayName.Localize(StringLocalizerFactory), - }; - } + Name = templateDefinition.Name, + Culture = input.Culture, + Content = content, + }; } - public Task> GetListAsync() + public virtual Task> GetListAsync(TextTemplateDefinitionGetListInput input) { - var templates = new List(); + var templates = new List(); var templateDefinitions = TemplateDefinitionManager.GetAll(); + var filterTemplates = templateDefinitions + .WhereIf(!input.Filter.IsNullOrWhiteSpace(), x => + x.Name.Contains(input.Filter) || x.Layout.Contains(input.Filter)); - foreach (var templateDefinition in templateDefinitions) + foreach (var templateDefinition in filterTemplates) { - templates.Add( - new TextTemplateDto - { - Name = templateDefinition.Name, - Culture = CultureInfo.CurrentCulture.Name ?? templateDefinition.DefaultCultureName, - DisplayName = templateDefinition.DisplayName.Localize(StringLocalizerFactory), - }); + 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 ListResultDto(templates)); + return Task.FromResult(new PagedResultDto(templateDefinitions.Count, templates)); } [Authorize(AbpTextTemplatingPermissions.TextTemplate.Delete)] - public async virtual Task ResetDefaultAsync(TextTemplateGetInput input) + public async virtual Task RestoreToDefaultAsync(TextTemplateRestoreInput input) { var templateDefinition = GetTemplateDefinition(input.Name); - var culture = input.Culture ?? CultureInfo.CurrentCulture.Name ?? templateDefinition.DefaultCultureName; + var templates = await TextTemplateRepository + .GetListAsync(x => x.Name.Equals(templateDefinition.Name) && x.Culture.Equals(input.Culture)); - using (CultureHelper.Use(culture, culture)) - { - var template = await TextTemplateRepository.FindByNameAsync( - templateDefinition.Name, - culture); - if (template != null) - { - await TextTemplateRepository.DeleteAsync(template); - } - } + await TextTemplateRepository.DeleteManyAsync(templates); } [Authorize(AbpTextTemplatingPermissions.TextTemplate.Update)] - public async virtual Task UpdateAsync(TextTemplateUpdateInput input) + public async virtual Task UpdateAsync(TextTemplateUpdateInput input) { var templateDefinition = GetTemplateDefinition(input.Name); - var culture = input.Culture ?? CultureInfo.CurrentCulture.Name ?? templateDefinition.DefaultCultureName; + 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); - using (CultureHelper.Use(culture, culture)) + await TextTemplateRepository.InsertAsync(template); + } + else { - var template = await TextTemplateRepository.FindByNameAsync(input.Name, culture); - if (template == null) - { - template = new TextTemplate( - GuidGenerator.Create(), - templateDefinition.Name, - templateDefinition.DisplayName.Localize(StringLocalizerFactory), - input.Content, - culture); - - template = await TextTemplateRepository.InsertAsync(template); - } - else - { - template.SetContent(input.Content); + template.SetContent(input.Content); - await TextTemplateRepository.UpdateAsync(template); - } + await TextTemplateRepository.UpdateAsync(template); + } - await CurrentUnitOfWork.SaveChangesAsync(); + await CurrentUnitOfWork.SaveChangesAsync(); - return ObjectMapper.Map(template); + 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) diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/en.json b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/en.json index d66e03f70..11a4d5942 100644 --- a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/en.json +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/en.json @@ -10,6 +10,26 @@ "DisplayName:Name": "Name", "DisplayName:Culture": "Culture", "DisplayName:Content": "Content", - "DisplayName:DisplayName": "DisplayName" + "DisplayName:DisplayName": "DisplayName", + "DisplayName:IsInlineLocalized": "Is Inline Localized", + "DisplayName:IsLayout": "Is Layout", + "DisplayName:DefaultCultureName": "Default Culture", + "Contents": "Contents", + "Layout": "Layout", + "LocalizationResource": "Localization Resource", + "SeeContents": "See Contents", + "EditContents": "Edit Contents", + "BaseCultureName": "Reference Culture Name", + "TargetCultureName": "Target Culture Name", + "BaseContent": "Reference Content", + "TargetContent": "Target Content", + "SaveContent": "Save Content", + "TemplateContent": "Template Content", + "RestoreToDefault": "Restore To Default", + "RestoreToDefaultMessage": "Are you sure? This action converts the content to the default value.", + "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 L<\/b> function to localize a text, like {{L \"Hello\"}}<\/b>. If you still want to define a completely new template for a culture, use the \"Customize per culture\" button.
To get more information about syntax and other details, please check the Text Templates documentation<\/a>.." } } \ No newline at end of file diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/zh-Hans.json b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/zh-Hans.json index bdd955a4b..b4738a61a 100644 --- a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/zh-Hans.json +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/zh-Hans.json @@ -10,6 +10,26 @@ "DisplayName:Name": "名称", "DisplayName:Culture": "区域", "DisplayName:Content": "内容", - "DisplayName:DisplayName": "显示名称" + "DisplayName:DisplayName": "显示名称", + "DisplayName:IsInlineLocalized": "内联本地化", + "DisplayName:IsLayout": "是否为布局页", + "DisplayName:DefaultCultureName": "默认文化名称", + "Contents": "内容", + "Layout": "布局页", + "LocalizationResource": "本地化资源", + "SeeContents": "查看内容", + "EditContents": "编辑内容", + "BaseCultureName": "参考文化名称", + "TargetCultureName": "目标文化名称", + "BaseContent": "参考内容", + "TargetContent": "目标内容", + "SaveContent": "保存内容", + "TemplateContent": "模板内容", + "RestoreToDefault": "还原为默认", + "RestoreToDefaultMessage": "你确定吗? 此操作会将内容转换为默认值.", + "TemplateContentUpdated": "模板内容已更新", + "TemplateContentRestoredToDefault": "模板内容恢复为默认值.", + "CustomizePerCulture": "根据文化定制", + "InlineContentDescription": "该模板使用内联本地化. 你可以使用L函数对文本进行本地化,例如 {{L \"Hello\"}}如果你仍想为区域性定义一个全新的模板,请使用\"根据文化定制\"按钮.
请检查
文本模板文档获取更多信息." } } \ No newline at end of file diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/ITextTemplateRepository.cs b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/ITextTemplateRepository.cs index a9abd556a..e9a9e56da 100644 --- a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/ITextTemplateRepository.cs +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/ITextTemplateRepository.cs @@ -5,7 +5,7 @@ using Volo.Abp.Domain.Repositories; namespace LINGYUN.Abp.TextTemplating; -public interface ITextTemplateRepository : IBasicRepository +public interface ITextTemplateRepository : IRepository { Task FindByNameAsync(string name, string culture = null, CancellationToken cancellationToken = default); } diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TextTemplate.cs b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TextTemplate.cs index a0b49d0b7..0d28bca80 100644 --- a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TextTemplate.cs +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain/LINGYUN/Abp/TextTemplating/TextTemplate.cs @@ -18,13 +18,13 @@ public class TextTemplate : AuditedEntity, IMultiTenant string name, string displayName, string content, - string culture) + string culture = null) : base(id) { Name = Check.NotNullOrWhiteSpace(name, nameof(name), TextTemplateConsts.MaxNameLength); DisplayName = Check.NotNullOrWhiteSpace(displayName, nameof(displayName), TextTemplateConsts.MaxDisplayNameLength); Content = Check.NotNullOrWhiteSpace(content, nameof(content), TextTemplateConsts.MaxContentLength); - Culture = Check.NotNullOrWhiteSpace(culture, nameof(culture), TextTemplateConsts.MaxCultureLength); + Culture = Check.Length(culture, nameof(culture), TextTemplateConsts.MaxCultureLength); } public void SetContent(string content) diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/AbpTextTemplatingDbContextModelCreatingExtensions.cs b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/AbpTextTemplatingDbContextModelCreatingExtensions.cs index 15ef452dc..3818f54e3 100644 --- a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/AbpTextTemplatingDbContextModelCreatingExtensions.cs +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/AbpTextTemplatingDbContextModelCreatingExtensions.cs @@ -25,11 +25,10 @@ public static class AbpTextTemplatingDbContextModelCreatingExtensions .HasColumnName(nameof(TextTemplate.DisplayName)) .HasMaxLength(TextTemplateConsts.MaxDisplayNameLength) .IsRequired(); + b.Property(t => t.Culture) .HasColumnName(nameof(TextTemplate.Culture)) - .HasMaxLength(TextTemplateConsts.MaxCultureLength) - .IsRequired(); - + .HasMaxLength(TextTemplateConsts.MaxCultureLength); b.Property(t => t.Content) .HasColumnName(nameof(TextTemplate.Content)) .HasMaxLength(TextTemplateConsts.MaxContentLength); diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/EfCoreTextTemplateRepository.cs b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/EfCoreTextTemplateRepository.cs index bf4dd4992..f16e669b5 100644 --- a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/EfCoreTextTemplateRepository.cs +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.EntityFrameworkCore/LINGYUN/Abp/TextTemplating/EfCoreTextTemplateRepository.cs @@ -24,8 +24,7 @@ public class EfCoreTextTemplateRepository : public async virtual Task FindByNameAsync(string name, string culture = null, CancellationToken cancellationToken = default) { return await (await GetDbSetAsync()) - .Where(x => x.Name.Equals(name)) - .WhereIf(!culture.IsNullOrWhiteSpace(), x => x.Culture.Equals(culture)) + .Where(x => x.Name.Equals(name) && x.Culture.Equals(culture)) .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); } } diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.HttpApi/LINGYUN/Abp/TextTemplating/TextTemplateController.cs b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.HttpApi/LINGYUN/Abp/TextTemplating/TextTemplateController.cs index 9c7f71641..ca4524ffa 100644 --- a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.HttpApi/LINGYUN/Abp/TextTemplating/TextTemplateController.cs +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.HttpApi/LINGYUN/Abp/TextTemplating/TextTemplateController.cs @@ -22,31 +22,37 @@ public class TextTemplateController : AbpTextTemplatingControllerBase, ITextTemp } [HttpGet] - [Route("{Name}")] - [Route("{Culture}/{Name}")] - public Task GetAsync(TextTemplateGetInput input) + [Route("{name}")] + public virtual Task GetAsync(string name) { - return TextTemplateAppService.GetAsync(input); + return TextTemplateAppService.GetAsync(name); } [HttpGet] - public Task> GetListAsync() + [Route("content/{Name}")] + [Route("content/{Culture}/{Name}")] + public virtual Task GetContentAsync(TextTemplateContentGetInput input) { - return TextTemplateAppService.GetListAsync(); + return TextTemplateAppService.GetContentAsync(input); } - [HttpDelete] - [Route("{Name}")] - [Route("{Culture}/{Name}")] + [HttpGet] + public virtual Task> GetListAsync(TextTemplateDefinitionGetListInput input) + { + return TextTemplateAppService.GetListAsync(input); + } + + [HttpPut] + [Route("restore-to-default")] [Authorize(AbpTextTemplatingPermissions.TextTemplate.Delete)] - public Task ResetDefaultAsync(TextTemplateGetInput input) + public virtual Task RestoreToDefaultAsync(TextTemplateRestoreInput input) { - return TextTemplateAppService.ResetDefaultAsync(input); + return TextTemplateAppService.RestoreToDefaultAsync(input); } [HttpPost] [Authorize(AbpTextTemplatingPermissions.TextTemplate.Update)] - public Task UpdateAsync(TextTemplateUpdateInput input) + public virtual Task UpdateAsync(TextTemplateUpdateInput input) { return TextTemplateAppService.UpdateAsync(input); } diff --git a/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Migrations/20220628050554_Alter-Culture-Field-Allow-Be-Null.Designer.cs b/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Migrations/20220628050554_Alter-Culture-Field-Allow-Be-Null.Designer.cs new file mode 100644 index 000000000..e96678c1e --- /dev/null +++ b/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Migrations/20220628050554_Alter-Culture-Field-Allow-Be-Null.Designer.cs @@ -0,0 +1,353 @@ +// +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.Migrations +{ + [DbContext(typeof(BackendAdminMigrationsDbContext))] + [Migration("20220628050554_Alter-Culture-Field-Allow-Be-Null")] + partial class AlterCultureFieldAllowBeNull + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.MySql) + .HasAnnotation("ProductVersion", "6.0.6") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("LINGYUN.Abp.Saas.Editions.Edition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ExtraProperties") + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("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("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("DisableTime") + .HasColumnType("datetime(6)"); + + b.Property("EditionId") + .HasColumnType("char(36)"); + + b.Property("EnableTime") + .HasColumnType("datetime(6)"); + + b.Property("ExtraProperties") + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("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("TenantId") + .HasColumnType("char(36)"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("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("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Content") + .HasMaxLength(1048576) + .HasColumnType("longtext") + .HasColumnName("Content"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("Culture") + .HasMaxLength(30) + .HasColumnType("varchar(30)") + .HasColumnName("Culture"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)") + .HasColumnName("DisplayName"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)") + .HasColumnName("Name"); + + b.Property("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("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("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.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("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.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("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 + } + } +} diff --git a/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Migrations/20220628050554_Alter-Culture-Field-Allow-Be-Null.cs b/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Migrations/20220628050554_Alter-Culture-Field-Allow-Be-Null.cs new file mode 100644 index 000000000..a66aa2361 --- /dev/null +++ b/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Migrations/20220628050554_Alter-Culture-Field-Allow-Be-Null.cs @@ -0,0 +1,47 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace LY.MicroService.BackendAdmin.Migrations +{ + public partial class AlterCultureFieldAllowBeNull : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "Culture", + table: "AbpTextTemplates", + type: "varchar(30)", + maxLength: 30, + nullable: true, + oldClrType: typeof(string), + oldType: "varchar(30)", + oldMaxLength: 30) + .Annotation("MySql:CharSet", "utf8mb4") + .OldAnnotation("MySql:CharSet", "utf8mb4"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.UpdateData( + table: "AbpTextTemplates", + keyColumn: "Culture", + keyValue: null, + column: "Culture", + value: ""); + + migrationBuilder.AlterColumn( + name: "Culture", + table: "AbpTextTemplates", + type: "varchar(30)", + maxLength: 30, + nullable: false, + oldClrType: typeof(string), + oldType: "varchar(30)", + oldMaxLength: 30, + oldNullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + .OldAnnotation("MySql:CharSet", "utf8mb4"); + } + } +} diff --git a/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Migrations/BackendAdminHostMigrationsDbContextModelSnapshot.cs b/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Migrations/BackendAdminHostMigrationsDbContextModelSnapshot.cs index e56760307..5c1daa123 100644 --- a/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Migrations/BackendAdminHostMigrationsDbContextModelSnapshot.cs +++ b/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Migrations/BackendAdminHostMigrationsDbContextModelSnapshot.cs @@ -190,7 +190,6 @@ namespace LY.MicroService.BackendAdmin.Migrations .HasColumnName("CreatorId"); b.Property("Culture") - .IsRequired() .HasMaxLength(30) .HasColumnType("varchar(30)") .HasColumnName("Culture"); From a9542d3c4808729aff910143d2c7d40c3a4b68ce Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Tue, 28 Jun 2022 13:33:43 +0800 Subject: [PATCH 2/2] fix: make paging conditions work --- .../LINGYUN/Abp/TextTemplating/TextTemplateAppService.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/TextTemplateAppService.cs b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/TextTemplateAppService.cs index b6311c0c6..0dd0e0e1f 100644 --- a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/TextTemplateAppService.cs +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Application/LINGYUN/Abp/TextTemplating/TextTemplateAppService.cs @@ -72,7 +72,9 @@ public class TextTemplateAppService : AbpTextTemplatingAppServiceBase, ITextTemp var templateDefinitions = TemplateDefinitionManager.GetAll(); var filterTemplates = templateDefinitions .WhereIf(!input.Filter.IsNullOrWhiteSpace(), x => - x.Name.Contains(input.Filter) || x.Layout.Contains(input.Filter)); + x.Name.Contains(input.Filter) || x.Layout.Contains(input.Filter)) + .Skip(input.SkipCount) + .Take(input.MaxResultCount); foreach (var templateDefinition in filterTemplates) {