APP热更新
This commit is contained in:
@@ -125,6 +125,8 @@ public sealed class AppDbContext(DbContextOptions<AppDbContext> options)
|
||||
public DbSet<AuditLog> AuditLogs => Set<AuditLog>();
|
||||
public DbSet<BackgroundJobOutboxMessage> BackgroundJobOutboxMessages =>
|
||||
Set<BackgroundJobOutboxMessage>();
|
||||
public DbSet<AppUpdateRelease> AppUpdateReleases =>
|
||||
Set<AppUpdateRelease>();
|
||||
|
||||
protected override void ConfigureConventions(
|
||||
ModelConfigurationBuilder configurationBuilder)
|
||||
@@ -1279,6 +1281,42 @@ public sealed class AppDbContext(DbContextOptions<AppDbContext> options)
|
||||
entity.HasIndex(x => x.LeaseExpiresAt);
|
||||
});
|
||||
|
||||
builder.Entity<AppUpdateRelease>(entity =>
|
||||
{
|
||||
entity.Property(x => x.Platform)
|
||||
.HasConversion<string>()
|
||||
.HasMaxLength(20);
|
||||
entity.Property(x => x.Channel)
|
||||
.HasConversion<string>()
|
||||
.HasMaxLength(20);
|
||||
entity.Property(x => x.Status)
|
||||
.HasConversion<string>()
|
||||
.HasMaxLength(20);
|
||||
entity.Property(x => x.Version).HasMaxLength(40);
|
||||
entity.Property(x => x.NativeVersion).HasMaxLength(40);
|
||||
entity.Property(x => x.ReleaseNotes).HasMaxLength(1000);
|
||||
entity.Property(x => x.FileName).HasMaxLength(180);
|
||||
entity.Property(x => x.Sha256).HasMaxLength(64);
|
||||
entity.Property(x => x.BundleContent).HasColumnType("longblob");
|
||||
entity.Property(x => x.CreatedByUserName).HasMaxLength(100);
|
||||
entity.Property(x => x.PublishedByUserName).HasMaxLength(100);
|
||||
entity.HasIndex(x => new
|
||||
{
|
||||
x.Platform,
|
||||
x.Channel,
|
||||
x.NativeVersion,
|
||||
x.Version
|
||||
}).IsUnique();
|
||||
entity.HasIndex(x => new
|
||||
{
|
||||
x.Platform,
|
||||
x.Channel,
|
||||
x.NativeVersion,
|
||||
x.Status
|
||||
});
|
||||
entity.HasIndex(x => x.CreatedAt);
|
||||
});
|
||||
|
||||
builder.Entity<OfficialDocument>(entity =>
|
||||
{
|
||||
entity.Property(x => x.DocumentNumber).HasMaxLength(50);
|
||||
|
||||
@@ -74,6 +74,8 @@ public sealed class DevelopmentSqliteMigrator(
|
||||
"20260728_39_experiment_management";
|
||||
private const string ExperimentGradeManagementMigration =
|
||||
"20260728_40_experiment_grade_management";
|
||||
private const string AppUpdateReleasesMigration =
|
||||
"20260729_41_app_update_releases";
|
||||
|
||||
public async Task MigrateAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
@@ -571,6 +573,10 @@ public sealed class DevelopmentSqliteMigrator(
|
||||
? []
|
||||
: ExperimentGradeManagementStatements),
|
||||
cancellationToken);
|
||||
await ApplyMigrationAsync(
|
||||
AppUpdateReleasesMigration,
|
||||
AppUpdateReleasesStatements,
|
||||
cancellationToken);
|
||||
}
|
||||
|
||||
private async Task ApplyMigrationAsync(
|
||||
@@ -2042,6 +2048,46 @@ public sealed class DevelopmentSqliteMigrator(
|
||||
"""
|
||||
];
|
||||
|
||||
private static readonly string[] AppUpdateReleasesStatements =
|
||||
[
|
||||
"""
|
||||
CREATE TABLE IF NOT EXISTS "AppUpdateReleases" (
|
||||
"Id" TEXT NOT NULL CONSTRAINT "PK_AppUpdateReleases" PRIMARY KEY,
|
||||
"Platform" TEXT NOT NULL,
|
||||
"Channel" TEXT NOT NULL,
|
||||
"Version" TEXT NOT NULL,
|
||||
"NativeVersion" TEXT NOT NULL,
|
||||
"Status" TEXT NOT NULL,
|
||||
"ReleaseNotes" TEXT NULL,
|
||||
"FileName" TEXT NOT NULL,
|
||||
"FileSize" INTEGER NOT NULL,
|
||||
"Sha256" TEXT NOT NULL,
|
||||
"BundleContent" BLOB NOT NULL,
|
||||
"CreatedByUserName" TEXT NOT NULL,
|
||||
"PublishedByUserName" TEXT NULL,
|
||||
"PublishedAt" TEXT NULL,
|
||||
"CreatedAt" TEXT NOT NULL,
|
||||
"UpdatedAt" TEXT NOT NULL
|
||||
);
|
||||
""",
|
||||
"""
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS
|
||||
"IX_AppUpdateReleases_Platform_Channel_NativeVersion_Version"
|
||||
ON "AppUpdateReleases"
|
||||
("Platform", "Channel", "NativeVersion", "Version");
|
||||
""",
|
||||
"""
|
||||
CREATE INDEX IF NOT EXISTS
|
||||
"IX_AppUpdateReleases_Platform_Channel_NativeVersion_Status"
|
||||
ON "AppUpdateReleases"
|
||||
("Platform", "Channel", "NativeVersion", "Status");
|
||||
""",
|
||||
"""
|
||||
CREATE INDEX IF NOT EXISTS "IX_AppUpdateReleases_CreatedAt"
|
||||
ON "AppUpdateReleases" ("CreatedAt");
|
||||
"""
|
||||
];
|
||||
|
||||
private static readonly string[] ApprovalTableStatements =
|
||||
[
|
||||
"""CREATE TABLE "CourseExemptions" ("Id" TEXT NOT NULL CONSTRAINT "PK_CourseExemptions" PRIMARY KEY, "StudentId" TEXT NOT NULL, "TeachingTaskId" TEXT NOT NULL, "Reason" TEXT NOT NULL, "Status" INTEGER NOT NULL, "ReviewComment" TEXT NULL, "SubmittedAt" TEXT NOT NULL, "ReviewedAt" TEXT NULL, "ReviewedByUserId" TEXT NULL, "CreatedAt" TEXT NOT NULL, "UpdatedAt" TEXT NOT NULL, CONSTRAINT "FK_CourseExemptions_Students" FOREIGN KEY ("StudentId") REFERENCES "Students" ("Id") ON DELETE RESTRICT, CONSTRAINT "FK_CourseExemptions_TeachingTasks" FOREIGN KEY ("TeachingTaskId") REFERENCES "TeachingTasks" ("Id") ON DELETE RESTRICT);""",
|
||||
|
||||
+5987
File diff suppressed because it is too large
Load Diff
+65
@@ -0,0 +1,65 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace Jiaowu.Api.Infrastructure.Persistence.Migrations.MySql
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class AppUpdateReleases : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.CreateTable(
|
||||
name: "AppUpdateReleases",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<Guid>(type: "char(36)", nullable: false),
|
||||
Platform = table.Column<string>(type: "varchar(20)", maxLength: 20, nullable: false),
|
||||
Channel = table.Column<string>(type: "varchar(20)", maxLength: 20, nullable: false),
|
||||
Version = table.Column<string>(type: "varchar(40)", maxLength: 40, nullable: false),
|
||||
NativeVersion = table.Column<string>(type: "varchar(40)", maxLength: 40, nullable: false),
|
||||
Status = table.Column<string>(type: "varchar(20)", maxLength: 20, nullable: false),
|
||||
ReleaseNotes = table.Column<string>(type: "varchar(1000)", maxLength: 1000, nullable: true),
|
||||
FileName = table.Column<string>(type: "varchar(180)", maxLength: 180, nullable: false),
|
||||
FileSize = table.Column<long>(type: "bigint", nullable: false),
|
||||
Sha256 = table.Column<string>(type: "varchar(64)", maxLength: 64, nullable: false),
|
||||
BundleContent = table.Column<byte[]>(type: "longblob", nullable: false),
|
||||
CreatedByUserName = table.Column<string>(type: "varchar(100)", maxLength: 100, nullable: false),
|
||||
PublishedByUserName = table.Column<string>(type: "varchar(100)", maxLength: 100, nullable: true),
|
||||
PublishedAt = table.Column<DateTime>(type: "datetime(6)", nullable: true),
|
||||
CreatedAt = table.Column<DateTime>(type: "datetime(6)", nullable: false),
|
||||
UpdatedAt = table.Column<DateTime>(type: "datetime(6)", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_AppUpdateReleases", x => x.Id);
|
||||
})
|
||||
.Annotation("MySQL:Charset", "utf8mb4");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_AppUpdateReleases_CreatedAt",
|
||||
table: "AppUpdateReleases",
|
||||
column: "CreatedAt");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_AppUpdateReleases_Platform_Channel_NativeVersion_Status",
|
||||
table: "AppUpdateReleases",
|
||||
columns: new[] { "Platform", "Channel", "NativeVersion", "Status" });
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_AppUpdateReleases_Platform_Channel_NativeVersion_Version",
|
||||
table: "AppUpdateReleases",
|
||||
columns: new[] { "Platform", "Channel", "NativeVersion", "Version" },
|
||||
unique: true);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "AppUpdateReleases");
|
||||
}
|
||||
}
|
||||
}
|
||||
+82
@@ -4129,6 +4129,88 @@ namespace Jiaowu.Api.Infrastructure.Persistence.Migrations.MySql
|
||||
b.ToTable("AspNetUsers", (string)null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jiaowu.Api.Domain.System.AppUpdateRelease", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.Property<byte[]>("BundleContent")
|
||||
.IsRequired()
|
||||
.HasColumnType("longblob");
|
||||
|
||||
b.Property<string>("Channel")
|
||||
.IsRequired()
|
||||
.HasMaxLength(20)
|
||||
.HasColumnType("varchar(20)");
|
||||
|
||||
b.Property<DateTime>("CreatedAt")
|
||||
.HasColumnType("datetime(6)");
|
||||
|
||||
b.Property<string>("CreatedByUserName")
|
||||
.IsRequired()
|
||||
.HasMaxLength(100)
|
||||
.HasColumnType("varchar(100)");
|
||||
|
||||
b.Property<string>("FileName")
|
||||
.IsRequired()
|
||||
.HasMaxLength(180)
|
||||
.HasColumnType("varchar(180)");
|
||||
|
||||
b.Property<long>("FileSize")
|
||||
.HasColumnType("bigint");
|
||||
|
||||
b.Property<string>("NativeVersion")
|
||||
.IsRequired()
|
||||
.HasMaxLength(40)
|
||||
.HasColumnType("varchar(40)");
|
||||
|
||||
b.Property<string>("Platform")
|
||||
.IsRequired()
|
||||
.HasMaxLength(20)
|
||||
.HasColumnType("varchar(20)");
|
||||
|
||||
b.Property<DateTime?>("PublishedAt")
|
||||
.HasColumnType("datetime(6)");
|
||||
|
||||
b.Property<string>("PublishedByUserName")
|
||||
.HasMaxLength(100)
|
||||
.HasColumnType("varchar(100)");
|
||||
|
||||
b.Property<string>("ReleaseNotes")
|
||||
.HasMaxLength(1000)
|
||||
.HasColumnType("varchar(1000)");
|
||||
|
||||
b.Property<string>("Sha256")
|
||||
.IsRequired()
|
||||
.HasMaxLength(64)
|
||||
.HasColumnType("varchar(64)");
|
||||
|
||||
b.Property<string>("Status")
|
||||
.IsRequired()
|
||||
.HasMaxLength(20)
|
||||
.HasColumnType("varchar(20)");
|
||||
|
||||
b.Property<DateTime>("UpdatedAt")
|
||||
.HasColumnType("datetime(6)");
|
||||
|
||||
b.Property<string>("Version")
|
||||
.IsRequired()
|
||||
.HasMaxLength(40)
|
||||
.HasColumnType("varchar(40)");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("CreatedAt");
|
||||
|
||||
b.HasIndex("Platform", "Channel", "NativeVersion", "Status");
|
||||
|
||||
b.HasIndex("Platform", "Channel", "NativeVersion", "Version")
|
||||
.IsUnique();
|
||||
|
||||
b.ToTable("AppUpdateReleases");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Jiaowu.Api.Domain.System.AuditLog", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
|
||||
Reference in New Issue
Block a user