Gin+Vue 2

开始跟着项目走一遍流程,https://www.bilibili.com/video/BV1CE411H7bQ,这一讲的是1~2p主要是进行最基础的搭建,是没有重构的,基本功能都在一个文件里

开始跟着教程学习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.用户注册功能

这里一步一步怎么演化的不再赘述,视频中和你一起敲代码,直接进行最后总程序的笔记

  1. 包和引用
    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"
    )
    
  2. 数据库格式
    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包会自行创建其他项目1
  3. 主函数
    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
    }
    
  4. 随机字符串生成(这个函数个人觉得很。。。)
    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)
    }
    
  5. 判断手机号是否存在
    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
    }
    
  6. 新建数据库函数
    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了。

本站总访问量

BUFF © 2018. All rights reserved.

Powered by Hydejack v8.1.1