mirror of https://github.com/abpframework/abp.git
committed by
GitHub
2526 changed files with 526953 additions and 2755 deletions
@ -0,0 +1,87 @@ |
|||
using System; |
|||
using System.Linq; |
|||
using Volo.Abp.Cli.ProjectBuilding.Files; |
|||
|
|||
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps; |
|||
|
|||
public class AppNoLayersDatabaseManagementSystemChangeStep : ProjectBuildPipelineStep |
|||
{ |
|||
public override void Execute(ProjectBuildContext context) |
|||
{ |
|||
switch (context.BuildArgs.DatabaseManagementSystem) |
|||
{ |
|||
case DatabaseManagementSystem.MySQL: |
|||
ChangeEntityFrameworkCoreDependency(context, "Volo.Abp.EntityFrameworkCore.MySQL", |
|||
"Volo.Abp.EntityFrameworkCore.MySQL", |
|||
"AbpEntityFrameworkCoreMySQLModule"); |
|||
AddMySqlServerVersion(context); |
|||
ChangeUseSqlServer(context, "UseMySQL", "UseMySql"); |
|||
break; |
|||
|
|||
case DatabaseManagementSystem.PostgreSQL: |
|||
ChangeEntityFrameworkCoreDependency(context, "Volo.Abp.EntityFrameworkCore.PostgreSql", |
|||
"Volo.Abp.EntityFrameworkCore.PostgreSql", |
|||
"AbpEntityFrameworkCorePostgreSqlModule"); |
|||
ChangeUseSqlServer(context, "UseNpgsql"); |
|||
break; |
|||
|
|||
case DatabaseManagementSystem.Oracle: |
|||
ChangeEntityFrameworkCoreDependency(context, "Volo.Abp.EntityFrameworkCore.Oracle", |
|||
"Volo.Abp.EntityFrameworkCore.Oracle", |
|||
"AbpEntityFrameworkCoreOracleModule"); |
|||
ChangeUseSqlServer(context, "UseOracle"); |
|||
break; |
|||
|
|||
case DatabaseManagementSystem.OracleDevart: |
|||
ChangeEntityFrameworkCoreDependency(context, "Volo.Abp.EntityFrameworkCore.Oracle.Devart", |
|||
"Volo.Abp.EntityFrameworkCore.Oracle.Devart", |
|||
"AbpEntityFrameworkCoreOracleDevartModule"); |
|||
ChangeUseSqlServer(context, "UseOracle"); |
|||
break; |
|||
|
|||
case DatabaseManagementSystem.SQLite: |
|||
ChangeEntityFrameworkCoreDependency(context, "Volo.Abp.EntityFrameworkCore.Sqlite", |
|||
"Volo.Abp.EntityFrameworkCore.Sqlite", |
|||
"AbpEntityFrameworkCoreSqliteModule"); |
|||
ChangeUseSqlServer(context, "UseSqlite"); |
|||
break; |
|||
|
|||
default: |
|||
return; |
|||
} |
|||
} |
|||
|
|||
private void AddMySqlServerVersion(ProjectBuildContext context) |
|||
{ |
|||
var dbContextFactoryFile = context.Files.FirstOrDefault(f => f.Name.EndsWith("DbContextFactory.cs", StringComparison.OrdinalIgnoreCase)); |
|||
|
|||
dbContextFactoryFile?.ReplaceText("configuration.GetConnectionString(\"Default\")", |
|||
"configuration.GetConnectionString(\"Default\"), MySqlServerVersion.LatestSupportedServerVersion"); |
|||
} |
|||
|
|||
private void ChangeEntityFrameworkCoreDependency(ProjectBuildContext context, string newPackageName, string newModuleNamespace, string newModuleClass) |
|||
{ |
|||
var projectFile = context.Files.FirstOrDefault(f => f.Name.EndsWith(".csproj", StringComparison.OrdinalIgnoreCase)); |
|||
projectFile?.ReplaceText("Volo.Abp.EntityFrameworkCore.SqlServer", newPackageName); |
|||
|
|||
var moduleClass = context.Files.FirstOrDefault(f => f.Name.EndsWith("Module.cs", StringComparison.OrdinalIgnoreCase)); |
|||
moduleClass?.ReplaceText("Volo.Abp.EntityFrameworkCore.SqlServer", newModuleNamespace); |
|||
moduleClass?.ReplaceText("AbpEntityFrameworkCoreSqlServerModule", newModuleClass); |
|||
} |
|||
|
|||
private void ChangeUseSqlServer(ProjectBuildContext context, string newUseMethodForEfModule, string newUseMethodForDbContext = null) |
|||
{ |
|||
if (newUseMethodForDbContext == null) |
|||
{ |
|||
newUseMethodForDbContext = newUseMethodForEfModule; |
|||
} |
|||
|
|||
var oldUseMethod = "UseSqlServer"; |
|||
|
|||
var moduleClass = context.Files.FirstOrDefault(f => f.Name.EndsWith("Module.cs", StringComparison.OrdinalIgnoreCase)); |
|||
moduleClass?.ReplaceText(oldUseMethod, newUseMethodForEfModule); |
|||
|
|||
var dbContextFactoryFile = context.Files.FirstOrDefault(f => f.Name.EndsWith("DbContextFactory.cs", StringComparison.OrdinalIgnoreCase)); |
|||
dbContextFactoryFile?.ReplaceText(oldUseMethod, newUseMethodForDbContext); |
|||
} |
|||
} |
|||
@ -0,0 +1,51 @@ |
|||
using System; |
|||
using System.Linq; |
|||
|
|||
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps; |
|||
|
|||
public class ProjectRenameStep : ProjectBuildPipelineStep |
|||
{ |
|||
private readonly string _oldName; |
|||
private readonly string _newName; |
|||
|
|||
public ProjectRenameStep(string oldName, string newName) |
|||
{ |
|||
_oldName = oldName; |
|||
_newName = newName; |
|||
} |
|||
|
|||
public override void Execute(ProjectBuildContext context) |
|||
{ |
|||
var csprojFiles = context.Files.Where(f => f.Name.EndsWith(".csproj")); |
|||
foreach (var file in csprojFiles) |
|||
{ |
|||
if (file.Name.Contains(_oldName)) |
|||
{ |
|||
file.SetName(file.Name.Replace(_oldName, _newName)); |
|||
} |
|||
} |
|||
|
|||
var slnFiles = context.Files.Where(f => f.Name.EndsWith(".sln")); |
|||
foreach (var file in slnFiles) |
|||
{ |
|||
file.NormalizeLineEndings(); |
|||
var lines = file.GetLines(); |
|||
|
|||
for (var i = 0; i < lines.Length; i++) |
|||
{ |
|||
if (lines[i].Contains(_oldName)) |
|||
{ |
|||
lines[i] = lines[i].Replace(_oldName, _newName); |
|||
} |
|||
} |
|||
file.SetLines(lines); |
|||
} |
|||
|
|||
var directoryFiles = context.Files.Where(f => f.Name.Contains(_oldName)); |
|||
foreach (var file in directoryFiles) |
|||
{ |
|||
file.SetName(file.Name.Replace(_oldName, _newName)); |
|||
} |
|||
} |
|||
|
|||
} |
|||
@ -1,25 +0,0 @@ |
|||
|
|||
Microsoft Visual Studio Solution File, Format Version 12.00 |
|||
# Visual Studio Version 17 |
|||
VisualStudioVersion = 17.0.31903.59 |
|||
MinimumVisualStudioVersion = 10.0.40219.1 |
|||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyCompanyName.MyProjectName", "MyCompanyName.MyProjectName\MyCompanyName.MyProjectName.csproj", "{64430A23-E2E0-471D-B9F9-31E4E4C834E8}" |
|||
EndProject |
|||
Global |
|||
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
|||
Debug|Any CPU = Debug|Any CPU |
|||
Release|Any CPU = Release|Any CPU |
|||
EndGlobalSection |
|||
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
|||
{64430A23-E2E0-471D-B9F9-31E4E4C834E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{64430A23-E2E0-471D-B9F9-31E4E4C834E8}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{64430A23-E2E0-471D-B9F9-31E4E4C834E8}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{64430A23-E2E0-471D-B9F9-31E4E4C834E8}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
EndGlobalSection |
|||
GlobalSection(SolutionProperties) = preSolution |
|||
HideSolutionNode = FALSE |
|||
EndGlobalSection |
|||
GlobalSection(ExtensibilityGlobals) = postSolution |
|||
SolutionGuid = {63E2660C-C1D9-4768-90FD-289F36581842} |
|||
EndGlobalSection |
|||
EndGlobal |
|||
@ -1,88 +0,0 @@ |
|||
using Microsoft.Extensions.Logging.Abstractions; |
|||
using Volo.Abp.Data; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Identity; |
|||
using Volo.Abp.MultiTenancy; |
|||
using Volo.Abp.TenantManagement; |
|||
|
|||
namespace MyCompanyName.MyProjectName.Data; |
|||
|
|||
public class MyProjectNameDbMigrationService : ITransientDependency |
|||
{ |
|||
public ILogger<MyProjectNameDbMigrationService> Logger { get; set; } |
|||
|
|||
private readonly IDataSeeder _dataSeeder; |
|||
private readonly MyProjectNameEFCoreDbSchemaMigrator _dbSchemaMigrator; |
|||
private readonly ITenantRepository _tenantRepository; |
|||
private readonly ICurrentTenant _currentTenant; |
|||
|
|||
public MyProjectNameDbMigrationService( |
|||
IDataSeeder dataSeeder, |
|||
MyProjectNameEFCoreDbSchemaMigrator dbSchemaMigrator, |
|||
ITenantRepository tenantRepository, |
|||
ICurrentTenant currentTenant) |
|||
{ |
|||
_dataSeeder = dataSeeder; |
|||
_dbSchemaMigrator = dbSchemaMigrator; |
|||
_tenantRepository = tenantRepository; |
|||
_currentTenant = currentTenant; |
|||
|
|||
Logger = NullLogger<MyProjectNameDbMigrationService>.Instance; |
|||
} |
|||
|
|||
public async Task MigrateAsync() |
|||
{ |
|||
Logger.LogInformation("Started database migrations..."); |
|||
|
|||
await MigrateDatabaseSchemaAsync(); |
|||
await SeedDataAsync(); |
|||
|
|||
Logger.LogInformation($"Successfully completed host database migrations."); |
|||
|
|||
var tenants = await _tenantRepository.GetListAsync(includeDetails: true); |
|||
|
|||
var migratedDatabaseSchemas = new HashSet<string>(); |
|||
foreach (var tenant in tenants) |
|||
{ |
|||
using (_currentTenant.Change(tenant.Id)) |
|||
{ |
|||
if (tenant.ConnectionStrings.Any()) |
|||
{ |
|||
var tenantConnectionStrings = tenant.ConnectionStrings |
|||
.Select(x => x.Value) |
|||
.ToList(); |
|||
|
|||
if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings)) |
|||
{ |
|||
await MigrateDatabaseSchemaAsync(tenant); |
|||
|
|||
migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings); |
|||
} |
|||
} |
|||
|
|||
await SeedDataAsync(tenant); |
|||
} |
|||
|
|||
Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations."); |
|||
} |
|||
|
|||
Logger.LogInformation("Successfully completed all database migrations."); |
|||
Logger.LogInformation("You can safely end this process..."); |
|||
} |
|||
|
|||
private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null) |
|||
{ |
|||
Logger.LogInformation($"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); |
|||
await _dbSchemaMigrator.MigrateAsync(); |
|||
} |
|||
|
|||
private async Task SeedDataAsync(Tenant tenant = null) |
|||
{ |
|||
Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); |
|||
|
|||
await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id) |
|||
.WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, IdentityDataSeedContributor.AdminEmailDefaultValue) |
|||
.WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, IdentityDataSeedContributor.AdminPasswordDefaultValue) |
|||
); |
|||
} |
|||
} |
|||
@ -1,106 +0,0 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk.Web"> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net6.0</TargetFramework> |
|||
<Nullable>enable</Nullable> |
|||
<ImplicitUsings>enable</ImplicitUsings> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Serilog.AspNetCore" Version="4.1.0" /> |
|||
<PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\framework\src\Volo.Abp.AspNetCore.Mvc\Volo.Abp.AspNetCore.Mvc.csproj" /> |
|||
<ProjectReference Include="..\..\..\framework\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" /> |
|||
<ProjectReference Include="..\..\..\framework\src\Volo.Abp.AutoMapper\Volo.Abp.AutoMapper.csproj" /> |
|||
<ProjectReference Include="..\..\..\framework\src\Volo.Abp.Swashbuckle\Volo.Abp.Swashbuckle.csproj" /> |
|||
<ProjectReference Include="..\..\..\framework\src\Volo.Abp.AspNetCore.Authentication.JwtBearer\Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj" /> |
|||
<ProjectReference Include="..\..\..\framework\src\Volo.Abp.AspNetCore.Serilog\Volo.Abp.AspNetCore.Serilog.csproj" /> |
|||
<ProjectReference Include="..\..\..\framework\src\Volo.Abp.EntityFrameworkCore.SqlServer\Volo.Abp.EntityFrameworkCore.SqlServer.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\modules\account\src\Volo.Abp.Account.Application\Volo.Abp.Account.Application.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\account\src\Volo.Abp.Account.HttpApi\Volo.Abp.Account.HttpApi.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\account\src\Volo.Abp.Account.Web.IdentityServer\Volo.Abp.Account.Web.IdentityServer.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\modules\identity\src\Volo.Abp.PermissionManagement.Domain.Identity\Volo.Abp.PermissionManagement.Domain.Identity.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\identity\src\Volo.Abp.Identity.Application\Volo.Abp.Identity.Application.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\identity\src\Volo.Abp.Identity.HttpApi\Volo.Abp.Identity.HttpApi.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\identity\src\Volo.Abp.Identity.EntityFrameworkCore\Volo.Abp.Identity.EntityFrameworkCore.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\identityserver\src\Volo.Abp.IdentityServer.EntityFrameworkCore\Volo.Abp.IdentityServer.EntityFrameworkCore.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\identity\src\Volo.Abp.Identity.Web\Volo.Abp.Identity.Web.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\modules\permission-management\src\Volo.Abp.PermissionManagement.Application\Volo.Abp.PermissionManagement.Application.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\permission-management\src\Volo.Abp.PermissionManagement.EntityFrameworkCore\Volo.Abp.PermissionManagement.EntityFrameworkCore.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\permission-management\src\Volo.Abp.PermissionManagement.HttpApi\Volo.Abp.PermissionManagement.HttpApi.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\modules\tenant-management\src\Volo.Abp.TenantManagement.Application\Volo.Abp.TenantManagement.Application.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\tenant-management\src\Volo.Abp.TenantManagement.EntityFrameworkCore\Volo.Abp.TenantManagement.EntityFrameworkCore.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\tenant-management\src\Volo.Abp.TenantManagement.HttpApi\Volo.Abp.TenantManagement.HttpApi.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\tenant-management\src\Volo.Abp.TenantManagement.Web\Volo.Abp.TenantManagement.Web.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\modules\feature-management\src\Volo.Abp.Featuremanagement.Application\Volo.Abp.Featuremanagement.Application.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\feature-management\src\Volo.Abp.Featuremanagement.EntityFrameworkCore\Volo.Abp.Featuremanagement.EntityFrameworkCore.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\feature-management\src\Volo.Abp.Featuremanagement.HttpApi\Volo.Abp.Featuremanagement.HttpApi.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\feature-management\src\Volo.Abp.Featuremanagement.Web\Volo.Abp.Featuremanagement.Web.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\modules\setting-management\src\Volo.Abp.SettingManagement.Application\Volo.Abp.SettingManagement.Application.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\setting-management\src\Volo.Abp.SettingManagement.EntityFrameworkCore\Volo.Abp.SettingManagement.EntityFrameworkCore.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\setting-management\src\Volo.Abp.SettingManagement.HttpApi\Volo.Abp.SettingManagement.HttpApi.csproj" /> |
|||
<ProjectReference Include="..\..\..\modules\setting-management\src\Volo.Abp.SettingManagement.Web\Volo.Abp.SettingManagement.Web.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\modules\audit-logging\src\Volo.Abp.AuditLogging.EntityFrameworkCore\Volo.Abp.AuditLogging.EntityFrameworkCore.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="6.0.1" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.1"> |
|||
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> |
|||
<PrivateAssets>compile; contentFiles; build; buildMultitargeting; buildTransitive; analyzers; native</PrivateAssets> |
|||
</PackageReference> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<Content Remove="Localization\MyProjectName\*.json" /> |
|||
<EmbeddedResource Include="Localization\MyProjectName\*.json" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<Compile Remove="Logs\**" /> |
|||
<Content Remove="Logs\**" /> |
|||
<EmbeddedResource Remove="Logs\**" /> |
|||
<None Remove="Logs\**" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<None Update="Pages\**\*.js"> |
|||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> |
|||
</None> |
|||
<None Update="Pages\**\*.css"> |
|||
<CopyToOutputDirectory>Always</CopyToOutputDirectory> |
|||
</None> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
@ -1,2 +0,0 @@ |
|||
using System.Runtime.CompilerServices; |
|||
[assembly:InternalsVisibleToAttribute("MyCompanyName.MyProjectName.Web.Tests")] |
|||
File diff suppressed because it is too large
@ -0,0 +1,17 @@ |
|||
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. |
|||
# For additional information regarding the format and rule options, please see: |
|||
# https://github.com/browserslist/browserslist#queries |
|||
|
|||
# For the full list of supported browsers by the Angular framework, please see: |
|||
# https://angular.io/guide/browser-support |
|||
|
|||
# You can see what browsers were selected by your queries by running: |
|||
# npx browserslist |
|||
|
|||
last 1 Chrome version |
|||
last 1 Firefox version |
|||
last 2 Edge major versions |
|||
last 2 Safari major versions |
|||
last 2 iOS major versions |
|||
Firefox ESR |
|||
not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. |
|||
@ -0,0 +1,16 @@ |
|||
# Editor configuration, see https://editorconfig.org |
|||
root = true |
|||
|
|||
[*] |
|||
charset = utf-8 |
|||
indent_style = space |
|||
indent_size = 2 |
|||
insert_final_newline = true |
|||
trim_trailing_whitespace = true |
|||
|
|||
[*.ts] |
|||
quote_type = single |
|||
|
|||
[*.md] |
|||
max_line_length = off |
|||
trim_trailing_whitespace = false |
|||
@ -0,0 +1,50 @@ |
|||
{ |
|||
"root": true, |
|||
"ignorePatterns": [ |
|||
"projects/**/*" |
|||
], |
|||
"overrides": [ |
|||
{ |
|||
"files": [ |
|||
"*.ts" |
|||
], |
|||
"parserOptions": { |
|||
"project": [ |
|||
"tsconfig.json" |
|||
], |
|||
"createDefaultProgram": true |
|||
}, |
|||
"extends": [ |
|||
"plugin:@angular-eslint/recommended", |
|||
"plugin:@angular-eslint/template/process-inline-templates" |
|||
], |
|||
"rules": { |
|||
"@angular-eslint/directive-selector": [ |
|||
"error", |
|||
{ |
|||
"type": "attribute", |
|||
"prefix": "app", |
|||
"style": "camelCase" |
|||
} |
|||
], |
|||
"@angular-eslint/component-selector": [ |
|||
"error", |
|||
{ |
|||
"type": "element", |
|||
"prefix": "app", |
|||
"style": "kebab-case" |
|||
} |
|||
] |
|||
} |
|||
}, |
|||
{ |
|||
"files": [ |
|||
"*.html" |
|||
], |
|||
"extends": [ |
|||
"plugin:@angular-eslint/template/recommended" |
|||
], |
|||
"rules": {} |
|||
} |
|||
] |
|||
} |
|||
@ -0,0 +1,46 @@ |
|||
# See http://help.github.com/ignore-files/ for more about ignoring files. |
|||
|
|||
# compiled output |
|||
/dist |
|||
/tmp |
|||
/out-tsc |
|||
# Only exists if Bazel was run |
|||
/bazel-out |
|||
|
|||
# dependencies |
|||
/node_modules |
|||
|
|||
# profiling files |
|||
chrome-profiler-events*.json |
|||
|
|||
# IDEs and editors |
|||
/.idea |
|||
.project |
|||
.classpath |
|||
.c9/ |
|||
*.launch |
|||
.settings/ |
|||
*.sublime-workspace |
|||
|
|||
# IDE - VSCode |
|||
.vscode/* |
|||
!.vscode/settings.json |
|||
!.vscode/tasks.json |
|||
!.vscode/launch.json |
|||
!.vscode/extensions.json |
|||
.history/* |
|||
|
|||
# misc |
|||
/.angular/cache |
|||
/.sass-cache |
|||
/connect.lock |
|||
/coverage |
|||
/libpeerconnection.log |
|||
npm-debug.log |
|||
yarn-error.log |
|||
testem.log |
|||
/typings |
|||
|
|||
# System Files |
|||
.DS_Store |
|||
Thumbs.db |
|||
@ -0,0 +1,5 @@ |
|||
{ |
|||
"singleQuote": true, |
|||
"printWidth": 100, |
|||
"arrowParens": "avoid" |
|||
} |
|||
@ -0,0 +1,15 @@ |
|||
{ |
|||
"recommendations": [ |
|||
"angular.ng-template", |
|||
"esbenp.prettier-vscode", |
|||
"ms-vscode.vscode-typescript-tslint-plugin", |
|||
"visualstudioexptteam.vscodeintellicode", |
|||
"christian-kohler.path-intellisense", |
|||
"christian-kohler.npm-intellisense", |
|||
"Mikael.Angular-BeastCode", |
|||
"xabikos.JavaScriptSnippets", |
|||
"msjsdiag.debugger-for-chrome", |
|||
"donjayamanne.githistory", |
|||
"oderwat.indent-rainbow" |
|||
] |
|||
} |
|||
@ -0,0 +1,27 @@ |
|||
# MyProjectName |
|||
|
|||
This is a startup project based on the ABP framework. For more information, visit <a href="https://abp.io/" target="_blank">abp.io</a> |
|||
|
|||
## Development server |
|||
|
|||
Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. |
|||
|
|||
## Code scaffolding |
|||
|
|||
Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. |
|||
|
|||
## Build |
|||
|
|||
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. |
|||
|
|||
## Running unit tests |
|||
|
|||
Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). |
|||
|
|||
## Running end-to-end tests |
|||
|
|||
Run `ng e2e` to execute the end-to-end tests via a platform of your choice. |
|||
|
|||
## Further help |
|||
|
|||
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. |
|||
@ -0,0 +1,146 @@ |
|||
{ |
|||
"$schema": "./node_modules/@angular/cli/lib/config/schema.json", |
|||
"cli": { |
|||
"analytics": false, |
|||
"defaultCollection": "@angular-eslint/schematics" |
|||
}, |
|||
"version": 1, |
|||
"newProjectRoot": "projects", |
|||
"projects": { |
|||
"MyProjectName": { |
|||
"projectType": "application", |
|||
"schematics": { |
|||
"@schematics/angular:component": { |
|||
"style": "scss" |
|||
} |
|||
}, |
|||
"root": "", |
|||
"sourceRoot": "src", |
|||
"prefix": "app", |
|||
"architect": { |
|||
"build": { |
|||
"builder": "@angular-devkit/build-angular:browser", |
|||
"options": { |
|||
"outputPath": "dist/MyProjectName", |
|||
"index": "src/index.html", |
|||
"main": "src/main.ts", |
|||
"polyfills": "src/polyfills.ts", |
|||
"tsConfig": "tsconfig.app.json", |
|||
"inlineStyleLanguage": "scss", |
|||
"allowedCommonJsDependencies": ["chart.js", "js-sha256"], |
|||
"assets": ["src/favicon.ico", "src/assets"], |
|||
"styles": [ |
|||
{ |
|||
"input": "node_modules/@fortawesome/fontawesome-free/css/all.min.css", |
|||
"inject": true, |
|||
"bundleName": "fontawesome-all.min" |
|||
}, |
|||
{ |
|||
"input": "node_modules/@fortawesome/fontawesome-free/css/v4-shims.min.css", |
|||
"inject": true, |
|||
"bundleName": "fontawesome-v4-shims.min" |
|||
}, |
|||
{ |
|||
"input": "node_modules/@swimlane/ngx-datatable/index.css", |
|||
"inject": true, |
|||
"bundleName": "ngx-datatable-index" |
|||
}, |
|||
{ |
|||
"input": "node_modules/@swimlane/ngx-datatable/assets/icons.css", |
|||
"inject": true, |
|||
"bundleName": "ngx-datatable-icons" |
|||
}, |
|||
{ |
|||
"input": "node_modules/@swimlane/ngx-datatable/themes/material.css", |
|||
"inject": true, |
|||
"bundleName": "ngx-datatable-material" |
|||
}, |
|||
{ |
|||
"input": "node_modules/bootstrap/dist/css/bootstrap.rtl.min.css", |
|||
"inject": false, |
|||
"bundleName": "bootstrap-rtl.min" |
|||
}, |
|||
{ |
|||
"input": "node_modules/bootstrap/dist/css/bootstrap.min.css", |
|||
"inject": true, |
|||
"bundleName": "bootstrap-ltr.min" |
|||
}, |
|||
"src/styles.scss" |
|||
], |
|||
"scripts": [] |
|||
}, |
|||
"configurations": { |
|||
"production": { |
|||
"budgets": [ |
|||
{ |
|||
"type": "initial", |
|||
"maximumWarning": "2mb", |
|||
"maximumError": "2.5mb" |
|||
}, |
|||
{ |
|||
"type": "anyComponentStyle", |
|||
"maximumWarning": "2kb", |
|||
"maximumError": "4kb" |
|||
} |
|||
], |
|||
"fileReplacements": [ |
|||
{ |
|||
"replace": "src/environments/environment.ts", |
|||
"with": "src/environments/environment.prod.ts" |
|||
} |
|||
], |
|||
"outputHashing": "all" |
|||
}, |
|||
"development": { |
|||
"buildOptimizer": false, |
|||
"optimization": false, |
|||
"vendorChunk": true, |
|||
"extractLicenses": false, |
|||
"sourceMap": true, |
|||
"namedChunks": true |
|||
} |
|||
}, |
|||
"defaultConfiguration": "production" |
|||
}, |
|||
"serve": { |
|||
"builder": "@angular-devkit/build-angular:dev-server", |
|||
"configurations": { |
|||
"production": { |
|||
"browserTarget": "MyProjectName:build:production" |
|||
}, |
|||
"development": { |
|||
"browserTarget": "MyProjectName:build:development" |
|||
} |
|||
}, |
|||
"defaultConfiguration": "development" |
|||
}, |
|||
"extract-i18n": { |
|||
"builder": "@angular-devkit/build-angular:extract-i18n", |
|||
"options": { |
|||
"browserTarget": "MyProjectName:build" |
|||
} |
|||
}, |
|||
"test": { |
|||
"builder": "@angular-devkit/build-angular:karma", |
|||
"options": { |
|||
"main": "src/test.ts", |
|||
"polyfills": "src/polyfills.ts", |
|||
"tsConfig": "tsconfig.spec.json", |
|||
"karmaConfig": "karma.conf.js", |
|||
"inlineStyleLanguage": "scss", |
|||
"assets": ["src/favicon.ico", "src/assets"], |
|||
"styles": ["src/styles.scss"], |
|||
"scripts": [] |
|||
} |
|||
}, |
|||
"lint": { |
|||
"builder": "@angular-eslint/builder:lint", |
|||
"options": { |
|||
"lintFilePatterns": ["src/**/*.ts", "src/**/*.html"] |
|||
} |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
"defaultProject": "MyProjectName" |
|||
} |
|||
@ -0,0 +1,44 @@ |
|||
// Karma configuration file, see link for more information
|
|||
// https://karma-runner.github.io/1.0/config/configuration-file.html
|
|||
|
|||
module.exports = function (config) { |
|||
config.set({ |
|||
basePath: '', |
|||
frameworks: ['jasmine', '@angular-devkit/build-angular'], |
|||
plugins: [ |
|||
require('karma-jasmine'), |
|||
require('karma-chrome-launcher'), |
|||
require('karma-jasmine-html-reporter'), |
|||
require('karma-coverage'), |
|||
require('@angular-devkit/build-angular/plugins/karma') |
|||
], |
|||
client: { |
|||
jasmine: { |
|||
// you can add configuration options for Jasmine here
|
|||
// the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
|
|||
// for example, you can disable the random execution with `random: false`
|
|||
// or set a specific seed with `seed: 4321`
|
|||
}, |
|||
clearContext: false // leave Jasmine Spec Runner output visible in browser
|
|||
}, |
|||
jasmineHtmlReporter: { |
|||
suppressAll: true // removes the duplicated traces
|
|||
}, |
|||
coverageReporter: { |
|||
dir: require('path').join(__dirname, './coverage/MyProjectName'), |
|||
subdir: '.', |
|||
reporters: [ |
|||
{ type: 'html' }, |
|||
{ type: 'text-summary' } |
|||
] |
|||
}, |
|||
reporters: ['progress', 'kjhtml'], |
|||
port: 9876, |
|||
colors: true, |
|||
logLevel: config.LOG_INFO, |
|||
autoWatch: true, |
|||
browsers: ['Chrome'], |
|||
singleRun: false, |
|||
restartOnFileChange: true |
|||
}); |
|||
}; |
|||
@ -0,0 +1,61 @@ |
|||
{ |
|||
"name": "MyProjectName", |
|||
"version": "0.0.0", |
|||
"scripts": { |
|||
"ng": "ng", |
|||
"start": "ng serve --open", |
|||
"build": "ng build", |
|||
"build:prod": "ng build --configuration production", |
|||
"watch": "ng build --watch --configuration development", |
|||
"test": "ng test", |
|||
"lint": "ng lint" |
|||
}, |
|||
"private": true, |
|||
"dependencies": { |
|||
"@abp/ng.account": "~5.1.3", |
|||
"@abp/ng.components": "~5.1.3", |
|||
"@abp/ng.core": "~5.1.3", |
|||
"@abp/ng.identity": "~5.1.3", |
|||
"@abp/ng.setting-management": "~5.1.3", |
|||
"@abp/ng.tenant-management": "~5.1.3", |
|||
"@abp/ng.theme.basic": "~5.1.3", |
|||
"@abp/ng.theme.shared": "~5.1.3", |
|||
"@angular/animations": "~13.1.1", |
|||
"@angular/common": "~13.1.1", |
|||
"@angular/compiler": "~13.1.1", |
|||
"@angular/core": "~13.1.1", |
|||
"@angular/forms": "~13.1.1", |
|||
"@angular/localize": "~13.1.1", |
|||
"@angular/platform-browser": "~13.1.1", |
|||
"@angular/platform-browser-dynamic": "~13.1.1", |
|||
"@angular/router": "~13.1.1", |
|||
"rxjs": "~6.6.0", |
|||
"tslib": "^2.1.0", |
|||
"zone.js": "~0.11.4" |
|||
}, |
|||
"devDependencies": { |
|||
"@abp/ng.schematics": "~5.1.3", |
|||
"@angular-devkit/build-angular": "~13.1.2", |
|||
"@angular-eslint/builder": "~13.0.1", |
|||
"@angular-eslint/eslint-plugin": "~13.0.1", |
|||
"@angular-eslint/eslint-plugin-template": "~13.0.1", |
|||
"@angular-eslint/schematics": "~13.0.1", |
|||
"@angular-eslint/template-parser": "~13.0.1", |
|||
"@angular/cli": "~13.1.2", |
|||
"@angular/compiler-cli": "~13.1.1", |
|||
"@angular/language-service": "~13.1.1", |
|||
"@types/jasmine": "~3.6.0", |
|||
"@types/node": "^12.11.1", |
|||
"@typescript-eslint/eslint-plugin": "5.3.0", |
|||
"@typescript-eslint/parser": "5.3.0", |
|||
"eslint": "^8.2.0", |
|||
"jasmine-core": "~3.7.0", |
|||
"karma": "~6.3.0", |
|||
"karma-chrome-launcher": "~3.1.0", |
|||
"karma-coverage": "~2.1.0", |
|||
"karma-jasmine": "~4.0.0", |
|||
"karma-jasmine-html-reporter": "^1.7.0", |
|||
"ng-packagr": "^13.1.2", |
|||
"typescript": "~4.5.4" |
|||
} |
|||
} |
|||
@ -0,0 +1,34 @@ |
|||
import { NgModule } from '@angular/core'; |
|||
import { RouterModule, Routes } from '@angular/router'; |
|||
|
|||
const routes: Routes = [ |
|||
{ |
|||
path: '', |
|||
pathMatch: 'full', |
|||
loadChildren: () => import('./home/home.module').then(m => m.HomeModule), |
|||
}, |
|||
{ |
|||
path: 'account', |
|||
loadChildren: () => import('@abp/ng.account').then(m => m.AccountModule.forLazy()), |
|||
}, |
|||
{ |
|||
path: 'identity', |
|||
loadChildren: () => import('@abp/ng.identity').then(m => m.IdentityModule.forLazy()), |
|||
}, |
|||
{ |
|||
path: 'tenant-management', |
|||
loadChildren: () => |
|||
import('@abp/ng.tenant-management').then(m => m.TenantManagementModule.forLazy()), |
|||
}, |
|||
{ |
|||
path: 'setting-management', |
|||
loadChildren: () => |
|||
import('@abp/ng.setting-management').then(m => m.SettingManagementModule.forLazy()), |
|||
}, |
|||
]; |
|||
|
|||
@NgModule({ |
|||
imports: [RouterModule.forRoot(routes, { relativeLinkResolution: 'legacy' })], |
|||
exports: [RouterModule], |
|||
}) |
|||
export class AppRoutingModule {} |
|||
@ -0,0 +1,10 @@ |
|||
import { Component } from '@angular/core'; |
|||
|
|||
@Component({ |
|||
selector: 'app-root', |
|||
template: ` |
|||
<abp-loader-bar></abp-loader-bar> |
|||
<abp-dynamic-layout></abp-dynamic-layout> |
|||
`,
|
|||
}) |
|||
export class AppComponent {} |
|||
@ -0,0 +1,37 @@ |
|||
import { AccountConfigModule } from '@abp/ng.account/config'; |
|||
import { CoreModule } from '@abp/ng.core'; |
|||
import { registerLocale } from '@abp/ng.core/locale'; |
|||
import { IdentityConfigModule } from '@abp/ng.identity/config'; |
|||
import { SettingManagementConfigModule } from '@abp/ng.setting-management/config'; |
|||
import { TenantManagementConfigModule } from '@abp/ng.tenant-management/config'; |
|||
import { ThemeBasicModule } from '@abp/ng.theme.basic'; |
|||
import { ThemeSharedModule } from '@abp/ng.theme.shared'; |
|||
import { NgModule } from '@angular/core'; |
|||
import { BrowserModule } from '@angular/platform-browser'; |
|||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; |
|||
import { environment } from '../environments/environment'; |
|||
import { AppRoutingModule } from './app-routing.module'; |
|||
import { AppComponent } from './app.component'; |
|||
import { APP_ROUTE_PROVIDER } from './route.provider'; |
|||
|
|||
@NgModule({ |
|||
imports: [ |
|||
BrowserModule, |
|||
BrowserAnimationsModule, |
|||
AppRoutingModule, |
|||
CoreModule.forRoot({ |
|||
environment, |
|||
registerLocaleFn: registerLocale(), |
|||
}), |
|||
ThemeSharedModule.forRoot(), |
|||
AccountConfigModule.forRoot(), |
|||
IdentityConfigModule.forRoot(), |
|||
TenantManagementConfigModule.forRoot(), |
|||
SettingManagementConfigModule.forRoot(), |
|||
ThemeBasicModule.forRoot(), |
|||
], |
|||
declarations: [AppComponent], |
|||
providers: [APP_ROUTE_PROVIDER], |
|||
bootstrap: [AppComponent], |
|||
}) |
|||
export class AppModule {} |
|||
@ -0,0 +1,12 @@ |
|||
import { NgModule } from '@angular/core'; |
|||
import { Routes, RouterModule } from '@angular/router'; |
|||
import { HomeComponent } from './home.component'; |
|||
import { ApplicationLayoutComponent } from '@abp/ng.theme.basic'; |
|||
|
|||
const routes: Routes = [{ path: '', component: HomeComponent }]; |
|||
|
|||
@NgModule({ |
|||
imports: [RouterModule.forChild(routes)], |
|||
exports: [RouterModule], |
|||
}) |
|||
export class HomeRoutingModule {} |
|||
@ -0,0 +1,333 @@ |
|||
<div class="container"> |
|||
<div class="p-5 text-center"> |
|||
<div class="d-inline-block bg-success text-white p-1 h5 rounded mb-4" role="alert"> |
|||
<h5 class="m-1"> |
|||
<i class="fas fa-rocket"></i> Congratulations, <strong>MyProjectName</strong> is |
|||
successfully running! |
|||
</h5> |
|||
</div> |
|||
<h1>{{ '::Welcome' | abpLocalization }}</h1> |
|||
|
|||
<p class="lead px-lg-5 mx-lg-5">{{ '::LongWelcomeMessage' | abpLocalization }}</p> |
|||
|
|||
<a *ngIf="!hasLoggedIn" (click)="login()" class="px-4 btn btn-primary ms-1" role="button" |
|||
><i class="fa fa-sign-in"></i> {{ 'AbpAccount::Login' | abpLocalization }}</a |
|||
> |
|||
</div> |
|||
<div class="my-3 text-center"> |
|||
<h3>Let's improve your application!</h3> |
|||
<p>Here are some links to help you get started:</p> |
|||
</div> |
|||
<div class="card mt-4 mb-5"> |
|||
<div class="card-body"> |
|||
<div class="row text-center justify-content-md-center"> |
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
starterLinkTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Learn the ABP Framework', |
|||
description: |
|||
'Explore the compherensive documentation to learn how to build a modern web application.', |
|||
links: [ |
|||
{ |
|||
href: 'https://docs.abp.io/en/abp/latest?ref=tmpl', |
|||
label: 'See Documents' |
|||
} |
|||
] |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
starterLinkTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Samples', |
|||
description: 'See the example projects built with the ABP Framework.', |
|||
links: [ |
|||
{ |
|||
href: 'https://docs.abp.io/en/abp/latest/Samples/Index?ref=tmpl', |
|||
label: 'All samples' |
|||
} |
|||
] |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
starterLinkTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'ABP Community', |
|||
description: 'Get involved with a vibrant community and become a contributor.', |
|||
links: [ |
|||
{ |
|||
href: 'https://community.abp.io/', |
|||
label: 'Community' |
|||
}, |
|||
{ |
|||
href: 'https://docs.abp.io/en/abp/latest/Contribution/Index?ref=tmpl', |
|||
label: 'Contribute' |
|||
} |
|||
] |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
</div> |
|||
<div class="row text-center mt-lg-3 justify-content-md-center"> |
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
starterLinkTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'ABP Blog', |
|||
description: 'Take a look at our recently published articles.', |
|||
links: [ |
|||
{ |
|||
href: 'https://blog.abp.io/abp?ref=tmpl', |
|||
label: 'See Blog' |
|||
} |
|||
] |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-template #githubButtonsTemplate> |
|||
<p class="mb-1"> |
|||
<iframe |
|||
scrolling="no" |
|||
src="https://buttons.github.io/buttons.html#href=https%3A%2F%2Fgithub.com%2Fabpframework%2Fabp&title=&aria-label=Star%20tabalinas%2Fjsgrid%20on%20GitHub&data-icon=octicon-star&data-text=Star&data-size=large&data-show-count=true" |
|||
style=" |
|||
width: 122px; |
|||
height: 28px; |
|||
border: none; |
|||
display: inline-block; |
|||
margin-right: 4px; |
|||
" |
|||
></iframe> |
|||
<iframe |
|||
scrolling="no" |
|||
src="https://buttons.github.io/buttons.html#href=https%3A%2F%2Fgithub.com%2Fabpframework%2Fabp%2Fissues&title=&aria-label=Issue%20tabalinas%2Fjsgrid%20on%20GitHub&data-icon=octicon-issue-opened&data-text=Issue&data-size=large" |
|||
style=" |
|||
width: 72px; |
|||
height: 28px; |
|||
border: none; |
|||
display: inline-block; |
|||
margin-right: 4px; |
|||
" |
|||
></iframe> |
|||
|
|||
<iframe |
|||
scrolling="no" |
|||
src="https://buttons.github.io/buttons.html#href=https%3A%2F%2Fgithub.com%2Fabpframework%2Fabp%2Ffork&title=&aria-label=Fork%20tabalinas%2Fjsgrid%20on%20GitHub&data-icon=octicon-repo-forked&data-text=Fork&data-size=large&" |
|||
style="width: 72px; height: 28px; border: none; display: inline-block" |
|||
></iframe> |
|||
</p> |
|||
</ng-template> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
starterLinkTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Github', |
|||
description: |
|||
'Do you love the ABP Framework? Please <strong>give a star</strong> to support it!', |
|||
links: [ |
|||
{ |
|||
href: 'https://github.com/abpframework/abp/issues/new?template=feature.md', |
|||
label: 'Request a feature' |
|||
} |
|||
], |
|||
customTemplate: githubButtonsTemplate |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
starterLinkTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Stackoverflow', |
|||
description: 'See answers to previously asked questions or ask a new one.', |
|||
links: [ |
|||
{ |
|||
href: 'https://stackoverflow.com/questions/tagged/abp', |
|||
label: 'Questions' |
|||
}, |
|||
{ |
|||
href: 'https://stackoverflow.com/questions/ask', |
|||
label: 'Ask a Question' |
|||
} |
|||
] |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="mt-5 my-3 text-center"> |
|||
<h3>Meet the ABP Commercial</h3> |
|||
<p>A Complete Web Application Platform Built on the ABP Framework</p> |
|||
</div> |
|||
|
|||
<div class="card mt-4 mb-5"> |
|||
<div class="card-body"> |
|||
<p class="px-lg-5 mx-lg-5 py-3 text-center"> |
|||
<a href="https://commercial.abp.io/" target="_blank">ABP Commercial</a> is a platform based |
|||
on the open source ABP framework. It provides pre-built application modules, rapid |
|||
application development tooling, professional UI themes, premium support and more. |
|||
</p> |
|||
|
|||
<div class="row text-center justify-content-md-center"> |
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
featuresTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Startup Templates', |
|||
href: 'https://commercial.abp.io/startup-templates?ref=tmpl' |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
featuresTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Application Modules', |
|||
href: 'https://commercial.abp.io/modules?ref=tmpl' |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
featuresTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Developer<br />Tools', |
|||
href: 'https://commercial.abp.io/tools?ref=tmpl' |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
featuresTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'UI<br />Themes', |
|||
href: 'https://commercial.abp.io/themes?ref=tmpl' |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
featuresTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Premium Support', |
|||
href: 'https://support.abp.io/QA/Questions?ref=tmpl' |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
|
|||
<ng-container |
|||
*ngTemplateOutlet=" |
|||
featuresTemplate; |
|||
context: { |
|||
$implicit: { |
|||
title: 'Additional Services', |
|||
href: 'https://commercial.abp.io/additional-services?ref=tmpl' |
|||
} |
|||
} |
|||
" |
|||
></ng-container> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="mb-5 text-center"> |
|||
<p class="align-middle"> |
|||
<a href="https://twitter.com/abpframework" target="_blank" class="mx-2" |
|||
><i class="fa fa-twitter"></i><span class="text-secondary"> Abp Framework</span></a |
|||
> |
|||
<a href="https://twitter.com/abpcommercial" target="_blank" class="mx-2" |
|||
><i class="fa fa-twitter"></i><span class="text-secondary"> Abp Commercial</span></a |
|||
> |
|||
<a href="https://github.com/abpframework/abp" target="_blank" class="mx-2" |
|||
><i class="fa fa-github"></i><span class="text-secondary"> abpframework</span></a |
|||
> |
|||
</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<ng-template #starterLinkTemplate let-context> |
|||
<div class="col-lg-4 border-start"> |
|||
<div class="p-4"> |
|||
<h5 class="mb-3"> |
|||
<i class="fas fa-cubes text-secondary d-block my-3 fa-2x"></i> {{ context.title }} |
|||
</h5> |
|||
<p [innerHTML]="context.description"></p> |
|||
<ng-container |
|||
*ngIf="context.customTemplate" |
|||
[ngTemplateOutlet]="context.customTemplate" |
|||
></ng-container> |
|||
<a |
|||
*ngFor="let link of context.links" |
|||
[href]="link.href" |
|||
target="_blank" |
|||
class="btn btn-link px-1" |
|||
>{{ link.label }} <i class="fas fa-chevron-right"></i |
|||
></a> |
|||
</div> |
|||
</div> |
|||
</ng-template> |
|||
|
|||
<ng-template #featuresTemplate let-context> |
|||
<div class="col-lg-2 border-start"> |
|||
<div class="p-3"> |
|||
<h6> |
|||
<i class="fas fa-plus d-block mb-3 fa- 2x text-secondary"></i> |
|||
<span [innerHTML]="context.title"></span> |
|||
<a [href]="context.href" target="_blank" class="d-block mt-2 btn btn-sm btn-link" |
|||
>Details <i class="fas fa-chevron-right"></i |
|||
></a> |
|||
</h6> |
|||
</div> |
|||
</div> |
|||
</ng-template> |
|||
|
|||
<style scoped> |
|||
.col-lg-2.border-start:nth-of-type(6n + 1) { |
|||
border-left: 0 !important; |
|||
} |
|||
|
|||
.col-lg-4.border-start:nth-of-type(3n + 1) { |
|||
border-left: 0 !important; |
|||
} |
|||
|
|||
@media (max-width: 991px) { |
|||
.border-start { |
|||
border-left: 0 !important; |
|||
} |
|||
} |
|||
</style> |
|||
@ -0,0 +1 @@ |
|||
/* Styles for the home component */ |
|||
@ -0,0 +1,20 @@ |
|||
import { AuthService } from '@abp/ng.core'; |
|||
import { Component } from '@angular/core'; |
|||
import { OAuthService } from 'angular-oauth2-oidc'; |
|||
|
|||
@Component({ |
|||
selector: 'app-home', |
|||
templateUrl: './home.component.html', |
|||
styleUrls: ['./home.component.scss'], |
|||
}) |
|||
export class HomeComponent { |
|||
get hasLoggedIn(): boolean { |
|||
return this.oAuthService.hasValidAccessToken(); |
|||
} |
|||
|
|||
constructor(private oAuthService: OAuthService, private authService: AuthService) {} |
|||
|
|||
login() { |
|||
this.authService.navigateToLogin(); |
|||
} |
|||
} |
|||
@ -0,0 +1,10 @@ |
|||
import { NgModule } from '@angular/core'; |
|||
import { SharedModule } from '../shared/shared.module'; |
|||
import { HomeRoutingModule } from './home-routing.module'; |
|||
import { HomeComponent } from './home.component'; |
|||
|
|||
@NgModule({ |
|||
declarations: [HomeComponent], |
|||
imports: [SharedModule, HomeRoutingModule], |
|||
}) |
|||
export class HomeModule {} |
|||
@ -0,0 +1,20 @@ |
|||
import { RoutesService, eLayoutType } from '@abp/ng.core'; |
|||
import { APP_INITIALIZER } from '@angular/core'; |
|||
|
|||
export const APP_ROUTE_PROVIDER = [ |
|||
{ provide: APP_INITIALIZER, useFactory: configureRoutes, deps: [RoutesService], multi: true }, |
|||
]; |
|||
|
|||
function configureRoutes(routesService: RoutesService) { |
|||
return () => { |
|||
routesService.add([ |
|||
{ |
|||
path: '/', |
|||
name: '::Menu:Home', |
|||
iconClass: 'fas fa-home', |
|||
order: 1, |
|||
layout: eLayoutType.application, |
|||
}, |
|||
]); |
|||
}; |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
import { CoreModule } from '@abp/ng.core'; |
|||
import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; |
|||
import { NgModule } from '@angular/core'; |
|||
import { ThemeSharedModule } from '@abp/ng.theme.shared'; |
|||
import { NgxValidateCoreModule } from '@ngx-validate/core'; |
|||
|
|||
@NgModule({ |
|||
declarations: [], |
|||
imports: [ |
|||
CoreModule, |
|||
ThemeSharedModule, |
|||
NgbDropdownModule, |
|||
NgxValidateCoreModule |
|||
], |
|||
exports: [ |
|||
CoreModule, |
|||
ThemeSharedModule, |
|||
NgbDropdownModule, |
|||
NgxValidateCoreModule |
|||
], |
|||
providers: [] |
|||
}) |
|||
export class SharedModule {} |
|||
@ -0,0 +1,26 @@ |
|||
import { Environment } from '@abp/ng.core'; |
|||
|
|||
const baseUrl = 'http://localhost:4200'; |
|||
|
|||
export const environment = { |
|||
production: true, |
|||
application: { |
|||
baseUrl, |
|||
name: 'MyProjectName', |
|||
logoUrl: '', |
|||
}, |
|||
oAuthConfig: { |
|||
issuer: 'https://localhost:44305', |
|||
redirectUri: baseUrl, |
|||
clientId: 'MyProjectName_App', |
|||
responseType: 'code', |
|||
scope: 'offline_access MyProjectName', |
|||
requireHttps: true |
|||
}, |
|||
apis: { |
|||
default: { |
|||
url: 'https://localhost:44305', |
|||
rootNamespace: 'MyCompanyName.MyProjectName', |
|||
}, |
|||
}, |
|||
} as Environment; |
|||
@ -0,0 +1,26 @@ |
|||
import { Environment } from '@abp/ng.core'; |
|||
|
|||
const baseUrl = 'http://localhost:4200'; |
|||
|
|||
export const environment = { |
|||
production: false, |
|||
application: { |
|||
baseUrl, |
|||
name: 'MyProjectName', |
|||
logoUrl: '', |
|||
}, |
|||
oAuthConfig: { |
|||
issuer: 'https://localhost:44305', |
|||
redirectUri: baseUrl, |
|||
clientId: 'MyProjectName_App', |
|||
responseType: 'code', |
|||
scope: 'offline_access MyProjectName', |
|||
requireHttps: true, |
|||
}, |
|||
apis: { |
|||
default: { |
|||
url: 'https://localhost:44305', |
|||
rootNamespace: 'MyCompanyName.MyProjectName', |
|||
}, |
|||
}, |
|||
} as Environment; |
|||
|
After Width: | Height: | Size: 101 KiB |
@ -0,0 +1,16 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="en"> |
|||
<head> |
|||
<meta charset="utf-8" /> |
|||
<title>MyProjectName</title> |
|||
<base href="/" /> |
|||
|
|||
<meta name="viewport" content="width=device-width, initial-scale=1" /> |
|||
<link rel="icon" type="image/x-icon" href="favicon.ico" /> |
|||
</head> |
|||
<body class="bg-light"> |
|||
<app-root> |
|||
<div class="donut centered"></div> |
|||
</app-root> |
|||
</body> |
|||
</html> |
|||
@ -0,0 +1,13 @@ |
|||
import { enableProdMode } from '@angular/core'; |
|||
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; |
|||
|
|||
import { AppModule } from './app/app.module'; |
|||
import { environment } from './environments/environment'; |
|||
|
|||
if (environment.production) { |
|||
enableProdMode(); |
|||
} |
|||
|
|||
platformBrowserDynamic() |
|||
.bootstrapModule(AppModule) |
|||
.catch(err => console.error(err)); |
|||
@ -0,0 +1,54 @@ |
|||
/** |
|||
* This file includes polyfills needed by Angular and is loaded before the app. |
|||
* You can add your own extra polyfills to this file. |
|||
* |
|||
* This file is divided into 2 sections: |
|||
* 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. |
|||
* 2. Application imports. Files imported after ZoneJS that should be loaded before your main |
|||
* file. |
|||
* |
|||
* The current setup is for so-called "evergreen" browsers; the last versions of browsers that |
|||
* automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), |
|||
* Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. |
|||
* |
|||
* Learn more in https://angular.io/guide/browser-support
|
|||
*/ |
|||
/*************************************************************************************************** |
|||
* BROWSER POLYFILLS |
|||
*/ |
|||
/** |
|||
* By default, zone.js will patch all possible macroTask and DomEvents |
|||
* user can disable parts of macroTask/DomEvents patch by setting following flags |
|||
* because those flags need to be set before `zone.js` being loaded, and webpack |
|||
* will put import in the top of bundle, so user need to create a separate file |
|||
* in this directory (for example: zone-flags.ts), and put the following flags |
|||
* into that file, and then add the following code before importing zone.js. |
|||
* import './zone-flags'; |
|||
* |
|||
* The flags allowed in zone-flags.ts are listed here. |
|||
* |
|||
* The following flags will work for all browsers. |
|||
* |
|||
* (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
|
|||
* (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
|
|||
* (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
|
|||
* |
|||
* in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js |
|||
* with the following flag, it will bypass `zone.js` patch for IE/Edge |
|||
* |
|||
* (window as any).__Zone_enable_cross_context_check = true; |
|||
* |
|||
*/ |
|||
/*************************************************************************************************** |
|||
* Zone JS is required by default for Angular itself. |
|||
*/ |
|||
import 'zone.js'; // Included with Angular CLI.
|
|||
|
|||
/*************************************************************************************************** |
|||
* APPLICATION IMPORTS |
|||
*/ |
|||
|
|||
/****************************************************************** |
|||
* Load `$localize` - used if i18n tags appear in Angular templates. |
|||
*/ |
|||
import '@angular/localize/init'; |
|||
@ -0,0 +1,26 @@ |
|||
/* You can add global styles to this file, and also import other style files */ |
|||
|
|||
@keyframes donut-spin { |
|||
0% { |
|||
transform: rotate(0deg); |
|||
} |
|||
100% { |
|||
transform: rotate(360deg); |
|||
} |
|||
} |
|||
.donut { |
|||
display: inline-block; |
|||
border: 4px solid rgba(0, 0, 0, 0.1); |
|||
border-left-color: #7983ff; |
|||
border-radius: 50%; |
|||
width: 30px; |
|||
height: 30px; |
|||
animation: donut-spin 1.2s linear infinite; |
|||
|
|||
&.centered { |
|||
position: fixed; |
|||
top: 50%; |
|||
left: 50%; |
|||
transform: translate(-50%, -50%); |
|||
} |
|||
} |
|||
@ -0,0 +1,29 @@ |
|||
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
|
|||
|
|||
import { getTestBed } from '@angular/core/testing'; |
|||
import { |
|||
BrowserDynamicTestingModule, |
|||
platformBrowserDynamicTesting, |
|||
} from '@angular/platform-browser-dynamic/testing'; |
|||
import 'zone.js/testing'; |
|||
|
|||
declare const require: { |
|||
context( |
|||
path: string, |
|||
deep?: boolean, |
|||
filter?: RegExp |
|||
): { |
|||
keys(): string[]; |
|||
<T>(id: string): T; |
|||
}; |
|||
}; |
|||
|
|||
// First, initialize the Angular testing environment.
|
|||
getTestBed().initTestEnvironment( |
|||
BrowserDynamicTestingModule, |
|||
platformBrowserDynamicTesting() |
|||
); |
|||
// Then we find all the tests.
|
|||
const context = require.context('./', true, /\.spec\.ts$/); |
|||
// And load the modules.
|
|||
context.keys().map(context); |
|||
@ -0,0 +1,2 @@ |
|||
yarn |
|||
yarn start |
|||
@ -0,0 +1,15 @@ |
|||
/* To learn more about this file see: https://angular.io/config/tsconfig. */ |
|||
{ |
|||
"extends": "./tsconfig.json", |
|||
"compilerOptions": { |
|||
"outDir": "./out-tsc/app", |
|||
"types": [] |
|||
}, |
|||
"files": [ |
|||
"src/main.ts", |
|||
"src/polyfills.ts" |
|||
], |
|||
"include": [ |
|||
"src/**/*.d.ts" |
|||
] |
|||
} |
|||
@ -0,0 +1,27 @@ |
|||
/* To learn more about this file see: https://angular.io/config/tsconfig. */ |
|||
{ |
|||
"compileOnSave": false, |
|||
"compilerOptions": { |
|||
"baseUrl": "./", |
|||
"outDir": "./dist/out-tsc", |
|||
"sourceMap": true, |
|||
"declaration": false, |
|||
"downlevelIteration": true, |
|||
"experimentalDecorators": true, |
|||
"moduleResolution": "node", |
|||
"importHelpers": true, |
|||
"target": "es2017", |
|||
"module": "es2020", |
|||
"lib": [ |
|||
"es2018", |
|||
"dom" |
|||
], |
|||
"paths": { |
|||
"@proxy": ["src/app/proxy/index.ts"], |
|||
"@proxy/*": ["src/app/proxy/*"] |
|||
} |
|||
}, |
|||
"angularCompilerOptions": { |
|||
"enableI18nLegacyMessageIdFormat": false |
|||
} |
|||
} |
|||
@ -0,0 +1,18 @@ |
|||
/* To learn more about this file see: https://angular.io/config/tsconfig. */ |
|||
{ |
|||
"extends": "./tsconfig.json", |
|||
"compilerOptions": { |
|||
"outDir": "./out-tsc/spec", |
|||
"types": [ |
|||
"jasmine" |
|||
] |
|||
}, |
|||
"files": [ |
|||
"src/test.ts", |
|||
"src/polyfills.ts" |
|||
], |
|||
"include": [ |
|||
"src/**/*.spec.ts", |
|||
"src/**/*.d.ts" |
|||
] |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
using Volo.Abp.Data; |
|||
using Volo.Abp.MongoDB; |
|||
|
|||
namespace MyCompanyName.MyProjectName.Data; |
|||
|
|||
[ConnectionStringName("Default")] |
|||
public class MyProjectNameDbContext : AbpMongoDbContext |
|||
{ |
|||
/* Add mongo collections here. Example: |
|||
* public IMongoCollection<Question> Questions => Collection<Question>(); |
|||
*/ |
|||
|
|||
protected override void CreateModel(IMongoModelBuilder modelBuilder) |
|||
{ |
|||
base.CreateModel(modelBuilder); |
|||
|
|||
//builder.Entity<YourEntity>(b =>
|
|||
//{
|
|||
// //...
|
|||
//});
|
|||
} |
|||
} |
|||
@ -0,0 +1,88 @@ |
|||
using Microsoft.Extensions.Logging.Abstractions; |
|||
using Volo.Abp.Data; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Identity; |
|||
using Volo.Abp.MultiTenancy; |
|||
using Volo.Abp.TenantManagement; |
|||
|
|||
namespace MyCompanyName.MyProjectName.Data; |
|||
|
|||
public class MyProjectNameDbMigrationService : ITransientDependency |
|||
{ |
|||
public ILogger<MyProjectNameDbMigrationService> Logger { get; set; } |
|||
|
|||
private readonly IDataSeeder _dataSeeder; |
|||
private readonly MyProjectNameMongoDbSchemaMigrator _dbSchemaMigrator; |
|||
private readonly ITenantRepository _tenantRepository; |
|||
private readonly ICurrentTenant _currentTenant; |
|||
|
|||
public MyProjectNameDbMigrationService( |
|||
IDataSeeder dataSeeder, |
|||
MyProjectNameMongoDbSchemaMigrator dbSchemaMigrator, |
|||
ITenantRepository tenantRepository, |
|||
ICurrentTenant currentTenant) |
|||
{ |
|||
_dataSeeder = dataSeeder; |
|||
_dbSchemaMigrator = dbSchemaMigrator; |
|||
_tenantRepository = tenantRepository; |
|||
_currentTenant = currentTenant; |
|||
|
|||
Logger = NullLogger<MyProjectNameDbMigrationService>.Instance; |
|||
} |
|||
|
|||
public async Task MigrateAsync() |
|||
{ |
|||
Logger.LogInformation("Started database migrations..."); |
|||
|
|||
await MigrateDatabaseSchemaAsync(); |
|||
await SeedDataAsync(); |
|||
|
|||
Logger.LogInformation($"Successfully completed host database migrations."); |
|||
|
|||
var tenants = await _tenantRepository.GetListAsync(includeDetails: true); |
|||
|
|||
var migratedDatabaseSchemas = new HashSet<string>(); |
|||
foreach (var tenant in tenants) |
|||
{ |
|||
using (_currentTenant.Change(tenant.Id)) |
|||
{ |
|||
if (tenant.ConnectionStrings.Any()) |
|||
{ |
|||
var tenantConnectionStrings = tenant.ConnectionStrings |
|||
.Select(x => x.Value) |
|||
.ToList(); |
|||
|
|||
if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings)) |
|||
{ |
|||
await MigrateDatabaseSchemaAsync(tenant); |
|||
|
|||
migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings); |
|||
} |
|||
} |
|||
|
|||
await SeedDataAsync(tenant); |
|||
} |
|||
|
|||
Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations."); |
|||
} |
|||
|
|||
Logger.LogInformation("Successfully completed all database migrations."); |
|||
Logger.LogInformation("You can safely end this process..."); |
|||
} |
|||
|
|||
private async Task MigrateDatabaseSchemaAsync(Tenant tenant = null) |
|||
{ |
|||
Logger.LogInformation($"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); |
|||
await _dbSchemaMigrator.MigrateAsync(); |
|||
} |
|||
|
|||
private async Task SeedDataAsync(Tenant tenant = null) |
|||
{ |
|||
Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); |
|||
|
|||
await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id) |
|||
.WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, IdentityDataSeedContributor.AdminEmailDefaultValue) |
|||
.WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, IdentityDataSeedContributor.AdminPasswordDefaultValue) |
|||
); |
|||
} |
|||
} |
|||
@ -0,0 +1,37 @@ |
|||
using MongoDB.Driver; |
|||
using Volo.Abp.Data; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.MongoDB; |
|||
|
|||
public class MyProjectNameMongoDbSchemaMigrator : ITransientDependency |
|||
{ |
|||
private readonly IServiceProvider _serviceProvider; |
|||
|
|||
public MyProjectNameMongoDbSchemaMigrator(IServiceProvider serviceProvider) |
|||
{ |
|||
_serviceProvider = serviceProvider; |
|||
} |
|||
|
|||
public async Task MigrateAsync() |
|||
{ |
|||
var dbContexts = _serviceProvider.GetServices<IAbpMongoDbContext>(); |
|||
var connectionStringResolver = _serviceProvider.GetRequiredService<IConnectionStringResolver>(); |
|||
|
|||
foreach (var dbContext in dbContexts) |
|||
{ |
|||
var connectionString = |
|||
await connectionStringResolver.ResolveAsync( |
|||
ConnectionStringNameAttribute.GetConnStringName(dbContext.GetType())); |
|||
var mongoUrl = new MongoUrl(connectionString); |
|||
var databaseName = mongoUrl.DatabaseName; |
|||
var client = new MongoClient(mongoUrl); |
|||
|
|||
if (databaseName.IsNullOrWhiteSpace()) |
|||
{ |
|||
databaseName = ConnectionStringNameAttribute.GetConnStringName(dbContext.GetType()); |
|||
} |
|||
|
|||
(dbContext as AbpMongoDbContext)?.InitializeCollections(client.GetDatabase(databaseName)); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,92 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk.Web"> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net6.0</TargetFramework> |
|||
<Nullable>enable</Nullable> |
|||
<ImplicitUsings>enable</ImplicitUsings> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Blazorise.Bootstrap5" Version="0.9.5.4" /> |
|||
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="0.9.5.4" /> |
|||
<PackageReference Include="Serilog.AspNetCore" Version="4.1.0" /> |
|||
<PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.AspNetCore.Mvc\Volo.Abp.AspNetCore.Mvc.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.AutoMapper\Volo.Abp.AutoMapper.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Swashbuckle\Volo.Abp.Swashbuckle.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.AspNetCore.Authentication.JwtBearer\Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.AspNetCore.Serilog\Volo.Abp.AspNetCore.Serilog.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\..\modules\account\src\Volo.Abp.Account.Application\Volo.Abp.Account.Application.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\account\src\Volo.Abp.Account.HttpApi\Volo.Abp.Account.HttpApi.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\account\src\Volo.Abp.Account.Web.IdentityServer\Volo.Abp.Account.Web.IdentityServer.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\..\modules\identity\src\Volo.Abp.PermissionManagement.Domain.Identity\Volo.Abp.PermissionManagement.Domain.Identity.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\identity\src\Volo.Abp.Identity.Application\Volo.Abp.Identity.Application.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\identity\src\Volo.Abp.Identity.HttpApi\Volo.Abp.Identity.HttpApi.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\identity\src\Volo.Abp.Identity.MongoDB\Volo.Abp.Identity.MongoDB.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\identityserver\src\Volo.Abp.IdentityServer.MongoDB\Volo.Abp.IdentityServer.MongoDB.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\identity\src\Volo.Abp.Identity.Blazor.Server\Volo.Abp.Identity.Blazor.Server.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\..\modules\permission-management\src\Volo.Abp.PermissionManagement.Application\Volo.Abp.PermissionManagement.Application.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\permission-management\src\Volo.Abp.PermissionManagement.MongoDB\Volo.Abp.PermissionManagement.MongoDB.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\permission-management\src\Volo.Abp.PermissionManagement.HttpApi\Volo.Abp.PermissionManagement.HttpApi.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\..\modules\tenant-management\src\Volo.Abp.TenantManagement.Application\Volo.Abp.TenantManagement.Application.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\tenant-management\src\Volo.Abp.TenantManagement.MongoDB\Volo.Abp.TenantManagement.MongoDB.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\tenant-management\src\Volo.Abp.TenantManagement.HttpApi\Volo.Abp.TenantManagement.HttpApi.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\tenant-management\src\Volo.Abp.TenantManagement.Blazor.Server\Volo.Abp.TenantManagement.Blazor.Server.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\..\modules\feature-management\src\Volo.Abp.Featuremanagement.Application\Volo.Abp.Featuremanagement.Application.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\feature-management\src\Volo.Abp.Featuremanagement.MongoDB\Volo.Abp.Featuremanagement.MongoDB.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\feature-management\src\Volo.Abp.Featuremanagement.HttpApi\Volo.Abp.Featuremanagement.HttpApi.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\feature-management\src\Volo.Abp.Featuremanagement.Blazor.Server\Volo.Abp.Featuremanagement.Blazor.Server.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\..\modules\setting-management\src\Volo.Abp.SettingManagement.Application\Volo.Abp.SettingManagement.Application.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\setting-management\src\Volo.Abp.SettingManagement.MongoDB\Volo.Abp.SettingManagement.MongoDB.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\setting-management\src\Volo.Abp.SettingManagement.HttpApi\Volo.Abp.SettingManagement.HttpApi.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\setting-management\src\Volo.Abp.SettingManagement.Blazor.Server\Volo.Abp.SettingManagement.Blazor.Server.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\..\modules\audit-logging\src\Volo.Abp.AuditLogging.MongoDB\Volo.Abp.AuditLogging.MongoDB.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" /> |
|||
<ProjectReference Include="..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Components.Server.BasicTheme\Volo.Abp.AspNetCore.Components.Server.BasicTheme.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="6.0.1" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<Content Remove="Localization\MyProjectName\*.json" /> |
|||
<EmbeddedResource Include="Localization\MyProjectName\*.json" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<Compile Remove="Logs\**" /> |
|||
<Content Remove="Logs\**" /> |
|||
<EmbeddedResource Remove="Logs\**" /> |
|||
<None Remove="Logs\**" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
@ -0,0 +1,12 @@ |
|||
using MyCompanyName.MyProjectName.Localization; |
|||
using Volo.Abp.AspNetCore.Components; |
|||
|
|||
namespace MyCompanyName.MyProjectName; |
|||
|
|||
public abstract class MyProjectNameComponentBase : AbpComponentBase |
|||
{ |
|||
protected MyProjectNameComponentBase() |
|||
{ |
|||
LocalizationResource = typeof(MyProjectNameResource); |
|||
} |
|||
} |
|||
@ -0,0 +1,310 @@ |
|||
using Blazorise.Bootstrap5; |
|||
using Blazorise.Icons.FontAwesome; |
|||
using Microsoft.OpenApi.Models; |
|||
using MyCompanyName.MyProjectName.Data; |
|||
using MyCompanyName.MyProjectName.Localization; |
|||
using Volo.Abp; |
|||
using Volo.Abp.Account; |
|||
using Volo.Abp.Account.Web; |
|||
using Volo.Abp.AspNetCore.Authentication.JwtBearer; |
|||
using Volo.Abp.AspNetCore.Components.Server.BasicTheme; |
|||
using Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling; |
|||
using Volo.Abp.AspNetCore.Components.Web.Theming.Routing; |
|||
using Volo.Abp.AspNetCore.Mvc; |
|||
using Volo.Abp.AspNetCore.Mvc.Localization; |
|||
using Volo.Abp.AspNetCore.Mvc.UI.Bundling; |
|||
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; |
|||
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling; |
|||
using Volo.Abp.AspNetCore.Serilog; |
|||
using Volo.Abp.AuditLogging.MongoDB; |
|||
using Volo.Abp.Autofac; |
|||
using Volo.Abp.AutoMapper; |
|||
using Volo.Abp.MongoDB; |
|||
using Volo.Abp.FeatureManagement; |
|||
using Volo.Abp.FeatureManagement.Blazor.Server; |
|||
using Volo.Abp.FeatureManagement.MongoDB; |
|||
using Volo.Abp.Identity; |
|||
using Volo.Abp.Identity.Blazor.Server; |
|||
using Volo.Abp.Identity.MongoDB; |
|||
using Volo.Abp.IdentityServer.MongoDB; |
|||
using Volo.Abp.Localization; |
|||
using Volo.Abp.Modularity; |
|||
using Volo.Abp.PermissionManagement; |
|||
using Volo.Abp.PermissionManagement.MongoDB; |
|||
using Volo.Abp.PermissionManagement.HttpApi; |
|||
using Volo.Abp.PermissionManagement.Identity; |
|||
using Volo.Abp.SettingManagement; |
|||
using Volo.Abp.SettingManagement.Blazor.Server; |
|||
using Volo.Abp.SettingManagement.MongoDB; |
|||
using Volo.Abp.Swashbuckle; |
|||
using Volo.Abp.TenantManagement; |
|||
using Volo.Abp.TenantManagement.Blazor.Server; |
|||
using Volo.Abp.TenantManagement.MongoDB; |
|||
using Volo.Abp.UI.Navigation.Urls; |
|||
using Volo.Abp.Uow; |
|||
using Volo.Abp.Validation.Localization; |
|||
|
|||
namespace MyCompanyName.MyProjectName; |
|||
|
|||
[DependsOn( |
|||
// ABP Framework packages
|
|||
typeof(AbpAspNetCoreMvcModule), |
|||
typeof(AbpAutofacModule), |
|||
typeof(AbpAutoMapperModule), |
|||
typeof(AbpSwashbuckleModule), |
|||
typeof(AbpAspNetCoreAuthenticationJwtBearerModule), |
|||
typeof(AbpAspNetCoreSerilogModule), |
|||
typeof(AbpAspNetCoreMvcUiBasicThemeModule), |
|||
typeof(AbpAspNetCoreComponentsServerBasicThemeModule), |
|||
|
|||
// Account module packages
|
|||
typeof(AbpAccountApplicationModule), |
|||
typeof(AbpAccountHttpApiModule), |
|||
typeof(AbpAccountWebIdentityServerModule), |
|||
|
|||
// Identity module packages
|
|||
typeof(AbpPermissionManagementDomainIdentityModule), |
|||
typeof(AbpIdentityApplicationModule), |
|||
typeof(AbpIdentityHttpApiModule), |
|||
typeof(AbpIdentityMongoDbModule), |
|||
typeof(AbpIdentityServerMongoDbModule), |
|||
typeof(AbpIdentityBlazorServerModule), |
|||
|
|||
// Audit logging module packages
|
|||
typeof(AbpAuditLoggingMongoDbModule), |
|||
|
|||
// Permission Management module packages
|
|||
typeof(AbpPermissionManagementApplicationModule), |
|||
typeof(AbpPermissionManagementHttpApiModule), |
|||
typeof(AbpPermissionManagementMongoDbModule), |
|||
|
|||
// Tenant Management module packages
|
|||
typeof(AbpTenantManagementApplicationModule), |
|||
typeof(AbpTenantManagementHttpApiModule), |
|||
typeof(AbpTenantManagementMongoDbModule), |
|||
typeof(AbpTenantManagementBlazorServerModule), |
|||
|
|||
// Feature Management module packages
|
|||
typeof(AbpFeatureManagementApplicationModule), |
|||
typeof(AbpFeatureManagementMongoDbModule), |
|||
typeof(AbpFeatureManagementHttpApiModule), |
|||
typeof(AbpFeatureManagementBlazorServerModule), |
|||
|
|||
// Setting Management module packages
|
|||
typeof(AbpSettingManagementApplicationModule), |
|||
typeof(AbpSettingManagementMongoDbModule), |
|||
typeof(AbpSettingManagementHttpApiModule), |
|||
typeof(AbpSettingManagementBlazorServerModule) |
|||
)] |
|||
public class MyProjectNameModule : AbpModule |
|||
{ |
|||
/* Single point to enable/disable multi-tenancy */ |
|||
private const bool IsMultiTenant = true; |
|||
|
|||
public override void PreConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
context.Services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options => |
|||
{ |
|||
options.AddAssemblyResource( |
|||
typeof(MyProjectNameResource), |
|||
typeof(MyProjectNameModule).Assembly |
|||
); |
|||
}); |
|||
} |
|||
|
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
var hostingEnvironment = context.Services.GetHostingEnvironment(); |
|||
var configuration = context.Services.GetConfiguration(); |
|||
|
|||
ConfigureUrls(configuration); |
|||
ConfigureBundles(); |
|||
ConfigureAutoMapper(); |
|||
ConfigureLocalizationServices(); |
|||
ConfigureSwaggerServices(context.Services); |
|||
ConfigureAutoApiControllers(); |
|||
ConfigureBlazorise(context); |
|||
ConfigureRouter(context); |
|||
ConfigureAuthentication(context, configuration); |
|||
ConfigureMongoDB(context); |
|||
} |
|||
|
|||
private void ConfigureUrls(IConfiguration configuration) |
|||
{ |
|||
Configure<AppUrlOptions>(options => |
|||
{ |
|||
options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; |
|||
options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"].Split(',')); |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureBundles() |
|||
{ |
|||
Configure<AbpBundlingOptions>(options => |
|||
{ |
|||
// MVC UI
|
|||
options.StyleBundles.Configure( |
|||
BasicThemeBundles.Styles.Global, |
|||
bundle => |
|||
{ |
|||
bundle.AddFiles("/global-styles.css"); |
|||
} |
|||
); |
|||
|
|||
//BLAZOR UI
|
|||
options.StyleBundles.Configure( |
|||
BlazorBasicThemeBundles.Styles.Global, |
|||
bundle => |
|||
{ |
|||
bundle.AddFiles("/blazor-global-styles.css"); |
|||
//You can remove the following line if you don't use Blazor CSS isolation for components
|
|||
bundle.AddFiles("/MyCompanyName.MyProjectName.styles.css"); |
|||
} |
|||
); |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration) |
|||
{ |
|||
context.Services.AddAuthentication() |
|||
.AddJwtBearer(options => |
|||
{ |
|||
options.Authority = configuration["AuthServer:Authority"]; |
|||
options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); |
|||
options.Audience = "MyProjectName"; |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureLocalizationServices() |
|||
{ |
|||
Configure<AbpLocalizationOptions>(options => |
|||
{ |
|||
options.Resources |
|||
.Add<MyProjectNameResource>("en") |
|||
.AddBaseTypes(typeof(AbpValidationResource)) |
|||
.AddVirtualJson("/Localization/MyProjectName"); |
|||
|
|||
options.DefaultResourceType = typeof(MyProjectNameResource); |
|||
|
|||
options.Languages.Add(new LanguageInfo("en", "en", "English")); |
|||
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe")); |
|||
options.Languages.Add(new LanguageInfo("ar", "ar", "العربية")); |
|||
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština")); |
|||
options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)")); |
|||
options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar")); |
|||
options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish")); |
|||
options.Languages.Add(new LanguageInfo("fr", "fr", "Français")); |
|||
options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi", "in")); |
|||
options.Languages.Add(new LanguageInfo("is", "is", "Icelandic", "is")); |
|||
options.Languages.Add(new LanguageInfo("it", "it", "Italiano", "it")); |
|||
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português")); |
|||
options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română")); |
|||
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский")); |
|||
options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak")); |
|||
options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文")); |
|||
options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文")); |
|||
options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch", "de")); |
|||
options.Languages.Add(new LanguageInfo("es", "es", "Español")); |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureSwaggerServices(IServiceCollection services) |
|||
{ |
|||
services.AddAbpSwaggerGen( |
|||
options => |
|||
{ |
|||
options.SwaggerDoc("v1", new OpenApiInfo { Title = "MyProjectName API", Version = "v1" }); |
|||
options.DocInclusionPredicate((docName, description) => true); |
|||
options.CustomSchemaIds(type => type.FullName); |
|||
} |
|||
); |
|||
} |
|||
|
|||
private void ConfigureBlazorise(ServiceConfigurationContext context) |
|||
{ |
|||
context.Services |
|||
.AddBootstrap5Providers() |
|||
.AddFontAwesomeIcons(); |
|||
} |
|||
|
|||
private void ConfigureRouter(ServiceConfigurationContext context) |
|||
{ |
|||
Configure<AbpRouterOptions>(options => |
|||
{ |
|||
options.AppAssembly = typeof(MyProjectNameModule).Assembly; |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureAutoApiControllers() |
|||
{ |
|||
Configure<AbpAspNetCoreMvcOptions>(options => |
|||
{ |
|||
options.ConventionalControllers.Create(typeof(MyProjectNameModule).Assembly); |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureAutoMapper() |
|||
{ |
|||
Configure<AbpAutoMapperOptions>(options => |
|||
{ |
|||
options.AddMaps<MyProjectNameModule>(); |
|||
}); |
|||
} |
|||
|
|||
private void ConfigureMongoDB(ServiceConfigurationContext context) |
|||
{ |
|||
context.Services.AddMongoDbContext<MyProjectNameDbContext>(options => |
|||
{ |
|||
options.AddDefaultRepositories(); |
|||
}); |
|||
|
|||
Configure<AbpUnitOfWorkDefaultOptions>(options => |
|||
{ |
|||
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; |
|||
}); |
|||
} |
|||
|
|||
public override void OnApplicationInitialization(ApplicationInitializationContext context) |
|||
{ |
|||
var env = context.GetEnvironment(); |
|||
var app = context.GetApplicationBuilder(); |
|||
|
|||
app.UseAbpRequestLocalization(); |
|||
|
|||
if (env.IsDevelopment()) |
|||
{ |
|||
app.UseDeveloperExceptionPage(); |
|||
} |
|||
else |
|||
{ |
|||
app.UseExceptionHandler("/Error"); |
|||
app.UseHsts(); |
|||
} |
|||
|
|||
app.UseHttpsRedirection(); |
|||
app.UseCorrelationId(); |
|||
app.UseStaticFiles(); |
|||
app.UseRouting(); |
|||
app.UseAuthentication(); |
|||
app.UseJwtTokenMiddleware(); |
|||
|
|||
if (IsMultiTenant) |
|||
{ |
|||
app.UseMultiTenancy(); |
|||
} |
|||
|
|||
app.UseUnitOfWork(); |
|||
app.UseIdentityServer(); |
|||
app.UseAuthorization(); |
|||
|
|||
app.UseSwagger(); |
|||
app.UseAbpSwaggerUI(options => |
|||
{ |
|||
options.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProjectName API"); |
|||
}); |
|||
|
|||
app.UseAuditing(); |
|||
app.UseAbpSerilogEnrichers(); |
|||
app.UseConfiguredEndpoints(); |
|||
} |
|||
} |
|||
@ -0,0 +1,14 @@ |
|||
@page "/" |
|||
@inherits MyProjectNameComponentBase |
|||
<div class="container"> |
|||
<div class="card"> |
|||
<div class="card-header"> |
|||
<h5 class="card-title"> |
|||
@L["Welcome_Title"] |
|||
</h5> |
|||
</div> |
|||
<div class="card-body"> |
|||
@L["Welcome_Text"] |
|||
</div> |
|||
</div> |
|||
</div> |
|||
@ -0,0 +1,6 @@ |
|||
namespace MyCompanyName.MyProjectName.Blazor.Server.Pages; |
|||
|
|||
public partial class Index |
|||
{ |
|||
|
|||
} |
|||
@ -0,0 +1 @@ |
|||
/* Write here your styles for the Index page */ |
|||
@ -0,0 +1,38 @@ |
|||
@page "/" |
|||
@namespace MyCompanyName.MyProjectName.Blazor.Server.Pages |
|||
@using System.Globalization |
|||
@using Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling |
|||
@using Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic |
|||
@using Volo.Abp.Localization |
|||
@{ |
|||
Layout = null; |
|||
var rtl = CultureHelper.IsRtl ? "rtl" : string.Empty; |
|||
} |
|||
|
|||
<!DOCTYPE html> |
|||
<html lang="@CultureInfo.CurrentCulture.Name" dir="@rtl"> |
|||
<head> |
|||
<meta charset="utf-8" /> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
|||
<title>MyCompanyName.MyProjectName.Blazor.Server</title> |
|||
<base href="~/" /> |
|||
|
|||
<abp-style-bundle name="@BlazorBasicThemeBundles.Styles.Global" /> |
|||
</head> |
|||
<body class="abp-application-layout bg-light @rtl"> |
|||
<component type="typeof(App)" render-mode="Server" /> |
|||
|
|||
<div id="blazor-error-ui"> |
|||
<environment include="Staging,Production"> |
|||
An error has occurred. This application may no longer respond until reloaded. |
|||
</environment> |
|||
<environment include="Development"> |
|||
An unhandled exception has occurred. See browser dev tools for details. |
|||
</environment> |
|||
<a href="" class="reload">Reload</a> |
|||
<a class="dismiss">🗙</a> |
|||
</div> |
|||
|
|||
<abp-script-bundle name="@BlazorBasicThemeBundles.Scripts.Global" /> |
|||
</body> |
|||
</html> |
|||
@ -0,0 +1,74 @@ |
|||
using MyCompanyName.MyProjectName.Blazor.Server; |
|||
using MyCompanyName.MyProjectName.Data; |
|||
using Serilog; |
|||
using Serilog.Events; |
|||
|
|||
namespace MyCompanyName.MyProjectName; |
|||
|
|||
public class Program |
|||
{ |
|||
public async static Task<int> Main(string[] args) |
|||
{ |
|||
var loggerConfiguration = new LoggerConfiguration() |
|||
#if DEBUG
|
|||
.MinimumLevel.Debug() |
|||
#else
|
|||
.MinimumLevel.Information() |
|||
#endif
|
|||
.MinimumLevel.Override("Microsoft", LogEventLevel.Information) |
|||
.MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) |
|||
.Enrich.FromLogContext() |
|||
.WriteTo.Async(c => c.File("Logs/logs.txt")) |
|||
#if DEBUG
|
|||
.WriteTo.Async(c => c.Console()); |
|||
#endif
|
|||
if (IsMigrateDatabase(args)) |
|||
{ |
|||
loggerConfiguration.MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning); |
|||
loggerConfiguration.MinimumLevel.Override("Microsoft", LogEventLevel.Warning); |
|||
loggerConfiguration.MinimumLevel.Override("IdentityServer4.Startup", LogEventLevel.Warning); |
|||
} |
|||
|
|||
Log.Logger = loggerConfiguration.CreateLogger(); |
|||
|
|||
try |
|||
{ |
|||
var builder = WebApplication.CreateBuilder(args); |
|||
builder.Host.AddAppSettingsSecretsJson() |
|||
.UseAutofac() |
|||
.UseSerilog(); |
|||
await builder.AddApplicationAsync<MyProjectNameModule>(); |
|||
var app = builder.Build(); |
|||
await app.InitializeApplicationAsync(); |
|||
|
|||
if (IsMigrateDatabase(args)) |
|||
{ |
|||
await app.Services.GetRequiredService<MyProjectNameDbMigrationService>().MigrateAsync(); |
|||
return 0; |
|||
} |
|||
|
|||
Log.Information("Starting MyCompanyName.MyProjectName."); |
|||
await app.RunAsync(); |
|||
return 0; |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
if (ex.GetType().Name.Equals("StopTheHostException", StringComparison.Ordinal)) |
|||
{ |
|||
throw; |
|||
} |
|||
|
|||
Log.Fatal(ex, "MyCompanyName.MyProjectName terminated unexpectedly!"); |
|||
return 1; |
|||
} |
|||
finally |
|||
{ |
|||
Log.CloseAndFlush(); |
|||
} |
|||
} |
|||
|
|||
private static bool IsMigrateDatabase(string[] args) |
|||
{ |
|||
return args.Any(x => x.Contains("--migrate-database", StringComparison.OrdinalIgnoreCase)); |
|||
} |
|||
} |
|||
@ -0,0 +1,28 @@ |
|||
{ |
|||
"iisSettings": { |
|||
"windowsAuthentication": false, |
|||
"anonymousAuthentication": true, |
|||
"iisExpress": { |
|||
"applicationUrl": "https://localhost:44313/", |
|||
"sslPort": 44313 |
|||
} |
|||
}, |
|||
"profiles": { |
|||
"IIS Express": { |
|||
"commandName": "IISExpress", |
|||
"launchBrowser": true, |
|||
"environmentVariables": { |
|||
"ASPNETCORE_ENVIRONMENT": "Development" |
|||
} |
|||
}, |
|||
"MyCompanyName.MyProjectName.Blazor.Server": { |
|||
"commandName": "Project", |
|||
"dotnetRunMessages": "true", |
|||
"launchBrowser": true, |
|||
"applicationUrl": "https://localhost:44313/", |
|||
"environmentVariables": { |
|||
"ASPNETCORE_ENVIRONMENT": "Development" |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,16 @@ |
|||
{ |
|||
"App": { |
|||
"SelfUrl": "https://localhost:44313", |
|||
"RedirectAllowedUrls": "https://localhost:44313" |
|||
}, |
|||
"ConnectionStrings": { |
|||
"Default": "mongodb://localhost:27017/MyProjectName", |
|||
}, |
|||
"AuthServer": { |
|||
"Authority": "https://localhost:44313", |
|||
"RequireHttpsMetadata": "false" |
|||
}, |
|||
"StringEncryption": { |
|||
"DefaultPassPhrase": "gsKnGZ041HLL4IM8" |
|||
} |
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
{ |
|||
"version": "1.0.0", |
|||
"name": "my-app", |
|||
"private": true, |
|||
"dependencies": { |
|||
"@abp/aspnetcore.mvc.ui.theme.basic": "^5.1.2", |
|||
"@abp/aspnetcore.components.server.basictheme": "^5.1.2" |
|||
} |
|||
} |
|||
@ -0,0 +1,18 @@ |
|||
#blazor-error-ui { |
|||
background: lightyellow; |
|||
bottom: 0; |
|||
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); |
|||
display: none; |
|||
left: 0; |
|||
padding: 0.6rem 1.25rem 0.7rem 1.25rem; |
|||
position: fixed; |
|||
width: 100%; |
|||
z-index: 1000; |
|||
} |
|||
|
|||
#blazor-error-ui .dismiss { |
|||
cursor: pointer; |
|||
position: absolute; |
|||
right: 0.75rem; |
|||
top: 0.5rem; |
|||
} |
|||
|
After Width: | Height: | Size: 31 KiB |
@ -0,0 +1,3 @@ |
|||
body { |
|||
|
|||
} |
|||
File diff suppressed because it is too large
File diff suppressed because it is too large
Binary file not shown.
|
After Width: | Height: | Size: 712 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue