package controllers import ( "net/http" "strconv" "webserver/extend/code" "webserver/extend/config" "webserver/extend/util" "webserver/middlewares/auth" "webserver/service" "basic.com/dbapi.git" "basic.com/valib/logger.git" "github.com/gin-gonic/gin" ) type SdkController struct { } type SdkVo struct { Id string `json:"id"` SdkType string `json:"sdk_type"` //人脸检测:FaceDetect,人脸提取:FaceExtract,人脸比对:FaceCompare,行为:Yolo SdkName string `json:"sdk_name"` //算法名称 Args []SdkArgVo `json:"args"` //算法参数 Icon string `json:"icon"` //算法图标 Url string `json:"url"` //算法下载地址 CreateTime string `json:"create_time"` CreateBy string `json:"create_by"` UpdateTime string `json:"update_time"` Enable bool `json:"enable"` //是否启用 DelFlag bool `json:"del_flag"` //逻辑删除 } //算法参数定义 type SdkArgVo struct { Alias string `json:"alias"` //参数的别名 Name string `json:"name"` //参数名称 Type string `json:"type"` //参数类型(整数,字符串或数组) Must bool `json:"must"` //是否必填 Unit string `json:"unit"` Range string `json:"range"` //值的范围,eg:0,100表示从0到100 DefaultValue string `json:"default_value"` Sort int `json:"sort"` //参数顺序 } // @Security ApiKeyAuth // @Summary 算法保存 // @Description 算法保存 // @Accept json // @Produce json // @Tags sdk // @Param reqMap body controllers.SdkVo true "人脸检测" // @Success 200 {string} json "{"code":200, msg:"请求处理成功",data:"",success:true}" // @Failure 500 {string} json "{"code":500, msg:"请求失败",data:"",success:false}" // @Router /data/api-v/sdk/save [POST] func (sc SdkController) Save(c *gin.Context) { var sdk SdkVo var api dbapi.SdkApi if err := c.BindJSON(&sdk); err != nil { util.ResponseFormat(c, code.RequestParamError, "参数错误") return } paramBody := util.Struct2Map(sdk) flag, data := api.Register(paramBody) if flag { util.ResponseFormat(c, code.Success, data) } else { util.ResponseFormat(c, code.ComError, data) } } // @Security ApiKeyAuth // @Summary 查找所有算法 // @Description 查找所有算法 // @Produce json // @Tags sdk // @Param sdkName query string false "可选参数" // @Success 200 {string} json "{"code":200, msg:"请求处理成功",data:"算法列表",success:true}" // @Failure 500 {string} json "{"code":500, msg:"请求失败",data:"[]",success:false}" // @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("") //本机已安装的算法 util.ResponseFormat(c, code.Success, sdks) } // @Security ApiKeyAuth // @Summary 根据id获取算法信息 // @Description 根据id获取算法信息 // @Produce json // @Tags sdk // @Param id query string true "算法id,必填" // @Success 200 {string} json "{"code":200, msg:"请求处理成功",data:"算法信息",success:true}" // @Failure 500 {string} json "{"code":500, msg:"请求失败",data:"",success:false}" // @Router /data/api-v/sdk/getById [GET] func (sc SdkController) GetById(c *gin.Context) { var api dbapi.SdkApi sdkId := c.Query("id") if sdkId == "" { util.ResponseFormat(c, code.RequestParamError, "sdkId不能为空") return } flag, sdk := api.GetById(sdkId) if flag { util.ResponseFormat(c, code.Success, sdk) } else { util.ResponseFormat(c, code.ComError, sdk) } } // @Router /data/api-v/sdkArg/getSdkArgs [get] func (sc SdkController) GetSdkArgs(c *gin.Context) { sdkId := c.Query("sdkId") scope := c.Query("scope") if sdkId == "" || scope == "" { util.ResponseFormat(c, code.RequestParamError, "参数有误") return } var api dbapi.SdkApi b, d := api.GetSdkArgs(sdkId, scope) if b { util.ResponseFormat(c, code.Success, d) } else { util.ResponseFormat(c, code.ComError, "查询失败") } } // @Security ApiKeyAuth // @Summary 根据taskId获取算法信息 // @Description 根据taskId获取算法信息 // @Produce json // @Tags sdk // @Param taskId query string true "taskId,必填" // @Success 200 {string} json "{"code":200, msg:"请求处理成功",data:"算法信息",success:true}" // @Failure 500 {string} json "{"code":500, msg:"请求失败",data:"",success:false}" // @Router /data/api-v/sdk/findByTaskId [GET] func (sc SdkController) FindByTaskId(c *gin.Context) { var api dbapi.SdkApi taskId := c.Query("taskId") if taskId == "" { util.ResponseFormat(c, code.ComError, "任务id不能为空") return } flag, sdks := api.FindByTaskId(taskId) if flag { util.ResponseFormat(c, code.Success, sdks) } else { util.ResponseFormat(c, code.ComError, sdks) } } // @Summary 算法安装包上传(分块检查) // @Description 算法安装包上传(分块检查) // @Accept multipart/form-data // @Produce json // @Tags sdk // @Param chunkNumber formData int true "当前是第几个分块" // @Param chunkSize formData int true "每一块的大小" // @Param currentChunkSize formData int true "当前块的大小" // @Param identifier formData string true "整个文件的唯一标识,目前是md5" // @Param filename formData string true "文件名称" // @Param relativePath formData string true "文件在客户端电脑的路径" // @Param totalChunks formData int true "文件总块数" // @Success 200 {string} json "{"code":200, msg:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", success:false}" // @Router /data/api-v/sdk/upload [get] func (sc SdkController) Upload(c *gin.Context) { authDriver := auth.GenerateAuthDriver() userM := (*authDriver).User(c) if userM ==nil { util.ResponseFormat(c,code.TokenNotFound,"登录过期,请登录") return } chunkNumber, e1 := strconv.Atoi(c.Request.FormValue("chunkNumber")) chunkSize, e2 := strconv.Atoi(c.Request.FormValue("chunkSize")) currentChunkSize, e3 := strconv.Atoi(c.Request.FormValue("currentChunkSize")) identifier := c.Request.FormValue("identifier") filename := c.Request.FormValue("filename") relativePath := c.Request.FormValue("relativePath") totalChunks, e5 := strconv.Atoi(c.Request.FormValue("totalChunks")) if identifier == "" || e1 != nil || e2 != nil || e3 != nil || e5 !=nil { util.ResponseFormat(c,code.RequestParamError,"参数有误") return } var arg = service.FileChunkCheckVo { UserId: userM["id"].(string), FileName: filename, Identifier: identifier, RelativePath: relativePath, TotalChunks: totalChunks, ChunkNumber: chunkNumber, ChunkSize: chunkSize, CurrentChunkSize:currentChunkSize, } var sv service.SysService if b := sv.CheckUpdateFile(&arg);b { c.String(http.StatusOK,"found") } else { c.String(http.StatusNoContent,"") } } // @Security ApiKeyAuth // @Summary 算法安装包上传 // @Description 算法安装包上传 // @Accept multipart/form-data // @Produce json // @Tags sysset // @Param chunkNumber formData int true "当前是第几个分块" // @Param chunkSize formData int true "每一块的大小" // @Param currentChunkSize formData int true "当前块的大小" // @Param totalSize formData string true "文件总大小" // @Param identifier formData string true "整个文件的唯一标识,目前是md5" // @Param filename formData string true "文件名称" // @Param relativePath formData string true "文件在客户端电脑的路径" // @Param totalChunks formData int true "文件总块数" // @Param file formData file true "文件分片内容" // @Success 200 {string} json "{"code":200, msg:"", success:true}" // @Failure 500 {string} json "{"code":500, msg:"", success:false}" // @Router /data/api-v/sdk/upload [post] func (sc SdkController) UploadPack(c *gin.Context) { authDriver := auth.GenerateAuthDriver() userM := (*authDriver).User(c) if userM == nil { util.ResponseFormat(c, code.TokenNotFound, "登录过期,请登录") return } chunkNumber, e1 := strconv.Atoi(c.Request.FormValue("chunkNumber")) chunkSize, e2 := strconv.Atoi(c.Request.FormValue("chunkSize")) currentChunkSize, e3 := strconv.Atoi(c.Request.FormValue("currentChunkSize")) totalSize, e4 := strconv.ParseInt(c.Request.FormValue("totalSize"), 10, 64) identifier := c.Request.FormValue("identifier") filename := c.Request.FormValue("filename") relativePath := c.Request.FormValue("relativePath") totalChunks, e5 := strconv.Atoi(c.Request.FormValue("totalChunks")) file, header, e6 := c.Request.FormFile("file") if identifier == "" || e1 != nil || e2 != nil || e3 != nil || e4 != nil || e5 != nil || e6 != nil { util.ResponseFormat(c, code.RequestParamError, "参数有误") return } var arg = service.FileUploadVo{ UserId: userM["id"].(string), FileName: filename, Identifier: identifier, RelativePath: relativePath, TotalSize: totalSize, TotalChunks: totalChunks, ChunkNumber: chunkNumber, ChunkSize: chunkSize, CurrentChunkSize: currentChunkSize, File: &file, Header: header, } var sv service.SysService if b,isComplete := sv.PatchUpload(&arg); b { if isComplete { //上传完毕需要自动触发安装 var sv service.SdkInstallService if b,err := sv.SdkInstall(identifier, filename);b { util.ResponseFormat(c,&code.Code{http.StatusOK, true, "算法安装成功"},"算法安装成功") return } else { util.ResponseFormat(c,&code.Code{http.StatusBadRequest, false, "算法安装失败"},err.Error()) return } } util.ResponseFormat(c, code.Success, "") } else { util.ResponseFormat(c, code.ComError, "") } } func (sc SdkController) SdkDownLoad(c *gin.Context) { var soApi dbapi.SdkApi var sdkConfig map[string]interface{} sdkId, exist := c.GetQuery("path") if !exist { util.ResponseFormat(c, code.ComError, "下载的算法参数有误") } logger.Info(sdkId) // 先查找本地目录内是否已存在算法so, 没有走云端下载 if sdkConfig = service.FindLocalSdkSoById(sdkId); sdkConfig == nil { sdkConfig = service.DownSdk(sdkId) } if sdkConfig != nil { if regSdkSuccess, _ := soApi.Register(sdkConfig); regSdkSuccess { util.ResponseFormat(c, code.Success, "下载算法成功!") return } } flag := c.Query("needUpdateMiddle") // 下载算法(有时候也需要把中间件一起下载下来) if flag == "true" { // 下载并更新中间件,带上MD5校验 flag1, err := service.DownSo("http://" + config.SoPath.Ip + ":" + config.SoPath.Port + "/" + "middleware.so") logger.Debug("中间件路径:", "http://"+config.SoPath.Ip+":"+config.SoPath.Port+"/"+"middleware.so") if err != nil { logger.Info(err) } if !flag1 { util.ResponseFormat(c, code.ComError, "请重新下载算法") } } util.ResponseFormat(c, code.ComError, "算法下载失败,请重试") }