paging.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package utility
  2. import (
  3. "fmt"
  4. "jybxseo/internal/consts"
  5. "strconv"
  6. )
  7. const (
  8. disabled = `disabled`
  9. li = `<li class="%s"><a href="%s">%s</a></li>`
  10. prevMoreClass = `prev-more`
  11. nextMoreClass = `next-more`
  12. active = `active`
  13. number = "number"
  14. ul = `<ul class="el-pager" data-page-num="%v" data-page-total="%v">%s</ul>`
  15. noHref = `javascript:void(0);`
  16. href = `/xxx/%d`
  17. prevPageIcon = `<i class="el-icon el-icon-arrow-left"></i>`
  18. nextPageIcon = `<i class="el-icon el-icon-arrow-right"></i>`
  19. moreIcon = `<i class="el-icon el-icon-more"></i>`
  20. prevPageClass = "prev-page"
  21. nextPageClass = "next-page"
  22. pagerNumSize = 5 //两个点点点之间的页面数量
  23. currPrevNextSize = 2 //当前页前后多少页开始显示点点点
  24. )
  25. type Pagination struct {
  26. PagingHtml string
  27. PageNum, PageCount, PageSize int
  28. UrlFormat string
  29. PrevHref, NextHref string
  30. }
  31. func GetLetterPaging(currentPage, totalPage int, href string) (pagingMap *Pagination) {
  32. if currentPage == 0 {
  33. currentPage = 1
  34. }
  35. pagination := &Pagination{
  36. PagingHtml: PaggingHtml(currentPage, totalPage, href),
  37. PageNum: currentPage,
  38. PageCount: totalPage,
  39. PageSize: consts.SettingPageSize,
  40. UrlFormat: href,
  41. }
  42. if currentPage > 1 {
  43. pagination.PrevHref = fmt.Sprintf(href, currentPage-1)
  44. }
  45. if currentPage < totalPage {
  46. pagination.NextHref = fmt.Sprintf(href, currentPage+1)
  47. }
  48. return pagination
  49. }
  50. func PaggingHtml(currentPage, totalPage int, href string) string {
  51. if currentPage > totalPage {
  52. return ""
  53. }
  54. ppc, npc := prevPageClass, nextPageClass
  55. pph, nph := fmt.Sprintf(href, currentPage-1), fmt.Sprintf(href, currentPage+1)
  56. if totalPage == 1 {
  57. ppc += " " + disabled
  58. npc += " " + disabled
  59. pph = noHref
  60. nph = noHref
  61. } else if currentPage == 1 {
  62. ppc += " " + disabled
  63. pph = noHref
  64. } else if currentPage == totalPage {
  65. npc += " " + disabled
  66. nph = noHref
  67. }
  68. lis := ""
  69. hasPrevMore, hasNextMore := false, false
  70. for i := 1; i <= totalPage; i++ {
  71. if i > 1 && i < totalPage && totalPage > pagerNumSize {
  72. isContinue := false
  73. if currentPage < pagerNumSize && i > pagerNumSize+1 {
  74. isContinue = true
  75. } else if currentPage >= pagerNumSize && currentPage < totalPage-currPrevNextSize-1 && (i < currentPage-currPrevNextSize || i > currentPage+currPrevNextSize) {
  76. isContinue = true
  77. } else if currentPage > totalPage-pagerNumSize+1 && i < totalPage-pagerNumSize {
  78. isContinue = true
  79. }
  80. if isContinue {
  81. if !hasPrevMore && i < currentPage {
  82. hasPrevMore = true
  83. lis += fmt.Sprintf(li, prevMoreClass, fmt.Sprintf(href, currentPage-pagerNumSize), moreIcon)
  84. } else if !hasNextMore && i > currentPage {
  85. hasNextMore = true
  86. lis += fmt.Sprintf(li, nextMoreClass, fmt.Sprintf(href, currentPage+pagerNumSize), moreIcon)
  87. }
  88. continue
  89. }
  90. }
  91. if i == currentPage {
  92. lis += fmt.Sprintf(li, number+" "+active, noHref, strconv.Itoa(i))
  93. } else {
  94. lis += fmt.Sprintf(li, number, fmt.Sprintf(href, i), strconv.Itoa(i))
  95. }
  96. }
  97. lis = fmt.Sprintf(li, ppc, pph, prevPageIcon) + lis + fmt.Sprintf(li, npc, nph, nextPageIcon)
  98. return fmt.Sprintf(ul, currentPage, totalPage, lis)
  99. }