2021-05-12

GO + MySQL 简单的注册用户&存信息到数据库

综合前两天的学习,自己写了一个小项目
主要目的:将学习的 东西都整合起来,连接前端html表单文件+GO逻辑+MySQL数据库
易错点:GO调用同一项目下不同包的方法

我的项目结构如图所示
2021-05-12_第1张图片

第一步:简单前端html

在项目下新建一个名为ui的文件夹,再创建一个login.html


<html>
<head>
    <title>logintitle>
head>

<body>
<form action="http://127.0.0.1:9090/login" method="post">
    用户名:<input type="text" name="username"/>
    密码:<input type="password" name="password"/>
    <input type="submit" value="Login">
form>
body>
html>

第二步:配置数据库文件

建立一个文件夹命名为db,然后创建一个dao.go文件
如果对GO连接mysql不熟悉的童鞋们,可以参考我上一篇详细的文章https://blog.csdn.net/qq_40763548/article/details/116697857?spm=1001.2014.3001.5501
源码如下,本文主要是写了增加和查询两个方法来检测数据库

package db
import (
	"database/sql"
	"fmt"
	"log"
	_ "github.com/go-sql-driver/mysql"
)

func Db_connection()(db *sql.DB){
     
	db, err :=sql.Open("mysql", "root:root@tcp(localhost:3306)/test")
	if err != nil {
     
		fmt.Println(">>> fail to connect to db <<<")
	}
	fmt.Println(">>> succeed to connect to db <<<")
	return db
}

type account struct {
     
	id int
	username string
	password string
}

func Query(db *sql.DB){
     
	rows,err:=db.Query("SELECT * FROM account")
	if err!=nil{
     
		panic(err)
	}
	for rows.Next(){
     
		var id int
		var un string
		var pwd string
		if err:=rows.Scan(&id,&un,&pwd); err !=nil{
     
			log.Fatal(err)
		}
		fmt.Printf("Account: ID_%d UserName_%s Password_%s",id,un,pwd)
	}

}

func Insert(db *sql.DB, un string, pwd string){
     
	stmt,err:=db.Prepare("INSERT INTO account(username,password) VALUES ('"+un+"','"+pwd+"')")
	if err != nil{
     
		panic(err)
	}
	result,err:=stmt.Exec()
	id,err := result.LastInsertId()
	fmt.Printf("Successfully Added User with ID: %d",id)
}

注意!!!!!所有需要被调用的方法请一定一定在命方法名的时候首字母大写!!!
不然真的没法被调用!!!!!!!!!!!!!!!!!!!!!!!

第三步:写login方法逻辑

func login(w http.ResponseWriter, r *http.Request) {
     
	fmt.Println("method: ",r.Method)
	if r.Method == "GET"{
      //第一次访问,GET则跳到login.hmtl界面
		t, _ := template.ParseFiles("C:\\Users\\xm\\Desktop\\GO_Materials\\go.form.cn\\ui\\login.html")
		t.Execute(w,nil)
	}else{
      //通过表单post方法则获得表单信息
		r.ParseForm()
		fmt.Println("username: ", r.Form["username"]) //console里面可以看到相关信息
		fmt.Println("password:", r.Form["password"])
		un := r.FormValue("username")
		pwd := r.FormValue("password")
		db.Insert(database,un,pwd)//插入数据库!!特别注意,请看下面详细解释
	}

}

!!特别注意!!
我们是如何再login.go中调用dao.go的Insert方法呢,他们并不在一个包里(看第一部分的结构图)?

步骤具体为下面4步:

  1. 项目和文件夹的名字一定要用如我所用"go.form.cn"这种**·**的格式
  2. 允许Goland设置中Enable Go Modules integration的选项并配置Environment(不知道Environment是否为必须,我在做的时候没配置GOPROXY调不了方法)
    GOPROXY=http://mirrors.aliyun.com/goproxy/
  3. 进入本project的Terminal,输入***go mod init go.form.cn***(根据自己项目名字写)
    ps:因为要连接mysql,所以同样需要输入***go get -u github.com/go-sql-driver/mysql***来获取mysql驱动
  4. 在需要调用方法的文件中导入包(本文要调用db包中的方法,导入时带上项目名,如图)
    然后调用方法,用***包名.方法名***这种格式,如上方代码最后一行
    2021-05-12_第2张图片

2021-05-12_第3张图片

本文只是很粗略的获取表单信息,插入数据库;其实通常此步中还需要做验证,我后期学习验证后再补充分享

第四步:main方法配置访问网页

func main() {
     
	database = db.Db_connection()
	http.HandleFunc("/login", login)         //设置访问的路由
	err:=http.ListenAndServe(":9090", nil) //设置监听的端口
	if err != nil {
     
		log.Fatal("ListenAndServe: ", err)
	}
	db.Query(database) //此处可以检测是否插入成功
}

本文是一个很小的项目哈,适合像我一样小白们一起学习!希望能都有需求的人有一点点帮助~
继续愉快学习
涂涂努力ing

你可能感兴趣的:(mysql,go,forms)