最近在看歐洲盃,沒空寫。今天週六恰好寫一篇。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的使用