paginate

package module
v0.1.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 21, 2023 License: Apache-2.0 Imports: 2 Imported by: 0

README

A simple way to implement pagination in Golang.

Go Report Card Go.Dev reference Sourcegraph Release Goproxy.cn

Install

$ go get github.com/pkg6/go-paginate

Usage

package main

import (
	"encoding/json"
	"encoding/xml"
	"fmt"
	"github.com/pkg6/go-paginate"
	"github.com/pkg6/go-paginate/gormp"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

type Post struct {
	ID     uint `gormp:"primarykey" json:"id"`
	Number int  `json:"number"`
}
type PostIndex struct {
	ID     uint `gormp:"primarykey" json:"id"`
	Number int  `json:"number"`
	Index  int  `json:"index"`
}

var db, _ = gorm.Open(sqlite.Open("gormp.db?cache=shared"), &gorm.Config{
	Logger: logger.Default.LogMode(logger.Info),
})

func init() {
	_ = db.AutoMigrate(&Post{})
	for i := 1; i <= 100; i++ {
		p := Post{
			Number: i,
		}
		db.Save(&p)
	}
}
func simple() {
	q := db.Model(Post{})
	var dest []Post
	var adapt = gormp.Adapter(q)
	myPage := paginate.SimplePaginate(adapt, 10, 1)
	_ = myPage.Get(&dest)
	//获取最后页码
	page, err := myPage.GetLastPage()
	fmt.Println(fmt.Sprintf("获取最后页码:%v", page))
	fmt.Println(fmt.Sprintf("获取最后页码错误信息:%v", err))
	//获取总数
	total, err := myPage.GetTotal()
	fmt.Println(fmt.Sprintf("获取总数:%v", total))
	fmt.Println(fmt.Sprintf("获取总数错误信息:%v", err))
	fmt.Println(fmt.Sprintf("当前页码:%v", myPage.GetCurrentPage()))
	fmt.Println(fmt.Sprintf("每页显示多少条数:%v", myPage.GetListRows()))
	fmt.Println(fmt.Sprintf("是否还可以进行分页:%v", myPage.HasPages()))
	fmt.Println(dest)
}

func Total() {
	q := db.Model(Post{}).Where([]int64{20, 21, 22}).Order("id desc")
	var dest []Post
	var adapt = gormp.Adapter(q)
	t, _ := adapt.Length()
	myPage := paginate.TotalPaginate(adapt, 10, 1, t)
	_ = myPage.Get(&dest)
	var destIndex []PostIndex
	for i, post := range dest {
		destIndex = append(destIndex, PostIndex{ID: post.ID, Number: post.Number, Index: i})
	}
	// 先执行当get方法此时为nil data数据为dest
	// 不执行get方法 此时传入dest,data就是dest
	// 执行get方法 此时在传入新的结构体 data 就是data
	// 不执行get 此时传入nil 就返回nil
	r := myPage.Render(nil)
	jsonBytes, _ := json.Marshal(r)
	xmlBytes, err := xml.Marshal(r)
	fmt.Println(string(jsonBytes))
	fmt.Println(string(xmlBytes))
	//获取最后页码
	page, err := myPage.GetLastPage()
	fmt.Println(fmt.Sprintf("获取最后页码:%v", page))
	fmt.Println(fmt.Sprintf("获取最后页码错误信息:%v", err))
	//获取总数
	total, err := myPage.GetTotal()
	fmt.Println(fmt.Sprintf("获取总数:%v", total))
	fmt.Println(fmt.Sprintf("获取总数错误信息:%v", err))
	fmt.Println(fmt.Sprintf("当前页码:%v", myPage.GetCurrentPage()))
	fmt.Println(fmt.Sprintf("每页显示多少条数:%v", myPage.GetListRows()))
	fmt.Println(fmt.Sprintf("是否还可以进行分页:%v", myPage.HasPages()))
	fmt.Println(dest)
}

func main() {
	Total()
	simple()
}

Get & Render method

Get Render data
Execute mandatory&data data nil &data
Execute mandatory&data data Transfer data Transfer data
Do not execute nil null
Do not execute Transfer data Get method executed

Adapters

An adapter must implement the Adapter interface which has 2 methods:

Length() (int64, error)
Slice(offset, length int64, dest any) error

GORM Adapter

var db, _ = gorm.Open(sqlite.Open("gorm.db?cache=shared"), &gorm.Config{
	Logger: logger.Default.LogMode(logger.Info),
})
q := db.Model(Post{}).Where([]int64{20, 21, 22}).Order("id desc")
var dest []Post
var adapt = gromp.Adapter(q)
t, _ := adapt.Length()
myPage := paginate.TotalPaginate(adapt, 10, 1, t)

XORM Adapter

var engine, _ = xorm.NewEngine("sqlite3", "xorm.db")
session := engine.Table(Post{})
var dest []Post
var adapt = xormp.Adapter(session)
total, _ := adapt.Length()
myPage := paginate.TotalPaginate(adapt, 10, 1, total)

Slice adapter

var source = []int{
	1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
	11, 22, 33, 44, 55, 66, 77, 88, 99, 199,
	111, 222, 333, 444, 555, 666, 777, 888, 999, 199,
	1111, 2222,
}
var adapt = slicep.Adapter(source)
myPage := paginate.SimplePaginate(adapt, 10, 5)

Join us

If you approve of our open source project and are interested in contributing to the development of go-paginator, we sincerely welcome you to join us in developing and improving it. Whether it's reporting errors or developing a Pull Request, even modifying a typo can be a great help.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	DefaultRequestMaxSize int64 = 50
	DefaultRequestSize    int64 = 20
)
View Source
var DefaultRender = new(Render)

Functions

This section is empty.

Types

type IAdapter

type IAdapter interface {
	// Length 数据长度
	Length() (int64, error)
	// Slice 切割数据(分页)
	Slice(offset, length int64, data any) error
}

type IPaginate

type IPaginate interface {
	Clone() IPaginate
	// SetRender 设置渲染
	SetRender(render IRender) IPaginate
	// SetData 该data是查询数据库的数据源
	SetData(data any) IPaginate
	// SetCurrentPage 设置当前页数
	SetCurrentPage(currentPage int64)
	// GetCurrentPage 获取当前页页码
	GetCurrentPage() int64
	// GetTotal 获取数据总条数
	GetTotal() (int64, error)
	// GetListRows 获取每页数量
	GetListRows() int64
	//GetLastPage 获取最后一页页码
	GetLastPage() (int64, error)
	//HasPages 数据是否足够分页
	HasPages() bool
	// Get 获取数据
	Get(data any) error
	// Render 获取Paginate结构体数据
	Render(data any) any
}

func Make

func Make(adapter IAdapter, listRows int64, currentPage int64, total int64, simple bool) IPaginate

func SimplePaginate

func SimplePaginate(adapter IAdapter, listRows, currentPage int64) IPaginate

func SimpleRequest added in v0.1.1

func SimpleRequest(adapt IAdapter, request IRequest) IPaginate

func TotalPaginate

func TotalPaginate(adapter IAdapter, listRows, currentPage, total int64) IPaginate

func TotalRequest added in v0.0.3

func TotalRequest(adapt IAdapter, request IRequest) IPaginate

type IRender

type IRender interface {
	// SetTotal 总数
	SetTotal(total int64)
	// SetSimple 是否为简单模式分页
	SetSimple(simple bool)
	// SetPerPage 每页的数量
	SetPerPage(perPage int64)
	// SetCurrentPage 当前页
	SetCurrentPage(currentPage int64)
	// SetLastPage 最后一页
	SetLastPage(lastPage int64)
	// SetData 数据集
	SetData(data any)
	// SetHasMore 是否可以进行下一页
	SetHasMore(hasMore bool)

	Render() any
}

type IRequest added in v0.0.2

type IRequest interface {
	// GetPage 获取当前页数
	GetPage() int64
	// GetSize 获取拉去多少条数据
	GetSize() int64
	// MaxSize 安全大小,为了防止拉所有数据导致拖垮数据
	MaxSize() int64
}

type Paginate

type Paginate struct {

	//设置输出源
	Data any
	// contains filtered or unexported fields
}

func (*Paginate) Clone

func (p *Paginate) Clone() IPaginate

func (*Paginate) Get

func (p *Paginate) Get(data any) error

Get 获取指定长度的数据

func (*Paginate) GetCurrentPage

func (p *Paginate) GetCurrentPage() int64

GetCurrentPage 获取当前页页码

func (*Paginate) GetLastPage

func (p *Paginate) GetLastPage() (int64, error)

GetLastPage 获取最后一页页码

func (*Paginate) GetListRows

func (p *Paginate) GetListRows() int64

GetListRows 获取每页数量

func (*Paginate) GetTotal

func (p *Paginate) GetTotal() (int64, error)

GetTotal 获取数据总条数

func (*Paginate) HasPages

func (p *Paginate) HasPages() bool

HasPages 数据是否足够分页

func (*Paginate) Render

func (p *Paginate) Render(data any) any

Render 渲染数据

func (*Paginate) SetCurrentPage

func (p *Paginate) SetCurrentPage(currentPage int64)

SetCurrentPage 设置当前页数

func (*Paginate) SetData

func (p *Paginate) SetData(data any) IPaginate

SetData 设置data

func (*Paginate) SetRender

func (p *Paginate) SetRender(render IRender) IPaginate

type Render

type Render struct {
	//总数
	Total int64 `json:"total" xml:"total"`
	//数据集
	Data any `json:"data" xml:"data"`
	//是否为简单模式分页
	Simple bool `json:"simple" xml:"simple"`
	//每页的数量
	PerPage int64 `json:"per_page" xml:"perPage"`
	//当前页
	CurrentPage int64 `json:"current_page" xml:"currentPage"`
	//最后一页
	LastPage int64 `json:"last_page" xml:"lastPage"`
	//是否有下一页
	HasMore bool `json:"has_more" xml:"hasMore"`
}

func (*Render) Render added in v0.1.1

func (r *Render) Render() any

func (*Render) SetCurrentPage

func (r *Render) SetCurrentPage(currentPage int64)

func (*Render) SetData

func (r *Render) SetData(data any)

func (*Render) SetHasMore

func (r *Render) SetHasMore(hasMore bool)

func (*Render) SetLastPage

func (r *Render) SetLastPage(lastPage int64)

func (*Render) SetPerPage

func (r *Render) SetPerPage(perPage int64)

func (*Render) SetSimple

func (r *Render) SetSimple(simple bool)

func (*Render) SetTotal

func (r *Render) SetTotal(total int64)

type Request added in v0.0.2

type Request struct {
	Page int64 `json:"page" form:"page" param:"page" uri:"page" query:"page" xml:"Page"`
	Size int64 `json:"size" form:"size" param:"size" uri:"size" query:"size" xml:"Size"`
}

func (*Request) GetPage added in v0.0.2

func (r *Request) GetPage() int64

func (*Request) GetSize added in v0.0.2

func (r *Request) GetSize() int64

func (*Request) MaxSize added in v0.0.2

func (r *Request) MaxSize() int64

Directories

Path Synopsis
_example

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL