123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346 |
- package utils
- import (
- // "fmt"
- html "html/template"
- con "strconv"
- "strings"
- "fmt"
- "github.com/astaxie/beego/orm"
- "math"
- )
- 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 建议开启
- TotalPages int
- }
- /**
- * 分页函数,适用任何表
- * 返回 总记录条数,总页数,以及当前请求的数据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 1 > 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.TplName = "test.html"
- }
- */
- func GetPagerLinks(po *PageOptions, requestURI string) (int, int, orm.RawSeter, html.HTML) {
- str := ""
- totalItem, totalpages, rs := GetPagesInfo(po.TableName, po.CurrentPage, po.PageSize, po.Conditions)
- po = setDefault(po, totalpages)
- DealUri(po, requestURI)
- 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)
- }
- func GetPagerHtml(requestURI string, pageIndex, pageSize, totalCount int) html.HTML {
- po := &PageOptions{
- CurrentPage: pageIndex,
- PageSize: pageSize,
- EnableFirstLastLink: true,
- ParamName: "page",
- TotalPages: int(math.Ceil(float64(totalCount) / float64(pageSize))),
- LinkItemCount: pageSize,
- }
- totalPages := int(math.Ceil(float64(totalCount) / float64(pageSize)))
- setDefault(po, totalPages)
- DealUri(po, requestURI)
- str := ""
- 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)
- }
- }
- }
- str = strings.Replace(str, "?&", "?", -1)
- //str = strings.Replace(str,"&&","&",-1)
- return html.HTML(str)
- }
- /**
- * 处理url,目的是保存参数
- */
- func DealUri(po *PageOptions, requestURI string) {
- var rs string
- if strings.Contains(requestURI, "?") {
- arr := strings.Split(requestURI, "?")
- rs = ""
- arr2 := strings.Split(arr[1], "&")
- for _, v := range arr2 {
- if !strings.Contains(v, po.ParamName) {
- if strings.HasSuffix(rs, "&") {
- rs += v
- } else {
- rs += v + "&"
- }
- //rs += "&" + v
- }
- }
- if strings.HasPrefix(rs, "&") {
- rs = string(rs[1:])
- }
- if strings.HasSuffix(rs, "&") {
- rs = string(rs[0 : strings.Count(rs, "")-1])
- }
- rs = arr[0] + "?" + rs
- fmt.Println(rs)
- } else {
- //rs = requestURI + "?" //+ po.ParamName + "time=" + con.Itoa(time.Now().Second())
- rs = requestURI + "?"
- }
- po.Href = rs
- }
- /**
- * 1...197 198 199 200
- */
- func fun4(po *PageOptions, totalPages int) string {
- rs := ""
- rs += getHeader(po, totalPages)
- rs += "<li><a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(1) + "'>" + con.Itoa(1) + "</a></li>"
- rs += "<li><a href=\"#\" class=\"@3\">...</a></li>"
- for i := totalPages - po.LinkItemCount-1; i <= totalPages; i++ {
- if po.CurrentPage != i {
- rs += "<li><a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(i) + "'>" + con.Itoa(i) + "</a></li>"
- } else {
- rs += "<li class=\"active\"><a href=\"###\">" + con.Itoa(i) + " <span class=\"sr-only\">(current)</span></a></li>"
- }
- }
- 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 += "<li><a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(1) + "'>" + con.Itoa(1) + "</a></li>"
- rs += "<li><a href=\"#\" class=\"@1\">...</a></li>"
- for i := po.CurrentPage - po.LinkItemCount/2 + 1; i <= po.CurrentPage+po.LinkItemCount/2-1; i++ {
- if po.CurrentPage != i {
- rs += "<li><a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(i) + "'>" + con.Itoa(i) + "</a></li>"
- } else {
- rs += "<li class=\"active\"><a href=\"###\">" + con.Itoa(i) + " <span class=\"sr-only\">(current)</span></a></li>"
- }
- }
- rs += "<li><a href=\"#\" class=\"@2\">...</a></li>"
- rs += "<li><a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(totalpages) + "'>" + con.Itoa(totalpages) + "</a></li>"
- rs += getFooter(po, totalpages)
- return rs
- }
- /**
- * totalpages > po.LinkItemCount po.CurrentPage < po.LinkItemCount
- * 123456789...200
- */
- func fun2(po *PageOptions, totalpages int) string {
- rs := ""
- rs += getHeader(po, totalpages)
- for i := 1; i <= po.LinkItemCount+2; i++ {
- if i == po.LinkItemCount+2 {
- rs += "<li class=\"@4\"><a href=\"" + po.Href + "&" + po.ParamName + "=" + con.Itoa(i) + "\">...</a></li>"
- } else if i == po.LinkItemCount+1 {
- rs += "<li><a href=\"" + po.Href + "&" + po.ParamName + "=" + con.Itoa(totalpages) + "\">" + con.Itoa(totalpages) + "</a></li>"
- } else {
- if po.CurrentPage != i {
- rs += "<li><a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(i) + "'>" + con.Itoa(i) + "</a></li>"
- } else {
- rs += "<li class=\"active\"><a href=\"###\">" + con.Itoa(i) + " <span class=\"sr-only\">(current)</span></a></li>"
- }
- }
- }
- 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 += "<li><a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(i) + "'>" + con.Itoa(i) + "</a></li>"
- } else {
- rs += "<li class=\"active\"><a href=\"###\">" + con.Itoa(i) + " <span class=\"sr-only\">(current)</span></a></li>"
- }
- }
- rs += getFooter(po, totalpages)
- return rs
- }
- /**
- * 头部
- */
- func getHeader(po *PageOptions, totalpages int) string {
- var rs string = "<ul class=\"pagination\">"
- if po.EnableFirstLastLink { //当首页,尾页都设定的时候,就显示
- if po.CurrentPage == 1 {
- rs += "<li" + judgeDisable(po, totalpages, 0) + " class=\"disabled\"><a href=\"###\">" + po.FirstPageText + "</a></li>"
- } else {
- rs += "<li" + judgeDisable(po, totalpages, 0) + " ><a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(1) + "'>" + po.FirstPageText + "</a></li>"
- }
- }
- if po.EnablePreNexLink { // disabled=\"disabled\"
- var a int = po.CurrentPage - 1
- if po.CurrentPage == 1 {
- a = 1
- }
- rs += "<li" + judgeDisable(po, totalpages, 0) + " ><a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(a) + "'>" + po.PrePageText + "</a></li>"
- }
- return rs
- }
- /**
- * 尾部
- */
- func getFooter(po *PageOptions, totalpages int) string {
- var rs string = ""
- if po.EnablePreNexLink {
- var a int = po.CurrentPage + 1
- rs += "<li " + judgeDisable(po, totalpages, 1) + " ><a href='" + po.Href + "&" + po.ParamName + "=" + con.Itoa(a) + "'>" + po.NextPageText + "</a></li>"
- }
- if po.EnableFirstLastLink { //当首页,尾页都设定的时候,就显示
- if po.CurrentPage == totalpages {
- rs += "<li " + judgeDisable(po, totalpages, 1) + " class=\"disabled\"><a href=\"###\">" + po.LastPageText + "</a></li>"
- } else {
- rs += "<li " + judgeDisable(po, totalpages, 1) + " ><a href=\"" + po.Href + "&" + po.ParamName + "=" + con.Itoa(totalpages) + "\">" + po.LastPageText + "</a></li>"
- }
- }
- rs += "</ul>"
- 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 = " "
- }
- } else {
- if po.CurrentPage == totalpages {
- rs = " "
- }
- }
- return rs
- }
|