這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
做了一個簡易留言板系統,練練手,用到了7個包,呵呵.以後要多寫寫東西,這樣進步比較快.
main.go
// Golang簡易留言板系統// Author: dotcoo zhao // mysql// CREATE TABLE liuyan (// id int primary key auto_increment not null,// name varchar(20) not null,// url varchar(100) not null,// content varchar(1000) not null,// time int// ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci; // sqlite3// CREATE TABLE liuyan (// id integer primary key autoincrement,// name text,// url text,// content text,// time integer// );package main import ( "database/sql" "io" "net/http" "strings" "text/template" "time" // "github.com/ziutek/mymysql/godrv" _ "github.com/mattn/go-sqlite3") // 留言結構type Liuyan struct { Id int Name string Url string Content string Time int} // // 顯示留言時間// func (l Liuyan) ShowTime() string {// t := time.Unix(int64(l.Time), 0)// return t.Format("2006-01-02 15:04:05")// } func ShowTime(timeUnix int) string { t := time.Unix(int64(timeUnix), 0) return t.Format("2006-01-02 15:04:05")} // 全域變數var db *sql.DBvar view *template.Template func main() { // godrv.Register("SET NAMES utf8") // 串連資料庫 var err error // db, err := sql.Open("mymysql", "tcp:127.0.0.1:3306*go/root/123456") db, err = sql.Open("sqlite3", "./liuyan.db") if err != nil { panic(err) } defer db.Close() // 準備模板 err = LoadTemplate() if err != nil { panic(err) } // 註冊處理函數 http.HandleFunc("/load", loadHandler) http.HandleFunc("/", listHandler) http.HandleFunc("/liuyan", liuyanHandler) // 啟動伺服器 err = http.ListenAndServe(":12345", nil) if err != nil { panic(err) }} // 載入模板func LoadTemplate() error { // 準備模板函數 funcs := make(template.FuncMap) funcs["showtime"] = ShowTime // 準備模板 v := template.New("view") v.Funcs(funcs) _, err := v.ParseGlob("view/*.htm") if err != nil { return err } view = v return nil} // 動態載入模板 /loadfunc loadHandler(w http.ResponseWriter, req *http.Request) { err := LoadTemplate() if err != nil { http.Error(w, err.Error(), 500) return } io.WriteString(w, `模板載入完成`)} // 顯示留言頁面 /func listHandler(w http.ResponseWriter, req *http.Request) { // 查詢資料 rows, err := db.Query("select * from liuyan") if err != nil { http.Error(w, err.Error(), 500) return } defer rows.Close() // 擷取資料 lys := []Liuyan{} for rows.Next() { ly := Liuyan{} err := rows.Scan(&ly.Id, &ly.Name, &ly.Url, &ly.Content, &ly.Time) if nil != err { http.Error(w, err.Error(), 500) return } lys = append(lys, ly) } // 顯示資料 err = view.ExecuteTemplate(w, "index.htm", lys) if err != nil { http.Error(w, err.Error(), 500) return }} // 留言頁面 /liuyanfunc liuyanHandler(w http.ResponseWriter, req *http.Request) { if "POST" == req.Method { // 擷取參數 name := strings.TrimSpace(req.FormValue("name")) url := strings.TrimSpace(req.FormValue("url")) content := strings.TrimSpace(req.FormValue("content")) // 檢查參數 if name == "" || content == "" { io.WriteString(w, "參數錯誤!\n") return } // sql語句 sql, err := db.Prepare("insert into liuyan(name, url, content, time) values(?, ?, ?, ?)") if err != nil { http.Error(w, err.Error(), 500) return } defer sql.Close() // sql參數,並執行 _, err = sql.Exec(name, url, content, time.Now().Unix()) if err != nil { http.Error(w, err.Error(), 500) return } // 跳轉 w.Header().Add("Location", "/") w.WriteHeader(302) // 提示資訊 io.WriteString(w, "提交成功!\n") return } // 顯示表單 err := view.ExecuteTemplate(w, "liuyan.htm", nil) if err != nil { http.Error(w, err.Error(), 500) return }}
view/index.htm
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body> <p><a href="/liuyan">給我留言</a></p> <table border="1"> <tr> <th>編號</th><th>姓名</th><th>網址</th><th>內容</th><th>時間</th> </tr>{{range .}} <tr> <td>{{.Id}}</td><td>{{.Name|html}}</td><td><a href="{{.Url}}" target="_blank">{{.Url|html}}</a></td><td>{{.Content|html}}</td><td>{{.Time|showtime}}</td> </tr>{{end}} </table></body></html>
view/liuyan.htm
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body> <form method="post"> 姓名:<input type="text" name="name" /><br> 網址:<input type="text" name="url" /><br> 內容:<input type="text" name="content" /><br> <input type="submit" value="提交" /> </form></body></html>http://www.dotcoo.com/golang-mysql-liuyanban