main.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package main
  2. import (
  3. "Tech/common"
  4. "Tech/controllers"
  5. _ "Tech/routers"
  6. "time"
  7. "github.com/beego/beego/v2/client/orm"
  8. "github.com/beego/beego/v2/core/logs"
  9. "github.com/beego/beego/v2/server/web"
  10. beego "github.com/beego/beego/v2/server/web"
  11. "github.com/beego/beego/v2/server/web/filter/cors"
  12. )
  13. func init() {
  14. // 注册驱动(可选的,mysql/sqlite3/postgres 默认已注册):cite[4]
  15. // orm.RegisterDriver("mysql", orm.DR_MySQL)
  16. // 从配置文件读取数据库配置
  17. dbAdapter, _ := beego.AppConfig.String("DB.Adapter")
  18. dbURL, _ := beego.AppConfig.String("DB.URL")
  19. // 注册数据库
  20. orm.RegisterDataBase("default", dbAdapter, dbURL)
  21. // 启动数据库连接监控协程
  22. go monitorDatabaseConnection(dbAdapter, dbURL)
  23. // 注册模型(也可以在主程序入口或模型自身的 init 函数中)
  24. // orm.RegisterModel(new(User))
  25. }
  26. // sendHeartbeatPeriodically 定时发送心跳到信息化服务器
  27. func sendHeartbeatPeriodically() {
  28. ticker := time.NewTicker(30 * time.Second) // 每30秒发送一次心跳
  29. defer ticker.Stop()
  30. for range ticker.C {
  31. err := func() error {
  32. defer func() {
  33. if r := recover(); r != nil {
  34. logs.Error("发送心跳时发生异常: %v", r)
  35. }
  36. }()
  37. err := common.SendHeartbeat()
  38. if err != nil {
  39. logs.Error("发送心跳失败: %v", err)
  40. return err
  41. }
  42. logs.Info("成功发送心跳到信息化服务器")
  43. return nil
  44. }()
  45. if err != nil {
  46. logs.Error("发送心跳任务出现错误: %v", err)
  47. }
  48. }
  49. }
  50. // monitorDatabaseConnection 定时检查数据库连接并尝试重连
  51. // monitorDatabaseConnection 定时检查数据库连接并尝试重连
  52. func monitorDatabaseConnection(dbAdapter, dbURL string) {
  53. ticker := time.NewTicker(10 * time.Second) // 每10秒检查一次
  54. defer ticker.Stop()
  55. for range ticker.C {
  56. // 使用匿名函数包装可能产生异常的操作,并在每次循环都进行异常处理
  57. func() {
  58. defer func() {
  59. if r := recover(); r != nil {
  60. // 即使NewOrm发生异常,也要尝试重新注册数据库连接
  61. logs.Error("监控协程发生异常: %v", r)
  62. err := orm.RegisterDataBase("default", dbAdapter, dbURL)
  63. if err != nil {
  64. logs.Error("数据库重连失败: ", err)
  65. } else {
  66. logs.Info("数据库重连成功")
  67. }
  68. }
  69. }()
  70. // 尝试执行一个简单的查询来测试连接
  71. o := orm.NewOrm()
  72. _, err := o.Raw("SELECT 1").Exec()
  73. if err != nil {
  74. logs.Error("数据库连接异常: ", err)
  75. // 尝试重新注册数据库连接
  76. err = orm.RegisterDataBase("default", dbAdapter, dbURL)
  77. if err != nil {
  78. logs.Error("数据库重连失败: ", err)
  79. } else {
  80. logs.Info("数据库重连成功")
  81. }
  82. }
  83. }()
  84. }
  85. }
  86. func main() {
  87. // 自动建表。参数说明:数据库别名、是否强制重建(false 则只创建新表)、是否打印日志
  88. // orm.RunSyncdb("default", false, true)
  89. // 可选:开启 ORM 调试模式,打印 SQL 日志
  90. // 将 URL 路径 /static/upload 映射到本地目录 static/upload
  91. // CORS 过滤器
  92. beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options{
  93. AllowAllOrigins: true,
  94. AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
  95. AllowHeaders: []string{"Origin", "Authorization", "Access-Control-Allow-Origin", "Content-Type"},
  96. ExposeHeaders: []string{"Content-Length", "Access-Control-Allow-Origin"},
  97. AllowCredentials: true,
  98. }))
  99. web.SetStaticPath("/static/upload", "static/upload")
  100. orm.Debug = true
  101. // 初始化用户信息缓存
  102. controllers.InitUserInfoCache()
  103. // 启动定时发送心跳任务
  104. go sendHeartbeatPeriodically()
  105. beego.Run()
  106. }