简单的beego分页功能代码
一个简单的beego分页小插件(源代码在最下面):
支持条件查询
支持参数保留
支持自定义css样式
支持表/视图
支持参数自定义 默认为pno
支持定义生成链接的个数
使用方式:
1)action中,引入包,然后如下使用:
/**
* 日志列表
*/
func (this *LogController) List() {
pno, _ := this.GetInt("pno") //获取当前请求页
var tlog []m.Tb_log
var conditions string = " order by id desc" //定义日志查询条件,格式为 " and name='zhifeiya' and age=12 "
var po pager.PageOptions //定义一个分页对象
po.TableName = "tb_log" //指定分页的表名
po.EnableFirstLastLink = true //是否显示首页尾页 默认false
po.EnablePreNexLink = true //是否显示上一页下一页 默认为false
po.Conditions = conditions // 传递分页条件 默认全表
po.Currentpage = int(pno) //传递当前页数,默认为1
po.PageSize = //页面大小 默认为20 //返回分页信息,
//第一个:为返回的当前页面数据集合,ResultSet类型
//第二个:生成的分页链接
//第三个:返回总记录数
//第四个:返回总页数
rs, pagerhtml, totalItem, _ := pager.GetPagerLinks(&po, this.Ctx)
rs.QueryRows(&tlog) //把当前页面的数据序列化进一个切片内
this.Data["list"] = tlog //把当前页面的数据传递到前台
this.Data["pagerhtml"] = pagerhtml
this.Data["totalItem"] = totalItem
this.Data["PageSize"] = po.PageSize
this.TplNames = "cms/log/list.html"
}
2)视图代码:
class="default" 是分页样式,可根据实际情况设置
<div class="default"><span>共{{.totalItem}}记录</span>
<div style="float:left;">{{.pagerhtml}}</div>
</div>
效果图片:
<div class="meneame"><span>共{{.totalItem}}记录</span>
<div style="float:left;">{{.pagerhtml}}</div>
</div>
效果图片:
分页源代码:
package pager /**
* 分页功能
* 支飞亚
* 2014-9-1
*/
import (
// "fmt"
"github.com/astaxie/beego/context"
"github.com/astaxie/beego/orm"
html "html/template"
con "strconv"
"strings"
"time"
) type PageOptions struct {
TableName string //表名 -----------------[必填]
Conditions string //条件
Currentpage int //当前页 ,默认1 每次分页,必须在前台设置新的页数,不设置始终默认1.在控制器中使用方式:cp, _ := this.GetInt("pno") po.Currentpage = int(cp)
PageSize int //页面大小,默认20
LinkItemCount int //生成A标签的个数 默认10个
Href string //A标签的链接地址 ---------[不需要设置]
ParamName string //参数名称 默认是pno
FirstPageText string //首页文字 默认"首页"
LastPageText string //尾页文字 默认"尾页"
PrePageText string //上一页文字 默认"上一页"
NextPageText string //下一页文字 默认"下一页"
EnableFirstLastLink bool //是否启用首尾连接 默认false 建议开启
EnablePreNexLink bool //是否启用上一页,下一页连接 默认false 建议开启
} /**
* 分页函数,适用任何表
* 返回 总记录条数,总页数,以及当前请求的数据RawSeter,调用中需要"rs.QueryRows(&tblog)"就行了 --tblog是一个Tb_log对象
* 参数:表名,当前页数,页面大小,条件(查询条件,格式为 " and name='zhifeiya' and age=12 ")
*/
func GetPagesInfo(tableName string, currentpage int, pagesize int, conditions string) (int, int, orm.RawSeter) {
if currentpage <= {
currentpage =
}
if pagesize == {
pagesize =
}
var rs orm.RawSeter
o := orm.NewOrm()
var totalItem, totalpages int = , //总条数,总页数
o.Raw("SELECT count(*) FROM " + tableName + " where 1>0 " + conditions).QueryRow(&totalItem) //获取总条数
if totalItem <= pagesize {
totalpages =
} else if totalItem > pagesize {
temp := totalItem / pagesize
if (totalItem % pagesize) != {
temp = temp +
}
totalpages = temp
}
rs = o.Raw("select * from " + tableName + " where id >0 " + conditions + " LIMIT " + con.Itoa((currentpage-)*pagesize) + "," + con.Itoa(pagesize))
return totalItem, totalpages, rs
} /**
* 返回总记录条数,总页数,当前页面数据,分页html
* 根据分页选项,生成分页连接 下面是一个实例:
func (this *MainController) Test() {
var po util.PageOptions
po.EnablePreNexLink = true
po.EnableFirstLastLink = true
po.LinkItemCount = 7
po.TableName = "help_topic"
cp, _ := this.GetInt("pno")
po.Currentpage = int(cp)
_,_,_ pager := util.GetPagerLinks(&po, this.Ctx)
this.Data["Email"] = html.HTML(pager)
this.TplNames = "test.html"
}
*/
func GetPagerLinks(po *PageOptions, ctx *context.Context) (int, int, orm.RawSeter, html.HTML) {
var str string = ""
totalItem, totalpages, rs := GetPagesInfo(po.TableName, po.Currentpage, po.PageSize, po.Conditions)
po = setDefault(po, totalpages)
DealUri(po, ctx)
if totalpages <= po.LinkItemCount {
str = fun1(po, totalpages) //显示完全 12345678910
} else if totalpages > po.LinkItemCount {
if po.Currentpage < po.LinkItemCount {
str = fun2(po, totalpages) //123456789...200
} else {
if po.Currentpage+po.LinkItemCount < totalpages {
str = fun3(po, totalpages)
} else {
str = fun4(po, totalpages)
}
}
}
return totalItem, totalpages, rs, html.HTML(str)
} /**
* 处理url,目的是保存参数
*/
func DealUri(po *PageOptions, ctx *context.Context) {
uri := ctx.Request.RequestURI
var rs string
if strings.Contains(uri, "?") {
arr := strings.Split(uri, "?")
rs = arr[] + "?" + po.ParamName + "time=" + con.Itoa(time.Now().Second())
arr2 := strings.Split(arr[], "&")
for _, v := range arr2 {
if !strings.Contains(v, po.ParamName) {
rs += "&" + v
}
}
} else {
rs = uri + "?" + po.ParamName + "time=" + con.Itoa(time.Now().Second())
}
po.Href = rs
} /**
* 1...197 198 199 200
*/
func fun4(po *PageOptions, totalpages int) string {
var rs string = ""
rs += getHeader(po, totalpages)
rs += "<a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa() + "'>" + con.Itoa() + "</a>"
rs += "<a href=''>...</a>"
for i := totalpages - po.LinkItemCount; i <= totalpages; i++ {
if po.Currentpage != i {
rs += "<a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(i) + "'>" + con.Itoa(i) + "</a>"
} else {
rs += "<span class=\"current\">" + con.Itoa(i) + "</span>"
}
}
rs += getFooter(po, totalpages)
return rs } /**
* 1...6 7 8 9 10 11 12 13 14 15... 200
*/
func fun3(po *PageOptions, totalpages int) string {
var rs string = ""
rs += getHeader(po, totalpages)
rs += "<a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa() + "'>" + con.Itoa() + "</a>"
rs += "<a href=''>...</a>"
for i := po.Currentpage - po.LinkItemCount/ + ; i <= po.Currentpage+po.LinkItemCount/-; i++ {
if po.Currentpage != i {
rs += "<a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(i) + "'>" + con.Itoa(i) + "</a>"
} else {
rs += "<span class=\"current\">" + con.Itoa(i) + "</span>"
}
}
rs += "<a href=''>...</a>"
rs += "<a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(totalpages) + "'>" + con.Itoa(totalpages) + "</a>"
rs += getFooter(po, totalpages)
return rs } /**
* totalpages > po.LinkItemCount po.Currentpage < po.LinkItemCount
* 123456789...200
*/
func fun2(po *PageOptions, totalpages int) string {
var rs string = ""
rs += getHeader(po, totalpages)
for i := ; i <= po.LinkItemCount+; i++ {
if i == po.LinkItemCount {
rs += "<a href=\"" + po.Href + "&" + po.ParamName + "=" + con.Itoa(i) + "\">...</a>"
} else if i == po.LinkItemCount+ {
rs += "<a href=\"" + po.Href + "&" + po.ParamName + "=" + con.Itoa(totalpages) + "\">" + con.Itoa(totalpages) + "</a>"
} else {
if po.Currentpage != i {
rs += "<a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(i) + "'>" + con.Itoa(i) + "</a>"
} else {
rs += "<span class=\"current\">" + con.Itoa(i) + "</span>"
}
}
}
rs += getFooter(po, totalpages)
return rs
} /**
* totalpages <= po.LinkItemCount
* 显示完全 12345678910
*/
func fun1(po *PageOptions, totalpages int) string { var rs string = ""
rs += getHeader(po, totalpages)
for i := ; i <= totalpages; i++ {
if po.Currentpage != i {
rs += "<a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(i) + "'>" + con.Itoa(i) + "</a>"
} else {
rs += "<span class=\"current\">" + con.Itoa(i) + "</span>"
}
}
rs += getFooter(po, totalpages)
return rs
} /**
* 头部
*/
func getHeader(po *PageOptions, totalpages int) string {
var rs string = "<div>"
if po.EnableFirstLastLink { //当首页,尾页都设定的时候,就显示 rs += "<a " + judgeDisable(po, totalpages, ) + " href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa() + "'>" + po.FirstPageText + "</a>"
}
if po.EnablePreNexLink { // disabled=\"disabled\"
var a int = po.Currentpage -
if po.Currentpage == {
a =
}
rs += "<a " + judgeDisable(po, totalpages, ) + " href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(a) + "'>" + po.PrePageText + "</a>"
}
return rs
} /**
* 尾部
*/
func getFooter(po *PageOptions, totalpages int) string {
var rs string = ""
if po.EnablePreNexLink {
var a int = po.Currentpage +
if po.Currentpage == totalpages {
a = totalpages
}
rs += "<a " + judgeDisable(po, totalpages, ) + " href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(a) + "'>" + po.NextPageText + "</a>"
}
if po.EnableFirstLastLink { //当首页,尾页都设定的时候,就显示
rs += "<a " + judgeDisable(po, totalpages, ) + " href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(totalpages) + "'>" + po.LastPageText + "</a>"
}
rs += "</div>"
return rs
} /**
* 设置默认值
*/
func setDefault(po *PageOptions, totalpages int) *PageOptions {
if len(po.FirstPageText) <= {
po.FirstPageText = "首页"
}
if len(po.LastPageText) <= {
po.LastPageText = "尾页"
}
if len(po.PrePageText) <= {
po.PrePageText = "上一页"
}
if len(po.NextPageText) <= {
po.NextPageText = "下一页"
}
if po.Currentpage >= totalpages {
po.Currentpage = totalpages
}
if po.Currentpage <= {
po.Currentpage =
}
if po.LinkItemCount == {
po.LinkItemCount =
}
if po.PageSize == {
po.PageSize =
}
if len(po.ParamName) <= {
po.ParamName = "pno"
}
return po
} /**
*判断首页尾页 上一页下一页是否能用
*/
func judgeDisable(po *PageOptions, totalpages int, h_f int) string {
var rs string = ""
//判断头部
if h_f == {
if po.Currentpage == {
rs = "disabled=\"disabled\" style='pointer-events:none;'"
}
} else {
if po.Currentpage == totalpages {
rs = "disabled=\"disabled\" style='pointer-events:none;'"
}
}
return rs
}
---支飞亚
简单的beego分页功能代码的更多相关文章
- 一个简单的php分页类代码(转载)
入门级php分页类 原文地址:http://www.xfcodes.com/php/fenye/3608.htm 时间:2015-12-16 20:52:00来源:网络 php分页类. 复制代码代码如 ...
- java分页功能代码
import java.util.ArrayList; import java.util.List; /** * * @author cheney * * @date Aug 31, 2012 */ ...
- Django【进阶】分页功能Pagination
项目中,我们需要很多非业务逻辑的功能,例如分页功能,而且此类功能移植性很好,可以在不同的项目中使用,所以整理好这些功能会一定程度上提高开发效率,下面是分页功能代码,使用时,可单独放在utils目录 & ...
- hibernate和struts2实现分页功能
1.DAO层接口的设计,定义一个PersonDAO接口,里面声明了两个方法: public interface PersonDAO { public List<Person> queryB ...
- 原生js实现分页功能
原生就是实现分页功能 代码如下: var pagination = function(option,fun){ this.parentId = option.id; //容器 this.pageSiz ...
- 简单封装分页功能pageView.js
分页是一个很简单,通用的功能.作为一个有经验的前端开发人员,有义务把代码中类似这样公共的基础性的东西抽象出来,一来是改善代码的整体质量,更重要的是为了将来做类似的功能或者类似的项目,能减少不必要的重复 ...
- 一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架
问题:3行代码 PDF.NET是一个开源的数据开发框架,它的特点是简单.轻量.快速,易上手,而且是一个注释完善的国产开发框架,受到不少朋友的欢迎,也在我们公司的项目中多次使用.但是,PDF.NET比起 ...
- jsp、js分页功能的简单总结
一.概述 首先,我们要明确为何需要分页技术,主要原因有以下: 1.分页可以提高客户体验度,适当地选择合适的数据条数,让页面显得更有条理,使得用户体验感良好,避免过多数据的冗余. 2.提高性能的需要.分 ...
- PHP分页初探 一个最简单的PHP分页代码实现
PHP分页代码在各种程序开发中都是必须要用到的,在网站开发中更是必选的一项. 要想写出分页代码,首先你要理解SQL查询语句:select * from goods limit 2,7.PHP分页代码核 ...
随机推荐
- tflearn中一些CNN RNN的例子
lstm.py # -*- coding: utf-8 -*- """ Simple example using LSTM recurrent neural networ ...
- tcpdump dns流量监控
tcpdump监听数据 为了看清楚DNS通信的过程,下面我们将从主机1:192.168.0.141上运行host命令以查询主机www.jd.com对应的IP地址,并使用tcpdump抓取这一过程中LA ...
- lightshot截图工具的安装及使用
通常我们做PPT或者写博客难免要用到截图工具,而Windows自带的snippingtool启动有延迟也不够方便,QQ有截屏又需要联网及登录情况下,于是我想着在Chrome上搜一款清新简洁的截屏软件, ...
- Sqlite基本命令集合(linux/fedora/ubuntu)
注:fedora自带sqlite3,无需安装,直接输入命令sqlite3即可. ------------Ubuntu在命令行输入sqlite3,确认没有安装在进行--- 1.安装sqlite3 ubu ...
- ajax的post提交方式和传统的post提交方式哪个更快?
如果同时用ajax和post提交先执行哪个呢?是ajax返回后再执行post呢还是同时执行? ajax的post提交方式和传统的post提交方式哪个更快? >> php这个答案描述的挺清楚 ...
- shell-6.其他配置文件和登录信息
- 照片放大软件PhotoZoom怎么用?
做设计时,难免常常要上网找一些图片素材,但是有时候我们找到图片效果不尽人意,图片风格符合设计要求的的却图片太小,用photoshop放大后,图片的色块像素就出来了,效果极为不理想,这就要我们将图片进行 ...
- 优动漫PAINT安装教程
优动漫PAINT是一款漫画.插画.动画绘制软件.其功能可分别满足画师对于插画.漫画和动画创作的针对性需求,是一款非常好用易上手的动漫绘图软件,本文来看使用软件第一步,如何安装优动漫PAINT. 步骤一 ...
- DDD中Dto领域驱动设计概述,摘自《NET企业级应用架构设计》
- CentOS 7 安装配置MySQL
环境 CentOS Linux release 7.5.1804 (Core) MySQL:mysql80-community-release-el7-1 检查: 在centos7中默认的是maria ...