package main import ( "WechatGateWay/api" "WechatGateWay/global" "WechatGateWay/handle" "WechatGateWay/third_part" "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jinzhu/gorm" "github.com/robfig/cron" "github.com/spf13/viper" "log" "math/rand" "net/http" "net/url" "os" "time" ) func InitDB() *gorm.DB { driverName := "mysql" host := viper.GetString("db.MySQLHOST") port := viper.GetString("db.MySQLPORT") database := viper.GetString("db.MySQLDB") username := viper.GetString("db.MySQLUSER") password := viper.GetString("db.MySQLPASSWORD") charset := viper.GetString("db.MySQLCharset") loc := viper.GetString("db.MySQLLoc") dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true&loc=%s", username, password, host, port, database, charset, url.QueryEscape(loc)) //dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(driverName, dsn) //db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err == nil { log.Println("Connected to database") //db.DB()实现一个连接池 //设置最大连接数和最大闲置数 //默认0表示不限制 db.DB().SetMaxIdleConns(0) db.DB().SetMaxOpenConns(0) //给默认表名加前缀 gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string { //return "admin_" + defaultTableName + "_test_env" return "" + defaultTableName + "" } // 全局禁用表名复数 // 如果设置为true,`User`的默认表名为`user`,使用`TableName`设置的表名不受影响 // 如果设置为false,`User`的默认表名为`users` db.SingularTable(false) //打开sql日志 db.LogMode(viper.GetBool("db.GORMLog")) //创建表时,添加后缀 db.Set("grom:table_options", "ENGINE=InnoDB") //自动建表 db.AutoMigrate(&handle.WechatLog{}) db.AutoMigrate(&handle.WechatBlockWords{}) db.AutoMigrate(&api.BinancePrice{}) global.DB = db return db } else { log.Println("Connected to database failed") //log.Println("failed to connect database, err: " + err.Error()) panic("failed to connect database, err: " + err.Error()) return nil } } func init() { rand.Seed(time.Now().UnixNano()) // 读取配置文件 workDir, _ := os.Getwd() viper.SetConfigName("application") viper.SetConfigType("yml") viper.AddConfigPath(workDir) err := viper.ReadInConfig() if err != nil { fmt.Println("config file not found") os.Exit(1) } global.WechatCorpId = viper.GetString("wechat.CorpId") global.WechatToken = viper.GetString("wechat.AppToken") global.WechatEncodingAesKey = viper.GetString("wechat.EncodingAesKey") global.WechatSendSecret = viper.GetString("wechat.SendSecret") global.WechatSendAid = viper.GetString("wechat.SendAid") global.WechatImagePath = viper.GetString("wechat.ImagePath") // receive_id 企业应用的回调,表示corpid global.WxCrypt = global.NewWXBizMsgCrypt(global.WechatToken, global.WechatEncodingAesKey, global.WechatCorpId, global.XmlType) third_part.GetRemoteToken() //初始化数据库 global.DB = InitDB() log.Println("数据库初始化成功") log.Println("server init success") } func main() { c := cron.New() //每30分钟执行一次 c.AddFunc("0 */30 * * * *", func() { go third_part.GetRemoteToken() }) c.Start() log.Println("任务注册成功") // 开启一个http服务器,接收来自企业微信的消息 http.HandleFunc("/", handle.HandleTencent) port := viper.GetString("server.port") if port == "" { port = "8080" } log.Println("server start at port:", port) log.Fatalln(http.ListenAndServe(":"+port, nil)) defer global.DB.Close() }