02-gin框架-用户登陆和注册
2022-01-13 本文已影响0人
玄德公笔记
实现简单的登陆和注册,不考虑token和需要登陆后创建用户
1. 环境说明
1.1 代码结构如下:
-
http目录
路由和 gin.cotext 相关代码 -
models
其它自己写的代码 -
my_db
数据库相关代码 -
docs
swagger 的相关文件,swagger init的时候自动创建的
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 接口测试
-
创建用户测试
在这里插入图片描述
在这里插入图片描述
- 查看数据库
如下,多了关羽用户
在这里插入图片描述
- 登陆测试
用 9.2 中方法测试关羽登陆(略)
在这里插入图片描述