package cmds import ( "app/commons/config" "app/commons/core" "app/commons/model/entity" "fmt" "github.com/spf13/cobra" "gorm.io/gorm" ) // 数据库迁移服务 var migrateCmd = &cobra.Command{ Use: "migrate", Short: "数据库迁移服务", Run: func(cmd *cobra.Command, args []string) { if err := cmd.Help(); err != nil { panic(err) } migrateMain(core.MainDb()) // 系统表迁移及基础数据初始化 }, } var dataInitCmd = &cobra.Command{ Use: "data", Short: "数据迁移服务", Run: func(cmd *cobra.Command, args []string) { if err := cmd.Help(); err != nil { panic(err) } sysDataInit(core.MainDb()) // 数据初始化 }, } // MigrateTable 迁移表接口 type MigrateTable interface { TableName() string Comment() string } var allTables = []MigrateTable{ // 系统表(仅保留必需的) // entity.NewSysI18n(), // 国际化 entity.NewUserLogs(), // 用户操作日志(审计) // DayTask模块(核心业务表) entity.NewDtUser(), entity.NewDtUserLevel(), entity.NewDtUserSocial(), entity.NewDtUserPayment(), entity.NewDtTaskCategory(), entity.NewDtTask(), entity.NewDtTaskStep(), entity.NewDtUserTask(), entity.NewDtBalanceLog(), entity.NewDtWithdrawOrder(), entity.NewDtUserSign(), entity.NewDtNotice(), &entity.DtNoticeRead{}, entity.NewDtBanner(), entity.NewDtMaterial(), entity.NewDtMaterialCategory(), entity.NewDtLeaderboardStats(), entity.NewDtLeaderboardReward(), entity.NewDtConfig(), entity.NewDtHelpCategory(), entity.NewDtHelp(), entity.NewDtCustomerService(), } // 其他业务模块的表(暂时不使用,需要时再启用) var deprecatedTables = []MigrateTable{ // 系统配置信息 // entity.NewSysSignConfig(), // entity.NewAssetConfig(), // entity.NewSysCoin(), // entity.NewSysLevelConfig(), // entity.NewSysJob(), // // 用户 // entity.NewUser(), // entity.NewUserQuota(), // entity.NewUserRelationActionLog(), // // 资产模块 // entity.NewAsset(), // entity.NewAssetBill(), // entity.NewAssetRwRecord(), // entity.NewAssetRwCallbackLog(), // // 新增指标模块 // entity.NewUserProfit(), // entity.NewUserProfitRecord(), // // 节点模块 // entity.NewNodeOrderPayments(), // entity.NewNodeOrder(), // entity.NewNodeInfo(), // entity.NewNodeBanner(), // // 业务模块 // entity.NewStakeProduct(), // entity.NewStakeUserCurrentOrder(), // entity.NewStakeUserCurrentOpsRecord(), // entity.NewStakeQueueInfo(), // entity.NewStakePeriodJob(), // // 促销活动模块 // entity.NewPromotionUpgradeLevel(), } func migrateMain(db *gorm.DB) { CurrentDatabase := db.Migrator().CurrentDatabase() core.Log.Info(fmt.Sprintf("当前数据库[%s]", CurrentDatabase)) mTables := make([]MigrateTable, 0) mTables = append(mTables, allTables...) migrationTable(db, mTables) // 同步数据库结构 core.Log.Info(fmt.Sprintf("数据库模型迁移完成")) } func sysDataInit(db *gorm.DB) { var err error defer func() { if err != nil { core.Log.Error(err.Error()) } else { core.Log.Infof("系统基础数据初始化完成") } }() if err = sysSignInfoInit(db); err != nil { return } if err = entity.NewSysCoin().DataInit(db); err != nil { return } if err = entity.NewAssetConfig().DataInit(db); err != nil { return } if err = entity.NewSysLevelConfig().DataInit(db); err != nil { return } if err = entity.NewNodeInfo().DataInit(db); err != nil { return } if err = entity.NewStakeProduct().DataInit(db); err != nil { return } return } func migrationTable(db *gorm.DB, tables []MigrateTable) { for _, table := range tables { core.Log.Info(fmt.Sprintf("开始迁移[%s]表", table.TableName())) db = db.Set("gorm:table_options", "ENGINE=InnoDB") comment := fmt.Sprintf("COMMENT='%s'", table.Comment()) db = db.Set("gorm:table_options", comment) err := db.Migrator().AutoMigrate(table) if err != nil { core.Log.Error(fmt.Sprintf("[%s]表迁移失败:%s", table.TableName(), err.Error())) } } } // 初始化系统签名信息 func sysSignInfoInit(db *gorm.DB) error { var rows []entity.SysSignConfig // 初始化本系统密钥信息 findRow := entity.NewSysSignConfig() err := db.Model(&entity.SysSignConfig{}).Where("sign_name", config.SignSystemName).Find(&findRow).Error if err != nil { return err } if findRow.Id == 0 { addr, pri, err := core.GenerateSysInfo() if err != nil { return err } rows = append(rows, entity.SysSignConfig{ IsSystemSign: true, SignName: config.SignSystemName, SignAddress: addr, SignPriKey: pri, SignExpSec: 5, SysUrl: fmt.Sprintf("http://127.0.0.1:%d", config.BizHostPort), }) rows = append(rows, entity.SysSignConfig{ IsSystemSign: false, SignName: config.SignSystemAdminServerName, SignAddress: config.SignSystemAdminServerAddress, SignExpSec: 5, SysUrl: fmt.Sprintf("http://127.0.0.1:%d", config.AdminHostPort), }) } if len(rows) > 0 { return db.Create(&rows).Error } return nil }