init
This commit is contained in:
		
						commit
						4dba9b162c
					
				| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
*.iml
 | 
			
		||||
.idea/
 | 
			
		||||
output/
 | 
			
		||||
dockerfiles/
 | 
			
		||||
log
 | 
			
		||||
.DS_Store
 | 
			
		||||
doc
 | 
			
		||||
cmd/test
 | 
			
		||||
go.sum
 | 
			
		||||
pkg
 | 
			
		||||
test.go
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,249 @@
 | 
			
		|||
package adapi
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/smbrave/gosdk/util"
 | 
			
		||||
	"github.com/spf13/cast"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Sdk struct {
 | 
			
		||||
	address string
 | 
			
		||||
	token   string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewSdk(address string, token string) *Sdk {
 | 
			
		||||
	if address == "" {
 | 
			
		||||
		address = "http://127.0.0.1:9281"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &Sdk{
 | 
			
		||||
		address: address,
 | 
			
		||||
		token:   token,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Sdk) httpGet(url string) error {
 | 
			
		||||
 | 
			
		||||
	body, err := util.HttpGet(url, map[string]string{
 | 
			
		||||
		"x-token": s.token,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type rsp_t struct {
 | 
			
		||||
		Code    int    `json:"code"`
 | 
			
		||||
		Message string `json:"message"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var rsp rsp_t
 | 
			
		||||
	if err := json.Unmarshal(body, &rsp); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if rsp.Code != 0 {
 | 
			
		||||
		return fmt.Errorf("%d:%s", rsp.Code, rsp.Message)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Sdk) httpMatchGet(url string) (*Result, error) {
 | 
			
		||||
	body, err := util.HttpGet(url, map[string]string{
 | 
			
		||||
		"x-token": s.token,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type rsp_t struct {
 | 
			
		||||
		Code    int     `json:"code"`
 | 
			
		||||
		Message string  `json:"message"`
 | 
			
		||||
		Data    *Result `json:"data"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var rsp rsp_t
 | 
			
		||||
	if err := json.Unmarshal(body, &rsp); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if rsp.Code != 0 {
 | 
			
		||||
		return nil, fmt.Errorf("%d:%s", rsp.Code, rsp.Message)
 | 
			
		||||
	}
 | 
			
		||||
	return rsp.Data, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Sdk) httpDataGet(url string) (map[string]interface{}, error) {
 | 
			
		||||
	body, err := util.HttpGet(url, map[string]string{
 | 
			
		||||
		"x-token": s.token,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type rsp_t struct {
 | 
			
		||||
		Code    int                    `json:"code"`
 | 
			
		||||
		Message string                 `json:"message"`
 | 
			
		||||
		Data    map[string]interface{} `json:"data"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var rsp rsp_t
 | 
			
		||||
	if err := json.Unmarshal(body, &rsp); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if rsp.Code != 0 {
 | 
			
		||||
		return nil, fmt.Errorf("%d:%s", rsp.Code, rsp.Message)
 | 
			
		||||
	}
 | 
			
		||||
	return rsp.Data, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Sdk) Match(c *Request) (*Result, error) {
 | 
			
		||||
	if err := c.Check(); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	params := url.Values{}
 | 
			
		||||
 | 
			
		||||
	params.Add("os", strings.ToLower(c.Os))
 | 
			
		||||
	params.Add("ip", c.Ip)
 | 
			
		||||
	params.Add("ua", c.Ua)
 | 
			
		||||
	params.Add("model", c.Model)
 | 
			
		||||
	params.Add("brand", c.Brand)
 | 
			
		||||
	params.Add("idfa", c.Idfa)
 | 
			
		||||
	params.Add("oaid", c.Oaid)
 | 
			
		||||
	params.Add("imei", c.Imei)
 | 
			
		||||
	params.Add("channel", c.Channel)
 | 
			
		||||
	params.Add("version", c.Version)
 | 
			
		||||
	params.Add("active", strconv.FormatBool(c.Active))
 | 
			
		||||
	if c.Extra != nil {
 | 
			
		||||
		extra, _ := json.Marshal(c.Extra)
 | 
			
		||||
		params.Add("extra", string(extra))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	u := fmt.Sprintf("%s/api/ad/client/match?%s", s.address, params.Encode())
 | 
			
		||||
	return s.httpMatchGet(u)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Sdk) Active(adId int64, extra map[string]string) error {
 | 
			
		||||
	params := url.Values{}
 | 
			
		||||
	params.Add("adId", strconv.FormatInt(adId, 10))
 | 
			
		||||
	if extra != nil {
 | 
			
		||||
		ex, _ := json.Marshal(extra)
 | 
			
		||||
		params.Add("extra", string(ex))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	url := fmt.Sprintf("%s/api/ad/client/active?%s",
 | 
			
		||||
		s.address, params.Encode())
 | 
			
		||||
 | 
			
		||||
	return s.httpGet(url)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
	extra存放扩展数据,注册相关信息都填上
 | 
			
		||||
	unionid、phone、openid、nickname
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
func (s *Sdk) Register(adId int64, extra map[string]string) error {
 | 
			
		||||
	params := url.Values{}
 | 
			
		||||
	params.Add("adId", strconv.FormatInt(adId, 10))
 | 
			
		||||
	if extra != nil {
 | 
			
		||||
		ex, _ := json.Marshal(extra)
 | 
			
		||||
		params.Add("extra", string(ex))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	url := fmt.Sprintf("%s/api/ad/client/register?%s",
 | 
			
		||||
		s.address, params.Encode())
 | 
			
		||||
 | 
			
		||||
	return s.httpGet(url)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
	extra存放扩展数据,支付相关信息都填上
 | 
			
		||||
	支付金额:payFee (单位分)
 | 
			
		||||
	支付方式:payType(weixin、alipay、apple)
 | 
			
		||||
	支付位置:payLocation (内容自定义)
 | 
			
		||||
	支付商品:goodsId、goodsName
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
func (s *Sdk) Pay(adId int64, extra map[string]string) error {
 | 
			
		||||
	params := url.Values{}
 | 
			
		||||
	params.Add("adId", strconv.FormatInt(adId, 10))
 | 
			
		||||
	if extra != nil {
 | 
			
		||||
		ex, _ := json.Marshal(extra)
 | 
			
		||||
		params.Add("extra", string(ex))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	url := fmt.Sprintf("%s/api/ad/client/pay?%s",
 | 
			
		||||
		s.address, params.Encode())
 | 
			
		||||
 | 
			
		||||
	return s.httpGet(url)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Sdk) Relation(adId int64) (*AdRelation, error) {
 | 
			
		||||
	params := url.Values{}
 | 
			
		||||
	params.Add("adId", strconv.FormatInt(adId, 10))
 | 
			
		||||
 | 
			
		||||
	url := fmt.Sprintf("%s/api/ad/client/relation?%s",
 | 
			
		||||
		s.address, params.Encode())
 | 
			
		||||
 | 
			
		||||
	var relation AdRelation
 | 
			
		||||
	data, err := s.httpDataGet(url)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	res, _ := json.Marshal(data)
 | 
			
		||||
	json.Unmarshal(res, &relation)
 | 
			
		||||
	return &relation, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Sdk) GetAccountReport(startDay, endDay string, accountType string) ([]*AccountReport, error) {
 | 
			
		||||
	if startDay == "" && endDay == "" {
 | 
			
		||||
		startDay = time.Now().Format("2006-01-02")
 | 
			
		||||
		endDay = startDay
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	reqUrl := fmt.Sprintf("%s/api/ad/account/report?startDay=%s&endDay=%s&accountType=%s",
 | 
			
		||||
		s.address, startDay, endDay, accountType)
 | 
			
		||||
 | 
			
		||||
	body, err := util.HttpGet(reqUrl, map[string]string{
 | 
			
		||||
		"x-token": s.token,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type rsp_t struct {
 | 
			
		||||
		BaseResponse
 | 
			
		||||
		Data []map[string]interface{} `json:"data"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var rsp rsp_t
 | 
			
		||||
	if err := json.Unmarshal(body, &rsp); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if rsp.Code != 0 {
 | 
			
		||||
		return nil, fmt.Errorf("%d:%s", rsp.Code, rsp.Message)
 | 
			
		||||
	}
 | 
			
		||||
	results := make([]*AccountReport, 0)
 | 
			
		||||
	for _, data := range rsp.Data {
 | 
			
		||||
		r := new(AccountReport)
 | 
			
		||||
		r.Id = cast.ToString(data["accounId"])
 | 
			
		||||
		r.Name = cast.ToString(data["accounName"])
 | 
			
		||||
		r.Type = cast.ToString(data["accounType"])
 | 
			
		||||
		r.Day = cast.ToString(data["day"])
 | 
			
		||||
		r.Cost = cast.ToFloat64(data["cost"])
 | 
			
		||||
		r.Show = cast.ToInt64(data["show"])
 | 
			
		||||
		r.Click = cast.ToInt64(data["click"])
 | 
			
		||||
		r.Download = cast.ToInt64(data["download"])
 | 
			
		||||
		r.Active = cast.ToInt64(data["active"])
 | 
			
		||||
		r.Register = cast.ToInt64(data["register"])
 | 
			
		||||
		r.Pay = cast.ToInt64(data["pay"])
 | 
			
		||||
		r.PayAmount = cast.ToFloat64(data["payAmount"])
 | 
			
		||||
		r.Balance = cast.ToFloat64(data["balance"])
 | 
			
		||||
		results = append(results, r)
 | 
			
		||||
	}
 | 
			
		||||
	return results, nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
package adapi
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestSdk(t1 *testing.T) {
 | 
			
		||||
	fmt.Println("ok1")
 | 
			
		||||
	sdk := NewSdk("http://localhost:9281", "10020", "")
 | 
			
		||||
	res, err := sdk.GetAccountReport("", "", "")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Println("ok2")
 | 
			
		||||
	fmt.Println(len(res))
 | 
			
		||||
	fmt.Printf("%+v", res)
 | 
			
		||||
	for i, r := range res {
 | 
			
		||||
		fmt.Println(i, r.Name)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Println("ok3")
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,89 @@
 | 
			
		|||
package adapi
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type BaseResponse struct {
 | 
			
		||||
	Code    int    `json:"code"`
 | 
			
		||||
	Message string `json:"message"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Request struct {
 | 
			
		||||
	Channel string            //安装包的渠道
 | 
			
		||||
	Version string            //安装包版本
 | 
			
		||||
	Os      string            //手机系统类别 android、ioss
 | 
			
		||||
	Ip      string            //客户端的外网ip
 | 
			
		||||
	Ua      string            //客户端的user-agent
 | 
			
		||||
	Brand   string            // 客户端手机品牌
 | 
			
		||||
	Model   string            //客户端的手机型号,如:NOH-AN00
 | 
			
		||||
	Idfa    string            //客户端的广告id,ios时候有效
 | 
			
		||||
	Oaid    string            //客户端的广告id,android时有效
 | 
			
		||||
	Imei    string            //设备唯一识别码
 | 
			
		||||
	Extra   map[string]string //其他额外数据
 | 
			
		||||
	Active  bool              // 是否直接激活
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Result struct {
 | 
			
		||||
	AdId   int64             `json:"adId"`
 | 
			
		||||
	Source string            `json:"source"`
 | 
			
		||||
	Extra  map[string]string `json:"extra"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Request) Check() error {
 | 
			
		||||
	if strings.ToLower(c.Os) != "ios" && c.Channel == "" {
 | 
			
		||||
		return errors.New("channel must set")
 | 
			
		||||
	}
 | 
			
		||||
	if c.Version == "" {
 | 
			
		||||
		return errors.New("version must set")
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type AccountReport struct {
 | 
			
		||||
	Id        string  `json:"id"`
 | 
			
		||||
	Type      string  `json:"type"`
 | 
			
		||||
	Name      string  `json:"name"`
 | 
			
		||||
	Day       string  `json:"day"`
 | 
			
		||||
	Cost      float64 `json:"cost"`
 | 
			
		||||
	Show      int64   `json:"show"`
 | 
			
		||||
	Click     int64   `json:"click"`
 | 
			
		||||
	Download  int64   `json:"download"`
 | 
			
		||||
	Active    int64   `json:"active"`
 | 
			
		||||
	Register  int64   `json:"register"`
 | 
			
		||||
	Pay       int64   `json:"pay"`
 | 
			
		||||
	PayAmount float64 `json:"payAmount"`
 | 
			
		||||
	Balance   float64 `json:"balance"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Relation struct {
 | 
			
		||||
	MatchType    string `json:"matchType"`
 | 
			
		||||
	CreateTime   int64  `json:"createTime"`
 | 
			
		||||
	ActiveTime   int64  `json:"activeTime"`
 | 
			
		||||
	RegisterTime int64  `json:"registerTime"`
 | 
			
		||||
	PayTime      int64  `json:"payTime"`
 | 
			
		||||
	Source       string `json:"source"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Click struct {
 | 
			
		||||
	Action       string `json:"action"`
 | 
			
		||||
	AccountId    int64  `json:"accountId"`
 | 
			
		||||
	AccountName  string `json:"accountName"`
 | 
			
		||||
	PlanId       int64  `json:"planId"`
 | 
			
		||||
	PlanName     string `json:"planName"`
 | 
			
		||||
	GroupId      int64  `json:"groupId"`
 | 
			
		||||
	GroupName    string `json:"groupName"`
 | 
			
		||||
	CreativeId   int64  `json:"creativeId"`
 | 
			
		||||
	CreativeName string `json:"creativeName"`
 | 
			
		||||
	ClickTime    int64  `json:"clickTime"`
 | 
			
		||||
	Ip           string `json:"ip"`
 | 
			
		||||
	Ua           string `json:"ua"`
 | 
			
		||||
	Idfa         string `json:"idfa"`
 | 
			
		||||
	Oaid         string `json:"oaid"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type AdRelation struct {
 | 
			
		||||
	Relation *Relation `json:"relation"`
 | 
			
		||||
	Click    *Click    `json:"click"`
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,46 @@
 | 
			
		|||
package adminapi
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/smbrave/gosdk/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Application struct {
 | 
			
		||||
	token   string
 | 
			
		||||
	address string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewApplication(addreess string, token string) *Application {
 | 
			
		||||
	if addreess == "" {
 | 
			
		||||
		addreess = "http://127.0.0.1:9281"
 | 
			
		||||
	}
 | 
			
		||||
	return &Application{
 | 
			
		||||
		address: addreess,
 | 
			
		||||
		token:   token,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Application) Login(username, password, appid string) (interface{}, error) {
 | 
			
		||||
	reqUrl := fmt.Sprintf("%s/admin/app/login", m.address)
 | 
			
		||||
	params := make(map[string]interface{})
 | 
			
		||||
	params["username"] = username
 | 
			
		||||
	params["password"] = password
 | 
			
		||||
	params["appid"] = appid
 | 
			
		||||
	reqBody, _ := json.Marshal(params)
 | 
			
		||||
	body, err := util.HttpPostJson(reqUrl, map[string]string{
 | 
			
		||||
		"x-token": m.token,
 | 
			
		||||
	}, reqBody)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	var rsp util.DataResponse
 | 
			
		||||
	if err := json.Unmarshal(body, &rsp); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if rsp.Code != 0 {
 | 
			
		||||
		return nil, fmt.Errorf("%d:%s", rsp.Code, rsp.Message)
 | 
			
		||||
	}
 | 
			
		||||
	return rsp.Data, nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,43 @@
 | 
			
		|||
package adminapi
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/smbrave/gosdk/util"
 | 
			
		||||
	"net/url"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Message struct {
 | 
			
		||||
	token   string
 | 
			
		||||
	sender  string
 | 
			
		||||
	address string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewMessage(addreess string, token string, sender string) *Message {
 | 
			
		||||
	if addreess == "" {
 | 
			
		||||
		addreess = "http://127.0.0.1:9281"
 | 
			
		||||
	}
 | 
			
		||||
	return &Message{
 | 
			
		||||
		address: addreess,
 | 
			
		||||
		token:   token,
 | 
			
		||||
		sender:  sender,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Message) Send(receiver, content string) error {
 | 
			
		||||
	reqUrl := fmt.Sprintf("%s/admin/message/send?sender=%s&receiver=%s&content=%s", m.address, m.sender, receiver, url.QueryEscape(content))
 | 
			
		||||
	body, err := util.HttpGet(reqUrl, map[string]string{
 | 
			
		||||
		"x-token": m.token,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	var rsp util.Response
 | 
			
		||||
	if err := json.Unmarshal(body, &rsp); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if rsp.Code != 0 {
 | 
			
		||||
		return fmt.Errorf("%d:%s", rsp.Code, rsp.Message)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,19 @@
 | 
			
		|||
package adminapi
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestMessage_Send(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	s := NewMessage("http://u.batiao8.com", "", "alarm")
 | 
			
		||||
 | 
			
		||||
	mess := make([]string, 0)
 | 
			
		||||
	mess = append(mess, "加发到")
 | 
			
		||||
	mess = append(mess, "asdfasdfadfa")
 | 
			
		||||
	mess = append(mess, "@3q452345~!@@#$$%^&*())")
 | 
			
		||||
	err := s.Send("jiangyong", strings.Join(mess, "\n"))
 | 
			
		||||
	fmt.Println(err)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
module github.com/smbrave/gosdk
 | 
			
		||||
 | 
			
		||||
go 1.18
 | 
			
		||||
 | 
			
		||||
require github.com/spf13/cast v1.5.0
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,34 @@
 | 
			
		|||
package metric
 | 
			
		||||
 | 
			
		||||
import "os"
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	serv *service
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Config struct {
 | 
			
		||||
	Address  string
 | 
			
		||||
	Interval int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewConfg() *Config {
 | 
			
		||||
	return &Config{
 | 
			
		||||
		Address:  "10.0.1.15:17000",
 | 
			
		||||
		Interval: 10,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Init(c *Config) error {
 | 
			
		||||
	if serv != nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	hostname, _ := os.Hostname()
 | 
			
		||||
	serv = &service{
 | 
			
		||||
		config:   c,
 | 
			
		||||
		hostname: hostname,
 | 
			
		||||
		metrics:  make(chan *metric, 100000),
 | 
			
		||||
	}
 | 
			
		||||
	go serv.run()
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,18 @@
 | 
			
		|||
package metric
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Metric(name string, value float64, tag map[string]string) {
 | 
			
		||||
	if serv == nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	serv.add(&metric{
 | 
			
		||||
		Metric:    name,
 | 
			
		||||
		Value:     value,
 | 
			
		||||
		Tags:      tag,
 | 
			
		||||
		Timestamp: time.Now().Unix(),
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,32 @@
 | 
			
		|||
package metric
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"math/rand"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestName(t *testing.T) {
 | 
			
		||||
	c := NewConfg()
 | 
			
		||||
	c.Address = "https://monitor.batiao8.com"
 | 
			
		||||
	Init(c)
 | 
			
		||||
	for i := 0; i < 100; i++ {
 | 
			
		||||
		Metric("test", float64(rand.Int()%100), map[string]string{
 | 
			
		||||
			"a": "b",
 | 
			
		||||
			"c": "d",
 | 
			
		||||
		})
 | 
			
		||||
		time.Sleep(time.Second)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMetric(t *testing.T) {
 | 
			
		||||
	c := NewConfg()
 | 
			
		||||
	c.Address = "https://monitor.batiao8.com"
 | 
			
		||||
	Init(c)
 | 
			
		||||
 | 
			
		||||
	Metric("test.test1.test2", 12, map[string]string{
 | 
			
		||||
		"a": "b",
 | 
			
		||||
		"c": "d",
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,123 @@
 | 
			
		|||
package metric
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/spf13/cast"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type metric struct {
 | 
			
		||||
	Timestamp int64             `json:"timestamp"`
 | 
			
		||||
	Metric    string            `json:"metric"`
 | 
			
		||||
	Value     float64           `json:"value"`
 | 
			
		||||
	Tags      map[string]string `json:"tags"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type service struct {
 | 
			
		||||
	hostname string
 | 
			
		||||
	metrics  chan *metric
 | 
			
		||||
	megers   map[string]*metric
 | 
			
		||||
	config   *Config
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) run() {
 | 
			
		||||
	timer := time.NewTicker(time.Duration(s.config.Interval) * time.Second)
 | 
			
		||||
	for {
 | 
			
		||||
		select {
 | 
			
		||||
		case m := <-s.metrics:
 | 
			
		||||
			s.process(m)
 | 
			
		||||
 | 
			
		||||
		case <-timer.C:
 | 
			
		||||
			s.report()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) sortMap(tag map[string]string) string {
 | 
			
		||||
	arr := make([]string, 0)
 | 
			
		||||
	for k, v := range tag {
 | 
			
		||||
		arr = append(arr, fmt.Sprintf("%s=%s", k, v))
 | 
			
		||||
	}
 | 
			
		||||
	sort.Strings(arr)
 | 
			
		||||
	return strings.Join(arr, ":")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) process(m *metric) {
 | 
			
		||||
	if s.megers == nil {
 | 
			
		||||
		s.megers = make(map[string]*metric)
 | 
			
		||||
	}
 | 
			
		||||
	key := m.Metric
 | 
			
		||||
	if m.Tags != nil {
 | 
			
		||||
		key += "_" + s.sortMap(m.Tags)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if v, ok := s.megers[key]; ok {
 | 
			
		||||
		v.Value += m.Value
 | 
			
		||||
		v.Timestamp = m.Timestamp
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	s.megers[key] = m
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) defaultTags(tags map[string]string) map[string]string {
 | 
			
		||||
	if tags == nil {
 | 
			
		||||
		tags = map[string]string{
 | 
			
		||||
			"hostname": s.hostname,
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		tags["hostname"] = s.hostname
 | 
			
		||||
	}
 | 
			
		||||
	return tags
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) report() {
 | 
			
		||||
	if s.megers == nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	metrics := make([]*metric, 0)
 | 
			
		||||
	for _, v := range s.megers {
 | 
			
		||||
		v.Tags = s.defaultTags(v.Tags)
 | 
			
		||||
		metrics = append(metrics, v)
 | 
			
		||||
	}
 | 
			
		||||
	reqUrl := fmt.Sprintf("%s/opentsdb/put", serv.config.Address)
 | 
			
		||||
 | 
			
		||||
	reqBody, _ := json.Marshal(metrics)
 | 
			
		||||
	resp, err := http.Post(reqUrl, "application/json", bytes.NewBuffer(reqBody))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Printf("http.Post error :%s", err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	defer resp.Body.Close()
 | 
			
		||||
	rspBody, err := ioutil.ReadAll(resp.Body)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Printf(" ioutil.ReadAll error :%s", err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	result := make(map[string]interface{})
 | 
			
		||||
	if err := json.Unmarshal(rspBody, &result); err != nil {
 | 
			
		||||
		log.Printf("json result : %s", string(rspBody))
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fail := cast.ToInt(result["fail"])
 | 
			
		||||
	if fail != 0 {
 | 
			
		||||
		log.Printf("http result : %s", string(rspBody))
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	s.megers = nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *service) add(m *metric) {
 | 
			
		||||
	select {
 | 
			
		||||
	case s.metrics <- m:
 | 
			
		||||
	default:
 | 
			
		||||
		fmt.Println("chan is full")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,124 @@
 | 
			
		|||
package payapi
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/smbrave/gosdk/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	PayTypeWeixin = "weixin"
 | 
			
		||||
	PayTypeAlipay = "alipay"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Pay struct {
 | 
			
		||||
	address string
 | 
			
		||||
	token   string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewPay(address string, token string) *Pay {
 | 
			
		||||
	if address == "" {
 | 
			
		||||
		address = "http://127.0.0.1:9281"
 | 
			
		||||
	}
 | 
			
		||||
	return &Pay{
 | 
			
		||||
		address: address,
 | 
			
		||||
		token:   token,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *Pay) CreateOrder(order *CreateOrderReq) (map[string]interface{}, error) {
 | 
			
		||||
	if order.PayType == "" {
 | 
			
		||||
		errors.New("payType is nil")
 | 
			
		||||
	}
 | 
			
		||||
	if order.PayPrice <= 0 {
 | 
			
		||||
		return nil, errors.New("payPrice is nil")
 | 
			
		||||
	}
 | 
			
		||||
	reqBody, _ := json.Marshal(order)
 | 
			
		||||
 | 
			
		||||
	result, err := util.HttpPostJson(p.address+"/api/pay/order", map[string]string{
 | 
			
		||||
		"x-token": p.token,
 | 
			
		||||
	}, reqBody)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	var rsp CommonResponse
 | 
			
		||||
	if err := json.Unmarshal([]byte(result), &rsp); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if rsp.Code != 0 {
 | 
			
		||||
		return nil, fmt.Errorf("%d:%s", rsp.Code, rsp.Message)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return rsp.Data, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *Pay) UpdateOrder(data map[string]interface{}) error {
 | 
			
		||||
	reqBody, _ := json.Marshal(data)
 | 
			
		||||
 | 
			
		||||
	result, err := util.HttpPutJson(p.address+"/api/pay/order", map[string]string{
 | 
			
		||||
		"x-token": p.token,
 | 
			
		||||
	}, reqBody)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	var rsp CommonResponse
 | 
			
		||||
	if err := json.Unmarshal([]byte(result), &rsp); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if rsp.Code != 0 {
 | 
			
		||||
		return fmt.Errorf("%d:%s", rsp.Code, rsp.Message)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *Pay) GetOrder(outTradeNo string) (map[string]interface{}, error) {
 | 
			
		||||
	if outTradeNo == "" {
 | 
			
		||||
		errors.New("outTradeNo is nil")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	reqUrl := fmt.Sprintf("%s/api/pay/order?outTradeNo=%s", p.address, outTradeNo)
 | 
			
		||||
	result, err := util.HttpGet(reqUrl, map[string]string{
 | 
			
		||||
		"x-token": p.token,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	var rsp CommonResponse
 | 
			
		||||
	if err := json.Unmarshal([]byte(result), &rsp); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if rsp.Code != 0 {
 | 
			
		||||
		return nil, fmt.Errorf("%d:%s", rsp.Code, rsp.Message)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return rsp.Data, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *Pay) RefundOrder(outTradeNo, reason string) error {
 | 
			
		||||
	if outTradeNo == "" {
 | 
			
		||||
		errors.New("outTradeNo is nil")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	reqUrl := fmt.Sprintf("%s/api/pay/order?outTradeNo=%s&reason=%s", p.address, outTradeNo, reason)
 | 
			
		||||
	result, err := util.HttpDelete(reqUrl, map[string]string{
 | 
			
		||||
		"x-token": p.token,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	var rsp CommonResponse
 | 
			
		||||
	if err := json.Unmarshal([]byte(result), &rsp); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if rsp.Code != 0 {
 | 
			
		||||
		return fmt.Errorf("%d:%s", rsp.Code, rsp.Message)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,17 @@
 | 
			
		|||
package payapi
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestNewPay(t *testing.T) {
 | 
			
		||||
	payApi := NewPay("http://u.batiao8.com", "")
 | 
			
		||||
	order, err := payApi.GetOrder("ZB_20230826122127_2YAxfg")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	res, _ := json.Marshal(order)
 | 
			
		||||
	fmt.Println(string(res))
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,39 @@
 | 
			
		|||
package payapi
 | 
			
		||||
 | 
			
		||||
type OrderUser struct {
 | 
			
		||||
	UserId      string `json:"userId"`
 | 
			
		||||
	UserName    string `json:"userName"`
 | 
			
		||||
	CreateTime  string `json:"createTime"`
 | 
			
		||||
	Openid      string `json:"openid"`
 | 
			
		||||
	Source      string `json:"source"`
 | 
			
		||||
	SourceId    string `json:"sourceId"`
 | 
			
		||||
	MobileBrand string `json:"brand"`
 | 
			
		||||
	MobileModel string `json:"model"`
 | 
			
		||||
	Platform    string `json:"platform"`
 | 
			
		||||
	Channel     string `json:"channel"`
 | 
			
		||||
	Version     string `json:"version"`
 | 
			
		||||
}
 | 
			
		||||
type OrderGoods struct {
 | 
			
		||||
	GoodsId   string `json:"goodsId"`
 | 
			
		||||
	GoodsName string `json:"goodsName"`
 | 
			
		||||
	Source    string `json:"source"`
 | 
			
		||||
	Autopay   string `json:"autopay"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type CreateOrderReq struct {
 | 
			
		||||
	OutTradeNo string      `json:"outTradeNo"`
 | 
			
		||||
	PayType    string      `json:"payType"`
 | 
			
		||||
	PayChannel string      `json:"payChannel"`
 | 
			
		||||
	PayPrice   int64       `json:"payPrice"`
 | 
			
		||||
	PaySource  string      `json:"paySource"`
 | 
			
		||||
	NotifyUrl  string      `json:"notifyUrl"`
 | 
			
		||||
	Extra      interface{} `json:"extra"`
 | 
			
		||||
	User       *OrderUser  `json:"user,omitempty"`
 | 
			
		||||
	Goods      *OrderGoods `json:"goods,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type CommonResponse struct {
 | 
			
		||||
	Code    int                    `json:"code"`
 | 
			
		||||
	Message string                 `json:"message"`
 | 
			
		||||
	Data    map[string]interface{} `json:"data"`
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,126 @@
 | 
			
		|||
package util
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"crypto/tls"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// PostJson 请求
 | 
			
		||||
func HttpPostJson(link string, header map[string]string, json []byte) ([]byte, error) {
 | 
			
		||||
	client := &http.Client{Timeout: 20 * time.Second}
 | 
			
		||||
	//忽略https的证书
 | 
			
		||||
	client.Transport = &http.Transport{
 | 
			
		||||
		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	req, err := http.NewRequest("POST", link, bytes.NewBuffer(json))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if header != nil {
 | 
			
		||||
		for k, v := range header {
 | 
			
		||||
			req.Header.Add(k, v)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	req.Header.Add("Content-Type", "application/json")
 | 
			
		||||
 | 
			
		||||
	resp, err := client.Do(req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	defer resp.Body.Close()
 | 
			
		||||
	if resp.StatusCode != http.StatusOK {
 | 
			
		||||
		return nil, fmt.Errorf("%d:%s", resp.StatusCode, resp.Status)
 | 
			
		||||
	}
 | 
			
		||||
	return io.ReadAll(resp.Body)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PostJson 请求
 | 
			
		||||
func HttpPutJson(link string, header map[string]string, json []byte) ([]byte, error) {
 | 
			
		||||
	client := &http.Client{Timeout: 20 * time.Second}
 | 
			
		||||
	//忽略https的证书
 | 
			
		||||
	client.Transport = &http.Transport{
 | 
			
		||||
		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	req, err := http.NewRequest("PUT", link, bytes.NewBuffer(json))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if header != nil {
 | 
			
		||||
		for k, v := range header {
 | 
			
		||||
			req.Header.Add(k, v)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	req.Header.Add("Content-Type", "application/json")
 | 
			
		||||
 | 
			
		||||
	resp, err := client.Do(req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	defer resp.Body.Close()
 | 
			
		||||
	if resp.StatusCode != http.StatusOK {
 | 
			
		||||
		return nil, fmt.Errorf("%d:%s", resp.StatusCode, resp.Status)
 | 
			
		||||
	}
 | 
			
		||||
	return io.ReadAll(resp.Body)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get 请求  link:请求url
 | 
			
		||||
func HttpGet(link string, header map[string]string) ([]byte, error) {
 | 
			
		||||
	client := &http.Client{Timeout: 20 * time.Second}
 | 
			
		||||
	//忽略https的证书
 | 
			
		||||
	client.Transport = &http.Transport{
 | 
			
		||||
		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	req, err := http.NewRequest("GET", link, nil)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if header != nil {
 | 
			
		||||
		for k, v := range header {
 | 
			
		||||
			req.Header.Add(k, v)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	resp, err := client.Do(req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	defer resp.Body.Close()
 | 
			
		||||
	if resp.StatusCode != http.StatusOK {
 | 
			
		||||
		return nil, fmt.Errorf("%d:%s", resp.StatusCode, resp.Status)
 | 
			
		||||
	}
 | 
			
		||||
	return io.ReadAll(resp.Body)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get 请求  link:请求url
 | 
			
		||||
func HttpDelete(link string, header map[string]string) ([]byte, error) {
 | 
			
		||||
	client := &http.Client{Timeout: 20 * time.Second}
 | 
			
		||||
	//忽略https的证书
 | 
			
		||||
	client.Transport = &http.Transport{
 | 
			
		||||
		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	req, err := http.NewRequest("DELETE", link, nil)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if header != nil {
 | 
			
		||||
		for k, v := range header {
 | 
			
		||||
			req.Header.Add(k, v)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	resp, err := client.Do(req)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	defer resp.Body.Close()
 | 
			
		||||
	if resp.StatusCode != http.StatusOK {
 | 
			
		||||
		return nil, fmt.Errorf("%d:%s", resp.StatusCode, resp.Status)
 | 
			
		||||
	}
 | 
			
		||||
	return io.ReadAll(resp.Body)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
package util
 | 
			
		||||
 | 
			
		||||
type Response struct {
 | 
			
		||||
	Code    int    `json:"code"`
 | 
			
		||||
	Message string `json:"message"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type DataResponse struct {
 | 
			
		||||
	Response
 | 
			
		||||
	Data interface{} `json:"data"`
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue