TypechoJoeTheme

至尊技术网

登录
用户名
密码

Golang如何实现一个在线投票系统

2025-11-28
/
0 评论
/
2 阅读
/
正在检测是否收录...
11/28

在现代 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 项目良好的可维护性与扩展潜力。

MySQL数据存储表单验证GolangWeb 表单HTML 模板HTTP 服务
朗读
赞(0)
版权属于:

至尊技术网

本文链接:

https://www.zzwws.cn/archives/39693/(转载时请注明本文出处及文章链接)

评论 (0)