diff --git a/aspnet-core/LINGYUN.MicroService.All.sln b/aspnet-core/LINGYUN.MicroService.All.sln
index 517b7210b..8905b0b34 100644
--- a/aspnet-core/LINGYUN.MicroService.All.sln
+++ b/aspnet-core/LINGYUN.MicroService.All.sln
@@ -837,6 +837,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.AuditLogging.IP
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.Saas.DbChecker", "modules\saas\LINGYUN.Abp.Saas.DbChecker\LINGYUN.Abp.Saas.DbChecker.csproj", "{DED16774-635C-D781-4D5B-D1FA56EECF10}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.UI.Navigation.VueVbenAdmin5", "modules\platform\LINGYUN.Abp.UI.Navigation.VueVbenAdmin5\LINGYUN.Abp.UI.Navigation.VueVbenAdmin5.csproj", "{4105FC8B-E8C6-DBD7-FFEA-EA5AB09C7D08}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -2167,6 +2169,10 @@ Global
{DED16774-635C-D781-4D5B-D1FA56EECF10}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DED16774-635C-D781-4D5B-D1FA56EECF10}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DED16774-635C-D781-4D5B-D1FA56EECF10}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4105FC8B-E8C6-DBD7-FFEA-EA5AB09C7D08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4105FC8B-E8C6-DBD7-FFEA-EA5AB09C7D08}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4105FC8B-E8C6-DBD7-FFEA-EA5AB09C7D08}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4105FC8B-E8C6-DBD7-FFEA-EA5AB09C7D08}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -2573,6 +2579,7 @@ Global
{7984F6B6-726F-9F30-3B6F-08A90AD75A7D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E}
{D63FEED3-2342-7E96-4121-B0C19CF1EA81} = {6A3FF105-7E8B-4B4D-A736-1C2BAF86FDAA}
{DED16774-635C-D781-4D5B-D1FA56EECF10} = {D01D859E-4B72-478A-BABD-90F0981652D5}
+ {4105FC8B-E8C6-DBD7-FFEA-EA5AB09C7D08} = {F4923692-D343-4318-AECA-96F580B1A563}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C95FDF91-16F2-4A8B-A4BE-0E62D1B66718}
diff --git a/aspnet-core/LINGYUN.MicroService.SingleProject.sln b/aspnet-core/LINGYUN.MicroService.SingleProject.sln
index f27551e27..81f89c443 100644
--- a/aspnet-core/LINGYUN.MicroService.SingleProject.sln
+++ b/aspnet-core/LINGYUN.MicroService.SingleProject.sln
@@ -686,6 +686,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.Elasticsearch",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.Quartz.SqlInstaller", "modules\task-management\LINGYUN.Abp.Quartz.SqlInstaller\LINGYUN.Abp.Quartz.SqlInstaller.csproj", "{A8586A5A-A213-4C66-819C-E692187B1F39}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.UI.Navigation.VueVbenAdmin5", "modules\platform\LINGYUN.Abp.UI.Navigation.VueVbenAdmin5\LINGYUN.Abp.UI.Navigation.VueVbenAdmin5.csproj", "{113167DA-602A-4EBE-9357-D83C090DBA3F}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -1824,6 +1826,10 @@ Global
{A8586A5A-A213-4C66-819C-E692187B1F39}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A8586A5A-A213-4C66-819C-E692187B1F39}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A8586A5A-A213-4C66-819C-E692187B1F39}.Release|Any CPU.Build.0 = Release|Any CPU
+ {113167DA-602A-4EBE-9357-D83C090DBA3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {113167DA-602A-4EBE-9357-D83C090DBA3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {113167DA-602A-4EBE-9357-D83C090DBA3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {113167DA-602A-4EBE-9357-D83C090DBA3F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -2158,6 +2164,7 @@ Global
{22295ECE-A973-43F0-A6F2-982F7DB02F4E} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1}
{B8D0DCBD-8D03-E450-0258-D0660A356BF0} = {22295ECE-A973-43F0-A6F2-982F7DB02F4E}
{A8586A5A-A213-4C66-819C-E692187B1F39} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B}
+ {113167DA-602A-4EBE-9357-D83C090DBA3F} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {711A43C0-A2F8-4E5C-9B9F-F2551E4B3FF1}
diff --git a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/FodyWeavers.xml b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/FodyWeavers.xml
new file mode 100644
index 000000000..1715698cc
--- /dev/null
+++ b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/FodyWeavers.xsd b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/FodyWeavers.xsd
new file mode 100644
index 000000000..3f3946e28
--- /dev/null
+++ b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/FodyWeavers.xsd
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.
+
+
+
+
+ A comma-separated list of error codes that can be safely ignored in assembly verification.
+
+
+
+
+ 'false' to turn off automatic generation of the XML Schema file.
+
+
+
+
+
\ No newline at end of file
diff --git a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5.csproj b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5.csproj
new file mode 100644
index 000000000..5b960af0d
--- /dev/null
+++ b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5.csproj
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+ net9.0
+ LINGYUN.Abp.UI.Navigation.VueVbenAdmin5
+ LINGYUN.Abp.UI.Navigation.VueVbenAdmin5
+ false
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/LINGYUN/Abp/UI/Navigation/VueVbenAdmin5/AbpUINavigationVueVbenAdmin5Module.cs b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/LINGYUN/Abp/UI/Navigation/VueVbenAdmin5/AbpUINavigationVueVbenAdmin5Module.cs
new file mode 100644
index 000000000..973fa8535
--- /dev/null
+++ b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/LINGYUN/Abp/UI/Navigation/VueVbenAdmin5/AbpUINavigationVueVbenAdmin5Module.cs
@@ -0,0 +1,18 @@
+using LINGYUN.Platform;
+using Volo.Abp.Modularity;
+
+namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin5;
+
+[DependsOn(
+ typeof(AbpUINavigationModule),
+ typeof(PlatformDomainModule))]
+public class AbpUINavigationVueVbenAdmin5Module : AbpModule
+{
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ Configure(options =>
+ {
+ options.NavigationSeedContributors.Add();
+ });
+ }
+}
diff --git a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/LINGYUN/Abp/UI/Navigation/VueVbenAdmin5/AbpUINavigationVueVbenAdmin5NavigationDefinitionProvider.cs b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/LINGYUN/Abp/UI/Navigation/VueVbenAdmin5/AbpUINavigationVueVbenAdmin5NavigationDefinitionProvider.cs
new file mode 100644
index 000000000..9274bd827
--- /dev/null
+++ b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/LINGYUN/Abp/UI/Navigation/VueVbenAdmin5/AbpUINavigationVueVbenAdmin5NavigationDefinitionProvider.cs
@@ -0,0 +1,762 @@
+using System.Security.Principal;
+using Volo.Abp.Data;
+using Volo.Abp.MultiTenancy;
+
+namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin5;
+
+public class AbpUINavigationVueVbenAdmin5NavigationDefinitionProvider : NavigationDefinitionProvider
+{
+ public override void Define(INavigationDefinitionContext context)
+ {
+ context.Add(GetDashboard());
+ context.Add(GetAccount());
+ context.Add(GetManage());
+ context.Add(GetSaas());
+ context.Add(GetPlatform());
+ context.Add(GetOssManagement());
+ context.Add(GetTaskManagement());
+ context.Add(GetWebhooksManagement());
+ context.Add(GetTextTemplating());
+ context.Add(GetVbenDemos());
+ }
+
+ private static NavigationDefinition[] GetVbenDemos()
+ {
+ var project = new ApplicationMenu(
+ name: "VbenProject",
+ displayName: "项目",
+ url: "/vben-admin",
+ component: "",
+ description: "项目",
+ order: 9998,
+ icon: "https://unpkg.com/@vbenjs/static-source@0.1.7/source/logo-v1.webp")
+ .SetProperty("badgeType", "dot")
+ .SetProperty("title", "demos.vben.title");
+ project.AddItem(
+ new ApplicationMenu(
+ name: "VbenDocument",
+ displayName: "文档",
+ url: "/vben-admin/document",
+ component: "",
+ icon: "lucide:book-open-text",
+ description: "文档")
+ .SetProperty("link", "https://doc.vben.pro")
+ .SetProperty("title", "demos.vben.document")
+ );
+ project.AddItem(
+ new ApplicationMenu(
+ name: "VbenGithub",
+ displayName: "文档",
+ url: "/vben-admin/github",
+ component: "",
+ icon: "mdi:github",
+ description: "文档")
+ .SetProperty("link", "https://github.com/vbenjs/vue-vben-admin")
+ .SetProperty("title", "Github")
+ );
+ project.AddItem(
+ new ApplicationMenu(
+ name: "VbenNaive",
+ displayName: "Naive UI 版本",
+ url: "/vben-admin/naive",
+ component: "",
+ icon: "logos:naiveui",
+ description: "Naive UI 版本")
+ .SetProperty("badgeType", "dot")
+ .SetProperty("link", "https://naive.vben.pro")
+ .SetProperty("title", "demos.vben.naive-ui")
+ );
+ project.AddItem(
+ new ApplicationMenu(
+ name: "VbenElementPlus",
+ displayName: "Element Plus 版本",
+ url: "/vben-admin/ele",
+ component: "",
+ icon: "logos:element",
+ description: "Element Plus 版本")
+ .SetProperty("badgeType", "dot")
+ .SetProperty("link", "https://ele.vben.pro")
+ .SetProperty("title", "demos.vben.element-plus")
+ );
+
+ var about = new ApplicationMenu(
+ name: "VbenAbout",
+ displayName: "关于",
+ url: "/vben-admin/about",
+ component: "/_core/about/index",
+ description: "关于",
+ order: 9999,
+ icon: "lucide:copyright")
+ .SetProperty("title", "demos.vben.about");
+
+ return new NavigationDefinition[2]
+ {
+ new NavigationDefinition(project),
+ new NavigationDefinition(about),
+ };
+ }
+
+ private static NavigationDefinition GetAccount()
+ {
+ var account = new ApplicationMenu(
+ name: "Vben5Account",
+ displayName: "账户管理",
+ url: "/account",
+ component: "",
+ description: "账户管理",
+ icon: "mdi:account-outline")
+ .SetProperty("hideInMenu", "true")
+ .SetProperty("title", "abp.account.title");
+
+ account.AddItem(
+ new ApplicationMenu(
+ name: "Vben5AccountMySettings",
+ displayName: "个人设置",
+ url: "/account/my-settings",
+ component: "/account/my-settings/index",
+ icon: "tdesign:user-setting",
+ description: "个人设置")
+ .SetProperty("title", "abp.account.settings.title")
+ );
+
+ return new NavigationDefinition(account);
+ }
+
+ private static NavigationDefinition GetDashboard()
+ {
+ var dashboard = new ApplicationMenu(
+ name: "Vben5Dashboard",
+ displayName: "仪表盘",
+ url: "/dashboard",
+ component: "",
+ description: "仪表盘",
+ icon: "lucide:layout-dashboard",
+ order: -1)
+ .SetProperty("title", "page.dashboard.title");
+
+ dashboard.AddItem(
+ new ApplicationMenu(
+ name: "Vben5Analysis",
+ displayName: "分析页",
+ url: "/analytics",
+ component: "/dashboard/analytics/index",
+ icon: "lucide:area-chart",
+ description: "分析页")
+ .SetProperty("affixTab", "true")
+ .SetProperty("title", "page.dashboard.analytics")
+ );
+
+ dashboard.AddItem(
+ new ApplicationMenu(
+ name: "Vben5Workbench",
+ displayName: "工作台",
+ url: "/workspace",
+ component: "/dashboard/workspace/index",
+ icon: "carbon:workspace",
+ description: "工作台")
+ .SetProperty("title", "page.dashboard.workspace")
+ );
+
+ return new NavigationDefinition(dashboard);
+ }
+
+ private static NavigationDefinition GetManage()
+ {
+ var manage = new ApplicationMenu(
+ name: "Vben5Manage",
+ displayName: "管理",
+ url: "/manage",
+ component: "",
+ description: "管理",
+ icon: "arcticons:activity-manager")
+ .SetProperty("title", "abp.manage.title");
+
+ var openIddict = manage.AddItem(
+ new ApplicationMenu(
+ name: "Vben5OpenIddict",
+ displayName: "身份认证服务器",
+ url: "/manage/openiddict",
+ component: "",
+ icon: "mdi:openid",
+ description: "身份认证服务器(OpenIddict)",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.openiddict.title"));
+ openIddict.AddItem(
+ new ApplicationMenu(
+ name: "Vben5OpenIddictApplications",
+ displayName: "应用管理",
+ url: "/manage/openiddict/applications",
+ component: "/openiddict/applications/index",
+ icon: "carbon:application",
+ description: "应用管理",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.openiddict.applications"));
+ openIddict.AddItem(
+ new ApplicationMenu(
+ name: "Vben5OpenIddictAuthorizations",
+ displayName: "授权管理",
+ url: "/manage/openiddict/authorizations",
+ component: "/openiddict/authorizations/index",
+ icon: "arcticons:ente-authenticator",
+ description: "授权管理",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.openiddict.authorizations"));
+ openIddict.AddItem(
+ new ApplicationMenu(
+ name: "Vben5OpenIddictScopes",
+ displayName: "范围管理",
+ url: "/manage/openiddict/scopes",
+ component: "/openiddict/scopes/index",
+ icon: "et:scope",
+ description: "范围管理",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.openiddict.scopes"));
+ openIddict.AddItem(
+ new ApplicationMenu(
+ name: "Vben5OpenIddictTokens",
+ displayName: "授权令牌",
+ url: "/manage/openiddict/tokens",
+ component: "/openiddict/tokens/index",
+ icon: "oui:token-key",
+ description: "授权令牌",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.openiddict.tokens"));
+
+ var identity = manage.AddItem(
+ new ApplicationMenu(
+ name: "Vben5Identity",
+ displayName: "身份认证管理",
+ url: "/manage/identity",
+ component: "",
+ icon: "teenyicons:id-outline",
+ description: "身份认证管理")
+ .SetProperty("title", "abp.manage.identity.title"));
+ identity.AddItem(
+ new ApplicationMenu(
+ name: "Vben5IdentityUsers",
+ displayName: "用户管理",
+ url: "/manage/identity/users",
+ component: "/identity/users/index",
+ icon: "mdi:user-outline",
+ description: "用户管理")
+ .SetProperty("title", "abp.manage.identity.user"));
+ identity.AddItem(
+ new ApplicationMenu(
+ name: "Vben5IdentityRoles",
+ displayName: "角色管理",
+ url: "/manage/identity/roles",
+ component: "/identity/roles/index",
+ icon: "carbon:user-role",
+ description: "角色管理")
+ .SetProperty("title", "abp.manage.identity.role"));
+ identity.AddItem(
+ new ApplicationMenu(
+ name: "Vben5IdentityClaimTypes",
+ displayName: "身份标识",
+ url: "/manage/identity/claim-types",
+ component: "/identity/claim-types/index",
+ icon: "la:id-card-solid",
+ description: "身份标识",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.identity.claimTypes"));
+ identity.AddItem(
+ new ApplicationMenu(
+ name: "Vben5IdentityOrganizationUnits",
+ displayName: "组织机构",
+ url: "/manage/identity/organization-units",
+ component: "/identity/organization-units/index",
+ icon: "clarity:organization-line",
+ description: "组织机构")
+ .SetProperty("title", "abp.manage.identity.organizationUnits"));
+ identity.AddItem(
+ new ApplicationMenu(
+ name: "SecurityLogs",
+ displayName: "安全日志",
+ url: "/manage/identity/security-logs",
+ component: "/identity/security-logs/index",
+ icon: "carbon:security",
+ description: "安全日志")
+ .SetProperty("title", "abp.manage.identity.securityLogs")
+ .SetProperty("requiredFeatures", "AbpAuditing.Logging.SecurityLog"));
+ identity.AddItem(
+ new ApplicationMenu(
+ name: "Vben5IdentitySessions",
+ displayName: "会话管理",
+ url: "/manage/identity/sessions",
+ component: "/identity/sessions/index",
+ icon: "carbon:prompt-session",
+ description: "会话管理")
+ .SetProperty("title", "abp.manage.identity.sessions"));
+
+ var permissionManagement = manage.AddItem(new ApplicationMenu(
+ name: "Vben5Permissions",
+ displayName: "权限管理",
+ url: "/manage/permissions",
+ component: "",
+ description: "权限管理",
+ icon: "arcticons:permissionsmanager",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.permissions.title"));
+ permissionManagement.AddItem(new ApplicationMenu(
+ name: "Vben5PermissionsGroupDefinitions",
+ displayName: "权限分组",
+ url: "/manage/permissions/groups",
+ component: "/permissions/groups/index",
+ icon: "lucide:group",
+ description: "权限分组",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.permissions.groups"));
+ permissionManagement.AddItem(new ApplicationMenu(
+ name: "Vben5PermissionsDefinitions",
+ displayName: "权限定义",
+ url: "/manage/permissions/definitions",
+ component: "/permissions/definitions/index",
+ icon: "icon-park-outline:permissions",
+ description: "权限定义",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.permissions.definitions"));
+
+
+ var featureManagement = manage.AddItem(new ApplicationMenu(
+ name: "Vben5Features",
+ displayName: "功能管理",
+ url: "/manage/features",
+ component: "",
+ description: "功能管理",
+ icon: "ant-design:gold-outlined",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.features.title"));
+ featureManagement.AddItem(new ApplicationMenu(
+ name: "Vben5FeaturesGroupDefinitions",
+ displayName: "功能分组",
+ url: "/manage/features/groups",
+ component: "/features/groups/index",
+ icon: "lucide:group",
+ description: "功能分组",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.features.groups"));
+ featureManagement.AddItem(new ApplicationMenu(
+ name: "Vben5FeaturesDefinitions",
+ displayName: "功能定义",
+ url: "/manage/features/definitions",
+ component: "/features/definitions/index",
+ icon: "pajamas:feature-flag",
+ description: "功能定义",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.features.definitions"));
+
+ var settingManagement = manage.AddItem(new ApplicationMenu(
+ name: "Vben5Settings",
+ displayName: "设置管理",
+ url: "/manage/settings",
+ component: "",
+ description: "设置管理",
+ icon: "ic:outline-settings")
+ .SetProperty("title", "abp.manage.settings.title")
+ // 此路由需要依赖设置管理特性
+ .SetProperty("requiredFeatures", "SettingManagement.Enable"));
+ settingManagement.AddItem(new ApplicationMenu(
+ name: "Vben5SettingsSystem",
+ displayName: "系统设置",
+ url: "/manage/settings/system",
+ component: "/settings/system/index",
+ icon: "tabler:settings-cog",
+ description: "系统设置")
+ .SetProperty("title", "abp.manage.settings.system")
+ // 此路由需要依赖设置管理特性
+ .SetProperty("requiredFeatures", "SettingManagement.Enable"));
+ settingManagement.AddItem(new ApplicationMenu(
+ name: "Vben5SettingsDefinitions",
+ displayName: "设置定义",
+ url: "/manage/settings/definitions",
+ component: "/settings/definitions/index",
+ icon: "codicon:settings",
+ description: "设置定义",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.settings.definitions"));
+
+ var localization = manage.AddItem(new ApplicationMenu(
+ name: "Vben5Localizations",
+ displayName: "本地化管理",
+ url: "/manage/localization",
+ component: "",
+ description: "本地化管理",
+ icon: "ion:globe-outline",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.localization.title"));
+ localization.AddItem(
+ new ApplicationMenu(
+ name: "Vben5LocalizationsLanguages",
+ displayName: "语言管理",
+ url: "/manage/localization/languages",
+ component: "/localization/languages/index",
+ icon: "cil:language",
+ description: "语言管理",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.localization.languages")
+ );
+ localization.AddItem(
+ new ApplicationMenu(
+ name: "Vben5LocalizationsResources",
+ displayName: "资源管理",
+ url: "/manage/localization/resources",
+ component: "/localization/resources/index",
+ icon: "grommet-icons:resources",
+ description: "资源管理",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.localization.resources")
+ );
+ localization.AddItem(
+ new ApplicationMenu(
+ name: "Vben5LocalizationsTexts",
+ displayName: "文档管理",
+ url: "/manage/localization/texts",
+ component: "/localization/texts/index",
+ icon: "mi:text",
+ description: "文档管理",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.localization.texts")
+ );
+
+ var dataProtection = manage.AddItem(new ApplicationMenu(
+ name: "Vben5DataProtection",
+ displayName: "数据保护",
+ url: "/manage/data-protection",
+ component: "",
+ description: "数据保护",
+ icon: "icon-park-outline:protect",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.dataProtection.title"));
+ dataProtection.AddItem(new ApplicationMenu(
+ name: "Vben5DataProtectionEntityTypeInfos",
+ displayName: "实体管理",
+ url: "/manage/data-protection/entity-type-infos",
+ component: "/data-protection/entity-type-infos/index",
+ icon: "iconamoon:type",
+ description: "实体管理",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.dataProtection.entityTypeInfos"));
+
+ manage.AddItem(new ApplicationMenu(
+ name: "Vben5AuditingAuditLogs",
+ displayName: "审计日志",
+ url: "/manage/audit-logs",
+ component: "/auditing/audit-logs/index",
+ icon: "fluent-mdl2:compliance-audit",
+ description: "审计日志")
+ .SetProperty("title", "abp.manage.auditLogs")
+ // 此路由需要依赖审计日志特性
+ .SetProperty("requiredFeatures", "AbpAuditing.Logging.AuditLog"));
+
+ manage.AddItem(
+ new ApplicationMenu(
+ name: "Vben5AuditingLoggings",
+ displayName: "系统日志",
+ url: "/manage/sys-logs",
+ component: "/auditing/loggings/index",
+ icon: "icon-park-outline:log",
+ description: "系统日志",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.loggings"));
+
+ var notificationManagement = manage.AddItem(new ApplicationMenu(
+ name: "Vben5Notifications",
+ displayName: "通知管理",
+ url: "/manage/notifications",
+ component: "",
+ description: "通知管理",
+ icon: "tabler:notification")
+ .SetProperty("title", "abp.manage.notifications.title"));
+ notificationManagement.AddItem(new ApplicationMenu(
+ name: "Vben5NotificationsMyNotifilers",
+ displayName: "我的通知",
+ url: "/manage/notifications/my-notifilers",
+ component: "/notifications/my-notifilers/index",
+ icon: "ant-design:notification-outlined",
+ description: "我的通知")
+ .SetProperty("title", "abp.manage.notifications.myNotifilers"));
+ notificationManagement.AddItem(new ApplicationMenu(
+ name: "Vben5NotificationsGroupDefinitions",
+ displayName: "通知分组",
+ url: "/manage/notifications/groups",
+ component: "/notifications/groups/index",
+ icon: "lucide:group",
+ description: "通知分组",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.notifications.groups"));
+ notificationManagement.AddItem(new ApplicationMenu(
+ name: "NotificationsDefinitions",
+ displayName: "通知定义",
+ url: "/manage/notifications/definitions",
+ component: "/notifications/definitions/index",
+ icon: "nimbus:notification",
+ description: "通知定义",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.notifications.definitions"));
+
+ manage.AddItem(
+ new ApplicationMenu(
+ name: "Vben5ApiDocument",
+ displayName: "Api 文档",
+ url: "/manage/openapi",
+ component: "IFrame",
+ description: "Api 文档",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.manage.openApi")
+ // TODO: 注意在部署完毕之后手动修改此菜单iframe地址
+ .SetProperty("iframeSrc", "http://127.0.0.1:30000/swagger/index.html"));
+
+ manage.AddItem(
+ new ApplicationMenu(
+ name: "Vben5Caches",
+ displayName: "缓存管理",
+ url: "/manage/cache",
+ component: "/caching/caches/index",
+ description: "缓存管理")
+ .SetProperty("title", "abp.manage.cache"));
+
+ return new NavigationDefinition(manage);
+ }
+
+ private static NavigationDefinition GetSaas()
+ {
+ var saas = new ApplicationMenu(
+ name: "Vben5Saas",
+ displayName: "Saas",
+ url: "/saas",
+ component: "",
+ description: "Saas",
+ icon: "ant-design:cloud-server-outlined",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.saas.title");
+ saas.AddItem(
+ new ApplicationMenu(
+ name: "Vben5SaasTenants",
+ displayName: "租户管理",
+ url: "/saas/tenants",
+ component: "/saas/tenants/index",
+ icon: "arcticons:tenantcloud-pro",
+ description: "租户管理",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.saas.tenants"));
+ saas.AddItem(
+ new ApplicationMenu(
+ name: "Vben5SaasEditions",
+ displayName: "版本管理",
+ url: "/saas/editions",
+ component: "/saas/editions/index",
+ icon: "icon-park-outline:multi-rectangle",
+ description: "版本管理",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.saas.editions"));
+
+ return new NavigationDefinition(saas);
+ }
+
+ private static NavigationDefinition GetPlatform()
+ {
+ var platform = new ApplicationMenu(
+ name: "Vben5Platform",
+ displayName: "平台管理",
+ url: "/platform",
+ component: "",
+ description: "平台管理",
+ icon: "ep:platform")
+ .SetProperty("title", "abp.platform.title");
+ platform.AddItem(
+ new ApplicationMenu(
+ name: "Vben5PlatformDataDictionaries",
+ displayName: "数据字典",
+ url: "/platform/data-dictionaries",
+ component: "/platform/data-dictionaries/index",
+ icon: "material-symbols:dictionary-outline",
+ description: "数据字典")
+ .SetProperty("title", "abp.platform.dataDictionaries"));
+ platform.AddItem(
+ new ApplicationMenu(
+ name: "Vben5PlatformLayouts",
+ displayName: "布局管理",
+ url: "/platform/layouts",
+ component: "/platform/layouts/index",
+ icon: "material-symbols-light:responsive-layout",
+ description: "布局管理")
+ .SetProperty("title", "abp.platform.layouts"));
+ platform.AddItem(
+ new ApplicationMenu(
+ name: "Vben5PlatformMenus",
+ displayName: "菜单管理",
+ url: "/platform/menus",
+ component: "/platform/menus/index",
+ icon: "material-symbols-light:menu",
+ description: "菜单管理")
+ .SetProperty("title", "abp.platform.menus"));
+
+ var messages = platform.AddItem(
+ new ApplicationMenu(
+ name: "Vben5PlatformMessages",
+ displayName: "消息管理",
+ url: "/platform/messages",
+ component: "",
+ icon: "tabler:message-cog",
+ description: "消息管理",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.platform.messages.title"));
+ messages.AddItem(
+ new ApplicationMenu(
+ name: "Vben5PlatformEmailMessages",
+ displayName: "邮件消息",
+ url: "/platform/messages/email",
+ component: "/platform/messages/email/index",
+ icon: "material-symbols:attach-email-outline",
+ description: "邮件消息",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.platform.messages.email"));
+ messages.AddItem(
+ new ApplicationMenu(
+ name: "Vben5PlatformSmsMessages",
+ displayName: "短信消息",
+ url: "/platform/messages/sms",
+ component: "/platform/messages/sms/index",
+ icon: "material-symbols:sms-outline",
+ description: "短信消息",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.platform.messages.sms"));
+
+ return new NavigationDefinition(platform);
+ }
+
+ private static NavigationDefinition GetOssManagement()
+ {
+ var oss = new ApplicationMenu(
+ name: "Vben5Oss",
+ displayName: "对象存储",
+ url: "/oss",
+ component: "",
+ description: "对象存储",
+ icon: "icon-park-outline:cloud-storage")
+ .SetProperty("title", "abp.oss.title");
+ oss.AddItem(
+ new ApplicationMenu(
+ name: "Vben5OssContainers",
+ displayName: "容器管理",
+ url: "/oss/containers",
+ component: "/oss/containers/index",
+ icon: "mdi:bucket-outline",
+ description: "容器管理")
+ .SetProperty("title", "abp.oss.containers"));
+ oss.AddItem(
+ new ApplicationMenu(
+ name: "Vben5OssObjects",
+ displayName: "文件管理",
+ url: "/oss/objects",
+ component: "/oss/objects/index",
+ icon: "mdi-light:file",
+ description: "文件管理")
+ .SetProperty("title", "abp.oss.objects"));
+
+ return new NavigationDefinition(oss);
+ }
+
+ private static NavigationDefinition GetTaskManagement()
+ {
+ var task = new ApplicationMenu(
+ name: "Vben5Tasks",
+ displayName: "任务管理",
+ url: "/task-management",
+ component: "",
+ description: "任务管理",
+ icon: "eos-icons:background-tasks")
+ .SetProperty("title", "abp.tasks.title");
+ task.AddItem(
+ new ApplicationMenu(
+ name: "Vben5TasksJobInfos",
+ displayName: "任务队列",
+ url: "/task-management/background-jobs",
+ component: "/tasks/job-infos/index",
+ icon: "eos-icons:job",
+ description: "任务队列")
+ .SetProperty("title", "abp.tasks.jobInfo.title"));
+
+ return new NavigationDefinition(task);
+ }
+
+ private static NavigationDefinition GetWebhooksManagement()
+ {
+ var webhooks = new ApplicationMenu(
+ name: "Vben5Webhooks",
+ displayName: "WebHooks",
+ url: "/webhooks",
+ component: "",
+ description: "WebHooks",
+ icon: "material-symbols:webhook",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.webhooks.title");
+ webhooks.AddItem(
+ new ApplicationMenu(
+ name: "Vben5WebhooksGroupDefinitions",
+ displayName: "Webhook分组",
+ url: "/webhooks/groups",
+ component: "/webhooks/groups/index",
+ icon: "lucide:group",
+ description: "Webhook分组",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.webhooks.groups"));
+ webhooks.AddItem(
+ new ApplicationMenu(
+ name: "Vben5WebhooksDefinitions",
+ displayName: "Webhook定义",
+ url: "/webhooks/definitions",
+ component: "/webhooks/definitions/index",
+ icon: "material-symbols:webhook",
+ description: "Webhook定义",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.webhooks.definitions"));
+ webhooks.AddItem(
+ new ApplicationMenu(
+ name: "Vben5WebhooksSubscriptions",
+ displayName: "管理订阅",
+ url: "/webhooks/subscriptions",
+ component: "/webhooks/subscriptions/index",
+ icon: "material-symbols:subscriptions",
+ description: "管理订阅",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.webhooks.subscriptions"));
+ webhooks.AddItem(
+ new ApplicationMenu(
+ name: "Vben5WebhooksSendAttempts",
+ displayName: "管理记录",
+ url: "/webhooks/send-attempts",
+ component: "/webhooks/send-attempts/index",
+ icon: "material-symbols:history",
+ description: "管理记录",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.webhooks.sendAttempts"));
+
+ return new NavigationDefinition(webhooks);
+ }
+
+ private static NavigationDefinition GetTextTemplating()
+ {
+ var textTemplating = new ApplicationMenu(
+ name: "Vben5TextTemplating",
+ displayName: "模板管理",
+ url: "/text-templating",
+ component: "",
+ description: "模板管理",
+ icon: "tdesign:template",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.textTemplating.title");
+ textTemplating.AddItem(
+ new ApplicationMenu(
+ name: "Vben5TextTemplatingDefinitions",
+ displayName: "模板定义",
+ url: "/text-templating/definitions",
+ component: "/text-templating/definitions/index",
+ icon: "qlementine-icons:template-16",
+ description: "模板定义",
+ multiTenancySides: MultiTenancySides.Host)
+ .SetProperty("title", "abp.textTemplating.definitions"));
+
+ return new NavigationDefinition(textTemplating);
+ }
+}
diff --git a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/LINGYUN/Abp/UI/Navigation/VueVbenAdmin5/AbpUINavigationVueVbenAdmin5Options.cs b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/LINGYUN/Abp/UI/Navigation/VueVbenAdmin5/AbpUINavigationVueVbenAdmin5Options.cs
new file mode 100644
index 000000000..471b2e57f
--- /dev/null
+++ b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/LINGYUN/Abp/UI/Navigation/VueVbenAdmin5/AbpUINavigationVueVbenAdmin5Options.cs
@@ -0,0 +1,14 @@
+namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin5;
+
+public class AbpUINavigationVueVbenAdmin5Options
+{
+ public string UI { get; set; }
+ public string LayoutName { get; set; }
+ public string LayoutPath { get; set; }
+ public AbpUINavigationVueVbenAdmin5Options()
+ {
+ UI = "vben5";
+ LayoutName = "Vben5 Admin Layout";
+ LayoutPath = "BasicLayout";
+ }
+}
diff --git a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/LINGYUN/Abp/UI/Navigation/VueVbenAdmin5/VueVbenAdmin5NavigationSeedContributor.cs b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/LINGYUN/Abp/UI/Navigation/VueVbenAdmin5/VueVbenAdmin5NavigationSeedContributor.cs
new file mode 100644
index 000000000..3928e8c8f
--- /dev/null
+++ b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin5/LINGYUN/Abp/UI/Navigation/VueVbenAdmin5/VueVbenAdmin5NavigationSeedContributor.cs
@@ -0,0 +1,471 @@
+using LINGYUN.Platform.Datas;
+using LINGYUN.Platform.Layouts;
+using LINGYUN.Platform.Menus;
+using LINGYUN.Platform.Routes;
+using LINGYUN.Platform.Utils;
+using Microsoft.Extensions.Options;
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using Volo.Abp.Data;
+using Volo.Abp.Guids;
+using Volo.Abp.MultiTenancy;
+using ValueType = LINGYUN.Platform.Datas.ValueType;
+
+namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin5;
+
+public class VueVbenAdmin5NavigationSeedContributor : NavigationSeedContributor
+{
+ private static int _lastCodeNumber = 0;
+ protected ICurrentTenant CurrentTenant { get; }
+ protected IGuidGenerator GuidGenerator { get; }
+ protected IRouteDataSeeder RouteDataSeeder { get; }
+ protected IDataDictionaryDataSeeder DataDictionaryDataSeeder { get; }
+ protected IMenuRepository MenuRepository { get; }
+ protected ILayoutRepository LayoutRepository { get; }
+ protected AbpUINavigationVueVbenAdmin5Options Options { get; }
+
+ public VueVbenAdmin5NavigationSeedContributor(
+ ICurrentTenant currentTenant,
+ IRouteDataSeeder routeDataSeeder,
+ IMenuRepository menuRepository,
+ ILayoutRepository layoutRepository,
+ IGuidGenerator guidGenerator,
+ IDataDictionaryDataSeeder dataDictionaryDataSeeder,
+ IOptions options)
+ {
+ CurrentTenant = currentTenant;
+ GuidGenerator = guidGenerator;
+ RouteDataSeeder = routeDataSeeder;
+ MenuRepository = menuRepository;
+ LayoutRepository = layoutRepository;
+ DataDictionaryDataSeeder = dataDictionaryDataSeeder;
+
+ Options = options.Value;
+ }
+
+ public override async Task SeedAsync(NavigationSeedContext context)
+ {
+ var uiDataItem = await SeedUIFrameworkDataAsync(CurrentTenant.Id);
+
+ var layoutData = await SeedLayoutDataAsync(CurrentTenant.Id);
+
+ var layout = await SeedDefaultLayoutAsync(layoutData, uiDataItem);
+
+ var latMenu = await MenuRepository.GetLastMenuAsync();
+
+ if (int.TryParse(CodeNumberGenerator.GetLastCode(latMenu?.Code ?? "0"), out int _lastNumber))
+ {
+ Interlocked.Exchange(ref _lastCodeNumber, _lastNumber);
+ }
+
+ await SeedDefinitionMenusAsync(layout, layoutData, context.Menus, context.MultiTenancySides);
+ }
+
+ private async Task SeedDefinitionMenusAsync(
+ Layout layout,
+ Data data,
+ IReadOnlyCollection menus,
+ MultiTenancySides multiTenancySides)
+ {
+ foreach (var menu in menus)
+ {
+ if (!menu.MultiTenancySides.HasFlag(multiTenancySides))
+ {
+ continue;
+ }
+
+ var menuMeta = new Dictionary()
+ {
+ { "icon", menu.Icon ?? "" },
+ { "order", menu.Order },
+ };
+ foreach (var prop in menu.ExtraProperties)
+ {
+ if (menuMeta.ContainsKey(prop.Key))
+ {
+ menuMeta[prop.Key] = prop.Value;
+ }
+ else
+ {
+ menuMeta.Add(prop.Key, prop.Value);
+ }
+ }
+
+ var seedMenu = await SeedMenuAsync(
+ layout: layout,
+ data: data,
+ name: menu.Name,
+ path: menu.Url,
+ code: CodeNumberGenerator.CreateCode(GetNextCode()),
+ component: layout.Path,
+ displayName: menu.DisplayName,
+ redirect: menu.Redirect,
+ description: menu.Description,
+ parentId: null,
+ tenantId: layout.TenantId,
+ meta: menuMeta,
+ roles: new string[] { "admin" });
+
+ await SeedDefinitionMenuItemsAsync(layout, data, seedMenu, menu.Items, multiTenancySides);
+ }
+ }
+
+ private async Task SeedDefinitionMenuItemsAsync(
+ Layout layout,
+ Data data,
+ Menu menu,
+ ApplicationMenuList items,
+ MultiTenancySides multiTenancySides)
+ {
+ int index = 1;
+ foreach (var item in items)
+ {
+ if (!item.MultiTenancySides.HasFlag(multiTenancySides))
+ {
+ continue;
+ }
+
+ var menuMeta = new Dictionary()
+ {
+ { "icon", item.Icon ?? "" },
+ { "order", item.Order },
+ };
+ foreach (var prop in item.ExtraProperties)
+ {
+ if (menuMeta.ContainsKey(prop.Key))
+ {
+ menuMeta[prop.Key] = prop.Value;
+ }
+ else
+ {
+ menuMeta.Add(prop.Key, prop.Value);
+ }
+ }
+
+ var seedMenu = await SeedMenuAsync(
+ layout: layout,
+ data: data,
+ name: item.Name,
+ path: item.Url,
+ code: CodeNumberGenerator.AppendCode(menu.Code, CodeNumberGenerator.CreateCode(index)),
+ component: item.Component.IsNullOrWhiteSpace() ? layout.Path : item.Component,
+ displayName: item.DisplayName,
+ redirect: item.Redirect,
+ description: item.Description,
+ parentId: menu.Id,
+ tenantId: menu.TenantId,
+ meta: menuMeta,
+ roles: new string[] { "admin" });
+
+ await SeedDefinitionMenuItemsAsync(layout, data, seedMenu, item.Items, multiTenancySides);
+
+ index++;
+ }
+ }
+
+ private async Task