项目实战:
js代码1(注册)
axios.post('http://localhost:8093/',{username:this.create_usename,
password:this.create_password}).then(
response =>{
console.log(response.data)
})
.catch(error =>{
console.log(error);
})
}
js代码2 (登录)
axios.post("http://127.0.0.1:8093/sign",{username:this.username,password:this.password}).then(
response =>{
console.log(response.data)
},
error =>{
console.log(error)
}
Go代码
package main
import (
"net/http"
"time"
"fmt"
_ "github.com/go-sql-driver/mysql"
"database/sql"
)
type User struct{
Username string `form:"username"`
Password string `form:"password"`
}
//定义中间
func MiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
t := time.Now()
fmt.Println("中间件开始执行了")
// status :=c.Writer.Status()
t2 :=time.Since(t)
fmt.Println("time",t2)
}
}
//这也是handlerfunc类型
func regist(c *gin.Context){
fmt.Println("进入了regist")
//通过数据绑定来实现,初始化结构体
var u User
err :=c.Bind(&u)//需要传指针
if err != nil {
c.JSON(http.StatusBadRequest,gin.H{
"error":err.Error(),
})
}else{
c.JSON(http.StatusOK,gin.H{
"status":"ok",
"usernames":u.Username,
"password":u.Password,
})
}
//传值
c.Set("username",u.Username)
c.Set("password",u.Password)
//注册完之后回到中间件
//验证是否存在该账号
isExist := verify(u.Username)
if isExist {
c.JSON(http.StatusBadRequest,gin.H{
"status":"创建失败,该用户已存在",
})
return
}
sql := "INSERT INTO users (username,password) VALUES(?,?)";
ret,err := db.Exec(sql,u.Username,u.Password)
if err!=nil{
fmt.Println("添加失败")
}else{
rowsAffected,err :=ret.RowsAffected()
if err !=nil{
fmt.Println("获取受影响的行数失败:",err)
}else{
fmt.Println("添加成功,受影响的行数",rowsAffected)
}
}
}
//验证账户是否有重复
func verify(username string)bool{
var username1 string
sql :="select username from users where username=?"
err := db.QueryRow(sql,username).Scan(&username1)
if err != nil{
fmt.Println("查询失败",err)
return false
}
if username1 !=""{
return true
}else{
return false
}
}
func signin(c *gin.Context){
sql :="select username,password from users where username=? and password=?"//单语句查询
var u1 User
err :=c.Bind(&u1)
if err != nil{
c.JSON(http.StatusBadRequest,gin.H{
"status":"绑定失败",
})
return
}}
var u2 User
err =db.QueryRow(sql,u1.Username,u1.Password).Scan(&u2.Username,&u2.Password)
fmt.Println("这是u1",u1)
fmt.Println("这是u2",u2)
var u3 =[]string{u1.Username,u1.Password}
if u2.Username==""||u2.Password==""{//通过前端传过来的参数我们对数据库进行了查询,并通过指针传递给了u2
fmt.Println("登录失败",err)
c.JSON(http.StatusBadRequest,gin.H{
"status":"用户名或密码输入错误",
})
return
}else{
fmt.Println("登录成功")
c.JSON(http.StatusOK,gin.H{//状态码为"200"
"status":"登录成功,
"message":u3,
//返回码消息
//
})
}
}
var db *sql.DB
func authMiddleware(c *gin.Context) {
//跨域设置
//这里连接数据库
dsn :="root:551765@tcp(localhost:3306)/xk"
var err error
db,err =sql.Open("mysql",dsn)
if err != nil {
fmt.Println(err)
}else{
fmt.Printf("连接成功")
}
defer db.Close()
c.Next()
name1,ok :=c.Get("username")
if ok{
fmt.Println(name1)
}else{
fmt.Println("获取失败")
}
name2,_:=c.Get("password")
fmt.Println("这是name2",name2)
}
func main() {
r :=gin.Default()
r.Use(cors.New(cors.Config{ //定义了一个全局中间件,来解决前端访问8093端口号带来的跨域问题
AllowOrigins: []string{"http://localhost:8080"},
AllowMethods: []string{"PUT", "PATCH","POST","GET"},
AllowHeaders: []string{"Origin", "Content-Type"},
ExposeHeaders: []string{"Content-Length"},
AllowCredentials: true,
AllowOriginFunc: func(origin string) bool {
return origin == "http://localhost:8080"
},
MaxAge: 12 * time.Hour,
}))
r.POST("/",authMiddleware,regist)
r.POST("/sign",authMiddleware,signin)//先经过中间件执行连接数据库等操作
r.Run(":8093")
}