golang搭建博客
更新时间:2023-12-15前言
本文将详细介绍在golang中如何搭建一个博客,并提供完整的代码示例。我们将按照如下流程进行: 1) 数据库设计 2) 数据库操作 3) 路由设计 4) 模板设计 5) 完成所有模块的集成。 这个教程旨在帮助您入门golang web开发,并为您提供一个可扩展的博客项目。
1. 数据库设计
首先,我们需要设计一个适合博客存储的数据库。在我们的博客项目中,我们需要存储以下信息:文章标题、文章内容、文章发布时间、作者名字。 因此,我们需要一个文章表,表结构如下:
type Article struct { ID int `json:"id"` Title string `json:"title"` Content string `json:"content"` Author string `json:"author"` CreateAt string `json:"createAt"` UpdateAt string `json:"updateAt"` }
接下来,我们需要编写一些函数来操作数据库。
// 初始化数据库 func initDB() { database, err := sql.Open("mysql", "root:password@/blog?charset=utf8") if err != nil { panic(err) } DB = database } // 获取所有文章 func getArticles() ([]Article, error) { rows, err := DB.Query("SELECT * FROM articles") if err != nil { return nil, err } defer rows.Close() articles := []Article{} for rows.Next() { var article Article err := rows.Scan(&article.ID, &article.Title, &article.Content, &article.Author, &article.CreateAt, &article.UpdateAt) if err != nil { return nil, err } articles = append(articles, article) } if err := rows.Err(); err != nil { return nil, err } return articles, nil } // 获取单个文章 func getArticle(id string) (Article, error) { var article Article err := DB.QueryRow("SELECT * FROM articles WHERE id = ?", id).Scan(&article.ID, &article.Title, &article.Content, &article.Author, &article.CreateAt, &article.UpdateAt) if err != nil { if err == sql.ErrNoRows { return article, fmt.Errorf("article not found with id: %s", id) } else { return article, err } } return article, nil }
2. 数据库操作
现在我们已经有了一个数据库,接下来我们需要编写代码来操作这个数据库。我们将使用gorilla/mux库来创建处理器,使用http库注册路由。在这个项目中,我们需要处理三个路由:主页、详情页、添加页。我们的代码如下所示:
func main() { router := mux.NewRouter().StrictSlash(true) router.HandleFunc("/", homeHandler) router.HandleFunc("/{id}", detailHandler).Methods("GET") router.HandleFunc("/add", addHandler).Methods("POST") log.Fatal(http.ListenAndServe(":8080", router)) } func homeHandler(w http.ResponseWriter, r *http.Request) { articles, err := getArticles() if err != nil { log.Fatal(err) } tpl := template.Must(template.ParseFiles("templates/index.html")) tpl.Execute(w, articles) } func detailHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) article, err := getArticle(vars["id"]) if err != nil { log.Fatal(err) } tpl := template.Must(template.ParseFiles("templates/detail.html")) tpl.Execute(w, article) } func addHandler(w http.ResponseWriter, r *http.Request) { err := r.ParseForm() if err != nil { log.Fatal(err) } article := Article{ Title: r.FormValue("title"), Content: r.FormValue("content"), Author: r.FormValue("author"), CreateAt: time.Now().Format("2006-01-02 15:04:05"), UpdateAt: time.Now().Format("2006-01-02 15:04:05"), } insertArticle(article) http.Redirect(w, r, "/", http.StatusFound) }
3. 路由设计
我们已经编写了处理器函数,现在我们需要为它们注册路由。在我们的示例中,我们需要注册三个路由:‘/’,’/{id}’,‘/add’。这些路由都需要使用http库进行注册。代码如下所示:
func main() { router := mux.NewRouter().StrictSlash(true) router.HandleFunc("/", homeHandler) router.HandleFunc("/{id}", detailHandler).Methods("GET") router.HandleFunc("/add", addHandler).Methods("POST") log.Fatal(http.ListenAndServe(":8080", router)) }
4.模板设计
我们需要为我们的博客项目创建一个模板。在我们的项目中,我们需要至少两个模板文件:index.html和detail.html。index.html用于展示所有文章列表,detail.html用于展示单个文章。我们可以使用template包将数据填充到模板中。示例代码如下所示:
// homeHandler函数以如下代码更改 func homeHandler(w http.ResponseWriter, r *http.Request) { articles, err := getArticles() if err != nil { log.Fatal(err) } tpl := template.Must(template.ParseFiles("templates/index.html")) tpl.Execute(w, articles) } //index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Blog:</title> </head> <body> {{range .}} <h2><a href="/{{.ID}}">{{.Title}}</a></h2> <p>Written by {{.Author}} on {{.CreatedAt}}</p> <p>{{.Intro}}</p> <hr> {{end}} </body> </html>
5. 完成所有模块的集成
好的,我们已经完成了数据库设计、数据库操作、路由设计和模板设计。现在,我们可以把所有的代码集成起来,看看我们的博客是如何工作的。我们可以通过以下步骤运行我们的程序: 1. 创建一个golang项目文件夹 2. 在文件夹中创建main.go文件 3. 将以上代码复制到main.go文件中 4. 创建templates文件夹,并创建index.html和detail.html文件 5. 运行程序:go run main.go 6. 访问主页:http://127.0.0.1:8080
总结
在这个教程中,我们详细介绍了如何用golang设计和开发一个博客项目,并提供了完整的代码示例。这个项目使用了gorilla/mux库和database/sql包来处理路由和数据库操作,同时使用了Go模板语言来进行渲染。这个教程旨在帮助golang的初学者们了解如何在golang中进行web开发,并提供一个可扩展的博客项目用于实践。