# 13.5 實現部落格的增刪改 前面介紹了 beego 框架實現的整體構思以及部分實現的虛擬碼,這小節介紹透過 beego 建立一個部落格系統,包括部落格瀏覽、新增、修改、刪除等操作。 ## 部落格目錄 部落格目錄如下所示: . ├── controllers │   ├── delete.go │   ├── edit.go │   ├── index.go │   ├── new.go │   └── view.go ├── main.go ├── models │   └── model.go └── views ├── edit.tpl ├── index.tpl ├── layout.tpl ├── new.tpl └── view.tpl ## 部落格路由 部落格主要的路由規則如下所示: ```Go //顯示部落格首頁 beego.Router("/", &controllers.IndexController{}) //檢視部落格詳細資訊 beego.Router("/view/:id([0-9]+)", &controllers.ViewController{}) //建立部落格博文 beego.Router("/new", &controllers.NewController{}) //刪除博文 beego.Router("/delete/:id([0-9]+)", &controllers.DeleteController{}) //編輯博文 beego.Router("/edit/:id([0-9]+)", &controllers.EditController{}) ``` ## 資料庫結構 資料庫設計最簡單的部落格資訊 ```sql CREATE TABLE entries ( id INT AUTO_INCREMENT, title TEXT, content TEXT, created DATETIME, primary key (id) ); ``` ## 控制器 IndexController: ```Go type IndexController struct { beego.Controller } func (this *IndexController) Get() { this.Data["blogs"] = models.GetAll() this.Layout = "layout.tpl" this.TplName = "index.tpl" } ``` ViewController: ```Go type ViewController struct { beego.Controller } func (this *ViewController) Get() { id, _ := strconv.Atoi(this.Ctx.Input.Params()[":id"]) this.Data["Post"] = models.GetBlog(id) this.Layout = "layout.tpl" this.TplName = "view.tpl" } ``` NewController ```Go type NewController struct { beego.Controller } func (this *NewController) Get() { this.Layout = "layout.tpl" this.TplName = "new.tpl" } func (this *NewController) Post() { inputs := this.Input() var blog models.Blog blog.Title = inputs.Get("title") blog.Content = inputs.Get("content") blog.Created = time.Now() models.SaveBlog(blog) this.Ctx.Redirect(302, "/") } ``` EditController ```Go type EditController struct { beego.Controller } func (this *EditController) Get() { id, _ := strconv.Atoi(this.Ctx.Input.Params()[":id"]) this.Data["Post"] = models.GetBlog(id) this.Layout = "layout.tpl" this.TplName = "edit.tpl" } func (this *EditController) Post() { inputs := this.Input() var blog models.Blog blog.Id, _ = strconv.Atoi(inputs.Get("id")) blog.Title = inputs.Get("title") blog.Content = inputs.Get("content") blog.Created = time.Now() models.SaveBlog(blog) this.Ctx.Redirect(302, "/") } ``` DeleteController ```Go type DeleteController struct { beego.Controller } func (this *DeleteController) Get() { id, _ := strconv.Atoi(this.Ctx.Input.Params()[":id"]) blog := models.GetBlog(id) this.Data["Post"] = blog models.DelBlog(blog) this.Ctx.Redirect(302, "/") } ``` ## model 層 ```Go package models import ( "database/sql" "github.com/astaxie/beedb" _ "github.com/ziutek/mymysql/godrv" "time" ) type Blog struct { Id int `PK` Title string Content string Created time.Time } func GetLink() beedb.Model { db, err := sql.Open("mymysql", "blog/astaxie/123456") if err != nil { panic(err) } orm := beedb.New(db) return orm } func GetAll() (blogs []Blog) { db := GetLink() db.FindAll(&blogs) return } func GetBlog(id int) (blog Blog) { db := GetLink() db.Where("id=?", id).Find(&blog) return } func SaveBlog(blog Blog) (bg Blog) { db := GetLink() db.Save(&blog) return bg } func DelBlog(blog Blog) { db := GetLink() db.Delete(&blog) return } ``` ## view 層 layout.tpl ```html My Blog {{.LayoutContent}} ``` index.tpl ```html

Blog posts

``` view.tpl ```html

{{.Post.Title}}

{{.Post.Created}}
{{.Post.Content}} ``` new.tpl ```html

New Blog Post

標題:
內容:
``` edit.tpl ```html

Edit {{.Post.Title}}

New Blog Post

標題:
內容:
``` ## links * [目錄]() * 上一節:[日誌和配置設計](<13.4.md>) * 下一節:[小結](<13.6.md>)