go分页

简单的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                                                        //页面大小  默认为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 <= 1 {
        currentpage = 1
    }
    if pagesize == 0 {
        pagesize = 20
    }
    var rs orm.RawSeter
    o := orm.NewOrm()
    var totalItem, totalpages int = 0, 0                                                          //总条数,总页数
    o.Raw("SELECT count(*) FROM " + tableName + "  where 1>0 " + conditions).QueryRow(&totalItem) //获取总条数
    if totalItem <= pagesize {
        totalpages = 1
    } else if totalItem > pagesize {
        temp := totalItem / pagesize
        if (totalItem % pagesize) != 0 {
            temp = temp + 1
        }
        totalpages = temp
    }
    rs = o.Raw("select *  from  " + tableName + "  where id >0 " + conditions + " LIMIT " + con.Itoa((currentpage-1)*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[0] + "?" + po.ParamName + "time=" + con.Itoa(time.Now().Second())
        arr2 := strings.Split(arr[1], "&")
        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(1) + "‘>" + con.Itoa(1) + "</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(1) + "‘>" + con.Itoa(1) + "</a>"
    rs += "<a href=‘‘>...</a>"
    for i := po.Currentpage - po.LinkItemCount/2 + 1; i <= po.Currentpage+po.LinkItemCount/2-1; 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 := 1; i <= po.LinkItemCount+1; i++ {
        if i == po.LinkItemCount {
            rs += "<a href=\"" + po.Href + "&" + po.ParamName + "=" + con.Itoa(i) + "\">...</a>"
        } else if i == po.LinkItemCount+1 {
            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 := 1; 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, 0) + " href=‘" + po.Href + "&" + po.ParamName + "=" + con.Itoa(1) + "‘>" + po.FirstPageText + "</a>"
    }
    if po.EnablePreNexLink { // disabled=\"disabled\"
        var a int = po.Currentpage - 1
        if po.Currentpage == 1 {
            a = 1
        }
        rs += "<a " + judgeDisable(po, totalpages, 0) + " 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 + 1
        if po.Currentpage == totalpages {
            a = totalpages
        }
        rs += "<a " + judgeDisable(po, totalpages, 1) + "  href=‘" + po.Href + "&" + po.ParamName + "=" + con.Itoa(a) + "‘>" + po.NextPageText + "</a>"
    }
    if po.EnableFirstLastLink { //当首页,尾页都设定的时候,就显示
        rs += "<a " + judgeDisable(po, totalpages, 1) + " 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) <= 0 {
        po.FirstPageText = "首页"
    }
    if len(po.LastPageText) <= 0 {
        po.LastPageText = "尾页"
    }
    if len(po.PrePageText) <= 0 {
        po.PrePageText = "上一页"
    }
    if len(po.NextPageText) <= 0 {
        po.NextPageText = "下一页"
    }
    if po.Currentpage >= totalpages {
        po.Currentpage = totalpages
    }
    if po.Currentpage <= 1 {
        po.Currentpage = 1
    }
    if po.LinkItemCount == 0 {
        po.LinkItemCount = 10
    }
    if po.PageSize == 0 {
        po.PageSize = 20
    }
    if len(po.ParamName) <= 0 {
        po.ParamName = "pno"
    }
    return po
}

/**
 *判断首页尾页  上一页下一页是否能用
 */
func judgeDisable(po *PageOptions, totalpages int, h_f int) string {
    var rs string = ""
    //判断头部
    if h_f == 0 {
        if po.Currentpage == 1 {
            rs = "disabled=\"disabled\"  style=‘pointer-events:none;‘"
        }
    } else {
        if po.Currentpage == totalpages {
            rs = "disabled=\"disabled\"  style=‘pointer-events:none;‘"
        }
    }
    return rs
}
时间: 2024-07-28 13:22:52

go分页的相关文章

python__Django 分页

自定义分页的类: #!/usr/bin/env python # -*- coding: utf-8 -*- # Created by Mona on 2017/9/20 from django.utils.safestring import mark_safe class Paginator: ''' 页码的格式依赖于bootstrap: 使用案例: from django.shortcuts import render,redirect,HttpResponse from app01.mod

ajax+分页

<!DOCTYPE html><html><head lang="zh-cn"><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><meta http-equiv="X-UA-Compat

使用插件bootstrap-table实现表格记录的查询、分页、排序等处理

在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这个bootstrap-table是一款非常有名的开源表格插件,在很多项目中广泛的应用.Bootstrap-table插件提供了非常丰富的属性设置,可以实现查询.分页.排序.复选框.设置显示列.Card view视图.主从表显示.合并列.国际化处理等处理功能,而且该插件同时也提供了一些不错的扩展功能,如移动行.移动列位置等一些特殊的功能,插件可

优化LIMIT分页

在系统中需要分页的操作通常会使用limit加上偏移量的方法实现,同时加上合适的order by 子句.如果有对应的索引,通常效率会不错,否则MySQL需要做大量的文件排序操作. 一个非常令人头疼问题就是当偏移量非常大的时候,例如可能是limit 10000,20这样的查询,这是mysql需要查询10020条然后只返回最后20条,前面的10000条记录都将被舍弃,这样的代价很高.如果所有的页面被访问的频率相同,那么这样的查询平均需要访问半个表的数据.要优化这样的查询,要么实在页面中限制分页的数量,

Ajax实现无刷新分页

注:本文中使用到的一些类库在前面文章都能找到源代码,我会在文中指明链接所在,为了缩短文章篇幅,由此带来的阅读不便,敬请谅解. 本文讲解 Ajax 实现无刷新分页.实现原理.代码展示.代码下载. 这里需要说明一些知识: 1.Ajax 无刷新页面的好处:提供良好的客户体验,通过 Ajax 在后台从数据库中取得数据并展示,取缔了等待加载页面而出现的空白状态: 2.那么,Ajax 无刷新页面是运行在动态页面(.PHP)?还是静态页面(.html/.htm/.shtml)?答案是:静态页面: 3.实现原理

关于分页SQL的小总结

findPage 和findPageTotal条件分页中的条件 较为复杂点的关联查询 有取别名的 <select id="findPage" resultMap="MinOrderInfo" parameterType="map"> SELECT o.*,w.name buyName,w.MOBILE buyMobile,aa.name sellName,aa.MOBILE sellMobile,rs.CAR_BRAND_NAME c

webform:分页组合查询

一个简单的分页组合查询页面 /// <summary> /// 查询方法 /// </summary> /// <param name="tsql">SQL语句</param> /// <param name="hh">哈希表</param> /// <returns></returns> public List<Goods> Select(string un

TODO:数据库优化之分页

本文的例子是以MongoDB数据库为准,其它数据库各位也可以举一反三进行优化. 在MongoDB中分页使用 a.skip(n)跳过前n个匹配的文档: b.limit(m)返回m个结果,要是匹配的结果不到m个,则返回匹配数据量的结果,m是指定上限数量,而不是下限数量: c.sort({"name": 1,"address":-1}),1表示升序,-1表示降序. 使用skip跳过少量的文档还可以.但是数据量非常多的话,skip就会变得非常慢,每个数据库都会有这种情况,所

WebForm 分页与组合查询

1.封装实体类 2.写查询方法 //SubjectData类 public List<Subject> Select(string name) { List<Subject> list = new List<Subject>(); cmd.CommandText = "select *from Subject where SubjectName like @a "; cmd.Parameters.Clear(); cmd.Parameters.Add

easymall项目的商品删除,前台商品分页,商品详情,购物车模块

简单的挑选一下昨天所学的重点知识模块,以备后续的复习 一.购物车模块1.1购物车两种实现的区别:!!!!!!!! 用session保存  缺点:浏览器关闭,session失效时保存在session中购物信息将会消失  后续优化,将购买的信息除了保存在session中以外,还要将购物的信息保存在cookie中,这样  就解决了浏览器关闭购买商品信息丢失的问题(但是解决不了跟换电脑信息丢失的问题)  优点:不用操作数据库,可以减少数据库访问压力 数据库中:  缺点:只用登录的用户才能添加购物车