From 35124e9860d4b5e2e9049c70d4045bb19fc662ba Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Sun, 5 Feb 2023 11:41:31 +0800 Subject: [PATCH 1/7] feat(localization): add language&resource management api support. --- .../ILanguageAppService.cs | 14 ++++ .../IResourceAppService.cs | 13 ++++ .../LanguageCreateDto.cs | 14 ++++ .../LanguageCreateOrUpdateDto.cs | 13 ++++ .../Abp/LocalizationManagement/LanguageDto.cs | 11 +++ .../LanguageUpdateDto.cs | 4 + .../ResourceCreateDto.cs | 10 +++ .../ResourceCreateOrUpdateDto.cs | 17 +++++ .../Abp/LocalizationManagement/ResourceDto.cs | 13 ++++ .../ResourceUpdateDto.cs | 4 + .../LanguageAppService.cs | 73 ++++++++++++++++++ ...ationManagementApplicationMapperProfile.cs | 2 + .../ResourceAppService.cs | 74 +++++++++++++++++++ .../LocalizationErrorCodes.cs | 37 ++++++++++ .../Abp/LocalizationManagement/Language.cs | 13 +++- .../LanguageProvider.cs | 37 ++++++++++ .../Abp/LocalizationManagement/Resource.cs | 17 +++++ .../StaticLocalizationSaver.cs | 6 ++ .../LanguageController.cs | 44 +++++++++++ .../ResourceController.cs | 45 +++++++++++ 20 files changed, 460 insertions(+), 1 deletion(-) create mode 100644 aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ILanguageAppService.cs create mode 100644 aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/IResourceAppService.cs create mode 100644 aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageCreateDto.cs create mode 100644 aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageCreateOrUpdateDto.cs create mode 100644 aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageDto.cs create mode 100644 aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageUpdateDto.cs create mode 100644 aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceCreateDto.cs create mode 100644 aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceCreateOrUpdateDto.cs create mode 100644 aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceDto.cs create mode 100644 aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceUpdateDto.cs create mode 100644 aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LanguageAppService.cs create mode 100644 aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/ResourceAppService.cs create mode 100644 aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/LocalizationErrorCodes.cs create mode 100644 aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LanguageProvider.cs create mode 100644 aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/LanguageController.cs create mode 100644 aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/ResourceController.cs diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ILanguageAppService.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ILanguageAppService.cs new file mode 100644 index 000000000..d816717dc --- /dev/null +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ILanguageAppService.cs @@ -0,0 +1,14 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; + +namespace LINGYUN.Abp.LocalizationManagement; + +public interface ILanguageAppService : IApplicationService +{ + Task CreateAsync(LanguageCreateDto input); + + Task UpdateAsync(string name, LanguageUpdateDto input); + + Task DeleteAsync(string name); +} diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/IResourceAppService.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/IResourceAppService.cs new file mode 100644 index 000000000..cdfca38e4 --- /dev/null +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/IResourceAppService.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; +using Volo.Abp.Application.Services; + +namespace LINGYUN.Abp.LocalizationManagement; + +public interface IResourceAppService : IApplicationService +{ + Task CreateAsync(ResourceCreateDto input); + + Task UpdateAsync(string name, ResourceUpdateDto input); + + Task DeleteAsync(string name); +} diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageCreateDto.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageCreateDto.cs new file mode 100644 index 000000000..fc9b6af58 --- /dev/null +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageCreateDto.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Validation; + +namespace LINGYUN.Abp.LocalizationManagement; + +public class LanguageCreateDto : LanguageCreateOrUpdateDto +{ + [Required] + [DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxCultureNameLength))] + public string CultureName { get; set; } + + [DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxUiCultureNameLength))] + public string UiCultureName { get; set; } +} diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageCreateOrUpdateDto.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageCreateOrUpdateDto.cs new file mode 100644 index 000000000..098bf6434 --- /dev/null +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageCreateOrUpdateDto.cs @@ -0,0 +1,13 @@ +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Validation; + +namespace LINGYUN.Abp.LocalizationManagement; +public abstract class LanguageCreateOrUpdateDto +{ + [Required] + [DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxDisplayNameLength))] + public string DisplayName { get; set; } + + [DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxFlagIconLength))] + public string FlagIcon { get; set; } +} diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageDto.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageDto.cs new file mode 100644 index 000000000..bc49b926c --- /dev/null +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageDto.cs @@ -0,0 +1,11 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.LocalizationManagement; +public class LanguageDto : AuditedEntityDto +{ + public string CultureName { get; set; } + public string UiCultureName { get; set; } + public string DisplayName { get; set; } + public string FlagIcon { get; set; } +} diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageUpdateDto.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageUpdateDto.cs new file mode 100644 index 000000000..83e790fab --- /dev/null +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageUpdateDto.cs @@ -0,0 +1,4 @@ +namespace LINGYUN.Abp.LocalizationManagement; +public class LanguageUpdateDto : LanguageCreateOrUpdateDto +{ +} diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceCreateDto.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceCreateDto.cs new file mode 100644 index 000000000..fcf7e30c2 --- /dev/null +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceCreateDto.cs @@ -0,0 +1,10 @@ +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Validation; + +namespace LINGYUN.Abp.LocalizationManagement; +public class ResourceCreateDto : ResourceCreateOrUpdateDto +{ + [Required] + [DynamicStringLength(typeof(ResourceConsts), nameof(ResourceConsts.MaxNameLength))] + public string Name { get; set; } +} diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceCreateOrUpdateDto.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceCreateOrUpdateDto.cs new file mode 100644 index 000000000..115dd2462 --- /dev/null +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceCreateOrUpdateDto.cs @@ -0,0 +1,17 @@ +using Volo.Abp.Validation; + +namespace LINGYUN.Abp.LocalizationManagement; + +public abstract class ResourceCreateOrUpdateDto +{ + public bool Enable { get; set; } = true; + + [DynamicStringLength(typeof(ResourceConsts), nameof(ResourceConsts.MaxNameLength))] + public string DisplayName { get; set; } + + [DynamicStringLength(typeof(ResourceConsts), nameof(ResourceConsts.MaxNameLength))] + public string Description { get; set; } + + [DynamicStringLength(typeof(ResourceConsts), nameof(ResourceConsts.MaxNameLength))] + public string DefaultCultureName { get; set; } +} diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceDto.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceDto.cs new file mode 100644 index 000000000..c7dec462d --- /dev/null +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceDto.cs @@ -0,0 +1,13 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.LocalizationManagement; + +public class ResourceDto : AuditedEntityDto +{ + public bool Enable { get; set; } + public string Name { get; set; } + public string DisplayName { get; set; } + public string Description { get; set; } + public string DefaultCultureName { get; set; } +} diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceUpdateDto.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceUpdateDto.cs new file mode 100644 index 000000000..2f9d1d6f2 --- /dev/null +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceUpdateDto.cs @@ -0,0 +1,4 @@ +namespace LINGYUN.Abp.LocalizationManagement; +public class ResourceUpdateDto : ResourceCreateOrUpdateDto +{ +} diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LanguageAppService.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LanguageAppService.cs new file mode 100644 index 000000000..1407e1008 --- /dev/null +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LanguageAppService.cs @@ -0,0 +1,73 @@ +using LINGYUN.Abp.LocalizationManagement.Permissions; +using Microsoft.AspNetCore.Authorization; +using System.Threading.Tasks; +using Volo.Abp; + +namespace LINGYUN.Abp.LocalizationManagement; + +[Authorize(LocalizationManagementPermissions.Language.Default)] +public class LanguageAppService : LocalizationAppServiceBase, ILanguageAppService +{ + private readonly ILanguageRepository _repository; + + public LanguageAppService(ILanguageRepository repository) + { + _repository = repository; + } + + [Authorize(LocalizationManagementPermissions.Language.Create)] + public async virtual Task CreateAsync(LanguageCreateDto input) + { + if (_repository.FindByCultureNameAsync(input.CultureName) != null) + { + throw new BusinessException(LocalizationErrorCodes.Language.NameAlreadyExists) + .WithData(nameof(Language.CultureName), input.CultureName); + } + + var language = new Language( + GuidGenerator.Create(), + input.CultureName, + input.UiCultureName, + input.DisplayName, + input.FlagIcon); + + language = await _repository.InsertAsync(language); + + await CurrentUnitOfWork.SaveChangesAsync(); + + return ObjectMapper.Map(language); + } + + [Authorize(LocalizationManagementPermissions.Language.Delete)] + public async virtual Task DeleteAsync(string name) + { + var language = await GetByNameAsync(name); + + await _repository.DeleteAsync(language); + + await CurrentUnitOfWork.SaveChangesAsync(); + } + + [Authorize(LocalizationManagementPermissions.Language.Update)] + public async virtual Task UpdateAsync(string name, LanguageUpdateDto input) + { + var language = await GetByNameAsync(name); + + language.SetFlagIcon(input.FlagIcon); + language.SetDisplayName(input.DisplayName); + + await _repository.UpdateAsync(language); + + await CurrentUnitOfWork.SaveChangesAsync(); + + return ObjectMapper.Map(language); + } + + private async Task GetByNameAsync(string name) + { + var language = await _repository.FindByCultureNameAsync(name); + + return language ?? throw new BusinessException(LocalizationErrorCodes.Language.NameNotFoundOrStaticNotAllowed) + .WithData(nameof(Language.CultureName), name); + } +} diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LocalizationManagementApplicationMapperProfile.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LocalizationManagementApplicationMapperProfile.cs index 6a85076fe..a3fb58b2f 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LocalizationManagementApplicationMapperProfile.cs +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LocalizationManagementApplicationMapperProfile.cs @@ -6,6 +6,8 @@ namespace LINGYUN.Abp.LocalizationManagement { public LocalizationManagementApplicationMapperProfile() { + CreateMap(); + CreateMap(); } } } diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/ResourceAppService.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/ResourceAppService.cs new file mode 100644 index 000000000..50206f337 --- /dev/null +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/ResourceAppService.cs @@ -0,0 +1,74 @@ +using LINGYUN.Abp.LocalizationManagement.Permissions; +using Microsoft.AspNetCore.Authorization; +using System.Threading.Tasks; +using Volo.Abp; + +namespace LINGYUN.Abp.LocalizationManagement; + +[Authorize(LocalizationManagementPermissions.Resource.Default)] +public class ResourceAppService : LocalizationAppServiceBase, IResourceAppService +{ + private readonly IResourceRepository _repository; + + public ResourceAppService(IResourceRepository repository) + { + _repository = repository; + } + + [Authorize(LocalizationManagementPermissions.Resource.Create)] + public async virtual Task CreateAsync(ResourceCreateDto input) + { + if (_repository.FindByNameAsync(input.Name) != null) + { + throw new BusinessException(LocalizationErrorCodes.Resource.NameAlreadyExists) + .WithData(nameof(Resource.Name), input.Name); + } + + var resource = new Resource( + GuidGenerator.Create(), + input.Name, + input.DisplayName, + input.Description, + input.DefaultCultureName); + + resource = await _repository.InsertAsync(resource); + + await CurrentUnitOfWork.SaveChangesAsync(); + + return ObjectMapper.Map(resource); + } + + [Authorize(LocalizationManagementPermissions.Resource.Delete)] + public async virtual Task DeleteAsync(string name) + { + var resource = await GetByNameAsync(name); + + await _repository.DeleteAsync(resource); + + await CurrentUnitOfWork.SaveChangesAsync(); + } + + [Authorize(LocalizationManagementPermissions.Resource.Update)] + public async virtual Task UpdateAsync(string name, ResourceUpdateDto input) + { + var resource = await GetByNameAsync(name); + + resource.SetDisplayName(input.DisplayName); + resource.SetDescription(input.Description); + resource.SetDefaultCultureName(input.DefaultCultureName); + + await _repository.UpdateAsync(resource); + + await CurrentUnitOfWork.SaveChangesAsync(); + + return ObjectMapper.Map(resource); + } + + private async Task GetByNameAsync(string name) + { + var resource = await _repository.FindByNameAsync(name); + + return resource ?? throw new BusinessException(LocalizationErrorCodes.Resource.NameNotFoundOrStaticNotAllowed) + .WithData(nameof(Resource.Name), name); + } +} diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/LocalizationErrorCodes.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/LocalizationErrorCodes.cs new file mode 100644 index 000000000..381a84213 --- /dev/null +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/LocalizationErrorCodes.cs @@ -0,0 +1,37 @@ +namespace LINGYUN.Abp.LocalizationManagement; +public static class LocalizationErrorCodes +{ + public const string Namespace = "Localization"; + + /// + /// 语言代码002 + /// + public static class Language + { + public const string Prefix = Namespace + ":001"; + /// + /// 名称已经存在 + /// + public const string NameAlreadyExists = Prefix + "100"; + /// + /// 没有找到名为 {CultureName} 的语言名称或内置语言不允许操作! + /// + public const string NameNotFoundOrStaticNotAllowed = Prefix + "400"; + } + + /// + /// 资源代码002 + /// + public static class Resource + { + public const string Prefix = Namespace + ":002"; + /// + /// 名称已经存在 + /// + public const string NameAlreadyExists = Prefix + "100"; + /// + /// 没有找到名为 {Name} 的资源名称或内置资源不允许操作! + /// + public const string NameNotFoundOrStaticNotAllowed = Prefix + "400"; + } +} diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Language.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Language.cs index 22982e9f4..ac2148e7e 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Language.cs +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Language.cs @@ -3,7 +3,6 @@ using System; using Volo.Abp; using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.Localization; -using Volo.Abp.MultiTenancy; namespace LINGYUN.Abp.LocalizationManagement { @@ -16,10 +15,12 @@ namespace LINGYUN.Abp.LocalizationManagement public virtual string FlagIcon { get; set; } protected Language() { } public Language( + Guid id, [NotNull] string cultureName, [NotNull] string uiCultureName, [NotNull] string displayName, string flagIcon = null) + : base(id) { CultureName = Check.NotNullOrWhiteSpace(cultureName, nameof(cultureName), LanguageConsts.MaxCultureNameLength); UiCultureName = Check.NotNullOrWhiteSpace(uiCultureName, nameof(uiCultureName), LanguageConsts.MaxUiCultureNameLength); @@ -32,6 +33,16 @@ namespace LINGYUN.Abp.LocalizationManagement Enable = true; } + public virtual void SetDisplayName(string displayName) + { + DisplayName = Check.NotNullOrWhiteSpace(displayName, nameof(displayName), LanguageConsts.MaxDisplayNameLength); + } + + public virtual void SetFlagIcon(string flagIcon) + { + FlagIcon = Check.Length(flagIcon, nameof(flagIcon), LanguageConsts.MaxFlagIconLength); + } + public virtual void ChangeCulture(string cultureName, string uiCultureName = null, string displayName = null) { ChangeCultureInternal(cultureName, uiCultureName, displayName); diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LanguageProvider.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LanguageProvider.cs new file mode 100644 index 000000000..601751fc8 --- /dev/null +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LanguageProvider.cs @@ -0,0 +1,37 @@ +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Localization; + +namespace LINGYUN.Abp.LocalizationManagement; + +[ExposeServices( + typeof(ILanguageProvider), + typeof(LanguageProvider))] +public class LanguageProvider : ILanguageProvider, ITransientDependency +{ + protected ILanguageRepository Repository { get; } + + public LanguageProvider(ILanguageRepository repository) + { + Repository = repository; + } + + public async virtual Task> GetLanguagesAsync() + { + var languages = await Repository.GetActivedListAsync(); + + return languages.Select(MapToLanguageInfo).ToImmutableList(); + } + + protected virtual LanguageInfo MapToLanguageInfo(Language language) + { + return new LanguageInfo( + language.CultureName, + language.UiCultureName, + language.DisplayName, + language.FlagIcon); + } +} diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Resource.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Resource.cs index db763a96f..4967c50d9 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Resource.cs +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Resource.cs @@ -14,10 +14,12 @@ namespace LINGYUN.Abp.LocalizationManagement public virtual string DefaultCultureName { get; set; } protected Resource() { } public Resource( + Guid id, [NotNull] string name, [CanBeNull] string displayName = null, [CanBeNull] string description = null, [CanBeNull] string defaultCultureName = null) + : base(id) { Name = Check.NotNullOrWhiteSpace(name, nameof(name), ResourceConsts.MaxNameLength); @@ -27,5 +29,20 @@ namespace LINGYUN.Abp.LocalizationManagement Enable = true; } + + public virtual void SetDisplayName(string displayName) + { + DisplayName = Check.Length(displayName, nameof(displayName), ResourceConsts.MaxDisplayNameLength); + } + + public virtual void SetDescription(string description) + { + Description = Check.Length(description, nameof(description), ResourceConsts.MaxDescriptionLength); + } + + public virtual void SetDefaultCultureName(string defaultCultureName) + { + DefaultCultureName = Check.Length(defaultCultureName, nameof(defaultCultureName), ResourceConsts.MaxDefaultCultureNameLength); + } } } diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/StaticLocalizationSaver.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/StaticLocalizationSaver.cs index 9b6e46233..9ecb9acd6 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/StaticLocalizationSaver.cs +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/StaticLocalizationSaver.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; +using Volo.Abp.Guids; using Volo.Abp.Localization; using Volo.Abp.Uow; @@ -14,6 +15,7 @@ namespace LINGYUN.Abp.LocalizationManagement; [Dependency(ReplaceServices = true)] public class StaticLocalizationSaver : IStaticLocalizationSaver, ITransientDependency { + protected IGuidGenerator GuidGenerator { get; } protected ILanguageRepository LanguageRepository { get; } protected ITextRepository TextRepository { get; } protected IResourceRepository ResourceRepository { get; } @@ -23,6 +25,7 @@ public class StaticLocalizationSaver : IStaticLocalizationSaver, ITransientDepen protected AbpLocalizationPersistenceOptions LocalizationPersistenceOptions { get; } public StaticLocalizationSaver( + IGuidGenerator guidGenerator, IServiceProvider serviceProvider, ILanguageRepository languageRepository, ITextRepository textRepository, @@ -31,6 +34,7 @@ public class StaticLocalizationSaver : IStaticLocalizationSaver, ITransientDepen IOptions localizationOptions, IOptions localizationPersistenceOptions) { + GuidGenerator = guidGenerator; ServiceProvider = serviceProvider; LanguageRepository = languageRepository; TextRepository = textRepository; @@ -51,6 +55,7 @@ public class StaticLocalizationSaver : IStaticLocalizationSaver, ITransientDepen { await LanguageRepository.InsertAsync( new Language( + GuidGenerator.Create(), language.CultureName, language.UiCultureName, language.DisplayName, @@ -71,6 +76,7 @@ public class StaticLocalizationSaver : IStaticLocalizationSaver, ITransientDepen { await ResourceRepository.InsertAsync( new Resource( + GuidGenerator.Create(), localizationResource.ResourceName, localizationResource.ResourceName, localizationResource.ResourceName, diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/LanguageController.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/LanguageController.cs new file mode 100644 index 000000000..0b563571f --- /dev/null +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/LanguageController.cs @@ -0,0 +1,44 @@ +using LINGYUN.Abp.LocalizationManagement.Permissions; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; +namespace LINGYUN.Abp.LocalizationManagement; + +[Authorize(LocalizationManagementPermissions.Language.Default)] +[RemoteService(Name = LocalizationRemoteServiceConsts.RemoteServiceName)] +[Area("localization")] +[Route("api/localization/languages")] +public class LanguageController : AbpControllerBase, ILanguageAppService +{ + private readonly ILanguageAppService _service; + + public LanguageController(ILanguageAppService service) + { + _service = service; + } + + [HttpPost] + [Authorize(LocalizationManagementPermissions.Language.Create)] + public virtual Task CreateAsync(LanguageCreateDto input) + { + return _service.CreateAsync(input); + } + + [HttpDelete] + [Route("{name}")] + [Authorize(LocalizationManagementPermissions.Language.Delete)] + public virtual Task DeleteAsync(string name) + { + return _service.DeleteAsync(name); + } + + [HttpPut] + [Route("{name}")] + [Authorize(LocalizationManagementPermissions.Language.Update)] + public virtual Task UpdateAsync(string name, LanguageUpdateDto input) + { + return _service.UpdateAsync(name, input); + } +} diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/ResourceController.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/ResourceController.cs new file mode 100644 index 000000000..ba838bd49 --- /dev/null +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/ResourceController.cs @@ -0,0 +1,45 @@ +using LINGYUN.Abp.LocalizationManagement.Permissions; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; + +namespace LINGYUN.Abp.LocalizationManagement; + +[Authorize(LocalizationManagementPermissions.Resource.Default)] +[RemoteService(Name = LocalizationRemoteServiceConsts.RemoteServiceName)] +[Area("localization")] +[Route("api/localization/resources")] +public class ResourceController : AbpControllerBase, IResourceAppService +{ + private readonly IResourceAppService _service; + + public ResourceController(IResourceAppService service) + { + _service = service; + } + + [HttpPost] + [Authorize(LocalizationManagementPermissions.Resource.Create)] + public virtual Task CreateAsync(ResourceCreateDto input) + { + return _service.CreateAsync(input); + } + + [HttpDelete] + [Route("{name}")] + [Authorize(LocalizationManagementPermissions.Resource.Delete)] + public virtual Task DeleteAsync(string name) + { + return _service.DeleteAsync(name); + } + + [HttpPut] + [Route("{name}")] + [Authorize(LocalizationManagementPermissions.Resource.Update)] + public virtual Task UpdateAsync(string name, ResourceUpdateDto input) + { + return _service.UpdateAsync(name, input); + } +} From 7a5ae418d594df5cce9dff9428b30f7ba8cfa027 Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Sun, 5 Feb 2023 13:13:51 +0800 Subject: [PATCH 2/7] feat(localization): add language&resource management ui support. --- apps/vue/src/api/localization/languages.ts | 52 ++++++++++++- .../api/localization/model/languagesModel.ts | 9 ++- .../api/localization/model/resourcesModel.ts | 12 ++- .../src/api/localization/model/textsModel.ts | 8 +- apps/vue/src/api/localization/resources.ts | 52 ++++++++++++- .../languages/components/LanguageModal.vue | 56 ++++++++++++++ .../languages/components/LanguageTable.vue | 77 ++++++++++++++++++- .../resources/components/ModalData.ts | 6 ++ .../resources/components/ResourceModal.vue | 56 ++++++++++++++ .../resources/components/ResourceTable.vue | 77 ++++++++++++++++++- .../resources/components/TableData.ts | 10 +++ .../texts/components/TextModal.vue | 2 +- .../Mvc/Localization/Resources/en.json | 3 +- .../Mvc/Localization/Resources/zh-Hans.json | 3 +- .../ILanguageAppService.cs | 2 + .../IResourceAppService.cs | 2 + .../LanguageAppService.cs | 14 +++- .../ResourceAppService.cs | 13 +++- .../Localization/Resources/en.json | 4 +- .../Localization/Resources/zh-Hans.json | 4 +- .../LanguageController.cs | 7 ++ .../ResourceController.cs | 7 ++ 22 files changed, 447 insertions(+), 29 deletions(-) create mode 100644 apps/vue/src/views/localization/languages/components/LanguageModal.vue create mode 100644 apps/vue/src/views/localization/resources/components/ResourceModal.vue diff --git a/apps/vue/src/api/localization/languages.ts b/apps/vue/src/api/localization/languages.ts index ee2971966..e5ada0d1f 100644 --- a/apps/vue/src/api/localization/languages.ts +++ b/apps/vue/src/api/localization/languages.ts @@ -1,5 +1,8 @@ import { defAbpHttp } from '/@/utils/http/abp'; -import { LanguageListResult } from './model/languagesModel'; +import { LanguageListResult, LanguageCreate, LanguageUpdate, Language } from './model/languagesModel'; + +const remoteServiceName = 'LocalizationManagement'; +const controllerName = 'Language'; enum Api { GetList = '/api/abp/localization/languages', @@ -10,3 +13,50 @@ export const getList = () => { url: Api.GetList, }); }; + +export const GetAsyncByName = (name: string) => { + return defAbpHttp.request({ + service: remoteServiceName, + controller: controllerName, + action: 'GetAsync', + uniqueName: 'GetAsyncByName', + params: { + name: name, + }, + }); +}; + +export const CreateAsyncByInput = (input: LanguageCreate) => { + return defAbpHttp.request({ + service: remoteServiceName, + controller: controllerName, + action: 'CreateAsync', + uniqueName: 'CreateAsyncByInput', + data: input, + }); +}; + +export const UpdateAsyncByNameAndInput = (name: string, input: LanguageUpdate) => { + return defAbpHttp.request({ + service: remoteServiceName, + controller: controllerName, + action: 'UpdateAsync', + uniqueName: 'UpdateAsyncByNameAndInput', + params: { + name: name, + }, + data: input, + }); +}; + +export const DeleteAsyncByName = (name: string) => { + return defAbpHttp.request({ + service: remoteServiceName, + controller: controllerName, + action: 'DeleteAsync', + uniqueName: 'DeleteAsyncByName', + params: { + name: name, + }, + }); +}; \ No newline at end of file diff --git a/apps/vue/src/api/localization/model/languagesModel.ts b/apps/vue/src/api/localization/model/languagesModel.ts index 7b2d9a9a5..546054993 100644 --- a/apps/vue/src/api/localization/model/languagesModel.ts +++ b/apps/vue/src/api/localization/model/languagesModel.ts @@ -8,12 +8,17 @@ export interface Language extends AuditedEntityDto { export interface LanguageCreateOrUpdate { enable: boolean; - cultureName: string; - uiCultureName: string; displayName: string; flagIcon: string; } +export interface LanguageCreate extends LanguageCreateOrUpdate { + cultureName: string; + uiCultureName: string; +} + +export interface LanguageUpdate extends LanguageCreateOrUpdate {} + export interface LanguageListResult extends ListResultDto {} export interface LanguagePagedResult extends PagedResultDto {} diff --git a/apps/vue/src/api/localization/model/resourcesModel.ts b/apps/vue/src/api/localization/model/resourcesModel.ts index ce2d9e1a4..c05f6ece2 100644 --- a/apps/vue/src/api/localization/model/resourcesModel.ts +++ b/apps/vue/src/api/localization/model/resourcesModel.ts @@ -1,4 +1,5 @@ export interface Resource { + id: string; name: string; displayName: string; description: string; @@ -6,11 +7,18 @@ export interface Resource { export interface ResourceCreateOrUpdate { enable: boolean; - name: string; displayName: string; - description: string; + description?: string; + defaultCultureName?: string; } +export interface ResourceCreate extends ResourceCreateOrUpdate { + name: string; +} + +export interface ResourceUpdate extends ResourceCreateOrUpdate {} + + export interface ResourceListResult extends ListResultDto {} export interface ResourcePagedResult extends PagedResultDto {} diff --git a/apps/vue/src/api/localization/model/textsModel.ts b/apps/vue/src/api/localization/model/textsModel.ts index 1f62a32cb..4bf83e957 100644 --- a/apps/vue/src/api/localization/model/textsModel.ts +++ b/apps/vue/src/api/localization/model/textsModel.ts @@ -1,12 +1,12 @@ export interface Text { - key: boolean; + key: string; value: string; cultureName: string; resourceName: string; } export interface TextDifference { - key: boolean; + key: string; value: string; cultureName: string; resourceName: string; @@ -15,7 +15,7 @@ export interface TextDifference { } export interface SetTextInput { - key: boolean; + key: string; value: string; cultureName: string; resourceName: string; @@ -24,7 +24,7 @@ export interface SetTextInput { export interface TextListResult extends ListResultDto {} export interface GetTextByKey { - key: boolean; + key: string; cultureName: string; resourceName: string; } diff --git a/apps/vue/src/api/localization/resources.ts b/apps/vue/src/api/localization/resources.ts index 7c9b7db56..32b4d497a 100644 --- a/apps/vue/src/api/localization/resources.ts +++ b/apps/vue/src/api/localization/resources.ts @@ -1,5 +1,8 @@ import { defAbpHttp } from '/@/utils/http/abp'; -import { ResourceListResult } from './model/resourcesModel'; +import { ResourceListResult, Resource, ResourceCreate, ResourceUpdate } from './model/resourcesModel'; + +const remoteServiceName = 'LocalizationManagement'; +const controllerName = 'Resource'; enum Api { GetList = '/api/abp/localization/resources', @@ -10,3 +13,50 @@ export const getList = () => { url: Api.GetList, }); }; + +export const GetAsyncByName = (name: string) => { + return defAbpHttp.request({ + service: remoteServiceName, + controller: controllerName, + action: 'GetAsync', + uniqueName: 'GetAsyncByName', + params: { + name: name, + }, + }); +}; + +export const CreateAsyncByInput = (input: ResourceCreate) => { + return defAbpHttp.request({ + service: remoteServiceName, + controller: controllerName, + action: 'CreateAsync', + uniqueName: 'CreateAsyncByInput', + data: input, + }); +}; + +export const UpdateAsyncByNameAndInput = (name: string, input: ResourceUpdate) => { + return defAbpHttp.request({ + service: remoteServiceName, + controller: controllerName, + action: 'UpdateAsync', + uniqueName: 'UpdateAsyncByNameAndInput', + params: { + name: name, + }, + data: input, + }); +}; + +export const DeleteAsyncByName = (name: string) => { + return defAbpHttp.request({ + service: remoteServiceName, + controller: controllerName, + action: 'DeleteAsync', + uniqueName: 'DeleteAsyncByName', + params: { + name: name, + }, + }); +}; diff --git a/apps/vue/src/views/localization/languages/components/LanguageModal.vue b/apps/vue/src/views/localization/languages/components/LanguageModal.vue new file mode 100644 index 000000000..c788896e7 --- /dev/null +++ b/apps/vue/src/views/localization/languages/components/LanguageModal.vue @@ -0,0 +1,56 @@ + + + diff --git a/apps/vue/src/views/localization/languages/components/LanguageTable.vue b/apps/vue/src/views/localization/languages/components/LanguageTable.vue index f3edf6472..272cec89a 100644 --- a/apps/vue/src/views/localization/languages/components/LanguageTable.vue +++ b/apps/vue/src/views/localization/languages/components/LanguageTable.vue @@ -1,18 +1,58 @@ diff --git a/apps/vue/src/views/localization/resources/components/ModalData.ts b/apps/vue/src/views/localization/resources/components/ModalData.ts index 4dee3b303..e537c7017 100644 --- a/apps/vue/src/views/localization/resources/components/ModalData.ts +++ b/apps/vue/src/views/localization/resources/components/ModalData.ts @@ -55,5 +55,11 @@ export function getModalFormSchemas(): FormSchema[] { label: L('DisplayName:Description'), colProps: { span: 24 }, }, + { + field: 'description', + component: 'InputTextArea', + label: L('DisplayName:Description'), + colProps: { span: 24 }, + }, ]; } diff --git a/apps/vue/src/views/localization/resources/components/ResourceModal.vue b/apps/vue/src/views/localization/resources/components/ResourceModal.vue new file mode 100644 index 000000000..954f2b398 --- /dev/null +++ b/apps/vue/src/views/localization/resources/components/ResourceModal.vue @@ -0,0 +1,56 @@ + + + diff --git a/apps/vue/src/views/localization/resources/components/ResourceTable.vue b/apps/vue/src/views/localization/resources/components/ResourceTable.vue index ed5829c10..8e634dbe0 100644 --- a/apps/vue/src/views/localization/resources/components/ResourceTable.vue +++ b/apps/vue/src/views/localization/resources/components/ResourceTable.vue @@ -1,17 +1,57 @@ diff --git a/apps/vue/src/views/localization/resources/components/TableData.ts b/apps/vue/src/views/localization/resources/components/TableData.ts index f1b99fc46..3ea166700 100644 --- a/apps/vue/src/views/localization/resources/components/TableData.ts +++ b/apps/vue/src/views/localization/resources/components/TableData.ts @@ -35,5 +35,15 @@ export function getDataColumns(): BasicColumn[] { return last.description?.localeCompare(next.description) ?? -1; }, }, + { + title: L('DisplayName:DefaultCultureName'), + dataIndex: 'defaultCultureName', + align: 'left', + width: 150, + resizable: true, + sorter: (last, next) => { + return last.defaultCultureName?.localeCompare(next.defaultCultureName) ?? -1; + }, + }, ]; } diff --git a/apps/vue/src/views/localization/texts/components/TextModal.vue b/apps/vue/src/views/localization/texts/components/TextModal.vue index b5277ce87..09c0a2295 100644 --- a/apps/vue/src/views/localization/texts/components/TextModal.vue +++ b/apps/vue/src/views/localization/texts/components/TextModal.vue @@ -47,7 +47,7 @@ resultField: 'items', labelField: 'uiCultureName', valueField: 'cultureName', - onChange: (key) => { + onSelect: (key) => { // 当文化变更时,检查键值是否有目标值 const model = unref(modelRef); if (model?.key) { diff --git a/aspnet-core/modules/localization/LINGYUN.Abp.AspNetCore.Mvc.Localization/LINGYUN/Abp/AspNetCore/Mvc/Localization/Resources/en.json b/aspnet-core/modules/localization/LINGYUN.Abp.AspNetCore.Mvc.Localization/LINGYUN/Abp/AspNetCore/Mvc/Localization/Resources/en.json index cf8f634e2..b6d2102e6 100644 --- a/aspnet-core/modules/localization/LINGYUN.Abp.AspNetCore.Mvc.Localization/LINGYUN/Abp/AspNetCore/Mvc/Localization/Resources/en.json +++ b/aspnet-core/modules/localization/LINGYUN.Abp.AspNetCore.Mvc.Localization/LINGYUN/Abp/AspNetCore/Mvc/Localization/Resources/en.json @@ -17,6 +17,7 @@ "DisplayName:UiCultureName": "Ui Culture Name", "DisplayName:DisplayName": "Display Name", "DisplayName:FlagIcon": "Flag Icon", - "DisplayName:Description": "Description" + "DisplayName:Description": "Description", + "DisplayName:DefaultCultureName": "Default Culture" } } \ No newline at end of file diff --git a/aspnet-core/modules/localization/LINGYUN.Abp.AspNetCore.Mvc.Localization/LINGYUN/Abp/AspNetCore/Mvc/Localization/Resources/zh-Hans.json b/aspnet-core/modules/localization/LINGYUN.Abp.AspNetCore.Mvc.Localization/LINGYUN/Abp/AspNetCore/Mvc/Localization/Resources/zh-Hans.json index a5c4c9553..b2eecb64d 100644 --- a/aspnet-core/modules/localization/LINGYUN.Abp.AspNetCore.Mvc.Localization/LINGYUN/Abp/AspNetCore/Mvc/Localization/Resources/zh-Hans.json +++ b/aspnet-core/modules/localization/LINGYUN.Abp.AspNetCore.Mvc.Localization/LINGYUN/Abp/AspNetCore/Mvc/Localization/Resources/zh-Hans.json @@ -17,6 +17,7 @@ "DisplayName:UiCultureName": "Ui文件名称", "DisplayName:DisplayName": "显示名称", "DisplayName:FlagIcon": "旗帜图标", - "DisplayName:Description": "描述" + "DisplayName:Description": "描述", + "DisplayName:DefaultCultureName": "默认文化" } } \ No newline at end of file diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ILanguageAppService.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ILanguageAppService.cs index d816717dc..c84ffb557 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ILanguageAppService.cs +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ILanguageAppService.cs @@ -6,6 +6,8 @@ namespace LINGYUN.Abp.LocalizationManagement; public interface ILanguageAppService : IApplicationService { + Task GetByNameAsync(string name); + Task CreateAsync(LanguageCreateDto input); Task UpdateAsync(string name, LanguageUpdateDto input); diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/IResourceAppService.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/IResourceAppService.cs index cdfca38e4..b44dd34e1 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/IResourceAppService.cs +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/IResourceAppService.cs @@ -5,6 +5,8 @@ namespace LINGYUN.Abp.LocalizationManagement; public interface IResourceAppService : IApplicationService { + Task GetByNameAsync(string name); + Task CreateAsync(ResourceCreateDto input); Task UpdateAsync(string name, ResourceUpdateDto input); diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LanguageAppService.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LanguageAppService.cs index 1407e1008..500beea33 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LanguageAppService.cs +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LanguageAppService.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Authorization; using System.Threading.Tasks; using Volo.Abp; +using Volo.Abp.ObjectMapping; namespace LINGYUN.Abp.LocalizationManagement; @@ -15,6 +16,13 @@ public class LanguageAppService : LocalizationAppServiceBase, ILanguageAppServic _repository = repository; } + public async virtual Task GetByNameAsync(string name) + { + var language = await InternalGetByNameAsync(name); + + return ObjectMapper.Map(language); + } + [Authorize(LocalizationManagementPermissions.Language.Create)] public async virtual Task CreateAsync(LanguageCreateDto input) { @@ -41,7 +49,7 @@ public class LanguageAppService : LocalizationAppServiceBase, ILanguageAppServic [Authorize(LocalizationManagementPermissions.Language.Delete)] public async virtual Task DeleteAsync(string name) { - var language = await GetByNameAsync(name); + var language = await InternalGetByNameAsync(name); await _repository.DeleteAsync(language); @@ -51,7 +59,7 @@ public class LanguageAppService : LocalizationAppServiceBase, ILanguageAppServic [Authorize(LocalizationManagementPermissions.Language.Update)] public async virtual Task UpdateAsync(string name, LanguageUpdateDto input) { - var language = await GetByNameAsync(name); + var language = await InternalGetByNameAsync(name); language.SetFlagIcon(input.FlagIcon); language.SetDisplayName(input.DisplayName); @@ -63,7 +71,7 @@ public class LanguageAppService : LocalizationAppServiceBase, ILanguageAppServic return ObjectMapper.Map(language); } - private async Task GetByNameAsync(string name) + private async Task InternalGetByNameAsync(string name) { var language = await _repository.FindByCultureNameAsync(name); diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/ResourceAppService.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/ResourceAppService.cs index 50206f337..ee88668a7 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/ResourceAppService.cs +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/ResourceAppService.cs @@ -15,6 +15,13 @@ public class ResourceAppService : LocalizationAppServiceBase, IResourceAppServic _repository = repository; } + public async virtual Task GetByNameAsync(string name) + { + var resource = await InternalGetByNameAsync(name); + + return ObjectMapper.Map(resource); + } + [Authorize(LocalizationManagementPermissions.Resource.Create)] public async virtual Task CreateAsync(ResourceCreateDto input) { @@ -41,7 +48,7 @@ public class ResourceAppService : LocalizationAppServiceBase, IResourceAppServic [Authorize(LocalizationManagementPermissions.Resource.Delete)] public async virtual Task DeleteAsync(string name) { - var resource = await GetByNameAsync(name); + var resource = await InternalGetByNameAsync(name); await _repository.DeleteAsync(resource); @@ -51,7 +58,7 @@ public class ResourceAppService : LocalizationAppServiceBase, IResourceAppServic [Authorize(LocalizationManagementPermissions.Resource.Update)] public async virtual Task UpdateAsync(string name, ResourceUpdateDto input) { - var resource = await GetByNameAsync(name); + var resource = await InternalGetByNameAsync(name); resource.SetDisplayName(input.DisplayName); resource.SetDescription(input.Description); @@ -64,7 +71,7 @@ public class ResourceAppService : LocalizationAppServiceBase, IResourceAppServic return ObjectMapper.Map(resource); } - private async Task GetByNameAsync(string name) + private async Task InternalGetByNameAsync(string name) { var resource = await _repository.FindByNameAsync(name); diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/en.json b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/en.json index 609ef8d51..cb0f3a818 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/en.json +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/en.json @@ -17,6 +17,8 @@ "Filter": "Filter", "SaveAndNext": "Save & Next", "SearchFilter": "Search", - "Text:AddNew": "Add New Text" + "Text:AddNew": "New Text", + "Language:AddNew": "New Language", + "Resource:AddNew": "New Resource" } } \ No newline at end of file diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/zh-Hans.json b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/zh-Hans.json index f1e1eee76..77fbe4207 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/zh-Hans.json +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/zh-Hans.json @@ -17,6 +17,8 @@ "Filter": "过滤字符", "SaveAndNext": "保存并下一步", "SearchFilter": "请输入过滤字符", - "Text:AddNew": "添加新文档" + "Text:AddNew": "添加新文档", + "Language:AddNew": "添加新语言", + "Resource:AddNew": "添加新资源" } } \ No newline at end of file diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/LanguageController.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/LanguageController.cs index 0b563571f..2e4e5d8ea 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/LanguageController.cs +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/LanguageController.cs @@ -19,6 +19,13 @@ public class LanguageController : AbpControllerBase, ILanguageAppService _service = service; } + [HttpGet] + [Route("{name}")] + public virtual Task GetByNameAsync(string name) + { + return _service.GetByNameAsync(name); + } + [HttpPost] [Authorize(LocalizationManagementPermissions.Language.Create)] public virtual Task CreateAsync(LanguageCreateDto input) diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/ResourceController.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/ResourceController.cs index ba838bd49..b5639530e 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/ResourceController.cs +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/ResourceController.cs @@ -20,6 +20,13 @@ public class ResourceController : AbpControllerBase, IResourceAppService _service = service; } + [HttpGet] + [Route("{name}")] + public virtual Task GetByNameAsync(string name) + { + return _service.GetByNameAsync(name); + } + [HttpPost] [Authorize(LocalizationManagementPermissions.Resource.Create)] public virtual Task CreateAsync(ResourceCreateDto input) From c0994e904d42b985dcebd5d18a238a047933c370 Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Sun, 5 Feb 2023 13:17:40 +0800 Subject: [PATCH 3/7] fix(localization): add missing error codes map --- .../LocalizationManagement/Localization/Resources/en.json | 6 +++++- .../Localization/Resources/zh-Hans.json | 6 +++++- .../Abp/LocalizationManagement/LocalizationErrorCodes.cs | 4 ++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/en.json b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/en.json index cb0f3a818..f0669b5b6 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/en.json +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/en.json @@ -19,6 +19,10 @@ "SearchFilter": "Search", "Text:AddNew": "New Text", "Language:AddNew": "New Language", - "Resource:AddNew": "New Resource" + "Resource:AddNew": "New Resource", + "Localization:001100": "Language {CultureName} already exists!", + "Localization:001400": "Language name {CultureName} not found or built-in language operation not allowed!", + "Localization:002100": "Resource {Name} already exists!", + "Localization:002400": "Resource Name {Name} not found or built-in resource operation not allowed!" } } \ No newline at end of file diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/zh-Hans.json b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/zh-Hans.json index 77fbe4207..3b607829d 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/zh-Hans.json +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/zh-Hans.json @@ -19,6 +19,10 @@ "SearchFilter": "请输入过滤字符", "Text:AddNew": "添加新文档", "Language:AddNew": "添加新语言", - "Resource:AddNew": "添加新资源" + "Resource:AddNew": "添加新资源", + "Localization:001100": "语言 {CultureName} 已经存在!", + "Localization:001400": "没有找到名为 {CultureName} 的语言名称或内置语言不允许操作!", + "Localization:002100": "资源 {Name} 已经存在!", + "Localization:002400": "没有找到名为 {Name} 的资源名称或内置资源不允许操作!" } } \ No newline at end of file diff --git a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/LocalizationErrorCodes.cs b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/LocalizationErrorCodes.cs index 381a84213..f786bb87f 100644 --- a/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/LocalizationErrorCodes.cs +++ b/aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/LocalizationErrorCodes.cs @@ -10,7 +10,7 @@ public static class LocalizationErrorCodes { public const string Prefix = Namespace + ":001"; /// - /// 名称已经存在 + /// 语言 {CultureName} 已经存在 /// public const string NameAlreadyExists = Prefix + "100"; /// @@ -26,7 +26,7 @@ public static class LocalizationErrorCodes { public const string Prefix = Namespace + ":002"; /// - /// 名称已经存在 + /// 资源 {Name} 已经存在 /// public const string NameAlreadyExists = Prefix + "100"; /// From 3cfccf6fe9a16c60b4477cb94ad319d562a798db Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Sun, 5 Feb 2023 13:45:22 +0800 Subject: [PATCH 4/7] =?UTF-8?q?fix(form):=20=E9=80=80=E5=9B=9E=E5=89=8D?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E7=89=88=E6=9C=AC,=E8=A7=A3=E5=86=B3onChange?= =?UTF-8?q?=E5=A4=9A=E6=AC=A1=E6=8F=90=E4=BA=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/Form/src/hooks/useFormEvents.ts | 18 +++++------------- .../texts/components/TextModal.vue | 2 +- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/apps/vue/src/components/Form/src/hooks/useFormEvents.ts b/apps/vue/src/components/Form/src/hooks/useFormEvents.ts index 0841f8169..b50cedd5b 100644 --- a/apps/vue/src/components/Form/src/hooks/useFormEvents.ts +++ b/apps/vue/src/components/Form/src/hooks/useFormEvents.ts @@ -77,11 +77,6 @@ export function useFormEvents({ const hasKey = Reflect.has(values, key); value = handleInputNumberValue(schema?.component, value); - const { componentProps } = schema || {}; - let _props = componentProps as any; - if (typeof componentProps === 'function') { - _props = _props({ formModel: unref(formModel) }); - } // 0| '' is allow if (hasKey && fields.includes(key)) { // time type @@ -91,20 +86,17 @@ export function useFormEvents({ for (const ele of value) { arr.push(ele ? dateUtil(ele) : null); } - unref(formModel)[key] = arr; + formModel[key] = arr; } else { const { componentProps } = schema || {}; let _props = componentProps as any; if (typeof componentProps === 'function') { _props = _props({ formModel }); } - unref(formModel)[key] = value ? (_props?.valueFormat ? value : dateUtil(value)) : null; + formModel[key] = value ? (_props?.valueFormat ? value : dateUtil(value)) : null; } } else { - unref(formModel)[key] = value; - } - if (_props?.onChange) { - _props?.onChange(value); + formModel[key] = value; } validKeys.push(key); } else { @@ -112,14 +104,14 @@ export function useFormEvents({ try { const value = nestKey.split('.').reduce((out, item) => out[item], values); if (isDef(value)) { - unref(formModel)[nestKey] = unref(value); + formModel[nestKey] = value; validKeys.push(nestKey); } } catch (e) { // key not exist if (isDef(defaultValueRef.value[nestKey])) { //formModel[nestKey] = defaultValueRef.value[nestKey]; - unref(formModel)[nestKey] = cloneDeep(unref(defaultValueRef.value[nestKey])); + formModel[nestKey] = cloneDeep(defaultValueRef.value[nestKey]); } } }); diff --git a/apps/vue/src/views/localization/texts/components/TextModal.vue b/apps/vue/src/views/localization/texts/components/TextModal.vue index 09c0a2295..b5277ce87 100644 --- a/apps/vue/src/views/localization/texts/components/TextModal.vue +++ b/apps/vue/src/views/localization/texts/components/TextModal.vue @@ -47,7 +47,7 @@ resultField: 'items', labelField: 'uiCultureName', valueField: 'cultureName', - onSelect: (key) => { + onChange: (key) => { // 当文化变更时,检查键值是否有目标值 const model = unref(modelRef); if (model?.key) { From 696ce4fe53f10ec1dac772e6fb01283319e033bc Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Sun, 5 Feb 2023 15:28:51 +0800 Subject: [PATCH 5/7] =?UTF-8?q?feat(cli):=20=E8=A7=86=E5=9B=BE=E9=A1=B5?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BF=9D=E5=AD=98=E6=95=B0=E6=8D=AE.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Cli/UI/Vben/VbenViewScriptGenerator.cs | 38 +++++++++++++++++-- .../Properties/launchSettings.json | 4 +- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/UI/Vben/VbenViewScriptGenerator.cs b/aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/UI/Vben/VbenViewScriptGenerator.cs index 88797708c..a2474a5c3 100644 --- a/aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/UI/Vben/VbenViewScriptGenerator.cs +++ b/aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/UI/Vben/VbenViewScriptGenerator.cs @@ -26,11 +26,30 @@ public class VbenViewScriptGenerator : IVbenViewScriptGenerator, ISingletonDepen .Select(module => module.Value) .FirstOrDefault(); + var updateAction = controllerModel.Actions + .Where(action => action.Value.Name.Contains("UpdateAsync")) + .Select(action => action.Value) + .FirstOrDefault(); + var createAction = controllerModel.Actions + .Where(action => action.Value.Name.Contains("CreateAsync")) + .Select(action => action.Value) + .FirstOrDefault(); + var getAction = controllerModel.Actions + .Where(action => action.Value.Name.Contains("GetAsync")) + .Select(action => action.Value) + .FirstOrDefault(); + var modalContent = await _templateRenderer.RenderAsync( "VbenModalView", new { Key = "id", + HasCreate = createAction != null, + GetAction = getAction?.UniqueName ?? "GetAsyncById", + CreateAction = createAction?.UniqueName ?? "CreateAsyncByInput", + HasUpdate = updateAction != null, + UpdateAction = updateAction?.UniqueName ?? "UpdateAsyncByIdAndInput", + HasSubmit = createAction != null || updateAction != null, Application = controllerModel.ControllerName, ApiPath = $"/@/api/{moduleDefinition.RemoteServiceName.ToKebabCase()}/{controllerModel.ControllerName.ToKebabCase()}", RemoteService = moduleDefinition.RemoteServiceName, @@ -62,6 +81,10 @@ public class VbenViewScriptGenerator : IVbenViewScriptGenerator, ISingletonDepen .Where(action => action.Value.Name.Contains("UpdateAsync")) .Select(action => action.Value) .FirstOrDefault(); + var createAction = controllerModel.Actions + .Where(action => action.Value.Name.Contains("CreateAsync")) + .Select(action => action.Value) + .FirstOrDefault(); var tableContent = await _templateRenderer.RenderAsync( "VbenTableView", @@ -69,10 +92,17 @@ public class VbenViewScriptGenerator : IVbenViewScriptGenerator, ISingletonDepen { Key = "id", PagedRequest = pagedResultAction != null, - UpdatePermission = updateAction != null && updateAction.AllowAnonymous != null && updateAction.AllowAnonymous != true, - UpdatePermissionName = $"{moduleDefinition.RemoteServiceName.ToKebabCase()}.{controllerModel.ControllerName.ToKebabCase()}.Update", - DeletePermission = deleteAction != null && deleteAction.AllowAnonymous != null && deleteAction.AllowAnonymous != true, - DeletePermissionName = $"{moduleDefinition.RemoteServiceName.ToKebabCase()}.{controllerModel.ControllerName.ToKebabCase()}.Delete", + GetListAction = pagedResultAction?.UniqueName ?? "GetListAsyncByInput", + HasCreate = createAction != null, + CreatePermission = true, + CreatePermissionName = $"{moduleDefinition.RemoteServiceName.ToPascalCase()}.{controllerModel.ControllerName.ToPascalCase()}.Create", + HasUpdate = updateAction != null, + UpdatePermission = true, + UpdatePermissionName = $"{moduleDefinition.RemoteServiceName.ToPascalCase()}.{controllerModel.ControllerName.ToPascalCase()}.Update", + HasDelete = deleteAction != null, + DeleteAction = deleteAction?.UniqueName ?? "DeleteAsyncById", + DeletePermission = true, + DeletePermissionName = $"{moduleDefinition.RemoteServiceName.ToPascalCase()}.{controllerModel.ControllerName.ToPascalCase()}.Delete", Application = controllerModel.ControllerName, ModalName = $"{controllerModel.ControllerName.ToPascalCase()}Modal", ApiPath = $"/@/api/{moduleDefinition.RemoteServiceName.ToKebabCase()}/{controllerModel.ControllerName.ToKebabCase()}", diff --git a/aspnet-core/modules/cli/LINGYUN.Abp.Cli/Properties/launchSettings.json b/aspnet-core/modules/cli/LINGYUN.Abp.Cli/Properties/launchSettings.json index c80a9844a..bd56229eb 100644 --- a/aspnet-core/modules/cli/LINGYUN.Abp.Cli/Properties/launchSettings.json +++ b/aspnet-core/modules/cli/LINGYUN.Abp.Cli/Properties/launchSettings.json @@ -2,8 +2,8 @@ "profiles": { "LINGYUN.Abp.Cli": { "commandName": "Project", - "commandLineArgs": "generate-view -t vben-view -m auditing -o D:\\Projects\\Development\\view-script -url http://127.0.0.1:30000/" - //"commandLineArgs": "generate-proxy -t ts -asp uni-app-axios -u http://127.0.0.1:30025 -m Platform -o D:\\Projects\\Development\\type-script" + "commandLineArgs": "generate-view -t vben-view -m task-management -o D:\\Projects\\Development\\view-script -url http://127.0.0.1:30000/" + // "commandLineArgs": "generate-proxy -t ts -asp vben-dynamic -u http://127.0.0.1:30000 -m task-management -o D:\\Projects\\Development\\type-script" } } } \ No newline at end of file From 2706fc3ef2b534608614dd8db5c7737e458714cc Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Sun, 5 Feb 2023 15:31:53 +0800 Subject: [PATCH 6/7] =?UTF-8?q?fix(dynamic-quertable):=20=E5=BD=93?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=96=B9=E6=B3=95=E4=B8=8E=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E9=87=8D=E5=90=8D=E6=97=B6,=20=E8=87=AA?= =?UTF-8?q?=E5=8A=A8api=E7=AB=AF=E7=82=B9=E4=B8=8D=E4=BC=9A=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E5=A4=9A=E4=B8=AA=E7=AB=AF=E7=82=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Abp/Dynamic/Queryable/IDynamicQueryableAppService.cs | 4 ++-- .../Abp/Dynamic/Queryable/DynamicQueryableAppService.cs | 8 ++++---- .../Dynamic/Queryable/DynamicQueryableControllerBase.cs | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts/LINGYUN/Abp/Dynamic/Queryable/IDynamicQueryableAppService.cs b/aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts/LINGYUN/Abp/Dynamic/Queryable/IDynamicQueryableAppService.cs index 5e75f1617..d1a7a7341 100644 --- a/aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts/LINGYUN/Abp/Dynamic/Queryable/IDynamicQueryableAppService.cs +++ b/aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts/LINGYUN/Abp/Dynamic/Queryable/IDynamicQueryableAppService.cs @@ -13,7 +13,7 @@ public interface IDynamicQueryableAppService /// /// 根据动态条件查询数据 /// - /// + /// /// - Task> GetListAsync(GetListByDynamicQueryableInput input); + Task> GetListAsync(GetListByDynamicQueryableInput dynamicInput); } diff --git a/aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application/LINGYUN/Abp/Dynamic/Queryable/DynamicQueryableAppService.cs b/aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application/LINGYUN/Abp/Dynamic/Queryable/DynamicQueryableAppService.cs index 3bd8bb894..fb479f56d 100644 --- a/aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application/LINGYUN/Abp/Dynamic/Queryable/DynamicQueryableAppService.cs +++ b/aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application/LINGYUN/Abp/Dynamic/Queryable/DynamicQueryableAppService.cs @@ -56,16 +56,16 @@ public abstract class DynamicQueryableAppService : Applicat /// /// 根据动态条件查询数据 /// - /// + /// /// - public async virtual Task> GetListAsync(GetListByDynamicQueryableInput input) + public async virtual Task> GetListAsync(GetListByDynamicQueryableInput dynamicInput) { Expression> condition = (e) => true; - condition = condition.DynamicQuery(input.Queryable); + condition = condition.DynamicQuery(dynamicInput.Queryable); var totalCount = await GetCountAsync(condition); - var entities = await GetListAsync(condition, input); + var entities = await GetListAsync(condition, dynamicInput); return new PagedResultDto(totalCount, MapToEntitiesDto(entities)); diff --git a/aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.HttpApi/LINGYUN/Abp/Dynamic/Queryable/DynamicQueryableControllerBase.cs b/aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.HttpApi/LINGYUN/Abp/Dynamic/Queryable/DynamicQueryableControllerBase.cs index 17bfe2755..1fc52d338 100644 --- a/aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.HttpApi/LINGYUN/Abp/Dynamic/Queryable/DynamicQueryableControllerBase.cs +++ b/aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.HttpApi/LINGYUN/Abp/Dynamic/Queryable/DynamicQueryableControllerBase.cs @@ -24,8 +24,8 @@ public abstract class DynamicQueryableControllerBase : AbpController [HttpPost] [Route("search")] - public Task> GetListAsync(GetListByDynamicQueryableInput input) + public Task> GetListAsync(GetListByDynamicQueryableInput dynamicInput) { - return DynamicQueryableAppService.GetListAsync(input); + return DynamicQueryableAppService.GetListAsync(dynamicInput); } } From 3842b83cbd504e36787d5a4e529805526b1d5bfe Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Sun, 5 Feb 2023 15:52:12 +0800 Subject: [PATCH 7/7] =?UTF-8?q?feat(cli):=20=E5=88=97=E8=A1=A8=E8=A7=86?= =?UTF-8?q?=E5=9B=BE=E9=A1=B5=E5=A2=9E=E5=8A=A0=E9=AB=98=E7=BA=A7=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=9D=A1=E4=BB=B6=E6=94=AF=E6=8C=81.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Cli/UI/Vben/VbenViewScriptGenerator.cs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/UI/Vben/VbenViewScriptGenerator.cs b/aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/UI/Vben/VbenViewScriptGenerator.cs index a2474a5c3..10785fb6b 100644 --- a/aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/UI/Vben/VbenViewScriptGenerator.cs +++ b/aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/UI/Vben/VbenViewScriptGenerator.cs @@ -86,22 +86,35 @@ public class VbenViewScriptGenerator : IVbenViewScriptGenerator, ISingletonDepen .Select(action => action.Value) .FirstOrDefault(); + // 高级查询 + var getAvailableFieldsAction = controllerModel.Actions + .Where(action => action.Value.Name.Equals("GetAvailableFieldsAsync")) + .Select(action => action.Value) + .FirstOrDefault(); + var advancedSearchAction = controllerModel.Actions + .Where(action => action.Value.Name.Equals("GetListAsyncByDynamicInput")) + .Select(action => action.Value) + .FirstOrDefault(); + var tableContent = await _templateRenderer.RenderAsync( "VbenTableView", new { Key = "id", PagedRequest = pagedResultAction != null, + HasAdvancedSearch = getAvailableFieldsAction != null && advancedSearchAction != null, + AvailableFieldsAction = getAvailableFieldsAction?.UniqueName ?? "GetAvailableFieldsAsync", + AdvancedSearchAction = advancedSearchAction?.UniqueName ?? "GetListAsyncByDynamicInput", GetListAction = pagedResultAction?.UniqueName ?? "GetListAsyncByInput", HasCreate = createAction != null, - CreatePermission = true, + CreatePermission = createAction != null && createAction.AllowAnonymous != true, CreatePermissionName = $"{moduleDefinition.RemoteServiceName.ToPascalCase()}.{controllerModel.ControllerName.ToPascalCase()}.Create", HasUpdate = updateAction != null, - UpdatePermission = true, + UpdatePermission = updateAction != null && updateAction.AllowAnonymous != true, UpdatePermissionName = $"{moduleDefinition.RemoteServiceName.ToPascalCase()}.{controllerModel.ControllerName.ToPascalCase()}.Update", HasDelete = deleteAction != null, DeleteAction = deleteAction?.UniqueName ?? "DeleteAsyncById", - DeletePermission = true, + DeletePermission = deleteAction != null && deleteAction.AllowAnonymous != true, DeletePermissionName = $"{moduleDefinition.RemoteServiceName.ToPascalCase()}.{controllerModel.ControllerName.ToPascalCase()}.Delete", Application = controllerModel.ControllerName, ModalName = $"{controllerModel.ControllerName.ToPascalCase()}Modal",