diff --git a/aspnet-core/services/account/AuthServer.Host/DataSeeder/IdentityServerDataSeedContributor.cs b/aspnet-core/services/account/AuthServer.Host/DataSeeder/IdentityServerDataSeedContributor.cs index f94c96b0c..d8d6c7374 100644 --- a/aspnet-core/services/account/AuthServer.Host/DataSeeder/IdentityServerDataSeedContributor.cs +++ b/aspnet-core/services/account/AuthServer.Host/DataSeeder/IdentityServerDataSeedContributor.cs @@ -1,329 +1,329 @@ -using LINGYUN.Abp.IdentityServer; -using Microsoft.Extensions.Configuration; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.Authorization.Permissions; -using Volo.Abp.Data; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Guids; -using Volo.Abp.IdentityServer.ApiResources; -using Volo.Abp.IdentityServer.ApiScopes; -using Volo.Abp.IdentityServer.Clients; -using Volo.Abp.IdentityServer.IdentityResources; -using Volo.Abp.MultiTenancy; -using Volo.Abp.PermissionManagement; -using Volo.Abp.Uow; - -namespace AuthServer.DataSeeder -{ - public class IdentityServerDataSeedContributor : IDataSeedContributor, ITransientDependency - { - private readonly IApiResourceRepository _apiResourceRepository; - private readonly IApiScopeRepository _apiScopeRepository; - private readonly IClientRepository _clientRepository; - private readonly IIdentityResourceDataSeeder _identityResourceDataSeeder; - private readonly IWeChatResourceDataSeeder _weChatResourceDataSeeder; - private readonly IGuidGenerator _guidGenerator; - private readonly IPermissionDataSeeder _permissionDataSeeder; - private readonly IConfiguration _configuration; - private readonly ICurrentTenant _currentTenant; - - public IdentityServerDataSeedContributor( - IClientRepository clientRepository, - IApiScopeRepository apiScopeRepository, - IPermissionDataSeeder permissionDataSeeder, - IApiResourceRepository apiResourceRepository, - IWeChatResourceDataSeeder weChatResourceDataSeeder, - IIdentityResourceDataSeeder identityResourceDataSeeder, - IGuidGenerator guidGenerator, - ICurrentTenant currentTenant) - { - _currentTenant = currentTenant; - _clientRepository = clientRepository; - _permissionDataSeeder = permissionDataSeeder; - _apiScopeRepository = apiScopeRepository; - _apiResourceRepository = apiResourceRepository; - _weChatResourceDataSeeder = weChatResourceDataSeeder; - _identityResourceDataSeeder = identityResourceDataSeeder; - _guidGenerator = guidGenerator; - var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"; - var configuration = new ConfigurationBuilder() - .SetBasePath(Directory.GetCurrentDirectory()) - .AddJsonFile($"appsettings.{env}.json", optional: false, reloadOnChange: true) - .AddEnvironmentVariables() - .Build(); - _configuration = configuration; - } - - [UnitOfWork] - public virtual async Task SeedAsync(DataSeedContext context) - { - using (_currentTenant.Change(context?.TenantId)) - { - await _identityResourceDataSeeder.CreateStandardResourcesAsync(); - await CreateWeChatClaimTypeAsync(); - await CreateApiResourcesAsync(); - await CreateApiScopesAsync(); - await CreateClientsAsync(); - } - } - - private async Task CreateWeChatClaimTypeAsync() - { - await _weChatResourceDataSeeder.CreateStandardResourcesAsync(); - } - - private async Task CreateApiScopesAsync() - { - await CreateApiScopeAsync("lingyun-abp-application"); - } - - private async Task CreateApiResourcesAsync() - { - var commonApiUserClaims = new[] - { - "email", - "email_verified", - "name", - "phone_number", - "phone_number_verified", - "role" - }; - - await CreateApiResourceAsync("lingyun-abp-application", commonApiUserClaims); - } - - private async Task CreateApiResourceAsync(string name, IEnumerable claims, IEnumerable secrets = null) - { - var apiResource = await _apiResourceRepository.FindByNameAsync(name); - if (apiResource == null) - { - apiResource = await _apiResourceRepository.InsertAsync( - new ApiResource( - _guidGenerator.Create(), - name, - name + " API" - ), - autoSave: true - ); - } - - foreach (var claim in claims) - { - if (apiResource.FindClaim(claim) == null) - { - apiResource.AddUserClaim(claim); - } - } - if (secrets != null) - { - foreach (var secret in secrets) - { - if (apiResource.FindSecret(secret) == null) - { - apiResource.AddSecret(secret); - } - } - } - - return await _apiResourceRepository.UpdateAsync(apiResource); - } - - private async Task CreateApiScopeAsync(string name) - { - var apiScope = await _apiScopeRepository.GetByNameAsync(name); - if (apiScope == null) - { - apiScope = await _apiScopeRepository.InsertAsync( - new ApiScope( - _guidGenerator.Create(), - name, - name + " API" - ), - autoSave: true - ); - } - - return apiScope; - } - - private async Task CreateClientsAsync() - { - - string commonSecret = IdentityServer4.Models.HashExtensions.Sha256("1q2w3e*"); - - var commonScopes = new[] - { - "email", - "openid", - "profile", - "role", - "phone", - "address", - "offline_access" // 加上刷新, - - }; - - var configurationSection = _configuration.GetSection("IdentityServer:Clients"); - - //Web Client - var webClientId = configurationSection["AuthManagement:ClientId"]; - if (!webClientId.IsNullOrWhiteSpace()) - { - var webClientRootUrl = configurationSection["AuthManagement:RootUrl"].EnsureEndsWith('/'); - await CreateClientAsync( - webClientId, - commonScopes.Union(new[] { "lingyun-abp-application" }), - new[] { "hybrid" }, - commonSecret, - redirectUri: $"{webClientRootUrl}signin-oidc", - postLogoutRedirectUri: $"{webClientRootUrl}signout-callback-oidc", - corsOrigins: configurationSection["CorsOrigins"] - ); - } - - //Console Test Client - var consoleClientId = configurationSection["AuthVueAdmin:ClientId"]; - if (!consoleClientId.IsNullOrWhiteSpace()) - { - await CreateClientAsync( - consoleClientId, - commonScopes.Union(new[] { "lingyun-abp-application" }), - new[] { "password", "client_credentials" }, - commonSecret - ); - } - - //ApiGateway - var apigatewayClientId = configurationSection["AuthApiGateway:ClientId"]; - if (!apigatewayClientId.IsNullOrWhiteSpace()) - { - var apigatewayPermissions = new string[8] - { - "ApiGateway.Global", "ApiGateway.Global.Export", - "ApiGateway.Route", "ApiGateway.Route.Export", - "ApiGateway.DynamicRoute", "ApiGateway.DynamicRoute.Export", - "ApiGateway.AggregateRoute", "ApiGateway.AggregateRoute.Export", - }; - await CreateClientAsync( - apigatewayClientId, - commonScopes.Union(new[] { "lingyun-abp-application" }), - new[] { "client_credentials" }, - commonSecret, - permissions: apigatewayPermissions - ); - } - - // InternalService 内部服务间通讯客户端,必要的话需要在前端指定它拥有所有权限,当前项目仅预置用户查询权限 - var internalServiceClientId = configurationSection["InternalService:ClientId"]; - if (!internalServiceClientId.IsNullOrWhiteSpace()) - { - var internalServicePermissions = new string[2] - { - "AbpIdentity.UserLookup","AbpIdentity.Users" - }; - await CreateClientAsync( - internalServiceClientId, - commonScopes.Union(new[] { "lingyun-abp-application" }), - new[] { "client_credentials" }, - commonSecret, - permissions: internalServicePermissions - ); - } - } - - private async Task CreateClientAsync( - string name, - IEnumerable scopes, - IEnumerable grantTypes, - string secret, - string redirectUri = null, - string postLogoutRedirectUri = null, - IEnumerable permissions = null, - string corsOrigins = null) - { - var client = await _clientRepository.FindByClientIdAsync(name); - if (client == null) - { - client = await _clientRepository.InsertAsync( - new Client( - _guidGenerator.Create(), - name - ) - { - ClientName = name, - ProtocolType = "oidc", - Description = name, - AlwaysIncludeUserClaimsInIdToken = true, - AllowOfflineAccess = true, - AbsoluteRefreshTokenLifetime = 10800, //3 hours - AccessTokenLifetime = 7200, //2 hours - AuthorizationCodeLifetime = 300, - IdentityTokenLifetime = 300, - RequireConsent = false - }, - autoSave: true - ); - } - - foreach (var scope in scopes) - { - if (client.FindScope(scope) == null) - { - client.AddScope(scope); - } - } - - foreach (var grantType in grantTypes) - { - if (client.FindGrantType(grantType) == null) - { - client.AddGrantType(grantType); - } - } - - if (client.FindSecret(secret) == null) - { - client.AddSecret(secret); - } - - if (redirectUri != null) - { - if (client.FindRedirectUri(redirectUri) == null) - { - client.AddRedirectUri(redirectUri); - } - } - - if (postLogoutRedirectUri != null) - { - if (client.FindPostLogoutRedirectUri(postLogoutRedirectUri) == null) - { - client.AddPostLogoutRedirectUri(postLogoutRedirectUri); - } - } - - if (corsOrigins != null) - { - var corsOriginsSplit = corsOrigins.Split(";"); - foreach (var corsOrigin in corsOriginsSplit) - { - if (client.FindCorsOrigin(corsOrigin) == null) - { - client.AddCorsOrigin(corsOrigin); - } - } - } - - if(permissions != null) - { - await _permissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, name, permissions); - } - - return await _clientRepository.UpdateAsync(client); - } - } -} +using LINGYUN.Abp.IdentityServer; +using Microsoft.Extensions.Configuration; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Guids; +using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; +using Volo.Abp.IdentityServer.Clients; +using Volo.Abp.IdentityServer.IdentityResources; +using Volo.Abp.MultiTenancy; +using Volo.Abp.PermissionManagement; +using Volo.Abp.Uow; + +namespace AuthServer.DataSeeder +{ + public class IdentityServerDataSeedContributor : IDataSeedContributor, ITransientDependency + { + private readonly IApiResourceRepository _apiResourceRepository; + private readonly IApiScopeRepository _apiScopeRepository; + private readonly IClientRepository _clientRepository; + private readonly IIdentityResourceDataSeeder _identityResourceDataSeeder; + private readonly IWeChatResourceDataSeeder _weChatResourceDataSeeder; + private readonly IGuidGenerator _guidGenerator; + private readonly IPermissionDataSeeder _permissionDataSeeder; + private readonly IConfiguration _configuration; + private readonly ICurrentTenant _currentTenant; + + public IdentityServerDataSeedContributor( + IClientRepository clientRepository, + IApiScopeRepository apiScopeRepository, + IPermissionDataSeeder permissionDataSeeder, + IApiResourceRepository apiResourceRepository, + IWeChatResourceDataSeeder weChatResourceDataSeeder, + IIdentityResourceDataSeeder identityResourceDataSeeder, + IGuidGenerator guidGenerator, + ICurrentTenant currentTenant) + { + _currentTenant = currentTenant; + _clientRepository = clientRepository; + _permissionDataSeeder = permissionDataSeeder; + _apiScopeRepository = apiScopeRepository; + _apiResourceRepository = apiResourceRepository; + _weChatResourceDataSeeder = weChatResourceDataSeeder; + _identityResourceDataSeeder = identityResourceDataSeeder; + _guidGenerator = guidGenerator; + var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"; + var configuration = new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile($"appsettings.{env}.json", optional: false, reloadOnChange: true) + .AddEnvironmentVariables() + .Build(); + _configuration = configuration; + } + + [UnitOfWork] + public virtual async Task SeedAsync(DataSeedContext context) + { + using (_currentTenant.Change(context?.TenantId)) + { + await _identityResourceDataSeeder.CreateStandardResourcesAsync(); + await CreateWeChatClaimTypeAsync(); + await CreateApiResourcesAsync(); + await CreateApiScopesAsync(); + await CreateClientsAsync(); + } + } + + private async Task CreateWeChatClaimTypeAsync() + { + await _weChatResourceDataSeeder.CreateStandardResourcesAsync(); + } + + private async Task CreateApiScopesAsync() + { + await CreateApiScopeAsync("lingyun-abp-application"); + } + + private async Task CreateApiResourcesAsync() + { + var commonApiUserClaims = new[] + { + "email", + "email_verified", + "name", + "phone_number", + "phone_number_verified", + "role" + }; + + await CreateApiResourceAsync("lingyun-abp-application", commonApiUserClaims); + } + + private async Task CreateApiResourceAsync(string name, IEnumerable claims, IEnumerable secrets = null) + { + var apiResource = await _apiResourceRepository.FindByNameAsync(name); + if (apiResource == null) + { + apiResource = await _apiResourceRepository.InsertAsync( + new ApiResource( + _guidGenerator.Create(), + name, + name + " API" + ), + autoSave: true + ); + } + + foreach (var claim in claims) + { + if (apiResource.FindClaim(claim) == null) + { + apiResource.AddUserClaim(claim); + } + } + if (secrets != null) + { + foreach (var secret in secrets) + { + if (apiResource.FindSecret(secret) == null) + { + apiResource.AddSecret(secret); + } + } + } + + return await _apiResourceRepository.UpdateAsync(apiResource); + } + + private async Task CreateApiScopeAsync(string name) + { + var apiScope = await _apiScopeRepository.GetByNameAsync(name); + if (apiScope == null) + { + apiScope = await _apiScopeRepository.InsertAsync( + new ApiScope( + _guidGenerator.Create(), + name, + name + " API" + ), + autoSave: true + ); + } + + return apiScope; + } + + private async Task CreateClientsAsync() + { + + string commonSecret = IdentityServer4.Models.HashExtensions.Sha256("1q2w3e*"); + + var commonScopes = new[] + { + "email", + "openid", + "profile", + "role", + "phone", + "address", + "offline_access" // 加上刷新, + + }; + + var configurationSection = _configuration.GetSection("IdentityServer:Clients"); + + //Web Client + var webClientId = configurationSection["AuthManagement:ClientId"]; + if (!webClientId.IsNullOrWhiteSpace()) + { + var webClientRootUrl = configurationSection["AuthManagement:RootUrl"].EnsureEndsWith('/'); + await CreateClientAsync( + webClientId, + commonScopes.Union(new[] { "lingyun-abp-application" }), + new[] { "hybrid" }, + commonSecret, + redirectUri: $"{webClientRootUrl}signin-oidc", + postLogoutRedirectUri: $"{webClientRootUrl}signout-callback-oidc", + corsOrigins: configurationSection["CorsOrigins"] + ); + } + + //Console Test Client + var consoleClientId = configurationSection["AuthVueAdmin:ClientId"]; + if (!consoleClientId.IsNullOrWhiteSpace()) + { + await CreateClientAsync( + consoleClientId, + commonScopes.Union(new[] { "lingyun-abp-application" }), + new[] { "password", "client_credentials" }, + commonSecret + ); + } + + //ApiGateway + var apigatewayClientId = configurationSection["AuthApiGateway:ClientId"]; + if (!apigatewayClientId.IsNullOrWhiteSpace()) + { + var apigatewayPermissions = new string[8] + { + "ApiGateway.Global", "ApiGateway.Global.Export", + "ApiGateway.Route", "ApiGateway.Route.Export", + "ApiGateway.DynamicRoute", "ApiGateway.DynamicRoute.Export", + "ApiGateway.AggregateRoute", "ApiGateway.AggregateRoute.Export", + }; + await CreateClientAsync( + apigatewayClientId, + commonScopes.Union(new[] { "lingyun-abp-application" }), + new[] { "client_credentials" }, + commonSecret, + permissions: apigatewayPermissions + ); + } + + // InternalService 内部服务间通讯客户端,必要的话需要在前端指定它拥有所有权限,当前项目仅预置用户查询权限 + var internalServiceClientId = configurationSection["InternalService:ClientId"]; + if (!internalServiceClientId.IsNullOrWhiteSpace()) + { + var internalServicePermissions = new string[2] + { + "AbpIdentity.UserLookup","AbpIdentity.Users" + }; + await CreateClientAsync( + internalServiceClientId, + commonScopes.Union(new[] { "lingyun-abp-application" }), + new[] { "client_credentials" }, + commonSecret, + permissions: internalServicePermissions + ); + } + } + + private async Task CreateClientAsync( + string name, + IEnumerable scopes, + IEnumerable grantTypes, + string secret, + string redirectUri = null, + string postLogoutRedirectUri = null, + IEnumerable permissions = null, + string corsOrigins = null) + { + var client = await _clientRepository.FindByClientIdAsync(name); + if (client == null) + { + client = await _clientRepository.InsertAsync( + new Client( + _guidGenerator.Create(), + name + ) + { + ClientName = name, + ProtocolType = "oidc", + Description = name, + AlwaysIncludeUserClaimsInIdToken = true, + AllowOfflineAccess = true, + AbsoluteRefreshTokenLifetime = 10800, //3 hours + AccessTokenLifetime = 7200, //2 hours + AuthorizationCodeLifetime = 300, + IdentityTokenLifetime = 300, + RequireConsent = false + }, + autoSave: true + ); + } + + foreach (var scope in scopes) + { + if (client.FindScope(scope) == null) + { + client.AddScope(scope); + } + } + + foreach (var grantType in grantTypes) + { + if (client.FindGrantType(grantType) == null) + { + client.AddGrantType(grantType); + } + } + + if (client.FindSecret(secret) == null) + { + client.AddSecret(secret); + } + + if (redirectUri != null) + { + if (client.FindRedirectUri(redirectUri) == null) + { + client.AddRedirectUri(redirectUri); + } + } + + if (postLogoutRedirectUri != null) + { + if (client.FindPostLogoutRedirectUri(postLogoutRedirectUri) == null) + { + client.AddPostLogoutRedirectUri(postLogoutRedirectUri); + } + } + + if (corsOrigins != null) + { + var corsOriginsSplit = corsOrigins.Split(";"); + foreach (var corsOrigin in corsOriginsSplit) + { + if (client.FindCorsOrigin(corsOrigin) == null) + { + client.AddCorsOrigin(corsOrigin); + } + } + } + + if(permissions != null) + { + await _permissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, name, permissions); + } + + return await _clientRepository.UpdateAsync(client); + } + } +} diff --git a/aspnet-core/services/account/AuthServer.Host/DataSeeder/IdentityServerExtendUserDataSeedContributor.cs b/aspnet-core/services/account/AuthServer.Host/DataSeeder/IdentityServerExtendUserDataSeedContributor.cs new file mode 100644 index 000000000..7af4b5df0 --- /dev/null +++ b/aspnet-core/services/account/AuthServer.Host/DataSeeder/IdentityServerExtendUserDataSeedContributor.cs @@ -0,0 +1,113 @@ + +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Options; +using System.Threading.Tasks; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Guids; +using Volo.Abp.Identity; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; +using IdentityRole = Volo.Abp.Identity.IdentityRole; +using IdentityUser = Volo.Abp.Identity.IdentityUser; + +namespace AuthServer.DataSeeder +{ + public class IdentityServerExtendUserDataSeedContributor : IDataSeedContributor, ITransientDependency + { + public const string AdminEmailPropertyName = "AdminEmail"; + public const string AdminEmailDefaultValue = "vben@abp.io"; + public const string AdminPasswordPropertyName = "AdminPassword"; + public const string AdminPasswordDefaultValue = "1q2w3E*"; + public const string AdminRolePropertyName = "AdminRole"; + public const string AdminRoleDefaultValue = "vben-admin"; + + protected IGuidGenerator GuidGenerator { get; } + protected IIdentityRoleRepository RoleRepository { get; } + protected IIdentityUserRepository UserRepository { get; } + protected ILookupNormalizer LookupNormalizer { get; } + protected IdentityUserManager UserManager { get; } + protected IdentityRoleManager RoleManager { get; } + protected ICurrentTenant CurrentTenant { get; } + protected IOptions IdentityOptions { get; } + + public IdentityServerExtendUserDataSeedContributor( + IGuidGenerator guidGenerator, + IIdentityRoleRepository roleRepository, + IIdentityUserRepository userRepository, + ILookupNormalizer lookupNormalizer, + IdentityUserManager userManager, + IdentityRoleManager roleManager, + ICurrentTenant currentTenant, + IOptions identityOptions) + { + GuidGenerator = guidGenerator; + RoleRepository = roleRepository; + UserRepository = userRepository; + LookupNormalizer = lookupNormalizer; + UserManager = userManager; + RoleManager = roleManager; + CurrentTenant = currentTenant; + IdentityOptions = identityOptions; + } + + [UnitOfWork] + public virtual async Task SeedAsync(DataSeedContext context) + { + using (CurrentTenant.Change(context.TenantId)) + { + await IdentityOptions.SetAsync(); + + var result = new IdentityDataSeedResult(); + //"admin" user + const string adminUserName = "vben"; + var adminEmail = context?[AdminEmailPropertyName] as string ?? AdminEmailDefaultValue; + var adminPassword = context?[AdminPasswordPropertyName] as string ?? AdminPasswordDefaultValue; + + var adminUser = await UserRepository.FindByNormalizedUserNameAsync( + LookupNormalizer.NormalizeName(adminUserName) + ); + + if (adminUser != null) + { + return; + } + + adminUser = new IdentityUser( + GuidGenerator.Create(), + adminUserName, + adminEmail, + context.TenantId + ) + { + Name = adminUserName + }; + + (await UserManager.CreateAsync(adminUser, adminPassword, validatePassword: false)).CheckErrors(); + result.CreatedAdminUser = true; + + //"admin" role + var adminRoleName = context?[AdminRolePropertyName] as string ?? AdminRoleDefaultValue; + var adminRole = + await RoleRepository.FindByNormalizedNameAsync(LookupNormalizer.NormalizeName(adminRoleName)); + if (adminRole == null) + { + adminRole = new IdentityRole( + GuidGenerator.Create(), + adminRoleName, + context.TenantId + ) + { + IsStatic = true, + IsPublic = true + }; + + (await RoleManager.CreateAsync(adminRole)).CheckErrors(); + result.CreatedAdminRole = true; + } + + (await UserManager.AddToRoleAsync(adminUser, adminRoleName)).CheckErrors(); + } + } + } +} diff --git a/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/DataSeeder/VbenAdminDataSeedContributor.cs b/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/DataSeeder/VbenAdminDataSeedContributor.cs index 43263f412..81cac11a8 100644 --- a/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/DataSeeder/VbenAdminDataSeedContributor.cs +++ b/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/DataSeeder/VbenAdminDataSeedContributor.cs @@ -47,6 +47,19 @@ namespace LINGYUN.Platform.DataSeeder var layoutData = await SeedLayoutDataAsync(context.TenantId); var layout = await SeedDefaultLayoutAsync(layoutData, uiDataItem); + + // 首页数据 + await SeedHomeMenuAsync(layout, layoutData); + // 仪表盘 + await SeedDashboardMenuAsync(layout, layoutData); + // 管理菜单 + await SeedManageMenuAsync(layout, layoutData); + // Saas菜单 + await SeedSaasMenuAsync(layout, layoutData); + // 平台菜单 + await SeedPlatformMenuAsync(layout, layoutData); + // 网关菜单 + await SeedApiGatewayMenuAsync(layout, layoutData); } } @@ -226,6 +239,617 @@ namespace LINGYUN.Platform.DataSeeder return data; } + private async Task SeedHomeMenuAsync(Layout layout, Data data) + { + await SeedMenuAsync( + layout, + data, + "Vben Home", + "/home", + CodeNumberGenerator.CreateCode(20), + "/dashboard/welcome/index", + "Home", + "", + "Home", + null, + layout.TenantId, + new Dictionary() + { + { "title", "routes.dashboard.welcome" }, + { "icon", "ant-design:home-outlined" }, + { "hideTab", false }, + { "ignoreAuth", true }, + }, + isPublic: false); + } + + private async Task SeedDashboardMenuAsync(Layout layout, Data data) + { + var menu = await SeedMenuAsync( + layout, //layout + data, //data + "Vben Dashboard", //name + "/dashboard", //path + CodeNumberGenerator.CreateCode(21), //code + layout.Path, //component + "Dashboard", //displayName + "/dashboard/analysis", //redirect + "Dashboard", //description + null, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "routes.dashboard.welcome" }, + { "icon", "ant-design:home-outlined" }, + { "hideTab", false }, + { "ignoreAuth", true }, + }, + new string[] { "vben-admin" }); + + var analysis = await SeedMenuAsync( + layout, //layout + data, //data + "Analysis", //name + "/dashboard/analysis", //path + CodeNumberGenerator.AppendCode(menu.Code, CodeNumberGenerator.CreateCode(1)), //code + "/dashboard/analysis/index", //component + "Analysis", //displayName + "", //redirect + "Analysis", //description + menu.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "routes.dashboard.analysis" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + + var workbench = await SeedMenuAsync( + layout, //layout + data, //data + "Workbench", //name + "/dashboard/workbench", //path + CodeNumberGenerator.AppendCode(menu.Code, CodeNumberGenerator.CreateCode(2)), //code + "/dashboard/workbench/index", //component + "Workbench", //displayName + "", //redirect + "Workbench", //description + menu.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "routes.dashboard.workbench" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + } + + private async Task SeedManageMenuAsync(Layout layout, Data data) + { + var manage = await SeedMenuAsync( + layout, //layout + data, //data + "Manage", //name + "/manage", //path + CodeNumberGenerator.CreateCode(22), //code + layout.Path, //component + "Manage", //displayName + "", //redirect + "Manage", //description + null, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Manage" }, + { "icon", "ant-design:control-outlined" }, + { "hideTab", false }, + { "ignoreAuth", false }, + }, + new string[] { "vben-admin" }); + + var identity = await SeedMenuAsync( + layout, //layout + data, //data + "Identity", //name + "/manage/identity", //path + CodeNumberGenerator.AppendCode(manage.Code, CodeNumberGenerator.CreateCode(1)), //code + layout.Path, //component + "Identity", //displayName + "", //redirect + "Identity", //description + manage.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Identity" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + var user = await SeedMenuAsync( + layout, //layout + data, //data + "User", //name + "/manage/identity/user", //path + CodeNumberGenerator.AppendCode(identity.Code, CodeNumberGenerator.CreateCode(1)), //code + "/identity/user/index", //component + "User", //displayName + "", //redirect + "User", //description + identity.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Users" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + var role = await SeedMenuAsync( + layout, //layout + data, //data + "Role", //name + "/manage/identity/role", //path + CodeNumberGenerator.AppendCode(identity.Code, CodeNumberGenerator.CreateCode(2)), //code + "/identity/role/index", //component + "Role", //displayName + "", //redirect + "Role", //description + identity.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Roles" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + var claimTypes = await SeedMenuAsync( + layout, //layout + data, //data + "Claim", //name + "/manage/identity/claim-types", //path + CodeNumberGenerator.AppendCode(identity.Code, CodeNumberGenerator.CreateCode(3)), //code + "/identity/claim-types/index", //component + "Claim", //displayName + "", //redirect + "Claim", //description + identity.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Claim Types" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + var organizationUnits = await SeedMenuAsync( + layout, //layout + data, //data + "OrganizationUnits", //name + "/manage/identity/organization-units", //path + CodeNumberGenerator.AppendCode(identity.Code, CodeNumberGenerator.CreateCode(4)), //code + "/identity/organization-units/index", //component + "Organization Units", //displayName + "", //redirect + "Organization Units", //description + identity.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Organization Units" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + var securityLog = await SeedMenuAsync( + layout, //layout + data, //data + "SecurityLogs", //name + "/manage/identity/security-logs", //path + CodeNumberGenerator.AppendCode(identity.Code, CodeNumberGenerator.CreateCode(5)), //code + "/identity/security-logs/index", //component + "Security Logs", //displayName + "", //redirect + "Security Logs", //description + identity.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Security Logs" }, + { "icon", "" }, + { "hideTab", false }, + { "requiredFeatures", "AbpAuditing.Logging.SecurityLog" } // 此路由需要依赖安全日志特性 + }, + new string[] { "vben-admin" }); + + var auditLogs = await SeedMenuAsync( + layout, //layout + data, //data + "AuditLogs", //name + "/manage/audit-logs", //path + CodeNumberGenerator.AppendCode(manage.Code, CodeNumberGenerator.CreateCode(2)), //code + "/auditing/index", //component + "Audit Logs", //displayName + "", //redirect + "Audit Logs", //description + manage.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Audit Logs" }, + { "icon", "" }, + { "hideTab", false }, + { "requiredFeatures", "AbpAuditing.Logging.AuditLog" } // 此路由需要依赖审计日志特性 + }, + new string[] { "vben-admin" }); + + var settings = await SeedMenuAsync( + layout, //layout + data, //data + "Settings", //name + "/manage/settings", //path + CodeNumberGenerator.AppendCode(manage.Code, CodeNumberGenerator.CreateCode(3)), //code + "/sys/settings/index", //component + "Settings", //displayName + "", //redirect + "Settings", //description + manage.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Settings" }, + { "icon", "" }, + { "hideTab", false }, + { "requiredFeatures", "SettingManagement.Enable" } // 此路由需要依赖设置管理特性 + }, + new string[] { "vben-admin" }); + + var identityServer = await SeedMenuAsync( + layout, //layout + data, //data + "IdentityServer", //name + "/manage/identity-server", //path + CodeNumberGenerator.AppendCode(manage.Code, CodeNumberGenerator.CreateCode(4)), //code + layout.Path, //component + "Identity Server", //displayName + "", //redirect + "Identity Server", //description + manage.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Identity Server" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + var clients = await SeedMenuAsync( + layout, //layout + data, //data + "Clients", //name + "/manage/identity-server/clients", //path + CodeNumberGenerator.AppendCode(identityServer.Code, CodeNumberGenerator.CreateCode(1)), //code + "/identity-server/clients/index", //component + "Clients", //displayName + "", //redirect + "Clients", //description + identityServer.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Clients" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + var apiResource = await SeedMenuAsync( + layout, //layout + data, //data + "ApiResources", //name + "/manage/identity-server/api-resources", //path + CodeNumberGenerator.AppendCode(identityServer.Code, CodeNumberGenerator.CreateCode(2)), //code + "/identity-server/api-resources/index", //component + "Api Resources", //displayName + "", //redirect + "Api Resources", //description + identityServer.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Api Resources" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + var identityResources = await SeedMenuAsync( + layout, //layout + data, //data + "IdentityResources", //name + "/manage/identity-server/identity-resources", //path + CodeNumberGenerator.AppendCode(identityServer.Code, CodeNumberGenerator.CreateCode(3)), //code + "/identity-server/identity-resources/index", //component + "Identity Resources", //displayName + "", //redirect + "Identity Resources", //description + identityServer.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Identity Resources" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + var apiScopes = await SeedMenuAsync( + layout, //layout + data, //data + "ApiScopes", //name + "/manage/identity-server/api-scopes", //path + CodeNumberGenerator.AppendCode(identityServer.Code, CodeNumberGenerator.CreateCode(4)), //code + "/identity-server/api-scopes/index", //component + "Api Scopes", //displayName + "", //redirect + "Api Scopes", //description + identityServer.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Api Scopes" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + var persistedGrants = await SeedMenuAsync( + layout, //layout + data, //data + "PersistedGrants", //name + "/manage/identity-server/persisted-grants", //path + CodeNumberGenerator.AppendCode(identityServer.Code, CodeNumberGenerator.CreateCode(5)), //code + "/identity-server/persisted-grants/index", //component + "Persisted Grants", //displayName + "", //redirect + "Persisted Grants", //description + identityServer.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Persisted Grants" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + + } + + private async Task SeedSaasMenuAsync(Layout layout, Data data) + { + var saas = await SeedMenuAsync( + layout, //layout + data, //data + "Saas", //name + "/saas", //path + CodeNumberGenerator.CreateCode(23), //code + layout.Path, //component + "Saas", //displayName + "", //redirect + "Saas", //description + null, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Saas" }, + { "icon", "ant-design:cloud-server-outlined" }, + { "hideTab", false }, + { "ignoreAuth", false }, + }, + new string[] { "vben-admin" }); + var tenants = await SeedMenuAsync( + layout, //layout + data, //data + "Tenants", //name + "/saas/tenants", //path + CodeNumberGenerator.AppendCode(saas.Code, CodeNumberGenerator.CreateCode(1)), //code + "/saas/tenant/index", //component + "Tenants", //displayName + "", //redirect + "Tenants", //description + saas.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Tenants" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + } + + private async Task SeedPlatformMenuAsync(Layout layout, Data data) + { + var platform = await SeedMenuAsync( + layout, //layout + data, //data + "Platform", //name + "/platform", //path + CodeNumberGenerator.CreateCode(24), //code + layout.Path, //component + "Platform", //displayName + "", //redirect + "Platform", //description + null, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Platform" }, + { "icon", "" }, + { "hideTab", false }, + { "ignoreAuth", false }, + }, + new string[] { "vben-admin" }); + var dataDictionary = await SeedMenuAsync( + layout, //layout + data, //data + "DataDictionary", //name + "/platform/data-dic", //path + CodeNumberGenerator.AppendCode(platform.Code, CodeNumberGenerator.CreateCode(1)), //code + "/platform/dataDic/index", //component + "Data Dictionary", //displayName + "", //redirect + "Data Dictionary", //description + platform.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Data Dictionary" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + var layouts = await SeedMenuAsync( + layout, //layout + data, //data + "Layout", //name + "/platform/layout", //path + CodeNumberGenerator.AppendCode(platform.Code, CodeNumberGenerator.CreateCode(2)), //code + "/platform/layout/index", //component + "Layout", //displayName + "", //redirect + "Layout", //description + platform.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Layout" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + var menus = await SeedMenuAsync( + layout, //layout + data, //data + "Menu", //name + "/platform/menu", //path + CodeNumberGenerator.AppendCode(platform.Code, CodeNumberGenerator.CreateCode(3)), //code + "/platform/menu/index", //component + "Menu", //displayName + "", //redirect + "Menu", //description + platform.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Menu" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + } + + private async Task SeedApiGatewayMenuAsync(Layout layout, Data data) + { + var apiGateway = await SeedMenuAsync( + layout, //layout + data, //data + "ApiGateway", //name + "/api-gateway", //path + CodeNumberGenerator.CreateCode(25), //code + layout.Path, //component + "ApiGateway", //displayName + "", //redirect + "ApiGateway", //description + null, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "ApiGateway" }, + { "icon", "ant-design:gateway-outlined" }, + { "hideTab", false }, + { "ignoreAuth", false }, + }, + new string[] { "vben-admin" }); + var routeGroup = await SeedMenuAsync( + layout, //layout + data, //data + "RouteGroup", //name + "/api-gateway/group", //path + CodeNumberGenerator.AppendCode(apiGateway.Code, CodeNumberGenerator.CreateCode(1)), //code + "/api-gateway/group/index", //component + "Route Group", //displayName + "", //redirect + "Route Group", //description + apiGateway.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Route Group" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + var global = await SeedMenuAsync( + layout, //layout + data, //data + "GlobalConfiguration", //name + "/api-gateway/global", //path + CodeNumberGenerator.AppendCode(apiGateway.Code, CodeNumberGenerator.CreateCode(2)), //code + "/api-gateway/global/index", //component + "Global Configuration", //displayName + "", //redirect + "Global Configuration", //description + apiGateway.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Global Configuration" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + var route = await SeedMenuAsync( + layout, //layout + data, //data + "Route", //name + "/api-gateway/route", //path + CodeNumberGenerator.AppendCode(apiGateway.Code, CodeNumberGenerator.CreateCode(3)), //code + "/api-gateway/route/index", //component + "Route", //displayName + "", //redirect + "Route", //description + apiGateway.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Route" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + var aggregate = await SeedMenuAsync( + layout, //layout + data, //data + "AggregateRoute", //name + "/api-gateway/aggregate", //path + CodeNumberGenerator.AppendCode(apiGateway.Code, CodeNumberGenerator.CreateCode(4)), //code + "/api-gateway/aggregate/index", //component + "Aggregate Route", //displayName + "", //redirect + "Aggregate Route", //description + apiGateway.Id, //parentId + layout.TenantId, //tenantId + new Dictionary() //meta + { + { "title", "Aggregate Route" }, + { "icon", "" }, + { "hideTab", false }, + }, + new string[] { "vben-admin" }); + } + + private async Task SeedMenuAsync( Layout layout, Data data,