forked from jimmykuu/gopher
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pagination.go
111 lines (91 loc) · 2.28 KB
/
pagination.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
分页
*/
package gopher
import (
"errors"
"fmt"
"html/template"
"math"
"strings"
"gopkg.in/mgo.v2"
)
// 分页结构体
type Pagination struct {
query interface{}
count int
perPage int
url string
}
// 在页面显示分页信息, 内容为 上一页 当前页/下一页 下一页
func (p *Pagination) Html(number int) template.HTML {
pageCount := int(math.Ceil(float64(p.count) / float64(p.perPage)))
if pageCount <= 1 {
return template.HTML("")
}
linkFlag := "?"
if strings.Index(p.url, "?") > -1 {
linkFlag = "&"
}
html := `<ul class="pager">`
if number > 1 {
html += fmt.Sprintf(`<li class="previous"><a href="%s%sp=%d">← 上一页</a></li>`, p.url, linkFlag, number-1)
}
html += fmt.Sprintf(`<li class="number">%d/%d</li>`, number, pageCount)
if number < pageCount {
html += fmt.Sprintf(`<li class="next"><a href="%s%sp=%d">下一页 →</a></li>`, p.url, linkFlag, number+1)
}
return template.HTML(html)
}
// 返回第几页的查询
func (p *Pagination) Page(number int) (interface{}, error) {
pageCount := int(math.Ceil(float64(p.count) / float64(p.perPage)))
switch p.query.(type) {
case *mgo.Query:
query := p.query.(*mgo.Query)
if count, _ := query.Count(); count == 0 {
return query, nil
}
if !(number > 0 && number <= pageCount) {
return nil, errors.New("页码不在范围内")
}
if number > 1 {
query = query.Skip(p.perPage * (number - 1))
}
return query.Limit(p.perPage), nil
case []CollectTopic:
cts := p.query.([]CollectTopic)
if count := len(cts); count == 0 {
return cts, nil
}
if !(number > 0 && number <= pageCount) {
return nil, errors.New("页码不在范围内")
}
var end int
if number*p.perPage > p.count {
end = p.count
} else {
end = number * p.perPage
}
return cts[p.perPage*(number-1) : end], nil
}
return nil, errors.New("Query type is not *mgo.Query or slice")
}
// 内容总数
func (p *Pagination) Count() int {
return p.count
}
// 创建一个分页结构体
func NewPagination(query interface{}, url string, perPage int) *Pagination {
p := Pagination{}
p.query = query
switch query.(type) {
case *mgo.Query:
p.count, _ = query.(*mgo.Query).Count()
case []CollectTopic:
p.count = len(query.([]CollectTopic))
}
p.perPage = perPage
p.url = url
return &p
}