beego 框架实现简单分页
为什么选择golang
golang 天生被设计是一门后端语言,原始支持 http/net
,以及现在比较流行的 docker
微服务。
beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API、Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornado、sinatra 和 flask 这三个框架,但是结合了 Go 本身的一些特性(interface、struct 嵌入等)而设计的一个框架。
beego 相对其他 golang 框架在开发速度方面有很大优势。
并且类似 vue 的模板语法能让我快速上手
分页的实现
分页是一般项目的最基本功能,那如何用golang 实现分页呢?
restful 风格的暂且不提,这里说的是 mvc 写法
model层
type User struct {
Id int `orm:"column(id);auto"`
UserName string `orm:"column(user_name);size(15)"`
Password string `orm:"column(password);size(32)"`
}
一个简单的 user 表
func (m *User) Insert() error {
if _, err := orm.NewOrm().Insert(m); err != nil {
return err
}
return nil
}
func (m *User) Read(fields ...string) error {
if err := orm.NewOrm().Read(m, fields...); err != nil {
return err
}
return nil
}
func (m *User) Update(fields ...string) error {
if _, err := orm.NewOrm().Update(m, fields...); err != nil {
return err
}
return nil
}
func (m *User) Delete() error {
if _, err := orm.NewOrm().Delete(m); err != nil {
return err
}
return nil
}
以及基本的cuid 功能
controller 层
controllers 对应 html 模板文件
func (this *MainController) Index() {
var (
list []*models.User
pagesize int
err error
page int
)
if page, err = strconv.Atoi(this.Ctx.Input.Param(":page")); err != nil || page < 1 {
page = 1
}
if pagesize, err = strconv.Atoi(this.getOption("pagesize")); err != nil || pagesize < 1 {
pagesize = 10
}
query := new(models.User).Query().Filter("status", 0).Filter("urltype", 0)
count, _ := query.Count()
if count > 0 {
query.All(&list)
}
this.Data["list"] = list
this.Data["pager"] = util.NewPager(page, int(count), pagesize, "")
this.TplName = "index.html"
}
util 工具函数
package util
type Pager struct {
Page []int
Totalnum int
Pagesize int
CurPage int
}
func NewPager(page, totalnum, pagesize int, url string, nopath ...bool) *Pager {
p := new(Pager)
p.Page = BuildArrByInt(page)
p.Totalnum = totalnum
p.Pagesize = pagesize
p.CurPage = totalnum/pagesize + 1
return p
}
func BuildArrByInt(num int) []int {
var arr []int
for i := 1; i <= num; i++ {
arr = append(arr, i)
}
return arr
}
这里注意,在模板中 range 无法渲染 int 类型的数据来进行遍历,所以这里用了一个工具函数BuildArrByInt
来将页数转化成数组,方便 range 遍历
view 层
分页的代码片
<ul class="pagination">
{{range $page := .pager.Page }} // 对 Page 数组进行遍历
<li
class="{{ if eq $page $.pager.CurPage }}active{{end}}"
{{ if ne $page $.pager.CurPage }}onclick="goPage({{$page}})"{{end}}
>
<a href="javascript:;">{{ $page }}</a>
</li>
{{end}}
</ul>