golang mysql留言板系统,呵呵

做了一个简易留言板系统,练练手,用到了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.DB
var 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
}
 
// 动态加载模板 /load
func 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
    }
}
 
// 留言页面 /liuyan
func 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 

你可能感兴趣的:(golang)