tkcashgame_v4/pkg/pagination/pagination.go

99 lines
1.5 KiB
Go

package pagination
import (
"math"
)
type Paginator interface {
// Limit 数据条目数限制
Limit() int32
// Offset 数据偏移量
Offset() int32
}
const (
// DefaultPage 默认分页数
DefaultPage = 1
// DefaultPageSize 默认分页条目数
DefaultPageSize = 20
)
var _ Paginator = (*Pagination)(nil)
type options struct {
total int32
}
type Option func(*options)
type Pagination struct {
page int32
pageSize int32
total int32
}
func WithTotal(b int32) Option {
return func(c *options) {
c.total = b
}
}
func NewPagination(page, pageSize int32, opts ...Option) *Pagination {
opt := options{
total: 0,
}
for _, o := range opts {
o(&opt)
}
return &Pagination{page: page, pageSize: pageSize, total: opt.total}
}
func (p Pagination) Page() int32 {
if p.page < 1 {
return DefaultPage
}
return p.page
}
func (p Pagination) PageSize() int32 {
if p.pageSize < 1 {
return DefaultPageSize
}
return p.pageSize
}
func (p Pagination) From() int32 {
return (p.Page()-1)*p.PageSize() + 1
}
func (p Pagination) To() int32 {
var to int32
to = p.PageSize() * p.Page()
if to > p.total {
to = p.total
}
return to
}
func (p Pagination) LastPage() int32 {
lastPage := math.Ceil(float64(p.total) / float64(p.PageSize()))
if lastPage <= 0 {
lastPage = 0
}
return int32(lastPage)
}
// Limit 实现 pagination.Paginator 方法
func (p Pagination) Limit() int32 {
return p.PageSize()
}
func (p Pagination) Offset() int32 {
return p.Limit() * (p.Page() - 1)
}