mirror of
https://github.com/mindoc-org/mindoc.git
synced 2025-04-05 20:17:53 +08:00
重写分页
This commit is contained in:
parent
882d93e7b0
commit
b691a2333f
@ -19,6 +19,7 @@ import (
|
|||||||
"github.com/lifei6671/mindoc/graphics"
|
"github.com/lifei6671/mindoc/graphics"
|
||||||
"github.com/lifei6671/mindoc/models"
|
"github.com/lifei6671/mindoc/models"
|
||||||
"github.com/lifei6671/mindoc/utils"
|
"github.com/lifei6671/mindoc/utils"
|
||||||
|
"github.com/lifei6671/mindoc/utils/pagination"
|
||||||
)
|
)
|
||||||
|
|
||||||
type BookController struct {
|
type BookController struct {
|
||||||
@ -39,9 +40,8 @@ func (c *BookController) Index() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if totalCount > 0 {
|
if totalCount > 0 {
|
||||||
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, conf.PageSize, totalCount)
|
pager := pagination.NewPagination(c.Ctx.Request,totalCount,conf.PageSize)
|
||||||
|
c.Data["PageHtml"] = pager.HtmlPages()
|
||||||
c.Data["PageHtml"] = html
|
|
||||||
} else {
|
} else {
|
||||||
c.Data["PageHtml"] = ""
|
c.Data["PageHtml"] = ""
|
||||||
}
|
}
|
||||||
@ -364,9 +364,8 @@ func (c *BookController) Users() {
|
|||||||
members, totalCount, err := models.NewMemberRelationshipResult().FindForUsersByBookId(book.BookId, pageIndex, 15)
|
members, totalCount, err := models.NewMemberRelationshipResult().FindForUsersByBookId(book.BookId, pageIndex, 15)
|
||||||
|
|
||||||
if totalCount > 0 {
|
if totalCount > 0 {
|
||||||
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, 10, totalCount)
|
pager := pagination.NewPagination(c.Ctx.Request,totalCount,conf.PageSize)
|
||||||
|
c.Data["PageHtml"] = pager.HtmlPages()
|
||||||
c.Data["PageHtml"] = html
|
|
||||||
} else {
|
} else {
|
||||||
c.Data["PageHtml"] = ""
|
c.Data["PageHtml"] = ""
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ import (
|
|||||||
"github.com/lifei6671/mindoc/conf"
|
"github.com/lifei6671/mindoc/conf"
|
||||||
"github.com/lifei6671/mindoc/models"
|
"github.com/lifei6671/mindoc/models"
|
||||||
"github.com/lifei6671/mindoc/utils"
|
"github.com/lifei6671/mindoc/utils"
|
||||||
|
"github.com/lifei6671/mindoc/utils/pagination"
|
||||||
"github.com/russross/blackfriday"
|
"github.com/russross/blackfriday"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -1056,8 +1057,8 @@ func (c *DocumentController) History() {
|
|||||||
c.Data["Document"] = doc
|
c.Data["Document"] = doc
|
||||||
|
|
||||||
if totalCount > 0 {
|
if totalCount > 0 {
|
||||||
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, conf.PageSize, totalCount)
|
pager := pagination.NewPagination(c.Ctx.Request,totalCount,conf.PageSize)
|
||||||
c.Data["PageHtml"] = html
|
c.Data["PageHtml"] = pager.HtmlPages()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
"github.com/astaxie/beego"
|
"github.com/astaxie/beego"
|
||||||
"github.com/lifei6671/mindoc/models"
|
"github.com/lifei6671/mindoc/models"
|
||||||
"github.com/lifei6671/mindoc/utils"
|
"github.com/lifei6671/mindoc/utils/pagination"
|
||||||
"math"
|
"math"
|
||||||
"github.com/lifei6671/mindoc/conf"
|
"github.com/lifei6671/mindoc/conf"
|
||||||
)
|
)
|
||||||
@ -35,9 +35,8 @@ func (c *HomeController) Index() {
|
|||||||
c.Abort("500")
|
c.Abort("500")
|
||||||
}
|
}
|
||||||
if totalCount > 0 {
|
if totalCount > 0 {
|
||||||
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, pageSize, totalCount)
|
pager := pagination.NewPagination(c.Ctx.Request,totalCount,conf.PageSize)
|
||||||
|
c.Data["PageHtml"] = pager.HtmlPages()
|
||||||
c.Data["PageHtml"] = html
|
|
||||||
} else {
|
} else {
|
||||||
c.Data["PageHtml"] = ""
|
c.Data["PageHtml"] = ""
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ import (
|
|||||||
"github.com/astaxie/beego/orm"
|
"github.com/astaxie/beego/orm"
|
||||||
"github.com/lifei6671/mindoc/conf"
|
"github.com/lifei6671/mindoc/conf"
|
||||||
"github.com/lifei6671/mindoc/models"
|
"github.com/lifei6671/mindoc/models"
|
||||||
"github.com/lifei6671/mindoc/utils"
|
"github.com/lifei6671/mindoc/utils/pagination"
|
||||||
"math"
|
"math"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -54,9 +54,8 @@ func (c *LabelController) Index() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if totalCount > 0 {
|
if totalCount > 0 {
|
||||||
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, conf.PageSize, totalCount)
|
pager := pagination.NewPagination(c.Ctx.Request,totalCount,conf.PageSize)
|
||||||
|
c.Data["PageHtml"] = pager.HtmlPages()
|
||||||
c.Data["PageHtml"] = html
|
|
||||||
} else {
|
} else {
|
||||||
c.Data["PageHtml"] = ""
|
c.Data["PageHtml"] = ""
|
||||||
}
|
}
|
||||||
@ -78,9 +77,8 @@ func (c *LabelController) List() {
|
|||||||
c.ShowErrorPage(50001, err.Error())
|
c.ShowErrorPage(50001, err.Error())
|
||||||
}
|
}
|
||||||
if totalCount > 0 {
|
if totalCount > 0 {
|
||||||
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, pageSize, totalCount)
|
pager := pagination.NewPagination(c.Ctx.Request,totalCount,conf.PageSize)
|
||||||
|
c.Data["PageHtml"] = pager.HtmlPages()
|
||||||
c.Data["PageHtml"] = html
|
|
||||||
} else {
|
} else {
|
||||||
c.Data["PageHtml"] = ""
|
c.Data["PageHtml"] = ""
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ import (
|
|||||||
"github.com/lifei6671/mindoc/utils"
|
"github.com/lifei6671/mindoc/utils"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"github.com/lifei6671/mindoc/utils/pagination"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ManagerController struct {
|
type ManagerController struct {
|
||||||
@ -49,9 +50,8 @@ func (c *ManagerController) Users() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if totalCount > 0 {
|
if totalCount > 0 {
|
||||||
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, conf.PageSize, int(totalCount))
|
pager := pagination.NewPagination(c.Ctx.Request,totalCount,conf.PageSize)
|
||||||
|
c.Data["PageHtml"] = pager.HtmlPages()
|
||||||
c.Data["PageHtml"] = html
|
|
||||||
} else {
|
} else {
|
||||||
c.Data["PageHtml"] = ""
|
c.Data["PageHtml"] = ""
|
||||||
}
|
}
|
||||||
@ -286,9 +286,11 @@ func (c *ManagerController) Books() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if totalCount > 0 {
|
if totalCount > 0 {
|
||||||
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, conf.PageSize, totalCount)
|
//html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, 8, totalCount)
|
||||||
|
|
||||||
c.Data["PageHtml"] = html
|
pager := pagination.NewPagination(c.Ctx.Request,totalCount,conf.PageSize)
|
||||||
|
|
||||||
|
c.Data["PageHtml"] = pager.HtmlPages()
|
||||||
} else {
|
} else {
|
||||||
c.Data["PageHtml"] = ""
|
c.Data["PageHtml"] = ""
|
||||||
}
|
}
|
||||||
@ -564,9 +566,8 @@ func (c *ManagerController) AttachList() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if totalCount > 0 {
|
if totalCount > 0 {
|
||||||
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, conf.PageSize, int(totalCount))
|
pager := pagination.NewPagination(c.Ctx.Request,totalCount,conf.PageSize)
|
||||||
|
c.Data["PageHtml"] = pager.HtmlPages()
|
||||||
c.Data["PageHtml"] = html
|
|
||||||
} else {
|
} else {
|
||||||
c.Data["PageHtml"] = ""
|
c.Data["PageHtml"] = ""
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import (
|
|||||||
"github.com/astaxie/beego"
|
"github.com/astaxie/beego"
|
||||||
"github.com/lifei6671/mindoc/conf"
|
"github.com/lifei6671/mindoc/conf"
|
||||||
"github.com/lifei6671/mindoc/models"
|
"github.com/lifei6671/mindoc/models"
|
||||||
"github.com/lifei6671/mindoc/utils"
|
"github.com/lifei6671/mindoc/utils/pagination"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@ -42,9 +42,8 @@ func (c *SearchController) Index() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if totalCount > 0 {
|
if totalCount > 0 {
|
||||||
html := utils.GetPagerHtml(c.Ctx.Request.RequestURI, pageIndex, conf.PageSize, totalCount)
|
pager := pagination.NewPagination(c.Ctx.Request,totalCount,conf.PageSize)
|
||||||
|
c.Data["PageHtml"] = pager.HtmlPages()
|
||||||
c.Data["PageHtml"] = html
|
|
||||||
} else {
|
} else {
|
||||||
c.Data["PageHtml"] = ""
|
c.Data["PageHtml"] = ""
|
||||||
}
|
}
|
||||||
|
@ -90,14 +90,16 @@ func (m *Attachment) FindListByDocumentId(doc_id int) (attaches []*Attachment, e
|
|||||||
}
|
}
|
||||||
|
|
||||||
//分页查询附件
|
//分页查询附件
|
||||||
func (m *Attachment) FindToPager(pageIndex, pageSize int) (attachList []*AttachmentResult, totalCount int64, err error) {
|
func (m *Attachment) FindToPager(pageIndex, pageSize int) (attachList []*AttachmentResult, totalCount int, err error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
|
|
||||||
totalCount, err = o.QueryTable(m.TableNameWithPrefix()).Count()
|
total, err := o.QueryTable(m.TableNameWithPrefix()).Count()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
|
||||||
|
return nil,0,err
|
||||||
}
|
}
|
||||||
|
totalCount = int(total)
|
||||||
offset := (pageIndex - 1) * pageSize
|
offset := (pageIndex - 1) * pageSize
|
||||||
|
|
||||||
var list []*Attachment
|
var list []*Attachment
|
||||||
|
@ -231,7 +231,7 @@ func (m *Member) FindByAccount(account string) (*Member, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//分页查找用户.
|
//分页查找用户.
|
||||||
func (m *Member) FindToPager(pageIndex, pageSize int) ([]*Member, int64, error) {
|
func (m *Member) FindToPager(pageIndex, pageSize int) ([]*Member, int, error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
|
|
||||||
var members []*Member
|
var members []*Member
|
||||||
@ -253,7 +253,7 @@ func (m *Member) FindToPager(pageIndex, pageSize int) ([]*Member, int64, error)
|
|||||||
for _, m := range members {
|
for _, m := range members {
|
||||||
m.ResolveRoleName()
|
m.ResolveRoleName()
|
||||||
}
|
}
|
||||||
return members, totalCount, nil
|
return members, int(totalCount), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Member) IsAdministrator() bool {
|
func (c *Member) IsAdministrator() bool {
|
||||||
|
346
utils/pager.go
346
utils/pager.go
@ -1,346 +0,0 @@
|
|||||||
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
|
|
||||||
}
|
|
112
utils/pagination/pagination.go
Normal file
112
utils/pagination/pagination.go
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
package pagination
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"html/template"
|
||||||
|
)
|
||||||
|
|
||||||
|
//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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Pagination) HtmlPages() template.HTML {
|
||||||
|
return template.HTML(p.Pages())
|
||||||
|
}
|
||||||
|
|
||||||
|
//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()
|
||||||
|
}
|
||||||
|
|
@ -60,7 +60,7 @@
|
|||||||
{{if gt .Member.MemberId 0}}
|
{{if gt .Member.MemberId 0}}
|
||||||
<li>
|
<li>
|
||||||
<div class="img user-info" data-toggle="dropdown">
|
<div class="img user-info" data-toggle="dropdown">
|
||||||
<img src="{{cdnimg .Member.Avatar}}" class="img-circle userbar-avatar" alt="{{.Member.Account}}">
|
<img src="{{cdnimg .Member.Avatar}}" onerror="this.src='{{cdnimg "/static/images/headimgurl.jpg"}}';" class="img-circle userbar-avatar" alt="{{.Member.Account}}">
|
||||||
<div class="userbar-content">
|
<div class="userbar-content">
|
||||||
<span>{{.Member.Account}}</span>
|
<span>{{.Member.Account}}</span>
|
||||||
<div>{{.Member.RoleName}}</div>
|
<div>{{.Member.RoleName}}</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user