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步:
- 项目和文件夹的名字一定要用如我所用"go.form.cn"这种**·**的格式
- 允许Goland设置中Enable Go Modules integration的选项并配置Environment(不知道Environment是否为必须,我在做的时候没配置GOPROXY调不了方法)
GOPROXY=http://mirrors.aliyun.com/goproxy/ - 进入本project的Terminal,输入***go mod init go.form.cn***(根据自己项目名字写)
ps:因为要连接mysql,所以同样需要输入***go get -u github.com/go-sql-driver/mysql***来获取mysql驱动 - 在需要调用方法的文件中导入包(本文要调用db包中的方法,导入时带上项目名,如图)
然后调用方法,用***包名.方法名***这种格式,如上方代码最后一行
本文只是很粗略的获取表单信息,插入数据库;其实通常此步中还需要做验证,我后期学习验证后再补充分享
第四步: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的主要内容,如果未能解决你的问题,请参考以下文章