Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
153 lines
4.1 KiB
Go
153 lines
4.1 KiB
Go
package srv_mwacc
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"time"
|
|
"videoweb/pub/common/crypt"
|
|
"videoweb/pub/common/enum/consts"
|
|
"videoweb/pub/common/log"
|
|
"videoweb/pub/common/srvdef"
|
|
"videoweb/pub/common/utils"
|
|
"videoweb/pub/models/mwacc"
|
|
"videoweb/web/webg"
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
)
|
|
|
|
func generateToken(userID int64) (string, error) {
|
|
return utils.GenerateUserToken(utils.UserClaims{UserID: userID, Expire: consts.AdminJwtTokenExpire}, webg.Conf.JwtKey)
|
|
}
|
|
|
|
// AccSLogin 账号登录
|
|
func AccSLogin(ctx context.Context, acc string, pwd string) (*mwacc.MwAcc, *srvdef.SrvErr) {
|
|
var data *mwacc.MwAcc
|
|
res, dataErr := mwacc.FindOneAccByFilter(ctx, bson.M{
|
|
mwacc.FN.MwAcc.Acc: acc,
|
|
})
|
|
|
|
if dataErr != nil || res.Id == 0 {
|
|
return data, srvdef.New(srvdef.AccountIsNotExists, srvdef.AccountIsNotExists.Msg(), "")
|
|
}
|
|
|
|
if !res.IsEnb {
|
|
return data, srvdef.New(srvdef.AccountErrAccessForbid, srvdef.AccountErrAccessForbid.Msg(), "")
|
|
}
|
|
|
|
// 通过验证,再次验证密码是否正确
|
|
md5pwd := crypt.StrToMd5(pwd)
|
|
if res.Pwd != md5pwd {
|
|
return data, srvdef.New(srvdef.AccountErrPasswordError, srvdef.AccountErrPasswordError.Msg(), "")
|
|
}
|
|
|
|
// slogin 仅允许角色名含“客服”的账号登录
|
|
if !isCustomerServiceRole(ctx, res) {
|
|
return data, srvdef.New(srvdef.ErrUserPermission, "仅客服角色可登录", "")
|
|
}
|
|
|
|
getToken, err := generateToken(res.Id)
|
|
if err != nil {
|
|
return data, srvdef.New(srvdef.GenerateTokenFailed, srvdef.GenerateTokenFailed.Msg(), "")
|
|
}
|
|
_ = mwacc.UpOneAccByFilter(ctx, bson.M{
|
|
mwacc.FN.MwAcc.Id: res.Id,
|
|
}, bson.M{
|
|
mwacc.FN.MwAcc.LastTime: time.Now(),
|
|
})
|
|
// 更新最近登录时间
|
|
data = res
|
|
data.Token = getToken
|
|
|
|
return data, nil
|
|
}
|
|
|
|
// isCustomerServiceRole 判断账号角色名是否包含“客服”
|
|
func isCustomerServiceRole(ctx context.Context, acc *mwacc.MwAcc) bool {
|
|
if acc == nil {
|
|
return false
|
|
}
|
|
roleName := acc.RoleName
|
|
if roleName == "" && acc.RoleId > 0 {
|
|
role, serr := mwacc.FindOneRoleByFilter(ctx, bson.M{mwacc.FN.MwRole.Id: acc.RoleId})
|
|
if serr == nil && role != nil {
|
|
roleName = role.Name
|
|
}
|
|
}
|
|
return strings.Contains(roleName, "客服")
|
|
}
|
|
|
|
// 账号登录(已取消谷歌验证,密码正确即登录)
|
|
func AccLogin(ctx context.Context, acc string, pwd string) (*mwacc.MwAcc, *srvdef.SrvErr) {
|
|
var data *mwacc.MwAcc
|
|
res, dataErr := mwacc.FindOneAccByFilter(ctx, bson.M{
|
|
mwacc.FN.MwAcc.Acc: acc,
|
|
})
|
|
|
|
if dataErr != nil || res.Id == 0 {
|
|
return data, srvdef.New(srvdef.AccountIsNotExists, srvdef.AccountIsNotExists.Msg(), "")
|
|
}
|
|
|
|
if !res.IsEnb {
|
|
return data, srvdef.New(srvdef.AccountErrAccessForbid, srvdef.AccountErrAccessForbid.Msg(), "")
|
|
}
|
|
|
|
// 通过验证,再次验证密码是否正确
|
|
md5pwd := crypt.StrToMd5(pwd)
|
|
if res.Pwd != md5pwd {
|
|
return data, srvdef.New(srvdef.AccountErrPasswordError, srvdef.AccountErrPasswordError.Msg(), "")
|
|
}
|
|
|
|
getToken, err := generateToken(res.Id)
|
|
if err != nil {
|
|
return data, srvdef.New(srvdef.GenerateTokenFailed, srvdef.GenerateTokenFailed.Msg(), "")
|
|
}
|
|
// 更新最近登录时间
|
|
_ = mwacc.UpOneAccByFilter(ctx, bson.M{
|
|
mwacc.FN.MwAcc.Id: res.Id,
|
|
}, bson.M{
|
|
mwacc.FN.MwAcc.LastTime: time.Now(),
|
|
})
|
|
data = res
|
|
data.Token = getToken
|
|
|
|
return data, nil
|
|
}
|
|
|
|
// 账号登录
|
|
func ProductAccountList(ctx context.Context, accId int64) ([]ProductAccountInfo, *srvdef.SrvErr) {
|
|
resp := make([]ProductAccountInfo, 0)
|
|
accInfo, serr := mwacc.FindOneAccByFilter(ctx, bson.M{
|
|
mwacc.FN.MwAcc.Id: accId,
|
|
})
|
|
if serr != nil {
|
|
log.Error("ProductAccountList FindOneAccByFilter", log.Any("serr", serr))
|
|
return nil, srvdef.New(srvdef.ErrDbQueryError, "", "")
|
|
}
|
|
|
|
if accInfo.RoleId == 1000 {
|
|
resp = append(resp, ProductAccountInfo{
|
|
Id: accInfo.Id,
|
|
Name: accInfo.UserName,
|
|
})
|
|
return resp, nil
|
|
}
|
|
|
|
accList, lerr := mwacc.FindManyAccByFilter(ctx, bson.M{
|
|
mwacc.FN.MwAcc.RoleId: 1000,
|
|
})
|
|
|
|
if lerr != nil {
|
|
log.Error("ProductAccountList FindManyAccByFilter", log.Any("serr", serr))
|
|
return nil, srvdef.New(srvdef.ErrDbQueryError, "", "")
|
|
}
|
|
|
|
for _, v := range accList {
|
|
resp = append(resp, ProductAccountInfo{
|
|
Id: v.Id,
|
|
Name: v.UserName,
|
|
})
|
|
}
|
|
|
|
return resp, nil
|
|
}
|