基于Gin模块化开发API框架设计

更新时间:2023-05-30 09:40:21 阅读: 评论:0

基于Gin模块化开发API框架设计
⼀、gin项⽬介绍
gin框架对于写go语⾔的⼈来说⼊门很简单,有点类似python中的flask框架,什么都需要⾃⼰去找第三⽅包,然后根据⾃⼰的经验来创建⽬录结构,对于没有项⽬经验的⼈来说,这点真的不如同类型的beego框架,已经有清晰的⽬录结构,有时候我们可以说gin仅仅是⼀个包,算不上框架。⾃由组装度⽐较灵活,这也提现了我们开发⼈员的经验重要性。如何更好的搭建gin-api项⽬是⼀个难事。
以下是本⼈根据后端经验采⽤mvc的思路搭建⼀套基本的gin-api框架。以供⼤家参考使⽤,⼤家觉得好点个
⼆、需要安装的依赖包
gin框架包
go get -/gin-gonic/gin
gorm数据库包
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
数据校验的包
go /go-playground/validator
token认证的包
go get -/dgrijalva/jwt-go
⽇志管理包
go get -/sirupn/logrus
go get -/lestrrat-go/file-rotatelogs
go get -/rifflock/lfshook
胖男人穿衣搭配配置⽂件的包
go get -/spf13/viper
三、项⽬配置⽂件
1、在l⽂件中创建项⽬需要的配置参数
rver:
port:9000
unparallel# 数据库配置
datasource:
driverName: mysql
host: localhost
port:"3306"
databa: gin_admin_api
urname: root
password:123456
chart: utf8mb4
loc: Asia/Shanghai
2、在中定义⼀个初始化配置的⽂件
orrather
func InitConfig(){
workDir,_:= os.Getwd()
viper.SetConfigName("application")
viper.SetConfigType("yml")
viper.AddConfigPath(path.Join(workDir,"config"))
// 或者使⽤全路径
//viper.AddConfigPath(path.Join(workDir, "l")) err := viper.ReadInConfig()
if err !=nil{
fmt.Print("获取配置⽂件错误")
panic(err)
}
缨尾目}
3、在init函数中调⽤初始化配置的⽂件
func init(){
InitConfig()
}
4、测试配置⽂件是否成功
func main(){
router := gin.Default()
router.GET("/",func(c *gin.Context){
c.JSON(http.StatusOK, gin.H{
"code":1,
})unionpay
})
port := viper.GetString("rver.port")
fmt.Println("当前端⼝", port)
if port !=""{
router.Run(":"+ port)
}el{
router.Run()
}
}
5、或者可以单独到common/config⽂件中
package common
import(
"fmt"
"/spf13/viper"
"os"
"path"
)
/
/ 初始化配置
func InitConfig(){
workDir,_:= os.Getwd()
viper.SetConfigName("application")
viper.SetConfigType("yml")
viper.AddConfigPath(path.Join(workDir,"config"))
// 或者使⽤全路径
//viper.AddConfigPath(path.Join(workDir, "l")) err := viper.ReadInConfig()
if err !=nil{
fmt.Print("获取配置⽂件错误")
panic(err)
}
}
InitConfig()
}
借⽤在中引⼊的⽂件,那么初始化就会先执⾏init函数
import(
...
// 这⾥表⽰编译的时候不需要,但是运⾏的时候需要,不加这⾏下⾯的mian函数中是不能获取到参数的
_"gin_admin_api/common"// gin_admin_api是在go.mod⾥⾯配置的module gin_admin_api,⼀般与项⽬名称⼀致...
)
func main(){
...
port := viper.GetString("rver.port")
fmt.Println("当前端⼝", port)
...
}
四、初始化gorm数据库连接⼯具
1、在common/databa下配置数据库连接
package common
import(
"fmt"
_"/go-sql-driver/mysql"
"/spf13/viper"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"log"
"net/url"
emmanuelle chriqui"os"
"time"
)
var DB *gorm.DB
infre
func init(){
fmt.Println("数据库连接")
InitDB()
}
func InitDB()*gorm.DB {
// 从配置⽂件中获取参数
host := viper.GetString("datasource.host")
port := viper.GetString("datasource.port")
databa := viper.GetString("datasource.databa")
urname := viper.GetString("datasource.urname")
password := viper.GetString("datasource.password")
chart := viper.GetString("datasource.chart")
loc := viper.GetString("datasource.loc")
// 字符串拼接
sqlStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?chart=%s&parTime=true&loc=%s",
urname,
password,
host,
port,
databa,
chart,
url.QueryEscape(loc),
url.QueryEscape(loc),american education
)
fmt.Println("数据库连接:", sqlStr)
// 配置⽇志输出
newLogger := logger.New(
log.New(os.Stdout,"\r\n", log.LstdFlags),// io writer
logger.Config{
SlowThreshold:            time.Second,// 缓存⽇志时间
LogLevel:                  logger.Silent,// ⽇志级别
IgnoreRecordNotFoundError:true,// Ignore ErrRecordNotFound error for logger
Colorful:fal,// Disable color
},
)
db, err := gorm.Open(mysql.Open(sqlStr),&gorm.Config{
Logger: newLogger,
})
if err !=nil{
fmt.Println("打开数据库失败", err)
panic("打开数据库失败"+ err.Error())
}
DB = db
return DB
}
// TODO ⽂档地址: gorm.io/zh_CN/docs/
2、在的数据模型
package model
import(
"gorm.io/gorm"
)
type Account struct{
gorm.Model
UrName string`gorm:"type:varchar(50);column(urname);not null;unique;comment:账号"`
Password string`gorm:"type:varchar(200);not null;comment:账号密码"`
Mobile  string`gorm:"varchar(11);not null;unique;comment:⼿机号码"`
}
3、在中测试创建的数据模型及数据库连接⼯具
func init(){
// ⾃动同步数据模型到数据表
common.DB.AutoMigrate(&model.Account{})
}
4、查看数据库的数据表这⾥默认会加上⼀个s上去,表⽰复数,如果要重命名表名可以参考下⾯代码
// 在数据模型的实体类⽂件中
// ⾃定义表名
func(Account)TableName()string{
return"account"
}
五、在gin中使⽤路由分组实现路由管理
1、创建⼀个route的⽂件夹,⾥⾯负责收集全部控制器下的路由
package route
import(
"gin_admin_api/controller/account"
"gin_admin_api/controller/login"
"gin_admin_api/controller/register"
"gin_admin_api/middleware"
"/gin-gonic/gin"
)
func CollectRoute(router *gin.Engine){
// 创建账号路由分组,先忽视中间件的存在
accountGroup := router.Group("/account", middleware.AuthMiddleWare())
account.AccountRouter(accountGroup)
// 登录的路由
loginGroup := router.Group("/login")
login.LoginRouter(loginGroup)
registerGroup := router.Group("/register")
获得奥斯卡奖的电影register.RegisterRouter(registerGroup)
}
2、⽐如登录的路由
package login
import(
"/gin-gonic/gin"
)
func LoginRouter(router *gin.RouterGroup){
router.POST("/", Login)
}
3、在中使⽤路由组
func main(){
router := gin.Default()
// 注册路由组
route.CollectRoute(router)
...
}
六、使⽤数据校验实现⽤户注册
1、在控制器下创建⼀个dto的⽂件,专门⽤来接收前端传递过来的数据
package dto
import(
"fmt"
"gin_admin_api/model"
"/go-playground/validator"
"unicode/utf8"
)
var valildate *validator.Validate
func init(){
valildate = validator.New()
朱子家训翻译valildate.RegisterValidation("checkName", CheckNameFunc)
}

本文发布于:2023-05-30 09:40:21,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/812638.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:配置   路由   数据库
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图