package utility import ( "fmt" "jybxseo/internal/consts" "strconv" ) const ( disabled = `disabled` li = `
  • %s
  • ` prevMoreClass = `prev-more` nextMoreClass = `next-more` active = `active` number = "number" ul = `` noHref = `javascript:void(0);` href = `/xxx/%d` prevPageIcon = `` nextPageIcon = `` moreIcon = `` prevPageClass = "prev-page" nextPageClass = "next-page" pagerNumSize = 5 //两个点点点之间的页面数量 currPrevNextSize = 2 //当前页前后多少页开始显示点点点 ) type Pagination struct { PagingHtml string PageNum, PageCount, PageSize int UrlFormat string PrevHref, NextHref string } func GetLetterPaging(currentPage, totalPage int, href string) (pagingMap *Pagination) { if currentPage == 0 { currentPage = 1 } pagination := &Pagination{ PagingHtml: PaggingHtml(currentPage, totalPage, href), PageNum: currentPage, PageCount: totalPage, PageSize: consts.SettingPageSize, UrlFormat: href, } if currentPage > 1 { pagination.PrevHref = fmt.Sprintf(href, currentPage-1) } if currentPage < totalPage { pagination.NextHref = fmt.Sprintf(href, currentPage+1) } return pagination } func PaggingHtml(currentPage, totalPage int, href string) string { if currentPage > totalPage { return "" } ppc, npc := prevPageClass, nextPageClass pph, nph := fmt.Sprintf(href, currentPage-1), fmt.Sprintf(href, currentPage+1) if totalPage == 1 { ppc += " " + disabled npc += " " + disabled pph = noHref nph = noHref } else if currentPage == 1 { ppc += " " + disabled pph = noHref } else if currentPage == totalPage { npc += " " + disabled nph = noHref } lis := "" hasPrevMore, hasNextMore := false, false for i := 1; i <= totalPage; i++ { if i > 1 && i < totalPage && totalPage > pagerNumSize { isContinue := false if currentPage < pagerNumSize && i > pagerNumSize+1 { isContinue = true } else if currentPage >= pagerNumSize && currentPage < totalPage-currPrevNextSize-1 && (i < currentPage-currPrevNextSize || i > currentPage+currPrevNextSize) { isContinue = true } else if currentPage > totalPage-pagerNumSize+1 && i < totalPage-pagerNumSize { isContinue = true } if isContinue { if !hasPrevMore && i < currentPage { hasPrevMore = true lis += fmt.Sprintf(li, prevMoreClass, fmt.Sprintf(href, currentPage-pagerNumSize), moreIcon) } else if !hasNextMore && i > currentPage { hasNextMore = true lis += fmt.Sprintf(li, nextMoreClass, fmt.Sprintf(href, currentPage+pagerNumSize), moreIcon) } continue } } if i == currentPage { lis += fmt.Sprintf(li, number+" "+active, noHref, strconv.Itoa(i)) } else { lis += fmt.Sprintf(li, number, fmt.Sprintf(href, i), strconv.Itoa(i)) } } lis = fmt.Sprintf(li, ppc, pph, prevPageIcon) + lis + fmt.Sprintf(li, npc, nph, nextPageIcon) return fmt.Sprintf(ul, currentPage, totalPage, lis) }