diff --git a/Sanhe.Abp.Framework.sln b/Sanhe.Abp.Framework.sln
index ad240d5..0938217 100644
--- a/Sanhe.Abp.Framework.sln
+++ b/Sanhe.Abp.Framework.sln
@@ -91,6 +91,22 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "elasticsearch", "elasticsea
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sanhe.Abp.Elasticsearch", "modules\elasticsearch\Sanhe.Abp.Elasticsearch\Sanhe.Abp.Elasticsearch.csproj", "{3E1DA541-4D48-47A1-93FA-3D75BCB078F3}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "menu-management", "menu-management", "{1D9012F7-AAA3-49E0-9852-4A97FFB26E8C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sanhe.Abp.MenuManagement.Domain", "modules\menu-management\Sanhe.Abp.MenuManagement.Domain\Sanhe.Abp.MenuManagement.Domain.csproj", "{FC204CCD-E64A-4388-86DF-5366E181C811}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sanhe.Abp.MenuManagement.Domain.Identity", "modules\menu-management\Sanhe.Abp.MenuManagement.Domain.Identity\Sanhe.Abp.MenuManagement.Domain.Identity.csproj", "{CE313A6B-8C92-4939-9853-54FFAF553E7D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sanhe.Abp.MenuManagement.Domain.Shared", "modules\menu-management\Sanhe.Abp.MenuManagement.Domain.Shared\Sanhe.Abp.MenuManagement.Domain.Shared.csproj", "{89719844-E5AE-4FF9-B930-77ADF4B6404F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sanhe.Abp.MenuManagement.Application.Contracts", "modules\menu-management\Sanhe.Abp.MenuManagement.Application.Contracts\Sanhe.Abp.MenuManagement.Application.Contracts.csproj", "{F9F99C94-2558-4B29-9192-61072A240CA1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sanhe.Abp.MenuManagement.Application", "modules\menu-management\Sanhe.Abp.MenuManagement.Application\Sanhe.Abp.MenuManagement.Application.csproj", "{B234FA38-6CC5-44D1-8D4F-926E8575C989}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sanhe.Abp.MenuManagement.EntityFrameworkCore", "modules\menu-management\Sanhe.Abp.MenuManagement.EntityFrameworkCore\Sanhe.Abp.MenuManagement.EntityFrameworkCore.csproj", "{F60BA528-E8FE-465D-BAED-EAC48DE57847}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sanhe.Abp.MenuManagement.HttpApi", "modules\menu-management\Sanhe.Abp.MenuManagement.HttpApi\Sanhe.Abp.MenuManagement.HttpApi.csproj", "{4A545053-9CD6-4578-92AF-1637AAC79F80}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -221,6 +237,34 @@ Global
{3E1DA541-4D48-47A1-93FA-3D75BCB078F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3E1DA541-4D48-47A1-93FA-3D75BCB078F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3E1DA541-4D48-47A1-93FA-3D75BCB078F3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FC204CCD-E64A-4388-86DF-5366E181C811}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FC204CCD-E64A-4388-86DF-5366E181C811}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FC204CCD-E64A-4388-86DF-5366E181C811}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FC204CCD-E64A-4388-86DF-5366E181C811}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CE313A6B-8C92-4939-9853-54FFAF553E7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CE313A6B-8C92-4939-9853-54FFAF553E7D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CE313A6B-8C92-4939-9853-54FFAF553E7D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CE313A6B-8C92-4939-9853-54FFAF553E7D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {89719844-E5AE-4FF9-B930-77ADF4B6404F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {89719844-E5AE-4FF9-B930-77ADF4B6404F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {89719844-E5AE-4FF9-B930-77ADF4B6404F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {89719844-E5AE-4FF9-B930-77ADF4B6404F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F9F99C94-2558-4B29-9192-61072A240CA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F9F99C94-2558-4B29-9192-61072A240CA1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F9F99C94-2558-4B29-9192-61072A240CA1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F9F99C94-2558-4B29-9192-61072A240CA1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B234FA38-6CC5-44D1-8D4F-926E8575C989}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B234FA38-6CC5-44D1-8D4F-926E8575C989}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B234FA38-6CC5-44D1-8D4F-926E8575C989}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B234FA38-6CC5-44D1-8D4F-926E8575C989}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F60BA528-E8FE-465D-BAED-EAC48DE57847}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F60BA528-E8FE-465D-BAED-EAC48DE57847}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F60BA528-E8FE-465D-BAED-EAC48DE57847}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F60BA528-E8FE-465D-BAED-EAC48DE57847}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4A545053-9CD6-4578-92AF-1637AAC79F80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4A545053-9CD6-4578-92AF-1637AAC79F80}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4A545053-9CD6-4578-92AF-1637AAC79F80}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4A545053-9CD6-4578-92AF-1637AAC79F80}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -264,6 +308,14 @@ Global
{464E3A2C-BBEB-4CD9-BAB8-A51D6283940A} = {2A768109-31B7-4C52-928C-3023DAB9F254}
{449F764E-D3D5-4DFD-8707-2A378CF44C64} = {F5F5D604-531B-4B57-A88E-C9C5CEEC55D7}
{3E1DA541-4D48-47A1-93FA-3D75BCB078F3} = {449F764E-D3D5-4DFD-8707-2A378CF44C64}
+ {1D9012F7-AAA3-49E0-9852-4A97FFB26E8C} = {F5F5D604-531B-4B57-A88E-C9C5CEEC55D7}
+ {FC204CCD-E64A-4388-86DF-5366E181C811} = {1D9012F7-AAA3-49E0-9852-4A97FFB26E8C}
+ {CE313A6B-8C92-4939-9853-54FFAF553E7D} = {1D9012F7-AAA3-49E0-9852-4A97FFB26E8C}
+ {89719844-E5AE-4FF9-B930-77ADF4B6404F} = {1D9012F7-AAA3-49E0-9852-4A97FFB26E8C}
+ {F9F99C94-2558-4B29-9192-61072A240CA1} = {1D9012F7-AAA3-49E0-9852-4A97FFB26E8C}
+ {B234FA38-6CC5-44D1-8D4F-926E8575C989} = {1D9012F7-AAA3-49E0-9852-4A97FFB26E8C}
+ {F60BA528-E8FE-465D-BAED-EAC48DE57847} = {1D9012F7-AAA3-49E0-9852-4A97FFB26E8C}
+ {4A545053-9CD6-4578-92AF-1637AAC79F80} = {1D9012F7-AAA3-49E0-9852-4A97FFB26E8C}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {AB69BFDE-9DDB-4D16-8CB8-72472C0319CD}
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/FodyWeavers.xml b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/FodyWeavers.xml
new file mode 100644
index 0000000..1715698
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe.Abp.MenuManagement.Application.Contracts.csproj b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe.Abp.MenuManagement.Application.Contracts.csproj
new file mode 100644
index 0000000..c705c92
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe.Abp.MenuManagement.Application.Contracts.csproj
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+ netstandard2.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/AuthPolicyDto.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/AuthPolicyDto.cs
new file mode 100644
index 0000000..77c1b53
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/AuthPolicyDto.cs
@@ -0,0 +1,23 @@
+using System.Collections.Generic;
+
+namespace Sanhe.Abp.MenuManagement
+{
+ ///
+ /// 授权策略
+ ///
+ public class AuthPolicyDto
+ {
+ ///
+ /// 名称
+ ///
+ public string Name { get; set; }
+ ///
+ /// 显示名称
+ ///
+ public string DisplayName { get; set; }
+ ///
+ /// 子策略
+ ///
+ public List Children { get; set; } = new List();
+ }
+}
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/CreateOrUpdateMenuDto.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/CreateOrUpdateMenuDto.cs
new file mode 100644
index 0000000..6924cfa
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/CreateOrUpdateMenuDto.cs
@@ -0,0 +1,97 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using Volo.Abp.Application.Dtos;
+using Volo.Abp.MultiTenancy;
+
+namespace Sanhe.Abp.MenuManagement
+{
+ ///
+ /// 创建修改菜单
+ ///
+ public class CreateOrUpdateMenuDto : EntityDto, IValidatableObject
+ {
+ ///
+ /// 名称
+ ///
+ public string Name { get; set; }
+ ///
+ /// 显示名称
+ ///
+ public string DisplayName { get; set; }
+ ///
+ /// 组件路径
+ ///
+ public string ComponentPath { get; set; }
+ ///
+ /// 路由路径
+ ///
+ public string RouterPath { get; set; }
+ ///
+ /// 父Id
+ ///
+ public Guid? ParentId { get; set; }
+ ///
+ /// 菜单类型
+ ///
+ public MenuEnumType MenuType { get; set; }
+ ///
+ /// 图标
+ ///
+ public string Icon { get; set; }
+ ///
+ /// 排序
+ ///
+ public string Sort { get; set; }
+ ///
+ /// window.open _blank
+ ///
+ public string TargetUrl { get; set; }
+ ///
+ /// 此菜单关联的权限key
+ ///
+ public string PermissionKey { get; set; }
+ ///
+ /// 表示多租户应用程序中的所属方
+ ///
+ public MultiTenancySides MultiTenancySide { get; set; }
+
+ public IEnumerable Validate(ValidationContext validationContext)
+ {
+ if (MenuType == MenuEnumType.Menu)
+ {
+ if (Name.IsNullOrWhiteSpace())
+ {
+ yield return new ValidationResult("Name 不能为空", new[] { "Name" });
+ }
+
+ if (DisplayName.IsNullOrWhiteSpace())
+ {
+ yield return new ValidationResult("DisplayName 不能为空", new[] { "DisplayName" });
+ }
+
+ if (RouterPath.IsNullOrWhiteSpace())
+ {
+ yield return new ValidationResult("RouterPath 不能为空", new[] { "RouterPath" });
+ }
+
+ if (ComponentPath.IsNullOrWhiteSpace())
+ {
+ yield return new ValidationResult("ComponentPath 不能为空", new[] { "ComponentPath" });
+ }
+ }
+ else if (MenuType == MenuEnumType.Permission)
+ {
+ if (DisplayName.IsNullOrWhiteSpace())
+ {
+ yield return new ValidationResult("DisplayName 不能为空", new[] { "DisplayName" });
+ }
+
+ if (!ParentId.HasValue)
+ {
+ yield return new ValidationResult("ParentId 不能为空", new[] { "ParentId" });
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/FrontMenu.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/FrontMenu.cs
new file mode 100644
index 0000000..f0764a0
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/FrontMenu.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+
+namespace Sanhe.Abp.MenuManagement
+{
+ ///
+ /// 前端菜单
+ ///
+ public class FrontMenu
+ {
+ ///
+ /// Id
+ ///
+ public Guid Id { get; set; }
+ ///
+ /// 名称
+ ///
+ public string Name { get; set; }
+ ///
+ /// 组件
+ ///
+ public string Component { get; set; }
+ ///
+ /// 路径
+ ///
+ public string Path { get; set; }
+ ///
+ /// window.open _blank
+ ///
+ public string TargetUrl { get; set; }
+ ///
+ /// 此菜单关联的权限key.
+ ///
+ public string PermissionKey { get; set; }
+ ///
+ /// 菜单标签
+ ///
+ public MenuMeta Meta { get; set; }
+ ///
+ /// 子菜单
+ ///
+ public List Children { get; set; } = new List();
+ }
+}
\ No newline at end of file
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/GetMenuGrantListResultDto.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/GetMenuGrantListResultDto.cs
new file mode 100644
index 0000000..a8b03a0
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/GetMenuGrantListResultDto.cs
@@ -0,0 +1,10 @@
+using System.Collections.Generic;
+
+namespace Sanhe.Abp.MenuManagement
+{
+ public class GetMenuGrantListResultDto
+ {
+ public List MenuGrants { get; set; }
+ public List Menus { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/GetMenuResultDto.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/GetMenuResultDto.cs
new file mode 100644
index 0000000..b0009fa
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/GetMenuResultDto.cs
@@ -0,0 +1,10 @@
+using System.Collections.Generic;
+
+namespace Sanhe.Abp.MenuManagement
+{
+ public class GetMenuResultDto
+ {
+ public List PermissionGrants { get; set; }
+ public List Menus { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/IMenuAppService.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/IMenuAppService.cs
new file mode 100644
index 0000000..339a666
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/IMenuAppService.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Volo.Abp.Application.Services;
+
+namespace Sanhe.Abp.MenuManagement
+{
+ public interface IMenuAppService : ICrudAppService
+ {
+ ///
+ /// 获取授权策略
+ ///
+ ///
+ Task> GetAuthPolicies();
+ }
+}
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/IMenuGrantAppService.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/IMenuGrantAppService.cs
new file mode 100644
index 0000000..44c3a97
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/IMenuGrantAppService.cs
@@ -0,0 +1,13 @@
+using JetBrains.Annotations;
+using System.Threading.Tasks;
+using Volo.Abp.Application.Services;
+
+namespace Sanhe.Abp.MenuManagement
+{
+ public interface IMenuGrantAppService : IApplicationService
+ {
+ Task GetListAsync();
+ Task GetAsync([NotNull] string providerName, [NotNull] string providerKey);
+ Task UpdateAsync([NotNull] string providerName, [NotNull] string providerKey, UpdateMenuGrantsDto input);
+ }
+}
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/MenuDto.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/MenuDto.cs
new file mode 100644
index 0000000..bbc279f
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/MenuDto.cs
@@ -0,0 +1,63 @@
+using System;
+using System.Collections.Generic;
+using Volo.Abp.Application.Dtos;
+using Volo.Abp.MultiTenancy;
+
+namespace Sanhe.Abp.MenuManagement
+{
+ public class MenuDto : AuditedEntityDto
+ {
+ ///
+ /// 名称
+ ///
+ public string Name { get; set; }
+ ///
+ /// 显示名称
+ ///
+ public string DisplayName { get; set; }
+ ///
+ /// 菜单类型
+ ///
+ public MenuEnumType MenuType { get; set; }
+ ///
+ /// 组件路径
+ ///
+ public string ComponentPath { get; set; }
+ ///
+ /// 路由路径
+ ///
+ public string RouterPath { get; set; }
+ ///
+ /// 父级显示名称
+ ///
+ public string ParentDisplayName { get; set; }
+ ///
+ /// 父Id
+ ///
+ public Guid? ParentId { get; set; }
+ ///
+ /// 图标
+ ///
+ public string Icon { get; set; }
+ ///
+ /// 排序
+ ///
+ public string Sort { get; set; }
+ ///
+ /// window.open _blank
+ ///
+ public string TargetUrl { get; set; }
+ ///
+ /// 此菜单关联的权限key
+ ///
+ public string PermissionKey { get; set; }
+ ///
+ /// 表示多租户应用程序中的所属方
+ ///
+ public MultiTenancySides MultiTenancySide { get; set; }
+ ///
+ /// 子菜单
+ ///
+ public List Children { get; set; } = new List();
+ }
+}
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/MenuManagementApplicationContractsModule.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/MenuManagementApplicationContractsModule.cs
new file mode 100644
index 0000000..eb814d3
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/MenuManagementApplicationContractsModule.cs
@@ -0,0 +1,17 @@
+using Volo.Abp.Application;
+using Volo.Abp.Authorization;
+using Volo.Abp.Modularity;
+using Volo.Abp.PermissionManagement;
+
+namespace Sanhe.Abp.MenuManagement;
+
+[DependsOn(
+ typeof(AbpPermissionManagementApplicationContractsModule),
+ typeof(MenuManagementDomainSharedModule),
+ typeof(AbpDddApplicationContractsModule),
+ typeof(AbpAuthorizationModule)
+ )]
+public class MenuManagementApplicationContractsModule : AbpModule
+{
+
+}
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/MenuManagementRemoteServiceConsts.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/MenuManagementRemoteServiceConsts.cs
new file mode 100644
index 0000000..4f13142
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/MenuManagementRemoteServiceConsts.cs
@@ -0,0 +1,8 @@
+namespace Sanhe.Abp.MenuManagement;
+
+public class MenuManagementRemoteServiceConsts
+{
+ public const string RemoteServiceName = "MenuManagement";
+
+ public const string ModuleName = "menuManagement";
+}
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/MenuMeta.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/MenuMeta.cs
new file mode 100644
index 0000000..3fa2266
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/MenuMeta.cs
@@ -0,0 +1,14 @@
+namespace Sanhe.Abp.MenuManagement
+{
+ public class MenuMeta
+ {
+ ///
+ /// 标题
+ ///
+ public string Title { get; set; }
+ ///
+ /// 图标
+ ///
+ public string Icon { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/MenuRequestDto.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/MenuRequestDto.cs
new file mode 100644
index 0000000..c684931
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/MenuRequestDto.cs
@@ -0,0 +1,14 @@
+namespace Sanhe.Abp.MenuManagement
+{
+ public class MenuRequestDto
+ {
+ ///
+ /// 名称
+ ///
+ public string Name { get; set; }
+ ///
+ /// 类型
+ ///
+ public MenuEnumType? Type { get; set; }
+ }
+}
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/Permissions/MenuManagementPermissionDefinitionProvider.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/Permissions/MenuManagementPermissionDefinitionProvider.cs
new file mode 100644
index 0000000..e4d3b4b
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/Permissions/MenuManagementPermissionDefinitionProvider.cs
@@ -0,0 +1,24 @@
+using Sanhe.Abp.MenuManagement.Localization;
+using Volo.Abp.Authorization.Permissions;
+using Volo.Abp.Localization;
+using Volo.Abp.MultiTenancy;
+
+namespace Sanhe.Abp.MenuManagement.Permissions;
+
+public class MenuManagementPermissionDefinitionProvider : PermissionDefinitionProvider
+{
+ public override void Define(IPermissionDefinitionContext context)
+ {
+ var moduleGroup = context.AddGroup(MenuManagementPermissions.GroupName, L("MenuManagement:MenuManagement"));
+ var permission = moduleGroup.AddPermission(MenuManagementPermissions.Menus.Default, L("MenuManagement:MenuManagement"), multiTenancySide: MultiTenancySides.Host);
+ permission.AddChild(MenuManagementPermissions.Menus.Create, L("MenuManagement:Create"), multiTenancySide: MultiTenancySides.Host);
+ permission.AddChild(MenuManagementPermissions.Menus.Update, L("MenuManagement:Update"), multiTenancySide: MultiTenancySides.Host);
+ permission.AddChild(MenuManagementPermissions.Menus.Delete, L("MenuManagement:Delete"), multiTenancySide: MultiTenancySides.Host);
+ permission.AddChild(MenuManagementPermissions.Menus.CreatePermission, L("MenuManagement:CreatePermission"), multiTenancySide: MultiTenancySides.Host);
+ }
+
+ private static LocalizableString L(string name)
+ {
+ return LocalizableString.Create(name);
+ }
+}
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/Permissions/MenuManagementPermissions.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/Permissions/MenuManagementPermissions.cs
new file mode 100644
index 0000000..3f7a6d9
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/Permissions/MenuManagementPermissions.cs
@@ -0,0 +1,22 @@
+using Volo.Abp.Reflection;
+
+namespace Sanhe.Abp.MenuManagement.Permissions;
+
+public class MenuManagementPermissions
+{
+ public const string GroupName = "MenuManagement";
+
+ public static class Menus
+ {
+ public const string Default = GroupName + ".Menus";
+ public const string Create = Default + ".Create";
+ public const string Update = Default + ".Update";
+ public const string Delete = Default + ".Delete";
+ public const string CreatePermission = Default + ".CreatePermission";
+ }
+
+ public static string[] GetAll()
+ {
+ return ReflectionHelper.GetPublicConstantsRecursively(typeof(MenuManagementPermissions));
+ }
+}
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/UpdateMenuGrantDto.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/UpdateMenuGrantDto.cs
new file mode 100644
index 0000000..7533a55
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/UpdateMenuGrantDto.cs
@@ -0,0 +1,20 @@
+using System;
+
+namespace Sanhe.Abp.MenuManagement
+{
+ public class UpdateMenuGrantDto
+ {
+ ///
+ /// 菜单Id
+ ///
+ public Guid Id { get; set; }
+ ///
+ /// 权限key
+ ///
+ public string PermissionKey { get; set; }
+ ///
+ /// 是否分配
+ ///
+ public bool IsGranted { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/UpdateMenuGrantsDto.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/UpdateMenuGrantsDto.cs
new file mode 100644
index 0000000..fae65f0
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application.Contracts/Sanhe/Abp/MenuManagement/UpdateMenuGrantsDto.cs
@@ -0,0 +1,7 @@
+namespace Sanhe.Abp.MenuManagement
+{
+ public class UpdateMenuGrantsDto
+ {
+ public UpdateMenuGrantDto[] Menus { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application/FodyWeavers.xml b/modules/menu-management/Sanhe.Abp.MenuManagement.Application/FodyWeavers.xml
new file mode 100644
index 0000000..1715698
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application/Sanhe.Abp.MenuManagement.Application.csproj b/modules/menu-management/Sanhe.Abp.MenuManagement.Application/Sanhe.Abp.MenuManagement.Application.csproj
new file mode 100644
index 0000000..52f6b9f
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application/Sanhe.Abp.MenuManagement.Application.csproj
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+ netstandard2.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/menu-management/Sanhe.Abp.MenuManagement.Application/Sanhe/Abp/MenuManagement/MenuAppService.cs b/modules/menu-management/Sanhe.Abp.MenuManagement.Application/Sanhe/Abp/MenuManagement/MenuAppService.cs
new file mode 100644
index 0000000..0b12f4a
--- /dev/null
+++ b/modules/menu-management/Sanhe.Abp.MenuManagement.Application/Sanhe/Abp/MenuManagement/MenuAppService.cs
@@ -0,0 +1,182 @@
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.Extensions.Localization;
+using Sanhe.Abp.MenuManagement.Permissions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Volo.Abp;
+using Volo.Abp.Application.Dtos;
+using Volo.Abp.Application.Services;
+using Volo.Abp.Authorization.Permissions;
+using Volo.Abp.Domain.Repositories;
+using Volo.Abp.MultiTenancy;
+
+namespace Sanhe.Abp.MenuManagement
+{
+ [Authorize]
+ public class MenuAppService : CrudAppService