main.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "strconv"
  6. _ "think-go/models"
  7. _ "think-go/routers"
  8. "think-go/utils"
  9. "time"
  10. "github.com/beego/beego/v2/client/orm"
  11. beego "github.com/beego/beego/v2/server/web"
  12. bcontext "github.com/beego/beego/v2/server/web/context"
  13. _ "github.com/go-sql-driver/mysql"
  14. )
  15. const (
  16. defaultMaxIdleConns = 10
  17. defaultMaxOpenConns = 100
  18. defaultConnMaxLife = 300
  19. )
  20. func getStringConfig(key string, fallback string) string {
  21. v, err := beego.AppConfig.String(key)
  22. if err != nil || v == "" {
  23. return fallback
  24. }
  25. return v
  26. }
  27. func getIntConfig(key string, fallback int) int {
  28. raw, err := beego.AppConfig.String(key)
  29. if err != nil || raw == "" {
  30. return fallback
  31. }
  32. v, err := strconv.Atoi(raw)
  33. if err != nil || v <= 0 {
  34. log.Printf("invalid config %s=%q, fallback=%d", key, raw, fallback)
  35. return fallback
  36. }
  37. return v
  38. }
  39. func buildMySQLDSN() string {
  40. user := getStringConfig("db_user", "root")
  41. password := getStringConfig("db_password", "root")
  42. host := getStringConfig("db_host", "127.0.0.1")
  43. port := getStringConfig("db_port", "3306")
  44. name := getStringConfig("db_name", "gva")
  45. charset := getStringConfig("db_charset", "utf8mb4")
  46. parseTime := getStringConfig("db_parse_time", "True")
  47. loc := getStringConfig("db_loc", "Local")
  48. return fmt.Sprintf(
  49. "%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=%s&loc=%s",
  50. user,
  51. password,
  52. host,
  53. port,
  54. name,
  55. charset,
  56. parseTime,
  57. loc,
  58. )
  59. }
  60. func init() {
  61. if err := orm.RegisterDriver("mysql", orm.DRMySQL); err != nil {
  62. log.Fatalf("register mysql driver failed: %v", err)
  63. }
  64. dbConn := getStringConfig("sqlconn", "")
  65. if dbConn == "" {
  66. dbConn = buildMySQLDSN()
  67. }
  68. maxIdle := getIntConfig("db_max_idle_conns", defaultMaxIdleConns)
  69. maxOpen := getIntConfig("db_max_open_conns", defaultMaxOpenConns)
  70. connLife := getIntConfig("db_conn_max_lifetime_sec", defaultConnMaxLife)
  71. if err := orm.RegisterDataBase(
  72. "default",
  73. "mysql",
  74. dbConn,
  75. orm.MaxIdleConnections(maxIdle),
  76. orm.MaxOpenConnections(maxOpen),
  77. orm.ConnMaxLifetime(time.Duration(connLife)*time.Second),
  78. ); err != nil {
  79. log.Fatalf("register database failed: %v", err)
  80. }
  81. if runmode, _ := beego.AppConfig.String("runmode"); runmode == "dev" {
  82. orm.Debug = true
  83. }
  84. if err := utils.InitRedis(); err != nil {
  85. log.Fatalf("init redis failed: %v", err)
  86. }
  87. if err := utils.InitWxPay(); err != nil {
  88. log.Fatalf("init wxpay failed: %v", err)
  89. }
  90. // 注册全局CORS过滤器
  91. beego.InsertFilter("*", beego.BeforeRouter, CORSFilter)
  92. }
  93. // CORSFilter 用于处理跨域请求
  94. func CORSFilter(ctx *bcontext.Context) {
  95. origin := ctx.Input.Header("Origin")
  96. if origin != "" {
  97. ctx.Output.Header("Access-Control-Allow-Origin", origin)
  98. }
  99. ctx.Output.Header("Access-Control-Allow-Credentials", "true")
  100. ctx.Output.Header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, PATCH, HEAD")
  101. // 建议把前端 fetch 用到的所有 Header 都加上
  102. ctx.Output.Header("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With, Accept, Origin")
  103. ctx.Output.Header("Access-Control-Max-Age", "86400")
  104. if ctx.Input.Method() == "OPTIONS" {
  105. ctx.Output.SetStatus(200)
  106. // 显式结束请求,防止进入后续逻辑
  107. return
  108. }
  109. }
  110. func main() {
  111. defer utils.CloseRedis()
  112. beego.Run()
  113. }