Browse Source

Merge pull request #308 from colinin/4.4

feat: preset vben-admin seed data
pull/364/head
yx lin 4 years ago
committed by GitHub
parent
commit
103619200b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 658
      aspnet-core/services/account/AuthServer.Host/DataSeeder/IdentityServerDataSeedContributor.cs
  2. 113
      aspnet-core/services/account/AuthServer.Host/DataSeeder/IdentityServerExtendUserDataSeedContributor.cs
  3. 624
      aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/DataSeeder/VbenAdminDataSeedContributor.cs

658
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<ApiResource> CreateApiResourceAsync(string name, IEnumerable<string> claims, IEnumerable<string> 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<ApiScope> 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<Client> CreateClientAsync(
string name,
IEnumerable<string> scopes,
IEnumerable<string> grantTypes,
string secret,
string redirectUri = null,
string postLogoutRedirectUri = null,
IEnumerable<string> 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<ApiResource> CreateApiResourceAsync(string name, IEnumerable<string> claims, IEnumerable<string> 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<ApiScope> 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<Client> CreateClientAsync(
string name,
IEnumerable<string> scopes,
IEnumerable<string> grantTypes,
string secret,
string redirectUri = null,
string postLogoutRedirectUri = null,
IEnumerable<string> 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);
}
}
}

113
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> IdentityOptions { get; }
public IdentityServerExtendUserDataSeedContributor(
IGuidGenerator guidGenerator,
IIdentityRoleRepository roleRepository,
IIdentityUserRepository userRepository,
ILookupNormalizer lookupNormalizer,
IdentityUserManager userManager,
IdentityRoleManager roleManager,
ICurrentTenant currentTenant,
IOptions<IdentityOptions> 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();
}
}
}
}

624
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<string, object>()
{
{ "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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //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<string, object>() //meta
{
{ "title", "Aggregate Route" },
{ "icon", "" },
{ "hideTab", false },
},
new string[] { "vben-admin" });
}
private async Task<Menu> SeedMenuAsync(
Layout layout,
Data data,

Loading…
Cancel
Save