`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 來調試程序`,但是日志將會是我們最廉價、最便捷的錯誤定位工具。
**線上環境**
日志是程序在生產環境下的健康監控。當程序出錯時,或者某塊業務邏輯出現問題,我們將依賴日志來知道具體哪一行代碼出了問題。
關于日志的等級后面我們會更加詳細的講解
- 序言
- 基礎
- 安裝GoHub
- 目錄結構
- 開發規范
- 部署項目
- 架構
- 架構總覽
- 生命周期
- 配置
- 配置介紹
- 配置目錄
- 配置格式
- 配置加載
- 讀取配置
- 動態配置
- 環境變量配置
- 路由
- 路由模式
- 路由定義
- 路由參數
- 路由分組
- 路由限流
- 路由拆分
- 控制器
- 控制定義
- 控制器初始化
- 中間件
- Make創建控制器
- 請求
- 請求信息
- 數據庫
- 連接數據庫
- 基本使用
- Make創建模型
- 日志
- 介紹
- 日志驅動
- 日志寫入
- HTTP日志
- 數據庫請求日志
- 錯誤和調試
- Debuger調試器
- 驗證
- 驗證器
- 驗證規則
- Make創建驗證器
- 雜項
- 緩存
- 分頁
- 驗證碼
- CURL請求
- 命令行
- 基礎知識
- console 包
- Cobra 基礎
- 命令行模式
- 附錄
- 配置參考
- 第三方依賴庫