gin框架学习(一)

0.前言

本系列使用的开发环境如下:

  • goland
  • go 1.17.1

在本小节中,首先在项目中完成了gin框架的导入,并编写了helleworld进行测试,然后导入gorm包,并将gorm和gin联合起来开发了一个简单的注册逻辑。

1.创建工作目录

在goland中创建gin_test项目,并创建main.go文件

gin框架学习(一)_第1张图片

2.安装并测试GIN框架

2.1 安装gin包

进入上节中创建的gin_test目录中,输入如下命令

go get -u github.com/gin-gonic/gin

注意,这里可能会遇到超时错误,这是因为包被墙了,我们可以对GO环境进行配置来解决这个问题,具体可看博主的另一篇文章go module配置。

安装完后,我们可以在go.mod中看到很多gin依赖。

2.2 编写helloworld进行测试

在main.go文件中输入如下代码:

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",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}

运行后,进入http://localhost:8080/ping可以看到pong消息。

3.安装并测试gorm包

在gin_test目录下运行如下命令:

go get -u gorm.io/gorm

这里我们使用的是mysql,所以还要包含如下包:

go get gorm.io/driver/mysql

我们编写以下的一个简单代码来进行测试,代码中定义了一个user结构体,将会映射成为数据库中的表,并基于此表进行了一些增删改查的操作:

package main

import (
   "fmt"
   "gorm.io/driver/mysql"
   "gorm.io/gorm"
)

//定义结构体到数据库的映射,设置name为非空且唯一
type User struct {
   gorm.Model
    Name string `gorm:"not null;unique"`
   Telephone string
   Password string
}

func main() {
   db:=InitDb()
   //自动创建数据表
   db.AutoMigrate(&User{})
   db.Create(&User{Name: "yzy",
      Password: "123456"})
   var user User
   fmt.Print(user)
   fmt.Printf("----------\n")
   db.First(&user,"name=?","yzy")
   fmt.Print(user)
   fmt.Printf("----------\n")

}

func InitDb() *gorm.DB{
//一些数据库的参数
   username:="root"
   password:="123456"
   host:="localhost"
   port:="3306"
   charset:="utf8"
   database:="test" //使用test数据库

   dns:=fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true",
      username,
      password,
      host,
      port,
      database,
      charset)
    //后面还可以传入一些对数据库特殊的定义
   db,err:=gorm.Open(mysql.Open(dns))
   if err != nil {
      panic("failed to connect database,err:"+err.Error())
   }
   return db

}

在运行前别忘记开启数据库服务并创建代码中指定的数据库。

net start mysql
//进入mysql
mysql -u root -p
//创建数据库
creat database test

运行后查询数据库

select * from users;

4.编写注册逻辑

代码如下:

package main

import (
   "fmt"
   "github.com/gin-gonic/gin"
   "gorm.io/driver/mysql"
   "gorm.io/gorm"
)

type User struct {
   gorm.Model
   Name string
   Telephone string `gorm:"unique;not null"`
   Password string `gorm:"not null"`
}

func main(){
   db:=InitDb()
   db.AutoMigrate(&User{})
   router:=gin.Default()
   router.GET("/register",Register)

   router.Run()
}


func Register(c *gin.Context){
   db:=InitDb()
//获取数据
   name:=c.Query("name")
   password:=c.Query("password")
   telephone:=c.Query("telephone")
   if len(telephone)!=11{
   	c.JSON(400,gin.H{
   		"error":"the telephone is not correct",
   	})
   	return
   }
//判断
   if isTelephoneExist(db,telephone){
   c.JSON(400,gin.H{
   	"error":"the telephone is already exit",
   		})
   	return
   }
   //插入数据
   db.Create(&User{Name: name,Password: password,Telephone: telephone})
   c.JSON(200,gin.H{
   	"msg":"succeed",
   })
   return
}

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

func InitDb()*gorm.DB{
   username:="root"
   password:="123456"
   database:="gin_demo"
   charset:="utf8"
   port:="3306"
   host:="localhost"
   dns:=fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True",
   	username,
   	password,
   	host,
   	port,
   	database,
   	charset)

   db,err:=gorm.Open(mysql.Open(dns))
   if err != nil {
   	panic("can't connect to the mysql"+err.Error())
   }
   return db
}

6.总结

今天实现的一个小demo所有功能都写在一个包中,在业务扩大后,这样的架构就会显得十分臃肿不好维护,因为接下来将会对项目架构进行重新设计。

你可能感兴趣的:(GO语言,其他,gin,学习,数据库)