【golang】 beego 框架实现简单分页

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 层

分页的代码片

    {{range $page := .pager.Page }} // 对 Page 数组进行遍历
  • {{ $page }}
  • {{end}}

你可能感兴趣的:(【golang】 beego 框架实现简单分页)