diff --git a/constants/recommend_product.go b/constants/recommend_product.go deleted file mode 100644 index 81496ee7..00000000 --- a/constants/recommend_product.go +++ /dev/null @@ -1,9 +0,0 @@ -package constants - -type recommend_product int64 - -// 产品详情页推荐产品 -const PRODUCT_DETAIL_RECOMMEND_CATEGORY recommend_product = 1 - -// 主页推荐产品 -const HOME_PAGE_RECOMMEND_CATEGORY recommend_product = 2 diff --git a/model/gmodel/fs_product_recommend_gen.go b/model/gmodel/fs_product_recommend_gen.go index 16988d7a..930a3da8 100644 --- a/model/gmodel/fs_product_recommend_gen.go +++ b/model/gmodel/fs_product_recommend_gen.go @@ -9,7 +9,6 @@ type FsProductRecommend struct { Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // ProductId *int64 `gorm:"default:0;" json:"product_id"` // 产品ID Status *int64 `gorm:"default:1;" json:"status"` // 状态 1正常 0不正常 - Category *int64 `gorm:"default:1;" json:"category"` // 推荐类别1:详情推荐 2:列表页推荐 Ctime *int64 `gorm:"default:0;" json:"ctime"` // 添加时间 } type FsProductRecommendModel struct { diff --git a/model/gmodel/fs_product_recommend_logic.go b/model/gmodel/fs_product_recommend_logic.go index 71e9f4aa..02e33584 100644 --- a/model/gmodel/fs_product_recommend_logic.go +++ b/model/gmodel/fs_product_recommend_logic.go @@ -7,10 +7,9 @@ import ( ) type GetRecommendProductListReq struct { - Ctx context.Context - Page int - Limit int - Category int64 // 0是全部 + Ctx context.Context + Page int + Limit int } func (r *FsProductRecommendModel) GetRecommendProductList(req GetRecommendProductListReq) (resp []FsProduct, total int64, err error) { @@ -19,9 +18,6 @@ func (r *FsProductRecommendModel) GetRecommendProductList(req GetRecommendProduc Joins("inner join fs_product as p on r.product_id = p.id"). Where("r.status = ? ", 1). Where("p.is_shelf = ? and p.is_del = ? and p.status = ?", 1, 0, 1) - if req.Category != 0 { - db = db.Where("r.category = ?", req.Category) - } if err = db.Limit(1).Count(&total).Error; err != nil { return nil, 0, err } @@ -30,24 +26,14 @@ func (r *FsProductRecommendModel) GetRecommendProductList(req GetRecommendProduc err = db.Offset(offset).Limit(req.Limit).Find(&resp).Error return resp, total, err } -func (r *FsProductRecommendModel) GetIgnoreRandomRecommendProductList(ctx context.Context, limit int, category int64, idNotInt []int64) (resp []FsProduct, err error) { - err = r.db.WithContext(ctx).Debug().Select("p.*"). - Table("fs_product_recommend as r"). - Joins("inner join fs_product as p on r.product_id = p.id"). - Where("r.product_id not in (?)", idNotInt). - Where("r.status = ? ", 1). - Where("p.is_shelf = ? and p.is_del = ? and p.status = ?", 1, 0, 1). - Where("r.category = ?", category).Order("RAND()").Limit(limit).Find(&resp).Error - return resp, err -} -func (r *FsProductRecommendModel) CreateOrUpdate(ctx context.Context, productId int64, category int64, data *FsProductRecommend) error { +func (r *FsProductRecommendModel) CreateOrUpdate(ctx context.Context, productId int64, data *FsProductRecommend) error { var info FsProductRecommend - err := r.db.WithContext(ctx).Model(&FsProductRecommend{}).Where("`product_id` = ? and `category` = ?", productId, category).Take(&info).Error + err := r.db.WithContext(ctx).Model(&FsProductRecommend{}).Where("`product_id` = ?", productId).Take(&info).Error if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { return err } if info.Id == 0 { return r.db.WithContext(ctx).Model(&FsProductRecommend{}).Create(data).Error } - return r.db.WithContext(ctx).Model(&FsProductRecommend{}).Where("`product_id` = ? and `category` = ?", productId, category).Updates(data).Error + return r.db.WithContext(ctx).Model(&FsProductRecommend{}).Where("`product_id` = ?", productId).Updates(data).Error } diff --git a/model/gmodel/fs_product_tag_prop_gen.go b/model/gmodel/fs_product_tag_prop_gen.go new file mode 100644 index 00000000..078d6b4b --- /dev/null +++ b/model/gmodel/fs_product_tag_prop_gen.go @@ -0,0 +1,23 @@ +package gmodel + +import ( + "gorm.io/gorm" +) + +// fs_product_tag_prop 产品标签相关属性表 +type FsProductTagProp struct { + Id int64 `gorm:"primary_key;default:0;auto_increment;" json:"id"` // id + ProductId *int64 `gorm:"default:0;" json:"product_id"` // 产品id + TagId *int64 `gorm:"default:0;" json:"tag_id"` // 模板标签id + Cover *string `gorm:"default:'';" json:"cover"` // + Status *int64 `gorm:"default:1;" json:"status"` // 状态 + Ctime *int64 `gorm:"default:0;" json:"ctime"` // 创建时间 +} +type FsProductTagPropModel struct { + db *gorm.DB + name string +} + +func NewFsProductTagPropModel(db *gorm.DB) *FsProductTagPropModel { + return &FsProductTagPropModel{db: db, name: "fs_product_tag_prop"} +} diff --git a/model/gmodel/fs_product_tag_prop_logic.go b/model/gmodel/fs_product_tag_prop_logic.go new file mode 100644 index 00000000..e68225aa --- /dev/null +++ b/model/gmodel/fs_product_tag_prop_logic.go @@ -0,0 +1,2 @@ +package gmodel +// TODO: 使用model的属性做你想做的 \ No newline at end of file diff --git a/model/gmodel/var_gen.go b/model/gmodel/var_gen.go index 4130f837..dd5174be 100644 --- a/model/gmodel/var_gen.go +++ b/model/gmodel/var_gen.go @@ -65,6 +65,7 @@ type AllModelsGen struct { FsProductRenderDesign *FsProductRenderDesignModel // fs_product_render_design FsProductScene *FsProductSceneModel // fs_product_scene 产品场景表 FsProductSize *FsProductSizeModel // fs_product_size 产品尺寸表 + FsProductTagProp *FsProductTagPropModel // fs_product_tag_prop 产品标签相关属性表 FsProductTemplate *FsProductTemplateModel // fs_product_template 产品模板表(已废弃) FsProductTemplateBasemap *FsProductTemplateBasemapModel // fs_product_template_basemap 模板底图表 FsProductTemplateElement *FsProductTemplateElementModel // fs_product_template_element 云渲染配置表 @@ -158,6 +159,7 @@ func NewAllModels(gdb *gorm.DB) *AllModelsGen { FsProductRenderDesign: NewFsProductRenderDesignModel(gdb), FsProductScene: NewFsProductSceneModel(gdb), FsProductSize: NewFsProductSizeModel(gdb), + FsProductTagProp: NewFsProductTagPropModel(gdb), FsProductTemplate: NewFsProductTemplateModel(gdb), FsProductTemplateBasemap: NewFsProductTemplateBasemapModel(gdb), FsProductTemplateElement: NewFsProductTemplateElementModel(gdb), diff --git a/server/product/internal/logic/getrecommandproductlistlogic.go b/server/product/internal/logic/getrecommandproductlistlogic.go index 103134a0..f3bf72be 100644 --- a/server/product/internal/logic/getrecommandproductlistlogic.go +++ b/server/product/internal/logic/getrecommandproductlistlogic.go @@ -2,7 +2,7 @@ package logic import ( "errors" - "fusenapi/constants" + "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" "fusenapi/utils/format" @@ -46,15 +46,23 @@ func (l *GetRecommandProductListLogic) GetRecommandProductList(req *types.GetRec logx.Error(err) return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get detail product info") } - //随机取产品列表(不包含详情产品) - recommendProductList, err := l.svcCtx.AllModels.FsProductRecommend.GetIgnoreRandomRecommendProductList(l.ctx, int(req.Num), int64(constants.PRODUCT_DETAIL_RECOMMEND_CATEGORY), []int64{productInfo.Id}) - if err != nil { - logx.Error(err) - return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get random recommend list") + var ( + recommendProductList []gmodel.FsProduct + ) + if productInfo.RecommendProduct != nil && *productInfo.RecommendProduct != "" { + recommendProductIds, err := format.StrSlicToInt64Slice(strings.Split(*productInfo.RecommendProduct, ",")) + if err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeServiceErr, "failed to split recommend product ids") + } + recommendProductList, err = l.svcCtx.AllModels.FsProduct.GetProductListByIds(l.ctx, recommendProductIds, "") + if err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to get recommend product list") + } } //需要填充时需要忽略的id - ignoreProductIds := make([]int64, 0, len(recommendProductList)+1) - ignoreProductIds = append(ignoreProductIds, productInfo.Id) + ignoreProductIds := make([]int64, 0, len(recommendProductList)) productIds := make([]int64, 0, len(recommendProductList)) //在合并之前记住推荐的产品 mapRecommend := make(map[int64]struct{}) diff --git a/server/product/internal/logic/gettagproductlistlogic.go b/server/product/internal/logic/gettagproductlistlogic.go index 42e240e1..948c9799 100644 --- a/server/product/internal/logic/gettagproductlistlogic.go +++ b/server/product/internal/logic/gettagproductlistlogic.go @@ -363,7 +363,7 @@ func (l *GetTagProductListLogic) getTagProducts(req getTagProductsReq) (productL } image.ThousandFaceImageFormat(&r) item.Cover = r.Cover - item.CoverDefault = r.CoverDefault + item.CoverDefault = nil //加入分类产品切片 productListRsp = append(productListRsp, item) } diff --git a/server/product/internal/logic/homepagerecommendproductlistlogic.go b/server/product/internal/logic/homepagerecommendproductlistlogic.go index 899de460..b41c7dd0 100644 --- a/server/product/internal/logic/homepagerecommendproductlistlogic.go +++ b/server/product/internal/logic/homepagerecommendproductlistlogic.go @@ -3,7 +3,6 @@ package logic import ( "errors" "fmt" - "fusenapi/constants" "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" @@ -55,10 +54,9 @@ func (l *HomePageRecommendProductListLogic) HomePageRecommendProductList(req *ty ) //获取列表推荐产品 recommendProductList, _, err = l.svcCtx.AllModels.FsProductRecommend.GetRecommendProductList(gmodel.GetRecommendProductListReq{ - Ctx: l.ctx, - Page: 1, - Limit: 500, //设置最大500 - Category: int64(constants.HOME_PAGE_RECOMMEND_CATEGORY), + Ctx: l.ctx, + Page: 1, + Limit: 500, //设置最大500 }) if len(recommendProductList) == 0 { return resp.SetStatusWithMessage(basic.CodeOK, "success", []interface{}{}) diff --git a/server/product/internal/types/types.go b/server/product/internal/types/types.go index f2d27f0a..c1aaf641 100644 --- a/server/product/internal/types/types.go +++ b/server/product/internal/types/types.go @@ -268,15 +268,20 @@ type TagItem struct { } type TagProduct struct { - ProductId int64 `json:"product_id"` - Sn string `json:"sn"` - Title string `json:"title"` - Cover string `json:"cover"` - SizeNum uint32 `json:"size_num"` - MinPrice int64 `json:"min_price"` - CoverDefault string `json:"cover_default"` - HaveOptionalFitting bool `json:"have_optional_fitting"` - Recommended bool `json:"recommended"` + ProductId int64 `json:"product_id"` + Sn string `json:"sn"` + Title string `json:"title"` + Cover string `json:"cover"` + SizeNum uint32 `json:"size_num"` + MinPrice int64 `json:"min_price"` + CoverDefault []CoverDefaultItem `json:"cover_default"` + HaveOptionalFitting bool `json:"have_optional_fitting"` + Recommended bool `json:"recommended"` +} + +type CoverDefaultItem struct { + Tag string `json:"tag"` + Cover string `json:"cover"` } type GetRenderDesignReq struct { diff --git a/server/upload/etc/upload.yaml b/server/upload/etc/upload.yaml index 3f23b771..98488a6a 100644 --- a/server/upload/etc/upload.yaml +++ b/server/upload/etc/upload.yaml @@ -16,4 +16,4 @@ AWS: Token: BLMService: ImageProcess: - Url: "http://110.41.19.98:8868/removebg" + Url: "http://192.168.1.8:45678/FeatureExtraction" diff --git a/server/upload/internal/logic/uploadfilebaselogic.go b/server/upload/internal/logic/uploadfilebaselogic.go index ab38fe4c..1383730a 100644 --- a/server/upload/internal/logic/uploadfilebaselogic.go +++ b/server/upload/internal/logic/uploadfilebaselogic.go @@ -50,18 +50,20 @@ func (l *UploadFileBaseLogic) UploadFileBase(req *types.UploadFileBaseReq, useri var guestId int64 // 检查用户是否是游客 - if userinfo.IsGuest() { - // 如果是,使用游客ID和游客键名格式 - guestId = userinfo.GuestId - } else { - // 否则,使用用户ID和用户键名格式 - userId = userinfo.UserId - } - if guestId == 0 { - guestId = req.GuestId - } - if userId == 0 { - userId = req.UserId + if userinfo != nil { + if userinfo.IsGuest() { + // 如果是,使用游客ID和游客键名格式 + guestId = userinfo.GuestId + } else { + // 否则,使用用户ID和用户键名格式 + userId = userinfo.UserId + } + if guestId == 0 { + guestId = req.GuestId + } + if userId == 0 { + userId = req.UserId + } } // 定义存储桶名称 diff --git a/server/upload/internal/logic/uploadlogologic.go b/server/upload/internal/logic/uploadlogologic.go index f9babfb8..0b81695d 100644 --- a/server/upload/internal/logic/uploadlogologic.go +++ b/server/upload/internal/logic/uploadlogologic.go @@ -1,9 +1,13 @@ package logic import ( + "encoding/json" "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" + "io" + "net/http" + "strings" "time" "context" @@ -79,47 +83,23 @@ func (l *UploadLogoLogic) UploadLogo(req *types.UploadLogoReq, userinfo *auth.Us } var resultStr string var err error + var postMap = make(map[string]interface{}, 1) + postMap["logo_url"] = req.ResourceUrl + postMapB, _ := json.Marshal(postMap) - // apiUrl := l.svcCtx.Config.BLMService.ImageProcess.Url - // var onlyScale = true - // data := url.Values{} - // data.Set("imgurl", req.ResourceUrl) - // data.Set("layerwidth", strconv.Itoa(int(logoWidth))) - // data.Set("layerheight", strconv.Itoa(int(logoHeight))) - // data.Set("is_remove_bg", strconv.Itoa(int(req.IsRemoveBg))) - // data.Set("proportion", strconv.Itoa(int(req.Proportion))) - // data.Set("only_scale", fmt.Sprintf("%v", onlyScale)) - - // u, err := url.ParseRequestURI(apiUrl) - // if err != nil { - // logx.Error(err) - // return resp.SetStatus(basic.CodeFileUploadLogoErr, "service fail") - // } - // u.RawQuery = data.Encode() // URL encode - // fmt.Println(u.String()) - // result, err := http.Get(u.String()) - // if err != nil { - // logx.Error(err) - // return resp.SetStatus(basic.CodeFileUploadLogoErr, "service fail") - // } - // defer result.Body.Close() - // b, err := io.ReadAll(result.Body) - // if err != nil { - // logx.Error(err) - // return resp.SetStatus(basic.CodeFileUploadLogoErr, "service fail") - // } - // resultStr = string(b) - - // // 上传图片 - // var reqs types.UploadFileBaseReq - // reqs.ApiType = 2 - // reqs.UploadBucket = 2 - // reqs.Metadata = "" - // reqs.FileData = "" - // reqs.FileKey = "" - - // // 创建一个业务逻辑层实例 - // resUpload := NewUploadFileBaseLogic(l.ctx, l.svcCtx).UploadFileBase(&reqs, userinfo) + contentType := "application/json" + result, err := http.Post(l.svcCtx.Config.BLMService.ImageProcess.Url, contentType, strings.NewReader(string(postMapB))) + if err != nil { + logx.Error(err) + return resp.SetStatus(basic.CodeFileUploadLogoErr, "service fail") + } + defer result.Body.Close() + b, err := io.ReadAll(result.Body) + if err != nil { + logx.Error(err) + return resp.SetStatus(basic.CodeFileUploadLogoErr, "service fail") + } + resultStr = string(b) var module = "logo" var nowTime = time.Now().Unix() diff --git a/server/upload/internal/types/types.go b/server/upload/internal/types/types.go index 952e4282..bb635925 100644 --- a/server/upload/internal/types/types.go +++ b/server/upload/internal/types/types.go @@ -18,7 +18,7 @@ type UploadFileBaseReq struct { type UploadLogoReq struct { ResourceId string `form:"resource_id"` // 资源ID ResourceUrl string `form:"resource_url"` // 资源URL - IsRemoveBg int64 `form:"is_remove_bg"` // 是否要去掉背景 + IsRemoveBg int64 `form:"is_remove_bg,optional"` // 是否要去掉背景 Proportion int64 `form:"proportion,default=60"` // 贴图在模型面板上的比例 SkuId int64 `form:"sku_id,default=0"` // 模板ID } diff --git a/server_api/product.api b/server_api/product.api index 48ac5a50..711ce0d4 100644 --- a/server_api/product.api +++ b/server_api/product.api @@ -317,15 +317,20 @@ type TagItem { ChildTagList []*TagItem `json:"child_tag_list"` } type TagProduct { - ProductId int64 `json:"product_id"` - Sn string `json:"sn"` - Title string `json:"title"` - Cover string `json:"cover"` - SizeNum uint32 `json:"size_num"` - MinPrice int64 `json:"min_price"` - CoverDefault string `json:"cover_default"` - HaveOptionalFitting bool `json:"have_optional_fitting"` - Recommended bool `json:"recommended"` + ProductId int64 `json:"product_id"` + Sn string `json:"sn"` + Title string `json:"title"` + Cover string `json:"cover"` + SizeNum uint32 `json:"size_num"` + MinPrice int64 `json:"min_price"` + //彩膜列表 + CoverDefault []CoverDefaultItem `json:"cover_default"` + HaveOptionalFitting bool `json:"have_optional_fitting"` + Recommended bool `json:"recommended"` +} +type CoverDefaultItem { + Tag string `json:"tag"` + Cover string `json:"cover"` } //获取云渲染设计方案信息 type GetRenderDesignReq { diff --git a/server_api/upload.api b/server_api/upload.api index d0bfdef2..d8479feb 100644 --- a/server_api/upload.api +++ b/server_api/upload.api @@ -60,7 +60,7 @@ type ( UploadLogoReq { ResourceId string `form:"resource_id"` // 资源ID ResourceUrl string `form:"resource_url"` // 资源URL - IsRemoveBg int64 `form:"is_remove_bg"` // 是否要去掉背景 + IsRemoveBg int64 `form:"is_remove_bg,optional"` // 是否要去掉背景 Proportion int64 `form:"proportion,default=60"` // 贴图在模型面板上的比例 SkuId int64 `form:"sku_id,default=0"` // 模板ID }