目录
1 介绍
Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点
对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错
借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范.
2 练习
本次练习主要在上一次代码的基础上进行了进一步的优化,
对源代码进行了层次分离。
整体目录结构如图:
## 2.1 主代码
// main.go
package main
import (
//"GINVUE/Controller"
//"GINVUE/Model"
"GINVUE/common"
"github.com/gin-gonic/gin"
_ "github.com/go-sql-driver/mysql"
//"github.com/jinzhu/gorm"
)
func main() {
//gin.SetMode(gin.ReleaseMode)
db := common.InitDB()
defer db.Close()
r := gin.Default()
panic(r.Run())
}
主函数,主要调用了一个GIn的默认web服务器实例,
并将其运行,开始监听。
package common
import (
"fmt"
"GINVUE/Model"
"github.com/jinzhu/gorm"
)
var DB *gorm.DB
func InitDB() *gorm.DB {
driverName := "mysql"
host := "localhost"
port := "3306"
database := "test"
username := "root"
password := ""
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 database!,err:" + err.Error())
}
db.AutoMigrate(&Model.User{})
DB = db
return db
}
func GetDB() *gorm.DB {
return DB
}
common 包的database文件,主要实现了,初始化一个数据库和获得一个数据实例等操作。
package Controller
import (
"GINVUE/Model"
"GINVUE/common"
"GINVUE/util"
"log"
"net/http"
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
)
func Register(ctx *gin.Context) {
db := common.GetDB()
//获取参数
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 || len(password) > 11 {
ctx.JSON(http.StatusUnprocessableEntity,
gin.H{"code": 422, "msg": "密码必须大于6位且小于11位"})
return
}
//
if len(name) == 0 {
name = util.RandomString(10)
}
log.Println(name, telephone, password)
//判断手机号是否存在
if util.IsTelephoneExist(db, telephone) {
ctx.JSON(http.StatusUnprocessableEntity,
gin.H{"code": 422, "msg": "该用户已经注册"})
return
}
//创建用户
newUser := Model.User{
Name: name,
Telephone: telephone,
Password: password,
}
db.Create(&newUser)
//返回结果
ctx.JSON(200, gin.H{
"message": "注册成功",
})
return
}
Controller 包,主要实现路由管理,目前只有一个注册路由处理函数,
后续还会有登陆等等。
package Model
import "github.com/jinzhu/gorm"
type User struct {
gorm.Model
Name string `gorm:"type:varchar(20);not null"`
Telephone string `gorm:"varchar(11);not null"`
Password string `gorm:"size:255"`
}
Model 包主要定义了数据库存储对象原型。
package util
import (
"math/rand"
"time"
)
func RandomString(n int) string {
var letters = []byte("qwertyuiopasdfghjklxzvbnmQQERTYUOIOPASDFGHJKLZXCVBNM")
result := make([]byte, n)
rand.Seed(time.Now().Unix())
for i := range result {
result[i] = letters[rand.Intn(len(letters))]
}
return string(result)
}
func IsTelephoneExist(db *gorm.DB, telephone string) bool {
var user Model.User
db.Where("telephone=?", telephone).First(&user)
if user.ID != 0 {
return true
}
return false
}
util 包主要提供了一些通用的功能代码。
package main
import (
"GINVUE/Controller"
"github.com/gin-gonic/gin"
)
func CollectRouter(r *gin.Engine) *gin.Engine {
r.POST("/api/auth/register", Controller.Register)
r.POST("/api/auth/login", Controller.Login)
return r
}
main包的第二个函数,负责管理路由。
友情援助
有问题的可以关注公众号,博主会在24小时内回复。