成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go項目實戰-關于列表分頁的封裝和簡化

開發 前端
我們會實現商品模塊的主要功能接口,在其中會實際應用一下我們在搭建項目定制化的響應組件中的Pagination,來簡化分頁查詢相關的操作,在代碼實現上也比普通的方式更優雅一些。

我們實現了商品模塊中商品分類相關的功能,這節我們繼續商品模塊的開發來實現商品詳細相關的功能,這些功能在我們梳理出來的功能用例中,我標記了出來。

圖片圖片

從功能用例中我們能看到與商品相關的主要功能有:

  • 商品列表
  • 商品搜索
  • 商品詳情

我們會實現商品模塊的主要功能接口,在其中會實際應用一下我們在搭建項目定制化的響應組件中的Pagination,來簡化分頁查詢相關的操作,在代碼實現上也比普通的方式更優雅一些。

商品列表

接下來我們來實現商品列表功能的接口, 當然真正商用級別的購物App,商品列表應該是通過 Lucene或者是ElasticSearch來實現的查找的。我們這里沒有這個硬件條件,就先給大家講一下通過數據庫查詢實現功能的邏輯吧。

在購物網站上,我們點擊每個分類的時候,會展示分類下的商品列表。

這個時候有個內部邏輯,商品都是掛在到三級分類上的,也就是分類的葉子節點上。 那么此時我們開發功能時要能夠兼顧下面幾點:

  • 產品的交互邏輯上可能允許用戶點擊一級或者二級分類查看商品列表。
  • 因不同公司產品邏輯而定,沒有絕對,但是我們的功能實現時要支持上面的情況,假設用戶選擇了一級或者二級分類,我們的程序需要先查出下面的三級分類,再通過這些三級分類查找對應的商品。

以上是業務方面的邏輯,在做本功能的時候我還會演示怎么通過我們之前定義分頁組件Pagination,以一個相對優雅的寫法寫數據庫的分頁查詢。

在 api/controller/commodity.go 中添加商品列表的Controller方法。

// CommoditiesInCategory 分類商品列表
func CommoditiesInCategory(c *gin.Context) {
 categoryId, _ := strconv.ParseInt(c.Query("category_id"), 10, 64)
 pagination := app.NewPagination(c)

 svc := appservice.NewCommodityAppSvc(c)
 commodityList, err := svc.GetCategoryCommodityList(categoryId, pagination)
if err != nil {
if errors.Is(err, errcode.ErrParams) {
   app.NewResponse(c).Error(errcode.ErrParams)
  } else {
   app.NewResponse(c).Error(errcode.ErrServer.WithCause(err))
  }
return
 }

 app.NewResponse(c).SetPagination(pagination).Success(commodityList)
}

我們在Controller方法中除了從URL查詢字符串上獲取商品的分類ID外,還要獲取分頁相關的請求參數,用它們創建Pagination對象。Pagination 對象會隨著我們的調用一直往下傳遞,傳到DomainService中,在需要的時候通過其上的方法來獲取offset 和 limit 等信息。

DomainService 中查詢商品列表的邏輯如下:

// logic/domainservice/commodity.go
// GetCommodityListInCategory 獲取分類下的商品列表
func (cds *CommodityDomainSvc) GetCommodityListInCategory(categoryInfo *do.CommodityCategory, pagination *app.Pagination) ([]*do.Commodity, error) {
 offset := pagination.Offset()
 size := pagination.GetPageSize()

 thirdLevelCategoryIds, err := cds.commodityDao.GetThirdLevelCategories(categoryInfo)
if err != nil {
returnnil, errcode.Wrap("GetCommodityListInCategoryError", err)
 }
 commodityModelList, totalRows, err := cds.commodityDao.GetCommoditiesInCategory(thirdLevelCategoryIds, offset, size)
if err != nil {
returnnil, errcode.Wrap("GetCommodityListInCategoryError", err)
 }
 pagination.SetTotalRows(int(totalRows))

 commodityList := make([]*do.Commodity, 0, len(commodityModelList))
 err = util.CopyProperties(&commodityList, &commodityModelList)
if err != nil {
returnnil, errcode.ErrCoverData.WithCause(err)
 }

return commodityList, nil
}

commodityDao 的 GetThirdLevelCategories 方法就是我們上面說的產品邏輯,拿到一個分類信息后先去獲取一下所有的三級分類。

// GetThirdLevelCategories 查找分類下的所有三級分類ID
func (cd *CommodityDao) GetThirdLevelCategories(categoryInfo *do.CommodityCategory) (categoryIds []int64, err error) {
if categoryInfo.Level == 3 {
return []int64{categoryInfo.ID}, nil
 } elseif categoryInfo.Level == 2 {
  categoryIds, err = cd.getSubCategoryIdList([]int64{categoryInfo.ID})
return
 } elseif categoryInfo.Level == 1 {
var secondCategoryId []int64
  secondCategoryId, err = cd.getSubCategoryIdList([]int64{categoryInfo.ID})
if err != nil {
   return
  }
  categoryIds, err = cd.getSubCategoryIdList(secondCategoryId)
return
 }
return
}

如果分類本身就是三級分類則直接返回,否則還是按照上面說的邏輯把分類下的所有三級分類先找出來。

分頁查詢簡化

查詢商品信息時因為需要分頁,所以我們在CommodityDomainSvc 里先用Pagination獲取分頁數據需要的offset 和 limit 參數。

func (cds *CommodityDomainSvc) GetCommodityListInCategory(categoryInfo *do.CommodityCategory, pagination *app.Pagination) ([]*do.Commodity, error) {
 offset := pagination.Offset()
 size := pagination.GetPageSize()
    .....
    commodityModelList, totalRows, err := cds.commodityDao.GetCommoditiesInCategory(thirdLevelCategoryIds, offset, size)
     if err != nil {
      return nil, errcode.Wrap("GetCommodityListInCategoryError", err)
     }
    pagination.SetTotalRows(int(totalRows))

    ......
}

商品數據查詢的Dao方法除了返回商品列表數據,還會返回滿足條件的總行數,這樣我們把總行數再設置到Pagination對象上,因為Pagination是指針類型,它創建子Controller方法,所以我們在Controller中返回響應時直接使用 app.NewResponse(c).SetPagination(pagination) 就能把分頁查詢需要的信息都寫入到響應中。

通過這種方式我們能避免需要分頁查詢數據的接口對應的AppService、DomainService、Dao方法都帶上page、pageSize等參數,只需要在調用Dao方法查詢數據前從Pagination對象對應的方法中取出這兩個值即可。同理所有方法的返回值中也不用都帶著totalRow 這個返回值。

責任編輯:武曉燕 來源: 網管叨bi叨
相關推薦

2025-04-27 02:22:00

分頁項目開發

2025-02-10 09:03:29

2024-12-17 09:14:48

項目http 庫API

2025-02-26 09:03:24

2025-01-02 09:02:09

Go項目Token

2022-06-09 10:42:47

GoJSON

2025-03-04 00:00:05

Go項目分類樹

2024-11-04 09:02:51

Go項目接口

2024-11-13 09:13:45

2025-04-28 01:55:00

工具sqlmockSQL

2022-09-07 09:44:19

loading分頁

2025-01-08 09:07:06

2024-12-30 09:12:17

2025-03-10 09:07:20

2009-06-04 10:58:15

strutshibernate分頁

2024-06-24 08:10:34

Java8表達式IDE

2024-06-20 11:49:52

2020-03-02 00:32:08

Python列表for循環

2024-12-05 09:13:55

Go項目模塊

2018-11-30 12:11:11

Oracle存儲配置
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 特级黄一级播放 | 成人在线观看免费视频 | 视频一区 亚洲 | 欧美在线观看一区二区 | 国产精品久久国产愉拍 | 午夜视频在线播放 | 黄在线免费观看 | 亚洲一区二区精品视频 | 国产精品美女www爽爽爽 | 免费在线观看av网址 | 午夜爱爱毛片xxxx视频免费看 | 色婷婷av一区二区三区软件 | www.成人.com| 日韩手机视频 | 北条麻妃一区二区三区在线观看 | 国产不卡在线 | 久久精品亚洲成在人线av网址 | 国产精品美女久久久久久久久久久 | 天天碰日日操 | 国产精品久久一区 | 国产精品夜夜春夜夜爽久久电影 | 超碰成人av | 男女精品久久 | 日韩精品中文字幕一区二区三区 | 久久精品视频播放 | 国产免费播放视频 | 三级黄色片在线 | 亚洲精品99 | 国产小网站 | 国产精品久久久久久 | 干干干日日日 | 日韩av成人 | 成人av免费| 在线播放国产视频 | www.亚洲一区二区 | 国偷自产av一区二区三区 | 亚洲成人精品视频 | 日韩中文字幕在线视频观看 | 老司机午夜性大片 | 中文字幕一区二区三区不卡 | 精品久久国产老人久久综合 |