[Go] 超简易Go语言实现的留言板代码 →→→→→进入此内容的聊天室

来自 , 2019-11-16, 写在 Go, 查看 104 次.
URL http://www.code666.cn/view/b9b72b29
  1. package main
  2.    
  3. import (
  4.     // "fmt"
  5.     "io"
  6.     "log"
  7.     "net/http"
  8.     "text/template"
  9.     "time"
  10.     "database/sql"
  11.     "github.com/ziutek/mymysql/godrv"
  12. )
  13.    
  14. // 留言结构
  15. type Liuyan struct {
  16.     Id int
  17.     Name string
  18.     Content string
  19.     Time int
  20. }
  21.    
  22. // 显示留言时间
  23. func (l Liuyan) ShowTime() string {
  24.     t := time.Unix(int64(l.Time), 0)
  25.     return t.Format("2006-01-02 15:04:05")
  26. }
  27.    
  28. func main() {
  29.     godrv.Register("SET NAMES utf8")
  30.    
  31.     // 连接数据库
  32.     db, err := sql.Open("mymysql", "tcp:127.0.0.1:3306*go/root/123456")
  33.     if err != nil {
  34.         panic(err)
  35.     }
  36.     defer db.Close()
  37.    
  38.     // 准备模板
  39.     tpl, err := template.New("liuyanbook").Parse(html)
  40.     if err != nil {
  41.         panic(err)
  42.     }
  43.    
  44.     // 显示留言页面 /
  45.     requestList := func(w http.ResponseWriter, req *http.Request) {
  46.         // 查询数据
  47.         rows, err := db.Query("select * from liuyan")
  48.         if err != nil {
  49.             log.Fatal(err)
  50.         }
  51.         defer rows.Close()
  52.    
  53.         // 获取数据
  54.         lys := []Liuyan{}
  55.         for rows.Next() {
  56.             ly := Liuyan{}
  57.             err := rows.Scan(&ly.Id, &ly.Name, &ly.Content, &ly.Time)
  58.             if nil != err {
  59.                 log.Fatal(err)
  60.             }
  61.             lys = append(lys, ly)
  62.         }
  63.    
  64.         // 显示数据
  65.         err = tpl.ExecuteTemplate(w, "list", lys)
  66.         if err != nil {
  67.             log.Fatal(err)
  68.         }
  69.     }
  70.    
  71.     // 留言页面 /liuyan
  72.     requestLiuyan := func(w http.ResponseWriter, req *http.Request) {
  73.         err := req.ParseForm()
  74.         if err != nil{
  75.             log.Fatal(err)
  76.         }
  77.    
  78.         if "POST" == req.Method {
  79.             if len(req.Form["name"]) < 1 {
  80.                 io.WriteString(w, "参数错误!\n")
  81.                 return
  82.             }
  83.             if len(req.Form["content"]) < 1 {
  84.                 io.WriteString(w, "参数错误!\n")
  85.                 return
  86.             }
  87.    
  88.             name := template.HTMLEscapeString(req.Form.Get("name"))
  89.             content := template.HTMLEscapeString(req.Form.Get("content"))
  90.    
  91.             // sql语句
  92.             sql, err := db.Prepare("insert into liuyan(name, content, time) values(?, ?, ?)")
  93.             if err != nil {
  94.                 log.Fatal(err)
  95.             }
  96.             defer sql.Close()
  97.    
  98.             // sql参数,并执行
  99.             _, err = sql.Exec(name, content, time.Now().Unix())
  100.             if err != nil {
  101.                 log.Fatal(err)
  102.             }
  103.    
  104.             // 跳转
  105.             w.Header().Add("Location", "/")
  106.             w.WriteHeader(302)
  107.    
  108.             // 提示信息
  109.             io.WriteString(w, "提交成功!\n")
  110.    
  111.             return
  112.         }
  113.    
  114.         err = tpl.ExecuteTemplate(w, "liuyan", nil)
  115.         if err != nil {
  116.             log.Fatal(err)
  117.         }
  118.     }
  119.    
  120.     http.HandleFunc("/", requestList)
  121.     http.HandleFunc("/liuyan", requestLiuyan)
  122.     err = http.ListenAndServe(":12345", nil)
  123.     if err != nil {
  124.         log.Fatal("ListenAndServe: ", err)
  125.     }
  126. }
  127.    
  128. // 网页模板
  129. var html string = `{{define "list"}}{{/* 留言列表页面 */}}<!DOCTYPE html>
  130. <html>
  131. <head>
  132. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  133. </head>
  134. <body>
  135.     <p><a href="/liuyan">给我留言</a></p>
  136.     <table>
  137. {{range .}}
  138.     <tr>
  139.         <td>{{.Id}}</td><td>{{.Name}}</td><td>{{.Content}}</td><td>{{.ShowTime}}</td>
  140.     </tr>
  141. {{end}}
  142.     </table>
  143. </body>
  144. </html>{{end}}
  145. {{define "liuyan"}}{{/* 发布留言页面 */}}<!DOCTYPE html>
  146. <html>
  147. <head>
  148. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  149. </head>
  150. <body>
  151.     <form method="post">
  152.         姓名:<input type="text" name="name" /><br>
  153.         内容:<input type="text" name="content" /><br>
  154.         <input type="submit" value="提交" />
  155.     </form>
  156. </body>
  157. </html>{{end}}
  158. //go/4380

回复 "超简易Go语言实现的留言板代码"

这儿你可以回复上面这条便签

captcha