Golang实现带用户注册功能的论坛网站

Golang实现带用户注册功能的论坛网站 我想创建一个具有有趣功能的网站,但不要太复杂,因为我还在学习阶段。

我对制作带有注册功能的论坛很感兴趣。不太理解论坛到底是什么。 当你创建主题时,这意味着客户端正在创建HTML模板吗?这些模板是如何保存在数据库中的?在哪里可以找到相关的示例? 谢谢。

6 回复

谢谢

更多关于Golang实现带用户注册功能的论坛网站的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


图片教程?

但是我可以免费获得哪些书籍/教程呢?因为我现在还没准备好为书籍付费。 或者也许你知道一些视频教程/GitHub示例

看看这个人的书:

https://www.alexedwards.net/#book

真的帮我入门了。

你之前看过这个吗?

GitHub图标

GitHub

头像

astaxie/build-web-application-with-golang

一本介绍如何使用Golang构建Web应用的电子书 - astaxie/build-web-application-with-golang

在Golang中实现带用户注册功能的论坛网站是一个很好的学习项目。我来解答你的问题并提供相关代码示例。

论坛的基本概念: 论坛是一个在线讨论平台,用户可以通过注册账户来创建主题(帖子)并参与讨论。主题和回复通常存储在数据库中,而不是直接创建HTML模板。

核心组件实现:

  1. 用户注册功能
package main

import (
    "database/sql"
    "fmt"
    "html/template"
    "log"
    "net/http"
    "golang.org/x/crypto/bcrypt"
    _ "github.com/lib/pq"
)

type User struct {
    ID       int
    Username string
    Email    string
    Password string
}

func registerHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method == "POST" {
        username := r.FormValue("username")
        email := r.FormValue("email")
        password := r.FormValue("password")
        
        // 密码加密
        hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
        if err != nil {
            http.Error(w, "密码加密失败", http.StatusInternalServerError)
            return
        }
        
        // 保存到数据库
        db, err := sql.Open("postgres", "dbname=forum user=postgres password=123456 sslmode=disable")
        if err != nil {
            http.Error(w, "数据库连接失败", http.StatusInternalServerError)
            return
        }
        defer db.Close()
        
        _, err = db.Exec("INSERT INTO users (username, email, password) VALUES ($1, $2, $3)", 
            username, email, string(hashedPassword))
        if err != nil {
            http.Error(w, "用户注册失败", http.StatusInternalServerError)
            return
        }
        
        http.Redirect(w, r, "/login", http.StatusSeeOther)
        return
    }
    
    // 显示注册表单
    tmpl := template.Must(template.ParseFiles("register.html"))
    tmpl.Execute(w, nil)
}
  1. 主题(帖子)创建和存储
type Topic struct {
    ID      int
    Title   string
    Content string
    UserID  int
    CreatedAt string
}

func createTopicHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method == "POST" {
        title := r.FormValue("title")
        content := r.FormValue("content")
        userID := 1 // 从会话中获取实际用户ID
        
        db, err := sql.Open("postgres", "dbname=forum user=postgres password=123456 sslmode=disable")
        if err != nil {
            http.Error(w, "数据库连接失败", http.StatusInternalServerError)
            return
        }
        defer db.Close()
        
        // 将主题保存到数据库,不保存HTML模板
        _, err = db.Exec("INSERT INTO topics (title, content, user_id) VALUES ($1, $2, $3)", 
            title, content, userID)
        if err != nil {
            http.Error(w, "主题创建失败", http.StatusInternalServerError)
            return
        }
        
        http.Redirect(w, r, "/topics", http.StatusSeeOther)
        return
    }
    
    tmpl := template.Must(template.ParseFiles("create_topic.html"))
    tmpl.Execute(w, nil)
}
  1. 显示主题列表
func topicsHandler(w http.ResponseWriter, r *http.Request) {
    db, err := sql.Open("postgres", "dbname=forum user=postgres password=123456 sslmode=disable")
    if err != nil {
        http.Error(w, "数据库连接失败", http.StatusInternalServerError)
        return
    }
    defer db.Close()
    
    rows, err := db.Query("SELECT id, title, user_id, created_at FROM topics ORDER BY created_at DESC")
    if err != nil {
        http.Error(w, "查询失败", http.StatusInternalServerError)
        return
    }
    defer rows.Close()
    
    var topics []Topic
    for rows.Next() {
        var topic Topic
        err := rows.Scan(&topic.ID, &topic.Title, &topic.UserID, &topic.CreatedAt)
        if err != nil {
            http.Error(w, "数据读取失败", http.StatusInternalServerError)
            return
        }
        topics = append(topics, topic)
    }
    
    tmpl := template.Must(template.ParseFiles("topics.html"))
    tmpl.Execute(w, topics)
}
  1. HTML模板示例 (topics.html)
<!DOCTYPE html>
<html>
<head>
    <title>论坛主题</title>
</head>
<body>
    <h1>论坛主题</h1>
    <a href="/create-topic">创建新主题</a>
    <ul>
        {{range .}}
        <li>
            <h3><a href="/topic/{{.ID}}">{{.Title}}</a></h3>
            <p>作者ID: {{.UserID}} | 创建时间: {{.CreatedAt}}</p>
        </li>
        {{end}}
    </ul>
</body>
</html>

数据库表结构:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE topics (
    id SERIAL PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    content TEXT NOT NULL,
    user_id INTEGER REFERENCES users(id),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

路由设置:

func main() {
    http.HandleFunc("/register", registerHandler)
    http.HandleFunc("/create-topic", createTopicHandler)
    http.HandleFunc("/topics", topicsHandler)
    
    log.Println("服务器启动在 :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

关键点说明:

  • 主题内容以纯文本形式存储在数据库中,不是HTML模板
  • 使用Go的html/template包来安全地渲染HTML页面
  • 密码使用bcrypt进行加密存储
  • 数据库存储的是结构化数据,HTML模板是单独的文件

这个实现展示了论坛的基本功能框架,你可以在此基础上添加用户认证、回复功能、分页等更多特性。

回到顶部