加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Go语言(golang)快速实现一个bootstrap风格的分页链接

发布时间:2020-12-16 09:43:43 所属栏目:大数据 来源:网络整理
导读:写的比较粗糙,直接写死链接样式,代码可以进一步封装,增加一些自定义的配置项 代码如下: package utilsimport ("fmt""math""net/http""net/url""strconv""strings")//Pagination 分页器type Pagination struct {Request *http.RequestTotal intPernum int

写的比较粗糙,直接写死链接样式,代码可以进一步封装,增加一些自定义的配置项

代码如下:

package utils

import (
	"fmt"
	"math"
	"net/http"
	"net/url"
	"strconv"
	"strings"
)

//Pagination 分页器
type Pagination struct {
	Request *http.Request
	Total   int
	Pernum  int
}

//NewPagination 新建分页器
func NewPagination(req *http.Request,total int,pernum int) *Pagination {
	return &Pagination{
		Request: req,Total:   total,Pernum:  pernum,}
}

//Pages 渲染生成html分页标签
func (p *Pagination) Pages() string {
	queryParams := p.Request.URL.Query()
	//从当前请求中获取page
	page := queryParams.Get("page")
	if page == "" {
		page = "1"
	}
	//将页码转换成整型,以便计算
	pagenum,_ := strconv.Atoi(page)
	if pagenum == 0 {
		return ""
	}

	//计算总页数
	var totalPageNum = int(math.Ceil(float64(p.Total) / float64(p.Pernum)))

	//首页链接
	var firstLink string
	//上一页链接
	var prevLink string
	//下一页链接
	var nextLink string
	//末页链接
	var lastLink string
	//中间页码链接
	var pageLinks []string

	//首页和上一页链接
	if pagenum > 1 {
		firstLink = fmt.Sprintf(`<li><a href="%s">首页</a></li>`,p.pageURL("1"))
		prevLink = fmt.Sprintf(`<li><a href="%s">上一页</a></li>`,p.pageURL(strconv.Itoa(pagenum-1)))
	} else {
		firstLink = `<li class="disabled"><a href="#">首页</a></li>`
		prevLink = `<li class="disabled"><a href="#">上一页</a></li>`
	}

	//末页和下一页
	if pagenum < totalPageNum {
		lastLink = fmt.Sprintf(`<li><a href="%s">末页</a></li>`,p.pageURL(strconv.Itoa(totalPageNum)))
		nextLink = fmt.Sprintf(`<li><a href="%s">下一页</a></li>`,p.pageURL(strconv.Itoa(pagenum+1)))
	} else {
		lastLink = `<li class="disabled"><a href="#">末页</a></li>`
		nextLink = `<li class="disabled"><a href="#">下一页</a></li>`
	}

	//生成中间页码链接
	pageLinks = make([]string,10)
	startPos := pagenum - 3
	endPos := pagenum + 3
	if startPos < 1 {
		endPos = endPos + int(math.Abs(float64(startPos))) + 1
		startPos = 1
	}
	if endPos > totalPageNum {
		endPos = totalPageNum
	}
	for i := startPos; i <= endPos; i++ {
		var s string
		if i == pagenum {
			s = fmt.Sprintf(`<li class="active"><a href="%s">%d</a></li>`,p.pageURL(strconv.Itoa(i)),i)
		} else {
			s = fmt.Sprintf(`<li><a href="%s">%d</a></li>`,i)
		}
		pageLinks = append(pageLinks,s)
	}

	return fmt.Sprintf(`<ul class="pagination">%s%s%s%s%s</ul>`,firstLink,prevLink,strings.Join(pageLinks,""),nextLink,lastLink)
}

//pageURL 生成分页url
func (p *Pagination) pageURL(page string) string {
	//基于当前url新建一个url对象
	u,_ := url.Parse(p.Request.URL.String())
	q := u.Query()
	q.Set("page",page)
	u.RawQuery = q.Encode()
	return u.String()
}

使用方法:

package main

...
import "你项目的路径/utils"
import "github.com/gin-gonic/gin"
import "html/template"
...

func main() {
    ...
    r := gin.Default()
    r.GET("/",func(c *gin.context){
          //创建一个分页器,一万条数据,每页30条
          pagination := utils.NewPagination(c.Request,10000,30)
           //传到模板中需要转换成template.HTML类型,否则html代码会被转义
          c.HTML(200,"你的模板",gin.H{"pages":template.HTML(pagination.Pages())})  
    })    
    
}

预览:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读