初始化项目
- 初始化 go 项目
go mod init <program-name>
- 配置国内镜像
go env -w GOPROXY=https://goproxy.io,direct
- 引入 gin 框架
go get -u github.com/gin-gonic/gin
- 编写一个网络请求
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": "ping", }) }) r.Run(":9999") // 在9999端口启动服务,不填默认在8080端口启动 }
- 启动项目
go run main.go
网站目录初始化
定义一个初始化的项目目录,方便后期开发
--| api/ # 放置api接口,相当于controller --| v1/ --| config/ # 放置网站配置文件 --| config.ini --| middleware/ # 中间件 --| model/ # 数据模型 --| routes/ # 网站路由 --| upload/ # 上传静态文件托管 --| utils/ # 公共函数 --| web/ # 前端静态文件托管 --| main.go # 项目入口
使用 ini 做网站配置
go get -u gopkg.in/ini.v1
# 网站服务配置 [server] AppMode = debug # debug or server HttpPort = :9999 JWTToken = ajlsdflasjdjlasjdlf # 数据库配置 [database] DB = mysql DBHost = localhost DBPort = 3306 DBUser = root DBPwd = admin888 DBName = ginblog
package utils import ( "fmt" "gopkg.in/ini.v1" ) var ( AppMode string HttpPort string JWTToken string DB string DBHost string DBPort string DBUser string DBPwd string DBName string ) func init() { file, err := ini.Load("config/config.ini") if err != nil { fmt.Println("配置文件错误,请确认配置文件是否正确") } LoadServer(file) LoadDataBase(file) } // 加载网站配置 func LoadServer(file *ini.File) { AppMode = file.Section("server").Key("AppMode").MustString("debug") HttpPort = file.Section("server").Key("HttpPort").MustString(":9999") JWTToken = file.Section("server").Key("JWTToken").MustString("ajlsdflasjdjlasjdlf") } // 加载数据库配置 func LoadDataBase(file *ini.File) { DB = file.Section("database").Key("DB").MustString("mysql") DBHost = file.Section("database").Key("DBHost").MustString("localhost") DBPort = file.Section("database").Key("DBPort").MustString("3306") DBUser = file.Section("database").Key("DBUser").MustString("root") DBPwd = file.Section("database").Key("DBPwd ").MustString("admin888") DBName = file.Section("database").Key("DBName").MustString("ginblog") }
router 分组
package main import ( "github.com/gin-gonic/gin" v1 "whbbit.cn/gin/router/v1" ) func main() { r := gin.Default() v1.InitRouter(r) r.Run(":9999") }
package v1 import "github.com/gin-gonic/gin" func InitRouter(g *gin.Engine) { v1 := g.Group("v1") v1.GET("/hello", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "hello v1", }) }) v2 := g.Group("v2") v2.GET("/hello", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "hello v2", }) }) }
使用 gorm 操作 mysql 数据库
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
配置 gorm 连接数据库
package model import ( "fmt" "server/utils" "time" "gorm.io/driver/mysql" "gorm.io/gorm" ) var db *gorm.DB var err error func InitDB() { db, err = gorm.Open(mysql.Open(fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", utils.DBUser, utils.DBPwd, utils.DBHost, utils.DBPort, utils.DBName, ))) if err != nil { fmt.Println("数据库连接失败,请检查参数", err) } // 迁移文件 db.AutoMigrate(&User{}, &Article{}, &Category{}) // 获取通用数据库对象 sql.DB ,然后使用其提供的功能 db, err := db.DB() if err != nil { fmt.Println("数据库连接失败,请检查参数", err) } // SetMaxIdleConns 用于设置连接池中空闲连接的最大数量。 db.SetMaxIdleConns(10) // SetMaxOpenConns 设置打开数据库连接的最大数量。 db.SetMaxOpenConns(100) // SetConnMaxLifetime 设置了连接可复用的最大时间。 db.SetConnMaxLifetime(10 * time.Second) // 最大连接时间10s,超出10s就超时 // 关闭数据库连接 db.Close() }
创建数据模型
package model import "gorm.io/gorm" type User struct { gorm.Model Username string `gorm:"type:varchar(20);not null" json:"username"` Password string `gorm:"type:varchar(20);not null" json:"password"` Role int `gorm:"type:int" json:"role"` }
package model import "gorm.io/gorm" type Category struct { gorm.Model Name string `gorm:"varchar(20);not null" json:"name"` }
package model import "gorm.io/gorm" type Article struct { gorm.Model Title string `gorm:"varchar(100);not null" json:"title"` Body string `gorm:"longtext;not null" json:"body"` Desc string `gorm:"varchar(200);" json:"desc"` Cover string `gorm:"varchar(100);" json:"cover"` Category Category `gorm:"foreignKey:Cid"` Cid int `gorm:"int;not null" json:"cid"` }