Gin+Vue 2
in 语言/工程/算法
开始跟着教程学习Gin+Vue(用户注册)
教程为B站上一个系列的教程,最喜欢这种从零开始一步一步打代码的教程了,下面都是学习和个人实践的笔记,我会列出我遇到的一些实现上的问题,也欢迎遇到新的问题联系我的邮箱和我讨论。
1.新建工程
- 新建文件夹,进入文件夹
- 新建main.go
- 打卡终端,输入go mod init (公司域名或者团队代号)/(project name),新建go.mod
- 安装Gin依赖 go get -u github.com/gin-gonic/gin
- 打开设置,Go->Go Modules(vgo)->Enable Go Modules(vgo) 点选,Goland自动添加依赖
- 复制Gin官网例程,最后一行panic是一个异常捕捉器
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) panic(r.Run()) // listen and serve on 0.0.0.0:8080 }
- go run main.go,访问localhost:8080/ping,返回pong,成功!
2.用户注册功能
这里一步一步怎么演化的不再赘述,视频中和你一起敲代码,直接进行最后总程序的笔记
- 包和引用
package main import ( "fmt" "github.com/gin-gonic/gin" "github.com/jinzhu/gorm" //注意一下,如果之前用过go,可能gorm会下载成gorm.io下的包导致错误 _ "github.com/go-sql-driver/mysql" //注意可能需要自己添加 "log" "math/rand" "net/http" "time" )
- 数据库格式
type User struct { gorm.Model Name string `gorm:"type:varchar(20);not null"` Telephone string `gorm:"varchar(110);not null;unique"` Password string `gorm:"size:255";not null` }
- 相较于Java的SSM,gorm在数据库管理上封装的不错不需要写xml,不过可能是没用Springboot,整体上简洁于Java。
- gorm包会自行创建其他项目
- 主函数
func main() { db := InitDB() // 新建数据库 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位"}) return } if len(password)<6{ ctx.JSON(http.StatusUnprocessableEntity,gin.H{"code":422,"msg":"密码不得少于6位"}) return } //如果名称没有传,给一个10位字符串 if len(name) == 0 { name = RandomSting(10) } log.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) ctx.JSON(200, gin.H{ "msg": "注册成功", }) }) r.Run() // listen and serve on 0.0.0.0:8080 }
- 随机字符串生成(这个函数个人觉得很。。。)
func RandomSting(n int) string { var letter = []byte("fdsafdsafgfdAKIHFKDYSsdafDSFGAsfdsFDSAFbe") result:=make([]byte,n) rand.Seed(time.Now().Unix()) for i:=range result{ result[i] = letter[rand.Intn(len(letter))] } return string(result) }
- 判断手机号是否存在
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 InitDB() *gorm.DB { driverName:="mysql" host := "localhost" port:= "3306" database:="ginessential" //navicat新建一个数据库 username:="root" password:="123456" //填上自己的密码 charset:="utf8" args:=fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true", username, password, host, port, database, charset) db,err:=gorm.Open(driverName, args) if err != nil{ panic("failed to connect detabase, err:" + err.Error()) } db.AutoMigrate(&User{}) return db }
3. 附上总代码
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm" //注意一下,如果之前用过go,可能gorm会下载成gorm.io下的包导致错误
_ "github.com/go-sql-driver/mysql" //注意可能需要自己添加
"log"
"math/rand"
"net/http"
"time"
)
type User struct {
gorm.Model
Name string `gorm:"type:varchar(20);not null"`
Telephone string `gorm:"varchar(110);not null;unique"`
Password string `gorm:"size:255";not null`
}
func main() {
db := InitDB() // 新建数据库
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位"})
return
}
if len(password)<6{
ctx.JSON(http.StatusUnprocessableEntity,gin.H{"code":422,"msg":"密码不得少于6位"})
return
}
//如果名称没有传,给一个10位字符串
if len(name) == 0 {
name = RandomSting(10)
}
log.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)
ctx.JSON(200, gin.H{
"msg": "注册成功",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}
func RandomSting(n int) string {
var letter = []byte("fdsafdsafgfdAKIHFKDYSsdafDSFGAsfdsFDSAFbe")
result:=make([]byte,n)
rand.Seed(time.Now().Unix())
for i:=range result{
result[i] = letter[rand.Intn(len(letter))]
}
return string(result)
}
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 InitDB() *gorm.DB {
driverName:="mysql"
host := "localhost"
port:= "3306"
database:="ginessential"
username:="root"
password:="123456"
charset:="utf8"
args:=fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true",
username,
password,
host,
port,
database,
charset)
db,err:=gorm.Open(driverName, args)
if err != nil{
panic("failed to connect detabase, err:" + err.Error())
}
db.AutoMigrate(&User{})
return db
}
## 4. 总结
这样就完成基础的响应到数据库搭建,下面就是开始进行工程的重构,要开始分MVC了。