go语言项目实践2--实现简易留言板 老男孩go周末班培训

    /    2019-07-23

【实现简易留言板】

一、需求分析

1、实现一个匿名留言板。

2、实现留言、查看留言、评论留言、查看评论、点赞等功能。如下图所示:

二、技术分析

1、数据库:

1)选择MySQL数据库,设计相关数据表字段结构。

2)使用Go语言第三方开源的MySQL库,进行相关的数据库操作。

2、html显示:

使用Go语言template包,实现数据驱动的模板。

3、css、图片

根据UI图自行实现所需样式。

三、代码实现

创建数据表:

在数据库库中创建message和comment表。

mysql> CREATE TABLE IF NOT EXISTS `message` (
      `id` int(11NOT NULL AUTO_INCREMENT,
      `nickname` varchar(60NOT NULL DEFAULT '匿名',
      `message` varchar(200NOT NULL,
      `add_time` datetime NOT NULL,
      `praise_num` int(11NOT NULL DEFAULT '0',
      `comment_num` int(11NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

mysql> CREATE TABLE IF NOT EXISTS `comment` (
  `id` int(11NOT NULL AUTO_INCREMENT,
  `message_id` int(11NOT NULL,
  `nickname` varchar(60NOT NULL DEFAULT '匿名',
  `comment` varchar(200NOT NULL,
  `add_time` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;

目录结构:

messageboard
    |
     —— controllers
    |
       |
               —— comment.go
    |
       |
             —— message.go
      |

       —— models
    |       |
               —— base.go
    |       |
               —— comment.go
    |       |
             —— message.go
      |
        —— static
    |
       |
               —— css
    |
       |
             —— img
      |

        —— view
    |       |
               —— comment.html
    |       |
             —— message.html
      |
        —— main.go

man.go 项目入口文件,主要通过routers函数实现加载路由的功能。

package main
import (
    "MessageBoard/controllers"
    "net/http"
    _ "github.com/go-sql-driver/mysql"
)
func main() {
    routers()
}
func routers() {
    http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
    http.HandleFunc("/message", controllers.Message)
    http.HandleFunc("/comment", controllers.Comment)
    if err := http.ListenAndServe(":8080"nil); err != nil {
    }
}

controllers模块主要实现了留言板的留言和评论相关功能。

message.go实现留言板留言相关的业务逻辑。

package controllers
import (
    "fmt"
    "messageboard/models"
    "net/http"
    "time"
    "github.com/alecthomas/template"
)
func Message(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type""text/html")
    t, err := template.ParseFiles("./view/message.html")
    if err != nil {
        fmt.Println("parse file err:", err)
        return
    }
    m := new(models.Message)
    switch r.Method {
    case "GET":
        data := m.SelectMessage()
        t.Execute(w, data)
        return
    case "POST":
        m.AddTime = time.Now().Format("2006-01-02 15:04:05")
        m.Message = r.FormValue("message")
        if m.Message != "" && m.AddTime != "" {
            _ = m.AddMessage()
        }
        http.Redirect(w, r, "/message", http.StatusFound)
        return
    }
}

comment.go实现留言板评论相关的业务逻辑。

package controllers
import (
    "fmt"
    "messageboard/models"
    "net/http"
    "strconv"
    "time"
    "github.com/alecthomas/template"
)
func Comment(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type""text/html")
    t, err := template.ParseFiles("./view/comment.html")
    if err != nil {
        fmt.Println("parse file err:", err)
        return
    }
    c := new(models.Comment)
    message_id, _ := strconv.Atoi(r.FormValue("id"))
    c.MessageId = int64(message_id)
    switch r.Method {
    case "GET":
        m := new(models.Message)
        m.Id = int64(message_id)
        messageInfo := m.GetMessageById()
        commentList := c.SelectComment()
        type Data struct {
            MessageInfo models.Message
            CommentList []models.Comment
        }
        data := Data{
            MessageInfo: messageInfo,
            CommentList: commentList,
        }
        t.Execute(w, data)
        return
    case "POST":
        c.AddTime = time.Now().Format("2006-01-02 15:04:05")
        c.Comment = r.FormValue("comment")
        if c.Comment != "" && c.AddTime != "" && c.MessageId > 0 {
            _ = c.AddComment()
        }
        http.Redirect(w, r, fmt.Sprintf("/comment?id=%d", c.MessageId), http.StatusFound)
        return
    }
}

models模块主要实现了留言板的数据库相关操作。

base.go实现连接数据库操作。

package models
import (
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
)
var Db *sqlx.DB
func init() {
    database, err := sqlx.Open("mysql""root:root@tcp(127.0.0.1:3306)/DBname")
    if err != nil {
        fmt.Println("open mysql failed,", err)
        return
    }
    Db = database
}

message.go实现数据库message表的相关操作。

package models
import&nbs

(2)

分享至