81人参与 • 2025-04-24 • Golang
gin 是一个用 go 编写的轻量级、高性能的 web 框架。它的主要功能是处理 http 请求和响应,帮助开发者快速构建 web 应用程序和 api 服务。
通俗解释
gin 框架就像一个服务员,负责接收客户的订单(http 请求),根据菜单(路由规则)将订单转交给合适的厨师(处理函数),厨师准备好食物(生成响应数据)后,服务员再将食物递给客户(返回 http 响应)。
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 是一个用 go 编写的 orm(对象关系映射)库,它的主要功能是简化数据库操作。gorm 通过将数据库表映射为 go 结构体,使得开发者可以使用 go 代码来执行数据库的增删改查等操作,而不需要直接编写 sql 语句。
通俗解释:gorm 就像一个翻译器,它把开发者写的 go 代码翻译成数据库能够理解的 sql 语句,并且负责执行这些 sql 语句,将结果再翻译回 go 语言的数据结构。
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)
}
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 // 依赖文件
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)
}
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
}
package models
import "gorm.io/gorm"
// user 用户模型定义
type user struct {
gorm.model
name string `gorm:"size:255"`
email string `gorm:"uniqueindex"`
age int
}
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)
}
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
}
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)
}
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)
}
}
server_port=:8080 db_user=root db_password=password db_name=mydb db_host=localhost db_port=3306
功能:工具类目录用于存放项目中常用的工具函数和通用模块。这些函数和模块通常独立于业务逻辑,可以在项目的各个部分复用。
存放内容:
通用工具函数:例如字符串处理函数、日期时间处理函数、加密解密函数等。
配置解析函数:用于解析配置文件或环境变量的函数。
日志记录函数:处理日志记录的工具。
token处理:如token的生成、解析、验证等。
其他通用模块:如错误处理函数、文件操作函数等。
示例
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
}
功能:中间件目录用于存放在http请求处理过程中需要执行的额外操作。这些操作通常在请求到达具体的业务逻辑处理之前或之后进行,主要用于请求的预处理和后处理。
存放内容:
认证中间件:如token验证中间件,确保请求携带有效的token。
日志中间件:记录请求日志,包括请求的路径、方法、响应时间等。
错误处理中间件:统一处理错误并返回标准的错误响应。
cors中间件:处理跨域请求。
其他预处理或后处理操作:如请求限流、压缩响应等。
示例
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()
}
}
到此这篇关于gin+gorm实现goweb项目的示例代码的文章就介绍到这了,更多相关gin+gorm实现goweb内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论