From b93691a0bfdc81f88214952883d1b9dd4dfbea17 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Sun, 8 Oct 2023 12:04:00 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=94=B6=E8=97=8F?= =?UTF-8?q?=E9=A1=B5=E7=9A=84=E6=B7=BB=E5=8A=A0=E5=92=8C=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model/gmodel/fs_product_collection_logic.go | 37 +++++++++++- .../handler/deletecollectproducthandler.go | 35 ++++++++++++ .../handler/getcollectproductlisthandler.go | 35 ++++++++++++ server/collection/internal/handler/routes.go | 10 ++++ .../internal/logic/collectproductlogic.go | 57 +++++++++++++++++-- .../logic/deletecollectproductlogic.go | 50 ++++++++++++++++ .../logic/getcollectproductlistlogic.go | 43 ++++++++++++++ server/collection/internal/types/types.go | 19 +++++++ server_api/collection.api | 24 ++++++++ 9 files changed, 305 insertions(+), 5 deletions(-) create mode 100644 server/collection/internal/handler/deletecollectproducthandler.go create mode 100644 server/collection/internal/handler/getcollectproductlisthandler.go create mode 100644 server/collection/internal/logic/deletecollectproductlogic.go create mode 100644 server/collection/internal/logic/getcollectproductlistlogic.go diff --git a/model/gmodel/fs_product_collection_logic.go b/model/gmodel/fs_product_collection_logic.go index e68225aa..1db33376 100644 --- a/model/gmodel/fs_product_collection_logic.go +++ b/model/gmodel/fs_product_collection_logic.go @@ -1,2 +1,37 @@ package gmodel -// TODO: 使用model的属性做你想做的 \ No newline at end of file + +import "context" + +// 查询 +func (c *FsProductCollectionModel) FindOne(ctx context.Context, userId, guestId, productId int64) (resp *FsProductCollection, err error) { + err = c.db.WithContext(ctx).Model(&FsProductCollection{}). + Where("user_id = ? and guest_id = ? and product_id = ?", userId, guestId, productId). + Take(&resp).Error + return resp, err +} + +// 创建 +func (c *FsProductCollectionModel) Create(ctx context.Context, data *FsProductCollection) error { + return c.db.WithContext(ctx).Model(&FsProductCollection{}).Create(&data).Error +} + +// 更新 +func (c *FsProductCollectionModel) Update(ctx context.Context, userId, guestId, productId int64, data *FsProductCollection) error { + return c.db.WithContext(ctx).Model(&FsProductCollection{}). + Where("user_id = ? and guest_id = ? and product_id = ?", userId, guestId, productId). + Updates(&data).Error +} + +// 删除 +func (c *FsProductCollectionModel) Delete(ctx context.Context, userId, guestId, productId int64) error { + return c.db.WithContext(ctx).Model(&FsProductCollection{}). + Where("user_id = ? and guest_id = ? and product_id = ?", userId, guestId, productId). + Delete(&FsProductCollection{}).Error +} + +// 删除 +func (c *FsProductCollectionModel) Delete2(ctx context.Context, userId, guestId, id int64) error { + return c.db.WithContext(ctx).Model(&FsProductCollection{}). + Where("user_id = ? and guest_id = ? and id = ?", userId, guestId, id). + Delete(&FsProductCollection{}).Error +} diff --git a/server/collection/internal/handler/deletecollectproducthandler.go b/server/collection/internal/handler/deletecollectproducthandler.go new file mode 100644 index 00000000..ade28468 --- /dev/null +++ b/server/collection/internal/handler/deletecollectproducthandler.go @@ -0,0 +1,35 @@ +package handler + +import ( + "net/http" + "reflect" + + "fusenapi/utils/basic" + + "fusenapi/server/collection/internal/logic" + "fusenapi/server/collection/internal/svc" + "fusenapi/server/collection/internal/types" +) + +func DeleteCollectProductHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + var req types.DeleteCollectProductReq + userinfo, err := basic.RequestParse(w, r, svcCtx, &req) + if err != nil { + return + } + + // 创建一个业务逻辑层实例 + l := logic.NewDeleteCollectProductLogic(r.Context(), svcCtx) + + rl := reflect.ValueOf(l) + basic.BeforeLogic(w, r, rl) + + resp := l.DeleteCollectProduct(&req, userinfo) + + if !basic.AfterLogic(w, r, rl, resp) { + basic.NormalAfterLogic(w, r, resp) + } + } +} diff --git a/server/collection/internal/handler/getcollectproductlisthandler.go b/server/collection/internal/handler/getcollectproductlisthandler.go new file mode 100644 index 00000000..a3998d7d --- /dev/null +++ b/server/collection/internal/handler/getcollectproductlisthandler.go @@ -0,0 +1,35 @@ +package handler + +import ( + "net/http" + "reflect" + + "fusenapi/utils/basic" + + "fusenapi/server/collection/internal/logic" + "fusenapi/server/collection/internal/svc" + "fusenapi/server/collection/internal/types" +) + +func GetCollectProductListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + var req types.GetCollectProductListReq + userinfo, err := basic.RequestParse(w, r, svcCtx, &req) + if err != nil { + return + } + + // 创建一个业务逻辑层实例 + l := logic.NewGetCollectProductListLogic(r.Context(), svcCtx) + + rl := reflect.ValueOf(l) + basic.BeforeLogic(w, r, rl) + + resp := l.GetCollectProductList(&req, userinfo) + + if !basic.AfterLogic(w, r, rl, resp) { + basic.NormalAfterLogic(w, r, resp) + } + } +} diff --git a/server/collection/internal/handler/routes.go b/server/collection/internal/handler/routes.go index e2b230b6..1d8b59a5 100644 --- a/server/collection/internal/handler/routes.go +++ b/server/collection/internal/handler/routes.go @@ -17,6 +17,16 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { Path: "/api/collection/collect_product", Handler: CollectProductHandler(serverCtx), }, + { + Method: http.MethodPost, + Path: "/api/collection/delete_collect_product", + Handler: DeleteCollectProductHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/api/collection/get_collect_product_list", + Handler: GetCollectProductListHandler(serverCtx), + }, }, ) } diff --git a/server/collection/internal/logic/collectproductlogic.go b/server/collection/internal/logic/collectproductlogic.go index b421949c..c006d877 100644 --- a/server/collection/internal/logic/collectproductlogic.go +++ b/server/collection/internal/logic/collectproductlogic.go @@ -1,8 +1,12 @@ package logic import ( + "errors" + "fusenapi/model/gmodel" "fusenapi/utils/auth" "fusenapi/utils/basic" + "gorm.io/gorm" + "time" "context" @@ -31,10 +35,55 @@ func NewCollectProductLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Co // } func (l *CollectProductLogic) CollectProduct(req *types.CollectProductReq, userinfo *auth.UserInfo) (resp *basic.Response) { - // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) - // userinfo 传入值时, 一定不为null - - return resp.SetStatus(basic.CodeOK) + if !userinfo.IsUser() && !userinfo.IsGuest() { + return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in before to collect product") + } + //查询产品 + productInfo, err := l.svcCtx.AllModels.FsProduct.FindOne(l.ctx, req.ProductId, "id,is_shelf") + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return resp.SetStatusWithMessage(basic.CodeDbRecordNotFoundErr, "the product is not found") + } + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "faile to get product info") + } + //校验下状态 + if *productInfo.Status != 1 { + return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "the product status is unNormal") + } + //下架了 + if *productInfo.IsShelf == 0 { + return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "the product is off shelf") + } + if *productInfo.IsDel == 1 { + return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "the product is deleted") + } + //查询收藏 + _, err = l.svcCtx.AllModels.FsProductCollection.FindOne(l.ctx, userinfo.UserId, userinfo.GuestId, req.ProductId) + if err != nil { + if !errors.Is(err, gorm.ErrRecordNotFound) { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to check repeat of collection") + } + //创建 + now := time.Now().UTC() + err = l.svcCtx.AllModels.FsProductCollection.Create(l.ctx, &gmodel.FsProductCollection{ + UserId: &userinfo.UserId, + GuestId: &userinfo.GuestId, + ProductId: &req.ProductId, + TemplateTag: &req.TemplateTag, + SelectColorIndex: &req.SelectColorIndex, + Logo: &req.Logo, + Ctime: &now, + Utime: &now, + }) + if err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to collect product") + } + return resp.SetStatus(basic.CodeOK) + } + return resp.SetStatusAddMessage(basic.CodeOK, "you have collect this product and don`t need to repeat again") } // 处理逻辑后 w,r 如:重定向, resp 必须重新处理 diff --git a/server/collection/internal/logic/deletecollectproductlogic.go b/server/collection/internal/logic/deletecollectproductlogic.go new file mode 100644 index 00000000..cdf1900e --- /dev/null +++ b/server/collection/internal/logic/deletecollectproductlogic.go @@ -0,0 +1,50 @@ +package logic + +import ( + "fusenapi/utils/auth" + "fusenapi/utils/basic" + + "context" + + "fusenapi/server/collection/internal/svc" + "fusenapi/server/collection/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type DeleteCollectProductLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewDeleteCollectProductLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteCollectProductLogic { + return &DeleteCollectProductLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +// 处理进入前逻辑w,r +// func (l *DeleteCollectProductLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) { +// } + +func (l *DeleteCollectProductLogic) DeleteCollectProduct(req *types.DeleteCollectProductReq, userinfo *auth.UserInfo) (resp *basic.Response) { + if !userinfo.IsUser() && !userinfo.IsGuest() { + return resp.SetStatusWithMessage(basic.CodeUnAuth, "please sign in before to collect product") + } + for _, id := range req.Ids { + err := l.svcCtx.AllModels.FsProductCollection.Delete2(l.ctx, userinfo.UserId, userinfo.GuestId, id) + if err != nil { + logx.Error(err) + return resp.SetStatusWithMessage(basic.CodeDbSqlErr, "failed to remove product collection") + } + } + return resp.SetStatus(basic.CodeOK) +} + +// 处理逻辑后 w,r 如:重定向, resp 必须重新处理 +// func (l *DeleteCollectProductLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { +// // httpx.OkJsonCtx(r.Context(), w, resp) +// } diff --git a/server/collection/internal/logic/getcollectproductlistlogic.go b/server/collection/internal/logic/getcollectproductlistlogic.go new file mode 100644 index 00000000..ca91aef1 --- /dev/null +++ b/server/collection/internal/logic/getcollectproductlistlogic.go @@ -0,0 +1,43 @@ +package logic + +import ( + "fusenapi/utils/auth" + "fusenapi/utils/basic" + + "context" + + "fusenapi/server/collection/internal/svc" + "fusenapi/server/collection/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetCollectProductListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetCollectProductListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetCollectProductListLogic { + return &GetCollectProductListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +// 处理进入前逻辑w,r +// func (l *GetCollectProductListLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) { +// } + +func (l *GetCollectProductListLogic) GetCollectProductList(req *types.GetCollectProductListReq, userinfo *auth.UserInfo) (resp *basic.Response) { + // 返回值必须调用Set重新返回, resp可以空指针调用 resp.SetStatus(basic.CodeOK, data) + // userinfo 传入值时, 一定不为null + + return resp.SetStatus(basic.CodeOK) +} + +// 处理逻辑后 w,r 如:重定向, resp 必须重新处理 +// func (l *GetCollectProductListLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { +// // httpx.OkJsonCtx(r.Context(), w, resp) +// } diff --git a/server/collection/internal/types/types.go b/server/collection/internal/types/types.go index bf094d09..d67837ac 100644 --- a/server/collection/internal/types/types.go +++ b/server/collection/internal/types/types.go @@ -12,6 +12,25 @@ type CollectProductReq struct { TemplateTag string `json:"template_tag"` } +type DeleteCollectProductReq struct { + Ids []int64 `json:"ids"` +} + +type GetCollectProductListReq struct { + CurrentPage int `form:"current_page"` +} + +type GetCollectProductListRspItem struct { + Id int64 `json:"id"` + ProductId int64 `json:"product_id"` + ProductName string `json:"product_name"` + Logo string `json:"logo"` + SelectColorIndex int64 `json:"select_color_index"` + TemplateTag string `json:"template_tag"` + SizeCount int64 `json:"size_count"` + MinPrice string `json:"min_price"` +} + type Request struct { } diff --git a/server_api/collection.api b/server_api/collection.api index 9fc2de66..0e24e0f2 100644 --- a/server_api/collection.api +++ b/server_api/collection.api @@ -12,6 +12,12 @@ service collection { //收藏产品 @handler CollectProductHandler post /api/collection/collect_product(CollectProductReq) returns (response); + //删除收藏 + @handler DeleteCollectProductHandler + post /api/collection/delete_collect_product(DeleteCollectProductReq) returns (response); + //获取收藏列表 + @handler GetCollectProductListHandler + get /api/collection/get_collect_product_list(GetCollectProductListReq) returns (response); } //收藏产品 @@ -20,4 +26,22 @@ type CollectProductReq { Logo string `json:"logo"` SelectColorIndex int64 `json:"select_color_index"` TemplateTag string `json:"template_tag"` +} +//删除收藏 +type DeleteCollectProductReq { + Ids []int64 `json:"ids"` +} +//获取收藏列表 +type GetCollectProductListReq { + CurrentPage int `form:"current_page"` +} +type GetCollectProductListRspItem { + Id int64 `json:"id"` + ProductId int64 `json:"product_id"` + ProductName string `json:"product_name"` + Logo string `json:"logo"` + SelectColorIndex int64 `json:"select_color_index"` + TemplateTag string `json:"template_tag"` + SizeCount int64 `json:"size_count"` + MinPrice string `json:"min_price"` } \ No newline at end of file From 243fd29a608ddafb98f39c5b149228ca5c0f3e97 Mon Sep 17 00:00:00 2001 From: laodaming <11058467+laudamine@user.noreply.gitee.com> Date: Sun, 8 Oct 2023 12:06:48 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=94=B6=E8=97=8F?= =?UTF-8?q?=E9=A1=B5=E7=9A=84=E6=B7=BB=E5=8A=A0=E5=92=8C=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/websocket/internal/logic/ws_render_image.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/websocket/internal/logic/ws_render_image.go b/server/websocket/internal/logic/ws_render_image.go index a9a7b005..d8100706 100644 --- a/server/websocket/internal/logic/ws_render_image.go +++ b/server/websocket/internal/logic/ws_render_image.go @@ -24,7 +24,7 @@ var ( //每个websocket渲染任务缓冲队列长度默认值 renderChanLen = 500 //每个websocket渲染并发数 - renderChanConcurrency = 10 + renderChanConcurrency = 100 ) // 渲染处理器