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

Notice: 这里由于我们上章初始化数据 bonfy follow了 rene,所以这里 bonfy 看到的 Index 页面中也有rene的Post,如果登陆rene的账户,是看不到bonfy的Post的,因为 rene 没有follow bonfy
我们现在在输入框中什么都不输入,直接点Post,就能看到 Flash 的 红色提示了

本小节 Diff
加入动态分页
应用看起来更完善了,但是在主页显示所有用户动态迟早会出问题。如果一个用户有成千上万条关注的用户动态时,会发生什么?你可以想象得到,管理这么大的用户动态列表将会变得相当缓慢和低效。
为了解决这个问题,我会将用户动态进行分页。这意味着一开始显示的只是所有用户动态的一部分,并提供链接来访问其余的用户动态。
我们先在 controller/g.go 中增加页数设置 pageLimit (其实更灵活点,也可以将它放入到配置文件中)
controller/g.go
接下来,我需要决定如何将页码并入到应用URL中。 一个相当常见的方法是使用查询字符串参数来指定一个可选的页码,如果没有给出则默认为页面1。 以下是一些示例网址,显示了我将如何实现这一点:
第1页,隐含:http://localhost:8888/
要访问查询字符串中给出的参数,我们在 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

个人主页中的分页
与首页分页类似,建立 profile 中的分页
model/post.go
vm/profile.go
templates/content/profile.html
controller/home.go

本小节 Diff
更容易地发现和关注用户
相信你已经留意到了,应用没有一个很好的途径来让用户可以找到其他用户进行关注。实际上,现在根本没有办法在页面上查看到底有哪些用户存在。我将会使用少量简单的变更来解决这个问题。
我将会创建一个新的Explore页面。该页面看起来像是主页,但是却不是只显示已关注用户的动态,而是展示所有用户的全部动态。
我们现在导航中加入Explore
templates/_base.html
然后增加 Explore 页面, 不多说了,老套路
model/post.go
vm/explore.go
templates/content/explore.html
controller/home.go
通过这些细小的变更,应用的用户体验得到了大大的提升。现在,用户可以访问发现页来查看陌生用户的动态,并通过这些用户动态来关注用户,而需要的操作仅仅是点击用户名跳转到其个人主页并点击关注链接。令人叹为观止!对吧?
此时,我建议你在应用上再次尝试一下这个功能,以便体验最后的用户接口的完善。

本小节 Diff
Links
上一节: 08-Follower
下一节: 10-Email-Support
Last updated