这套规范的目的在于提高后端开发效率,减少坑。
《目录》
- handler层规范
- module层规范
- model层规范
- 测试规范
- 其他
环境规范
dev 开发环境:用于开发、测试人员初次验收,检验流程
test 测试环境:用于测试人员最终验收,运营人员体验、评审
master 生产环境 :线上环境
git分支规范
直接直接
直接直接
直接直接
master_fix 修复分支:用于修复线上缺陷,修复后merge到master分支
业务分支:必须基于master派生,开发完毕后merge到dev分支用于调试。
handler层规范
参数与返回值规范:
不允许大写
所有参数和返回值必须使用蛇形
错误:userInfo UserInfo
正确:user_info
翻页
page :当前页数
limit: 每页条数,默认15条
pager:返回值(含页数/总条数等),统一使用g.Pager结构体
时间区间
.. where created >= ? and created < ?
禁止使用中文拼音
错误: xueyuan_list
正确: school_list
禁止使用错误的英文拼写,但可以使用首字母代表词义
错误: cate_id 、 sch_id
正确: category_id/c_id
module层规范
model层规范
select语法
select *
for update
对于资金、余额等敏感字段,进行db操作时,务必放在事务当中,并增加读锁,防止其他业务出现脏读。
mysql鉴权
shop_id = ?brand_id = ?
if shop_id != 0{
db = db.where('shop_id = ?',shop_id)
}
shop_id是不能判断空的
IN语法
对于in的数组同上禁止使用db层的判空,导致返回所有数据
错误示例
if memberIds != nil{
db = db.where("member_id in (?)",memberIds)
}
modules
members_moduels.go
if memberIds == nil{
return
}
IdsKillDuplicateAndZero
在utils包中有个方法,可以将重复的id和0值去除,防止db查询时sql过长。
如
... in(1,1,2,23,3,1,1,1,1,1,12,1,2)
查询前,将id写入IdsKillDuplicateAndZero,过滤后
... in(1,2,23,3,12)
用法
func (m Member) GetPhoneByIds(ids []int, shopId int) (list []*Member, err error) {
ids = utils.IdsKillDuplicateAndZero(ids)
err = m.DB().Select("phone,member_id").Where("member_id in (?) and is_del = ? and shop_id = ?", ids, SureNo, shopId).Find(&list).Error
for _, v := range list {
v.StoreName = StoreShopDefault.GetStoreName(v.ShopId, v.StoreId)
}
if err = m.setBalanceAndShopLevelId(list); err != nil {
return nil, err
}
return
}
测试规范
其他
日志规范
release
error处理
所有db类型的错误必须处理。
错误:
_ = models.UserDefault.Update(xx)
正确:
err = models.UserDefault.Update(xx)
if err != nil{
dosomething
}
非db错误,如redis错误/strconv错误/json mashal 错误
视业务逻辑而定
正确
num,_ := strconv.Atoi(str) //当前端传递错误字符串时,默认为0
业务开发规范
目前存在近10个go子项目,每个子项目之间通过rpc进行通信,但经常存在子业务需要通过主业务进行权限验证。这种情况务必使用鉴权包“exauth”,减少对主server的依赖。“exauth”服务是一个高可用分布式的服务,专门负责权限验证。