和lock一塊兒學beego 博客系統開發爲例(四)

最近在看歐洲盃,沒空寫。今天週六恰好寫一篇。html

接着上篇來寫《和lock一塊兒學beego 博客系統開發爲例(三)git

這篇主要完成如下事項:github

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

一、控制器的使用json

二、路由的使用session

1、控制器的使用學習

前面一直是以article表爲例,控制器也是以article爲例。this

beego通常都在controllers文件下面,你也能夠在裏面創建子文件夾,能夠根據項目的須要來劃分,不過在控制器文件中,包的名稱要對應起文件夾名稱。.net

在controllers創建article.gocode

在這個文件裏,包含4個方法

一、添加博客

二、編輯博客

三、博客列表

四、博客詳情

下面詳細介紹這個4個方法

一、添加博客方法

package controllers

import (
	. "blog/models"
	"strconv"

	"github.com/astaxie/beego"
	"github.com/astaxie/beego/utils/pagination"
)

//添加blog
type AddArticleController struct {
	BaseController
}

func (this *AddArticleController) Get() {
	if !this.isLogin {
		this.Redirect("/login", 302)
		return
	}
	/*userLogin := this.GetSession("userLogin")
	if userLogin == nil {
		this.Redirect("/login", 302)
		return
	}
	*/
	var art Article
	art.Status = 1
	this.Data["art"] = art
	this.TplName = "article-form.tpl"
}

func (this *AddArticleController) Post() {
	if !this.isLogin {
		this.Data["json"] = map[string]interface{}{"code": 0, "message": "請先登陸"}
		this.ServeJSON()
		return
	}
	title := this.GetString("title")
	content := this.GetString("content")
	keywords := this.GetString("keywords")
	uri := this.GetString("uri")
	summary := this.GetString("summary")
	author := this.GetString("author")

	if "" == title {
		this.Data["json"] = map[string]interface{}{"code": 0, "message": "請填寫標題"}
		this.ServeJSON()
		return
	}

	if "" == content {
		this.Data["json"] = map[string]interface{}{"code": 0, "message": "請填寫內容"}
		this.ServeJSON()
		return
	}

	var art Article
	art.Title = title
	art.Keywords = keywords
	art.Uri = uri
	art.Summary = summary
	art.Content = content
	art.Author = author

	id, err := AddArticle(art)
	if err == nil {
		this.Data["json"] = map[string]interface{}{"code": 1, "message": "博客添加成功", "id": id}
	} else {
		this.Data["json"] = map[string]interface{}{"code": 0, "message": "博客添加出錯"}
	}
	this.ServeJSON()
}

說明一下,定義了一個結構,addArticle,繼承了baseController.這後面再介紹。beego裏默認有Get,Post等方法,咱們在addArticle裏重寫了Get和Post方法,這個在URL直接訪問的時候直接調用Get方法,在作添加操做的時候Post提交請求。固然在這裏你也能夠用其它名稱,不過在路由器裏要指定定義的方法,若是採用默認的,在路由器裏不用指定方法。

二、編輯博客方法

編輯方法能夠與添加方法合併,不過這裏方便作學習介紹,單獨出來講一說,其它就是Post方法重寫。

/修改blog
type EditArticleController struct {
	BaseController
}

func (this *EditArticleController) Get() {
	if !this.isLogin {
		this.Data["json"] = map[string]interface{}{"code": 0, "message": "請先登陸"}
		this.ServeJSON()
		return
	}
	idstr := this.Ctx.Input.Param(":id")
	id, err := strconv.Atoi(idstr)

	art, err := GetArticle(id)
	if err != nil {
		this.Redirect("/404.html", 302)
	}
	//this.Data["json"] = map[string]interface{}{"code": 0, "message": err}
	//this.ServeJSON()
	this.Data["art"] = art

	this.TplName = "article-form.tpl"
}

func (this *EditArticleController) Post() {
	id, err := this.GetInt("id")
	title := this.GetString("title")
	content := this.GetString("content")
	keywords := this.GetString("keywords")
	uri := this.GetString("uri")
	summary := this.GetString("summary")
	author := this.GetString("author")
	status, _ := this.GetInt("status")

	if "" == title {
		this.Data["json"] = map[string]interface{}{"code": 0, "message": "請填寫標題"}
		this.ServeJSON()
	}

	if "" == content {
		this.Data["json"] = map[string]interface{}{"code": 0, "message": "請填寫內容"}
		this.ServeJSON()
	}
	_, errAttr := GetArticle(id)
	if errAttr != nil {
		this.Data["json"] = map[string]interface{}{"code": 0, "message": "博客不存在"}
		this.ServeJSON()
	}

	var art Article
	art.Title = title
	art.Keywords = keywords
	art.Uri = uri
	art.Summary = summary
	art.Content = content
	art.Author = author
	art.Status = status

	err = UpdateArticle(id, art)

	if err == nil {
		this.Data["json"] = map[string]interface{}{"code": 1, "message": "博客修改爲功", "id": id}
	} else {
		this.Data["json"] = map[string]interface{}{"code": 0, "message": "博客修改出錯"}
	}
	this.ServeJSON()
}

說明:就是一Get,一個Post的重寫,裏面用ORM來操做和引用模型裏定義的方法。這裏說一下beego的json返回是:

this.Data["json"] = map[string]interface{}{"code": 1, "message": "message"}
this.ServeJSON()

三、博客列表

//列表
type ListArticleController struct {
	BaseController
}

func (this *ListArticleController) Get() {
	page, err1 := this.GetInt("p")
	title := this.GetString("title")
	keywords := this.GetString("keywords")
	status := this.GetString("status")
	if err1 != nil {
		page = 1
	}

	offset, err2 := beego.AppConfig.Int("pageoffset")
	if err2 != nil {
		offset = 9
	}

	condArr := make(map[string]string)
	condArr["title"] = title
	condArr["keywords"] = keywords
	if !this.isLogin {
		condArr["status"] = "1"
	} else {
		condArr["status"] = status
	}
	countArticle := CountArticle(condArr)

	paginator := pagination.SetPaginator(this.Ctx, offset, countArticle)
	_, _, art := ListArticle(condArr, page, offset)

	this.Data["paginator"] = paginator
	this.Data["art"] = art
	//userLogin := this.GetSession("userLogin")
	//this.Data["isLogin"] = userLogin
	//this.Data["isLogin"] = this.isLogin

	this.TplName = "article.tpl"
}

說明:調用了文章模型裏ListArticle的方法來分頁,分頁要引用beego裏「github.com/astaxie/beego/utils/pagination」,

SetPaginator(當前內容,顯示條數,總數)。模型裏ListArticle引用ORM裏採用Limit 10 Offset 10的,與Limit 0,10是不同的,要注意一下!

四、博客詳情

詳情不只要顯示博客的內容,還要顯示博客的評論。

//詳情
type ShowArticleController struct {
	BaseController
}

func (this *ShowArticleController) Get() {
	idstr := this.Ctx.Input.Param(":id")
	id, err := strconv.Atoi(idstr)

	art, err := GetArticle(id)
	if err != nil {
		this.Redirect("/404.html", 302)
	}
	if !this.isLogin {
		if art.Status == 0 {
			this.Redirect("/404.html", 302)
		}
	}
	this.Data["art"] = art

	//評論分頁
	page, err1 := this.GetInt("p")
	if err1 != nil {
		page = 1
	}
	offset, err2 := beego.AppConfig.Int("pageoffset")
	if err2 != nil {
		offset = 9
	}
	condCom := make(map[string]string)
	condCom["article_id"] = idstr
	if !this.isLogin {
		condCom["status"] = "1"
	}
	countComment := CountComment(condCom)
	paginator := pagination.SetPaginator(this.Ctx, offset, countComment)
	_, _, coms := ListComment(condCom, page, offset)
	this.Data["paginator"] = paginator
	this.Data["coms"] = coms

	this.TplName = "article-detail.tpl"
}

小結:到此控制器介紹完畢,是否是很簡單,對正常的CRUD來講,直接定義一個結構,再重寫Get和Post方法,基本上是能夠正常顯示。

2、路由的使用

路由的具體使用,能夠果看Beego有官網,這裏介紹僅僅對博客的路由介紹

路由在routers下router.go下,在路由下,你首先得引用控制器,這樣在init方法裏才能夠調用其方法

package routers

import (
	"blog/controllers"

	"github.com/astaxie/beego"
)

func init() {
	beego.Router("/", &controllers.ListArticleController{})
	beego.Router("/404.html", &controllers.BaseController{}, "*:Go404")

	beego.Router("/article", &controllers.ListArticleController{})
	beego.Router("/article/:id", &controllers.ShowArticleController{})

	beego.Router("/login", &controllers.LoginUserController{})
	beego.Router("/logout", &controllers.LogoutUserController{})

	beego.Router("/article/add", &controllers.AddArticleController{})
	beego.Router("/article/edit/:id", &controllers.EditArticleController{})

	beego.Router("/comment/add", &controllers.AddCommentController{})
	beego.Router("/comment/edit/status", &controllers.EditCommentController{})

	beego.Router("/album", &controllers.ListAlbumController{})
	beego.Router("/album/upload", &controllers.UploadAlbumController{})
	beego.Router("/album/edit", &controllers.EditAlbumController{})

	beego.Router("/about", &controllers.AboutUserController{})

	beego.Router("/uploadmulti", &controllers.UploadMultiController{})
	beego.Router("/upload", &controllers.UploadController{})

	//beego.Router("/article/ajax/add", &controllers.AddArticleController{}, "*:AddPost")
	//beego.Router("/article/add", &controllers.AddArticleController{}, "*:Add")
}

一些格式能夠參考上面寫的,你們應該能夠看明白。

是否是很簡單,有些像diago的路由吧!

好了,今天就寫到這裏吧,有什麼不明白的,能夠聯繫我,下篇主要介紹:

一、模板的使用

二、基控制器BaseController的定義

三、session的使用

相關文章
相關標籤/搜索