Преглед изворни кода

新增接口给其他项目调用

xyxie пре 9 месеци
родитељ
комит
dbea3fb06d
4 измењених фајлова са 388 додато и 0 уклоњено
  1. 252 0
      controllers/base_auth_v2.go
  2. 121 0
      controllers/chart_auth.go
  3. 5 0
      routers/router.go
  4. 10 0
      utils/config.go

+ 252 - 0
controllers/base_auth_v2.go

@@ -0,0 +1,252 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta/eta_chart_lib/models"
+	"eta/eta_chart_lib/utils"
+	"fmt"
+	"github.com/beego/beego/v2/server/web"
+	"net/http"
+	"net/url"
+	"strings"
+)
+
+type BaseAuthV2Controller struct {
+	web.Controller
+	Lang string `description:"当前语言类型,中文:zh;英文:en;默认:zh"`
+}
+
+func (c *BaseAuthV2Controller) Prepare() {
+	fmt.Println("enter prepare")
+	method := c.Ctx.Input.Method()
+	uri := c.Ctx.Input.URI()
+	ip := c.Ctx.Input.IP()
+	fmt.Println("Url:", uri+";ip:"+ip)
+	if method != "HEAD" {
+		if method == "POST" || method == "GET" {
+			// 当前语言
+			{
+				lang := c.Ctx.Input.Header("Lang")
+				if lang == "" {
+					lang = utils.ZhLangVersion
+				}
+				c.Lang = lang
+			}
+			authorization := c.Ctx.Input.Header("authorization")
+			if authorization == "" {
+				c.JSON(models.BaseResponse{Ret: 408, Msg: "请重新授权!", ErrMsg: "请重新授权:authorization is empty "}, false, false)
+				c.StopRun()
+				return
+			}
+			checkAuthorization := utils.MD5(utils.APP_NAME_EN + utils.Md5Key)
+			fmt.Println(checkAuthorization)
+			if authorization != checkAuthorization {
+				c.JSON(models.BaseResponse{Ret: 408, Msg: "签名错误!", ErrMsg: "签名错误:authorization is err "}, false, false)
+				c.StopRun()
+				return
+			}
+			//authorization := this.Ctx.Input.Header("authorization")
+			//if authorization == "" {
+			//	authorization = this.Ctx.Input.Header("Authorization")
+			//}
+			//if authorization == "" {
+			//	newAuthorization := this.GetString("authorization")
+			//	account := this.GetString("account")
+			//	authorization = "authorization=" + newAuthorization + ";account=" + account
+			//	if newAuthorization == "" {
+			//		newAuthorization = this.GetString("Authorization")
+			//		if account == "" {
+			//			account = this.GetString("Account")
+			//		}
+			//		authorization = "authorization=" + newAuthorization + ";account=" + account
+			//	}
+			//}
+			//fmt.Println("authorization##################")
+			//fmt.Println(authorization)
+			//fmt.Println("authorization############")
+			//if authorization == "" {
+			//	strArr := strings.Split(uri, "?")
+			//	for k, v := range strArr {
+			//		fmt.Println(k, v)
+			//	}
+			//	if len(strArr) > 1 {
+			//		authorization := strArr[1]
+			//		authorization = strings.Replace(authorization, "Authorization", "authorization", -1)
+			//		fmt.Println(authorization)
+			//	}
+			//}
+			//fmt.Println("authorization------------")
+			//fmt.Println(authorization)
+			//fmt.Println("authorization-------------")
+			//if authorization == "" {
+			//	this.JSON(models.BaseResponse{Ret: 408, Msg: "请重新授权!", ErrMsg: "请重新授权:Token is empty or account is empty"}, false, false)
+			//	this.StopRun()
+			//	return
+			//}
+			//authorizationArr := strings.Split(authorization, ";")
+			//tokenStr := authorizationArr[0]
+			//tokenArr := strings.Split(tokenStr, "=")
+			//token := tokenArr[1]
+			//
+			//accountStr := authorizationArr[1]
+			//accountArr := strings.Split(accountStr, "=")
+			//account := accountArr[1]
+			//
+			//fmt.Println("token:", token)
+			//fmt.Println("account:", account)
+			////校验token是否合法
+			//// JWT校验Token和Account
+			//if !utils.CheckToken(account, token) {
+			//	fmt.Println("CheckToken Err")
+			//	this.JSON(models.BaseResponse{Ret: 408, Msg: "鉴权失败,请重新登录!", ErrMsg: "登录失效,请重新登陆!,CheckToken Fail"}, false, false)
+			//	this.StopRun()
+			//	return
+			//}
+			//
+			//fmt.Println("GetUserByToken")
+			//session, err := system.GetSysSessionByToken(token)
+			//if err != nil {
+			//	if err.Error() == utils.ErrNoRow() {
+			//		this.JSON(models.BaseResponse{Ret: 408, Msg: "信息已变更,请重新登陆!", ErrMsg: "Token 信息已变更:Token: " + token}, false, false)
+			//		this.StopRun()
+			//		return
+			//	}
+			//	this.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "获取用户信息异常,Eerr:" + err.Error()}, false, false)
+			//	this.StopRun()
+			//	return
+			//}
+			//if session == nil {
+			//	this.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "sesson is empty "}, false, false)
+			//	this.StopRun()
+			//	return
+			//}
+			//if time.Now().After(session.ExpiredTime) {
+			//	this.JSON(models.BaseResponse{Ret: 408, Msg: "请重新登录!", ErrMsg: "获取用户信息异常,Eerr:" + err.Error()}, false, false)
+			//	this.StopRun()
+			//	return
+			//}
+			//admin, err := system.GetSysUserById(session.SysUserId)
+			//if err != nil {
+			//	if err.Error() == utils.ErrNoRow() {
+			//		this.JSON(models.BaseResponse{Ret: 408, Msg: "信息已变更,请重新登陆!", ErrMsg: "获取admin 信息失败 " + strconv.Itoa(session.SysUserId)}, false, false)
+			//		this.StopRun()
+			//		return
+			//	}
+			//	this.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "获取admin信息异常,Eerr:" + err.Error()}, false, false)
+			//	this.StopRun()
+			//	return
+			//}
+			//if admin == nil {
+			//	this.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "admin is empty "}, false, false)
+			//	this.StopRun()
+			//	return
+			//}
+			//admin.RoleTypeCode = GetSysUserRoleTypeCode(admin.RoleTypeCode)
+			//this.SysUser = admin
+		} else {
+			c.JSON(models.BaseResponse{Ret: 408, Msg: "请求异常,请联系客服!", ErrMsg: "POST之外的请求,暂不支持"}, false, false)
+			c.StopRun()
+			return
+		}
+	}
+}
+
+func (c *BaseAuthV2Controller) ServeJSON(encoding ...bool) {
+	var (
+		hasIndent   = false
+		hasEncoding = false
+	)
+	if web.BConfig.RunMode == web.PROD {
+		hasIndent = false
+	}
+	if len(encoding) > 0 && encoding[0] == true {
+		hasEncoding = true
+	}
+	if c.Data["json"] == nil {
+		go utils.SendEmail("异常提醒:", "接口:"+"URI:"+c.Ctx.Input.URI()+";无返回值", utils.EmailSendToUsers)
+		return
+	}
+	baseRes := c.Data["json"].(*models.BaseResponse)
+	if baseRes != nil && baseRes.Ret != 200 && baseRes.Ret != 408 && baseRes.IsSendEmail {
+		body, _ := json.Marshal(baseRes)
+		var requestBody string
+		method := c.Ctx.Input.Method()
+		if method == "GET" {
+			requestBody = c.Ctx.Request.RequestURI
+		} else {
+			requestBody, _ = url.QueryUnescape(string(c.Ctx.Input.RequestBody))
+		}
+		go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "URI:"+c.Ctx.Input.URI()+"<br/> "+"Params"+requestBody+" <br/>"+"ErrMsg:"+baseRes.ErrMsg+";<br/>Msg:"+baseRes.Msg+";<br/> Body:"+string(body)+"<br/>", utils.EmailSendToUsers)
+	}
+	c.JSON(c.Data["json"], hasIndent, hasEncoding)
+}
+
+func (c *BaseAuthV2Controller) JSON(data interface{}, hasIndent bool, coding bool) error {
+	c.Ctx.Output.Header("Content-Type", "application/json; charset=utf-8")
+	var content []byte
+	var err error
+	if hasIndent {
+		content, err = json.MarshalIndent(data, "", "  ")
+	} else {
+		content, err = json.Marshal(data)
+	}
+	if err != nil {
+		http.Error(c.Ctx.Output.Context.ResponseWriter, err.Error(), http.StatusInternalServerError)
+		return err
+	}
+	ip := c.Ctx.Input.IP()
+	requestBody, err := url.QueryUnescape(string(c.Ctx.Input.RequestBody))
+	if err != nil {
+		requestBody = string(c.Ctx.Input.RequestBody)
+	}
+	if requestBody == "" {
+		requestBody = c.Ctx.Input.URI()
+	}
+	c.logUri(content, requestBody, ip)
+	if coding {
+		content = []byte(utils.StringsToJSON(string(content)))
+	}
+	return c.Ctx.Output.Body(content)
+}
+
+func (c *BaseAuthV2Controller) logUri(content []byte, requestBody, ip string) {
+	authorization := ""
+	method := c.Ctx.Input.Method()
+	uri := c.Ctx.Input.URI()
+	fmt.Println("Url:", uri)
+	if method != "HEAD" {
+		if method == "POST" || method == "GET" {
+			authorization = c.Ctx.Input.Header("authorization")
+			if authorization == "" {
+				authorization = c.Ctx.Input.Header("Authorization")
+			}
+			if authorization == "" {
+				newAuthorization := c.GetString("authorization")
+				if newAuthorization != `` {
+					authorization = "authorization=" + newAuthorization
+				} else {
+					newAuthorization = c.GetString("Authorization")
+					authorization = "authorization=" + newAuthorization
+				}
+			} else {
+				if strings.Contains(authorization, ";") {
+					authorization = strings.Replace(authorization, ";", "$", 1)
+				}
+			}
+			if authorization == "" {
+				strArr := strings.Split(uri, "?")
+				for k, v := range strArr {
+					fmt.Println(k, v)
+				}
+				if len(strArr) > 1 {
+					authorization = strArr[1]
+					authorization = strings.Replace(authorization, "Authorization", "authorization", -1)
+					fmt.Println(authorization)
+				}
+			}
+		}
+	}
+
+	utils.ApiLog.Info("uri:%s, authorization:%s, requestBody:%s, responseBody:%s, ip:%s", c.Ctx.Input.URI(), authorization, requestBody, content, ip)
+	return
+}

+ 121 - 0
controllers/chart_auth.go

@@ -0,0 +1,121 @@
+package controllers
+
+import (
+	"encoding/json"
+	"eta/eta_chart_lib/models"
+	"eta/eta_chart_lib/utils"
+	"fmt"
+)
+
+// 需要验证密钥的图表
+type ChartAuthController struct {
+	BaseAuthV2Controller
+}
+
+// ChartInfoDetail
+// @Title 获取图表详情
+// @Description 获取图表详情接口
+// @Param   UniqueCode   query   string  true       "图表唯一编码,如果是管理后台访问,传固定字符串:7c69b590249049942070ae9dcd5bf6dc"
+// @Success 200 {object} data_manage.ChartInfoDetailResp
+// @router /detail [get]
+func (this *ChartAuthController) ChartInfoDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	uniqueCode := this.GetString("UniqueCode")
+	if uniqueCode == "" {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,uniqueCode is empty"
+		return
+	}
+	key := utils.HZ_CHART_LIB_DETAIL + uniqueCode
+	resp := new(models.ChartInfoDetailResp)
+
+	// 图表水印
+	conf, e := models.GetBusinessConf()
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取配置信息失败, Err: " + e.Error()
+		return
+	}
+
+	//判断是否有缓存
+	if utils.Re == nil {
+		if utils.Re == nil && utils.Rc.IsExist(key) {
+			if data, err1 := utils.Rc.RedisBytes(key); err1 == nil {
+				err := json.Unmarshal(data, &resp)
+				if err == nil && resp != nil {
+					if conf[models.BusinessConfWatermarkChart] == "true" && conf[models.BusinessConfCompanyWatermark] != "" {
+						resp.WaterMark = conf[models.BusinessConfCompanyWatermark]
+					}
+					br.Ret = 200
+					br.Success = true
+					br.Msg = "获取成功"
+					br.Data = resp
+					fmt.Println("source redis")
+					return
+				}
+			}
+		}
+	}
+
+	chartInfo, err := models.GetChartInfoByUniqueCode(uniqueCode)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "该图已被删除,请刷新页面"
+			br.ErrMsg = "该图已被删除,请刷新页面,Err:" + err.Error()
+			return
+		}
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+
+	//var resp interface{}
+	var isOk bool
+	var msg, errMsg string
+	switch chartInfo.Source {
+	case utils.CHART_SOURCE_DEFAULT:
+		resp, isOk, msg, errMsg = GetChartInfoDetailFromUniqueCode(chartInfo, key)
+	case utils.CHART_SOURCE_FUTURE_GOOD:
+		resp, isOk, msg, errMsg = GetFutureGoodChartInfoDetailFromUniqueCode(chartInfo, key)
+	case utils.CHART_SOURCE_FUTURE_GOOD_PROFIT:
+		resp, isOk, msg, errMsg = GetFutureGoodProfitChartInfoDetailFromUniqueCode(chartInfo, key)
+	case utils.CHART_SOURCE_CORRELATION, utils.CHART_SOURCE_ROLLING_CORRELATION:
+		resp, isOk, msg, errMsg = GetCorrelationChartInfoDetailFromUniqueCode(chartInfo, key)
+	case utils.CHART_SOURCE_LINE_EQUATION:
+		resp, isOk, msg, errMsg = GetLineEquationChartInfoDetailFromUniqueCode(chartInfo, key)
+	case utils.CHART_SOURCE_LINE_FEATURE_STANDARD_DEVIATION, utils.CHART_SOURCE_LINE_FEATURE_PERCENTILE, utils.CHART_SOURCE_LINE_FEATURE_FREQUENCY:
+		resp, isOk, msg, errMsg = GetLineFeatureChartInfoDetailFromUniqueCode(chartInfo, key)
+	case utils.CHART_SOURCE_CROSS_HEDGING:
+		resp, isOk, msg, errMsg = GetCrossVarietyChartInfoDetailFromUniqueCode(chartInfo, key)
+	case utils.CHART_SOURCE_BALANCE_EXCEL:
+		resp, isOk, msg, errMsg = GetBalanceChartInfoDetailFromUniqueCode(chartInfo, key, this.Lang)
+		if !isOk {
+			br.Msg = msg
+			br.ErrMsg = errMsg
+			return
+		}
+	default:
+		br.Msg = "错误的图表"
+		br.ErrMsg = "错误的图表"
+		return
+	}
+	if !isOk {
+		br.Msg = msg
+		br.ErrMsg = errMsg
+		return
+	}
+
+	if conf[models.BusinessConfWatermarkChart] == "true" && conf[models.BusinessConfCompanyWatermark] != "" {
+		resp.WaterMark = conf[models.BusinessConfCompanyWatermark]
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 5 - 0
routers/router.go

@@ -19,6 +19,11 @@ func init() {
 				&controllers.ChartController{},
 			),
 		),
+		web.NSNamespace("/chart_auth",
+			web.NSInclude(
+				&controllers.ChartAuthController{},
+			),
+		),
 		web.NSNamespace("/table",
 			web.NSInclude(
 				&controllers.TableController{},

+ 10 - 0
utils/config.go

@@ -30,6 +30,11 @@ var (
 var (
 	// APPNAME 项目中文名称
 	APPNAME string
+	// APP_NAME_EN 项目英文名称
+	APP_NAME_EN string
+
+	// Md5Key 签名秘钥
+	Md5Key string
 	// EmailSendToUsers 邮件提醒人员
 	EmailSendToUsers string
 	// AlarmMsgUrl 报警服务地址
@@ -78,6 +83,11 @@ func init() {
 		panic("配置文件读取错误 " + err.Error())
 	}
 	beeLogger.Log.Info(RunMode + " 模式")
+
+	APP_NAME_EN = config["app_name_en"]
+	// 签名秘钥
+	Md5Key = config["md5_key"]
+
 	MYSQL_URL = config["mysql_url"]
 
 	MYSQL_URL_DATA = config["mysql_url_data"]