package main import ( "encoding/json" "github.com/aarongao/tools" "github.com/davecgh/go-spew/spew" "github.com/gin-gonic/gin" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "letu/Api" "letu/Config" "letu/DB" "letu/Lib/Auth" "letu/Lib/Cache" "letu/Lib/DelayMessage" "log" "os" "time" ) // @APIVersion 1.0.0 // @APITitle 乐游图后端接口文档 // @BasePath 正式 leyoutu.st-i.com.cn; 测试 leyoutu.sti-uat.com var Gin *gin.Engine func main() { // 读取配置文件 dir, _ := os.Getwd() file, _ := os.Open(dir + "/Config/config.json") defer file.Close() decoder := json.NewDecoder(file) err := decoder.Decode(&Config.Info) tools.CheckError(err) // 连接数据库 // Set client options clientOptions := options.Client() if Config.Info.Env == "DEV" { clientOptions.ApplyURI("mongodb://" + Config.Info.DbPath) } else if Config.Info.Env == "PRODUCT" { credential := options.Credential{ AuthMechanism: "SCRAM-SHA-1", AuthSource: Config.Info.DbName, Username: Config.Info.DbUser, Password: Config.Info.DbPassword, } clientOptions.ApplyURI("mongodb://" + Config.Info.DbPath).SetAuth(credential) } else { log.Fatal("未知的运行环境 DEV or PRODUCT") return } clientOptions.SetLocalThreshold(3 * time.Second) //只使用与mongo操作耗时小于3秒的 clientOptions.SetMaxConnIdleTime(5 * time.Second) //指定连接可以保持空闲的最大毫秒数 clientOptions.SetMaxPoolSize(4096) //使用最大的连接数 // Connect to MongoDB client, err := mongo.Connect(tools.GetContext(), clientOptions) if err != nil { log.Fatal(err) } // Check the connection err = client.Ping(tools.GetContext(), nil) if err != nil { log.Fatal(err) } log.Println("Connected to MongoDB!") //获取文档集 DB.DB = client.Database(Config.Info.DbName) DB.CItem = DB.DB.Collection("Item") DB.CComplaint = DB.DB.Collection("Complaint") DB.CInvestigation = DB.DB.Collection("Investigation") DB.CMember = DB.DB.Collection("Member") DB.CCommodity = DB.DB.Collection("Commodity") DB.CTags = DB.DB.Collection("Tags") DB.CScenic = DB.DB.Collection("Scenic") DB.CLine = DB.DB.Collection("Line") DB.CUserLog = DB.DB.Collection("UserLog") DB.CSystemLog = DB.DB.Collection("SystemLog") DB.CInvestigation = DB.DB.Collection("Investigation") DB.CTrajectory = DB.DB.Collection("Trajectory") DB.CIcons = DB.DB.Collection("Icons") DB.CTopMenus = DB.DB.Collection("TopMenus") DB.CDevice = DB.DB.Collection("Device") DelayMessage.CDelayMessage = DB.DB.Collection("DelayMessage") DelayMessage.CDelayErrorLog = DB.DB.Collection("DelayErrorLog") // 连接redis DB.Redis = Cache.NewRedis(&Cache.RedisOpts{ Config.Info.RedisPath, "", 0, 200, 20, 0, }) Gin = gin.Default() //r.Static("/.well-known", "./.well-known/") InitController("GET", "/AllItems", Api.AllItems, &DB.SModel{}) InitController("GET", "/AllItemTime", Api.AllItemTime, &DB.SModel{}) InitController("GET", "/AllCommodity", Api.AllCommodity, &DB.SModel{}) InitController("GET", "/AllLine", Api.AllLine, &DB.SModel{}) InitController("GET", "/ItemInfo", Api.ItemInfo, &DB.SModel{}) InitController("GET", "/CommodityInfo", Api.CommodityInfo, &DB.SModel{}) InitController("POST", "/CreateComplaint", Api.CreateComplaint, &DB.SModel{}) InitController("GET", "/AllComplaint", Api.AllComplaint, &DB.SModel{"投诉建议", "查看所有"}) //InitController("/CreateUser", Api.CreateUser) InitController("POST", "/LoginUser", Api.LoginUser, &DB.SModel{}) InitController("POST", "/UpdateUser", Api.UpdateUser, &DB.SModel{"用户管理", "修改"}) InitController("GET", "/UserInfo", Api.UserInfo, &DB.SModel{}) InitController("GET", "/ScenicInfo", Api.ScenicInfo, &DB.SModel{}) InitController("GET", "/LineInfo", Api.LineInfo, &DB.SModel{}) InitController("GET", "/AllTag", Api.AllTag, &DB.SModel{}) InitController("GET", "/AllTagGroup", Api.AllTagGroup, &DB.SModel{}) InitController("POST", "/Tag/Create", Api.CreateTag, &DB.SModel{"标签管理", "增加"}) InitController("POST", "/Tag/Remove", Api.RemoveTag, &DB.SModel{"标签管理", "删除"}) InitController("POST", "/Upload", Api.Upload, &DB.SModel{}) InitController("POST", "/UpdateItem", Api.UpdateItem, &DB.SModel{"项目管理", "修改"}) InitController("POST", "/UpdateCommodity", Api.UpdateCommodity, &DB.SModel{"商品管理", "修改"}) InitController("POST", "/UpdateLine", Api.UpdateLine, &DB.SModel{"线路管理", "修改"}) InitController("POST", "/UpdateScenic", Api.UpdateScenic, &DB.SModel{"景区管理", "修改"}) InitController("POST", "/UpdateItemTime", Api.UpdateItemTime, &DB.SModel{"项目管理", "修改等候时间"}) InitController("GET", "/AllScenic", Api.AllScenic, &DB.SModel{}) InitController("POST", "/UserLog", Api.UserLog, &DB.SModel{}) InitController("GET", "/AllUserLog", Api.AllUserLog, &DB.SModel{}) InitController("POST", "/Sms/Send", Api.Send, &DB.SModel{}) InitController("POST", "/Investigation/Save", Api.SaveInvestigation, &DB.SModel{}) InitController("GET", "/Investigation/List", Api.AllInvestigation, &DB.SModel{}) InitController("POST", "/Trajectory/Save", Api.SaveTrajectory, &DB.SModel{}) InitController("POST", "/DealyMessage/Create", Api.CreateDealyMessage, &DB.SModel{"通知管理", "增加"}) InitController("GET", "/DealyMessage/Info", Api.DealyMessageInfo, &DB.SModel{"通知管理", "查看所有"}) InitController("POST", "/DealyMessage/Remove", Api.RemoveDealyMessage, &DB.SModel{"通知管理", "删除"}) InitController("POST", "/Icon/Update", Api.UpdateIcon, &DB.SModel{"图标管理", "修改管理"}) InitController("GET", "/Icon/All", Api.AllIcons, &DB.SModel{}) InitController("GET", "/Icon/Info", Api.IconInfo, &DB.SModel{}) InitController("POST", "/CheckToken", Api.CheckToken, &DB.SModel{}) //InitController("/Tiles", Api.Tiles) InitController("POST", "/TopMenus/Update", Api.UpdateTopMenus, &DB.SModel{}) InitController("GET", "/TopMenus/All", Api.AllTopMenus, &DB.SModel{}) InitController("GET", "/RegisterDevice", Api.RegisterDevice, &DB.SModel{}) InitController("POST", "/RemoveUser", Api.RemoveUser, &DB.SModel{"用户管理", "删除"}) InitController("POST", "/LoginOperator", Api.LoginOperator, &DB.SModel{}) InitController("POST", "/UpdateOperator", Api.UpdateOperator, &DB.SModel{"操作员管理", "增加和修改"}) InitController("GET", "/AllOperator", Api.AllOperator, &DB.SModel{"操作员管理", "查看所有"}) Gin.GET("/AllModules", Auth.Modules) //InitController("/ws", Api.WsPage) // 用于给赵翔测试通知效果 Gin.GET("/PushNoticeToiOS", Api.PushNoticeToiOS) Gin.Static("/Upload", "./Upload") Gin.Static("/Console", "./Console") Gin.Static("/Policy", dir+"/Policy") Gin.GET("MP_verify_R9xuhLXYcVbdDDNk.txt", func(c *gin.Context) { c.String(200, "R9xuhLXYcVbdDDNk") }) //r.Static("/tiles2", dir+"/tiles") // go Ws.Manager.Start() // 创建延迟消息 DelayMessage.GlobalDM = DelayMessage.NewDelayMessage() go func() { DelayMessage.GlobalDM.Start() }() // -初始化延迟数据 if cur, err := DelayMessage.CDelayMessage.Find(tools.GetContext(), bson.M{}); err == nil { defer cur.Close(tools.GetContext()) for cur.Next(tools.GetContext()) { var message DelayMessage.Message err := cur.Decode(&message) tools.CheckError(err) nowTimeU := time.Now().Unix() iDelayTIme := message.DelayTime - nowTimeU if iDelayTIme < 0 { iDelayTIme = 1 } DelayMessage.GlobalDM.AddTask(time.Now().Add(time.Second*time.Duration(iDelayTIme)), DelayMessage.Callback, &message) log.Println("增加提醒任务", message) } } else { spew.Dump(err) } Gin.Run(Config.Info.ServerPort) } func InitController(method string, uri string, handFunc func(c *gin.Context), auth *DB.SModel) { if auth.Model != "" { Auth.Models[auth.Model] = append(Auth.Models[auth.Model], auth.Action) } if method == "GET" { Gin.GET(uri, Auth.CheckAuthFunc(handFunc, auth)) } if method == "POST" { Gin.POST(uri, Auth.CheckAuthFunc(handFunc, auth)) } }