02-gin框架-用户登陆和注册

2022-01-13  本文已影响0人  玄德公笔记

实现简单的登陆和注册,不考虑token和需要登陆后创建用户

1. 环境说明

1.1 代码结构如下:

在这里插入图片描述

1.2 创建表如下

在这里插入图片描述

2. 创建路由

package http

import (
    "github.com/gin-gonic/gin"
    swaggerFiles "github.com/swaggo/files"
    ginSwagger "github.com/swaggo/gin-swagger"
    _ "testmysql/docs"
)

func ConfigRoutes() {
    // 1.创建路由
    r := gin.Default()

    r.GET("/swagger/*any", ginSwagger.DisablingWrapHandler(swaggerFiles.Handler,"on"))
    //创建一个路由组,游客可以访问
    guest := r.Group("/api/crow")
    {
        guest.GET("/ping",func(c *gin.Context){
            c.String(200,"pong")
        })
        guest.POST("/login", loginPost)
        guest.POST("/register", register)
    }
    //启动的端口
    r.Run(":1840")
}

3. gin.Context

说明:

  • 配合路由创建gin.Context 相关代码实现访问
  • // @ 是swagger的相关代码
package http

import (
    "github.com/gin-gonic/gin"
    "net/http"
    "testmysql/models"
    "testmysql/my_db"
)

//创建一个结构体接收前端传来的用户信息,用于登陆或注册
type longinInfo struct {
    Name string `json:"name"`
    Password string `json:"password"`
    Email string `json:"email"`
}


// @Summary user register
// @Description user register
// @Accept  json
// @Produce  json
// @Param _ body  longinInfo true "login Form"
// @Success 200 {object} models.SuccessRespMsg{dat=my_db.User}
// @Failure 500 {object} models.FailRespMsg
// @Router /api/crow/register [post]
func register(c *gin.Context) {
    //获取用户名、密码
    json :=longinInfo{} //注意该结构接受的内容
    c.BindJSON(&json)
    name:= json.Name
    passwd := json.Password
    email := json.Email
    //判断用户是否存在
    //存在输出状态1
    //不存在创建用户,保存密码与用户名
    Bool := models.IsExist(name)
    if Bool {
        //注册状态
        my_db.State["state"] = 1
        my_db.State["text"] = "此用户已存在!"
    } else {
        //用户不存在即添加用户
        my_db.InsertUser(name, passwd,email)
        my_db.State["state"] = 1
        my_db.State["text"] = "注册成功!"
    }

    //把状态码和注册状态返回给客户端
    c.String(http.StatusOK, "%v", my_db.State)
}


// @Summary user login
// @Description user login
// @Accept  json
// @Produce  json
// @Param _ body  longinInfo true "login Form"
// @Success 200 {object} models.SuccessRespMsg{dat=my_db.User}
// @Failure 500 {object} models.FailRespMsg
// @Router /api/crow/login [post]
func loginPost(c *gin.Context) {
    //name := c.Request.FormValue("Name")
    //passwd := c.Request.FormValue("Passwd")
    json :=longinInfo{} //注意该结构接受的内容
    c.BindJSON(&json)
    name:= json.Name
    passwd := json.Password
    //先判断用户是否存在,存在再判断密码是否正确
    //my_db.Slice = my_db.SelectUsers()
    Bool := models.IsExist(name)
    if Bool {
        Bool_Pwd := models.IsRight(name, passwd)
        if Bool_Pwd {
            my_db.State["state"] = 1
            my_db.State["text"] = "登录成功!"
        } else {
            my_db.State["state"] = 0
            my_db.State["text"] = "密码错误!"
        }
    } else {
        my_db.State["state"] = 2
        my_db.State["text"] = "登录失败!此用户尚未注册!"
    }

    c.String(http.StatusOK, "%v", my_db.State)
}


//设置默认路由当访问一个错误网站时返回
func NotFound(c *gin.Context) {
    c.JSON(http.StatusNotFound, gin.H{
        "status": 404,
        "error":  "404 ,page not exists!",
    })
}

4. 连接数据库

my_db目录下创建connect.go 文件,用于连接数据库

ackage my_db

import (
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
)
var DbName *sqlx.DB

func InitDB() (err error) {
    DbName,_ =sqlx.Connect("mysql","root:40010355@(127.0.0.1:3306)/crow")

    if err != nil {
        fmt.Printf("connect DB failed, err:%v\n", err)
        return
    }
    DbName.SetMaxOpenConns(20)
    DbName.SetMaxIdleConns(10)
    fmt.Printf("connect DB success\n")
    return
}

5. user表相关代码

说明:
在http目录下创建user.go 目录,存放user表相关代码

package my_db

import "fmt"

type User struct {
    Id     int
    Name   string
    Passwd string
    Email string
}
//用于存储用户的切片
var Slice []User

//用于临时存储用户登录信息的Map
var State = make(map[string]interface{})


func SelectUsers() []User{
    sqlStr := "select id, name, passwd,email from user where id > ?"
    err := DbName.Select(&Slice, sqlStr, 0)
    if err != nil {
        fmt.Printf("query failed, err:%v\n", err)
    }
    fmt.Printf("users:%#v\n", Slice)
    return Slice
}

func InsertUser(name string,passwd string,email string) {
    sqlStr := "insert into user(name, passwd,email) values (?,?,?)"
    _, err := DbName.Exec(sqlStr,name,passwd,email)
    if err != nil {
        fmt.Printf("insert failed, err:%v\n", err)
        return
    }
    fmt.Printf("insert success, the name is %s.\n", name)
}

6. 登陆路相关代码

models 下创建login.go文件

package models

import "testmysql/my_db"

func IsExist(user string) bool {
    my_db.Slice = my_db.SelectUsers()
    //如果长度为0说明尚未有用户注册
    if len(my_db.Slice) == 0 {
        return false
    } else {
        //遍历切片
        for _, v := range my_db.Slice {
            // return v.Name == user //此时只能和第一个比较,所以第一个之后全为false
            if v.Name == user {
                return true
            }
        }
    }
    return false
}
//判断密码是否正确
func IsRight(user string, passwd string) bool {
    for _, v := range my_db.Slice {
        if v.Name == user {
            //先确认姓名一致,密码相同返回true
            return v.Passwd == passwd
        }
    }
    return false
}

7. swagger 相关代码

swagger 的@Success@Failure 还需要两个结构体做示例
我们在models下创建swagger.go 文件,内容如下:

package models

type SuccessRespMsg struct {
    Dat interface{}  `json:"dat"`
    Err string  `json:"err"`
}

type FailRespMsg struct {
    Dat interface{} `json:"dat"`
    Err string  `json:"err"`
}

8. main.go

main.go 中内容如下
// @ 为swagger相关代码

package main

import (
    "testmysql/http"
    "testmysql/my_db"
)

// @title crow-base
// @version 1.0
// @description monitor
// @termsOfService [http://swagger.io/terms/](http://swagger.io/terms/)`
// @contact.name cloud_user
// @contact.url [http://www.swagger.io/support](http://www.swagger.io/support)`
// @contact.email support@swagger.io`
// @BasePath /

func main() {
    my_db.InitDB()
    http.ConfigRoutes()
    //my_db.InsertUser("zhangfei","40010355zf")
}

9. 测试

9.1 swagger

初始化swagger,main同级目录下执行如下命令:

swagger init

9.2 loginPost 接口测试

在这里插入图片描述 在这里插入图片描述

9.3 register 接口测试

如下,多了关羽用户


在这里插入图片描述
上一篇 下一篇

猜你喜欢

热点阅读