package webserver import ( "encoding/json" "fmt" "io/ioutil" "net/http" "vamicro/iotData-service/manage" "vamicro/iotData-service/mqtt" "vamicro/iotData-service/serializer" "github.com/gin-gonic/gin" ) func Cors() gin.HandlerFunc { return func(c *gin.Context) { method := c.Request.Method //fmt.Println(method) c.Header("Access-Control-Allow-Origin", "*") c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token, developerId") c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, PATCH, DELETE") c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type") c.Header("Access-Control-Allow-Credentials", "true") // 放行所有OPTIONS方法,因为有的模板是要请求两次的 if method == "OPTIONS" { c.AbortWithStatus(http.StatusNoContent) } // 处理请求 c.Next() } } func Serve(port string) { r := gin.Default() r.Use(Cors()) urlPrefix := "/iotdata" r.POST(urlPrefix+"/devices", getAllDevices) r.POST(urlPrefix+"/audio", sendAudioMsg) r.GET(urlPrefix+"/device", getDeviceDetail) r.GET(urlPrefix+"/banner-info", getBasicInfo) r.GET(urlPrefix+"/seven-day", getSevenDayCount) r.POST(urlPrefix+"/low-battery", getLowBatWarn) r.POST(urlPrefix+"/out-bound", getOutWarn) r.POST(urlPrefix+"/handle-warn", handleWarn) r.POST(urlPrefix+"/history", gethistory) r.POST(urlPrefix+"/create-zone", createZone) r.POST(urlPrefix+"/del-zone", delZone) r.POST(urlPrefix+"/zones", getZones) r.Static("/iotdata/assets", "./assets") r.Run(":" + port) } func getAllDevices(c *gin.Context) { s := manage.ListDeviceService{} if err := c.ShouldBind(&s); err == nil { res := s.List() c.JSON(200, res) } else { c.JSON(200, ErrorResponse(err)) } } func getDeviceDetail(c *gin.Context) { s := manage.DeviceDetailService{} sn := c.Query("sn") res := s.Show(sn) c.JSON(200, res) } func sendAudioMsg(c *gin.Context) { sn := c.Query("sn") if sn == "" { c.JSON(500, map[string]interface{}{ "success": false, "data": "", "msg": "参数id不能为空", }) return } top := "/device_id/" + sn + "/device/helmetAudio" body, _ := ioutil.ReadAll(c.Request.Body) fmt.Println("文本是:::", string(body)) go mqtt.Client.Publish(top, body) c.JSON(200, map[string]interface{}{ "success": true, "msg": "请求成功", }) } func getBasicInfo(c *gin.Context) { s := manage.BasicInfoService{} res := s.Show() c.JSON(200, res) } func getSevenDayCount(c *gin.Context) { s := manage.SevenDayCountService{} res := s.Show() c.JSON(200, res) } func getLowBatWarn(c *gin.Context) { s := manage.LowBatteryService{} if err := c.ShouldBind(&s); err == nil { res := s.Show() c.JSON(200, res) } else { c.JSON(200, ErrorResponse(err)) } } func getOutWarn(c *gin.Context) { s := manage.LowBatteryService{} if err := c.ShouldBind(&s); err == nil { res := s.ShowOutBound() c.JSON(200, res) } else { c.JSON(200, ErrorResponse(err)) } } func gethistory(c *gin.Context) { s := manage.LowBatteryService{} if err := c.ShouldBind(&s); err == nil { res := s.ShowHistory() c.JSON(200, res) } else { c.JSON(200, ErrorResponse(err)) } } func handleWarn(c *gin.Context) { s := manage.HandleWarningService{} if err := c.ShouldBind(&s); err == nil { res := s.Handle() c.JSON(200, res) } else { c.JSON(200, ErrorResponse(err)) } } func createZone(c *gin.Context) { s := manage.ZoneService{} if err := c.ShouldBind(&s); err == nil { res := s.CreteOrEdit() c.JSON(200, res) } else { c.JSON(200, ErrorResponse(err)) } } func delZone(c *gin.Context) { s := manage.DelZoneService{} if err := c.ShouldBind(&s); err == nil { res := s.Del() c.JSON(200, res) } else { c.JSON(200, ErrorResponse(err)) } } func getZones(c *gin.Context) { s := manage.ZoneService{} if err := c.ShouldBind(&s); err == nil { res := s.List() c.JSON(200, res) } else { c.JSON(200, ErrorResponse(err)) } } func ErrorResponse(err error) serializer.Response { if _, ok := err.(*json.UnmarshalTypeError); ok { return serializer.Response{ Status: 40001, Msg: "JSON类型不匹配", Error: fmt.Sprint(err), } } return serializer.Response{ Status: 40001, Msg: "参数错误", Error: fmt.Sprint(err), } }