Merge pull request 'by Robin at 20240110; login add inviter field' (#54) from feat-20240109-001-Robin into test

Reviewed-on: #54
This commit is contained in:
chenhao 2024-01-10 23:20:04 +08:00
commit 0a63f58952
11 changed files with 51 additions and 9 deletions

View File

@ -36,8 +36,10 @@ var ErrCodeMsgMap = map[ErrCode]string{
ErrCodeLoginRegisterUserFail: "账号注册失败,请稍后重试", ErrCodeLoginRegisterUserFail: "账号注册失败,请稍后重试",
ErrCodeLoginWrongOldPswd: "旧密码错误", ErrCodeLoginWrongOldPswd: "旧密码错误",
ErrCodeAccountSrvFail: "账户服务错误", ErrCodeAccountSrvFail: "账户服务错误",
ErrCodeAccountNotExist: "账户信息不存在", ErrCodeAccountNotExist: "账户信息不存在",
ErrCodeAccountInviterNotExist: "邀请人不存在",
ErrCodeAccountInviterIsNotAStreamer: "邀请人非主播",
ErrCodeVasSrvFail: "增值服务错误", ErrCodeVasSrvFail: "增值服务错误",
ErrCodeVasProductNotExist: "商品不存在", ErrCodeVasProductNotExist: "商品不存在",
@ -188,9 +190,11 @@ const (
ErrCodeLoginWrongOldPswd ErrCode = -5011 //旧密码错误 ErrCodeLoginWrongOldPswd ErrCode = -5011 //旧密码错误
// Account: 6xxx // Account: 6xxx
ErrCodeAccountSrvOk ErrCode = ErrCodeOk ErrCodeAccountSrvOk ErrCode = ErrCodeOk
ErrCodeAccountSrvFail ErrCode = -6001 //账户服务错误 ErrCodeAccountSrvFail ErrCode = -6001 //账户服务错误
ErrCodeAccountNotExist ErrCode = -6002 //账户信息不存在 ErrCodeAccountNotExist ErrCode = -6002 //账户信息不存在
ErrCodeAccountInviterNotExist ErrCode = -6003 //邀请人不存在,
ErrCodeAccountInviterIsNotAStreamer ErrCode = -6004 //邀请人非主播,
// Vas: 7xxx // Vas: 7xxx
ErrCodeVasSrvOk ErrCode = ErrCodeOk ErrCodeVasSrvOk ErrCode = ErrCodeOk

View File

@ -75,6 +75,7 @@ type ApiLoginByVeriCodeReq struct {
base.BaseRequest base.BaseRequest
MobilePhoneInfoComponent `jcrypto:"true"` MobilePhoneInfoComponent `jcrypto:"true"`
VeriCodeComponent VeriCodeComponent
Inviter *int64 `json:"inviter"`
} }
type ApiLoginData struct { type ApiLoginData struct {

View File

@ -75,6 +75,7 @@ type OpLoginByVeriCodeReq struct {
base.BaseRequest base.BaseRequest
MobilePhoneInfoComponent `jcrypto:"true"` MobilePhoneInfoComponent `jcrypto:"true"`
VeriCodeComponent VeriCodeComponent
Inviter *int64 `json:"inviter"`
} }
type OpLoginData struct { type OpLoginData struct {

View File

@ -123,7 +123,7 @@ func (s *Service) ApiLoginByVeriCode(ctx *gin.Context, req *loginproto.ApiLoginB
// 2.如果错误码是登录信息不存在,则判断为首次登录,将创建用户信息 // 2.如果错误码是登录信息不存在,则判断为首次登录,将创建用户信息
if ec == errcode.ErrCodeLoginNotExist { if ec == errcode.ErrCodeLoginNotExist {
login, account, ec = s.utilRegisterUser(ctx, &req.MobilePhoneInfoComponent) login, account, ec = s.utilRegisterUser(ctx, &req.MobilePhoneInfoComponent, req.Inviter)
if ec != errcode.ErrCodeLoginSrvOk { if ec != errcode.ErrCodeLoginSrvOk {
logger.Error("utilRegisterUser failed") logger.Error("utilRegisterUser failed")
ec = errcode.ErrCodeLoginRegisterUserFail ec = errcode.ErrCodeLoginRegisterUserFail

View File

@ -106,13 +106,26 @@ func (s *Service) ApiLoginByVeriCodeBusinessValidate(ctx *gin.Context, req *logi
// 2.如果错误码是登录信息不存在,则判断为首次登录,业务逻辑将创建用户信息 // 2.如果错误码是登录信息不存在,则判断为首次登录,业务逻辑将创建用户信息
if ec == errcode.ErrCodeLoginNotExist { if ec == errcode.ErrCodeLoginNotExist {
vericode, _ = resultList[3].(*dbstruct.VeriCode) vericode, _ = resultList[3].(*dbstruct.VeriCode)
if req.Inviter != nil {
inviter, err := _DefaultAccount.OpListByUserId(ctx, &accountproto.OpListByUserIdReq{
UserId: req.Inviter,
})
if err != nil || inviter == nil {
ec = errcode.ErrCodeAccountInviterNotExist
return
}
if util.DerefInt64(inviter.Role) != consts.Streamer {
ec = errcode.ErrCodeAccountInviterIsNotAStreamer
return
}
}
return return
} else if ec == errcode.ErrCodeLoginSrvOk { } else if ec == errcode.ErrCodeLoginSrvOk {
login, _ = resultList[1].(*dbstruct.Login) login, _ = resultList[1].(*dbstruct.Login)
account, _ = resultList[2].(*dbstruct.Account) account, _ = resultList[2].(*dbstruct.Account)
vericode, _ = resultList[3].(*dbstruct.VeriCode) vericode, _ = resultList[3].(*dbstruct.VeriCode)
} else { } else {
logger.Error("ApiLoginByPswd business validation failed!") logger.Error("ApiLoginByVeriCode business validation failed!")
return return
} }
return return

View File

@ -1,6 +1,7 @@
package service package service
import ( import (
"service/api/consts"
"service/api/errcode" "service/api/errcode"
accountproto "service/api/proto/account/proto" accountproto "service/api/proto/account/proto"
accountrelationproto "service/api/proto/accountrelation/proto" accountrelationproto "service/api/proto/accountrelation/proto"
@ -18,6 +19,7 @@ import (
userwxaddcheckproto "service/api/proto/userwxaddcheck/proto" userwxaddcheckproto "service/api/proto/userwxaddcheck/proto"
vericodeproto "service/api/proto/vericode/proto" vericodeproto "service/api/proto/vericode/proto"
businessvalidator "service/app/mix/service/business_validator" businessvalidator "service/app/mix/service/business_validator"
"service/bizcommon/util"
"service/dbstruct" "service/dbstruct"
"service/library/logger" "service/library/logger"
"service/library/mycrypto" "service/library/mycrypto"
@ -112,6 +114,19 @@ func (s *Service) OpLoginByVeriCodeBusinessValidate(ctx *gin.Context, req *login
// 2.如果错误码是登录信息不存在,则判断为首次登录,将创建用户信息 // 2.如果错误码是登录信息不存在,则判断为首次登录,将创建用户信息
if ec == errcode.ErrCodeLoginNotExist { if ec == errcode.ErrCodeLoginNotExist {
if req.Inviter != nil {
inviter, err := _DefaultAccount.OpListByUserId(ctx, &accountproto.OpListByUserIdReq{
UserId: req.Inviter,
})
if err != nil || inviter == nil {
ec = errcode.ErrCodeAccountInviterNotExist
return
}
if util.DerefInt64(inviter.Role) != consts.Streamer {
ec = errcode.ErrCodeAccountInviterIsNotAStreamer
return
}
}
return return
} else if ec == errcode.ErrCodeLoginSrvOk { } else if ec == errcode.ErrCodeLoginSrvOk {
login, _ = resultList[1].(*dbstruct.Login) login, _ = resultList[1].(*dbstruct.Login)

View File

@ -524,7 +524,7 @@ func (s *Service) OpLoginByVeriCode(ctx *gin.Context, req *loginproto.OpLoginByV
// 2.如果错误码是登录信息不存在,则判断为首次登录,将创建用户信息 // 2.如果错误码是登录信息不存在,则判断为首次登录,将创建用户信息
if ec == errcode.ErrCodeLoginNotExist { if ec == errcode.ErrCodeLoginNotExist {
login, account, ec = s.utilRegisterUser(ctx, &req.MobilePhoneInfoComponent) login, account, ec = s.utilRegisterUser(ctx, &req.MobilePhoneInfoComponent, req.Inviter)
if ec != errcode.ErrCodeLoginSrvOk { if ec != errcode.ErrCodeLoginSrvOk {
logger.Error("utilRegisterUser failed") logger.Error("utilRegisterUser failed")
ec = errcode.ErrCodeLoginRegisterUserFail ec = errcode.ErrCodeLoginRegisterUserFail

View File

@ -19,7 +19,7 @@ import (
// 不向外暴露的辅助公共函数 // 不向外暴露的辅助公共函数
// 注册账户 // 注册账户
func (s *Service) utilRegisterUser(ctx *gin.Context, req *loginproto.MobilePhoneInfoComponent) (login *dbstruct.Login, account *dbstruct.Account, ec errcode.ErrCode) { func (s *Service) utilRegisterUser(ctx *gin.Context, req *loginproto.MobilePhoneInfoComponent, inviter *int64) (login *dbstruct.Login, account *dbstruct.Account, ec errcode.ErrCode) {
var err error var err error
ec = errcode.ErrCodeLoginSrvOk ec = errcode.ErrCodeLoginSrvOk
@ -44,6 +44,7 @@ func (s *Service) utilRegisterUser(ctx *gin.Context, req *loginproto.MobilePhone
account.MobilePhone = goproto.String(req.MobilePhone) account.MobilePhone = goproto.String(req.MobilePhone)
account.RegionCode = goproto.String(req.RegionCode) account.RegionCode = goproto.String(req.RegionCode)
account.PhoneHash = goproto.String(req.PhoneHash) account.PhoneHash = goproto.String(req.PhoneHash)
account.Inviter = inviter
// 创建账户生成mid // 创建账户生成mid
err = _DefaultAccount.OpCreate(ctx, &accountproto.OpCreateReq{ err = _DefaultAccount.OpCreate(ctx, &accountproto.OpCreateReq{

View File

@ -20,6 +20,7 @@ type Account struct {
IsDndModeEnabled *int64 `json:"is_dnd_mode_enabled" bson:"is_dnd_mode_enabled"` // 是否开启勿扰模式 IsDndModeEnabled *int64 `json:"is_dnd_mode_enabled" bson:"is_dnd_mode_enabled"` // 是否开启勿扰模式
GoldNum *int64 `json:"gold_num" bson:"gold_num"` // 金币数量 GoldNum *int64 `json:"gold_num" bson:"gold_num"` // 金币数量
DiamondNum *int64 `json:"diamond_num" bson:"diamond_num"` // 钻石数量 DiamondNum *int64 `json:"diamond_num" bson:"diamond_num"` // 钻石数量
Inviter *int64 `json:"inviter" bson:"inviter"` // 邀请人user_id
Latitude *float64 `bson:"latitude"` // 纬度 Latitude *float64 `bson:"latitude"` // 纬度
Longitude *float64 `bson:"longitude"` // 经度 Longitude *float64 `bson:"longitude"` // 经度
Ct *int64 `json:"ct" bson:"ct"` // 创建时间 Ct *int64 `json:"ct" bson:"ct"` // 创建时间

View File

@ -39,6 +39,9 @@ func (aesCrypto *AesCrypto) Encrypt(msg []byte) (encryptedBytes []byte, err erro
} }
func (aesCrypto *AesCrypto) Decrypt(encryptedBytes []byte) (decryptedBytes []byte, err error) { func (aesCrypto *AesCrypto) Decrypt(encryptedBytes []byte) (decryptedBytes []byte, err error) {
if len(encryptedBytes) == 0 {
return
}
//CBC解密 //CBC解密
block, _ := aes.NewCipher(aesCrypto.aesPriKey) // 分组秘钥 block, _ := aes.NewCipher(aesCrypto.aesPriKey) // 分组秘钥
blockSize := block.BlockSize() // 获取秘钥块的长度 blockSize := block.BlockSize() // 获取秘钥块的长度

View File

@ -39,6 +39,9 @@ func (rsaCrypto *RsaCrypto) Encrypt(msg []byte) (encryptedBytes []byte, err erro
} }
func (rsaCrypto *RsaCrypto) Decrypt(encryptedBytes []byte) (decryptedBytes []byte, err error) { func (rsaCrypto *RsaCrypto) Decrypt(encryptedBytes []byte) (decryptedBytes []byte, err error) {
if len(encryptedBytes) == 0 {
return
}
//私钥解密 //私钥解密
decryptedBytes, err = rsa.DecryptPKCS1v15(rand.Reader, rsaCrypto.rsaPriKey, encryptedBytes) decryptedBytes, err = rsa.DecryptPKCS1v15(rand.Reader, rsaCrypto.rsaPriKey, encryptedBytes)
if err != nil { if err != nil {