diff --git a/Yes.Application/Installs/InstallCommandHandler.cs b/Yes.Application/Installs/InstallCommandHandler.cs index eb38057..8e2569a 100644 --- a/Yes.Application/Installs/InstallCommandHandler.cs +++ b/Yes.Application/Installs/InstallCommandHandler.cs @@ -3,6 +3,7 @@ public record InstallCommand( string DatabaseType, string DatabaseServer, + string DatabaseVersion, string DatabaseUser, string DatabasePassword, string DatabaseName, @@ -13,7 +14,6 @@ public class InstallCommandHandler( IConnectionStringProvider connectionStringProvider, - IHttpContextAccessor accessor, IMigratorProvider migratorProvider, IWebHostEnvironment env, IConfigurationService configurationService, @@ -26,7 +26,6 @@ private readonly IConfigurationService _configurationService = configurationService; private readonly IWebHostEnvironment _env = env; private readonly IFileService _fileService = fileService; - private readonly IHttpContextAccessor _accessor = accessor; public async Task Handle(InstallCommand request, CancellationToken cancellationToken) { if (!string.IsNullOrEmpty(_settings.ConnectionString) && !string.IsNullOrEmpty(_settings.DatabaseType) && !string.IsNullOrEmpty(_settings.DatabaseName)) @@ -49,11 +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.Url = _accessor.HttpContext?.GetCurrentDomain() ?? ""; + 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.Blog/Areas/Install/Pages/Index.cshtml b/Yes.Blog/Areas/Install/Pages/Index.cshtml index 26ef921..50c66aa 100644 --- a/Yes.Blog/Areas/Install/Pages/Index.cshtml +++ b/Yes.Blog/Areas/Install/Pages/Index.cshtml @@ -91,19 +91,23 @@ -
+
+ + +
+
-
+
-
+
-
+
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 1cfe9f9..59e6d7b 100644 --- a/Yes.Blog/Endpoints/Blogs/InstallEndpoint.cs +++ b/Yes.Blog/Endpoints/Blogs/InstallEndpoint.cs @@ -1,7 +1,4 @@  - -using Yes.Application.Installs; - namespace Yes.Blog.Endpoints.Blogs { public class InstallEndpoint : BlogEndpointScheme, IEndpoint @@ -11,6 +8,7 @@ namespace Yes.Blog.Endpoints.Blogs public record Request( string DatabaseType, string DatabaseServer, + string DatabaseVersion, string DatabaseUser, string DatabasePassword, string DatabaseName, diff --git a/Yes.Blog/GlobalUsings.cs b/Yes.Blog/GlobalUsings.cs index fc533c4..bda73a2 100644 --- a/Yes.Blog/GlobalUsings.cs +++ b/Yes.Blog/GlobalUsings.cs @@ -42,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.Domain/Configurations/BlogSettings.cs b/Yes.Domain/Configurations/BlogSettings.cs index e675677..7db2ccc 100644 --- a/Yes.Domain/Configurations/BlogSettings.cs +++ b/Yes.Domain/Configurations/BlogSettings.cs @@ -2,13 +2,13 @@ { public class BlogSettings { - public string ConnectionString { get; set; } + public string ConnectionString { get; set; } = ""; - public string DatabaseName { get; set; } - - public string DatabaseType { get; set; } + public string DatabaseName { get; set; } = ""; + public string DatabaseType { get; set; } = ""; + public string DatabaseVersion { get; set; } = ""; public string Name { get; set; } = "我的博客"; public string Logo { get; set; } = ""; diff --git a/Yes.Domain/Core/Data/IConnectionStringProvider.cs b/Yes.Domain/Core/Data/IConnectionStringProvider.cs index 112e1c5..1e35d1f 100644 --- a/Yes.Domain/Core/Data/IConnectionStringProvider.cs +++ b/Yes.Domain/Core/Data/IConnectionStringProvider.cs @@ -8,7 +8,7 @@ namespace Yes.Domain.Core.Data DatabaseTypeEnum GetDatabaseType(); - + string GetDatabaseVersion(); string GetConnectionStringWithoutDatabase(DatabaseTypeEnum databaseType, string connectionString); 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/ConnectionStringBuilders/ConnectionStringProvider.cs b/Yes.Infrastructure/Data/ConnectionStringBuilders/ConnectionStringProvider.cs index 93c982a..ddc5b5e 100644 --- a/Yes.Infrastructure/Data/ConnectionStringBuilders/ConnectionStringProvider.cs +++ b/Yes.Infrastructure/Data/ConnectionStringBuilders/ConnectionStringProvider.cs @@ -29,6 +29,11 @@ return databaseType; } + public string GetDatabaseVersion() + { + return _settings.DatabaseVersion; + } + public string GetConnectionStringWithoutDatabase(DatabaseTypeEnum databaseType, string connectionString) { var builder = ConnectionStringBuilderFactory.CreateStringBuilder(databaseType, connectionString); diff --git a/Yes.Infrastructure/Data/DbContexts/BlogDbContext.cs b/Yes.Infrastructure/Data/DbContexts/BlogDbContext.cs index 0d935be..da665f4 100644 --- a/Yes.Infrastructure/Data/DbContexts/BlogDbContext.cs +++ b/Yes.Infrastructure/Data/DbContexts/BlogDbContext.cs @@ -5,12 +5,13 @@ private readonly string _connectionString; private readonly DatabaseTypeEnum _databaseType; - + private readonly string _databaseVersion; public BlogDbContext(IConnectionStringProvider connectionStringProvider) { _connectionString = connectionStringProvider.GetConnectionString(); _databaseType = connectionStringProvider.GetDatabaseType(); + _databaseVersion = connectionStringProvider.GetDatabaseVersion(); } @@ -20,7 +21,7 @@ _ = _databaseType switch { DatabaseTypeEnum.SqlServer => builder.UseSqlServer(_connectionString), - DatabaseTypeEnum.MySql => builder.UseMySql(_connectionString, MySqlServerVersion.AutoDetect(_connectionString)), + DatabaseTypeEnum.MySql => builder.UseMySql(_connectionString, string.IsNullOrEmpty(_databaseVersion) ? MySqlServerVersion.AutoDetect(_connectionString) : new MySqlServerVersion(_databaseVersion)), 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; }