perf(*): 创作工作台 - 优化首页按需加载与画布交互并修复历史迁移冲突

This commit is contained in:
ddCat committed 2026-09-05 13:24:10 +08:00
1 parent 165b4443ab
commit 58f01d1eb6
107 files changed
+3025 -1089

No files matched your search

+54 -3
View File
@@ -10,7 +10,7 @@ import (
"gorm.io/gorm"
)
const CurrentSchemaVersion int64 = 7
const CurrentSchemaVersion int64 = 8
const baselineSchemaChecksum = "sha256:open-ai-canvas-schema-v1-20260830"
const schemaMigrationAppliedAtIndexChecksum = "sha256:schema-migrations-applied-at-index-v2-20260830"
@@ -19,6 +19,7 @@ const resourceUploadKeyChecksum = "sha256:resource-upload-key-v4-20260901"
const paymentTopupChecksum = "sha256:payment-topup-v5-20260902"
const resourcePlaybackChecksum = "sha256:resource-playback-v6-20260902"
const assetLibraryFoldersChecksum = "sha256:asset-library-folders-v6-20260902"
const logicalModelActiveCodeChecksum = "sha256:logical-model-active-code-v8-20260905"
const postgresSchemaMigrationLockID int64 = 73123910420260830
@@ -52,6 +53,35 @@ var schemaMigrations = []migration{
{version: 5, name: "payment_topup", checksum: paymentTopupChecksum, apply: migrateSchemaV5},
{version: 6, name: "resource_playback_variant", checksum: resourcePlaybackChecksum, apply: migrateSchemaV6},
{version: 7, name: "asset_library_folders", checksum: assetLibraryFoldersChecksum, apply: migrateSchemaV7},
{version: 8, name: "logical_model_active_code", checksum: logicalModelActiveCodeChecksum, apply: migrateSchemaV8},
}
func migrationsForDatabase(db *gorm.DB) ([]migration, error) {
var applied schemaMigration
err := db.First(&applied, "version = ?", 6).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
return schemaMigrations, nil
}
if err != nil {
return nil, fmt.Errorf("读取数据库迁移 6:%w", err)
}
if applied.Name != "asset_library_folders" {
return schemaMigrations, nil
}
legacy := migration{version: 6, name: "asset_library_folders", checksum: assetLibraryFoldersChecksum, apply: migrateSchemaV7}
if err := validateMigrationRecord(applied, legacy); err != nil {
return nil, err
}
plan := append([]migration(nil), schemaMigrations...)
for index, item := range plan {
switch item.version {
case 6:
plan[index] = legacy
case 7:
plan[index] = migration{version: 7, name: "resource_playback_variant", checksum: resourcePlaybackChecksum, apply: migrateSchemaV6}
}
}
return plan, nil
}
func migrateSchemaV2(tx *gorm.DB) error {
@@ -155,6 +185,19 @@ func migrateSchemaV7(tx *gorm.DB) error {
return nil
}
func migrateSchemaV8(tx *gorm.DB) error {
if !tx.Migrator().HasTable(&model.LogicalModel{}) {
return nil
}
if err := tx.Exec("DROP INDEX IF EXISTS idx_logical_models_code").Error; err != nil {
return fmt.Errorf("移除前台模型旧 code 唯一索引:%w", err)
}
if err := tx.Exec("CREATE UNIQUE INDEX idx_logical_models_code ON logical_models(code) WHERE archived_at IS NULL").Error; err != nil {
return fmt.Errorf("创建前台模型活动 code 唯一索引:%w", err)
}
return nil
}
func MigrateSchema(db *gorm.DB) error {
return db.Transaction(func(tx *gorm.DB) error {
if tx.Dialector.Name() == "postgres" {
@@ -165,7 +208,11 @@ func MigrateSchema(db *gorm.DB) error {
if err := tx.AutoMigrate(&schemaMigration{}); err != nil {
return fmt.Errorf("初始化数据库迁移记录:%w", err)
}
for _, item := range schemaMigrations {
plan, err := migrationsForDatabase(tx)
if err != nil {
return err
}
for _, item := range plan {
var applied schemaMigration
err := tx.First(&applied, "version = ?", item.version).Error
if err == nil {
@@ -208,7 +255,11 @@ func ReadSchemaStatus(db *gorm.DB) (SchemaStatus, error) {
}
func validateMigrationRecords(db *gorm.DB) error {
for _, item := range schemaMigrations {
plan, err := migrationsForDatabase(db)
if err != nil {
return err
}
for _, item := range plan {
var applied schemaMigration
if err := db.First(&applied, "version = ?", item.version).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {