【Go语言】Gin框架

本文介绍了如何使用Gin框架构建RESTfulAPI,涉及包导入、路由配置、响应前端、HTTP请求处理、GormORM集成、数据库操作(包括MySQL连接和CRUD)、以及用户注册和登录功能,同时展示了中间件和会话管理的使用。
摘要由CSDN通过智能技术生成

1、导入包

import "github.com/gin-gonic/gin"

在浏览器中响应:

2、Restful Api

3、响应前端

//加载静态页面

ginServer.LoadHTMLGlob("templates/*")

//响应页面返回给前端

ginServer.Get( "index" , func( context *gin.Context)) {

        //context.JSON() //json数据

        context.HTML( http.StatusOK, "index.html" , gin.H){

        "msg" : "这是go后台传递来的数据"

}

}

//接受前端传递的参数

//url?userid = xxx &username = XXX

ginServer.GET( "/user/info" , func( context *gin.Context)){

        userid := context.Query( "userid" )

        username := context.Query( "username")

        context.JSON( http.StatusOK , gin.H){

        "userod" :  userid;

          "username" :  username,

        // /user/info/1/XXX

        ginServer.GET( "/user/info/:userid/:username"), func(context *gin.Context){

        userid := context.Param( "userid")

        username := context.Param( "username")

        context.JSON(http.StatusOK, gin.H){

                "userid": userid,

                "username": username,        

}

}

        //服务器端口

        ginServer.Run( ":8082")

}

}

4、路由

ginServer.GET("/test", func(context *gin.Context)){

        //重定向301

        context.Redirect( http.StatusMovedPermanently, "https://www.XXX.com")

})

//404 NoRoute

ginServer.NoRoute ( func(context *gin.Context )){

        context.HTML(http.StatusNotFound, "404.html", nil)

})

// 路由组 /user/add

userGroup := ginServer.Group("/user"){

        userGroup.GET("/add")

        userGroup.GET("/login")

        userGroup.GET("/logout")

}

orderGroup := ginServer.Group("/order"){

        orderGroup.GET(""/add)

        orderGroup.DELETE("/delete")

}

5、中间件

自定义一个拦截器

func myHandler() (gin.HandlerFunc){

        return func(context *gin.Context){

        // 在后续操作中,只要调用了这个中间件都可以拿到这里的参数

        context.Set( "usersession" , "userid-1")

        context.Next()  //放行

       //cotext.Abort()   //阻止

}

}

定义中间件-》注册-》调用

第二部分

1、路由

提供给前端在浏览器可以访问的链接

package router

import{

        "net/http"

        "github.com/gin-gonic/gin"

}

user := r.Group("/user")

{        

        user.GET("/info" , controllers.GetUserInfo)

        user.POST( "/list" , func( ctx *gin.Context)){

                ctx.String( http.StatusOK, user list")

        })

        user.PUT( "/add" , func( ctx *gin.Context)){

                ctx.String( http.StatusOK, user add")

        })

        user.POST( "/delete" , func( ctx *gin.Context)){

                ctx.String( http.StatusOK, user delete")

        })

}

        r.Run( ":9999")

}

2、JSON 

定义返回给前端的数据格式

package controllers

import "github.com/gin-gonic/gin"

type JsonStruct struct{

        Code int                         'json: "code" '

        Msg interface{}              'json: "msg" '

        Data interface{}              ‘json: "data" ’

        Count int64                     'json: "count" '

}

type JsonErrorStruct struct{

        Code int                         'json: "code" '

        Msg interface{}              'json: "msg" '

}

func       ReturnSuccess( c *gin.Context, code int, msg interface{}, data interface{}. count int64){

        json "= &JsonStruct{Code: code, Msg: msg, Data: data, Count: count}

        c.JSON{200 , json}

}

func       ReturnEror( c *gin.Context, code int, msg interface{}){

        json "= &JsonStruct{Code: code, Msg: msg}

        c.JSON{200 , json}

}

3、Controller

路由引用controller,controller引用JSON封装返回的ReturnSuccess函数和ReturnError函数

package controllers

import "github.com/gin-gonic/gin"

func GetUserInfo(c *gin.Context){

        ReturnSuccess(c, 0,"success","user info",1)

}

func GetList(c *gin.Context){

        RetrunError(c,4004, "没有相关信息")

}

4、Gorm 

Gorm是Go的一个ORM(对象关系映射)库。它提供了一个简单易用的API,用于与数据库交互、处理数据库迁移和执行常见的数据库操作,如查询、插入、更新和删除记录。它支持多种数据库后端,包括MySQL、PostgreSQL和SQLite等。

//连接MYSQL数据库

import(

        "gorm.io/driver/mysql"

        "gorm.io/gorm"

)

func main() {

        //参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 

        dsn := "user:pass@tcp( 127.0.0.1"3306) /dbname?charset = utf8mb4&parseTime=True&loc=local"

        db, err := gorm.Open( mysql.Open(sdn)) , &gorm.Config{})

}

package config

const(

        Mysqldb = "root:123456@tcp( 127.0.0.1:3306) /ranking?charset=utf8"

)

package dao

import(

        "gin-ranking/config"

        "gin-ranking/pkg/logger"

        "time"

        "github.com/XXX/gorm"

        "github.com/XXX/gorm/dialects/mysql"

)

var(

        Db *gorm.DB

        err error

)

func init{

        Db,err = gorm.Open("mysql" , config.Mysqldb)

        if err != nil{

                logger.Error( map[string]interface{}{"数据库连接失败"} :err.Error()})

        }

        if Db.Error != nil{

                logger.Error( map[string]interface{}{"数据库连接失败"} : Db.Error()})

        }

        Db.DB().SetMaxIdleConns(10)

        Db.DB().SetMaxOpenConns(100)

        Db.DB().SetConnMaxLifetime(time.Hour)

}

package models

import "gin-ranking/dao"

type User struct{

        Id                int

        Username  String

}

func (User) TableName() string {

        return "user"

}

func GetUserTest( id int )(User, error){

        var user User

        err := dao.Db.Where(“id= ?”, id).First(&user).Error

        return user, err

}

5、数据库下进行增删改查

创建记录

user  := User{Name: "XXX" , Age:18 Birthday: time.Now()}

result "= db.Create(&user) //通过数据的指针来创建

user.ID                //返回插入数据的主键

result.Error        //返回error

result.RowsAffected        //返回插入记录的条数

User.go

func addUser(username string) (int,error){

        user := User{Username: username}

        err := dao.Db.Create(&user).Error

        return user.Id, err

}

controller层

func (u UserController) AddUser( c *gin.Context){

        username := c.DefaultPostForm("username", "")

        id ,err := models.AddUser(username)

        if err != nil{

                ReturnError(c, 4002, "保存错误")

                return

        }

        ReturnSuccess( c, 0 ,"保存成功", id ,1)

}

添加路由

user.POST("/add", controllers.UserController{}.AddUser)

更新

user.go

func UpdateUser(id int, username string){

        dao.Db,Model(&User{}),Where(""id = ?, id).Update("username",username))

}

controller层

func (u UserController) UpdateUser( c *gin.Context){

        username := c.DefaultPostForm("username", "")

        idStr := c.DefaultPostForm("id" , "")

        id,_ "= strconv.Atoi(idStr)

        models.UpdateUser( id, username)

        ReturnSuccess( c, 0 ,"更新成功", true ,1)

}

定义路由

user.POST("/update", controllers.UserController{}.UpdateUser)

6、注册、登录功能

注册:

controller层

user.go

func (u UserController) Register(c *gin.Context) {
    //获取参数信息
    username := c.DefaultPostForm("username", "")
    password := c.DefaultPostForm("password", "")
    confirmPassword := c.DefaultPostForm("confirmPassword", "")
    if username == "" || password == "" || confirmPassword == "" {
        ReturnError(c, 4001, "请输入正确的信息")
        return
    }
    if password != confirmPassword {
        ReturnError(c, 4001, "密码和确认密码不相同")
        return
    }

    user, err := models.GetUserInfoByUsername(username)
    if user.Id != 0 {
        ReturnError(c, 4001, "此用户名已存在")
        return
    }
    _, err = models.AddUser(username, EncryMd5(password))
    if err != nil {
        ReturnError(c, 4002, "注册失败,请重试")
        return
    }

    ReturnSuccess(c, 0, "success", "", 1)
}

model层

user.go

func GetUserInfoByUsername(username string) (User, error) {

    var user User

    err := dao.Db.Where("username = ?", username).First(&user).Error

    return user, err

}

func AddUser(username string, password string) (int, error) {

    user := User{Username: username, Password: password, AddTime: time.Now().Unix(), UpdateTime: time.Now().Unix()}

    err := dao.Db.Create(&user).Error

    return user.Id, err

}

路由

user := r.Group( "/user")

{

        user.POST("/register", controllers.UserController{},Register)

}

登录:

controller

user.go

func (u UserController) Register(c *gin.Context) {
    //获取参数信息
    username := c.DefaultPostForm("username", "")
    password := c.DefaultPostForm("password", "")
    confirmPassword := c.DefaultPostForm("confirmPassword", "")
    if username == "" || password == "" || confirmPassword == "" {
        ReturnError(c, 4001, "请输入正确的信息")
        return
    }
    if password != confirmPassword {
        ReturnError(c, 4001, "密码和确认密码不相同")
        return
    }

    user, err := models.GetUserInfoByUsername(username)
    if user.Id != 0 {
        ReturnError(c, 4001, "此用户名已存在")
        return
    }
    _, err = models.AddUser(username, EncryMd5(password))
    if err != nil {
        ReturnError(c, 4002, "注册失败,请重试")
        return
    }

    ReturnSuccess(c, 0, "success", "", 1)
}

Session用于登录过程中的身份认证

//调包

"github.com/gin-contrib/sessions"

sessions_redis "github.com/gin-contrib/sessions/redis"

//注册

store, _:= sessions_redis.NewStore(10, "tcp" , config.RedisAddress, "" , []byte("secret"))

//使用

r.Use(sessions.Sessions("mysession",store))

controller层

session := sessions.Default(c)

session.Set("login:" + strconv.Itoa(user.Id), user.Id)

session.Save()

data := UserApi(Id: user.Id,Username: user.Username)

ReturnSuccess(c, 0, "登录成功",data ,1)

}

路由

user.POST("/login" , controllers.UserController{}.login)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值