go-zero
go-zero 简介
go-zero是一个能够快速生成 API,MODEL 和 RPC 的框架。
go-zero 项目结构(不含 RPC)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
.
├── api
│ ├── etc
│ │ └── park-api.yaml
│ ├── internal
│ │ ├── config
│ │ │ └── config.go
│ │ ├── handler
│ │ │ ├── accessHandler.go
│ │ │ ├── deviceInfoHandler.go
│ │ │ ├── incomeHandler.go
│ │ │ ├── parkingLotHandler.go
│ │ │ ├── routes.go
│ │ │ ├── siteInfoHandler.go
│ │ │ ├── touristCarProvinceHandler.go
│ │ │ ├── touristFlowHandler.go
│ │ │ ├── userHandler.go
│ │ │ └── wechatHandler.go
│ │ ├── logic
│ │ │ ├── accessLogic.go
│ │ │ ├── deviceInfoLogic.go
│ │ │ ├── incomeLogic.go
│ │ │ ├── parkingLotLogic.go
│ │ │ ├── siteInfoLogic.go
│ │ │ ├── touristCarProvinceLogic.go
│ │ │ ├── touristFlowLogic.go
│ │ │ ├── userLogic.go
│ │ │ └── wechatLogic.go
│ │ ├── svc
│ │ │ └── serviceContext.go
│ │ └── types
│ │ └── types.go
│ ├── park.api
│ ├── park.go
│ └── park.md
├── genModel
│ ├── model
│ │ ├── accessModel.go
│ │ ├── accessModel_gen.go
│ │ ├── deviceInfoModel.go
│ │ ├── deviceInfoModel_gen.go
│ │ ├── incomeModel.go
│ │ ├── incomeModel_gen.go
│ │ ├── logErrModel.go
│ │ ├── logErrModel_gen.go
│ │ ├── parkingLotModel.go
│ │ ├── parkingLotModel_gen.go
│ │ ├── siteInfoModel.go
│ │ ├── siteInfoModel_gen.go
│ │ ├── touristCarProvinceModel.go
│ │ ├── touristCarProvinceModel_gen.go
│ │ ├── touristFlowModel.go
│ │ ├── touristFlowModel_gen.go
│ │ ├── userModel.go
│ │ ├── userModel_gen.go
│ │ ├── vars.go
│ │ ├── wechatModel.go
│ │ └── wechatModel_gen.go
│ └── resources
│ ├── genModel.sh
│ └── park.sql
├── go.mod
├── go.sum
└── model
├── accessModel.go
├── accessModel_gen.go
├── deviceInfoModel.go
├── deviceInfoModel_gen.go
├── incomeModel.go
├── incomeModel_gen.go
├── logErrModel.go
├── logErrModel_gen.go
├── parkingLotModel.go
├── parkingLotModel_gen.go
├── siteInfoModel.go
├── siteInfoModel_gen.go
├── touristCarProvinceModel.go
├── touristCarProvinceModel_gen.go
├── touristFlowModel.go
├── touristFlowModel_gen.go
├── userModel.go
├── userModel_gen.go
├── vars.go
├── wechatModel.go
└── wechatModel_gen.go
|
api
文件夹用于存放外部调用,需要改动的是 *.api
, etc/*.yaml
, svc/serviceContext.go
, logic/*
,作用分别是生成 api 调用框架,写配置文件,将数据添加到 Context 供逻辑调用,逻辑实现。
genModel
文件夹用于生成数据库调用相关实现,需要改动的是resources/*.sql
。
model
文件夹用于添加额外的数据库调用逻辑(将genModel/model/*
复制到 model 后开改!)
简单使用
通过 goctl 生成代码框架。
API 框架通过 api/*.api
生成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
//park.api
syntax = "v1"
info(
title: "parkApi"
desc: "parkBackEnd"
author: "loomt"
email: "loomt_@outlook.com"
version: "1.0"
)
type (
accessResp {
Id int64 `json:"id"`
Location string `json:"location"` // 接入地点
Date string `json:"date"` // 接入日期
Num int64 `json:"num"` // 接入数量
}
incomeResp {
Id int64 `json:"id"`
Type string `json:"type"` // 收入类型
Date string `json:"date"` // 日期
Num int64 `json:"num"` // 当天收入
}
parkingLotResp {
Id int64 `json:"id"`
Name string `json:"name"` // 停车场名字
Duration int64 `json:"duration"` // 停车时间(小时)
Num int64 `json:"num"` // 泊车数
}
siteInfoResp {
Id int64 `json:"id"`
Date string `json:"date"` // 日期
RevisitRate int64 `json:"revisit_rate"` // 重复访问率(%)
SiteHealth int64 `json:"site_health"` // 站点健康度
RfHealth int64 `json:"rf_health"` // 射频健康度
DeviceHealth int64 `json:"device_health"` // 设备健康度
Flow int64 `json:"flow"` // 当日站点流量
}
touristFlowResp {
Id int64 `json:"id"`
Location string `json:"location"` // 园区地点
Date string `json:"date"` // 时间
Num int64 `json:"num"` // 游客数量
}
touristCarProvinceResp {
Id int64 `json:"id"`
Province string `json:"province"` // 省份
Date string `json:"date"` // 日期
FlowNum int64 `json:"flow_num"` // 人流数量
CarNum int64 `json:"car_num"` // 车辆数
}
userReq {
Id int64 `json:"id"` // 用户 id
}
userResp {
Id int64 `json:"id"` // 用户 id
Username string `json:"username"` // 用户名
}
wechatResp {
Date string `json:"date"` // 日期
Num int64 `json:"num"` // 微信关注数量
}
deviceInfoResp {
Id int64 `json:"id"`
UplinkRate float64 `json:"uplink_rate"` // 上行速率
DownlinkRate float64 `json:"downlink_rate"` // 下载速率
Flow float64 `json:"flow"` // 流量
CpuRate float64 `json:"cpu_rate"` // CPU 占有率
Longitude float64 `json:"longitude"` // 经度
Latitude float64 `json:"latitude"` // 纬度
}
)
@server(
prefix: api
)
service park-api {
@doc "获取接入详情"
@handler accessHandler
get /access returns (accessResp)
@doc "获取日收入详情"
@handler incomeHandler
get /income returns (incomeResp)
@doc "获取停车详情"
@handler parkingLotHandler
get /parkingLot returns (parkingLotResp)
@doc "获取站点详情"
@handler siteInfoHandler
get /siteInfo returns (siteInfoResp)
@doc "获取客流量详情"
@handler touristFlowHandler
get /touristFlow returns (touristFlowResp)
@doc "获取游客与车辆来源省份"
@handler touristCarProvinceHandler
get /touristCarProvince returns (touristCarProvinceResp)
@doc "获取用户详情"
@handler userHandler
post /user (userReq) returns (userResp)
@doc "获取微信关注详情"
@handler wechatHandler
get /wechat returns (wechatResp)
@doc "获取设备信息"
@handler deviceInfoHandler
get /deviceInfo returns (deviceInfoResp)
}
|
1
2
|
# api
goctl api go -api *.api -dir ./ --style=goZero
|
MODEL 框架有两种生成方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#!/usr/bin/env zsh
# 使用方法:
# ./genModel.sh usercenter user
# ./genModel.sh usercenter user_auth
# 再将./genModel下的文件剪切到对应服务的model目录里面,记得改package
#生成的表名
tables=$2
#表生成的genmodel目录
modeldir=../model
# 数据库配置
host=127.0.0.1
port=3306
dbname=$1
username=root
passwd=123456
echo "开始创建库:$dbname 的表:$2"
goctl model mysql datasource -url="${username}:${passwd}@tcp(${host}:${port})/${dbname}" -table="${tables}" -dir="${modeldir}" --style=goZero
|
- 直接用 sql 文件 (
genModel/resource/*.sql
) 生成 model
1
2
|
# genModel/resources
goctl model mysql ddl -src="./*.sql" -dir="../model" --style=goZero
|
生成文档
1
2
|
# ./
goctl api doc -dir .
|
华为云部署
- mysql 导入
nohup go run *.go -f etc/*.yaml 2>&1 &