From e9251125151e727a43161c367fa4e2221f83104c Mon Sep 17 00:00:00 2001 From: John Date: Sun, 22 Apr 2018 20:44:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90gpage?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91=EF=BC=8C?= =?UTF-8?q?=E5=BE=85=E8=BF=9B=E4=B8=80=E6=AD=A5=E5=AE=8C=E5=96=84=E7=BB=86?= =?UTF-8?q?=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/util/gpage/gpage.go | 275 +++++++++++++++++++++++++----------------- geg/util/gpage.go | 16 +++ 2 files changed, 181 insertions(+), 110 deletions(-) create mode 100644 geg/util/gpage.go diff --git a/g/util/gpage/gpage.go b/g/util/gpage/gpage.go index a0d449b31..9a8dafed9 100644 --- a/g/util/gpage/gpage.go +++ b/g/util/gpage/gpage.go @@ -8,71 +8,88 @@ package gpage import ( - "gitee.com/johng/gf/g/net/ghttp" - "math" "fmt" - "net/url" - "gitee.com/johng/gf/g/util/gconv" + "math" "strings" + url2 "net/url" + "gitee.com/johng/gf/g/util/gconv" ) +// 分页对象 type Page struct { - pageName string // 分页参数名称 - nextPageTag string // 下一页标签 - prevPageTag string // 上一页标签 - firstPageTag string // 首页标签 - lastPageTag string // 尾页标签 - - prevBar string // 上一分页条 - nextBar string // 下一分页条 - formatLeft string - formatRight string - isAjax bool // 是否支持AJAX分页模式 - totalSize int - pagebarNum int // 控制记录条的个数。 - totalPage int // 总页数 - ajaxActionName string // AJAX动作名 - currentPage int // 当前页 - url string // url地址头 - offset int + pageName string // 分页参数名称 + nextPageTag string // 下一页标签 + prevPageTag string // 上一页标签 + firstPageTag string // 首页标签 + lastPageTag string // 尾页标签 + prevBar string // 上一分页条 + nextBar string // 下一分页条 + totalSize int // 总共条数 + pageBarNum int // 控制记录条的个数 + totalPage int // 总页数 + currentPage int // 当前页 + offset int // 分页的offset条数 + url *url2.URL // URL对象 + route string // 路由规则 + ajaxActionName string // AJAX动作名,当该属性有值时,表示使用AJAX分页 } -func New(totalSize, perPage, currentPage int, url string) *Page { +// 创建一个分页对象,输入参数分别为: +// 总数量、每页数量、当前页码、当前的URL(可以只是URI+QUERY)、(可选)路由规则(例如: /user/list/:page、/order/list/*page) +func New(totalSize, perPage, currentPage int, url string, route...string) *Page { + u, _ := url2.Parse(url) page := &Page { - pageName : "page", - totalSize : totalSize, - totalPage : int(math.Ceil(float64(totalSize/perPage))), - currentPage : currentPage, - offset : (currentPage - 1)*perPage, - url : url, + pageName : "page", + prevPageTag : "<", + nextPageTag : ">", + firstPageTag : "|<", + lastPageTag : ">|", + prevBar : "<<", + nextBar : ">>", + totalSize : totalSize, + totalPage : int(math.Ceil(float64(totalSize/perPage))), + currentPage : currentPage, + offset : (currentPage - 1)*perPage, + pageBarNum : 10, + url : u, } - if strings.Index(url, "?") != -1 { - page.url = url + "&" - } else { - page.url = url + "?" + if len(route) > 0 { + page.route = route[0] } - page.url += page.pageName + "=" return page } // 启用AJAX分页 func (page *Page)EnableAjax(actionName string) { - page.isAjax = true page.ajaxActionName = actionName } // 获取显示"下一页"的内容. -func (page *Page) nextPage(curStyle , style string) string { +func (page *Page) nextPage(styles ... string) string { + var curStyle, style string + if len(styles) > 0 { + curStyle = styles[0] + } + if len(styles) > 1 { + style = styles[0] + } if page.currentPage < page.totalPage { - return page._getLink(page._getUrl(page.currentPage + 1), page.nextPageTag, "下一页", style) + return page.getLink(page.getUrl(page.currentPage + 1), page.nextPageTag, "下一页", style) } return fmt.Sprintf(`%s`, curStyle, page.nextPageTag) } /// 获取显示“上一页”的内容 -func (page *Page) prevPage(curStyle , style string) string { +func (page *Page) prevPage(styles ... string) string { + var curStyle, style string + if len(styles) > 0 { + curStyle = styles[0] + } + if len(styles) > 1 { + style = styles[0] + } if page.currentPage > 1 { - return page._getLink(page._getUrl(page.currentPage - 1), page.prevPageTag, "上一页", style) + return page.getLink(page.getUrl(page.currentPage - 1), page.prevPageTag, "上一页", style) } return fmt.Sprintf(`%s`, curStyle, page.prevPageTag) } @@ -82,43 +99,66 @@ func (page *Page) prevPage(curStyle , style string) string { * * @return string */ -func (page *Page)firstPage(curStyle, style string) string { +func (page *Page)firstPage(styles ... string) string { + var curStyle, style string + if len(styles) > 0 { + curStyle = styles[0] + } + if len(styles) > 1 { + style = styles[0] + } if page.currentPage == 1 { return fmt.Sprintf(`%s`, curStyle, page.firstPageTag) } - return page._getLink(page._getUrl(1), page.firstPageTag, "第一页", style) + return page.getLink(page.getUrl(1), page.firstPageTag, "第一页", style) } // 获取显示“尾页”的内容 -func (page *Page)lastPage(curStyle, style string) string { +func (page *Page)lastPage(styles ... string) string { + var curStyle, style string + if len(styles) > 0 { + curStyle = styles[0] + } + if len(styles) > 1 { + style = styles[0] + } if page.currentPage == page.totalPage { return fmt.Sprintf(`%s`, curStyle, page.lastPageTag) } - return page._getLink(page._getUrl(page.totalPage), page.lastPageTag, "最后页", style) + return page.getLink(page.getUrl(page.totalPage), page.lastPageTag, "最后页", style) } // 获得分页条。 -func (page *Page) nowBar(curStyle, style string) string { - plus := int(math.Ceil(float64(page.pagebarNum / 2))) - if page.pagebarNum - plus + page.currentPage > page.totalPage { - plus = page.pagebarNum - page.totalPage + page.currentPage +func (page *Page) nowBar(styles ... string) string { + var curStyle, style string + if len(styles) > 0 { + curStyle = styles[0] + } + if len(styles) > 1 { + style = styles[0] + } + plus := int(math.Ceil(float64(page.pageBarNum / 2))) + if page.pageBarNum - plus + page.currentPage > page.totalPage { + plus = page.pageBarNum - page.totalPage + page.currentPage } begin := page.currentPage - plus + 1 if begin < 1 { begin = 1 } ret := "" - for i := begin; i < begin + page.pagebarNum; i++ { + for i := begin; i < begin + page.pageBarNum; i++ { if i <= page.totalPage { if i != page.currentPage { - ret += page._getText(page._getLink(page._getUrl(i), gconv.String(i), style, "")) + ret += page.getLink(page.getUrl(i), gconv.String(i), style, "") } else { - ret += page._getText(fmt.Sprintf(`%d`, curStyle, i)) + ret += fmt.Sprintf(`%d`, curStyle, i) } } else { break } - ret += "\n" + if i != begin + page.pageBarNum - 1 { + ret += "\n" + } } return ret } @@ -128,8 +168,7 @@ func (page *Page) nowBar(curStyle, style string) string { * @return string */ func (page *Page) selectBar() string { - url := page._getUrl("' + this.value") - ret := fmt.Sprintf(``, page.url) for i := 1; i <= page.totalPage; i++ { if (i == page.currentPage) { ret += fmt.Sprintf(``, i, i) @@ -141,73 +180,89 @@ func (page *Page) selectBar() string { return ret } -/** -* 控制分页显示风格(你可以继承后增加相应的风格) -* -* @param int mode 显示风格分类。 -* @return string -*/ -func (page *Page)show(mode int) string { - //switch (mode) { - //case '1': - //page.nextPage = '下一页' - //page.prevPage = '上一页' - //return page.prevPage()."{page.currentPage}".page.nextPage() - //break - // - //case '2': - //page.nextPage = '下一页>>' - //page.prevPage = '<<上一页' - //page.firstPage = '首页' - //page.lastPage = '尾页' - //return page.firstPage().page.prevPage().'[第'.page.currentPage.'页]'.page.nextPage().page.lastPage().'第'.page.select().'页' - //break - // - //case '3': - //page.nextPage = '下一页' - //page.prevPage = '上一页' - //page.firstPage = '首页' - //page.lastPage = '尾页' - //pageStr = page.firstPage()." ".page.prevPage() - //pageStr .= ' '.page.nowbar('current') - //pageStr .= ' '.page.nextPage()." ".page.lastPage() - //pageStr .= "当前页{page.currentPage}/{page.totalPage} 共{page.totalSize}条" - //return pageStr - //break - // - //case '4': - //page.nextPage = '下一页' - //page.prevPage = '上一页' - //page.firstPage = '首页' - //page.lastPage = '尾页' - //pageStr = page.firstPage()." ".page.prevPage() - //pageStr .= ' '.page.nowbar('current') - //pageStr .= ' '.page.nextPage()." ".page.lastPage() - //return pageStr - //break - //} +// 预定义的分页显示风格内容 +func (page *Page) GetContent(mode int) string { + switch (mode) { + case 1: + page.nextPageTag = "下一页" + page.prevPageTag = "上一页" + return fmt.Sprintf(`%s %d %s`, page.prevPage(), page.currentPage, page.nextPage()) + + + case 2: + page.nextPageTag = "下一页>>" + page.prevPageTag = "<<上一页" + page.firstPageTag = "首页" + page.lastPageTag = "尾页" + return fmt.Sprintf(`%s%s [第%d页] %s%s 第%s页`, + page.firstPage(), page.prevPage(), page.currentPage, page.nextPage(), page.lastPage(), page.selectBar()) + + + case 3: + page.nextPageTag = "下一页" + page.prevPageTag = "上一页" + page.firstPageTag = "首页" + page.lastPageTag = "尾页" + pageStr := page.firstPage() + "\n" + pageStr += page.prevPage() + "\n" + pageStr += page.nowBar("current") + "\n" + pageStr += page.nextPage() + "\n" + pageStr += page.lastPage() + "\n" + pageStr += fmt.Sprintf(`当前页%d/%d 共%d条`, page.currentPage, page.totalPage, page.totalSize) + return pageStr + + + case 4: + page.nextPageTag = "下一页" + page.prevPageTag = "上一页" + page.firstPageTag = "首页" + page.lastPageTag = "尾页" + pageStr := page.firstPage() + "\n" + pageStr += page.prevPage() + "\n" + pageStr += page.nowBar("current") + "\n" + pageStr += page.nextPage() + "\n" + pageStr += page.lastPage() + "\n" + return pageStr + } return "" } // 为指定的页面返回地址值 -func (page *Page) _getUrl(pageNoStr string) string { - return page.url + pageNoStr -} - -// 获取分页显示文字,比如说默认情况下_getText('1')将返回[1] -func (page *Page)_getText(str string) string { - return page.formatLeft + str + page.formatRight +func (page *Page) getUrl(pageNo int) string { + url := *page.url + if len(page.url.RawQuery) > 0 && len(page.url.Query().Get(page.pageName)) > 0 { + values := page.url.Query() + values.Set(page.pageName, gconv.String(pageNo)) + url.RawQuery = values.Encode() + } else { + // 这里基于路由匹配的URL页码替换比较简单,但能满足绝大多数场景 + index := -1 + array := strings.Split(page.route, "/") + for k, v := range array { + if strings.EqualFold(v, ":" + page.pageName) || strings.EqualFold(v, "*" + page.pageName) { + index = k + break + } + } + // 替换url.Path中的分页码 + if index != -1 { + array := strings.Split(page.url.Path, "/") + array[index] = gconv.String(pageNo) + url.Path = strings.Join(array, "/") + } + } + return url.String() } // 获取链接地址 -func (page *Page)_getLink(url, text, title, style string) string { +func (page *Page) getLink(url, text, title, style string) string { if len(style) > 0 { - style = fmt.Sprintf(`class="%s"`, style) + style = fmt.Sprintf(`class="%s" `, style) } - if (page.isAjax) { - return fmt.Sprintf(`%s`, style, page.ajaxActionName, url, text) + if len(page.ajaxActionName) > 0 { + return fmt.Sprintf(`%s`, style, page.ajaxActionName, url, text) } else { - return fmt.Sprintf(`"%s"`, style, url, title, text) + return fmt.Sprintf(`%s`, style, url, title, text) } } diff --git a/geg/util/gpage.go b/geg/util/gpage.go new file mode 100644 index 000000000..d06875634 --- /dev/null +++ b/geg/util/gpage.go @@ -0,0 +1,16 @@ +package main + +import ( + "fmt" + "gitee.com/johng/gf/g/util/gpage" +) + +func main() { + // 基本分页示例 + page1 := gpage.New(100, 10, 1, "http://xxx.xxx.xxx/user/list?page=1&type=10#anchor") + fmt.Println(page1.GetContent(3)) + + // 基于静态链接的分页示例 + page2 := gpage.New(100, 10, 1, "http://xxx.xxx.xxx/user/list/1?type=10#anchor", "/user/list/:page") + fmt.Println(page2.GetContent(3)) +} \ No newline at end of file