依赖go1.17、mysql、redis,需要自行安装。
执行sql目录下的全部sql文件进行表创建和数据导入。
复制configs
目录下的配置模板mode_configs.toml.example
并重命名为dev_configs.toml
文件到configs
目录
环境配置mode
命名规则说明:
dev
: 开发环境fat
: 测试环境uat
: 预上线环境pro
: 正式环境自行修改服务端口、mysql、redis等连接信息,如:
[server]
HttpPort = 8000
[language]
local = "zh-cn"
[mysql]
Host = "127.0.0.1:3306"
Name = "lee"
Password = "123456"
User = "root"
[redis]
Host = "127.0.0.1:6379"
执行go run main.go
或者go run main.go --env dev
将会读取dev_configs.toml配置启动服务
由于使用了pflag包解析命令行,所以需要写为--env
,而不是-env
参考pflag的"Shorthand"说明
可以通过环境变量(env)修改配置值:
SERVER_HTTPPORT=9998 go run main.go
可以通过参数(flag)修改配置值:
go run main.go --env dev --Server.HttpPort=8888 --Mysql.Host=127.0.0.1:3306
可以通过环境变量(env)和参数(flag)结合修改配置值
SERVER_HTTPPORT=9998 go run main.go --env dev --Server.HttpPort=8888 --Mysql.Host=127.0.0.1:3306
不同系统设置环境变量的方式不同,此示例为Linux环境下的环境变量设置,其他系统需要自行根据需要配置
执行make run
将会读取dev_configs.toml配置启动服务
系统默认访问地址http://localhost:8000/
swagger文档默认访问地址http://localhost:8000/swagger/index.html
当前仅限dev环境和验证功能使用docker-compose方式部署。
# 构建镜像
docker build -t leeframe:v1.0 .
environment:
SERVER_HTTPPORT: '8000'
MYSQL_HOST: 'mysql:3306'
MYSQL_USER: 'root'
MYSQL_PASSWORD: '123456'
MYSQL_NAME: 'leeframe'
REDIS_HOST: 'redis:6379'
REDIS_PASSWORD: ''
--env
,而不是-env
参考pflag的"Shorthand"说明 command:
- --env=dev
- --Server.HttpPort=8000
- --Mysql.Host=mysql:3306
# 启动mysql、redis、api服务,初次启动或后续启动
docker-compose up -d
# Creating network "leeframe_app-network" with driver "bridge"
# Creating leeframe_mysql_1 ... done
# Creating leeframe_redis_1 ... done
# Creating leeframe_api_1 ... done
系统默认访问地址http://localhost:8000/
swagger文档默认访问地址http://localhost:8000/swagger/index.html
mysql默认连接信息:端口3305,用户root,密码123456,连接命令mysql -P 3305 -u root -p
redis默认连接信息:端口6378,连接命令redis-cli -p 6378
# 停止mysql、redis、api服务
# 只会停止容器,数据不会清除
docker-compose stop
# Stopping leeframe_api_1 ... done
# Stopping leeframe_mysql_1 ... done
# Stopping leeframe_redis_1 ... done
# 停止并删除mysql、redis、api容器
# 注意:这一步会删除所有数据
docker-compose down
# Stopping leeframe_api_1 ... done
# Stopping leeframe_mysql_1 ... done
# Stopping leeframe_redis_1 ... done
# Removing leeframe_api_1 ... done
# Removing leeframe_mysql_1 ... done
# Removing leeframe_redis_1 ... done
# Removing network leeframe_app-network
参考框架目录结构说明
CreatedAt、userID、Username
third_party、user_service
package model、package user_service
ID、URL
或id、url
,少使用Id、Url
这种写法变量命名尽量见名知意,非常用缩写字符尽量备注
尽量使用//
双斜线+空格这种形式,如
// List
// @Author: lee
每个方法或函数前面至少包含方法名、作者、时间、描述四行描述。如:
// List
// @Author: lee
// @Date: 2021-11-29 16:42:48
// @Description: 获取用户列表
func (t *User) List() (list []*User, err error) {}
尽量在程序代码中说明使用一些特殊逻辑或者magic参数的原因和目的,如
// 添加 1=1 是为了方便组合where条件查询语句
where := `1=1`
submitReq := &schema.SubmitReq{
Query: strCreateSQL, // 建表sql,已基于base64解码转成string
Prefix: "", // 不需要前缀
Anonymized: false, // 不需要脱敏
}
至少需要包含方法名、描述、tag分类、接收数据类型、返回数据类型、请求参数(如有),响应信息,路由,http请求方法。如:
// Info 获取用户详情
// @Summary 获取用户详情
// @Description 获取用户详情
// @Tags 公共接口
// @Accept mpfd
// @Produce json
// @Param Request query schema.UserInfoReq true "请求信息"
// @Success 200 {object} http.Response{data=schema.UserInfoData}
// @Router /api/user/info [get]
// @Author: lee
// @Date: 2021-11-30 11:19:28
func (a *userApi) Info(c *gin.Context) {}
尽量使用同一个方法返回,如http包中的Response:
// package http
// Response setting gin.JSON
func (g *Gin) Response(code int, msg string, data interface{}) {
g.C.JSON(200, Response{
Code: code,
Msg: msg,
Data: data,
})
}
尽量在同一个文件里定义好常用大类错误码,细分错误码和错误提示文本(国际化支持)需要统一定义,如:
package http
const (
SUCCESS = 200
ERROR = 500
//常用大类的错误码在此定义
InvalidParams = 400
)
尽量命名方法返回值,如
func (t *User) Create(username string) (id int, err error) {}
mysql、redis公共方法分别封装在pkg/mysql、pkg/redis里
可以使用公共方法,也可以根据需要在model文件自定义实现
尽量在日志中记录方法调用和接口访问的入参和返回值,方便排查和定位问题
尽量在日志中记录error信息和其他有用的信息(用户名、执行的sql等)
尽量使用英文提示(国际化支持)
如:
logger.Info(username, " exec sql: ", sql)
logger.Error("get user info err: ", validation.Error(err))
默认基于dev分支进行开发,也可以创建自己的开发分支或feature分支。
实际项目中,master应设置为保护分支,不能直接提交代码到master,只能从其他分支提PR后merge到master。
可根据需要选择不同的git flow规范。
尽量描述清楚本次提交的变动信息,如:
git commit -m "docs(swagger): add user list api"
每次提交代码之前需要生成swagger文档,确保swagger文档能正确生成和保持最新,与代码一并提交。
依赖swagger 2.0、GORM v2
swag init
如没有swag命令需要安装一下。参考:
go get github.com/swaggo/swag/cmd/swag
由于项目存在跨时区的情况,前后端最好通过unix毫秒时间进行传输,如果必须传输时间字符串,请使用带时区信息的UTC时间。
// go1.17
// int64毫秒时间转time.Time
startTime := time.UnixMilli(req.StartTime)
// time.Time转int64毫秒时间
detail = &schema.Detail{
CreatedAt: one.CreatedAt.UnixMilli(),
}
由于部分项目可能需要接入工作台,而工作台对部分http请求方法的支持不完善,所以实际项目中强制规定,只能使用GET和POST,不允许使用PUT、PATCH、DELETE等方法。
// 用户
user := api.Group("/user")
{
// 新建
user.POST("/create", controller.User.Create)
// 列表
user.GET("/list", controller.User.List)
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。