migrate.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package cmds
  2. import (
  3. "app/commons/config"
  4. "app/commons/core"
  5. "app/commons/model/entity"
  6. "fmt"
  7. "github.com/spf13/cobra"
  8. "gorm.io/gorm"
  9. )
  10. // 数据库迁移服务
  11. var migrateCmd = &cobra.Command{
  12. Use: "migrate",
  13. Short: "数据库迁移服务",
  14. Run: func(cmd *cobra.Command, args []string) {
  15. if err := cmd.Help(); err != nil {
  16. panic(err)
  17. }
  18. migrateMain(core.MainDb()) // 系统表迁移及基础数据初始化
  19. },
  20. }
  21. var dataInitCmd = &cobra.Command{
  22. Use: "data",
  23. Short: "数据迁移服务",
  24. Run: func(cmd *cobra.Command, args []string) {
  25. if err := cmd.Help(); err != nil {
  26. panic(err)
  27. }
  28. sysDataInit(core.MainDb()) // 数据初始化
  29. },
  30. }
  31. // MigrateTable 迁移表接口
  32. type MigrateTable interface {
  33. TableName() string
  34. Comment() string
  35. }
  36. var allTables = []MigrateTable{
  37. // 系统配置信息
  38. entity.NewSysSignConfig(),
  39. entity.NewAssetConfig(),
  40. entity.NewSysI18n(),
  41. entity.NewSysCoin(),
  42. entity.NewSysLevelConfig(),
  43. entity.NewSysJob(),
  44. // 用户
  45. entity.NewUser(),
  46. entity.NewUserQuota(),
  47. entity.NewUserLogs(),
  48. entity.NewUserRelationActionLog(),
  49. // 资产模块
  50. entity.NewAsset(),
  51. entity.NewAssetBill(),
  52. entity.NewAssetRwRecord(),
  53. entity.NewAssetRwCallbackLog(),
  54. // 新增指标模块
  55. entity.NewUserProfit(),
  56. entity.NewUserProfitRecord(),
  57. // 节点模块
  58. entity.NewNodeOrderPayments(),
  59. entity.NewNodeOrder(),
  60. entity.NewNodeInfo(),
  61. entity.NewNodeBanner(),
  62. // 业务模块
  63. entity.NewStakeProduct(), // 产品
  64. entity.NewStakeUserCurrentOrder(), // 活期订单
  65. entity.NewStakeUserCurrentOpsRecord(), // 活期操作记录
  66. //entity.NewStakeUserOrderPeriodSnapshot(), // 每期快照
  67. entity.NewStakeQueueInfo(), // 每气排队信息
  68. entity.NewStakePeriodJob(), // 每期任务
  69. // 促销活动模块
  70. entity.NewPromotionUpgradeLevel(), // 升级奖
  71. // Telegram红包模块
  72. entity.NewTgRedPacket(), // 红包表
  73. entity.NewTgRedPacketRecord(), // 抢红包记录
  74. entity.NewTgUserBind(), // Telegram用户绑定
  75. entity.NewTgBindToken(), // Telegram绑定令牌
  76. }
  77. func migrateMain(db *gorm.DB) {
  78. CurrentDatabase := db.Migrator().CurrentDatabase()
  79. core.Log.Info(fmt.Sprintf("当前数据库[%s]", CurrentDatabase))
  80. mTables := make([]MigrateTable, 0)
  81. mTables = append(mTables, allTables...)
  82. migrationTable(db, mTables) // 同步数据库结构
  83. core.Log.Info(fmt.Sprintf("数据库模型迁移完成"))
  84. }
  85. func sysDataInit(db *gorm.DB) {
  86. var err error
  87. defer func() {
  88. if err != nil {
  89. core.Log.Error(err.Error())
  90. } else {
  91. core.Log.Infof("系统基础数据初始化完成")
  92. }
  93. }()
  94. if err = sysSignInfoInit(db); err != nil {
  95. return
  96. }
  97. if err = entity.NewSysCoin().DataInit(db); err != nil {
  98. return
  99. }
  100. if err = entity.NewAssetConfig().DataInit(db); err != nil {
  101. return
  102. }
  103. if err = entity.NewSysLevelConfig().DataInit(db); err != nil {
  104. return
  105. }
  106. if err = entity.NewNodeInfo().DataInit(db); err != nil {
  107. return
  108. }
  109. if err = entity.NewStakeProduct().DataInit(db); err != nil {
  110. return
  111. }
  112. return
  113. }
  114. func migrationTable(db *gorm.DB, tables []MigrateTable) {
  115. for _, table := range tables {
  116. core.Log.Info(fmt.Sprintf("开始迁移[%s]表", table.TableName()))
  117. db = db.Set("gorm:table_options", "ENGINE=InnoDB")
  118. comment := fmt.Sprintf("COMMENT='%s'", table.Comment())
  119. db = db.Set("gorm:table_options", comment)
  120. err := db.Migrator().AutoMigrate(table)
  121. if err != nil {
  122. core.Log.Error(fmt.Sprintf("[%s]表迁移失败:%s", table.TableName(), err.Error()))
  123. }
  124. }
  125. }
  126. // 初始化系统签名信息
  127. func sysSignInfoInit(db *gorm.DB) error {
  128. var rows []entity.SysSignConfig
  129. // 初始化本系统密钥信息
  130. findRow := entity.NewSysSignConfig()
  131. err := db.Model(&entity.SysSignConfig{}).Where("sign_name", config.SignSystemName).Find(&findRow).Error
  132. if err != nil {
  133. return err
  134. }
  135. if findRow.Id == 0 {
  136. addr, pri, err := core.GenerateSysInfo()
  137. if err != nil {
  138. return err
  139. }
  140. rows = append(rows, entity.SysSignConfig{
  141. IsSystemSign: true,
  142. SignName: config.SignSystemName,
  143. SignAddress: addr,
  144. SignPriKey: pri,
  145. SignExpSec: 5,
  146. SysUrl: fmt.Sprintf("http://127.0.0.1:%d", config.BizHostPort),
  147. })
  148. rows = append(rows, entity.SysSignConfig{
  149. IsSystemSign: false,
  150. SignName: config.SignSystemAdminServerName,
  151. SignAddress: config.SignSystemAdminServerAddress,
  152. SignExpSec: 5,
  153. SysUrl: fmt.Sprintf("http://127.0.0.1:%d", config.AdminHostPort),
  154. })
  155. }
  156. if len(rows) > 0 {
  157. return db.Create(&rows).Error
  158. }
  159. return nil
  160. }