和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...是關於數據庫默認信息

 

今天到此結束,你們有什麼不明白的, 歡迎聯繫我!

下篇咱們要完成下面三個任務:

一、控制器的使用

二、路由的使用

相關文章
相關標籤/搜索