新增显式命令:--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:
2026-07-25 20:58:51 +08:00 Unverified
parent 08b81eec42
commit 2ac873c347
4 changed files with 897 additions and 3 deletions
+47 -3
View File
@@ -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;
}