|
|
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()
|
|
|
}
|