:::info go-gin-api 是基于 Gin 进行模块化设计的 API 框架,封装了常用的功能,使用简单,致力于进行快速的业务研发,同时增加了更多限制,约束项目组开发成员,规避混乱无序及自由随意的编码。
建议 供参考学习,线上使用请谨慎! :::
视频教程
项目想法
快速开始
环境准备
- golang 1.16+
- 因为使用了
//go:embed
特性;
- 因为使用了
- MySQL
- 连接地址,例如:127.0.0.1:3306;
- 数据库名,例如:go_gin_api,会在此数据库下初始化数据表;
- 用户名,不可为空;
- 密码,不可为空;
- Redis
- 连接地址,例如:127.0.0.1:6379;
- 密码,可为空;
- 连接DB,默认是 0 ;
下载运行
```bash $ git clone https://github.com/xinliangnote/go-gin-api.git $ cd go-gin-api $ go run main.go -env fat
// -env 表示设置哪个环境,主要是区分使用哪个配置文件,默认为 fat // -env dev 表示为本地开发环境,使用的配置信息为:configs/dev_configs.toml // -env fat 表示为测试环境,使用的配置信息为:configs/fat_configs.toml // -env uat 表示为预上线环境,使用的配置信息为:configs/uat_configs.toml // -env pro 表示为正式环境,使用的配置信息为:configs/pro_configs.toml
<a name="fCzoA"></a>
##
<a name="hfh8D"></a>
## 安装界面
首次启动程序之后,会在浏览器中自动打开安装界面,链接地址:http://127.0.0.1:9999/install。<br />![p_1.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1637391949183-f7645280-1b21-4278-8df3-289366fd4451.png#clientId=u2258124f-8157-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=1600&id=u0d1a0cb1&margin=%5Bobject%20Object%5D&name=p_1.png&originHeight=1600&originWidth=2330&originalType=binary&ratio=1&rotation=0&showTitle=false&size=172209&status=done&style=shadow&taskId=u930d1840-6358-471e-af71-f3e01faac84&title=&width=2330)<br />因为程序会使用到 Redis 和 MySQL,所以安装前请输入 Redis、MySQL 配置信息。<br />点击初始化按钮,会将用到的数据表和默认数据进行初始化,在右侧可以看到初始化的日志信息。<br />![p_2.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1637391960064-18d3b6ad-936d-4f2c-9519-8875dabd4768.png#clientId=u2258124f-8157-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=1612&id=ue3aef54d&margin=%5Bobject%20Object%5D&name=p_2.png&originHeight=1612&originWidth=2330&originalType=binary&ratio=1&rotation=0&showTitle=false&size=398839&status=done&style=shadow&taskId=u9762bf98-202c-41e5-9f24-c0e65f3db3f&title=&width=2330)<br />如上,初始化成功后,初始化的表结构 UML 图如下:<br />![p_3.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1637391977119-ae9238a1-c889-4635-b239-4c8ff97c40ab.png#clientId=u2258124f-8157-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=1926&id=u55037c03&margin=%5Bobject%20Object%5D&name=p_3.png&originHeight=1926&originWidth=1642&originalType=binary&ratio=1&rotation=0&showTitle=false&size=280118&status=done&style=shadow&taskId=ue32d0e4a-6f93-485e-b4df-d477b280159&title=&width=1642)<br />重新启动程序,会在浏览器中自动打开登录界面,链接地址:http://127.0.0.1:9999/login 。
<a name="CXj3g"></a>
##
<a name="rWi33"></a>
## 登录界面
![03.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622255715233-f4f016dd-5ffb-41cd-bfd6-146ad16b5c47.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u9ac49a20&margin=%5Bobject%20Object%5D&name=03.png&originHeight=936&originWidth=974&originalType=binary&ratio=1&rotation=0&showTitle=false&size=70461&status=done&style=shadow&taskId=ue4e8f88b-7ba8-4f73-8f8c-70f0aed11b2&title=)<br />输入默认账号 admin,密码 admin 即可登录成功。
<a name="W0Upr"></a>
##
<a name="gvYgp"></a>
## 仪表盘界面
![p_4.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1637392064131-871ed0cc-1126-4734-aa5d-8159f5ccb58a.png#clientId=u2258124f-8157-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=1198&id=u936eafd0&margin=%5Bobject%20Object%5D&name=p_4.png&originHeight=1198&originWidth=3296&originalType=binary&ratio=1&rotation=0&showTitle=false&size=353492&status=done&style=shadow&taskId=u03a0ea92-223c-4bec-8cfd-d8042930ed2&title=&width=3296)<br />显示 项目信息、内存信息、硬盘信息、CPU信息 等。
<a name="TJkE6"></a>
##
<a name="rSqbx"></a>
## 配置信息 -> 告警邮箱
![05.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256000424-87da8fa3-41e4-4504-a2da-49dc2d79d2dd.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u7b0d1b01&margin=%5Bobject%20Object%5D&name=05.png&originHeight=1488&originWidth=3010&originalType=binary&ratio=1&rotation=0&showTitle=false&size=268971&status=done&style=shadow&taskId=u033677d8-5131-46e2-9a5e-7984aaa60b9&title=)
在这里可以配置系统告警的发件人和收件人,当系统发生 Panic 时,进行邮件通知,邮件模板如下:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256884735-111b3f41-1f86-40d0-9a3c-2440c5b2c8bb.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=1138&id=uf3b71e20&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1138&originWidth=1736&originalType=binary&ratio=1&rotation=0&showTitle=false&size=105870&status=done&style=shadow&taskId=ufae534b2-f410-4a95-b95e-25de6fe3f11&title=&width=1736)
<a name="zPrUa"></a>
##
<a name="Jy1yL"></a>
## 配置信息 -> 错误码
![image.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1637475330151-cecb99e7-5036-4039-9957-95b1b691e3fb.png#clientId=u3119a38c-fbfc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=774&id=u42764b3f&margin=%5Bobject%20Object%5D&name=image.png&originHeight=774&originWidth=1107&originalType=binary&ratio=1&rotation=0&showTitle=false&size=152925&status=done&style=shadow&taskId=u7373788a-12c2-42d6-971f-23a5f34e15b&title=&width=1107)<br />展示系统中定义的错误码。
<a name="KS5vb"></a>
##
<a name="Qazg1"></a>
## 代码生成器 -> 生成数据表 CURD
![07.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256103079-83cd0b34-2578-4250-8fbf-01ebed9f6042.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u030de0a0&margin=%5Bobject%20Object%5D&name=07.png&originHeight=1594&originWidth=3008&originalType=binary&ratio=1&rotation=0&showTitle=false&size=283531&status=done&style=shadow&taskId=u54b758ac-0c02-48c0-bcc5-751f68f8b75&title=)<br />在左侧可以单选或多选数据表,进行代码生成。
<a name="s5IcQ"></a>
##
<a name="aFkzB"></a>
## 代码生成器 -> 生成控制器方法
![image.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1637475399780-2cbd1377-bfda-4f95-b9eb-8bbf9f5a3c22.png#clientId=u3119a38c-fbfc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=582&id=ucf7fe94a&margin=%5Bobject%20Object%5D&name=image.png&originHeight=582&originWidth=1377&originalType=binary&ratio=1&rotation=0&showTitle=false&size=70698&status=done&style=shadow&taskId=u73e9bfb6-0775-4fa8-907e-4b5acf9b8a0&title=&width=1377)<br />在左侧可以设置需要生成的 handler 名称。
<a name="mR0yD"></a>
##
<a name="KOwzV"></a>
## 授权调用方 -> 调用方
![09.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256168209-7ee41b4a-608b-442f-9bcc-236c6ec95ce0.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u75638be1&margin=%5Bobject%20Object%5D&name=09.png&originHeight=1132&originWidth=3016&originalType=binary&ratio=1&rotation=0&showTitle=false&size=212365&status=done&style=shadow&taskId=uf56b298c-8bb5-468d-98bd-f922cd60c01&title=)
![25.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256175371-e5203852-639b-41a9-97db-3293d285d416.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u7727900e&margin=%5Bobject%20Object%5D&name=25.png&originHeight=1384&originWidth=2986&originalType=binary&ratio=1&rotation=0&showTitle=false&size=262604&status=done&style=shadow&taskId=u9653fea0-8158-4207-98d5-ad58cc9a060&title=)<br />设置谁可以调用我的接口,同时还可以授权调用我哪些接口。
<a name="te07B"></a>
##
<a name="rp3k4"></a>
## 授权调用方 -> 使用说明
![10.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256215480-a375a938-2c7f-4931-905f-497c54a7a0f3.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=ub077c6a8&margin=%5Bobject%20Object%5D&name=10.png&originHeight=1720&originWidth=2996&originalType=binary&ratio=1&rotation=0&showTitle=false&size=395288&status=done&style=shadow&taskId=ub97a5bdc-92f5-476f-bd63-150fc04ccdf&title=)
<a name="k8qH8"></a>
##
<a name="fz3M9"></a>
## 后台任务 -> 任务列表
![image.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1630240757396-040d9299-0278-4263-a5c8-399d1d4af061.png#clientId=u5136bcdf-4e03-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=594&id=u65bd0e6f&margin=%5Bobject%20Object%5D&name=image.png&originHeight=594&originWidth=1538&originalType=binary&ratio=1&rotation=0&showTitle=false&size=84908&status=done&style=shadow&taskId=u4ecb2478-81ae-42df-a61e-20cad33216d&title=&width=1538)
<a name="YkCji"></a>
##
<a name="U9Tna"></a>
## 系统管理员 -> 管理员
![11.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256256224-57eee183-bdfa-421b-9b82-4b517cf32fe4.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u3c357997&margin=%5Bobject%20Object%5D&name=11.png&originHeight=1266&originWidth=3010&originalType=binary&ratio=1&rotation=0&showTitle=false&size=238179&status=done&style=shadow&taskId=u72c7278e-cf81-47a6-9e1c-c2d6417ed7d&title=)
![24.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256262260-0857d27a-8d0d-403f-9446-5ec927706631.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u0cfa203c&margin=%5Bobject%20Object%5D&name=24.png&originHeight=1484&originWidth=2986&originalType=binary&ratio=1&rotation=0&showTitle=false&size=288261&status=done&style=shadow&taskId=u56caa2cf-3f14-41e8-b420-39b2fe431fb&title=)<br />![12.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256271262-87fb9e0f-ae21-463b-8419-e5a46b7326b4.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u615b87e0&margin=%5Bobject%20Object%5D&name=12.png&originHeight=1748&originWidth=2998&originalType=binary&ratio=1&rotation=0&showTitle=false&size=321063&status=done&style=shadow&taskId=u0d1bd835-c208-453b-8671-4970e1e640f&title=)<br />设置谁可以登录后台,可以对其进行 禁用、重置密码、菜单授权、下线、删除 等操作。
<a name="qLccQ"></a>
##
<a name="bkI7U"></a>
## 系统管理员 -> 菜单管理
![13.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256329243-9af9298e-ef3b-4d68-ab98-9850c9541f7b.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=udb1ff738&margin=%5Bobject%20Object%5D&name=13.png&originHeight=1726&originWidth=2996&originalType=binary&ratio=1&rotation=0&showTitle=false&size=410368&status=done&style=shadow&taskId=u4f562cdd-9f61-4143-a9b1-8de4efae7f8&title=)<br />设置后台侧边栏的菜单。
<a name="eqgXD"></a>
##
<a name="GsRdo"></a>
## 查询小助手 -> 查询缓存
![14.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256366369-2befe825-6a56-4f29-ae83-caca22bd488c.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u8dd4d9d1&margin=%5Bobject%20Object%5D&name=14.png&originHeight=1300&originWidth=3014&originalType=binary&ratio=1&rotation=0&showTitle=false&size=249665&status=done&style=shadow&taskId=u9e47018f-a398-4cae-9a6a-c818b64f6da&title=)<br />查询 Redis 缓存内容 和 有效期,同时还可以清空缓存。
<a name="fgvgn"></a>
##
<a name="SvVLA"></a>
## 查询小助手 -> 查询数据
![15.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256404729-85b71032-97fe-4d89-bfa8-f01815e8ab5c.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=uf2ee30a8&margin=%5Bobject%20Object%5D&name=15.png&originHeight=1460&originWidth=3006&originalType=binary&ratio=1&rotation=0&showTitle=false&size=250652&status=done&style=shadow&taskId=u03718cf0-0604-4adc-838c-b7f3949fca2&title=)<br />![16.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256415183-6cd44f83-32d9-4e98-8a45-9c4e753ee359.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=uc70773fa&margin=%5Bobject%20Object%5D&name=16.png&originHeight=1492&originWidth=3004&originalType=binary&ratio=1&rotation=0&showTitle=false&size=429979&status=done&style=shadow&taskId=ueb9ec278-9945-4691-9f22-a10d6f1f140&title=)<br />查询 MySQL 数据,支持输入 SQL 语句执行和分析。
<a name="DL1v0"></a>
##
<a name="ZwDkv"></a>
## 实用工具箱 -> 服务升级
![image.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1637475541368-a3e06537-058d-4e3e-8fc6-065866bd8e41.png#clientId=u3119a38c-fbfc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=875&id=ud4dc9d7f&margin=%5Bobject%20Object%5D&name=image.png&originHeight=875&originWidth=1477&originalType=binary&ratio=1&rotation=0&showTitle=false&size=203612&status=done&style=shadow&taskId=uabdbed23-c7ef-411b-ac4f-8394090ee37&title=&width=1477)<br />不同版本提供相应的升级指导。
<a name="Hd4aR"></a>
##
<a name="MovZn"></a>
## 实用工具箱 -> Hashids
![18.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256538614-17226804-7f1f-4f0c-b3af-362bcf4871af.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u423d9841&margin=%5Bobject%20Object%5D&name=18.png&originHeight=1530&originWidth=3010&originalType=binary&ratio=1&rotation=0&showTitle=false&size=245443&status=done&style=shadow&taskId=uccbe13d5-9d70-4845-bf35-10f2a2afe76&title=)<br />程序中对传递 id 的场景,均使用密文进行传递。
<a name="E97qq"></a>
##
<a name="JtuA8"></a>
## 实用工具箱 -> 调用日志
![19.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256612068-c3a03135-0173-4e51-97e9-7b927ce91430.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=ub1baeaa0&margin=%5Bobject%20Object%5D&name=19.png&originHeight=1722&originWidth=2998&originalType=binary&ratio=1&rotation=0&showTitle=false&size=487455&status=done&style=shadow&taskId=u05f0dae5-d642-498f-8c0f-661aaa0cd8d&title=)<br />展示最新的 100 条调用日志。
<a name="lpnDu"></a>
##
<a name="yyuq2"></a>
## 实用工具箱 -> 接口文档
![20.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256645196-d32c316e-4603-4a14-a8d6-48f07170c4f0.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=ud69a5d67&margin=%5Bobject%20Object%5D&name=20.png&originHeight=1718&originWidth=2998&originalType=binary&ratio=1&rotation=0&showTitle=false&size=370733&status=done&style=shadow&taskId=ubdf6b2d0-278e-49ba-b647-927fcb9c3f7&title=)
<a name="Uyl8g"></a>
##
<a name="vu0N5"></a>
## 实用工具箱 -> GraphQL
![21.png](https://cdn.nlark.com/yuque/0/2021/png/1309959/1622256666879-658b8fea-fd1d-4495-b1cb-893010d73a08.png#clientId=uc5fdbb38-f2dc-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=uf4768157&margin=%5Bobject%20Object%5D&name=21.png&originHeight=1720&originWidth=3014&originalType=binary&ratio=1&rotation=0&showTitle=false&size=285582&status=done&style=shadow&taskId=u043dbc58-9b76-4118-a995-d82b481dfce&title=)
<a name="gqPnu"></a>
### 查询操作
```json
query {
bySex(sex: "男") {
id
name
sex
mobile
}
}
更新操作
mutation {
updateUserMobile(data: {id: "1", mobile: "13299999999"}) {
id
name
sex
mobile
}
}
实用工具箱 -> 接口指标
实用工具箱 -> WebSocket
其他
代码生成工具 -> 生成数据表 CURD
意义:在进行业务需求开发时,创建完数据表后,执行代码生成工具,常用的 CURD 操作全部生成完毕,使用的时候只需要 . 后面的方法即可,这样大大提高了业务开发效率。
代码生成工具 -> 生成控制器方法
意义:本次需求的研发负责人通过定义 type interface{}
的方式,定义出需要开发的方法,执行代码生成工具,每个方法的空实现都会生成在一个单独的文件中,开发人员只需去实现各自方法即可,便于进行分工和代码管理。
GraphQL
项目中使用 gqlgen
实现了 GraphQL 查询,会发现与 gqlgen init 初始化的 demo 不同,是因为代码已经集成到 go-gin-api 中,比如集成了项目 core 包中的 链路、日志 等。
目前仅实现了 Demo, resolver 使用的是模拟数据,不过使用可复用的 service 也已经实现了,在代码已注释,感兴趣的可以深入研究。
Prometheus
启动 Prometheus
的配置文件,可参考:
- ./deployments/prometheus/prometheus.yml
Loki
Loki
是一个水平可扩展,高可用性,多租户的日志聚合系统,有兴趣可以研究一下。
启用 Loki
的配置文件,可参考:
- ./deployments/loki/loki.yaml
- ./deployments/loki/promtail.yaml
健康检查
地址:http://127.0.0.1:9999/system/health
{
"timestamp": "2021-06-26T16:33:46.891484+08:00",
"environment": "fat",
"host": "127.0.0.1:9999",
"status": "ok"
}