09-Pagination

在本章,我将告诉你如何对数据列表进行分页。

第八章我们支持了社交网络非常流行的“粉丝”机制。 有了这个功能,接下来我准备好删除一开始就使用的模拟用户动态了。 在本章中,应用将开始接受来自用户的动态更新,并将其发布到网站首页和个人主页。

本章的GitHub链接为: Source, Diff, Zip

发布用户动态

简言之,就是发布Post,首页需要有一个表单,用户可以在其中键入新动态。

不过在这之前,我们先支持下 flash message

controller/g.go

...
var (
    homeController home
    templates      map[string]*template.Template
    sessionName    string
    flashName      string
    store          *sessions.CookieStore
)

func init() {
    templates = PopulateTemplates()
    store = sessions.NewCookieStore([]byte("something-very-secret"))
    sessionName = "go-mega"
    flashName = "go-flash"
}
...

controller/utils.go

然后我们就可以使用 flash message 来提示 error message了

现在我们来完成发布Post功能

vm/index.go

Notice: 这里我们顺便将 IndexView 里的 Posts 改成 CurrentUser 的 FollowingPosts

templates/content/index.html

controller/home.go

09-01

Notice: 这里由于我们上章初始化数据 bonfy follow了 rene,所以这里 bonfy 看到的 Index 页面中也有rene的Post,如果登陆rene的账户,是看不到bonfy的Post的,因为 rene 没有follow bonfy

我们现在在输入框中什么都不输入,直接点Post,就能看到 Flash 的 红色提示了

09-02

本小节 Diff

加入动态分页

应用看起来更完善了,但是在主页显示所有用户动态迟早会出问题。如果一个用户有成千上万条关注的用户动态时,会发生什么?你可以想象得到,管理这么大的用户动态列表将会变得相当缓慢和低效。

为了解决这个问题,我会将用户动态进行分页。这意味着一开始显示的只是所有用户动态的一部分,并提供链接来访问其余的用户动态。

我们先在 controller/g.go 中增加页数设置 pageLimit (其实更灵活点,也可以将它放入到配置文件中)

controller/g.go

接下来,我需要决定如何将页码并入到应用URL中。 一个相当常见的方法是使用查询字符串参数来指定一个可选的页码,如果没有给出则默认为页面1。 以下是一些示例网址,显示了我将如何实现这一点:

要访问查询字符串中给出的参数,我们在 utils 中创建一个函数,方便以后调用

在 vm 中建立分页的 BasePageViewModel

  • PrevPage: 上一页的页码

  • NextPage: 下一页的页码

  • Total: 总页数

  • CurrentPage: 当前页码

  • Limit: 每页显示项目数

vm/g.go

首页中的分页

model 中增加 FollowingPosts 的分页处理

model/user.go

index 的 vm 中加入 BasePageViewModel

vm/index.go

显示页中加入页码

templates/content/index.html

Notice: 这里我们顺便在 Posts显示的时候将 Username 上加了 “/user/username” 的链接,方便我们快速访问用户profile

controller修改成新的 GetVM

09-03

个人主页中的分页

与首页分页类似,建立 profile 中的分页

model/post.go

vm/profile.go

templates/content/profile.html

controller/home.go

09-04

本小节 Diff

更容易地发现和关注用户

相信你已经留意到了,应用没有一个很好的途径来让用户可以找到其他用户进行关注。实际上,现在根本没有办法在页面上查看到底有哪些用户存在。我将会使用少量简单的变更来解决这个问题。

我将会创建一个新的Explore页面。该页面看起来像是主页,但是却不是只显示已关注用户的动态,而是展示所有用户的全部动态。

我们现在导航中加入Explore

templates/_base.html

然后增加 Explore 页面, 不多说了,老套路

model/post.go

vm/explore.go

templates/content/explore.html

controller/home.go

通过这些细小的变更,应用的用户体验得到了大大的提升。现在,用户可以访问发现页来查看陌生用户的动态,并通过这些用户动态来关注用户,而需要的操作仅仅是点击用户名跳转到其个人主页并点击关注链接。令人叹为观止!对吧?

此时,我建议你在应用上再次尝试一下这个功能,以便体验最后的用户接口的完善。

09-05

本小节 Diff

Last updated