文档章节

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

吾爱
 吾爱
发布于 2017/11/14 17:22
字数 545
阅读 536
收藏 1
Go

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

代码如下:

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, 0, 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>`, p.pageURL(strconv.Itoa(i)), 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())})  
    })    
    
}

预览:

输入图片说明

© 著作权归作者所有

吾爱
粉丝 142
博文 272
码字总数 91680
作品 0
后端工程师
私信 提问
加载中

评论(0)

基于 Beego 开发的后台管理系统 - gardens

gardens是基于Beego开发的易用、易扩展、界面友好的轻量级功能权限管理系统。 前端框架基于AdminLTE2进行资源整合,包含了多款优秀的插件,是笔者对多年后台管理系统开发经验精华的萃取。 本...

yunnet
2018/10/31
4.4K
0
JEECG 4.0 版本发布,JAVA快速开发平台

JEECG 4.0 版本发布,系统全面优化升级,更快,更稳定! 导读 ⊙平台性能优化,系统更稳定,速度闪电般提升 ⊙上传组件plupload优化改进,优化上传效果,加强浏览器兼容性 ⊙新增adminlte首页...

JEECG开源社区
2019/08/05
4K
3
Flask 教程 第十一章:美化

本文转载自:https://www.jianshu.com/p/2c3305d75bf4 这是Flask Mega-Tutorial系列的第十一部分,我将告诉你如何用基于Bootstrap用户界面框架的新模板替换基础的HTML模板。 你把玩Microblog...

天降攻城狮
2019/02/22
0
0
基于Metronic的Bootstrap开发框架经验总结(18)-- 在代码生成工具Database2Sharp中集成对Bootstrap-table插件的分页及排序支持

在我们开发系统界面,包括Web和Winform的都一样,主要的界面就是列表展示主界面,编辑查看界面,以及一些辅助性的如导入界面,选择界面等,其中列表展示主界面是综合性的数据展示界面,一般往...

walb呀
2017/12/04
0
0
12款程序员们最爱的Bootstrap模板

如果你还没有开始使用Bootstrap模板,那你可真是有够OUT,这是一个帮助你快速开发的工具,Bootstrap是基于jQuery框架开发的,它在jQuery框架的基础上进行了更为个性化和人性化的完善,形成一...

gbin1
2014/09/18
208
0

没有更多内容

加载失败,请刷新页面

加载更多

记录一题生产者消费者问题

//有一个容器,能存储一定的产品,有put和get方法,有两个生产者,8个消费者的线程阻塞 import java.util.LinkedList; import java.util.concurrent.TimeUnit; public class Test3<T> { Lin...

南桥北木
26分钟前
13
0
线程池源码解读——回归基础

线程池源码解读——回归基础 线程池源码解读——回归基础 线程池的好处: JDK提供的创建线程池: java 中创建线程的方式: 线程池源码解读: 记录的知识点: 线程池的好处: 降低资源的开销 ...

lihua20103181
28分钟前
62
0
2D游戏开发课程学习笔记(6)-pygame小游戏开发

游戏简介 使用pycharm开发的小游戏《嗷大喵快跑》。是一款比较简单的酷跑游戏,只有5关。 玩法介绍 按空格键控制可以让猫跳跃,要同时躲避子弹和恶龙的袭击。 结束以后会有高分榜。 游戏预览...

pl彭莉
31分钟前
37
0
pygame制作小游戏——魔塔大闯关

pygame制作小游戏——魔塔大闯关 开发工具:vscode 游戏介绍:一开始玩家有100的生命值,10的攻击力,10的防御力,玩家可以通过获得相应颜色的钥匙来打开相应颜色门,玩家可开挂一次,通过点...

JulYi
32分钟前
8
0
垃圾回收:可达性分析算法、生存还是死亡(两次标记)

判断哪些内存需要回收 引用计数算法、可达性分析算法。引用计数算法优点实现简单,但是无法判断循环引用。 可达性分析算法:通过一系列的GC ROOTS作为起点,往下搜索,所走过的路径叫引用链。...

mrsuperli
35分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部