beego数据的分页显示

分页功能在我们平常浏览网页的时候也比较常见,这里我们先实现简单的分页功能,等到我们项目实战的时候会给大家封装一个分页函数,实现一个高级点的分页。

分页的好处:如果没有分页,我们访问完数据就要全部在页面显示,有分页之后我们可以显示部分数据,好处有一下两点。

  • 方便浏览,分页浏览可以更方便我们平常访问网页。
  • 提高访问网站速度。如果一次性把数据全部从数据库中取出来,效率没有一次取出部分数据块。

了解了上面的内容之后我们开始写代码实现分页的功能,一般开发中遇见这种大的功能模块,我们都是划分为几个小块,一点一点来实现。我们从简单到复杂来实现相应功能,首先我们先获取总页数和总记录数。

获取总记录数和总页数

首页显示代码是ShowArticleList函数,所以我们分页的业务代码也在这个函数里面。

  • 获取总记录数,orm是用count函数来获取数据的记录数,没有参数,返回值为记录数和错误信息,代码如下:
    count,err := qs.Count()
  • 获取总页数
    总页数 = 总记录数 / 每页显示的数据条数
    总记录数我们已经获取了,所以需要我们自己设置每页显示多少条数据,然后相除就可以获得,代码如下:
    //确定每页显示数
    pageSize := 2
    //获取总页数
    pageCount := count / pageSize
  • 把数据传递给视图,并在视图中显示。
    this.Data[“count”] = count
    this.Data[“pageCount”] = pageCount
    这时候你会发现,当你的最后一页显示的数据不满的话,总页数会少计算一页,原因是我们求总页数的计算是两个整数相除,除不尽的时候会自动舍去小数位。这和我们真实的业务不相符。所以我们需要修改获取总页数的代码。怎么修改呢?完全改成浮点数显然也不行,因为总页码不会是小数。这里面我们用天花板函数Ceil()。Ceil()的作用是传递过来一个浮点数,获取比这个浮点数大的又离这个浮点数最近的整数,代码如下:
    //获取总页数
    pageCount :=math.Ceil(float64(count) / float64(pageSize))
    页码这时候显示正确。

5.4.2获取首页和末页数据

获取完总页数和总记录数之后,最简单的功能模块就是首页和末页内容的显示。首页和末页,我们需要把相应的页码传递过来才能知道获取哪些数据。那视图如何给后台传递数据呢?我们在平常浏览网页的时候经常会遇到类似于这样的URL地址

http://tieba.baidu.com/f?fr=index&fp=0&ie=utf-8&red_tag=m2329796506

我们重点关注?后面的内容,他们是成对出现的,每对之间用&连接,这种是URL传值的一种。我们在后台通过GetString函数可以获取到相应的值。

  • 设置首页的超链接
    我们可以通过URL传值的方式把页码传递过来。这里我们设置首页的<a>标签超链接为/ShowArticleList?pageIndex=1

  • 获取首页数据
    我们先通过GetString()获取到页码,然后通过页码获取相应的数据。这里给大家介绍数据库获取部分数据的函数Limit()
    Limit()
    作用:获取数据库中部分数据
    参数:第一个参数是获取多少数据,第二个参数是从哪里开始取数据
    返回值是queryseter类型,示例代码如下
    qs := qs.Limit(pageSize,start)
    我们掌握了limit函数之后,现在要获取数据库中部分数据,pageSize我们已经知道了,这个start怎么去求呢?我们可以根据start的规律来找,比如说,第一页数据的起始位置是0,第二页的其实位置是2,第三页的其实位置是4,你发现起始位置刚好是页码减一乘以pageSize,由此我们得出公式。start = (pageIndex - 1) * pageSize
    那么我们获取首页的代码如下:
    //获取页码
    pageIndex,_ := this.GetInt(“pageIndex”)
    //确定数据的起始位置
    start := (pageIndex - 1) * pageSize
    //查询数据库部分数据
    qs.Limit(pageSize,start).All(&articles)
    这时候有个问题,我们从其他页面跳转到首页的时候没有指定pageIndex,所以我们需要对获取不到pageIndex的情况进行处理,处理方案:当没有获取到pageIndex的时候默认pageIndex等于1,即默认访问首页内容。修改后的代码如下:
    /

    /获取页码
    pageIndex,err := this.GetInt(“pageIndex”)
    if err != nil{
    pageIndex = 1
    }
    //确定数据的起始位置
    start := (pageIndex - 1) * pageSize
    //查询数据库部分数据
    qs.Limit(pageSize,start).All(&articles)

  • 获取末页数据只要参考着首页,把传过来的pageIndex改为总页码数即可。设置末页的链接为/ShowArticleList?pageIndex={{.pageCount}}
    这时候记得把页码也传递给视图

获取上一页和下一页数据

前面我们已经获取了首页和末页的数据,仿照着链接,我们可以把上一页下一页的链接也实现,设置上一页的超链接为/ShowArticleList?pageIndex={{.pageIndex}} - 1,但是你在index.html写了这个之后,编辑器会报错,html标签属性不能直接进行数学运算。这时候我们就要想办法,不在视图里面操作,并且给pageIndex减1,方法有很多,这里呢,老师给你们介绍一种beego处理这种简单业务逻辑的方法,视图函数

  • 视图函数(模板函数)
    使用条件:beego支持用户定义视图函数,但是必须在beego.Run()调用之前。
    设置如下:

    • 先定义函数
      func hello(in string)(out string){
      out = in + “world”
      return
      }
    • 添加映射
      添加映射是把后台的函数名和视图中调用的函数名关联起来,两个名字可以不一样。用的方法是AddFuncMap(),第一个参数是视图中调用的函数名,第二个参数是后台的函数名
      beego.AddFuncMap(“hi”,hello)这一步必须在beego.Run()之前调用
    • 在视图中调用,有两种形式
      第一种调用视图函数
      {{.Content | hi}}
      注意,这里面的.Content是传递给函数的参数,类型要一致,函数的返回值将在这里显示,只能传递一个参数
      第二种调用视图函数
      {{hi .Content}}
      第二种方法刚好和第一种方法顺序反过来,是先写函数名,再写参数,如果参数比较多,可以一直往后写。这种方法在开发中也比较常用。
    • beego默认封装的视图函数
      函数名 函数作用 使用方法
      dateformat 实现了时间的格式化,返回字符串。 {{dateformat .Time “2006-01-02T15:04:05Z07:00”}}
      date 实现了类似 PHP 的 date 函数,可以很方便的根据字符串返回时间 。 {{date .T “Y-m-d H:i:s”}}
      compare 实现了比较两个对象的比较,如果相同返回 true,否者 false。 {{compare .A .B}}
      substr 实现了字符串的截取,支持中文截取的完美截取 {{substr .Str 0 30}}
      html2str 实现了把 html 转化为字符串,剔除一些 script、css 之类的元素,返回纯文本信息 。 {{html2str .Htmlinfo}}
      str2html 实现了把相应的字符串当作 HTML 来输出,不转义 {{str2html .Strhtml}}
      还有一些其他不常用的, 可以参考开发文档了解
  • 用视图函数实现获取上一页下一页页码

    • 定义函数
      因为函数要在beego.Run()之前执行,我们可以把函数直接定义在main.go中,定义函数如下:

      //获取下一页页码
      func ShowNextPage(pageIndex int)int{
      return pageIndex + 1
      }

      //获取上一页页码
      func ShowPrePage(pageIndex int)int{
      return pageIndex - 1
      }

    • 添加映射

      beego.AddFuncMap(“next”,ShowNextPage)
      beego.AddFuncMap(“pre”,ShowPrePage)

    • 在视图中调用
      我们这里用第二种调用视图函数的方法

      <li><a href="/ShowArticleList?pageIndex={{pre .pageIndex}}">上一页 </a> </li>
       <li> <a href="/ShowArticleList?pageIndex={{next .pageIndex}}">下一页</a></li>
      

      问题:显示之后,我们点击上一页下一页发现功能实现了,但是有一个问题,一直点击上一页页码能出现负值,一直点击下一页页码能超过总页码,那我们怎么解决呢?

    • 问题解决
      页码超出范围的问题,思路:只需要在获取上一页下一页页码的时候对页码做一个判断即可,代码如下:
      //获取下一页页码
      func ShowNextPage(pageIndex int,pageCount int)int{
      if pageIndex == pageCount{
      return pageIndex
      }
      return pageIndex + 1
      }

      //获取上一页页码
      func ShowPrePage(pageIndex int)int{
      if pageIndex == 1{
      return pageIndex
      }
      return pageIndex - 1
      }

    到这里我们的分页功能就完全实现了

猜你喜欢

转载自blog.csdn.net/qq_30505673/article/details/82974378