mirror of https://github.com/abpframework/abp.git
committed by
GitHub
85 changed files with 1210 additions and 156 deletions
|
After Width: | Height: | Size: 107 KiB |
|
After Width: | Height: | Size: 112 KiB |
@ -0,0 +1,28 @@ |
|||||
|
using System; |
||||
|
using System.Threading; |
||||
|
using System.Threading.Tasks; |
||||
|
using Shouldly; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Volo.Abp.Threading; |
||||
|
|
||||
|
public class SemaphoreSlimExtensions_Tests |
||||
|
{ |
||||
|
[Fact] |
||||
|
public async Task LockAsync_Test() |
||||
|
{ |
||||
|
var semaphore = new SemaphoreSlim(0, 1); |
||||
|
|
||||
|
await Assert.ThrowsAsync<TimeoutException>(async () => |
||||
|
{ |
||||
|
await semaphore.LockAsync(10); |
||||
|
}); |
||||
|
|
||||
|
semaphore = new SemaphoreSlim(1, 1); |
||||
|
using (await semaphore.LockAsync()) |
||||
|
{ |
||||
|
semaphore.CurrentCount.ShouldBe(0); |
||||
|
} |
||||
|
semaphore.CurrentCount.ShouldBe(1); |
||||
|
} |
||||
|
} |
||||
@ -1,11 +1,84 @@ |
|||||
using Volo.Abp.Modularity; |
using Volo.Abp.Modularity; |
||||
|
using Volo.Abp.ObjectExtending; |
||||
|
using Volo.Abp.ObjectExtending.Modularity; |
||||
|
using Volo.Abp.Threading; |
||||
|
using Volo.CmsKit.Admin.Blogs; |
||||
|
using Volo.CmsKit.Admin.Comments; |
||||
|
using Volo.CmsKit.Admin.GlobalResources; |
||||
|
using Volo.CmsKit.Admin.MediaDescriptors; |
||||
|
using Volo.CmsKit.Admin.Menus; |
||||
|
using Volo.CmsKit.Admin.Pages; |
||||
|
using Volo.CmsKit.Admin.Tags; |
||||
|
|
||||
namespace Volo.CmsKit.Admin; |
namespace Volo.CmsKit.Admin; |
||||
|
|
||||
[DependsOn( |
[DependsOn( |
||||
typeof(CmsKitCommonApplicationContractsModule) |
typeof(CmsKitCommonApplicationContractsModule) |
||||
)] |
)] |
||||
public class CmsKitAdminApplicationContractsModule : AbpModule |
public class CmsKitAdminApplicationContractsModule : AbpModule |
||||
{ |
{ |
||||
|
private readonly static OneTimeRunner OneTimeRunner = new OneTimeRunner(); |
||||
|
|
||||
} |
public override void PostConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
OneTimeRunner.Run(() => |
||||
|
{ |
||||
|
ModuleExtensionConfigurationHelper.ApplyEntityConfigurationToApi( |
||||
|
CmsKitModuleExtensionConsts.ModuleName, |
||||
|
CmsKitModuleExtensionConsts.EntityNames.Blog, |
||||
|
getApiTypes: new[] { typeof(BlogDto) }, |
||||
|
createApiTypes: new[] { typeof(CreateBlogDto) }, |
||||
|
updateApiTypes: new[] { typeof(UpdateBlogDto) } |
||||
|
); |
||||
|
|
||||
|
ModuleExtensionConfigurationHelper.ApplyEntityConfigurationToApi( |
||||
|
CmsKitModuleExtensionConsts.ModuleName, |
||||
|
CmsKitModuleExtensionConsts.EntityNames.BlogPost, |
||||
|
getApiTypes: new[] { typeof(BlogPostDto), typeof(BlogPostListDto) }, |
||||
|
createApiTypes: new[] { typeof(CreateBlogPostDto) }, |
||||
|
updateApiTypes: new[] { typeof(UpdateBlogPostDto) } |
||||
|
); |
||||
|
|
||||
|
ModuleExtensionConfigurationHelper.ApplyEntityConfigurationToApi( |
||||
|
CmsKitModuleExtensionConsts.ModuleName, |
||||
|
CmsKitModuleExtensionConsts.EntityNames.Comment, |
||||
|
getApiTypes: new[] { typeof(CommentDto), typeof(CommentWithAuthorDto) } |
||||
|
); |
||||
|
|
||||
|
ModuleExtensionConfigurationHelper.ApplyEntityConfigurationToApi( |
||||
|
CmsKitModuleExtensionConsts.ModuleName, |
||||
|
CmsKitModuleExtensionConsts.EntityNames.GlobalResource, |
||||
|
getApiTypes: new[] { typeof(GlobalResourcesDto) }, |
||||
|
updateApiTypes: new[] { typeof(GlobalResourcesUpdateDto) } |
||||
|
); |
||||
|
|
||||
|
ModuleExtensionConfigurationHelper.ApplyEntityConfigurationToApi( |
||||
|
CmsKitModuleExtensionConsts.ModuleName, |
||||
|
CmsKitModuleExtensionConsts.EntityNames.MediaDescriptor, |
||||
|
getApiTypes: new[] { typeof(MediaDescriptorDto) } |
||||
|
); |
||||
|
|
||||
|
ModuleExtensionConfigurationHelper.ApplyEntityConfigurationToApi( |
||||
|
CmsKitModuleExtensionConsts.ModuleName, |
||||
|
CmsKitModuleExtensionConsts.EntityNames.MenuItem, |
||||
|
createApiTypes: new[] { typeof(MenuCreateInput) , typeof(MenuItemCreateInput)}, |
||||
|
updateApiTypes: new[] { typeof(MenuUpdateInput) , typeof(MenuItemUpdateInput)} |
||||
|
); |
||||
|
|
||||
|
ModuleExtensionConfigurationHelper.ApplyEntityConfigurationToApi( |
||||
|
CmsKitModuleExtensionConsts.ModuleName, |
||||
|
CmsKitModuleExtensionConsts.EntityNames.Page, |
||||
|
getApiTypes: new[] { typeof(PageDto) }, |
||||
|
createApiTypes: new[] { typeof(CreatePageInputDto) }, |
||||
|
updateApiTypes: new[] { typeof(UpdatePageInputDto) } |
||||
|
); |
||||
|
|
||||
|
ModuleExtensionConfigurationHelper.ApplyEntityConfigurationToApi( |
||||
|
CmsKitModuleExtensionConsts.ModuleName, |
||||
|
CmsKitModuleExtensionConsts.EntityNames.Tag, |
||||
|
createApiTypes: new[] { typeof(TagCreateDto) }, |
||||
|
updateApiTypes: new[] { typeof(TagUpdateDto) } |
||||
|
); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,56 @@ |
|||||
|
using AutoMapper; |
||||
|
using Volo.CmsKit.Admin.Blogs; |
||||
|
using Volo.CmsKit.Admin.Menus; |
||||
|
using Volo.CmsKit.Admin.Pages; |
||||
|
using Volo.CmsKit.Admin.Tags; |
||||
|
using Volo.CmsKit.Menus; |
||||
|
using Volo.CmsKit.Tags; |
||||
|
|
||||
|
namespace Volo.CmsKit.Admin.Web; |
||||
|
|
||||
|
public class CmsKitAdminWebAutoMapperProfile : Profile |
||||
|
{ |
||||
|
public CmsKitAdminWebAutoMapperProfile() |
||||
|
{ |
||||
|
CreateBlogPostMappings(); |
||||
|
CreateBlogMappings(); |
||||
|
CreateMenuMappings(); |
||||
|
CreatePageMappings(); |
||||
|
CreateTagMappings(); |
||||
|
} |
||||
|
|
||||
|
protected virtual void CreateBlogPostMappings() |
||||
|
{ |
||||
|
CreateMap<Volo.CmsKit.Admin.Web.Pages.CmsKit.BlogPosts.CreateModel.CreateBlogPostViewModel, CreateBlogPostDto>().MapExtraProperties(); |
||||
|
CreateMap<Volo.CmsKit.Admin.Web.Pages.CmsKit.BlogPosts.UpdateModel.UpdateBlogPostViewModel, UpdateBlogPostDto>().MapExtraProperties(); |
||||
|
CreateMap<BlogPostDto, Volo.CmsKit.Admin.Web.Pages.CmsKit.BlogPosts.UpdateModel.UpdateBlogPostViewModel>().MapExtraProperties(); |
||||
|
} |
||||
|
|
||||
|
protected virtual void CreateBlogMappings() |
||||
|
{ |
||||
|
CreateMap<Volo.CmsKit.Admin.Web.Pages.CmsKit.Blogs.CreateModalModel.CreateBlogViewModel, CreateBlogDto>().MapExtraProperties(); |
||||
|
CreateMap<Volo.CmsKit.Admin.Web.Pages.CmsKit.Blogs.UpdateModalModel.UpdateBlogViewModel, UpdateBlogDto>().MapExtraProperties(); |
||||
|
CreateMap<BlogDto, Volo.CmsKit.Admin.Web.Pages.CmsKit.Blogs.UpdateModalModel.UpdateBlogViewModel>().MapExtraProperties(); |
||||
|
} |
||||
|
|
||||
|
protected virtual void CreateMenuMappings() |
||||
|
{ |
||||
|
CreateMap<Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems.CreateModalModel.MenuItemCreateViewModel, MenuItemCreateInput>().MapExtraProperties(); |
||||
|
CreateMap<Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems.UpdateModalModel.MenuItemUpdateViewModel, MenuItemUpdateInput>().MapExtraProperties(); |
||||
|
CreateMap<MenuItemDto, Volo.CmsKit.Admin.Web.Pages.CmsKit.Menus.MenuItems.UpdateModalModel.MenuItemUpdateViewModel>().MapExtraProperties(); |
||||
|
} |
||||
|
|
||||
|
protected virtual void CreatePageMappings() |
||||
|
{ |
||||
|
CreateMap<Volo.CmsKit.Admin.Web.Pages.CmsKit.Pages.CreateModel.CreatePageViewModel, CreatePageInputDto>().MapExtraProperties(); |
||||
|
CreateMap<Volo.CmsKit.Admin.Web.Pages.CmsKit.Pages.UpdateModel.UpdatePageViewModel, UpdatePageInputDto>().MapExtraProperties(); |
||||
|
CreateMap<PageDto, Volo.CmsKit.Admin.Web.Pages.CmsKit.Pages.UpdateModel.UpdatePageViewModel>().MapExtraProperties(); |
||||
|
} |
||||
|
|
||||
|
protected virtual void CreateTagMappings() |
||||
|
{ |
||||
|
CreateMap<Volo.CmsKit.Admin.Web.Pages.CmsKit.Tags.CreateModalModel.TagCreateViewModel, TagCreateDto>().MapExtraProperties(); |
||||
|
CreateMap<Volo.CmsKit.Admin.Web.Pages.CmsKit.Tags.EditModalModel.TagEditViewModel, TagUpdateDto>().MapExtraProperties(); |
||||
|
CreateMap<TagDto, Volo.CmsKit.Admin.Web.Pages.CmsKit.Tags.EditModalModel.TagEditViewModel>().MapExtraProperties(); |
||||
|
} |
||||
|
} |
||||
@ -1,24 +1,62 @@ |
|||||
@page |
@page |
||||
@using Microsoft.AspNetCore.Mvc.Localization |
@using Microsoft.AspNetCore.Mvc.Localization |
||||
@using Volo.CmsKit.Admin.Web.Pages |
@using Microsoft.AspNetCore.Mvc.TagHelpers |
||||
|
@using Microsoft.Extensions.Localization |
||||
|
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form |
||||
@using Volo.CmsKit.Admin.Web.Pages.CmsKit.Tags |
@using Volo.CmsKit.Admin.Web.Pages.CmsKit.Tags |
||||
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal |
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal |
||||
|
@using Volo.Abp.Data |
||||
|
@using Volo.Abp.Localization |
||||
|
@using Volo.Abp.ObjectExtending |
||||
@using Volo.CmsKit.Localization |
@using Volo.CmsKit.Localization |
||||
|
|
||||
@inject IHtmlLocalizer<CmsKitResource> L |
@inject IHtmlLocalizer<CmsKitResource> L |
||||
|
@inject IStringLocalizerFactory StringLocalizerFactory |
||||
@model EditModalModel |
@model EditModalModel |
||||
|
|
||||
@{ |
@{ |
||||
Layout = null; |
Layout = null; |
||||
} |
} |
||||
|
|
||||
<abp-dynamic-form abp-model="ViewModel" asp-page="/CmsKit/Tags/EditModal"> |
<form asp-page="/CmsKit/Tags/EditModal"> |
||||
<abp-modal> |
<abp-modal> |
||||
<abp-modal-header title="@L["Edit"].Value"></abp-modal-header> |
<abp-modal-header title="@L["Edit"].Value"></abp-modal-header> |
||||
<abp-modal-body> |
<abp-modal-body> |
||||
<abp-input asp-for="Id" /> |
<abp-input asp-for="Id"/> |
||||
<abp-form-content /> |
|
||||
|
<abp-input asp-for="ViewModel.Name" /> |
||||
|
|
||||
|
@foreach (var propertyInfo in ObjectExtensionManager.Instance.GetProperties<EditModalModel.TagEditViewModel>()) |
||||
|
{ |
||||
|
if (!propertyInfo.Name.EndsWith("_Text")) |
||||
|
{ |
||||
|
if (propertyInfo.Type.IsEnum || !propertyInfo.Lookup.Url.IsNullOrEmpty()) |
||||
|
{ |
||||
|
if (propertyInfo.Type.IsEnum) |
||||
|
{ |
||||
|
Model.ViewModel.ExtraProperties.ToEnum(propertyInfo.Name, propertyInfo.Type); |
||||
|
} |
||||
|
<abp-select asp-for="ViewModel.ExtraProperties[propertyInfo.Name]" |
||||
|
label="@propertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)" |
||||
|
autocomplete-api-url="@propertyInfo.Lookup.Url" |
||||
|
autocomplete-selected-item-name="@Model.ViewModel.GetProperty(propertyInfo.Name+"_Text")" |
||||
|
autocomplete-selected-item-value="@Model.ViewModel.GetProperty(propertyInfo.Name)" |
||||
|
autocomplete-filter-param-name="@propertyInfo.Lookup.FilterParamName" |
||||
|
autocomplete-items-property-name="@propertyInfo.Lookup.ResultListPropertyName" |
||||
|
autocomplete-display-property-name="@propertyInfo.Lookup.DisplayPropertyName" |
||||
|
autocomplete-value-property-name="@propertyInfo.Lookup.ValuePropertyName"></abp-select> |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
<abp-input type="@propertyInfo.GetInputType()" |
||||
|
asp-for="ViewModel.ExtraProperties[propertyInfo.Name]" |
||||
|
label="@propertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)" |
||||
|
asp-format="@propertyInfo.GetInputFormatOrNull()" |
||||
|
value="@propertyInfo.GetInputValueOrNull(Model.ViewModel.GetProperty(propertyInfo.Name))" /> |
||||
|
} |
||||
|
} |
||||
|
} |
||||
</abp-modal-body> |
</abp-modal-body> |
||||
<abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"></abp-modal-footer> |
<abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"></abp-modal-footer> |
||||
</abp-modal> |
</abp-modal> |
||||
</abp-dynamic-form> |
</form> |
||||
@ -0,0 +1,97 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp.ObjectExtending.Modularity; |
||||
|
|
||||
|
namespace Volo.Abp.ObjectExtending; |
||||
|
|
||||
|
public class CmsKitModuleExtensionConfiguration : ModuleExtensionConfiguration |
||||
|
{ |
||||
|
public CmsKitModuleExtensionConfiguration ConfigureBlog( |
||||
|
Action<EntityExtensionConfiguration> configureAction) |
||||
|
{ |
||||
|
return this.ConfigureEntity( |
||||
|
CmsKitModuleExtensionConsts.EntityNames.Blog, |
||||
|
configureAction |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
public CmsKitModuleExtensionConfiguration ConfigureBlogPost( |
||||
|
Action<EntityExtensionConfiguration> configureAction) |
||||
|
{ |
||||
|
return this.ConfigureEntity( |
||||
|
CmsKitModuleExtensionConsts.EntityNames.BlogPost, |
||||
|
configureAction |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
public CmsKitModuleExtensionConfiguration ConfigureBlogFeature( |
||||
|
Action<EntityExtensionConfiguration> configureAction) |
||||
|
{ |
||||
|
return this.ConfigureEntity( |
||||
|
CmsKitModuleExtensionConsts.EntityNames.BlogFeature, |
||||
|
configureAction |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
public CmsKitModuleExtensionConfiguration ConfigureMediaDescriptor( |
||||
|
Action<EntityExtensionConfiguration> configureAction) |
||||
|
{ |
||||
|
return this.ConfigureEntity( |
||||
|
CmsKitModuleExtensionConsts.EntityNames.MediaDescriptor, |
||||
|
configureAction |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
public CmsKitModuleExtensionConfiguration ConfigurePage( |
||||
|
Action<EntityExtensionConfiguration> configureAction) |
||||
|
{ |
||||
|
return this.ConfigureEntity( |
||||
|
CmsKitModuleExtensionConsts.EntityNames.Page, |
||||
|
configureAction |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
public CmsKitModuleExtensionConfiguration ConfigureTag( |
||||
|
Action<EntityExtensionConfiguration> configureAction) |
||||
|
{ |
||||
|
return this.ConfigureEntity( |
||||
|
CmsKitModuleExtensionConsts.EntityNames.Tag, |
||||
|
configureAction |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
public CmsKitModuleExtensionConfiguration ConfigureComment( |
||||
|
Action<EntityExtensionConfiguration> configureAction) |
||||
|
{ |
||||
|
return this.ConfigureEntity( |
||||
|
CmsKitModuleExtensionConsts.EntityNames.Comment, |
||||
|
configureAction |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
public CmsKitModuleExtensionConfiguration ConfigureMenuItem( |
||||
|
Action<EntityExtensionConfiguration> configureAction) |
||||
|
{ |
||||
|
return this.ConfigureEntity( |
||||
|
CmsKitModuleExtensionConsts.EntityNames.MenuItem, |
||||
|
configureAction |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
public CmsKitModuleExtensionConfiguration ConfigureCmsUser( |
||||
|
Action<EntityExtensionConfiguration> configureAction) |
||||
|
{ |
||||
|
return this.ConfigureEntity( |
||||
|
CmsKitModuleExtensionConsts.EntityNames.CmsUser, |
||||
|
configureAction |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
public CmsKitModuleExtensionConfiguration ConfigureGlobalResource( |
||||
|
Action<EntityExtensionConfiguration> configureAction) |
||||
|
{ |
||||
|
return this.ConfigureEntity( |
||||
|
CmsKitModuleExtensionConsts.EntityNames.GlobalResource, |
||||
|
configureAction |
||||
|
); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp.ObjectExtending.Modularity; |
||||
|
|
||||
|
namespace Volo.Abp.ObjectExtending; |
||||
|
|
||||
|
public static class CmsKitModuleExtensionConfigurationDictionaryExtensions |
||||
|
{ |
||||
|
public static ModuleExtensionConfigurationDictionary ConfigureCmsKit( |
||||
|
this ModuleExtensionConfigurationDictionary modules, |
||||
|
Action<CmsKitModuleExtensionConfiguration> configureAction) |
||||
|
{ |
||||
|
return modules.ConfigureModule( |
||||
|
CmsKitModuleExtensionConsts.ModuleName, |
||||
|
configureAction |
||||
|
); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,29 @@ |
|||||
|
namespace Volo.Abp.ObjectExtending; |
||||
|
|
||||
|
public static class CmsKitModuleExtensionConsts |
||||
|
{ |
||||
|
public const string ModuleName = "CmsKit"; |
||||
|
|
||||
|
public static class EntityNames |
||||
|
{ |
||||
|
public const string Blog = "Blog"; |
||||
|
|
||||
|
public const string BlogPost = "BlogPost"; |
||||
|
|
||||
|
public const string BlogFeature = "BlogFeature"; |
||||
|
|
||||
|
public const string MediaDescriptor = "MediaDescriptor"; |
||||
|
|
||||
|
public const string Page = "Page"; |
||||
|
|
||||
|
public const string Tag = "Tag"; |
||||
|
|
||||
|
public const string Comment = "Comment"; |
||||
|
|
||||
|
public const string MenuItem = "MenuItem"; |
||||
|
|
||||
|
public const string CmsUser = "CmsUser"; |
||||
|
|
||||
|
public const string GlobalResource = "GlobalResource"; |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue