Golang实现带用户注册功能的论坛网站
Golang实现带用户注册功能的论坛网站 我想创建一个具有有趣功能的网站,但不要太复杂,因为我还在学习阶段。
我对制作带有注册功能的论坛很感兴趣。不太理解论坛到底是什么。 当你创建主题时,这意味着客户端正在创建HTML模板吗?这些模板是如何保存在数据库中的?在哪里可以找到相关的示例? 谢谢。
6 回复
图片教程?
但是我可以免费获得哪些书籍/教程呢?因为我现在还没准备好为书籍付费。 或者也许你知道一些视频教程/GitHub示例
你之前看过这个吗?
astaxie/build-web-application-with-golang
一本介绍如何使用Golang构建Web应用的电子书 - astaxie/build-web-application-with-golang
在Golang中实现带用户注册功能的论坛网站是一个很好的学习项目。我来解答你的问题并提供相关代码示例。
论坛的基本概念: 论坛是一个在线讨论平台,用户可以通过注册账户来创建主题(帖子)并参与讨论。主题和回复通常存储在数据库中,而不是直接创建HTML模板。
核心组件实现:
- 用户注册功能
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)
}
- 主题(帖子)创建和存储
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)
}
- 显示主题列表
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)
}
- 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模板是单独的文件
这个实现展示了论坛的基本功能框架,你可以在此基础上添加用户认证、回复功能、分页等更多特性。

