🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
`GoHub`大部分基于`Laravel`程序目录结构的方式来搭建的。可以理解为`Gin`框架的二次开发搭建,其`Gin`框架的`路由` `GORM` `中间件`等包都是直接复用的,因此如果你想更多的了解这些信息可以直接查看更加详细的官方文档,我们也非常建议你这么做。 ## 入口文件 对于`Go`来说`main.go`是应用的启动文件,理论来说你可以将所有的业务逻辑都在这个文件中写,但是没有人这么做,为了更加直观的便捷的开发,我们在此基础上进行封装各种包目录。 ## 引导文件 在`bootstrap`目录下是框架基本配置的引导文件,它目前包含了`数据库` `缓存驱动` `Redis驱动` `日志驱动` `路由`的初始化。 ## 模块 对于`GoHub`每个模块都是在应用目录下的一个子目录,每个模块统一继承公共的配置文件、辅助方法等 ## 控制器 基于`Gin`的路由演化出来的控制器层面还是比较灵活的,可以区分`v1` `v2`等版本,并且使用不同的`中间件`,这也是如今大多数业务的需求。 一个模块下面有多个控制器负责响应请求,而每个控制器其实就是一个独立的切片并继承公共的接口。 控制器主要负责请求的接收,并调用相关的模型工具处理,并最终通过`response`输出。严格来说,控制器不应该过多的介入业务逻辑处理。 一个非常典型的`User`控制器类如下: ```go package v1 import ( "github.com/gin-gonic/gin" "gohub/pkg/response" ) type UsersController struct { BaseAPIController } // Index func (this *UsersController) Index(c *gin.Context) { response.ShowSuccess(c, "hello, gohub!") } ``` ## 操作 一个控制器包含多个操作(方法),操作方法是一个URL访问的最小单元。 下面是一个典型的`User`控制器的操作方法定义,并包含了接受请求参数示例: ```go package v1 import ( "gohub/pkg/response" "github.com/gin-gonic/gin" ) type UsersController struct { BaseAPIController } // Index func (this *UsersController) Index(c *gin.Context) { // 请求对象 type Request struct { Name string `json:"name"` } request := Request{} response.ShowSuccess(c, request.Name) } ``` 要想使用此控制器方法还需在路由处定义,并且请求头中的 `Accept` 参数值必须是`applicaiont/json` ,否则会解析失败。 框架已经自动处理了json的解析器,并做了异常抛出,后面会更加详细的介绍到此方面的内容。 ## 模型 本项目将使用[Gorm](https://github.com/go-gorm/gorm)来作为底层的数据模型驱动。`Gorm` 是 `Go` 生态圈一个明星项目,`GitHub` 上拥有 2.6 万的 star 数。 #### Gorm 功能概览 * 支持主流关系型数据库 MySQL/SQLite/SQL Server/PostgreSQL * 全功能 ORM (无限接近) * 模型关联 (Has One, Has Many, Belongs To, Many To Many, 多态) * 钩子函数 Hook (在创建 / 保存 / 更新 / 删除 / 查找之前或之后) * 预加载 * 事务 * 复合主键 * SQL 生成器 * 数据库自动迁移 * 自定义日志 * 可扩展性,可基于 GORM 回调编写插件 * 全测试覆盖 ## 输出 控制器调用后的返回数据通过`response`包操作,其中包括`ShowError` `ShowSuccess`两个方法,与`PHP`框架不同的是无需`return` 你可以在任何地方输出如下示例进行返回,如果返回后跟随`return` 那么程序就不会继续执行了。 **注:在协程中是不会返回任何信息数据的** ```go // 响应错误 response.ShowError(c, 422, "令牌刷新失败") // 响应成功 response.ShowSuccess(c, "登录成功") ``` 响应的数据示例: ``` { "code": 0, "data": "密码重置成功", "msg": "success" } ``` 针对API来说,`HTTP`状态码最好全部以`200`形式返回,其中真正的错误码在`code`中定义,当`code`不为0均为错误,前端直接处理异常弹出即可! ## 驱动 系统很多的组件都采用驱动式设计,从而可以更灵活的扩展,驱动类的位置默认是放入`pkg`目录下面,一般来说当你安装了一个第三方包后需要重新二次封装下驱动类,以便使自己的业务更加契合,或者是可以通过配置文件来动态的调整它。 ## 代码生成 为了更加快速的入手,定义了`控制器` `请求验证` `模型` 三个代码快速生成模版,你可以通过`make` 命令快速生成代码文件 ## 日志和错误 在我们项目中,使用日志来记录整个系统的运行情况。可能但是不限于: * HTTP 请求数据 * 数据库 SQL 请求日志 * Panic/Error 错误日志 * 请求第三方接口日志(发送短信、发送邮件等) * … #### 使用场景 **本地开发** 本地开发时,虽然我们可以很方便的使用`Debuger 来调试程序`,但是日志将会是我们最廉价、最便捷的错误定位工具。 **线上环境** 日志是程序在生产环境下的健康监控。当程序出错时,或者某块业务逻辑出现问题,我们将依赖日志来知道具体哪一行代码出了问题。 关于日志的等级后面我们会更加详细的讲解