2021-05-12

Posted 涂涂努力ing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-05-12相关的知识,希望对你有一定的参考价值。

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

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

我的项目结构如图所示
项目结构

第一步:简单前端html

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

<!DOCTYPE html>
<html>
<head>
    <title>login</title>
</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包中的方法,导入时带上项目名,如图)
    然后调用方法,用***包名.方法名***这种格式,如上方代码最后一行
    导入包

Goland中配置

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

第四步: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

以上是关于2021-05-12的主要内容,如果未能解决你的问题,请参考以下文章

2021-05-12

python中日期字符串与datetime类型的相互转换

2021-05-12

2021-05-12

2021-05-12

2021-05-12