Go项目-简单的学生成绩管理系统

项目名称:简单的学生成绩管理系统

项目描述:该项目可以记录学生的姓名和成绩信息,支持添加、删除、修改和查询学生信息,并输出全班学生的平均分、最高分和最低分等统计信息。

技术栈:

      后端:Go语言

      数据库:MySQL

  • 编写数据库表结构及接口,实现学生数据的增、删、改、查操作;
  • 编写简单的Web前端页面,实现对学生信息管理的可视化操作;
  • 实现对学生成绩数据的统计分析功能,并输出全班平均分、最高分和最低分等统计信息。
package main

import (
    "database/sql"//用于操作SQL数据库
    "fmt"//用于格式化字符串输出,
    "log"//用于输出日志
    "net/http"//用于处理HTTP请求和响应
    "strconv"//用于字符串和其他数据类型的转换,
    "text/template"//用于HTML模板解析;

    _ "github.com/go-sql-driver/mysql"
	//使用空标识符导入mysql驱动,表示在引入该包时,
	//仅执行该包的init函数,注册相应的数据库驱动。
)

// 数据库连接信息
//使用const关键字定义常量,表示数据库连接的相关信息,
//如数据库驱动、用户名、密码、主机地址、端口号和数据库名等
const (
    dbDriver   = "mysql"
    dbUser     = "root"
    dbPassword = "password123"
    dbHost     = "127.0.0.1"
    dbPort     = 3306
    dbName     = "students"
)

// 学生信息结构体
//使用type关键字定义一个Student结构体类型,表示学生的信息,包括学生ID、姓名和分数等信息。
type Student struct {
    ID     int
    Name   string
    Score  int
}
/*使用var关键字定义变量tpl和db,分别用于保存HTML模板和数据库连接。
在init()函数中,使用template.Must()方法解析templates目录下的所有HTML文件,然后使用sql.Open()函数打开数据库连接。
fmt.Sprintf()方法将数据库连接信息格式化为一个字符串,然后传递给sql.Open()函数实现连接数据库。
如果连接失败,使用log.Fatalf()方法输出错误信息并终止程序;如果连接成功,使用log.Println()方法输出日志信息表示连接已建立。*/
var tpl *template.Template
var db *sql.DB

func init() {
    // 使用Template包解析对应的HTML文件
    tpl = template.Must(template.ParseGlob("templates/*.html"))

    // 连接数据库
    dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", dbUser, dbPassword, dbHost, dbPort, dbName)
    var err error
    db, err = sql.Open(dbDriver, dataSourceName)
    if err != nil {
        log.Fatalf("Failed to connect to database: %v", err)
    }
    log.Println("Database connection established.")
}

// 获取所有学生信息的Handler
/*getAllStudents()方法使用db.Query()方法执行SQL查询语句,获取所有学生记录的数据。
使用defer rows.Close()方法,确保在函数退出时关闭连接。
创建一个students空切片,使用rows.Next()方法遍历每条学生记录,并使用rows.Scan()方法将学生信息分别存储在Student结构体对象中。
使用append()方法将每个学生对象添加到students切片中。
最后,使用rows.Err()方法检查是否有错误发生,并返回学生数据和错误信息。*/
func allStudentsHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method == "POST" {
        r.ParseForm()
        name := r.FormValue("name")
        score, err := strconv.Atoi(r.FormValue("score"))
        if err != nil {
            http.Error(w, "Invalid score value", http.StatusBadRequest)
        }
        addStudent(name, score)
    }

    students, err := getAllStudents()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    tpl.ExecuteTemplate(w, "index.html", students)
}

// 添加学生信息的Handler
func addStudentHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method == "POST" {
        r.ParseForm()
        name := r.FormValue("name")
        score, err := strconv.Atoi(r.FormValue("score"))
        if err != nil {
            http.Error(w, "Invalid score value", http.StatusBadRequest)
        }
        addStudent(name, score)
        http.Redirect(w, r, "/", http.StatusSeeOther)
    } else {
        tpl.ExecuteTemplate(w, "add.html", nil)
    }
}

// 修改学生信息的Handler
func editStudentHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method == "POST" {
        r.ParseForm()
        id, err := strconv.Atoi(r.FormValue("id"))
        if err != nil {
            http.Error(w, "Invalid student ID value", http.StatusBadRequest)
            return
        }
        name := r.FormValue("name")
        score, err := strconv.Atoi(r.FormValue("score"))
        if err != nil {
            http.Error(w, "Invalid score value", http.StatusBadRequest)
            return
        }
        editStudent(id, name, score)
        http.Redirect(w, r, "/", http.StatusSeeOther)
    } else {
        studentID := r.FormValue("id")
        if studentID == "" {
            http.Error(w, "Student ID not provided", http.StatusBadRequest)
            return
        }
        id, err := strconv.Atoi(studentID)
        if err != nil {
            http.Error(w, "Invalid student ID value", http.StatusBadRequest)
            return
        }
        student, err := getStudentByID(id)
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        tpl.ExecuteTemplate(w, "edit.html", student)
    }
}

// 删除学生信息的Handler
func deleteStudentHandler(w http.ResponseWriter, r *http.Request) {
id, err := strconv.Atoi(r.URL.Query().Get(“id”))
    if err != nil {
    http.NotFound(w, r)
    return
}
    if err := deleteStudent(id); err != nil {
        http.NotFound(w, r)
        return
    }
    http.Redirect(w, r, “/”, http.StatusSeeOther)
}
    
func main() {
    defer db.Close()
    http.HandleFunc("/", indexHandler)
    http.HandleFunc("/add", addHandler)
    http.HandleFunc("/edit", editHandler)
    http.HandleFunc("/delete", deleteHandler)

    log.Println("Starting server...")
    http.ListenAndServe(":8080", nil)
}

  • 使用Go语言实现SQL数据库的连接和操作
  • 学习了使用HTML模板解析器Template包解析HTML文件的方法,可视化展示学生信息
  • 了解HTTP请求处理和Web框架的基本知识,使用http包实现前后端交互
  • 学习了如何在Go语言中使用MySQL数据库,以及数据查询、插入、删除和修改的操作方法
  • 编写代码时,尽可能的使用了Go语言的语言特性,如使用defer关闭资源,var关键字声明变量,使用const定义常量等
  • 给代码添加注释,提高了代码的可读性,方便其他开发者理解和维护代码
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老实憨厚的腾锅锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值