go web编程——实现一个简单分页器
在go web编程中,当需要展示的列表数据太多时,不可避免需要分页展示,可以使用Go实现一个简单分页器,提供各个数据列表展示使用。
具体需求:
1. 可展示“首页”和“尾页”。
2. 可展示“上一页”和“下一页”。
3. 展示一定数量的数字页码,但总保持当前访问页码在中间位置。
分页器代码:
package paginator import (
"math"
) //分页器结构
type paginator struct {
Total int //记录总数
PageSize int //每页大小
PageTotal int //总页数
Page int //当前页数
LastPage int //上一页
NextPage int //下一页
PageNums []int //显示页码
} var defaultPageSize = 5 //默认页大小
var pageNum = 5 //显示页码数量 //获取默认页大小
func GetDefaultPageSize() int {
return defaultPageSize
} //设置默认页大小
func SetDefaultPageSize(ps int) {
if ps < 1 {
ps = 1
}
defaultPageSize = ps
} //设置显示页码数量
func SetPageNum(pn int) {
if pn < 1 {
pn = 1
}
pageNum = pn
} //创建分页器
func CreatePaginator(page, pageSize, total int) paginator {
if pageSize <= 0 {
pageSize = defaultPageSize
}
pager := &paginator{
Total: total,
PageSize: pageSize,
PageTotal: int(math.Ceil(float64(total) / float64(pageSize))),
Page: page,
}
if total <= 0 {
pager.PageTotal = 1
pager.Page = 1
pager.LastPage = 1
pager.NextPage = 1
pager.PageNums = append(pager.PageNums, 1)
return *pager
}
//分页边界处理
if pager.Page > pager.PageTotal {
pager.Page = pager.PageTotal
} else if pager.Page < 1 {
pager.Page = 1
}
//上一页与下一页
pager.LastPage = pager.Page
pager.NextPage = pager.Page
if pager.Page > 1 {
pager.LastPage = pager.Page - 1
}
if pager.Page < pager.PageTotal {
pager.NextPage = pager.Page + 1
}
//显示页码
var start, end int //开始页码与结束页码
if pager.PageTotal <= pageNum {
start = 1
end = pager.PageTotal
} else {
before := pageNum / 2 //当前页前面页码数
after := pageNum - before - 1 //当前页后面页码数
start = pager.Page - before
end = pager.Page + after
if start < 1 { //当前页前面页码数不足
start = 1
end = pageNum
} else if end > pager.PageTotal { //当前页后面页码数不足
start = pager.PageTotal - pageNum + 1
end = pager.PageTotal
}
}
for i := start; i <= end; i++ {
pager.PageNums = append(pager.PageNums, i)
}
return *pager
}
控制器使用:
pager := paginator.CreatePaginator(page, pageSize, total)
tpl, err := template.New("index.html").ParseFiles("index.html")
if err != nil {
fmt.Fprint(writer, "模板解析错误:", err)
return
}
err = tpl.Execute(writer, map[string]interface{}{"paginator": pager})
if err != nil {
fmt.Fprint(writer, "模板执行错误:", err)
return
}
模板使用:
#pageBar {
text-align: right;
padding: 20px 0 20px 0;
}
.pageBtn a {
display: inline-block;
border: 1px solid #aaa;
padding: 2px 5px;
margin : 0 3px;
font-size: 13px;
background: #ECECEC;
color: black;
text-decoration: none;
-moz-border-radius: 2px;
-webkit-border-radius: 3px;
}
.pageBtn-selected a {
display: inline-block;
border: 1px solid #aaa;
padding: 2px 5px;
margin : 0 3px;
font-size: 13px;
background: #187BBD;
color: white;
text-decoration: none;
-moz-border-radius: 2px;
-webkit-border-radius: 3px;
}
.pageBtn a:hover {
background: #187BBD;
color: white;
}
<div class="row" id="pageBar">
{{if ne .paginator.Page 1}}
<span class="pageBtn"><a href="/address/1/{{.paginator.PageSize}}">首页</a></span>
<span class="pageBtn"><a href="/address/{{.paginator.LastPage}}/{{.paginator.PageSize}}">上一页</a></span>
{{end}}
{{range $k, $v := .paginator.PageNums}}
{{if eq $v $.paginator.Page}}
<span class="pageBtn-selected"><a href="/address/{{$v}}/{{$.paginator.PageSize}}">{{$v}}</a></span>
{{else}}
<span class="pageBtn"><a href="/address/{{$v}}/{{$.paginator.PageSize}}">{{$v}}</a></span>
{{end}}
{{end}}
{{if ne .paginator.Page .paginator.PageTotal}}
<span class="pageBtn"><a href="/address/{{.paginator.NextPage}}/{{.paginator.PageSize}}">下一页</a></span>
<span class="pageBtn"><a href="/address/{{.paginator.PageTotal}}/{{.paginator.PageSize}}">尾页</a></span>
{{end}}
</div>
效果:
go web编程——实现一个简单分页器的更多相关文章
- 使用socket编程实现一个简单的文件服务器
使用socket编程实现一个简单的文件服务器.客户端程序实现put功能(将一个文件从本地传到文件服务器)和get功能(从文件服务器取一远程文件存为本地文件).客户端和文件服务器不在同一台机器上. pu ...
- 通过Knockout.js + ASP.NET Web API构建一个简单的CRUD应用
REFERENCE FROM : http://www.cnblogs.com/artech/archive/2012/07/04/Knockout-web-api.html 较之面向最终消费者的网站 ...
- python web编程 创建一个web服务器
这里就介绍几个底层的用于创建web服务器的模块,其中最为主要的就是BaseHTTPServer,很多框架和web服务器就是在他们的基础上创建的 基础知识 要建立一个Web 服务,一个基本的服务器和一个 ...
- Linux网络编程:一个简单的正向代理服务器的实现
Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到, Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该 ...
- Python 元类编程实现一个简单的 ORM
概述 什么是ORM? ORM全称"Object Relational Mapping",即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码 ...
- web开发——写一个简单的表格导出操作
一.前台页面: 主要是一个按钮和一个表格,表格有显示数据,按钮负责将表格中的数据选择性地导出.除此外,可以附加一个小窗口和进度条,用于显示下载进度. 1. 按钮:<a href="ja ...
- Python网络编程——编写一个简单的回显客户端/服务器应用
今天将python中socket模块的基本API学习完后,照着书上的实例编写一个套接字服务器和客户端.采用python3.5版本,在注释中会标明python2和python3的不同之处. 1.代码 ( ...
- [shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证
本文地址:http://blog.csdn.net/sushengmiyan/article/details/39933993 shiro官网:http://shiro.apache.org/ shi ...
- Python并发编程-线程-一个简单的例子
from threading import Thread import time def func(n): #子线程完成的 time.sleep(1) print(n) #多线程示例 for i in ...
随机推荐
- 树——minimum-depth-of-binary-tree(二叉树的最小深度)
问题: Given a binary tree, find its minimum depth.The minimum depth is the number of nodes along the s ...
- Invalid operator< assertion error解析
这两天忙着在准备3月份打PAT考试,许久没有接触刷题了,各种生疏各种忘记,刷题速度那是一个慢,真是为自己智商着急.今天刷题碰到了一个有意思的编程习惯性错误,好几道题都涉及到自定义排序,需要自己重写&l ...
- python3 使用 django-xadmin 遇到的许多坑
几乎所有公司项目都是python2的, xadmin对Python2 很友好,对Python3 很不友好, 所以在Python3 环境下使用xadmin遇到了许多意想不到的坑,在这里记录并分享一下: ...
- tomcat 部署指南
下载与安装 个人建议不要使用发行版带的版本, 始终从主页来下载安装, 下载地址位于[1], 安装方法很简单, 直接解压即可, 建议解压到 /usr/local/ 目录, 再链接到 /usr/local ...
- 使用Windows service创建一个简单的定时器
一.需求 我们有时候可能会想要做一些定时任务,例如每隔一段时间去访问某个网站,或者下载一些东西到我们服务器上等等之类的事情,这时候windows service 是一个不错的选择. 二.实现 1.打开 ...
- 禁止input输入框输入指定内容
链接: http://blog.csdn.net/xiaoya_syt/article/details/52746598
- [luogu]P1169 [ZJOI2007]棋盘制作[DP][单调栈]
[luogu]P1169 [ZJOI]棋盘制作 ——!x^n+y^n=z^n 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋 ...
- 【HDOJ6628】permutation 1(dfs)
题意:求1到n的排列中使得其差分序列的字典序为第k大的原排列 n<=20,k<=1e4 思路:爆搜差分序列,dfs时候用上界和下界剪枝 #include<bits/stdc++.h& ...
- div拖拽的问题
今天看到一篇写的很好的文章,摘抄如下: 思路 父盒子相对定位,子元素,也就是被拖拽的元素绝对定位 当鼠标在子元素中按下时,绑定鼠标移动事件,根据鼠标位置改变元素位置 设置鼠标当前位置(offsetX, ...
- Cisco Packet Tracer基本操作
IOS主要模式模式 描述 提示符用户执行模式 路由器受限检查,远程访问 Router>特权执行模式 路由器的详细检查:调试和测试,文件处理,远程访问 Router#全局配置模式 全局配置命令 R ...