新增显式命令:--seed-demo-data --confirm-production-demo-data
仅允许非 Development 环境运行。 只允许写入没有业务数据的独立空库。 演示数据使用单个 InnoDB 事务,失败整体回滚;迁移 DDL 仍单独执行,因为 MySQL 8.4 的 DDL 会隐式提交。MySQL 事务文档、隐式提交说明 不包含通用测试密码或学生、教师登录账号。 包含校区、学期、30 间教室、16 个学院、52 个专业、104 个班级、128 名教师、3,640 名学生和148门课程。
This commit is contained in:
@@ -15,8 +15,46 @@ using Microsoft.IdentityModel.Tokens;
|
||||
using Microsoft.OpenApi.Models;
|
||||
using System.Threading.RateLimiting;
|
||||
|
||||
var migrateOnly = args.Contains("--migrate-only", StringComparer.OrdinalIgnoreCase);
|
||||
var seedDemoData = args.Contains("--seed-demo-data", StringComparer.OrdinalIgnoreCase);
|
||||
var confirmProductionDemoData = args.Contains(
|
||||
"--confirm-production-demo-data",
|
||||
StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
if (migrateOnly && seedDemoData)
|
||||
{
|
||||
Console.Error.WriteLine(
|
||||
"--migrate-only 与 --seed-demo-data 不能同时使用。请先迁移,再单独插入演示数据。");
|
||||
Environment.ExitCode = 2;
|
||||
return;
|
||||
}
|
||||
|
||||
if (seedDemoData && !confirmProductionDemoData)
|
||||
{
|
||||
Console.Error.WriteLine(
|
||||
"插入生产演示数据必须同时传入 --confirm-production-demo-data。");
|
||||
Environment.ExitCode = 2;
|
||||
return;
|
||||
}
|
||||
|
||||
if (confirmProductionDemoData && !seedDemoData)
|
||||
{
|
||||
Console.Error.WriteLine(
|
||||
"--confirm-production-demo-data 只能与 --seed-demo-data 同时使用。");
|
||||
Environment.ExitCode = 2;
|
||||
return;
|
||||
}
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
if (seedDemoData && builder.Environment.IsDevelopment())
|
||||
{
|
||||
Console.Error.WriteLine(
|
||||
"--seed-demo-data 仅用于独立的非 Development 演示环境数据库。");
|
||||
Environment.ExitCode = 2;
|
||||
return;
|
||||
}
|
||||
|
||||
var databaseOptions = builder.Configuration
|
||||
.GetSection(DatabaseOptions.SectionName)
|
||||
.Get<DatabaseOptions>() ?? new DatabaseOptions();
|
||||
@@ -114,6 +152,7 @@ builder.Services.AddHttpContextAccessor();
|
||||
builder.Services.AddScoped<ITokenService, TokenService>();
|
||||
builder.Services.AddScoped<ICurrentUserDataScope, CurrentUserDataScope>();
|
||||
builder.Services.AddScoped<DatabaseInitializer>();
|
||||
builder.Services.AddScoped<DemoDataSeeder>();
|
||||
builder.Services.AddScoped<DevelopmentSqliteMigrator>();
|
||||
builder.Services.AddScoped<TimetableDataService>();
|
||||
builder.Services.AddScoped<AutomaticScheduleGenerator>();
|
||||
@@ -305,11 +344,16 @@ app.MapFallback(async context =>
|
||||
using (var scope = app.Services.CreateScope())
|
||||
{
|
||||
await scope.ServiceProvider.GetRequiredService<DatabaseInitializer>()
|
||||
.InitializeAsync(
|
||||
args.Contains("--migrate-only", StringComparer.OrdinalIgnoreCase));
|
||||
.InitializeAsync(migrateOnly);
|
||||
|
||||
if (seedDemoData)
|
||||
{
|
||||
await scope.ServiceProvider.GetRequiredService<DemoDataSeeder>()
|
||||
.SeedAsync();
|
||||
}
|
||||
}
|
||||
|
||||
if (args.Contains("--migrate-only", StringComparer.OrdinalIgnoreCase))
|
||||
if (migrateOnly || seedDemoData)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user