99 lines
1.5 KiB
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)
|
|
}
|