migrate.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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.NewSysI18n(), // 国际化
  39. entity.NewUserLogs(), // 用户操作日志(审计)
  40. // DayTask模块(核心业务表)
  41. entity.NewDtUser(),
  42. entity.NewDtUserLevel(),
  43. entity.NewDtUserSocial(),
  44. entity.NewDtUserPayment(),
  45. entity.NewDtTaskCategory(),
  46. entity.NewDtTask(),
  47. entity.NewDtTaskStep(),
  48. entity.NewDtUserTask(),
  49. entity.NewDtBalanceLog(),
  50. entity.NewDtWithdrawOrder(),
  51. entity.NewDtUserSign(),
  52. entity.NewDtNotice(),
  53. entity.NewDtBanner(),
  54. entity.NewDtMaterial(),
  55. entity.NewDtMaterialCategory(),
  56. entity.NewDtLeaderboardStats(),
  57. entity.NewDtLeaderboardReward(),
  58. entity.NewDtConfig(),
  59. entity.NewDtHelpCategory(),
  60. entity.NewDtHelp(),
  61. entity.NewDtCustomerService(),
  62. }
  63. // 其他业务模块的表(暂时不使用,需要时再启用)
  64. var deprecatedTables = []MigrateTable{
  65. // 系统配置信息
  66. // entity.NewSysSignConfig(),
  67. // entity.NewAssetConfig(),
  68. // entity.NewSysCoin(),
  69. // entity.NewSysLevelConfig(),
  70. // entity.NewSysJob(),
  71. // // 用户
  72. // entity.NewUser(),
  73. // entity.NewUserQuota(),
  74. // entity.NewUserRelationActionLog(),
  75. // // 资产模块
  76. // entity.NewAsset(),
  77. // entity.NewAssetBill(),
  78. // entity.NewAssetRwRecord(),
  79. // entity.NewAssetRwCallbackLog(),
  80. // // 新增指标模块
  81. // entity.NewUserProfit(),
  82. // entity.NewUserProfitRecord(),
  83. // // 节点模块
  84. // entity.NewNodeOrderPayments(),
  85. // entity.NewNodeOrder(),
  86. // entity.NewNodeInfo(),
  87. // entity.NewNodeBanner(),
  88. // // 业务模块
  89. // entity.NewStakeProduct(),
  90. // entity.NewStakeUserCurrentOrder(),
  91. // entity.NewStakeUserCurrentOpsRecord(),
  92. // entity.NewStakeQueueInfo(),
  93. // entity.NewStakePeriodJob(),
  94. // // 促销活动模块
  95. // entity.NewPromotionUpgradeLevel(),
  96. }
  97. func migrateMain(db *gorm.DB) {
  98. CurrentDatabase := db.Migrator().CurrentDatabase()
  99. core.Log.Info(fmt.Sprintf("当前数据库[%s]", CurrentDatabase))
  100. mTables := make([]MigrateTable, 0)
  101. mTables = append(mTables, allTables...)
  102. migrationTable(db, mTables) // 同步数据库结构
  103. core.Log.Info(fmt.Sprintf("数据库模型迁移完成"))
  104. }
  105. func sysDataInit(db *gorm.DB) {
  106. var err error
  107. defer func() {
  108. if err != nil {
  109. core.Log.Error(err.Error())
  110. } else {
  111. core.Log.Infof("系统基础数据初始化完成")
  112. }
  113. }()
  114. if err = sysSignInfoInit(db); err != nil {
  115. return
  116. }
  117. if err = entity.NewSysCoin().DataInit(db); err != nil {
  118. return
  119. }
  120. if err = entity.NewAssetConfig().DataInit(db); err != nil {
  121. return
  122. }
  123. if err = entity.NewSysLevelConfig().DataInit(db); err != nil {
  124. return
  125. }
  126. if err = entity.NewNodeInfo().DataInit(db); err != nil {
  127. return
  128. }
  129. if err = entity.NewStakeProduct().DataInit(db); err != nil {
  130. return
  131. }
  132. return
  133. }
  134. func migrationTable(db *gorm.DB, tables []MigrateTable) {
  135. for _, table := range tables {
  136. core.Log.Info(fmt.Sprintf("开始迁移[%s]表", table.TableName()))
  137. db = db.Set("gorm:table_options", "ENGINE=InnoDB")
  138. comment := fmt.Sprintf("COMMENT='%s'", table.Comment())
  139. db = db.Set("gorm:table_options", comment)
  140. err := db.Migrator().AutoMigrate(table)
  141. if err != nil {
  142. core.Log.Error(fmt.Sprintf("[%s]表迁移失败:%s", table.TableName(), err.Error()))
  143. }
  144. }
  145. }
  146. // 初始化系统签名信息
  147. func sysSignInfoInit(db *gorm.DB) error {
  148. var rows []entity.SysSignConfig
  149. // 初始化本系统密钥信息
  150. findRow := entity.NewSysSignConfig()
  151. err := db.Model(&entity.SysSignConfig{}).Where("sign_name", config.SignSystemName).Find(&findRow).Error
  152. if err != nil {
  153. return err
  154. }
  155. if findRow.Id == 0 {
  156. addr, pri, err := core.GenerateSysInfo()
  157. if err != nil {
  158. return err
  159. }
  160. rows = append(rows, entity.SysSignConfig{
  161. IsSystemSign: true,
  162. SignName: config.SignSystemName,
  163. SignAddress: addr,
  164. SignPriKey: pri,
  165. SignExpSec: 5,
  166. SysUrl: fmt.Sprintf("http://127.0.0.1:%d", config.BizHostPort),
  167. })
  168. rows = append(rows, entity.SysSignConfig{
  169. IsSystemSign: false,
  170. SignName: config.SignSystemAdminServerName,
  171. SignAddress: config.SignSystemAdminServerAddress,
  172. SignExpSec: 5,
  173. SysUrl: fmt.Sprintf("http://127.0.0.1:%d", config.AdminHostPort),
  174. })
  175. }
  176. if len(rows) > 0 {
  177. return db.Create(&rows).Error
  178. }
  179. return nil
  180. }