migrate.go 4.9 KB

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