Go+Gin+Vue 第二天 开始项目

杂记

第一,http.StatusUnprocessableEntity 和 422 一样,都是状态值

第二,H其实是一个别名,我们可以看到源码中有说明:
在这里插入图片描述
也就是说,这两句其实是一个意思:

ctx.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "手机号必须为11位"})
ctx.JSON(http.StatusUnprocessableEntity, map[string]interface{}{"code": 422, "msg": "手机号必须为11位"})

3,我们在使用Postman测试的时候,需要我们传给后端数据时需要在这里写:
在这里插入图片描述
不然我们的go后端接收不到Postman发送的信息的!

一,正式开始

main.go中代码如下

package main

import (
	"fmt"
	"math/rand"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
)

func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()
	r.POST("/api/auth/register", func(ctx *gin.Context) {
		//获取参数
		name := ctx.PostForm("name")
		telephone := ctx.PostForm("telephone")
		password := ctx.PostForm("password")

		//数据验证
		if len(telephone) != 11 {
			ctx.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "手机号必须为11位"})
			// ctx.JSON(http.StatusUnprocessableEntity, map[string]interface{}{"code": 422, "msg": "手机号必须为11位"})
			return
		}

		if len(password) < 6 {
			ctx.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "密码不能少于6位"})
			return
		}

		//如果名称没有传,给一个10位的随机数
		if len(name) == 0 {
			name = RandomString(10)
		}

		fmt.Println(name, telephone, password)

		//判断手机号是否存在

		//创建用户

		//返回结果

		// c.JSON:返回JSON格式的数据
		ctx.JSON(200, gin.H{
			"msg": "注册成功",
		})
	})
	// 启动HTTP服务,默认在0.0.0.0:8080启动服务
	// r.Run()
	panic(r.Run())
}

func RandomString(n int) string {
	var letters = []byte("asdfghjklqwertyuiopzxcvbnm")
	result := make([]byte, n)

	rand.Seed(time.Now().Unix())
	for i := range result {
		result[i] = letters[rand.Intn(len(letters))]
	}

	return string(result)
}


go run main.go 让我们的程序跑起来!

二,使用Postman测试一下

在这里插入图片描述
可以看到在Postman中出现了我们main.go中写的东西,同时也在main.go终端中输出:
在这里插入图片描述
证明我们发送POST请求被成功接收到了!

继续测试一下传参数
在这里插入图片描述
在终端中可以看到我们通过Postman转送的参数也可以被接收到!
在这里插入图片描述

小小总结一下

我们可以从代码中分析到,

name := ctx.PostForm("name")
telephone := ctx.PostForm("telephone")
password := ctx.PostForm("password")

1,这三句是接受前端发送的POST请求中发送过来的三个参数的

ctx.JSON(200, gin.H{
	"msg": "注册成功",
})

2,这三句是返回给前端的信息

3,加上数据库

我们使用Gorm
在终端中输入:

go get -u github.com/jinzhu/gorm

然后在我们的main.go里建立一个结构体

type User struct {
	gorm.Model
	Name string `gorm:"type:varchar(20);not null"`
	Telephone string `gorm:"varchar(11);not null,unique"`
	Password string `gorm:"size:255;not null"`
}

再建立连接池
这里我使用的是PostgreSQL
(记得先开启服务哦)
在这里插入图片描述
优化我们的代码

package main

import (
	"fmt"
	"math/rand"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/postgres" //这里可能需要我们自己在终端下载一下 go get  "github.com/jinzhu/gorm/dialects/postgres"
)

type User struct {
	gorm.Model
	Name      string `gorm:"type:varchar(20);not null"`
	Telephone string `gorm:"varchar(11);not null,unique"`
	Password  string `gorm:"size:255;not null"`
}

func main() {
	db := InitDB()   //获取初始化的DB
	defer db.Close() //延时关闭

	// 创建一个默认的路由引擎
	r := gin.Default()
	r.POST("/api/auth/register", func(ctx *gin.Context) {
		//获取参数
		name := ctx.PostForm("name")
		telephone := ctx.PostForm("telephone")
		password := ctx.PostForm("password")

		//数据验证
		if len(telephone) != 11 {
			ctx.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "手机号必须为11位"})
			// ctx.JSON(http.StatusUnprocessableEntity, map[string]interface{}{"code": 422, "msg": "手机号必须为11位"})
			return
		}

		if len(password) < 6 {
			ctx.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "密码不能少于6位"})
			return
		}

		//如果名称没有传,给一个10位的随机数
		if len(name) == 0 {
			name = RandomString(10)
		}

		fmt.Println(name, telephone, password)

		//判断手机号是否存在
		if isTelephoneExist(db, telephone) {
			ctx.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "用户已经存在,不能注册"})
			return
		}

		//创建用户
		newUser := User{
			Name: name,
			Telephone: telephone,
			Password: password,
		}
		db.Create(&newUser)

		//返回结果

		// c.JSON:返回JSON格式的数据
		ctx.JSON(200, gin.H{
			"msg": "注册成功",
		})
	})
	// 启动HTTP服务,默认在0.0.0.0:8080启动服务
	// r.Run()
	panic(r.Run())
}

func isTelephoneExist(db *gorm.DB, telephone string) bool {
	var user User
	db.Where("telephone = ?", telephone).First(&user)
	if user.ID != 0 {
		return true
	}
	return false
}

func RandomString(n int) string {
	var letters = []byte("asdfghjklqwertyuiopzxcvbnm")
	result := make([]byte, n)

	rand.Seed(time.Now().Unix())
	for i := range result {
		result[i] = letters[rand.Intn(len(letters))]
	}

	return string(result)
}

//开启连接池
func InitDB() *gorm.DB {
	db, err := gorm.Open("postgres", "host=localhost port=5432 user=postgres dbname=study password=你的数据库的密码 sslmode=disable")

	if err != nil {
		panic("fail to connect database, err: " + err.Error())
	}

	//Gorm为我们自动创建数据表
	db.AutoMigrate(&User{})

	return db
}

运行该程序后,我们可以看到Gorm为我们自动在study数据库下创建好了一个数据表User,它与我们在程序中定义的结构体同名,且内容多了4个(哪四个呢?)
在这里插入图片描述
我们使用Postman测试一下:
在这里插入图片描述
来到我们的Postgre数据库中,我们可以看到该数据已经插入到数据库中了!
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值