Go專案實戰之開發完善分頁外掛(易擴充套件方式)-------【goshop開源專案】【第12次更新】

語言: CN / TW / HK

goshop開源專案的更新

備註:前面專案中用到的程式碼已經分享到GitHub中去了,並且以後所有專案中會出現的程式碼都會提交上去,歡迎查閱。

地址 goshop 感興趣的可以點個star哦~  goshop開源專案的更新

今天在考慮怎麼實現資料分頁和檢索功能:

  1. 通過傳入頁數(page),分頁條數(pageSize) ,實現資料的limit 分頁功能
  2. 動態支援檢索條件和排序的功能

接下來咱們就來實現以上功能

  1. 首先需要先封裝一個 Paginate 的擴充套件用於對gorm操作時引用Offset和Limit的sql拼合。實現程式碼過程如下:
package Paginate

import (
	"github.com/jinzhu/gorm"
	"strconv"
)

// 這裡需要注意的是:page和pageSize 的資料型別需要指定
// 這裡根據我之前封裝的:獲取全部請求引數的一個map指定的返回型別後,決定使用string型別進行定義
func Paginate(page, pageSize string) func(db *gorm.DB) *gorm.DB {
	return func(db *gorm.DB) *gorm.DB {
		pageUp, _ := strconv.Atoi(page)
		if pageUp == 0 {
			pageUp = 1
		}
		pageSizeInt, _ := strconv.Atoi(pageSize)
		switch {
		case pageSizeInt <= 0:
			pageSizeInt = 10
		}
		offset := (pageUp - 1) * pageSizeInt
		return db.Offset(offset).Limit(pageSizeInt)
	}
}
  1. 封裝好後,接下來就是使用了,在程式碼中,分頁類我使用在:model檔案中。相應程式碼如下:
// 根據檢索條件,獲取記錄行,並獲取總記錄條數
func (Goods) FindAll(DB *gorm.DB, params map[string]interface{}) ([]Goods, int64) {
	var GoodResult []Goods
	page := params["page"].(string)         // 對返回的interface型別進行轉換成字串
	pageSize := params["pageSize"].(string) // 對返回的interface型別進行轉換成字串
	// 這裡使用了過濾,在下面使用Where條件時過濾掉page,pageSize
	ParamsFilter := utils.ParamsFilter(params, "page,pageSize")
	// 通過 Scopes 引用載入 分頁類中返回的 DB指標
	DB.Scopes(Paginate.Paginate(page, pageSize)).Where(ParamsFilter).Order("created_at desc").Find(&GoodResult)
	// 這裡時查詢全部資料,用於返回總記錄條數
	GoodCount := DB.Find(&Goods{})
	return GoodResult, GoodCount.RowsAffected
}

// 這是過濾的封裝,一起貼出來了
func ParamsFilter(params map[string]interface{}, isFilterStr string) map[string]interface{} {
	var data = make(map[string]interface{})
	for key, value := range params {
		if find := strings.Contains(isFilterStr, key); !find {
			data[key] = value
		}
	}
	return data
}
  1. 接下來就是在控制器(controller)中使用封裝好的FindAll 獲取資料了。 程式碼如下:
// 獲取商品列表資訊
func GetGoodsList(ctx *gin.Context) {
	// 獲取DB控制代碼
	DB := config.InitDB()
	// 使用獲取全部請求引數方法進行:獲取引數
	params, _ := utils.DataMapByRequest(ctx)
	// 查詢資料
	var goods model.Goods
	// 使用封裝好的FindAll
	GoodResult, count := goods.FindAll(DB, params)
	// struct 轉 map  (反射 reflect包)
	//data := make(map[string]interface{})
	//elem := reflect.ValueOf(&goods).Elem()
	//var relType reflect.Type
	//for i := 0; i < relType.NumField(); i++ {
	//	data[relType.Field(i).Name] = elem.Field(i).Interface()
	//}
	// 返回值
	utils.Success(ctx, "獲取成功", gin.H{
		"count": count,
		"data":  GoodResult,
	})
}
  1. 最後一步就是:配置路由。 話不多說,直接上程式碼:
func Routers(r *gin.Engine) {
	app := r.Group("/app")
	{
		// v1
		v1 := app.Group("/v1")
		{
			// ........ 更多
			// 管理平臺
			adminGroup := v1.Group("/admin", middleware.CheckToken())
			{
				// ........ 更多
				// 商品
				goodsGroup := adminGroup.Group("/goods")
				{
					goodsGroup.POST("/get-list", controller.GetGoodsList)
					// ........ 更多
				}
				// ........ 更多
			}

		}
	}
}

走到這裡就完成了一個分頁的檢索查詢。

更多功能請持續關注!!!!!

歡迎各位加我的微信(jobhandsome)跟我一起完成並推動專案的發展!