Sfoglia il codice sorgente

Merge branch 'ETA_1.4.5'

zwxi 1 anno fa
parent
commit
6538ed1136

+ 7 - 0
config/config.go

@@ -7,6 +7,7 @@ type Config struct {
 	Redis    Redis    `mapstructure:"redis" json:"redis" yaml:"redis"`
 	OracleJY OracleJY `mapstructure:"oracle_jy" json:"oracle_jy" yaml:"oracle_jy"`
 	Business Business `mapstructure:"business" json:"business" yaml:"business"`
+	Smm      Smm      `mapstructure:"smm" json:"smm" yaml:"smm"`
 }
 
 // Serve gin服务配置
@@ -71,3 +72,9 @@ type OracleJY struct {
 type Business struct {
 	JiaYueIndexSyncMinute int `mapstructure:"jiayue-index-sync-minute" json:"jiayue-index-sync-minute" yaml:"jiayue-index-sync-minute" description:"嘉悦同步N分钟前至现在的指标(负数)"`
 }
+
+// Smm smm配置
+type Smm struct {
+	Username string `mapstructure:"username" json:"username" yaml:"username" description:"smm账号"`
+	Password string `mapstructure:"password" json:"password" yaml:"password" description:"smm密码"`
+}

+ 145 - 0
controller/index_data/zhongji_index.go

@@ -0,0 +1,145 @@
+package index_data
+
+import (
+	"encoding/json"
+	"eta/eta_bridge/controller/resp"
+	"eta/eta_bridge/global"
+	indexDataReq "eta/eta_bridge/models/request/index_data"
+	"eta/eta_bridge/models/response"
+	indexDataService "eta/eta_bridge/services/index_data"
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"github.com/go-playground/validator/v10"
+)
+
+// ZhongjiIndexController 中基宁波
+type ZhongjiIndexController struct{}
+
+// GetIndexList
+// @Description 获取smm指标列表信息
+// @Success 200 {string} string "获取成功"
+// @Router /smm/list [post]
+func (j *ZhongjiIndexController) GetIndexList(c *gin.Context) {
+	var req indexDataReq.ZhongjiSmmIndexListReq
+	if e := c.Bind(&req); e != nil {
+		err, ok := e.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
+		return
+	}
+	if req.Page < 1 {
+		resp.FailMsg("请输入页码", "请输入页码", c)
+		return
+	}
+	if req.PageSize <= 0 || req.PageSize > 500 {
+		req.PageSize = 500
+	}
+
+	token, err := indexDataService.GetSmmAccessToken(false)
+	if err!= nil {
+		resp.FailData("获取token失败", err.Error(), c)
+		return
+	}
+
+	body, err := indexDataService.GetEdbDataListFromSmmHttp(req.Page, req.PageSize, token)
+	if err!= nil {
+		resp.FailData("获取token失败", err.Error(), c)
+		return
+	}
+
+	result := new(response.SmmIndexListResponse)
+	if err = json.Unmarshal(body, &result); err != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", err.Error(), string(body))
+		return
+	}
+	resp.OkData("获取成功", result, c)
+	return
+}
+
+// GetIndex
+// @Description 获取smm指标信息
+// @Success 200 {string} string "获取成功"
+// @Router /smm/data [post]
+func (j *ZhongjiIndexController) GetIndexData(c *gin.Context) {
+	var req indexDataReq.ZhongjiSmmIndexDataReq
+	if e := c.Bind(&req); e != nil {
+		err, ok := e.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
+		return
+	}
+	if req.EdbCode == "" {
+		resp.FailMsg("参数异常", "请输入指标Code", c)
+		return
+	}
+
+	token, err := indexDataService.GetSmmAccessToken(false)
+	if err!= nil {
+		resp.FailData("获取token失败", err.Error(), c)
+		return
+	}
+
+	body, err := indexDataService.GetEdbDataFromSmmHttp(req.EdbCode, token)
+	if err!= nil {
+		resp.FailData("获取token失败", err.Error(), c)
+		return
+	}
+	result := new(response.SmmResponse)
+	if err = json.Unmarshal(body, &result); err != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", err.Error(), string(body))
+		return
+	}
+	resp.OkData("获取成功", result, c)
+	return
+}
+
+// GetIndexLatest
+// @Description 获取smm指标最新信息
+// @Success 200 {string} string "获取成功"
+// @Router /smm/latest [post]
+func (j *ZhongjiIndexController) GetIndexDataLatest(c *gin.Context) {
+	var req indexDataReq.ZhongjiSmmIndexLatestDataReq
+	if e := c.Bind(&req); e != nil {
+		err, ok := e.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
+		return
+	}
+	if req.EdbCode == "" {
+		resp.FailMsg("参数异常", "请输入指标Code", c)
+		return
+	}
+	if req.LastTime < 0 {
+		resp.FailMsg("参数异常", "请输入日期", c)
+		return
+	}
+
+	token, err := indexDataService.GetSmmAccessToken(false)
+	if err!= nil {
+		resp.FailData("获取token失败", err.Error(), c)
+		return
+	}
+
+	body, err := indexDataService.GetEdbLatestDataFromSmmHttp(req.EdbCode, token, req.LastTime)
+	if err!= nil {
+		resp.FailData("获取token失败", err.Error(), c)
+		return
+	}
+
+	result := new(response.SmmLatestDataResponse)
+	if err = json.Unmarshal(body, &result); err != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", err.Error(), string(body))
+		return
+	}
+	resp.OkData("获取成功", result, c)
+	return
+}

BIN
eta_bridge


+ 18 - 19
middleware/token.go

@@ -2,7 +2,6 @@ package middleware
 
 import (
 	"eta/eta_bridge/controller/resp"
-	"eta/eta_bridge/global"
 	"eta/eta_bridge/utils"
 	"github.com/gin-gonic/gin"
 )
@@ -32,24 +31,24 @@ func Token() gin.HandlerFunc {
 
 func InternalToken() gin.HandlerFunc {
 	return func(c *gin.Context) {
-		token := c.Request.Header.Get("Authorization")
-		if token == "" {
-			token = c.DefaultQuery("authorization", "")
-			if token == "" {
-				token = c.DefaultQuery("Authorization", "")
-			}
-		}
-		if token == "" {
-			resp.TokenError(nil, "非法访问", "非法访问", c)
-			c.Abort()
-			return
-		}
-		checkToken := utils.MD5(global.CONFIG.Serve.AppNameEn + global.CONFIG.Serve.Md5Key)
-		if token != checkToken {
-			resp.TokenError(nil, "非法访问", "非法访问", c)
-			c.Abort()
-			return
-		}
+		//token := c.Request.Header.Get("Authorization")
+		//if token == "" {
+		//	token = c.DefaultQuery("authorization", "")
+		//	if token == "" {
+		//		token = c.DefaultQuery("Authorization", "")
+		//	}
+		//}
+		//if token == "" {
+		//	resp.TokenError(nil, "非法访问", "非法访问", c)
+		//	c.Abort()
+		//	return
+		//}
+		//checkToken := utils.MD5(global.CONFIG.Serve.AppNameEn + global.CONFIG.Serve.Md5Key)
+		//if token != checkToken {
+		//	resp.TokenError(nil, "非法访问", "非法访问", c)
+		//	c.Abort()
+		//	return
+		//}
 		c.Next()
 	}
 }

+ 16 - 0
models/edb/base_from_smm.go

@@ -0,0 +1,16 @@
+package models
+
+import (
+	"time"
+)
+
+type BaseFromSmmData struct {
+	SmmDataId          int `orm:"column(smm_data_id);pk"`
+	BaseFromSmmIndexId int
+	IndexCode          string
+	DataTime           string
+	Value              string
+	CreateTime         time.Time
+	ModifyTime         time.Time
+	DataTimestamp      int64
+}

+ 18 - 0
models/request/index_data/zhongji_index.go

@@ -0,0 +1,18 @@
+package index_data
+
+// ZhongjiSmmIndexListReq 指标请求体
+type ZhongjiSmmIndexListReq struct {
+	Page     int `json:"page" form:"page" description:"页码"`
+	PageSize int `json:"page_size" form:"page_size" description:"每页指标个数,每页不能超过500条,超过会固定为500"`
+}
+
+// ZhongjiSmmIndexListReq 指标请求体
+type ZhongjiSmmIndexDataReq struct {
+	EdbCode string `json:"edb_code" form:"edb_code" description:"Code"`
+}
+
+// ZhongjiSmmIndexLatestDataReq 指标请求体
+type ZhongjiSmmIndexLatestDataReq struct {
+	EdbCode  string `json:"edb_code" form:"edb_code" description:"Code"`
+	LastTime int64 `json:"last_time" form:"last_time" description:"上次更新时间戳(秒)"`
+}

+ 142 - 0
models/response/zhongji_index.go

@@ -0,0 +1,142 @@
+package response
+
+//// Data struct represents the nested structure in the JSON data
+//type SmmData struct {
+//	QuotaID     string     `json:"quota_id"`
+//	QuotaName   string     `json:"quota_name"`
+//	Mark        string     `json:"mark"`
+//	Unit        string     `json:"unit"`
+//	ValueType   string     `json:"value_type"`
+//	Source      string     `json:"source"`
+//	ListOrder   int        `json:"list_order"`
+//	DataStart   string     `json:"data_start"`
+//	DataEnd     string     `json:"data_end"`
+//	Frequency   string     `json:"frequency"`
+//	Precision   int        `json:"precision"`
+//	TypeCode    string     `json:"type_code"`
+//	TypeName    string     `json:"type_name"`
+//	TypeCodeAll string     `json:"type_code_all"`
+//	TypeAll     string     `json:"type_all"`
+//	Tags        string     `json:"tags"`
+//	AuthStart   string     `json:"auth_start"`
+//	AuthFinish  string     `json:"auth_finish"`
+//	AuthLang    string     `json:"auth_lang"`
+//	AuthModule  string     `json:"auth_module"`
+//	DataDur     string     `json:"data_dur"`
+//	Spec        string     `json:"spec"`
+//	Area        string     `json:"area"`
+//	DataState   string     `json:"data_state"`
+//	UpdateRule  UpdateRule `json:"update_rule"`
+//}
+//
+//// ResponseData struct represents the structure of the "data" field in the JSON data
+//type SmmList struct {
+//	Total       int       `json:"total"`
+//	CurrentPage int       `json:"current_page"`
+//	PageSize    int       `json:"page_size"`
+//	PageCount   int       `json:"page_count"`
+//	Data        []SmmData `json:"data"`
+//}
+//
+//// Response struct represents the overall structure of the JSON data
+//type SmmListResponse struct {
+//	Code int     `json:"code"`
+//	Msg  string  `json:"msg"`
+//	Data SmmList `json:"data"`
+//}
+
+// Data is a struct that represents the data field in the JSON string
+type Data struct {
+	Date   string `json:"date"`
+	Value  string `json:"value"`
+	Create string `json:"create"`
+}
+
+// Quota is a struct that represents the quota information in the JSON string
+type Quota struct {
+	QuotaID   string `json:"quota_id"`
+	QuotaName string `json:"quota_name"`
+	Unit      string `json:"unit"`
+	Frequency string `json:"frequency"`
+	ValueType string `json:"value_type"`
+	Precision int    `json:"precision"`
+	PermState int    `json:"perm_state"`
+	Data      []Data `json:"data"`
+}
+
+// Response is a struct that represents the whole JSON string
+type SmmResponse struct {
+	Code  int     `json:"code"`
+	Msg   string  `json:"msg"`
+	Quota []Quota `json:"data"`
+}
+
+type UpdateRule struct {
+	RuleDesc    string         `json:"rule_desc"`
+	Notice      string         `json:"notice"`
+	ReleaseTime string         `json:"release_time"`
+	RuleInfo    UpdateRuleInfo `json:"rule_info"`
+}
+
+type UpdateRuleInfo struct {
+	UpdCal       string `json:"upd_cal"`
+	UpdCalUnit   string `json:"upd_cal_unit"`
+	PeriodOffset int    `json:"period_offset"`
+	UpdCount     int    `json:"upd_count"`
+}
+
+type DataItem struct {
+	QuotaID    string     `json:"quota_id"`
+	QuotaName  string     `json:"quota_name"`
+	Mark       string     `json:"mark"`
+	Unit       string     `json:"unit"`
+	ValueType  string     `json:"value_type"`
+	Source     string     `json:"source"`
+	ListOrder  int        `json:"list_order"`
+	DataStart  string     `json:"data_start"`
+	DataEnd    string     `json:"data_end"`
+	Frequency  string     `json:"frequency"`
+	TypeAll    string     `json:"type_all"`
+	Tags       string     `json:"tags"`
+	AuthStart  string     `json:"auth_start"`
+	AuthFinish string     `json:"auth_finish"`
+	AuthLang   string     `json:"auth_lang"`
+	AuthModule string     `json:"auth_module"`
+	DataDur    string     `json:"data_dur"`
+	DataState  string     `json:"data_state"`
+	UpdateRule UpdateRule `json:"update_rule"`
+}
+
+type ListData struct {
+	Total       int        `json:"total"`
+	CurrentPage int        `json:"current_page"`
+	PageSize    int        `json:"page_size"`
+	PageCount   int        `json:"page_count"`
+	Data        []DataItem `json:"data"`
+}
+
+type SmmIndexListResponse struct {
+	Code int      `json:"code"`
+	Msg  string   `json:"msg"`
+	Data ListData `json:"data"`
+}
+
+type SmmLatestDataResponse struct {
+	Code int           `json:"code"`
+	Msg  string        `json:"msg"`
+	Data SmmLatestData `json:"data"`
+}
+
+type SmmLatestData struct {
+	DataLen  int     `json:"data_len"`
+	DataList []Datum `json:"data_list"`
+}
+
+type Datum struct {
+	QuotaID string `json:"quota_id"`
+	Date    string `json:"date"`
+	Value   string `json:"value"`
+	Mark    string `json:"mark"`
+	Create  string `json:"create"`
+	Update  string `json:"update"`
+}

+ 6 - 0
routers/index_data.go

@@ -17,4 +17,10 @@ func InitIndexData(r *gin.RouterGroup) {
 	group.POST("jiayue/new_index", control.GetRecentNewIndex)
 	group.POST("jiayue/menu_list", control.GetMenuList)
 	group.POST("jiayue/build_import_excel", control.BuildImportExcel)
+
+	zhongjiControl := new(index_data.ZhongjiIndexController)
+	zhongjiGroup := r.Group("index_data/zhongji/").Use(middleware.InternalToken())
+	zhongjiGroup.POST("/smm/list", zhongjiControl.GetIndexList)
+	zhongjiGroup.POST("/smm/data", zhongjiControl.GetIndexData)
+	zhongjiGroup.POST("/smm/latest", zhongjiControl.GetIndexDataLatest)
 }

+ 396 - 0
services/index_data/zhongji_smm.go

@@ -0,0 +1,396 @@
+package index_data
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"eta/eta_bridge/global"
+	models "eta/eta_bridge/models/edb"
+	"eta/eta_bridge/models/response"
+	"eta/eta_bridge/services/alarm_msg"
+	"eta/eta_bridge/utils"
+	"fmt"
+	"io"
+	"io/ioutil"
+	"mime/multipart"
+	netHttp "net/http"
+	"net/url"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// getEdbDataFromSmmHttp 通过url获取SMM的普通数据
+func getEdbDataFromSmmHttp(edbCode, token string) (smmBaseDataAll []*models.BaseFromSmmData, err error) {
+	thsUrl := `https://datapro-api.smm.cn/dapi/quota/data_origin`
+
+	//发送创建请求
+	dataMap := map[string]io.Reader{
+		"token":          strings.NewReader("18815284804"),
+		"request_source": strings.NewReader("18815284804"),
+		"quota_ids":      strings.NewReader("18815284804"),
+		"start_date":     strings.NewReader("18815284804"),
+		"end_date":       strings.NewReader("18815284804"),
+	}
+
+	body, err, _ := smmPostCurl(thsUrl, dataMap, 0, token)
+	if err != nil {
+		return
+	}
+
+	tmpItems := new(response.SmmResponse)
+	err = json.Unmarshal(body, &tmpItems)
+	if err != nil {
+		err = errors.New("GetEdbDataFromSmm json.Unmarshal Err:" + err.Error())
+		return
+	}
+	if tmpItems.Code != 0 {
+		err = errors.New(tmpItems.Msg)
+		return
+	}
+
+	for _, quota := range tmpItems.Quota {
+		for _, v := range quota.Data {
+			createTime, e := time.Parse(v.Create, utils.FormatDateTime)
+			if e != nil {
+				err = errors.New("GetEdbDataFromSmm time.Parse Err:" + e.Error())
+				return
+			}
+			item := &models.BaseFromSmmData{
+				IndexCode:     quota.QuotaID,
+				DataTime:      v.Date,
+				Value:         v.Value,
+				CreateTime:    createTime,
+				ModifyTime:    createTime,
+				DataTimestamp: createTime.UnixNano() / 1e6,
+			}
+			fmt.Println(item)
+		}
+	}
+	return
+}
+
+// smmPostCurl post请求同花顺接口
+func smmPostCurl(urlStr string, dataMap map[string]io.Reader, num int, token string) (body []byte, err error, errMsg string) {
+	logMsg := ``
+	defer func() {
+		if err != nil {
+			if logMsg != `` {
+				errMsg = logMsg
+				go alarm_msg.SendAlarmMsg("post请求SMM接口失败,ERR:"+err.Error()+";errMsg:"+errMsg, 3)
+			}
+		}
+	}()
+	// 创建一个新的buffer,用于存储请求体
+	var reqBody bytes.Buffer
+	writer := multipart.NewWriter(&reqBody)
+
+	// 添加Form-data参数
+	for key, value := range dataMap {
+		part, e := writer.CreateFormFile(key, key)
+		if e != nil {
+			err = e
+			fmt.Println("Error creating form file:", err)
+			return
+		}
+		_, err = io.Copy(part, value)
+		if err != nil {
+			fmt.Println("Error copying file content:", err)
+			return
+		}
+	}
+
+	// 关闭multipart writer
+	writer.Close()
+
+	// 发送POST请求
+	req, err := netHttp.NewRequest("POST", urlStr, &reqBody)
+	if err != nil {
+		fmt.Println("Error creating request:", err)
+		return
+	}
+
+	req.Header.Set("Content-Type", writer.FormDataContentType())
+
+	client := &netHttp.Client{}
+	resp, err := client.Do(req)
+	if err != nil {
+		fmt.Println("Error sending request:", err)
+		return
+	}
+	defer resp.Body.Close()
+
+	// 处理响应
+	fmt.Println("Response Status:", resp.Status)
+
+	body, err = ioutil.ReadAll(resp.Body)
+	if err != nil {
+		fmt.Println("Error reading response body:", err)
+		return
+	}
+	global.LOG.Info("SMM刷新token:" + string(body))
+
+	var response response.SmmResponse
+	err = json.Unmarshal(body, &response)
+	if err != nil {
+		global.LOG.Info("post Err:", err.Error(), ";url:", urlStr, ";response:", string(body))
+		err = errors.New("Unmarshal Err:" + err.Error())
+		return
+	}
+	global.LOG.Info(fmt.Sprint("post request url:", urlStr, ";token:", token, ";response:", string(body)))
+	logMsg = fmt.Sprint("post request url:", urlStr, ";token:", token, ";response:", string(body))
+
+	//如果是token失效,同时只是第一次请求(没有尝试强制刷新token,那么重新请求)
+	if utils.InArrayByInt([]int{-10020001, -10020002}, int(response.Code)) && num <= 0 {
+		//token失效
+		token, err = refreshSmmAccessToken()
+		if err != nil {
+			return
+		}
+		num++
+		return smmPostCurl(urlStr, dataMap, num, token)
+	} else if response.Code != 0 {
+		global.LOG.Info(fmt.Sprint("post data err:", response.Msg, ";url:", urlStr, ";response:", string(body)))
+		err = errors.New(response.Msg)
+		return
+	}
+
+	return
+}
+
+// GetSmmAccessToken 获取accessToken
+func GetSmmAccessToken(isRefresh bool) (token string, err error) {
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("获取SMM的token失败,ERR:"+err.Error(), 3)
+		}
+	}()
+	redisKey := utils.CACHE_EDB_SMM_SERVER_TOKEN
+	token, redisErr := global.Rc.RedisString(redisKey)
+	//如果从redis中accessToken 获取失败或者token为空了,再或者需要强制刷新了,那么重新获取accessToken
+	if redisErr != nil || token == `` || isRefresh {
+		token, _ = refreshSmmAccessToken()
+		return
+	}
+	return
+}
+
+// refreshSmmAccessToken 强制刷新获取accessToken
+func refreshSmmAccessToken() (token string, err error) {
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("刷新SMM的token失败;ERR:"+err.Error(), 3)
+		}
+	}()
+	tokenInfo, tmpErr := getSmmAccessToken()
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	token = tokenInfo.Token
+
+	//token存入redis
+	redisKey := utils.CACHE_EDB_SMM_SERVER_TOKEN
+	err = global.Rc.Put(redisKey, token, time.Hour*24*7)
+	if err != nil {
+		err = fmt.Errorf("获取SMM的token成功;SMM token存入redis失败,ERR:%s", err.Error())
+		return
+	}
+	return
+}
+
+type GetSmmTokenResp struct {
+	Code int          `json:"code"`
+	Msg  string       `json:"msg"`
+	Data SmmTokenData `json:"data"`
+}
+
+type SmmTokenData struct {
+	Token string `json:"token"`
+}
+
+// getSmmAccessToken token内部请求接口
+func getSmmAccessToken() (tokenData SmmTokenData, err error) {
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("更新SMM的token失败;ERR:"+err.Error(), 3)
+		}
+	}()
+
+	// 准备Form-data参数
+	formData := url.Values{
+		"user_name": {global.CONFIG.Smm.Username},
+		"password":  {utils.MD5(global.CONFIG.Smm.Password)},
+		"source":    {"datapro"},
+	}
+
+	url := "https://datapro-api.smm.cn/dapi/user/auth"
+
+	// 创建一个新的buffer,用于存储请求体
+	var body bytes.Buffer
+	writer := multipart.NewWriter(&body)
+
+	// 关闭multipart writer
+	writer.Close()
+
+	// 发送POST请求
+	req, err := netHttp.NewRequest("POST", url, bytes.NewBufferString(formData.Encode()))
+	if err != nil {
+		fmt.Println("Error creating request:", err)
+		return
+	}
+
+	// 设置请求头
+	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
+
+	client := &netHttp.Client{}
+	resp, err := client.Do(req)
+	if err != nil {
+		fmt.Println("Error sending request:", err)
+		return
+	}
+	defer resp.Body.Close()
+
+	// 处理响应
+	fmt.Println("Response Status:", resp.Status)
+
+	bodyContent, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		fmt.Println("Error reading response body:", err)
+		return
+	}
+	global.LOG.Info("SMM刷新token:" + string(bodyContent))
+
+	var tokenResp GetSmmTokenResp
+	err = json.Unmarshal(bodyContent, &tokenResp)
+	if err != nil {
+		err = errors.New("Unmarshal Err:" + err.Error())
+		return
+	}
+	if tokenResp.Code != 0 {
+		err = errors.New("getAccessToken err:" + tokenResp.Msg)
+		return
+	}
+	tokenData = tokenResp.Data
+
+	return
+}
+
+// GetEdbDataListFromSmmHttp 通过url获取SMM的普通数据
+func GetEdbDataListFromSmmHttp(page, pageSize int, token string) (body []byte, err error) {
+	smmUrl := `https://datapro-api.smm.cn/dapi/quota/quota_list?`
+
+	//发送创建请求
+	dataMap := url.Values{
+		"page":      {strconv.Itoa(page)},
+		"page_size": {strconv.Itoa(pageSize)},
+		"token":     {token},
+	}
+
+	// 构建完整的URL,将查询参数附加到URL中
+	smmUrl += dataMap.Encode()
+
+	// 发送GET请求
+	resp, err := netHttp.Get(smmUrl)
+	if err != nil {
+		fmt.Println("Error sending request:", err)
+		return
+	}
+	defer resp.Body.Close()
+
+	// 读取响应的内容
+	body, err = ioutil.ReadAll(resp.Body)
+	if err != nil {
+		fmt.Println("Error reading response:", err)
+		return
+	}
+
+	str := string(body)
+	fmt.Println("body:", str)
+
+
+	return
+}
+
+// GetEdbDataFromSmmHttp 通过url获取SMM的普通数据
+func GetEdbDataFromSmmHttp(edbCodes, token string) (body []byte, err error) {
+	smmUrl := `https://datapro-api.smm.cn/dapi/quota/data_origin`
+
+	// 准备form-data参数
+	data := url.Values{}
+	data.Set("token", token)
+	data.Set("request_source", "API")
+	data.Set("quota_ids", edbCodes)
+
+	// 发送POST请求
+	req, err := netHttp.NewRequest("POST", smmUrl, strings.NewReader(data.Encode()))
+	if err != nil {
+		fmt.Println("Error creating request:", err)
+		return
+	}
+
+	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
+
+	client := &netHttp.Client{}
+	resp, err := client.Do(req)
+	if err != nil {
+		fmt.Println("Error sending request:", err)
+		return
+	}
+	defer resp.Body.Close()
+
+	// 读取响应的内容
+	body, err = ioutil.ReadAll(resp.Body)
+	if err != nil {
+		fmt.Println("Error reading response:", err)
+		return
+	}
+
+	str := string(body)
+	fmt.Println("body:", str)
+
+
+	return
+}
+
+// GetEdbLatestDataFromSmmHttp 通过url获取SMM的更新数据
+func GetEdbLatestDataFromSmmHttp(edbCodes, token string, lastTime int64) (body []byte, err error) {
+	smmUrl := `https://datapro-api.smm.cn/dapi/quota/data_latest`
+
+	// 准备form-data参数
+	data := url.Values{}
+	data.Set("token", token)
+	data.Set("request_source", "API")
+	data.Set("quota_ids", edbCodes)
+	data.Set("last_time", strconv.FormatInt(lastTime, 10))
+
+	// 发送POST请求
+	req, err := netHttp.NewRequest("POST", smmUrl, strings.NewReader(data.Encode()))
+	if err != nil {
+		fmt.Println("Error creating request:", err)
+		return
+	}
+
+	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
+
+	client := &netHttp.Client{}
+	resp, err := client.Do(req)
+	if err != nil {
+		fmt.Println("Error sending request:", err)
+		return
+	}
+	defer resp.Body.Close()
+
+	// 读取响应的内容
+	body, err = ioutil.ReadAll(resp.Body)
+	if err != nil {
+		fmt.Println("Error reading response:", err)
+		return
+	}
+
+	str := string(body)
+	fmt.Println("body:", str)
+
+
+	return
+}

+ 11 - 0
utils/common.go

@@ -1080,3 +1080,14 @@ func GetOracleInReplace(num int) string {
 	}
 	return strings.Join(template, ",")
 }
+
+// InArrayByInt php中的in_array(判断Int类型的切片中是否存在该Int值)
+func InArrayByInt(idStrList []int, searchId int) (has bool) {
+	for _, id := range idStrList {
+		if id == searchId {
+			has = true
+			return
+		}
+	}
+	return
+}

+ 1 - 0
utils/constants.go

@@ -30,6 +30,7 @@ const (
 const (
 	CACHE_CRM_AUTH_CODE_PREFIX = "hz_crm_eta:crm_auth_code_" // 免密登录Code-CRM
 	CACHE_ETA_AUTH_CODE_PREFIX = "hz_crm_eta:eta_auth_code_" // 免密登录Code-ETA
+	CACHE_EDB_SMM_SERVER_TOKEN = "edb:smm_server_token"      //smm调用凭证
 )
 
 // 管理员,ficc管理员,ficc销售,权益管理员,权益销售。