1. Gin项目大致结构

1.1. Gin 后端项目结构

本结构大体参照于项目 , 实际使用时或有不同,暂时以该个人项目为准,后续可能会更换代码风格更好的项目作为参考。不过大体上的结构类似。

结合代码使用或许更佳。

值得注意的是,由于面向人群大多为初学Gin的同学,此处结构中没有出现/internal,/pkg 等文件夹,分别代表 私有应用程序和库代码以及 外部应用程序可以使用的库代码,具体理解和使用可见[2]。将功能按照文件夹所大致区分开。并且由于笔者并未进过企业后端实习,水平仍停留在学生水平。因此可能有亿点不成熟之处还行给出建议修改。

此外企业上的Go项目大多才用微服务的kit框架详解(基于go-kit),本例专注于小型后端开发,固也有所不同吧。
 Gin-demo
 ├── api                             (api层)
 │   └── v1                            (v1版本接口)    
 │       └── user.go
 ├── config
 │   ├── example.yml                (配置文件样例)
 │   ├── gorm.go                    (gorm数据库初始化) 
 │   └── viper.go                    (viper初始化)
 ├── demo.log
 ├── demo.yml                        (配置文件)
 ├── docs                            (swagger文档目录)
 ├── global                            (全局对象) 
 │   └── global.go
 ├── go.mod
 ├── go.sum
 ├── logs                            (日志存储) 
 │   ├── demo.log.20220427.log
 ├── main.go
 ├── middleware                        (中间件层)  
 │   ├── auth.goo                    (权限验证) 
 │   ├── cors.go
 │   └── logrus.go                    (logrus日志) 
 ├── model
 │   ├── database                    (入参结构体)   
 │   │   └── user.go
 │   └── response                    (出参结构体)   
 │       └── user.go
 ├── resource                        (静态资源文件夹)  
 ├── router
 │   └── router.go                    (路由信息)
 ├── service                        (service层,为api提供Helper或数据库服务) 
 │   └── user.go
 ├── storage
 │   └── initialize.go                (初始化)   
 ├── test                            (测试) 
 └── utils                            (工具包)

此时以当前较新版本 为准,

1.1.1. 流程大致介绍

当前端发来请求,后端通过router来找到对应的路由,并进行必要的中间件方法调用middleware。简单中间件auth鉴权后,进入API,当API接口来验证(BindAndValid) 参数response格式是否正确。在API处适当的调用service处的方法,为API提供Helper或是数据库操作,其中不免用到model/databse数据库对象。并返回对应处理,顺便通过中间件记录日志到logs

后端开始运行时

运行main.go调用config中的各方法来初始化路由、全局变量(global)数据库DB、Viper(读取配置文件),记录日志。

随后简单介绍Config 中的一些用作项目初始化的函数。

Config.InitRouter

初始化路由信息,将你的路由按照特定规则放置其中即可。具体会在第五章中讲到。

Config.InitViper

主要用于读取存储一些全局信息,viper 可直接读取各种类型的配置文件,本demo用于读取YAML文件。具体简单使用方式见config/viper.go

此时我们读取数据库信息用以连接数据库。在demo项目根目录创建demo.yaml格式如下。

database:
  ip: '127.0.0.1' # MySQL的IP地址
  port: '3306' # MySQL的端口
  user: 'username' # MySQL的用户名
  password: 'password' # MySQL对应用户的密码
  database: 'dbname' # 使用的MySQL数据库名称

jwt:
  # token 密钥,生产环境时记得修改
  secret: 'demo@'
  # token 过期时间 单位:秒
  timeout: 3600

server:
  backend_url: 'http://127.0.0.1:8081/api/v1'

使用v.Set("root_path", rootPath) 在对全局变量viper中放置root_path, 而读取则使用dbstr := global.VP.GetString("database.ip") 来访问上述数据库中的ip信息。其余类推即可。

Config.InitMySQL

用作初始化连接远程Mysql数据库。在填写好上述信息时,正常来讲便可直接运行项目了,访问http://127.0.0.1:8000/ 可看到如下提示:

image-20220418190151138

而当你需要添加其他表到数据库中时,你需要在initialize/gorm.go 中 添加其他表的信息,类似如&model.Post{}, 来让gorm生成其余表项。

    err = db.AutoMigrate(
        &model.User{},
    )

1.2. 参考

  1. https://github.com/golang-standards/project-layout
  2. https://travisjeffery.com/b/2019/11/i-ll-take-pkg-over-internal/

results matching ""

    No results matching ""