From 7277a23ca81123a95cbf60cbda65ca2fd6e27c17 Mon Sep 17 00:00:00 2001
From: liuxiaolong <liuxiaolong@aiotlink.com>
Date: 星期五, 05 六月 2020 18:26:27 +0800
Subject: [PATCH] get sdks from remote shop

---
 service/SdkDownLoad_test.go |   10 +
 go.sum                      |    5 
 service/SdkInstall.go       |  209 +++++++++++++++++++++++++---------
 service/SdkDownLoad.go      |  108 ++++++++++++++---
 go.mod                      |    4 
 controllers/sdk.go          |    4 
 6 files changed, 259 insertions(+), 81 deletions(-)

diff --git a/controllers/sdk.go b/controllers/sdk.go
index ae10470..c2f2cc9 100644
--- a/controllers/sdk.go
+++ b/controllers/sdk.go
@@ -81,8 +81,10 @@
 // @Router /data/api-v/sdk/findAllSdk [GET]
 func (sc SdkController) FindAllSdk(c *gin.Context) {
 	sdkName := c.Query("sdkName")
+	logger.Debug("FindAllSdk sdkName:", sdkName)
 
-	sdks := service.GetSdkList(sdkName)
+	sdks := service.GetSdkList("") //鏈満宸插畨瑁呯殑绠楁硶
+
 	util.ResponseFormat(c, code.Success, sdks)
 }
 
diff --git a/go.mod b/go.mod
index e833ee6..e449034 100644
--- a/go.mod
+++ b/go.mod
@@ -8,7 +8,7 @@
 	basic.com/gb28181api.git v0.0.0-20191028082253-472438a8407b
 	basic.com/pubsub/cache.git v0.0.0-20190718093725-6a413e1d7d48
 	basic.com/pubsub/esutil.git v0.0.0-20200114073900-ad9de8362777
-	basic.com/pubsub/protomsg.git v0.0.0-20200306071852-76af8d2ca810
+	basic.com/pubsub/protomsg.git v0.0.0-20200605082339-fe3f28d45337
 	basic.com/valib/capture.git v0.0.0-20191204103802-89c923cf2abe
 	basic.com/valib/deliver.git v0.0.0-20190531095353-25d8c3b20051
 	basic.com/valib/godraw.git v0.0.0-20191122082247-26e9987cd183
@@ -17,7 +17,7 @@
 	basic.com/valib/gopherdiscovery.git v0.0.0-20190605034340-15d89d8b4e28
 	basic.com/valib/logger.git v0.0.0-20190928113028-4907b08c4159
 	github.com/Microsoft/go-winio v0.4.12 // indirect
-	github.com/ajg/form v1.5.1 // indirect
+	github.com/ajg/form v1.5.1
 	github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/disintegration/imaging v1.6.2 // indirect
diff --git a/go.sum b/go.sum
index 8bfa0f0..7d3e94c 100644
--- a/go.sum
+++ b/go.sum
@@ -10,9 +10,8 @@
 basic.com/pubsub/esutil.git v0.0.0-20191120125514-865efa73a9ae/go.mod h1:yIvppFPFGC61DOdm71ujnsxZBMFUu2yKjr5O43bMWCw=
 basic.com/pubsub/esutil.git v0.0.0-20200114073900-ad9de8362777 h1:gTeuhepfLgOchD6bqydsGGV6KCj/UaseQQgo4DFyhGQ=
 basic.com/pubsub/esutil.git v0.0.0-20200114073900-ad9de8362777/go.mod h1:yIvppFPFGC61DOdm71ujnsxZBMFUu2yKjr5O43bMWCw=
-basic.com/pubsub/protomsg.git v0.0.0-20200304101716-2f4c0110fab2/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
-basic.com/pubsub/protomsg.git v0.0.0-20200306071852-76af8d2ca810 h1:xGOKeo8E89NxioWCFySRhom9i8zWvu3Gsi9IYu6LYJw=
-basic.com/pubsub/protomsg.git v0.0.0-20200306071852-76af8d2ca810/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
+basic.com/pubsub/protomsg.git v0.0.0-20200605082339-fe3f28d45337 h1:6LTdIfHUZkfemhkuQnXXaeXRdnm4459PyxMd36AXV20=
+basic.com/pubsub/protomsg.git v0.0.0-20200605082339-fe3f28d45337/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
 basic.com/valib/capture.git v0.0.0-20191204103802-89c923cf2abe h1:uh3u7DuSOw6AwzvPC1EM19sw1Skks1EUJddcbHDKI9M=
 basic.com/valib/capture.git v0.0.0-20191204103802-89c923cf2abe/go.mod h1:y+h7VUnoSQ3jOtf2K3twXNA8fYDfyUsifSswcyKLgNw=
 basic.com/valib/deliver.git v0.0.0-20190531095353-25d8c3b20051/go.mod h1:bkYiTUGzckyNOjAgn9rB/DOjFzwoSHJlruuWQ6hu6IY=
diff --git a/service/SdkDownLoad.go b/service/SdkDownLoad.go
index ed364ca..3567234 100644
--- a/service/SdkDownLoad.go
+++ b/service/SdkDownLoad.go
@@ -12,6 +12,9 @@
 	"os"
 	"path/filepath"
 	"strings"
+	"webserver/extend/config"
+
+	reqUtil "webserver/extend/util"
 
 	"webserver/util"
 
@@ -127,30 +130,59 @@
 	}
 }
 
-func GetSdkList(sdkName string) []map[string]interface{} {
-	// 寰呰繑鍥炵殑鏁版嵁
-	sdks, idsCache := queryDatabase(sdkName)
-
-	// 鏌ヨ鏈湴宸茬粡瀛樺湪鐨勭畻娉曞拰杩滅鐨勫叏閮ㄧ畻娉�, 鐒跺悗鍜屽凡瀹夎鐨勬瘮瀵�, 杩斿洖鍏ㄩ儴鍙敤鐨勭畻娉曠粍. 鏈畨瑁呯殑绠楁硶鍦ㄥ墠绔蛋涓嬭浇娴佺▼
-	localSdks := GetLocalSdks()
-	for _, sdk := range localSdks {
-		id := sdk["id"].(string)
-		if !idsCache[id] {
-			idsCache[id] = true
-
-			sdk["enable"] = false
-			sdk["installed"] = false
-
-			// 涓嶈繑鍥炲弬鏁颁俊鎭�
-			delete(sdk, "args")
-			sdks = append(sdks, sdk)
+func GetSdkList(sdkName string) []SdkInsOrUpgrade {
+	var api dbapi.SdkApi
+	localSdks := api.FindAll(sdkName) //鏈湴宸插畨瑁呮墍鏈夌畻娉�
+	localSdkM := make(map[string]SdkInsOrUpgrade)
+	for _,ls :=range localSdks {
+		siou := SdkInsOrUpgrade{
+			Installed: true,
 		}
-
+		siou.Sdk = Sdk{
+			Id: ls.Id,
+			IpcId: ls.IpcId,
+			SdkType: ls.SdkType,
+			SdkName: ls.SdkName,
+			Icon: ls.Icon,
+			Url: ls.Url,
+			CreateTime: ls.CreateTime,
+			CreateBy: ls.CreateBy,
+			UpdateTime: ls.UpdateTime,
+			Enable: ls.Enable,
+			DelFlag: int(ls.DelFlag),
+			IconBlob: ls.IconBlob,
+			Version: ls.Version,
+		}
+		localSdkM[siou.Id] = siou
 	}
 
-	// 鐩墠杩樻病鏈夎繙绔畻娉曞簱,
-	// remoteSdks := getRemoteSdks()
+	//杩滅鍙敤鐨勭畻娉�
+	remoteSdks := findAllMySdk()
 
+	for sdkId,sdk := range remoteSdks {
+		if v,ok := localSdkM[sdkId];ok { //鏈湴宸插畨瑁�
+			ls := v
+			if shouldVersionBeUpgrade(ls.Version, sdk.Version) { //鍒ゆ柇鐗堟湰鍙锋槸鍚﹂渶瑕佸崌绾�
+				ls.Installed = true
+				ls.IsUpgrade = true //闇�瑕佸崌绾�
+				ls.RemoteVersion = sdk.Version //杩滅鐨勭増鏈彿
+			}
+			localSdkM[sdkId] = ls
+		} else { //鏈湴鏈畨瑁咃紝闇�瑕佸畨瑁�
+			bIns := SdkInsOrUpgrade{
+				RemoteVersion: sdk.Version,
+				IsUpgrade: false,
+				Installed: false,
+			}
+			bIns.Sdk = sdk
+			localSdkM[sdkId] = bIns
+		}
+	}
+
+	sdks := make([]SdkInsOrUpgrade, 0)
+	for _,v := range localSdkM {
+		sdks = append(sdks, v)
+	}
 	return sdks
 }
 
@@ -177,6 +209,42 @@
 	return sdks, ids
 }
 
+
+type shopSdks struct {
+	Sdks []Sdk `json:"sdks"`
+}
+
+func findAllMySdk() map[string]Sdk {
+	token := "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTEzODA3ODksInVzZXIiOiJ7XCJpZFwiOlwiZTZjY2QzNmQtNGYxNi00NmZjLTg4ZDUtMDczNjU4NjZkMjA1XCIsXCJwZXJtaXNzaW9uc1wiOltcIm9yZGVyTWFuZ2U6ZG93bmxvYWRcIixcImRldmljZU1hbmFnZTp1bmJpbmRcIixcImNvZGVNYW5nZVwiLFwidmlwTWFuYWdlOmFkZFwiLFwiYWRtaW5NYW5hZ2U6ZWRpdFwiLFwiY29kZU1hbmdlOnZpZXdcIixcImNvZGVNYW5nZTphZGRcIixcImFkbWluTWFuYWdlXCIsXCJvcmRlck1hbmdlOmNhbmNlbFwiLFwicHJvZHVjdENlbnRlcjpidXlcIixcInByb2R1Y3RDZW50ZXJcIixcInByb2R1Y3RNYW5nZTp2aWV3XCIsXCJ2aXBNYW5hZ2U6dmlld1wiLFwib3JkZXJNYW5nZVwiLFwicHJvZHVjdENlbnRlcjp2aWV3XCIsXCJkZXZpY2VNYW5hZ2VcIixcImFkbWluTWFuYWdlOmFkZFwiLFwicHJvZHVjdE1hbmdlOmFkZFwiLFwiYWRtaW5NYW5hZ2U6dmlld1wiLFwicHJvZHVjdE1hbmdlXCIsXCJvcmRlck1hbmdlOnZpZXdcIixcImRldmljZU1hbmFnZTp2aWV3XCIsXCJvcmRlck1hbmdlOnBheVwiLFwidmlwTWFuYWdlOmVkaXRcIixcInZpcE1hbmFnZVwiLFwicHJvZHVjdE1hbmdlOmVkaXRcIixcInByb2R1Y3RNYW5nZTpwdWJsaXNoXCIsXCJkZXZpY2VNYW5hZ2U6YWRkXCIsXCJhcGlcIixcImhvbWVcIixcInByb2R1Y3RNYW5nZTpvZmZTYWxlXCIsXCJwcm9kdWN0Q2VudGVyOmRvd25sb2FkXCJdLFwidXNlcm5hbWVcIjpcImJhc2ljXCJ9In0.HwRobdFLtMK7ni5OKk4_NAyqpKGuUlUbqF3HBJMJuOk"
+	url := "http://192.168.20.10:7004/data/api-s/sdk/findAllMySdk"
+	fmt.Println("token:", token, "url:", url)
+	paramBody := map[string]interface{} {
+		"serverId": config.Server.AnalyServerId,
+		"machineCode": "",
+	}
+	header := map[string]string {
+		"Authorization": token,
+	}
+	respBody, err := reqUtil.DoPostRequest(url, reqUtil.CONTENT_TYPE_JSON, paramBody, nil, header)
+	if err != nil {
+		return nil
+	}
+	var res dbapi.Result
+	if err = json.Unmarshal(respBody, &res); err != nil {
+		return nil
+	}
+	bytes, _ := json.Marshal(res.Data)
+	var ss shopSdks
+	if err := json.Unmarshal(bytes, &ss);err != nil {
+		return nil
+	}
+	m := make(map[string]Sdk)
+	for _,s := range ss.Sdks {
+		m[s.Id] = s
+	}
+	return m
+}
+
 func GetLocalSdks() []map[string]interface{} {
 	var algos = []map[string]interface{}{}
 
diff --git a/service/SdkDownLoad_test.go b/service/SdkDownLoad_test.go
index 6d43c33..bb857fa 100644
--- a/service/SdkDownLoad_test.go
+++ b/service/SdkDownLoad_test.go
@@ -1 +1,11 @@
 package service
+
+import (
+	"fmt"
+	"testing"
+)
+
+func TestGetSdkList(t *testing.T) {
+	list := GetSdkList("")
+	fmt.Println("sdks:", list)
+}
diff --git a/service/SdkInstall.go b/service/SdkInstall.go
index b930aab..43f29a3 100644
--- a/service/SdkInstall.go
+++ b/service/SdkInstall.go
@@ -9,6 +9,8 @@
 	"os"
 	"path"
 	"path/filepath"
+	"strconv"
+	"strings"
 	"webserver/extend/config"
 	"webserver/extend/util"
 )
@@ -23,17 +25,21 @@
 	if config.Server.PatchPath != "" {
 		configPatchPath = config.Server.PatchPath
 	} else {
-		configPatchPath = "/opt/vasystem/patch"
+		configPatchPath = "../patch"
 	}
 
 	filenameWithSuffix := path.Base(filename)
 	ext := path.Ext(filenameWithSuffix)
 
 	zipFilePath := configPatchPath + "/"+identifier+ext
+	unPackTargetPath := configPatchPath+"/"+identifier+"_basic/"
 	if util.Exists(zipFilePath) {
 		strMd5, e := util.FileMd5(zipFilePath)
 		if e !=nil || strMd5 == "" {
 			go os.Remove(zipFilePath)
+			if util.DirExists(unPackTargetPath) {
+				go os.RemoveAll(unPackTargetPath)
+			}
 			return false,errors.New("鑾峰彇瀹夎鍖卪d5澶辫触")
 		}
 		if strMd5 == identifier {
@@ -44,6 +50,9 @@
 
 		} else {
 			go os.Remove(zipFilePath)
+			if util.DirExists(unPackTargetPath) {
+				go os.RemoveAll(unPackTargetPath)
+			}
 			logger.Debug("strMd5 is", strMd5,"identifier is",identifier,"not equal")
 			return false,errors.New("鏍¢獙瀹夎鏂囦欢澶辫触")
 		}
@@ -58,7 +67,7 @@
 	if config.Server.PatchPath != "" {
 		configPatchPath = config.Server.PatchPath
 	} else {
-		configPatchPath = "/opt/vasystem/patch"
+		configPatchPath = "../patch"
 	}
 	//1.瑙e帇缂╂洿鏂板寘
 	unPackTargetPath := configPatchPath+"/"+identifier+"_basic/"
@@ -122,44 +131,76 @@
 						//3.灏嗙畻娉晄o銆佷緷璧栨枃浠躲�亃conf銆�
 						soM := make(map[string]SdkDef)
 						var skDefArr []SdkDef
+						nInsM := make(map[string]string)
+						aInsM := make(map[string]string)
 						if err = json.Unmarshal(defB, &skDefArr);err == nil {
-							//娉ㄥ唽绠楁硶淇℃伅鍜岀畻娉曞弬鏁板埌dbserver
 							var sdkApi dbapi.SdkApi
 							for _,skd := range skDefArr {
+								//娉ㄥ唽绠楁硶淇℃伅鍜岀畻娉曞弬鏁板埌dbserver
+								//鍏堢湅姝ょ畻娉曟湁娌℃湁娉ㄥ唽锛屽鏋滃凡瀹夎锛屾瘮瀵圭増鏈彿
+								bf, curDbSdk := sdkApi.GetById(skd.Def.Id)
+								if bf {
+									bytes, _ := json.Marshal(curDbSdk)
+									var sm map[string]interface{}
+									unE :=  json.Unmarshal(bytes, &sm)
+									if unE != nil {
+										continue
+									}
+									sdkVersion, ok := sm["version"]
+									if ok { //鏈夌増鏈彿
+										vStr := sdkVersion.(string)
+										if shouldVersionBeUpgrade(vStr, skd.Def.Version) {
+											nInsM[skd.Def.SdkType] = skd.Def.SdkType
+											aInsM[skd.Def.Id] = skd.Def.Id
+										}
+									} else {
+										nInsM[skd.Def.SdkType] = skd.Def.SdkType
+										aInsM[skd.Def.Id] = skd.Def.Id
+									}
+								} else {
+									nInsM[skd.Def.SdkType] = skd.Def.SdkType
+									aInsM[skd.Def.Id] = skd.Def.Id
+								}
+
+
 								if _,ok := soM[skd.Def.SdkType];!ok {
 									soM[skd.Def.SdkType] = skd
 								}
-								srv := SdkRegisterVo{
-									Id: skd.Def.Id,
-									SdkType: skd.Def.SdkType,
-									SdkName: skd.Def.SdkName,
-									Icon: skd.Def.Icon,
-									Url: skd.Def.Url,
-								}
-								for _,ag := range skd.Args {
-									sra := SdkRegisterArgVo{
-										Scope: ag.Scope,
+								if _,ok := aInsM[skd.Def.Id]; ok {
+									srv := SdkRegisterVo{
+										Id: skd.Def.Id,
+										SdkType: skd.Def.SdkType,
+										SdkName: skd.Def.SdkName,
+										Icon: skd.Def.Icon,
+										Url: skd.Def.Url,
+										IconBlob: skd.Def.IconBlob,
+										Version: skd.Def.Version,
 									}
-									sra.SdkArg = SdkArg{
-										Alias: ag.Alias,
-										Name: ag.Name,
-										Type: ag.Type,
-										ArgType: ag.ArgType,
-										Must: ag.Must,
-										Unit: ag.Unit,
-										Range: ag.Range,
-										DefaultValue: ag.DefaultValue,
-										DefaultOperator: ag.DefaultOperator,
-										Sort: ag.Sort,
+									for _,ag := range skd.Args {
+										sra := SdkRegisterArgVo{
+											Scope: ag.Scope,
+										}
+										sra.SdkArg = SdkArg{
+											Alias: ag.Alias,
+											Name: ag.Name,
+											Type: ag.Type,
+											ArgType: ag.ArgType,
+											Must: ag.Must,
+											Unit: ag.Unit,
+											Range: ag.Range,
+											DefaultValue: ag.DefaultValue,
+											DefaultOperator: ag.DefaultOperator,
+											Sort: ag.Sort,
+										}
+										srv.Args = append(srv.Args,  sra)
 									}
-									srv.Args = append(srv.Args,  sra)
+									paramBody := util.Struct2Map(srv)
+									logger.Debug("sdkApi.Register paramBody:", paramBody)
+									sdkApi.Register(paramBody) //灏嗙畻娉曟敞鍐屽埌鏁版嵁搴撲腑
 								}
-								paramBody := util.Struct2Map(srv)
-								logger.Debug("sdkApi.Register paramBody:", paramBody)
-								sdkApi.Register(paramBody) //灏嗙畻娉曟敞鍐屽埌鏁版嵁搴撲腑
 							}
-							zconfPath := "/opt/vasystem/bin/zconf/"
-							libPath := "/opt/vasystem/libs/"
+							zconfPath := "./zconf/"
+							libPath := "../libs/"
 							if !util.DirExists(zconfPath) {
 								os.MkdirAll(zconfPath, 0777)
 							}
@@ -167,24 +208,28 @@
 								os.MkdirAll(libPath, 0777)
 							}
 							for sdkType,_ := range soM {
-								//鍏堣В鍘婼dkType.tar.gz鏂囦欢
-								if unTarGzE := util.UnTarGz(unPackPath+sdkType+".tar.gz", unPackPath);unTarGzE == nil {
-									//澶嶅埗json鍚姩鏂囦欢
-									if util.Exists(unPackPath+sdkType+"/zconf/"+sdkType+".json") {
-										util.CopyFile(unPackPath+sdkType+"/zconf/"+sdkType+".json", zconfPath+sdkType+".json")
-									}
-									if util.DirExists(unPackPath+sdkType) {
-										if _,cE := util.CopyDirByCmd(unPackPath+sdkType, libPath);cE != nil {
-											return false, cE
+								if _,iOk := nInsM[sdkType];iOk {
+									//鍏堣В鍘婼dkType.tar.gz鏂囦欢
+									if unTarGzE := util.UnTarGz(unPackPath+sdkType+".tar.gz", unPackPath);unTarGzE == nil {
+										//澶嶅埗json鍚姩鏂囦欢
+										if util.Exists(unPackPath+sdkType+"/zconf/"+sdkType+".json") {
+											util.CopyFile(unPackPath+sdkType+"/zconf/"+sdkType+".json", zconfPath+sdkType+".json")
 										}
-									}
-									if util.DirExists(unPackPath+sdkType+"/models") {
-										if _,cE := util.CopyDirByCmd(unPackPath+sdkType+"/models", "/opt/vasystem/bin/zconf"); cE != nil {
-											return false, cE
+										if util.DirExists(unPackPath+sdkType) {
+											if _,cE := util.CopyDirByCmd(unPackPath+sdkType, libPath);cE != nil {
+												return false, cE
+											}
 										}
+										if util.DirExists(unPackPath+sdkType+"/models") {
+											if _,cE := util.CopyDirByCmd(unPackPath+sdkType+"/models", "./zconf"); cE != nil {
+												return false, cE
+											}
+										}
+									} else {
+										logger.Debug("unTarGzE sdkType.tar.gz err:", unTarGzE)
 									}
 								} else {
-									logger.Debug("unTarGzE sdkType.tar.gz err:", unTarGzE)
+									logger.Debug("upper version has been installed")
 								}
 							}
 
@@ -208,6 +253,49 @@
 	}
 
 	return true, nil
+}
+
+func shouldVersionBeUpgrade(curVersion,dstVersion string) bool {
+	if curVersion == "" {
+		return true
+	}
+	if dstVersion == "" {
+		return false
+	}
+	curIVArr := strings.Split(curVersion, ".")
+	dstIVArr := strings.Split(dstVersion, ".")
+	if len(curIVArr) !=3 || len(dstIVArr) != 3{
+		return false
+	}
+	cH,cEH := strconv.Atoi(curIVArr[0])
+	cM,cEM := strconv.Atoi(curIVArr[1])
+	cL,cEL := strconv.Atoi(curIVArr[2])
+
+	dH,dEH := strconv.Atoi(curIVArr[0])
+	dM,dEM := strconv.Atoi(curIVArr[1])
+	dL,dEL := strconv.Atoi(curIVArr[2])
+	if cEH !=nil || cEM != nil || cEL != nil || dEH != nil ||dEM !=nil || dEL !=nil {
+		return false
+	}
+	if cH > dH {
+		return false
+	} else if cH == dH {
+		if cM > dM {
+			return false
+		} else if cM == dM {
+			if cL > dL {
+				return false
+			} else if cL == dL {
+				return false
+			} else {
+				return true
+			}
+		} else {
+			return true
+		}
+	} else {
+		return true
+	}
 }
 
 
@@ -243,6 +331,15 @@
 	Enable 			bool 		`gorm:"column:enable;default:1" json:"enable"`
 	DelFlag 		int 		`gorm:"column:del_flag;default:0" json:"del_flag"`
 	Env 			string 		`gorm:"column:env" json:"env"` //杩愯鐜鍙婄粨鏋滆鏄庯紝json鏍煎紡锛屽寘鍚玸o_file_path,runtime,param,depends(cuda鐗堟湰锛宱pencv鐗堟湰锛宼ensorflow鐗堟湰绛�)
+	IconBlob 		string 		`gorm:"column:iconBlob;type:text;" json:"iconBlob"` //鍥剧墖
+	Version 		string 		`gorm:"column:version;type:varchar(50);default:'1.0';" json:"version"` //鐗堟湰鍙�
+}
+
+type SdkInsOrUpgrade struct {
+	Sdk
+	RemoteVersion 	string 		 `json:"remoteVersion"` //鍟嗗煄浠撳簱鐗堟湰鍙�
+	Installed 		bool 		 `json:"installed"` //鏄惁宸插畨瑁�
+	IsUpgrade 		bool 		 `json:"isUpgrade"` //鏄惁闇�瑕佸崌绾�
 }
 
 type SdkArgEntity struct {
@@ -267,23 +364,25 @@
 
 
 type SdkRegisterVo struct {
-	Id 		string `json:"id"`
-	SdkType string `json:"sdk_type"`//浜鸿劯妫�娴嬶細FaceDetect,浜鸿劯鎻愬彇锛欶aceExtract,浜鸿劯姣斿锛欶aceCompare,琛屼负锛歒olo
-	SdkName string `json:"sdk_name"`    //绠楁硶鍚嶇О
-	Args    []SdkRegisterArgVo `json:"args"` //绠楁硶鍙傛暟
-	Icon    string `json:"icon"`       //绠楁硶鍥炬爣
-	Url     string `json:"url"`                       //绠楁硶涓嬭浇鍦板潃
+	Id 				string 				`json:"id"`
+	SdkType 		string 				`json:"sdk_type"`//浜鸿劯妫�娴嬶細FaceDetect,浜鸿劯鎻愬彇锛欶aceExtract,浜鸿劯姣斿锛欶aceCompare,琛屼负锛歒olo
+	SdkName 		string 				`json:"sdk_name"`    //绠楁硶鍚嶇О
+	Args    		[]SdkRegisterArgVo 	`json:"args"` //绠楁硶鍙傛暟
+	Icon    		string 				`json:"icon"`       //绠楁硶鍥炬爣
+	Url     		string 				`json:"url"`        //绠楁硶涓嬭浇鍦板潃
+	IconBlob 		string 				`json:"iconBlob"` //鍥剧墖
+	Version 		string 				`json:"version"` //鐗堟湰鍙�
 }
 
 type SdkRegisterArgVo struct {
-	Scope string `json:"scope"`
+	Scope 			string 			`json:"scope"`
 	SdkArg
 
-	Dics []SdkArgDic `json:"dics"` //濡傛灉姝ょ畻娉曞弬鏁版槸琚�夐」锛岄渶瑕佸皢鍙傛暟鏋氫妇鍊煎啓鍏ュ埌瀛楀吀琛ㄤ腑
+	Dics 			[]SdkArgDic 	`json:"dics"` //濡傛灉姝ょ畻娉曞弬鏁版槸琚�夐」锛岄渶瑕佸皢鍙傛暟鏋氫妇鍊煎啓鍏ュ埌瀛楀吀琛ㄤ腑
 }
 
 type SdkArgDic struct {
-	Value string `json:"value"`
-	Name string `json:"name"`
-	Sort int `json:"sort"`
+	Value 			string 			`json:"value"`
+	Name 			string 			`json:"name"`
+	Sort 			int 			`json:"sort"`
 }
\ No newline at end of file

--
Gitblit v1.8.0