ensure_tables.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package initialize
  2. import (
  3. "context"
  4. adapter "github.com/casbin/gorm-adapter/v3"
  5. "gorm.io/gorm"
  6. "server/model/example"
  7. sysModel "server/model/system"
  8. "server/service/system"
  9. )
  10. const initOrderEnsureTables = system.InitOrderExternal - 1
  11. type ensureTables struct{}
  12. // auto run
  13. func init() {
  14. system.RegisterInit(initOrderEnsureTables, &ensureTables{})
  15. }
  16. func (ensureTables) InitializerName() string {
  17. return "ensure_tables_created"
  18. }
  19. func (e *ensureTables) InitializeData(ctx context.Context) (next context.Context, err error) {
  20. return ctx, nil
  21. }
  22. func (e *ensureTables) DataInserted(ctx context.Context) bool {
  23. return true
  24. }
  25. func (e *ensureTables) MigrateTable(ctx context.Context) (context.Context, error) {
  26. db, ok := ctx.Value("db").(*gorm.DB)
  27. if !ok {
  28. return ctx, system.ErrMissingDBContext
  29. }
  30. tables := []interface{}{
  31. sysModel.SysApi{},
  32. sysModel.SysUser{},
  33. sysModel.SysBaseMenu{},
  34. sysModel.SysAuthority{},
  35. sysModel.JwtBlacklist{},
  36. sysModel.SysDictionary{},
  37. sysModel.SysAutoCodeHistory{},
  38. sysModel.SysOperationRecord{},
  39. sysModel.SysDictionaryDetail{},
  40. sysModel.SysBaseMenuParameter{},
  41. sysModel.SysBaseMenuBtn{},
  42. sysModel.SysAuthorityBtn{},
  43. sysModel.SysAutoCode{},
  44. sysModel.SysExportTemplate{},
  45. sysModel.Condition{},
  46. sysModel.JoinTemplate{},
  47. adapter.CasbinRule{},
  48. example.ExaFile{},
  49. example.ExaCustomer{},
  50. example.ExaFileChunk{},
  51. example.ExaFileUploadAndDownload{},
  52. }
  53. for _, t := range tables {
  54. _ = db.AutoMigrate(&t)
  55. // 视图 authority_menu 会被当成表来创建,引发冲突错误(更新版本的gorm似乎不会)
  56. // 由于 AutoMigrate() 基本无需考虑错误,因此显式忽略
  57. }
  58. return ctx, nil
  59. }
  60. func (e *ensureTables) TableCreated(ctx context.Context) bool {
  61. db, ok := ctx.Value("db").(*gorm.DB)
  62. if !ok {
  63. return false
  64. }
  65. tables := []interface{}{
  66. sysModel.SysApi{},
  67. sysModel.SysUser{},
  68. sysModel.SysBaseMenu{},
  69. sysModel.SysAuthority{},
  70. sysModel.JwtBlacklist{},
  71. sysModel.SysDictionary{},
  72. sysModel.SysAutoCodeHistory{},
  73. sysModel.SysOperationRecord{},
  74. sysModel.SysDictionaryDetail{},
  75. sysModel.SysBaseMenuParameter{},
  76. sysModel.SysBaseMenuBtn{},
  77. sysModel.SysAuthorityBtn{},
  78. sysModel.SysAutoCode{},
  79. sysModel.SysExportTemplate{},
  80. sysModel.Condition{},
  81. sysModel.JoinTemplate{},
  82. adapter.CasbinRule{},
  83. example.ExaFile{},
  84. example.ExaCustomer{},
  85. example.ExaFileChunk{},
  86. example.ExaFileUploadAndDownload{},
  87. }
  88. yes := true
  89. for _, t := range tables {
  90. yes = yes && db.Migrator().HasTable(t)
  91. }
  92. return yes
  93. }