it编程 > 前端脚本 > Golang

gin+gorm实现goweb项目的示例代码

17人参与 2025-04-24 Golang

gin

1. 主要功能

2. 工作流程

3. 示例

package main

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

func main() {
    r := gin.default()

    r.get("/ping", func(c *gin.context) {
        c.json(http.statusok, gin.h{
            "message": "pong",
        })
    })

    r.run(":8080")
}


gorm

1. 主要功能

2. 工作流程

3. 示例

package main

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

type user struct {
    id    uint   `gorm:"primarykey"`
    name  string `gorm:"size:255"`
    email string `gorm:"uniqueindex"`
    age   int
}

func main() {
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parsetime=true&loc=local"
    db, err := gorm.open(mysql.open(dsn), &gorm.config{})
    if err != nil {
        log.fatal(err)
    }

    // 自动迁移
    db.automigrate(&user{})

    // 创建记录
    db.create(&user{name: "john", email: "john@example.com", age: 25})

    // 读取记录
    var user user
    db.first(&user, 1) // 查询主键为1的用户
    log.println(user)

    // 更新记录
    db.model(&user).update("age", 26)

    // 删除记录
    db.delete(&user)
}

gin+gorm项目实操

1. 项目目录结构

my-gin-gorm-project/
│
├── cmd/
│   └── main.go        // 主程序入口
│
├── config/
│   └── config.go      // 配置文件解析
│
├── controllers/
│   └── user.go        // 用户相关的控制器
│
├── models/
│   └── user.go        // 用户模型定义
│
├── routes/
│   └── routes.go      // 路由定义
│
├── middlewares/
│   └── auth.go        // 认证中间件
│
├── services/
│   └── user.go        // 用户相关的业务逻辑
│
├── repositories/
│   └── user.go        // 用户数据访问层
│
├── utils/
│   └── utils.go       // 工具函数
│
├── .env               // 环境变量文件
├── go.mod             // go模块文件
└── go.sum             // 依赖文件

2. 主程序入口(cmd/main.go)

package main

import (
    "my-gin-gorm-project/config"
    "my-gin-gorm-project/routes"
    "github.com/gin-gonic/gin"
    "gorm.io/gorm"
)

var db *gorm.db

func main() {
    // 解析配置文件
    config.loadconfig()

    // 初始化数据库连接
    db = config.initdb()

    // 设置gin引擎
    r := gin.default()

    // 注册路由
    routes.registerroutes(r)

    // 启动服务器
    r.run(config.config.serverport)
}

3. 配置文件解析(config/config.go)

package config

import (
    "log"
    "os"
    "github.com/joho/godotenv"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

var config struct {
    serverport string
    dbuser     string
    dbpassword string
    dbname     string
    dbhost     string
    dbport     string
}

// loadconfig 解析配置文件
func loadconfig() {
    if err := godotenv.load(); err != nil {
        log.fatal("error loading .env file")
    }

    config.serverport = os.getenv("server_port")
    config.dbuser = os.getenv("db_user")
    config.dbpassword = os.getenv("db_password")
    config.dbname = os.getenv("db_name")
    config.dbhost = os.getenv("db_host")
    config.dbport = os.getenv("db_port")
}

// initdb 初始化数据库连接
func initdb() *gorm.db {
    dsn := config.dbuser + ":" + config.dbpassword + "@tcp(" + config.dbhost + ":" + config.dbport + ")/" + config.dbname + "?charset=utf8mb4&parsetime=true&loc=local"
    db, err := gorm.open(mysql.open(dsn), &gorm.config{})
    if err != nil {
        log.fatal("failed to connect to database:", err)
    }
    return db
}

4. 用户模型定义(models/user.go)

package models

import "gorm.io/gorm"

// user 用户模型定义
type user struct {
    gorm.model
    name  string `gorm:"size:255"`
    email string `gorm:"uniqueindex"`
    age   int
}

5. 用户相关的控制器(controllers/user.go)

package controllers

import (
    "my-gin-gorm-project/models"
    "my-gin-gorm-project/services"
    "net/http"
    "github.com/gin-gonic/gin"
)

// getusers 获取所有用户
func getusers(c *gin.context) {
    users := services.getallusers()
    c.json(http.statusok, users)
}

// createuser 创建新用户
func createuser(c *gin.context) {
    var user models.user
    if err := c.shouldbindjson(&user); err != nil {
        c.json(http.statusbadrequest, gin.h{"error": err.error()})
        return
    }
    if err := services.createuser(&user); err != nil {
        c.json(http.statusinternalservererror, gin.h{"error": err.error()})
        return
    }
    c.json(http.statusok, user)
}

6. 用户数据访问层(repositories/user.go)

package repositories

import (
    "my-gin-gorm-project/models"
    "gorm.io/gorm"
)

var db *gorm.db

// setdb 设置数据库实例
func setdb(db *gorm.db) {
    db = db
}

// getallusers 获取所有用户
func getallusers() ([]models.user, error) {
    var users []models.user
    if err := db.find(&users).error; err != nil {
        return nil, err
    }
    return users, nil
}

// createuser 创建新用户
func createuser(user *models.user) error {
    if err := db.create(user).error; err != nil {
        return err
    }
    return nil
}

7. 用户相关的业务逻辑(services/user.go)

package services

import (
    "my-gin-gorm-project/models"
    "my-gin-gorm-project/repositories"
)

// getallusers 获取所有用户
func getallusers() []models.user {
    users, _ := repositories.getallusers()
    return users
}

// createuser 创建新用户
func createuser(user *models.user) error {
    return repositories.createuser(user)
}

8. 路由定义(routes/routes.go)

package routes

import (
    "my-gin-gorm-project/controllers"
    "github.com/gin-gonic/gin"
)

// registerroutes 注册所有路由
func registerroutes(r *gin.engine) {
    // 用户相关路由
    userroutes := r.group("/users")
    {
        userroutes.get("/", controllers.getusers)
        userroutes.post("/", controllers.createuser)
    }
}

9. 环境变量文件(.env)

server_port=:8080
db_user=root
db_password=password
db_name=mydb
db_host=localhost
db_port=3306

10. 补充:关于utils和middlewares的区别以及使用

utils(工具类)

示例

package utils

import (
    "time"
    "github.com/dgrijalva/jwt-go"
    "os"
    "errors"
)

var jwtsecret = []byte(os.getenv("jwt_secret"))

// claims 自定义的声明
type claims struct {
    userid uint
    jwt.standardclaims
}

// generatetoken 生成token
func generatetoken(userid uint) (string, error) {
    expirationtime := time.now().add(24 * time.hour)
    claims := &claims{
        userid: userid,
        standardclaims: jwt.standardclaims{
            expiresat: expirationtime.unix(),
        },
    }
    token := jwt.newwithclaims(jwt.signingmethodhs256, claims)
    tokenstring, err := token.signedstring(jwtsecret)
    if err != nil {
        return "", err
    }
    return tokenstring, nil
}

// parsetoken 解析token
func parsetoken(tokenstring string) (*claims, error) {
    claims := &claims{}
    token, err := jwt.parsewithclaims(tokenstring, claims, func(token *jwt.token) (interface{}, error) {
        return jwtsecret, nil
    })
    if err != nil {
        return nil, err
    }
    if !token.valid {
        return nil, errors.new("invalid token")
    }
    return claims, nil
}

middlewares(中间件)

示例

package middlewares

import (
    "my-gin-gorm-project/utils"
    "net/http"
    "strings"

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

// authmiddleware 认证中间件
func authmiddleware() gin.handlerfunc {
    return func(c *gin.context) {
        tokenstring := c.getheader("authorization")
        if tokenstring == "" {
            c.json(http.statusunauthorized, gin.h{"error": "请求头中缺少token"})
            c.abort()
            return
        }

        tokenstring = strings.trimprefix(tokenstring, "bearer ")

        claims, err := utils.parsetoken(tokenstring)
        if err != nil {
            c.json(http.statusunauthorized, gin.h{"error": "无效的token"})
            c.abort()
            return
        }

        c.set("userid", claims.userid)
        c.next()
    }
}

11. 项目运行流程

到此这篇关于gin+gorm实现goweb项目的示例代码的文章就介绍到这了,更多相关gin+gorm实现goweb内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

golang使用RSA加密和解密的实现示例

04-24

Go语言标准库中math模块详细功能介绍与示例代码

04-24

GORM框架实现分页的示例代码

04-24

Go语言中html/template模块详细功能介绍与示例代码

04-24

golang中进行条件编译的示例详解

04-24

Go语言fmt模块的完整方法详解及示例代码

04-24

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论