pagination.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package pagination
  2. import (
  3. "fmt"
  4. "math"
  5. "net/http"
  6. "net/url"
  7. "strconv"
  8. "strings"
  9. "html/template"
  10. )
  11. //Pagination 分页器
  12. type Pagination struct {
  13. Request *http.Request
  14. Total int
  15. Pernum int
  16. BaseUrl string
  17. }
  18. //NewPagination 新建分页器
  19. func NewPagination(req *http.Request, total int, pernum int,baseUrl string) *Pagination {
  20. return &Pagination{
  21. Request: req,
  22. Total: total,
  23. Pernum: pernum,
  24. BaseUrl: baseUrl,
  25. }
  26. }
  27. func (p *Pagination) HtmlPages() template.HTML {
  28. return template.HTML(p.Pages())
  29. }
  30. //Pages 渲染生成html分页标签
  31. func (p *Pagination) Pages() string {
  32. queryParams := p.Request.URL.Query()
  33. //从当前请求中获取page
  34. page := queryParams.Get("page")
  35. if page == "" {
  36. page = "1"
  37. }
  38. //将页码转换成整型,以便计算
  39. pagenum, _ := strconv.Atoi(page)
  40. if pagenum == 0 {
  41. return ""
  42. }
  43. //计算总页数
  44. var totalPageNum = int(math.Ceil(float64(p.Total) / float64(p.Pernum)))
  45. //首页链接
  46. var firstLink string
  47. //上一页链接
  48. var prevLink string
  49. //下一页链接
  50. var nextLink string
  51. //末页链接
  52. var lastLink string
  53. //中间页码链接
  54. var pageLinks []string
  55. //首页和上一页链接
  56. if pagenum > 1 {
  57. firstLink = fmt.Sprintf(`<li><a href="%s">首页</a></li>`, p.pageURL("1"))
  58. prevLink = fmt.Sprintf(`<li><a href="%s">上一页</a></li>`, p.pageURL(strconv.Itoa(pagenum-1)))
  59. } else {
  60. firstLink = `<li class="disabled"><a href="#">首页</a></li>`
  61. prevLink = `<li class="disabled"><a href="#">上一页</a></li>`
  62. }
  63. //末页和下一页
  64. if pagenum < totalPageNum {
  65. lastLink = fmt.Sprintf(`<li><a href="%s">末页</a></li>`, p.pageURL(strconv.Itoa(totalPageNum)))
  66. nextLink = fmt.Sprintf(`<li><a href="%s">下一页</a></li>`, p.pageURL(strconv.Itoa(pagenum+1)))
  67. } else {
  68. lastLink = `<li class="disabled"><a href="#">末页</a></li>`
  69. nextLink = `<li class="disabled"><a href="#">下一页</a></li>`
  70. }
  71. //生成中间页码链接
  72. pageLinks = make([]string, 0, 10)
  73. startPos := pagenum - 3
  74. endPos := pagenum + 3
  75. if startPos < 1 {
  76. endPos = endPos + int(math.Abs(float64(startPos))) + 1
  77. startPos = 1
  78. }
  79. if endPos > totalPageNum {
  80. endPos = totalPageNum
  81. }
  82. for i := startPos; i <= endPos; i++ {
  83. var s string
  84. if i == pagenum {
  85. s = fmt.Sprintf(`<li class="active"><a href="%s">%d</a></li>`, p.pageURL(strconv.Itoa(i)), i)
  86. } else {
  87. s = fmt.Sprintf(`<li><a href="%s">%d</a></li>`, p.pageURL(strconv.Itoa(i)), i)
  88. }
  89. pageLinks = append(pageLinks, s)
  90. }
  91. return fmt.Sprintf(`<ul class="pagination">%s%s%s%s%s</ul>`, firstLink, prevLink, strings.Join(pageLinks, ""), nextLink, lastLink)
  92. }
  93. //pageURL 生成分页url
  94. func (p *Pagination) pageURL(page string) string {
  95. //基于当前url新建一个url对象
  96. u, _ := url.Parse(p.BaseUrl + p.Request.URL.String())
  97. q := u.Query()
  98. q.Set("page", page)
  99. u.RawQuery = q.Encode()
  100. return u.String()
  101. }
  102. type Page struct {
  103. PageNo int `json:"PageNo"`
  104. PageSize int `json:"PageSize"`
  105. TotalPage int `json:"TotalPage"`
  106. TotalCount int `json:"TotalCount"`
  107. FirstPage bool `json:"FirstPage"`
  108. LastPage bool `json:"LastPage"`
  109. List interface{} `json:"List"`
  110. }
  111. func PageUtil(count int, pageNo int, pageSize int, list interface{}) Page {
  112. tp := count / pageSize
  113. if count%pageSize > 0 {
  114. tp = count/pageSize + 1
  115. }
  116. return Page {
  117. PageNo: pageNo,
  118. PageSize: pageSize,
  119. TotalPage: tp,
  120. TotalCount: count,
  121. FirstPage: pageNo == 1,
  122. LastPage: pageNo == tp,
  123. List: list,
  124. }
  125. }