Go 语言框架 Gin 练习2

目录

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小时内回复。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值