c语言编程笔录

首页 >   > 笔记大全

笔记大全

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开发,并提供一个可扩展的博客项目用于实践。