首页 > 数据库 >Go+Gin+GOrm+MySql实现基础的增删改查

Go+Gin+GOrm+MySql实现基础的增删改查

时间:2024-01-16 13:22:43浏览次数:36  
标签:db router 改查 go user context MySql Go gin

一、概述

  本节使用Gin+GOrm+MySql实现基础的增删改查。主要是做一下记录防止后面忘记了可以翻看博客查看

  主要有两个.go文件

  1.main.go用于注册gin路由及初始化gorm操作数据库

  2.Result.go用于封装服务端返回给客户端的响应体

二、代码示例

  1.main.go

// go_demo1 project main.go
package main

import (
    "fmt"

    "go_demo1/entity"

    "go_demo1/token"

    "go_demo1/response"

    "time"

    "errors"

    "strconv"

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


func main() {
    //连接数据库,并返回db对象用于操作数据表
    // db = connectMySql().Debug() //连接数据库并操作user表
    // userTable = db.Table("user") //使用user表

    //实例化路由注册器
    router := gin.Default()
    //设置请求路由
    router.POST("/user/login", loginHandler)                //登录
    router.POST("/user/register", registerHandler)          //注册
    router.GET("/user/info", getUserInfoHandler)            //获取用户信息
    router.GET("/user/getUserById/:id", getUserByIdHandler) //根据用户id获取用户信息
    router.GET("/user/users", getUsersHandler)              //获取用户列表(所有用户)
    router.POST("/user/update", updateUserHandler)          //更新用户信息
    router.POST("/user/delete", deleteUserHandler)          //删除用户
    //集和章节多表联查
    router.GET("/getECs", getECsHandler)
    //文件上传upload

    //设置服务端监听端口
    router.Run(":8888")
    fmt.Println("Hello World!")
}

// 连接数据库
func connectMySql() *gorm.DB {
    dsn := "root:123456@tcp(localhost:3306)/tony_cursor?charset=utf8&parseTime=true&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) //打开数据库连接
    if err != nil {
        panic("failed to connect database")
    }
    //把表和结构体连接起来,如果没有表就会创建一个,如果有此表也会在表中添加原本表中没有的列
    //如果不想使用自动迁移,可以使用db.Table("表明")来指定要操作的表
    // db.AutoMigrate(&entity.User{})

    return db
}

// 登录
func loginHandler(context *gin.Context) {
    var user entity.User
    err := context.ShouldBindJSON(&user)
    fmt.Println("登录参数:", user)
    if len(user.Phone) == 0 || len(user.Pwd) == 0 {
        response.ShowError(400, "用户名密码不能为空", context)
        return
    }
    if err != nil {
        response.ShowError(400, "参数异常:"+err.Error(), context)
        return
    }
    userTable := connectMySql().Table("user").Debug()

    var count int64
    err1 := userTable.Where("phone=?", user.Phone).Count(&count).Error
    fmt.Println("是否有记录:", count)
    if count <= 0 || err1 != nil {
        response.ShowError(200, "没有此用户", context)
        return
    }
    var users []entity.User
    //加上debug说明输出sql执行的操作(出于debug模式)
    err2 := userTable.Where("phone=? AND pwd=?", user.Phone, user.Pwd).Find(&users).Error
    fmt.Println(len(users))
    fmt.Println(users)
    // err2 := userTable.Where(&entity.User{Phone: user.Phone, Pwd: user.Pwd}).Find(&users).Error
    if len(users) <= 0 || err2 != nil {
        response.ShowError(200, "用户名或密码不正确", context)
        return
    }
    //生成token
    mToken, err3 := token.CreateToken(users[0])
    if err3 != nil {
        response.ShowError(200, "token生成失败", context)
        return
    }
    response.ShowSuccess(mToken, context)
}

// 注册
func registerHandler(context *gin.Context) {
    //获取参数
    var user entity.User
    err := context.ShouldBindJSON(&user)
    if err != nil {
        response.ShowError(400, "参数异常:"+err.Error(), context)
        return
    }
    if len(user.Phone) == 0 || len(user.Pwd) == 0 {
        response.ShowError(400, "参数不能为空", context)
        return
    }
    userTable := connectMySql().Table("user").Debug()
    user.CreateTime = time.Now().Format("2006-01-02 15:04:05")
    user.UpdateTime = time.Now().Format("2006-01-02 15:04:05")
    err2 := userTable.Create(&user).Error
    if err2 != nil {
        response.ShowError(200, "创建用户失败", context)
        return
    }
    response.ShowSuccess("创建成功", context)
}

func checkToken(context *gin.Context) (int64, error) {
    //获取authorization header
    Authorization := context.GetHeader("Authorization")
    fmt.Println("Authorization:", Authorization)
    if Authorization == "" {
        return 0, errors.New("token为空")
    }
    //解析token
    mToken, claims, err := token.ParseToken(Authorization)
    fmt.Println("token:", mToken)
    fmt.Println("claims:", claims)
    if err != nil || !mToken.Valid { //解析错误或者token过期
        return 0, errors.New("token过期/错误")
    }
    return claims.Id, nil

}

// 获取用户信息
func getUserInfoHandler(context *gin.Context) {
    id, err := checkToken(context)
    if err != nil {
        response.ShowError(400, err.Error(), context)
        return
    }
    db := connectMySql().Table("user").Debug()
    var user entity.User
    err2 := db.Where("id=?", id).First(&user).Error
    if err2 != nil {
        response.ShowError(500, "查询失败", context)
        return
    }
    response.ShowSuccess(user, context)

}

// 根据用户id获取用户信息
func getUserByIdHandler(context *gin.Context) {
    id := context.Param("id")
    _, err := checkToken(context)
    if err != nil {
        response.ShowError(400, err.Error(), context)
        return
    }
    db := connectMySql().Table("user").Debug()
    var user entity.User
    err2 := db.Where("id=?", id).First(&user).Error
    if err2 != nil {
        response.ShowError(500, "查询失败", context)
        return
    }
    response.ShowSuccess(user, context)
}

// 分页
func getUsersWidthPagination(page, pageSize int) ([]entity.User, error) {
    //执行查询并获取结果
    var users []entity.User
    //设置分页参数
    db := connectMySql().Table("user").Debug()
    offset := (page - 1) * pageSize
    limit := pageSize
    //执行查询结果
    err := db.Where("deleted=?", 0).Offset(offset).Limit(limit).Find(&users).Error
    return users, err
}

// 获取用户列表
func getUsersHandler(context *gin.Context) {
    _, err := checkToken(context)
    if err != nil {
        response.ShowError(400, err.Error(), context)
        return
    }

    //用于分页
    page, _ := strconv.Atoi(context.Query("page"))
    pageSize, _ := strconv.Atoi(context.Query("pageSize"))

    users, err2 := getUsersWidthPagination(page, pageSize)
    if err2 != nil {
        response.ShowError(500, "查询失败", context)
        return
    }
    response.ShowSuccess(users, context)
}

// 更新用户信息
func updateUserHandler(context *gin.Context) {
    _, err := checkToken(context)
    if err != nil {
        response.ShowError(400, err.Error(), context)
        return
    }
    db := connectMySql().Table("user").Debug()
    var user entity.User
    err2 := context.ShouldBindJSON(&user)
    if err2 != nil {
        response.ShowError(400, "参数异常", context)
        return
    }
    if len(user.Name) == 0 {
        response.ShowError(500, "用户名不能为空", context)
        return
    }
    err3 := db.Where("id=?", user.Id).Update("name", user.Name).Error
    if err3 != nil {
        response.ShowError(500, "更新失败", context)
        return
    }
    response.ShowSuccess("更新成功", context)

}

// 删除用户
func deleteUserHandler(context *gin.Context) {
    _, err := checkToken(context)
    if err != nil {
        response.ShowError(400, err.Error(), context)
        return
    }
    db := connectMySql().Table("user").Debug()
    var user entity.User
    err2 := context.ShouldBindJSON(&user)
    if err2 != nil {
        response.ShowError(400, "参数异常", context)
        return
    }
    if user.Id <= 0 {
        response.ShowError(400, "被删除的用户id不能为空", context)
        return
    }
    err3 := db.Where("id=?", user.Id).Update("deleted", 1).Error
    if err3 != nil {
        response.ShowError(500, "逻辑删除失败", context)
        return
    }
    response.ShowSuccess("逻辑删除成功", context)
}

  2.Result.go

package response

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

// 正常返回
func ShowSuccess(data interface{}, context *gin.Context) {
    context.JSON(200, gin.H{"code": 200, "data": data, "message": "操作成功"})
}

// 异常返回
func ShowError(code int, message string, context *gin.Context) {
    context.JSON(code, gin.H{"code": code, "data": "", "message": message})
}

 

标签:db,router,改查,go,user,context,MySql,Go,gin
From: https://www.cnblogs.com/tony-yang-flutter/p/17967454

相关文章

  • 基于标签值分布的强化学习推荐算法(Reinforcement Learning Recommendation Algorithm
    前言看论文的第三天,坚持下去。慢慢来,比较快。——唐迟本文基于2023年6月28日发表在MATHEMATICS上的一篇名为“基于标签值分布的强化学习推荐算法”(ReinforcementLearningRecommendationAlgorithmBasedonLabelValueDistribution)的文章。文章提出了一种基于标签分布......
  • Fpga开发笔记(二):高云FPGA发开发软件Gowin和高云fpga基本开发过程
    前言  本篇安装高云的开发软件Gowin,并且描述了一个基于高云fpga的程序的开发环境和完整的下载运行过程。 Gowin软件概述  Gowin软件是广东高云半导体股份有限公司的FPGA开发软件。下载地址  http://www.gowinsemi.com.cn    申请license......
  • 一文让你对mysql索引底层实现明明白白
    开篇:图片是本人随笔画的,有点粗糙,望大家谅解,如有不妥之处,请联系我们,感谢一、索引到底是什么.索引是帮助mysql高效获取数据的排好序的数据结构.索引是存储在文件里的.数据结构:二叉树HASHBTREE   如果没有索引的话,循环一条一条的找,找一次就是一次IO,这样速度就会很慢......
  • 一文让你对mysql索引底层实现明明白白
    开篇:图片是本人随笔画的,有点粗糙,望大家谅解,如有不妥之处,请联系我们,感谢。一、索引到底底是什么.索引是帮助mysql高效获取数据的排好序的数据结构.索引是存储在文件里的.数据结构:二叉树HASHBTREE如果没有索引的话,循环一条一条的找,找一次就是一次IO,这样速度就会很慢我们知道数据库......
  • Django中安装websocket
    完整代码:https://gitee.com/mom925/django-system项目结构:先安装所需库:pipinstallchannels下面将websocket作为插件一样的只需要引入配置的结构asgi.py文件http请求不变、修改websocket请求调用路径importosimportdjangofromchannels.httpimportAsgiHandlerfr......
  • JavaSE(13) - 常见算法 algorithm
    JavaSE(13)-常见算法algorithm查找算法Search基本查找BasicSearchpackagealgorithm.search;/*BasicSearch1.用基本查找,查找某个元素在数组中的索引(不考虑重复元素)2.用基本查找,查找某个元素在数组中的索引(考虑重复元素)*/publicclassBasicSearch{public......
  • Golang实现程序优雅退出的方法 有哪些 ?
    Golang实现程序优雅退出的方法有哪些?原创磊丰Go语言圈2024-01-1608:31发表于广东听全文学习与交流:Go语言技术微信群商务合作加微信:LetsFeng   现在就开始你的Go语言学习之旅吧!人生苦短,let’sGo.      Goland全家桶激活码,永久有效,亲测可用,限时免......
  • 在Linux下, 不使用包管理器安装Golang sdk
    尝试从targz安装go下面这个是go官网的,注意使用代理下载;wgethttps://go.dev/dl/go1.21.6.linux-amd64.tar.gztar-zxvfgo1.13.1.linux-amd64.tar.gzmvgo//usr/local/将go添加到环境变量:确实fishshell是这样设置环境变量的吗?vim/etc/profile加入以下内容:e......
  • django05
    模板语法之过滤器(类似于内置函数)'''使用的时候可以看看源码'''1.语法结构数据对象|过滤器名称:参数22.常见过滤器(用在html文件里面)(django模板语法提供了60+过滤器,我们了解几个即可)①<p>统计数据的长度:{{s1|length}}</p>②<p>算术加法或者字符串加法:{{s1|add:111}}</......
  • mysql 中 utf8、utf16、utf32、utf8mb3、utf8mb4的区别
    UTF-8-“大小优化”:最适合基于拉丁字符的数据(或ASCII),每个字符只需1个字节,但大小相应增加符号种类(在最坏的情况下,每个字符最多可增加6个字节)UTF-16-“平衡”:每个字符至少需要2个字节,足以支持现有的主流语言集,并且具有固定的大小以便于字符处理(但是大小仍然可变,每个字符最多......