init.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package models
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "time"
  7. "gorm.io/driver/postgres"
  8. "gorm.io/gorm"
  9. )
  10. var DB *gorm.DB
  11. func InitDB() {
  12. dsn := os.Getenv("DB_DSN")
  13. if dsn == "" {
  14. // Fallback for local development if not in env
  15. dsn = "host=localhost user=ems password=ems_pass dbname=ems port=5433 sslmode=disable TimeZone=Asia/Shanghai"
  16. }
  17. var err error
  18. maxRetries := 30
  19. for i := 0; i < maxRetries; i++ {
  20. DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})
  21. if err == nil {
  22. break
  23. }
  24. log.Printf("Failed to connect to database (attempt %d/%d): %v. Retrying in 2 seconds...", i+1, maxRetries, err)
  25. time.Sleep(2 * time.Second)
  26. }
  27. if err != nil {
  28. log.Fatal("Failed to connect to database after multiple attempts:", err)
  29. }
  30. // Set connection pool settings
  31. sqlDB, err := DB.DB()
  32. if err != nil {
  33. log.Fatal("Failed to get generic database object:", err)
  34. }
  35. // SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
  36. sqlDB.SetMaxIdleConns(10)
  37. // SetMaxOpenConns sets the maximum number of open connections to the database.
  38. sqlDB.SetMaxOpenConns(100)
  39. // SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
  40. sqlDB.SetConnMaxLifetime(time.Hour)
  41. fmt.Println("Database connected successfully")
  42. // Auto Migrate
  43. err = DB.AutoMigrate(
  44. &IntegrationSource{},
  45. &Device{},
  46. &SysLocation{},
  47. &AlarmLog{},
  48. &SysOperLog{},
  49. &InspectionLedger{},
  50. &User{},
  51. &SysRole{},
  52. &SysUserRole{},
  53. &SysConfig{},
  54. &SysMenu{},
  55. &SysRoleMenu{},
  56. &EquipmentCleaningFormulaTemplate{},
  57. &BackupLog{},
  58. &AlarmRule{},
  59. &AlarmRuleBinding{},
  60. )
  61. if err != nil {
  62. log.Fatal("Failed to migrate database:", err)
  63. }
  64. fmt.Println("Database migration completed")
  65. // Initialize default user and role
  66. InitDefaultUser(DB)
  67. // Initialize basic menu data
  68. InitSysMenuData(DB)
  69. }
  70. func InitDefaultUser(db *gorm.DB) {
  71. // Find or create admin role
  72. var adminRole SysRole
  73. if err := db.Where("role_key = ?", "admin").First(&adminRole).Error; err != nil {
  74. fmt.Println("Initializing Admin Role...")
  75. adminRole = SysRole{
  76. Name: "超级管理员",
  77. RoleKey: "admin",
  78. DataScope: "1",
  79. Status: "0",
  80. }
  81. if err := db.Create(&adminRole).Error; err != nil {
  82. log.Printf("Error creating admin role: %v", err)
  83. return
  84. }
  85. }
  86. // Find or create admin user
  87. var adminUser User
  88. if err := db.Where("username = ?", "admin").First(&adminUser).Error; err != nil {
  89. fmt.Println("Initializing Admin User...")
  90. adminUser = User{
  91. Username: "admin",
  92. Password: "admin123", // Default password
  93. Name: "系统管理员",
  94. Role: "ADMIN",
  95. Status: "0",
  96. }
  97. if err := db.Create(&adminUser).Error; err != nil {
  98. log.Printf("Error creating admin user: %v", err)
  99. return
  100. }
  101. // Assign admin role to admin user
  102. db.Create(&SysUserRole{
  103. UserID: adminUser.ID,
  104. RoleID: adminRole.ID,
  105. })
  106. }
  107. }