feat: 主播昵称过人审

This commit is contained in:
wangxinyu 2024-12-11 16:44:38 +08:00
parent 1fb5625ec0
commit 9c4394fb34
5 changed files with 116 additions and 31 deletions

View File

@ -99,6 +99,26 @@ const (
RedisMomentPrefix = "moment:" //moment服务前缀
)
// 用户表信息审核状态,按位判断
// 状态大致如下:
//
// 00昵称正常
// 01昵称违规
// 10昵称审核中
const (
AuditPass = 0 // 审核通过
StreamerNikeNameAuditReject = 1 // 主播昵称违规
StreamerNikeNameAuditing = 2 // 主播昵称审核状态
//StreamerAvatarReject = 4 // 主播头像违规
//StreamerAvatarAuditing = 8 // 主播头像审核状态
)
// 审核的维度
const (
StreamNikeAudit = 1 // 主播昵称审核
//StreamerAvatar = 2 // 主播头像审核
)
//const PackageRootPath = "C:/Users/PC/Desktop/service"
const PackageRootPath = "/app/wishpal-ironfan"

View File

@ -55,7 +55,6 @@ import (
"service/library/redis"
interceptor "service/library/taginterceptor"
"strconv"
"strings"
"time"
Raven_IQ_testproto "service/api/proto/Raven_IQ_test/proto"
@ -64,7 +63,6 @@ import (
goproto "google.golang.org/protobuf/proto"
"github.com/gin-gonic/gin"
"github.com/mozillazg/go-pinyin"
"github.com/qiniu/qmgo"
"github.com/ulule/deepcopier"
)
@ -363,36 +361,41 @@ func (s *Service) ApiUpdateAccount(ctx *gin.Context, req *accountproto.ApiUpdate
s.CreateUpdateAccountImageAudit(ctx, oldAccount, req.Account)
s.CreateUpdateAccountTextAudit(ctx, oldAccount, req.Account)
// 主播昵称需要先过审核,后更新
if oldAccount.GetRole() == consts.Streamer && oldAccount.Name != req.Name {
ec = errcode.ErrCodeTextAuditTaskNikeNameWait
return
opUpdateReq := &accountproto.OpUpdateReq{
Account: &dbstruct.Account{
Mid: req.Account.Mid,
Avatar: req.Account.Avatar,
},
}
// 主播昵称需要先过审核
if oldAccount.GetRole() == consts.Streamer && oldAccount.Name != req.Account.Name {
opUpdateReq.NewName = req.Account.Name
auditStatus := s.SetAuditStatusBitMap(opUpdateReq.GetAuditStatus(), consts.StreamNikeAudit, consts.StreamerNikeNameAuditReject)
opUpdateReq.AuditStatus = goproto.Int64(auditStatus)
} else {
opUpdateReq.Name = req.Account.Name
}
// 用户只允许修改昵称和头像
if err := _DefaultAccount.OpUpdate(ctx, &accountproto.OpUpdateReq{
Account: &dbstruct.Account{
Mid: req.Account.Mid,
Name: req.Account.Name,
Avatar: req.Account.Avatar,
},
}); err != nil {
if err := _DefaultAccount.OpUpdate(ctx, opUpdateReq); err != nil {
logger.Error("OpUpdate fail, req: %v, err: %v", util.ToJson(req), err)
ec = errcode.ErrCodeAccountSrvFail
return
}
if oldAccount.GetRole() == consts.Streamer && req.Account.Name != nil {
if err := _DefaultStreamerAcct.OpUpdate(ctx, &dbstruct.EsStreamerAcct{
Mid: req.Account.GetMid(),
Name: req.Account.GetName(),
PinYin: strings.Join(pinyin.LazyConvert(req.Account.GetName(), nil), ""),
}); err != nil {
logger.Error("OpUpdate fail, req: %v, err: %v", util.ToJson(req), err)
ec = errcode.ErrCodeAccountSrvFail
return
}
}
// 主播需要审核,暂时不需要更新 es
//if oldAccount.GetRole() == consts.Streamer && req.Account.Name != nil {
// if err := _DefaultStreamerAcct.OpUpdate(ctx, &dbstruct.EsStreamerAcct{
// Mid: req.Account.GetMid(),
// Name: req.Account.GetName(),
// PinYin: strings.Join(pinyin.LazyConvert(req.Account.GetName(), nil), ""),
// }); err != nil {
// logger.Error("OpUpdate fail, req: %v, err: %v", util.ToJson(req), err)
// ec = errcode.ErrCodeAccountSrvFail
// return
// }
//}
return
}
@ -414,6 +417,11 @@ func (s *Service) ApiGetAccountListByMid(ctx *gin.Context, req *accountproto.Api
return
}
nameFlag := s.GetAuditStatusBitMap(account.GetAuditStatus(), consts.StreamNikeAudit)
if account.GetRole() == consts.Streamer && nameFlag == consts.StreamerNikeNameAuditing {
account.Name = account.NewName
}
vo = &accountproto.ApiListVO{}
vo.CopyAccount(account)

View File

@ -22,7 +22,6 @@ func (s *Service) CreateUpdateAccountTextAudit(ctx *gin.Context, oldAccount *dbs
return
}
// TODO:wxy, 是否增加审核中状态
tasks = append(tasks, &dbstruct.TextAuditTask{
Mid: newAccount.Mid,
RouteUrl: goproto.String(ctx.Request.URL.Path),
@ -245,3 +244,36 @@ func addTextAuditTask(ctx *gin.Context, task *dbstruct.TextAuditTask, options ..
}
return nil
}
// 获取用户主播的审核信息
func (s *Service) GetAuditStatusBitMap(auditStatus int64, auditType int) int {
switch auditType {
case consts.StreamNikeAudit:
return int(auditStatus & consts.StreamerNikeNameAuditing)
}
return -1
}
// 设置用户主播的审核信息
func (s *Service) SetAuditStatusBitMap(auditStatus int64, auditType int, flag int) int64 {
if auditType < 0 {
return auditStatus
}
switch auditType {
case consts.StreamNikeAudit:
if flag == consts.StreamerNikeNameAuditing {
auditStatus |= consts.StreamerNikeNameAuditing
} else if flag == consts.StreamerNikeNameAuditReject {
auditStatus |= consts.StreamerNikeNameAuditReject
auditStatus &^= consts.StreamerNikeNameAuditing
} else {
auditStatus &^= consts.StreamerNikeNameAuditReject
auditStatus &^= consts.StreamerNikeNameAuditing
}
}
return auditStatus
}

View File

@ -19,6 +19,7 @@ import (
)
var DefaultTextAuditTaskResultHandler *TextAuditTaskResultHandler
var s *Service
type TextAuditTaskResultHandler struct {
// 图像审核任务通过及回退方法生成器map
@ -79,26 +80,41 @@ func (handler *TextAuditTaskResultHandler) generateAccountNameUpdateFunc() {
return err
}
// 主播昵称需要先过审核,后更新
// TODO:wxy, 待优化
var name *string
if option == consts.TextAuditTaskUpdate_Pass {
var auditStatus = int64(-1)
if acct.GetRole() == consts.Streamer && option == consts.TextAuditTaskUpdate_Pass {
// 主播昵称人审通过
name = task.AuditedText
} else if option != consts.TextAuditTaskUpdate_Pass && acct.GetRole() != consts.Streamer {
auditStatus = s.SetAuditStatusBitMap(acct.GetAuditStatus(), consts.StreamNikeAudit, consts.AuditPass)
} else if acct.GetRole() == consts.Streamer && option == consts.TextAuditTaskUpdate_Reject {
// 主播昵称人审拒绝
name = task.OldText
auditStatus = s.SetAuditStatusBitMap(acct.GetAuditStatus(), consts.StreamNikeAudit, consts.StreamerNikeNameAuditReject)
} else if acct.GetRole() != consts.Streamer && option == consts.TextAuditTaskUpdate_Pass {
name = task.AuditedText
} else {
name = task.OldText
}
err = _DefaultAccount.OpUpdate(ctx, &accountproto.OpUpdateReq{
opUpdateReq := &accountproto.OpUpdateReq{
Account: &dbstruct.Account{
Mid: mid,
Name: name,
},
})
}
if auditStatus != -1 {
opUpdateReq.AuditStatus = goproto.Int64(auditStatus)
}
err = _DefaultAccount.OpUpdate(ctx, opUpdateReq)
if err != nil {
return err
}
if acct.GetRole() == consts.Streamer {
// 更新 es
if acct.GetRole() == consts.Streamer && option == consts.TextAuditTaskUpdate_Pass {
return _DefaultStreamerAcct.OpUpdate(ctx, &dbstruct.EsStreamerAcct{
Mid: util.DerefInt64(mid),
Name: util.DerefString(name),

View File

@ -8,6 +8,7 @@ const (
type Account struct {
Mid *int64 `json:"mid" bson:"_id"` // 用户表Id
Name *string `json:"name" bson:"name"` // 用户名
NewName *string `json:"new_name"` // 用户修改后的名字(主播昵称需要审核,用来更新)
UserId *int64 `json:"user_id" bson:"user_id"` // 业务Id
Avatar *MediaComponent `json:"avatar" bson:"avatar"` // 头像
MobilePhone *string `json:"mobile_phone" bson:"mobile_phone" jcrypto:"rsa" bcrypto:"aes_cbc|1|0"` // 手机号,数据库加密,查询不解密
@ -24,6 +25,7 @@ type Account struct {
IsAMember *int64 `json:"is_a_member" bson:"is_a_member"` // 是否是会员0-否1-是
Status *int64 `json:"status" bson:"status"` // 账户状态0-正常1-账户注销中2-账户已注销
DevType *int32 `bson:"dev_type"` // 注册来源
AuditStatus *int64 `json:"audit_status" bson:"audit_status"` // 审核状态
Latitude *float64 `bson:"latitude"` // 纬度
Longitude *float64 `bson:"longitude"` // 经度
UserIdString *string `json:"user_id_string" bson:"user_id_string"` // string型user_id为模糊匹配设置
@ -88,6 +90,13 @@ func (p *Account) GetRole() int64 {
return *p.Role
}
func (p *Account) GetAuditStatus() int64 {
if p == nil || p.AuditStatus == nil {
return -1
}
return *p.AuditStatus
}
// StreamerAcct 用户结构
type StreamerAcct struct {
Mid *int64 `json:"mid" bson:"_id"` // 用户表Id