diff --git a/Yes.Application/Admins/Installs/FileService.cs b/Yes.Application/Installs/FileService.cs similarity index 93% rename from Yes.Application/Admins/Installs/FileService.cs rename to Yes.Application/Installs/FileService.cs index 12e3c16..3333535 100644 --- a/Yes.Application/Admins/Installs/FileService.cs +++ b/Yes.Application/Installs/FileService.cs @@ -1,7 +1,6 @@ - -namespace Yes.Application.Admins.Installs +namespace Yes.Application.Installs { - public class FileService:IFileService + public class FileService : IFileService { public void CopyFolder(string sources, string dest) { diff --git a/Yes.Application/Admins/Installs/InstallCommandHandler.cs b/Yes.Application/Installs/InstallCommandHandler.cs similarity index 88% rename from Yes.Application/Admins/Installs/InstallCommandHandler.cs rename to Yes.Application/Installs/InstallCommandHandler.cs index b2386ac..8e2569a 100644 --- a/Yes.Application/Admins/Installs/InstallCommandHandler.cs +++ b/Yes.Application/Installs/InstallCommandHandler.cs @@ -1,4 +1,4 @@ -namespace Yes.Application.Admins.Installs +namespace Yes.Application.Installs { public record InstallCommand( string DatabaseType, @@ -10,13 +10,13 @@ bool UseDefaultAdmin ) : IRequest; - public record InstallCommandResponse(bool Success,string ErrorMessage=""); + public record InstallCommandResponse(bool Success, string ErrorMessage = ""); public class InstallCommandHandler( - IConnectionStringProvider connectionStringProvider, - IMigratorProvider migratorProvider, + IConnectionStringProvider connectionStringProvider, + IMigratorProvider migratorProvider, IWebHostEnvironment env, - IConfigurationService configurationService, + IConfigurationService configurationService, IFileService fileService, IOptionsMonitor options) : IRequestHandler { @@ -48,10 +48,11 @@ Enum.TryParse(request.DatabaseType, out DatabaseTypeEnum databaseType); var databaseServer = request.DatabaseServer; var databaseName = request.DatabaseName; - + var databaseVersion = request.DatabaseVersion; var settings = new BlogSettings(); + settings.DatabaseVersion = databaseVersion; settings.DatabaseName = databaseName; settings.DatabaseType = databaseType.ToString(); settings.ConnectionString = _connectionStringProvider.GetConnectionString(databaseType, databaseServer, databaseName, request.DatabaseUser, request.DatabasePassword); diff --git a/Yes.Application/Yes.Application.csproj b/Yes.Application/Yes.Application.csproj index fde385a..840a725 100644 --- a/Yes.Application/Yes.Application.csproj +++ b/Yes.Application/Yes.Application.csproj @@ -12,8 +12,9 @@ + - + diff --git a/Yes.Blog/Areas/Install/Pages/Index.cshtml b/Yes.Blog/Areas/Install/Pages/Index.cshtml index 3d7a339..50c66aa 100644 --- a/Yes.Blog/Areas/Install/Pages/Index.cshtml +++ b/Yes.Blog/Areas/Install/Pages/Index.cshtml @@ -93,21 +93,21 @@
- +
-
+
-
+
-
+
- +
-
+
diff --git a/Yes.Blog/DependencyInjection.cs b/Yes.Blog/DependencyInjection.cs index 5e796f0..007be7e 100644 --- a/Yes.Blog/DependencyInjection.cs +++ b/Yes.Blog/DependencyInjection.cs @@ -1,6 +1,4 @@ -using Microsoft.AspNetCore.Http; - -namespace Yes.Blog +namespace Yes.Blog { public static class DependencyInjection { diff --git a/Yes.Blog/Endpoints/Blogs/InstallEndpoint.cs b/Yes.Blog/Endpoints/Blogs/InstallEndpoint.cs index 11d9226..59e6d7b 100644 --- a/Yes.Blog/Endpoints/Blogs/InstallEndpoint.cs +++ b/Yes.Blog/Endpoints/Blogs/InstallEndpoint.cs @@ -1,5 +1,4 @@  - namespace Yes.Blog.Endpoints.Blogs { public class InstallEndpoint : BlogEndpointScheme, IEndpoint diff --git a/Yes.Blog/GlobalUsings.cs b/Yes.Blog/GlobalUsings.cs index 901a74b..bda73a2 100644 --- a/Yes.Blog/GlobalUsings.cs +++ b/Yes.Blog/GlobalUsings.cs @@ -18,7 +18,6 @@ global using Yes.Application.Admins.Auths; global using Yes.Application.Admins.Categories; global using Yes.Application.Admins.Comments; global using Yes.Application.Admins.Configurations; -global using Yes.Application.Admins.Installs; global using Yes.Application.Admins.Pages; global using Yes.Application.Admins.Statistics; global using Yes.Application.Admins.Storages; @@ -43,3 +42,6 @@ global using Yes.Infrastructure.Authorizations; global using Yes.Infrastructure.Middlewares; global using Yes.Infrastructure.ViewEngine; global using IResult = Yes.Domain.Core.Models.IResult; + +global using Yes.Application.Installs; +global using Scalar.AspNetCore; \ No newline at end of file diff --git a/Yes.Blog/Program.cs b/Yes.Blog/Program.cs index 485b460..c9a1b16 100644 --- a/Yes.Blog/Program.cs +++ b/Yes.Blog/Program.cs @@ -1,7 +1,3 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.OpenApi.Any; -using Microsoft.OpenApi.Models; -using Scalar.AspNetCore; namespace Yes.Blog { diff --git a/Yes.Blog/Yes.Blog.csproj b/Yes.Blog/Yes.Blog.csproj index 6bedb1d..747e329 100644 --- a/Yes.Blog/Yes.Blog.csproj +++ b/Yes.Blog/Yes.Blog.csproj @@ -40,11 +40,12 @@ - - + + - - + + + diff --git a/Yes.Domain/Configurations/BlogSettings.cs b/Yes.Domain/Configurations/BlogSettings.cs index f1754b6..7db2ccc 100644 --- a/Yes.Domain/Configurations/BlogSettings.cs +++ b/Yes.Domain/Configurations/BlogSettings.cs @@ -2,19 +2,18 @@ { public class BlogSettings { - public string ConnectionString { get; set; } + public string ConnectionString { get; set; } = ""; - public string DatabaseName { get; set; } + public string DatabaseName { get; set; } = ""; - public string DatabaseType { get; set; } - - public string DatabaseVersion { get; set; } + public string DatabaseType { get; set; } = ""; + public string DatabaseVersion { get; set; } = ""; public string Name { get; set; } = "我的博客"; - public string Logo { get; set; } = "https://img.yescent.com/FosQ9ua_nPhlNQwYgJwUXi9MFsB5.jpg"; + public string Logo { get; set; } = ""; - public string Url { get; set; } = "https://yescent.com"; + public string Url { get; set; } = "https://blog.yescent.com"; public int PageSizeOfHomepage { get; set; } = 5; diff --git a/Yes.Domain/Core/Data/IConnectionStringProvider.cs b/Yes.Domain/Core/Data/IConnectionStringProvider.cs index 5bd4f71..1e35d1f 100644 --- a/Yes.Domain/Core/Data/IConnectionStringProvider.cs +++ b/Yes.Domain/Core/Data/IConnectionStringProvider.cs @@ -10,7 +10,6 @@ namespace Yes.Domain.Core.Data string GetDatabaseVersion(); - string GetConnectionStringWithoutDatabase(DatabaseTypeEnum databaseType, string connectionString); string GetDatabase(DatabaseTypeEnum databaseType, string connectionString); diff --git a/Yes.Domain/Core/Extensions/HttpContextExtensions.cs b/Yes.Domain/Core/Extensions/HttpContextExtensions.cs index 9596905..12cc2e2 100644 --- a/Yes.Domain/Core/Extensions/HttpContextExtensions.cs +++ b/Yes.Domain/Core/Extensions/HttpContextExtensions.cs @@ -17,5 +17,13 @@ namespace Yes.Domain.Core.Extensions } return ipAddress ?? ""; } + + public static string GetCurrentDomain(this HttpContext httpContext) + { + var request = httpContext.Request; + var host = request.Headers["X-Forwarded-Host"].FirstOrDefault() ?? request.Host.Host; + var protocol = request.Headers["X-Forwarded-Proto"].FirstOrDefault() ?? request.Scheme; + return $"{protocol}://{host}"; + } } } diff --git a/Yes.Domain/Yes.Domain.csproj b/Yes.Domain/Yes.Domain.csproj index 7441078..2acec46 100644 --- a/Yes.Domain/Yes.Domain.csproj +++ b/Yes.Domain/Yes.Domain.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/Yes.Infrastructure/Authorizations/AuthenticationExtensions.cs b/Yes.Infrastructure/Authorizations/AuthenticationExtensions.cs index 832eeae..38e033b 100644 --- a/Yes.Infrastructure/Authorizations/AuthenticationExtensions.cs +++ b/Yes.Infrastructure/Authorizations/AuthenticationExtensions.cs @@ -1,4 +1,4 @@ -using Microsoft.AspNetCore.Http.Extensions; + namespace Yes.Infrastructure.Authorizations { diff --git a/Yes.Infrastructure/Data/DbContexts/BlogDbContext.cs b/Yes.Infrastructure/Data/DbContexts/BlogDbContext.cs index 1944e6f..6e21d73 100644 --- a/Yes.Infrastructure/Data/DbContexts/BlogDbContext.cs +++ b/Yes.Infrastructure/Data/DbContexts/BlogDbContext.cs @@ -7,7 +7,6 @@ private readonly DatabaseTypeEnum _databaseType; private readonly string _databaseVersion; - public BlogDbContext(IConnectionStringProvider connectionStringProvider) { _connectionString = connectionStringProvider.GetConnectionString(); @@ -22,7 +21,7 @@ _ = _databaseType switch { DatabaseTypeEnum.SqlServer => builder.UseSqlServer(_connectionString), - DatabaseTypeEnum.MySql => builder.UseMySql(_connectionString, string.IsNullOrEmpty(_databaseVersion) ? MySqlServerVersion.AutoDetect(_connectionString) : new MySqlServerVersion(_databaseVersion)), + DatabaseTypeEnum.MySql => builder.UseMySql(_connectionString, string.IsNullOrEmpty(_databaseVersion) ? MySqlServerVersion.AutoDetect(_connectionString) : new MySqlServerVersion(_databaseVersion), builder => builder.TranslateParameterizedCollectionsToConstants()), DatabaseTypeEnum.PostgreSQL => builder.UseNpgsql(_connectionString), _ => throw new DatabaseNotSupportedException() diff --git a/Yes.Infrastructure/GlobalUsings.cs b/Yes.Infrastructure/GlobalUsings.cs index 9f97ad6..79137e3 100644 --- a/Yes.Infrastructure/GlobalUsings.cs +++ b/Yes.Infrastructure/GlobalUsings.cs @@ -43,4 +43,7 @@ global using Yes.Infrastructure.Authorizations.Identity; global using Yes.Infrastructure.Authorizations.Identity.Authroizations; global using Yes.Infrastructure.Authorizations.Identity.Context; global using Yes.Infrastructure.Data.DbContexts; -global using Yes.Infrastructure.Migrator.Migrations; \ No newline at end of file +global using Yes.Infrastructure.Migrator.Migrations; +global using MySql.Data.MySqlClient; +global using Npgsql; +global using Microsoft.AspNetCore.Http.Extensions; \ No newline at end of file diff --git a/Yes.Infrastructure/Migrator/MigratorHelper.cs b/Yes.Infrastructure/Migrator/MigratorHelper.cs index 655065a..d9e9571 100644 --- a/Yes.Infrastructure/Migrator/MigratorHelper.cs +++ b/Yes.Infrastructure/Migrator/MigratorHelper.cs @@ -27,7 +27,7 @@ return databaseType switch { DatabaseTypeEnum.SqlServer => builder.AddSqlServer(), - DatabaseTypeEnum.MySql => builder.AddMySql8().AddMySql5().AddMySql4(), + DatabaseTypeEnum.MySql => builder.AddMySql(), DatabaseTypeEnum.PostgreSQL => builder.AddPostgres(), _ => throw new DatabaseNotSupportedException() diff --git a/Yes.Infrastructure/Migrator/Providers/MigratorProvider.cs b/Yes.Infrastructure/Migrator/Providers/MigratorProvider.cs index b948eec..a8d439d 100644 --- a/Yes.Infrastructure/Migrator/Providers/MigratorProvider.cs +++ b/Yes.Infrastructure/Migrator/Providers/MigratorProvider.cs @@ -1,4 +1,6 @@ -namespace Yes.Infrastructure.Migrator.Providers + + +namespace Yes.Infrastructure.Migrator.Providers { public class MigratorProvider : IMigratorProvider { @@ -70,14 +72,50 @@ { case DatabaseTypeEnum.SqlServer: - var connection = new SqlConnection(connectionStringWithoutDatabase); - var records = connection.Query($"SELECT name FROM sys.databases WHERE name = '{dbName}';"); - if (!records.Any()) + using (var connection = new SqlConnection(connectionStringWithoutDatabase)) { - connection.Execute($"CREATE DATABASE {dbName}"); + var records = connection.Query($"SELECT name FROM sys.databases WHERE name = '{dbName}';"); + if (!records.Any()) + { + connection.Execute($"CREATE DATABASE {dbName}"); + } } break; + case DatabaseTypeEnum.PostgreSQL: + + using (var connection = new NpgsqlConnection(connectionStringWithoutDatabase)) + { + var exists = connection.ExecuteScalar( + "SELECT EXISTS(SELECT 1 FROM pg_database WHERE datname = @dbName)", + new { dbName } + ); + if (!exists) + { + connection.Execute($"CREATE DATABASE \"{dbName}\" ENCODING = 'UTF8'"); + } + } + break; + + case DatabaseTypeEnum.MySql: + using (var connection = new MySqlConnection(connectionStringWithoutDatabase)) // 需要 MySql.Data NuGet 包 + { + // 参数化查询 + var records = connection.Query( + "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = @dbName", + new { dbName } + ); + + if (!records.Any()) + { + // 指定字符集和排序规则(推荐) + connection.Execute($@" + CREATE DATABASE `{dbName}` + CHARACTER SET utf8mb4 + COLLATE utf8mb4_general_ci"); + } + } + break; } diff --git a/Yes.Infrastructure/Yes.Infrastructure.csproj b/Yes.Infrastructure/Yes.Infrastructure.csproj index 89513ce..07ae55d 100644 --- a/Yes.Infrastructure/Yes.Infrastructure.csproj +++ b/Yes.Infrastructure/Yes.Infrastructure.csproj @@ -7,15 +7,15 @@ - - - - - - - + + + + + + + - +