package api import ( "database/sql/driver" "encoding/json" "fmt" ctxLogger "github.com/luizsuper/ctxLoggers" "go.uber.org/zap" "time" ) type ( ShopReq struct { PageNum int `json:"pageNum"` PageSize int `json:"pageSize"` UserLongitude float64 `json:"userLongitude"` UserLatitude float64 `json:"userLatitude"` CityCode string `json:"cityCode"` QuerySource int `json:"querySource"` } ShopResp struct { Head struct { Msg string `json:"msg"` Code int `json:"code"` } `json:"head"` Data struct { Pages int `json:"pages"` TotalSize string `json:"totalSize"` Items []Item `json:"items"` } `json:"data"` } ShoListItem struct { ShopId string `json:"shopId"` ShopLogoUrl string `json:"shopLogoUrl"` ShopName string `json:"shopName"` ShopAddr string `json:"shopAddr"` ShopLongitude string `json:"shopLongitude"` ShopLatitude string `json:"shopLatitude"` Distance int `json:"distance"` ShopScore int `json:"shopScore"` UserCouponCount int `json:"userCouponCount"` WeekdayGroupPlayPrice string `json:"weekdayGroupPlayPrice"` HolidayGroupPlayPrice string `json:"holidayGroupPlayPrice"` ShopSource int `json:"shopSource"` ShopHotValue int `json:"shopHotValue"` CouponInfoList []struct { CouponDiscountType int `json:"couponDiscountType"` CouponDiscountRatio int `json:"couponDiscountRatio"` CouponAmount string `json:"couponAmount"` } `json:"couponInfoList"` } ) const shopListUrl = `https://api.h5.helloaba.cn/shop/v3/getScriptMatchShopList` type ShopInfo struct { ID int `json:"id" gorm:"column:id"` Resp ShopResp `json:"resp" gorm:"column:resp"` } func (m *ShopInfo) TableName() string { return "shop_info" } func (p ShopResp) Value() (driver.Value, error) { return json.Marshal(p) } func (p *ShopResp) Scan(input interface{}) error { return json.Unmarshal(input.([]byte), &p) } func ShopMarshal(req, body []byte) (resp interface{}, err error) { r := new(ShopResp) err = json.Unmarshal(body, r) if err != nil { ctxLogger.Error(nil, "json UnmarshalError", zap.String("resp body", string(body))) } if r.Head.Code != 200 || r.Head.Msg != "成功" { ctxLogger.Error(nil, "net wrok error", zap.String("resq body", string(req)), zap.String("resp body", string(body))) } return r, err } // ShopLKvStr todo:抽象 // ShopLKvStr 按照顺序对查询的key排序 func ShopLKvStr(body ShopReq) string { //strings := []string{"pageNum", "pageSize", "userLongitude", "userLatitude", "cityCode", "querySource"} //sort.Strings(strings) //cityCode pageNum pageSize querySource userLatitude userLongitude var s = "" s += fmt.Sprintf("%v=%v&", "cityCode", body.CityCode) s += fmt.Sprintf("%v=%v&", "pageNum", body.PageNum) s += fmt.Sprintf("%v=%v&", "pageSize", body.PageSize) s += fmt.Sprintf("%v=%v&", "querySource", body.QuerySource) return s } func shopList(body ShopReq) { dto, err := Attach(shopListUrl, GetCheckSum(ShopLKvStr(body)), body, M, ShopMarshal) if err != nil { ctxLogger.Error(nil, "net error record") } if s, ok := dto.(*ShopResp); !ok { ctxLogger.Error(nil, "assertion error") } else { info := ShopInfo{Resp: *s} DB.Create(&info) ctxLogger.Info(nil, "detailOk", zap.Int("page", s.Data.Pages)) time.Sleep(time.Duration(1) * time.Second) } } func MultiShopList() { req := ShopReq{ PageNum: 1, PageSize: 10, UserLongitude: 121.58372497558594, UserLatitude: 31.347728729248047, CityCode: "310000", QuerySource: 1, } shopList(req) }