这套规范的目的在于提高后端开发效率,减少坑。

《目录》

  • 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”服务是一个高可用分布式的服务,专门负责权限验证。