和lock一块儿学beego 博客系统开发为例(三)

接着上篇来写《和lock一块儿学beego 博客系统开发为例(二)mysql

这篇主要完成如下事项:git

1.模型里如何建立方法github

 2.  数据库的引用sql

 3.  beego的配置文件使用数据库

1、模型里如何建立方法app

在上篇中,咱们其实已经在模型里创建了方法,init()这个方法比较特殊,go语言中会自动加载编译其方法;除了这些方法外,咱们是否是也要创建一些经常使用对模型的操做方法,以article表为例:tcp

咱们要为博客文章添加三个方法:url

一、博客的添加.net

二、博客的编辑debug

三、博客详情获取

四、博客列表及分页

经过这几个方法的编写,会对模型有更多的了解,在这里咱们用ORM来操做表。

一、博客的添加:AddArticle

在上篇中咱们创建了article.go模型,在 models下面。

func AddArticle(updArt Article) (int64, error) {
	o := orm.NewOrm()
	o.Using("default")
	art := new(Article)

	art.Title = updArt.Title
	art.Uri = updArt.Uri
	art.Keywords = updArt.Keywords
	art.Summary = updArt.Summary
	art.Content = updArt.Content
	art.Author = updArt.Author
	art.Created = time.Now().Unix()
	art.Viewnum = 1
	art.Status = updArt.Status

	id, err := o.Insert(art)
	return id, err
}

说明:方法的参数是artilce类型也就是前面定义的struct;返回是插入的ID;在方法体中,咱们首先要新建一个ORM实例,而后经过调用其属性来赋值,直到insert。

是否是很简单??

二、博客的编辑:UpdateArticle

看了上面的添加操做,编辑是否是也相似?

func UpdateArticle(id int, updArt Article) error {
	o := orm.NewOrm()
	o.Using("default")
	art := Article{Id: id}

	art.Title = updArt.Title
	art.Uri = updArt.Uri
	art.Keywords = updArt.Keywords
	art.Summary = updArt.Summary
	art.Content = updArt.Content
	art.Author = updArt.Author
	art.Status = updArt.Status
	_, err := o.Update(&art)
	return err
}

说明:既然是编辑,确定要有条件,beego默认是以ID来做条件的,赋值,update

三、博客的详情获取:GetArticle

经过ID来获取文章内容

func GetArticle(id int) (Article, error) {
	o := orm.NewOrm()
	o.Using("default")
	art := Article{Id: id}
	err := o.Read(&art)
	return art, err
}

其实不用说明,看程序也明了,经过ID获取,读取详情

四、博客列表及分页:ListArticle

博客列表的有点复杂,不过也简单,咱们为了写个通用的列表分页,博客的获取确定也是有条件的,有页数,数据偏移数等

func ListArticle(condArr map[string]string, page int, offset int) (num int64, err error, art []Article) {
	o := orm.NewOrm()
	qs := o.QueryTable("article")
	cond := orm.NewCondition()
	if condArr["title"] != "" {
		cond = cond.And("title__icontains", condArr["title"])
	}
	if condArr["keywords"] != "" {
		cond = cond.Or("keywords__icontains", condArr["keywords"])
	}
	if condArr["status"] != "" {
		//status, _ := strconv.Atoi(condArr["status"])
		cond = cond.And("status", condArr["status"])
	}
	qs = qs.SetCond(cond)
	if page < 1 {
		page = 1
	}
	if offset < 1 {
		offset = 10
	}
	start := (page - 1) * offset
	var articles []Article
	num, err1 := qs.Limit(offset, start).All(&articles)
	return num, err1, articles
}

说明: 咱们在给条件定义了一个map类型,字符串类型的,方法体中,能够根据传递的条件,进行筛选,同时用到beego的高级查询方法。

顺便补充一个方法,模板中分页,还要用到分页总数,与列表方法很相似

func CountArticle(condArr map[string]string) int64 {
	o := orm.NewOrm()
	qs := o.QueryTable("article")
	cond := orm.NewCondition()
	if condArr["title"] != "" {
		cond = cond.And("title__icontains", condArr["title"])
	}
	if condArr["keywords"] != "" {
		cond = cond.Or("keywords__icontains", condArr["keywords"])
	}
	if condArr["status"] != "" {
		cond = cond.And("status", condArr["status"])
	}
	num, _ := qs.SetCond(cond).Count()
	return num
}

好了,到此,应该对model方法的定义有了解了吧;写相似的模型应该也差很少。

2、 数据库的引用

上面介绍了在模型中怎么写方法来操做表,但数据库怎么引用链接了?beego提供多种数据库驱动,在这里咱们以mysql为例。

在每一个模型的开头,咱们都会引用:

"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"

一个是引用orm来操做,一个引用mysql驱动。

咱们在model中init方法中也能够注册驱动,如上面的article方法,咱们能够这样:

func init() {
	orm.RegisterDriver("mysql", orm.DRMySQL)
	orm.RegisterDataBase("default", "mysql", "root:@/blog?charset=utf8", 30)
	orm.RegisterModel(new(Article))
	orm.RunSyncdb("default", false, true)
}

具体的意思能够查看beego文档。

若是有许多个模型,难道咱们要在每一个模型的初始化方法注册驱动??其实咱们能够在其它地方

在src/blog下新建一个文件夹,initial文件夹,这个文件主要存放咱们初始化的一些文件,像数据库这类就能够放在里面sql.go:

package initial

import (
	"fmt"

	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"
)

func InitSql() {
	user := beego.AppConfig.String("mysqluser")
	passwd := beego.AppConfig.String("mysqlpass")
	host := beego.AppConfig.String("mysqlurls")
	port, err := beego.AppConfig.Int("mysqlport")
	dbname := beego.AppConfig.String("mysqldb")
	if nil != err {
		port = 3306
	}
	orm.Debug = true
	orm.RegisterDriver("mysql", orm.DRMySQL)
	//orm.RegisterDataBase("default", "mysql", "root:@/blog?charset=utf8", 30)
	orm.RegisterDataBase("default", "mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8", user, passwd, host, port, dbname))

}

说明:引用mysql驱动,读取beego配置文件,在开发环境下,要以开放debug为true,在生产环境下,必定要刻去掉。

为了方便,咱们在Inital下再创建一个文件,方便全引用

package initial

func init() {
	InitSql()
	InitTplFunc()
}

InitTplFunc这个方法是模板中自定义方法引用,在这里先不介绍。

这样在Models下每一个模型就不用定义引用了驱动了。怎么引用了,固然在main.go 引用

package main

import (
	_ "blog/routers"

	_ "blog/initial"
	//"fmt"
	//"strconv"

	"github.com/astaxie/beego"
	//"github.com/astaxie/beego/context"
)

数据库的引用到此,也就结束了。你们有什么不是明白,能够联系我。

3、  beego的配置文件使用

在上面的数据库中,咱们也用到配置文件,只是没有介绍。

如何引用配置文件里参数,能够使用:

beego.AppConfig.String(xx)
beego.AppConfig.Int(xx)

配置文件在conf/app.conf下

appname = blog
httpport = 8080
runmode = dev
copyrequestbody = true

mysqluser = "root"
mysqlpass = ""
mysqlurls = "127.0.0.1"
mysqldb = "blog"
mysqlport = "3306"

appname: 项目名称

httpport:端口号

runmode:dev开发模式

copyrequestbody:获取内容

mysql...是关于数据库默认信息

 

今天到此结束,你们有什么不明白的, 欢迎联系我!

下篇咱们要完成下面三个任务:

一、控制器的使用

二、路由的使用

相关文章
相关标签/搜索