悠悠楠杉
Golang如何实现一个在线投票系统
在现代 Web 开发中,轻量级且高效的后端语言尤为重要。Golang 凭借其简洁的语法、出色的并发性能和内置的 HTTP 支持,成为构建中小型 Web 应用的理想选择。本文将带你从零开始,使用 Golang 实现一个具备完整功能的在线投票系统,涵盖表单提交、数据持久化与结果展示等关键流程。
首先,我们需要搭建项目的基本结构。创建一个名为 vote-system 的目录,并在其中初始化 Go 模块:
bash
mkdir vote-system && cd vote-system
go mod init vote-system
接下来,我们定义数据模型。假设我们的投票系统用于评选“最佳员工”,每个投票项包含候选人姓名和得票数。我们在 models/vote.go 中定义结构体:
go
package models
type Candidate struct {
ID int json:"id"
Name string json:"name"
Votes int json:"votes"
}
为了存储数据,我们选用 SQLite 作为轻量级数据库。使用 database/sql 包和 mattn/go-sqlite3 驱动连接数据库。在 main.go 中初始化数据库连接并创建表:
go
db, err := sql.Open("sqlite3", "./votes.db")
if err != nil {
log.Fatal(err)
}
defer db.Close()
_, err = db.Exec(CREATE TABLE IF NOT EXISTS candidates (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE,
votes INTEGER DEFAULT 0
))
系统需要支持候选人初始化。我们可以手动插入几条测试数据:
go
candidates := []string{"张三", "李四", "王五"}
for _, name := range candidates {
db.Exec("INSERT OR IGNORE INTO candidates (name) VALUES (?)", name)
}
前端页面使用 Go 内置的 html/template 包渲染。创建 templates/index.html,包含投票表单和结果展示:
html
<!DOCTYPE html>
<html>
<head><title>最佳员工投票</title></head>
<body>
<h2>请选择你心目中的最佳员工:</h2>
<form method="POST" action="/vote">
{{range .Candidates}}
<label><input type="radio" name="candidate" value="{{.ID}}" required> {{.Name}} ({{.Votes}}票)</label><br>
{{end}}
<button type="submit">提交投票</button>
</form>
</body>
</html>
后端路由处理是整个系统的核心。我们使用标准库的 net/http 设置路由:
go
http.HandleFunc("/", showVotePage)
http.HandleFunc("/vote", handleVote)
log.Println("服务器启动在 :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
showVotePage 函数负责查询所有候选人并渲染模板:
go
func showVotePage(w http.ResponseWriter, r *http.Request) {
rows, err := db.Query("SELECT id, name, votes FROM candidates")
if err != nil {
http.Error(w, err.Error(), 500)
return
}
defer rows.Close()
var candidates []models.Candidate
for rows.Next() {
var c models.Candidate
rows.Scan(&c.ID, &c.Name, &c.Votes)
candidates = append(candidates, c)
}
tmpl := template.Must(template.ParseFiles("templates/index.html"))
tmpl.Execute(w, struct{ Candidates []models.Candidate }{candidates})
}
投票处理函数 handleVote 接收表单数据并更新数据库:
go
func handleVote(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
http.Redirect(w, r, "/", http.StatusSeeOther)
return
}
candidateID := r.FormValue("candidate")
_, err := db.Exec("UPDATE candidates SET votes = votes + 1 WHERE id = ?", candidateID)
if err != nil {
http.Error(w, "投票失败", 500)
return
}
http.Redirect(w, r, "/", http.StatusSeeOther)
}
至此,一个基础的在线投票系统已经成型。用户访问首页时看到候选人列表和投票表单,提交后票数即时更新并重定向回首页查看最新结果。整个流程不依赖第三方框架,完全使用 Go 标准库完成,体现了 Golang 在 Web 开发中的自给自足能力。
为进一步提升用户体验,可加入防重复投票机制(如基于 IP 或 Cookie 记录)、更美观的前端样式,甚至添加管理员界面用于新增候选人。这些扩展都能在现有架构上平滑演进,展现出 Golang 项目良好的可维护性与扩展潜力。
