Browse Source

CmsKit - Domain logic of menus

pull/9261/head
enisn 5 years ago
parent
commit
bbd4865f4b
  1. 3
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs
  2. 17
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/MenuFeature.cs
  3. 8
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Menus/MenuItemConsts.cs
  4. 10
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/IMenuRepository.cs
  5. 14
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/Menu.cs
  6. 91
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuItem.cs
  7. 19
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuManager.cs
  8. 5
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs
  9. 27
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs
  10. 14
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Menus/EfCoreMenuRepository.cs
  11. 18
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Menus/MongoMenuRepository.cs

3
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/GlobalCmsKitFeatures.cs

@ -23,6 +23,8 @@ namespace Volo.CmsKit.GlobalFeatures
public CmsUserFeature User => GetFeature<CmsUserFeature>(); public CmsUserFeature User => GetFeature<CmsUserFeature>();
public MenuFeature Menu => GetFeature<MenuFeature>();
public GlobalCmsKitFeatures([NotNull] GlobalFeatureManager featureManager) public GlobalCmsKitFeatures([NotNull] GlobalFeatureManager featureManager)
: base(featureManager) : base(featureManager)
{ {
@ -34,6 +36,7 @@ namespace Volo.CmsKit.GlobalFeatures
AddFeature(new PagesFeature(this)); AddFeature(new PagesFeature(this));
AddFeature(new BlogsFeature(this)); AddFeature(new BlogsFeature(this));
AddFeature(new CmsUserFeature(this)); AddFeature(new CmsUserFeature(this));
AddFeature(new MenuFeature(this));
} }
} }
} }

17
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures/MenuFeature.cs

@ -0,0 +1,17 @@
using JetBrains.Annotations;
using Volo.Abp.GlobalFeatures;
namespace Volo.CmsKit.GlobalFeatures
{
[GlobalFeatureName(Name)]
public class MenuFeature : GlobalFeature
{
public const string Name = "CmsKit.Menus";
internal MenuFeature(
[NotNull] GlobalCmsKitFeatures cmsKit) : base(cmsKit)
{
}
}
}

8
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Menus/MenuItemConsts.cs

@ -0,0 +1,8 @@
namespace Volo.CmsKit.Menus
{
public static class MenuItemConsts
{
public const int MaxDisplayNameLength = 64;
public const int MaxUrlLength = 1024;
}
}

10
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/IMenuRepository.cs

@ -0,0 +1,10 @@
using System;
using Volo.Abp.Domain.Repositories;
namespace Volo.CmsKit.Menus
{
public interface IMenuRepository : IBasicRepository<Menu, Guid>
{
}
}

14
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/Menu.cs

@ -0,0 +1,14 @@
using JetBrains.Annotations;
using System;
using System.Collections;
using System.Collections.Generic;
using Volo.Abp;
using Volo.Abp.Domain.Entities.Auditing;
namespace Volo.CmsKit.Menus
{
public class Menu : FullAuditedAggregateRoot<Guid>
{
public ICollection<MenuItem> Items { get; set; }
}
}

91
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuItem.cs

@ -0,0 +1,91 @@
using JetBrains.Annotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Domain.Entities.Auditing;
namespace Volo.CmsKit.Menus
{
public class MenuItem : AuditedEntity<Guid>
{
/// <summary>
/// Parent <see cref="Menu"/> Id.
/// </summary>
public Guid MenuId { get; set; }
/// <summary>
/// Presents another <see cref="MenuItem"/> Id.
/// If it's <see langword="null"/>, then it's a root menu item.
/// </summary>
public Guid? ParentMenuId { get; set; }
[NotNull]
public string DisplayName { get; protected set; }
public bool IsActive { get; set; }
[NotNull]
public string Url { get; protected set; }
public string Icon { get; set; }
public int Order { get; set; }
public string Target { get; set; }
public string ElementId { get; set; }
public string CssClass { get; set; }
public string RequiredPermissionName { get; set; }
public Guid? PageId { get; protected set; }
public MenuItem(Guid id,
Guid menuId,
[NotNull] string displayName,
[NotNull] string url,
bool isActive = true,
[CanBeNull] Guid? parentMenuId = null,
[CanBeNull] string icon = null,
int order = 1000,
[CanBeNull] string target = null,
[CanBeNull] string elementId = null,
[CanBeNull] string cssClass = null,
[CanBeNull] string requiredPermissionName = null)
:base(id)
{
MenuId = menuId;
SetDisplayName(displayName);
IsActive = isActive;
ParentMenuId = parentMenuId;
SetUrl(url);
Icon = icon;
Order = order;
Target = target;
ElementId = elementId;
CssClass = cssClass;
RequiredPermissionName = requiredPermissionName;
}
public void SetDisplayName([NotNull] string displayName)
{
DisplayName = Check.NotNullOrEmpty(displayName, nameof(displayName), MenuItemConsts.MaxDisplayNameLength);
}
public void SetUrl([NotNull]string url)
{
Url = Check.NotNullOrEmpty(url, nameof(url), MenuItemConsts.MaxUrlLength);
}
internal void SetPageId(Guid pageId)
{
PageId = pageId;
}
}
}

19
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Menus/MenuManager.cs

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Domain.Services;
using Volo.CmsKit.Pages;
namespace Volo.CmsKit.Menus
{
public class MenuManager : DomainService
{
public virtual void SetPageUrl(MenuItem menuItem, Page page)
{
menuItem.SetPageId(page.Id);
menuItem.SetUrl(page.Slug.EnsureStartsWith('/'));
}
}
}

5
modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContext.cs

@ -4,6 +4,7 @@ using Volo.Abp.EntityFrameworkCore;
using Volo.CmsKit.Blogs; using Volo.CmsKit.Blogs;
using Volo.CmsKit.Comments; using Volo.CmsKit.Comments;
using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.MediaDescriptors;
using Volo.CmsKit.Menus;
using Volo.CmsKit.Pages; using Volo.CmsKit.Pages;
using Volo.CmsKit.Ratings; using Volo.CmsKit.Ratings;
using Volo.CmsKit.Reactions; using Volo.CmsKit.Reactions;
@ -26,7 +27,9 @@ namespace Volo.CmsKit.EntityFrameworkCore
public DbSet<BlogPost> BlogPosts { get; set; } public DbSet<BlogPost> BlogPosts { get; set; }
public DbSet<BlogFeature> BlogFeatures { get; set; } public DbSet<BlogFeature> BlogFeatures { get; set; }
public DbSet<MediaDescriptor> MediaDescriptors { get; set; } public DbSet<MediaDescriptor> MediaDescriptors { get; set; }
public DbSet<Menu> Menus { get; set; }
public DbSet<MenuItem> MenuItems { get; set; }
public CmsKitDbContext(DbContextOptions<CmsKitDbContext> options) public CmsKitDbContext(DbContextOptions<CmsKitDbContext> options)
: base(options) : base(options)
{ {

27
modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs

@ -8,6 +8,7 @@ using Volo.CmsKit.Blogs;
using Volo.CmsKit.Comments; using Volo.CmsKit.Comments;
using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.MediaDescriptors;
using Volo.CmsKit.Menus;
using Volo.CmsKit.Pages; using Volo.CmsKit.Pages;
using Volo.CmsKit.Ratings; using Volo.CmsKit.Ratings;
using Volo.CmsKit.Reactions; using Volo.CmsKit.Reactions;
@ -232,6 +233,32 @@ namespace Volo.CmsKit.EntityFrameworkCore
{ {
builder.Ignore<MediaDescriptor>(); builder.Ignore<MediaDescriptor>();
} }
if (GlobalFeatureManager.Instance.IsEnabled<MenuFeature>())
{
builder.Entity<Menu>(b =>
{
b.ToTable(options.TablePrefix + "Menus", options.Schema);
b.ConfigureByConvention();
});
builder.Entity<MenuItem>(b =>
{
b.ToTable(options.TablePrefix + "MenuItems", options.Schema);
b.ConfigureByConvention();
b.Property(x => x.DisplayName).IsRequired().HasMaxLength(MenuItemConsts.MaxDisplayNameLength);
b.Property(x => x.Url).IsRequired().HasMaxLength(MenuItemConsts.MaxUrlLength);
});
}
else
{
builder.Ignore<Menu>();
builder.Ignore<MenuItem>();
}
} }
} }
} }

14
modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Menus/EfCoreMenuRepository.cs

@ -0,0 +1,14 @@
using System;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
using Volo.CmsKit.EntityFrameworkCore;
namespace Volo.CmsKit.Menus
{
public class EfCoreMenuRepository : EfCoreRepository<ICmsKitDbContext, Menu, Guid>, IMenuRepository
{
public EfCoreMenuRepository(IDbContextProvider<ICmsKitDbContext> dbContextProvider) : base(dbContextProvider)
{
}
}
}

18
modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Menus/MongoMenuRepository.cs

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.MongoDB;
using Volo.Abp.MongoDB;
using Volo.CmsKit.Menus;
namespace Volo.CmsKit.MongoDB.Menus
{
public class MongoMenuRepository : MongoDbRepository<ICmsKitMongoDbContext, Menu, Guid>, IMenuRepository
{
public MongoMenuRepository(IMongoDbContextProvider<ICmsKitMongoDbContext> dbContextProvider) : base(dbContextProvider)
{
}
}
}
Loading…
Cancel
Save