feat: use six-digit numeric member invite codes
This commit is contained in:
@@ -210,7 +210,11 @@ func (s *sSysAppMember) Edit(ctx context.Context, in *sysin.AppMemberEditInp) er
|
||||
}
|
||||
} else {
|
||||
data[mc.MemberNo] = "MB" + gtime.Now().Format("YmdHis") + grand.S(5)
|
||||
data[mc.InviteCode] = strings.ToUpper(grand.S(8))
|
||||
inviteCode, e := newAppMemberInviteCode(ctx, s.memberModel(ctx))
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
data[mc.InviteCode] = inviteCode
|
||||
data[mc.MemberStatus] = consts.AppMemberStatusNormal
|
||||
data[mc.CreatedBy] = userId
|
||||
result, e := s.memberModel(ctx).Fields(mc.MemberNo, mc.Username, mc.Mobile, mc.PasswordHash, mc.TradePasswordHash, mc.LevelId, mc.ParentId, mc.Level, mc.Tree, mc.InviteCode, mc.MemberStatus, mc.RiskStatus, mc.AutoDispatch, mc.CreditScore, mc.IsTestAccount, mc.CreatedBy, mc.UpdatedBy).Hook(hook.SaveTenant).Data(data).Insert()
|
||||
|
||||
@@ -3,7 +3,6 @@ package sys
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"hotgo/internal/consts"
|
||||
"hotgo/internal/dao"
|
||||
@@ -54,19 +53,15 @@ func (s *sSysAppMemberAuth) Register(ctx context.Context, in *sysin.AppMemberReg
|
||||
return gerror.New("手机号已存在")
|
||||
}
|
||||
|
||||
parentId, level, tree := uint64(0), 1, ""
|
||||
if in.InviteCode != "" {
|
||||
var parent *entity.AppMember
|
||||
if e = s.memberModel(ctx).Where(mc.InviteCode, in.InviteCode).Scan(&parent); e != nil {
|
||||
return gerror.Wrap(e, "查询邀请人失败")
|
||||
}
|
||||
if parent == nil {
|
||||
return gerror.New("邀请码不存在")
|
||||
}
|
||||
parentId = parent.Id
|
||||
level = parent.Level + 1
|
||||
tree = parent.Tree + "tr_" + fmt.Sprint(parent.Id) + " "
|
||||
var parent *entity.AppMember
|
||||
if e = s.memberModel(ctx).Where(mc.InviteCode, in.InviteCode).Where(mc.MemberStatus, consts.AppMemberStatusNormal).Scan(&parent); e != nil {
|
||||
return gerror.Wrap(e, "查询邀请人失败")
|
||||
}
|
||||
if parent == nil {
|
||||
return gerror.New("邀请码不存在")
|
||||
}
|
||||
parentId, level := parent.Id, parent.Level+1
|
||||
tree := parent.Tree + "tr_" + fmt.Sprint(parent.Id) + " "
|
||||
|
||||
levelId := uint64(0)
|
||||
var firstLevel *entity.AppMemberLevel
|
||||
@@ -81,11 +76,15 @@ func (s *sSysAppMemberAuth) Register(ctx context.Context, in *sysin.AppMemberReg
|
||||
return gerror.Wrap(e, "生成密码摘要失败")
|
||||
}
|
||||
memberNo := "MB" + gtime.Now().Format("YmdHis") + grand.S(5)
|
||||
inviteCode, e := newAppMemberInviteCode(ctx, s.memberModel(ctx))
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
memberData := g.Map{
|
||||
mc.TenantId: 0,
|
||||
mc.MemberNo: memberNo, mc.Username: in.Username, mc.Mobile: in.Mobile,
|
||||
mc.PasswordHash: string(hashed), mc.LevelId: levelId, mc.ParentId: parentId,
|
||||
mc.Level: level, mc.Tree: tree, mc.InviteCode: strings.ToUpper(grand.S(8)),
|
||||
mc.Level: level, mc.Tree: tree, mc.InviteCode: inviteCode,
|
||||
mc.MemberStatus: consts.AppMemberStatusNormal, mc.RiskStatus: consts.AppMemberRiskNormal,
|
||||
mc.AutoDispatch: consts.AppMemberDispatchManual, mc.CreditScore: 100, mc.IsTestAccount: 2,
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
package sys
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
"math/big"
|
||||
|
||||
"hotgo/internal/dao"
|
||||
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
)
|
||||
|
||||
func newAppMemberInviteCode(ctx context.Context, members *gdb.Model) (string, error) {
|
||||
for attempt := 0; attempt < 20; attempt++ {
|
||||
number, err := rand.Int(rand.Reader, big.NewInt(1000000))
|
||||
if err != nil {
|
||||
return "", gerror.Wrap(err, "生成邀请码失败")
|
||||
}
|
||||
code := fmt.Sprintf("%06d", number.Int64())
|
||||
count, err := members.Unscoped().Where(dao.AppMember.Columns().InviteCode, code).Count()
|
||||
if err != nil {
|
||||
return "", gerror.Wrap(err, "检查邀请码失败")
|
||||
}
|
||||
if count == 0 {
|
||||
return code, nil
|
||||
}
|
||||
}
|
||||
return "", gerror.New("邀请码暂时无法生成,请稍后重试")
|
||||
}
|
||||
Reference in New Issue
Block a user