Go基礎學習記錄 - 編寫Web應用程式 - 部落格編輯完善更新功能
每次我都會將自己實踐的程式碼放到github上並且都會打一個tag,方便後面用的同學使用,這裡我以下面分支的程式碼進行實踐分享
https://github.com/durban89/typescript_demo.git tag: 1.1.1
上篇文章【ofollow,noindex" target="_blank">Go基礎學習記錄 - 編寫Web應用程式 - 部落格編輯功能完善 】我們只是將需要的文章從資料庫讀取出來,然後在前端展示,那麼如果要修改的話,改如何操作,今天的分享繼續上篇文章
第一步、新增更新Model
既然更新,就涉及到了更新的邏輯,即如何將更新寫入資料庫,這裡我將之前的Update函式進行完善操作,將Update改為了UpdateData,主要原因是我在另外要給sqlite庫中也寫了一個Update的函式,go工具提示我重複了,這個不知道是不是go的機制的問題,同一個包下面不應該有相同的函式,暫時修改為UpdateData,不過這裡也應該是設計的問題,後面再完善下,首先先將編輯更新的邏輯完善,UpdateData的函式實現如下
// UpdateData 更新資料 func (b *Blog) UpdateData() (int64, error) { var updateString = strings.Join(b.MergeUpdate(), " , ") var whereString = strings.Join(b.MergeWhere(), " AND ") sql := fmt.Sprintf("UPDATE %s SET %s WHERE %s", tableName, updateString, whereString) stmt, err := Conn.Prepare(sql) if err != nil { return 0, err } res, err := stmt.Exec() if err != nil { return 0, err } affect, err := res.RowsAffected() if err != nil { return 0, err } return affect, nil }
當然這裡也是有問題的,推薦將要修改的引數放入Exec中,這樣應該可以預防SQL%E6%B3%A8%E5%85%A5/">SQL注入。
第二步、新增更新Controller
更新的Model有了,然後修改Controller的邏輯,修改函式ArticleEdit,程式碼實現如下
// ArticleEdit 編輯文章 func ArticleEdit(w http.ResponseWriter, r *http.Request) { id := r.URL.Query().Get("id") if id == "" { http.NotFound(w, r) return } where := []db.Where{} update := []db.UpdateSection{} if strings.ToLower(r.Method) == "get" { where = append(where, db.Where{ Name:"autokid", Value: id, }) blogModel := &models.Blog{ Select: []string{"*"}, Where:where, } p, err := blogModel.QueryOne() if err != nil { http.NotFound(w, r) return } crutime := time.Now().Unix() h := md5.New() io.WriteString(h, strconv.FormatInt(crutime, 10)) token := fmt.Sprintf("%x", h.Sum(nil)) p.Token = token helpers.RenderTemplate(w, "edit", p) } else if strings.ToLower(r.Method) == "post" { title := r.FormValue("title") if title == "" { http.Redirect(w, r, fmt.Sprintf("/edit?id=%s", id), http.StatusFound) return } update = append(update, db.UpdateSection{ Name:"title", Value: title, }) where = append(where, db.Where{ Name:"autokid", Value: id, }) blogModel := &models.Blog{ Update: update, Where:where, } _, err := blogModel.UpdateData() if err != nil { http.NotFound(w, r) return } http.Redirect(w, r, fmt.Sprintf("/edit?id=%s", id), http.StatusFound) return } }
感覺有那麼點像之前的寫法了。
第三步、新增更新View
在來修改下模板,主要是修改提交的地址。將
<form action="/save/{{.Title}}" method="POST">
更改為
<form action="/edit/?id={{.ID}}" method="POST">
想要看完成例項,請到這裡,如下
專案更新地址
https://github.com/durban89/typescript_demo.git tag: 1.1.2