Files
web_huakui_server/web/service/srv_mwacc/login.go
T
rootandClaude Opus 4.7 e7179da072 feat: 同步 huangguo2-server 的 11 个非基线提交
按意图重做在 huakui 代码底:
- 删除数据埋点逻辑:移除 pub/dataReport、reportser、srv_report、
  eventmod、上报定时任务及注册/登录/点赞/收藏/评论/解锁/订单处的
  上报调用和 reportSdkConfig 配置下发
- app 认证改为按设备ID识别用户:去掉 token 校验、Register/Login/
  ResetPassword/GuestLogin 接口,新增 ResolveDeviceUser 和设备缓存
- 广告改为按 AppId 从媒资中心拉取:pub/storage 新增 QueryAdvitise,
  UpdateAdvitiseData 替代 UpdateAdvitiseDataFromJt
- 后台登录取消谷歌二次验证,密码正确即登录
- 短剧/专题 slug 改为 10 位大小写字母+数字混合
- 本地 app.yaml/web.yaml 保留 HKDJNET_* 模板(不提交生产凭据)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-10-16 12:59:14 +08:00

151 lines
4.1 KiB
Go

package srv_mwacc
import (
"context"
"hkdj-web-server/pub/common/crypt"
"hkdj-web-server/pub/common/enum/consts"
"hkdj-web-server/pub/common/log"
"hkdj-web-server/pub/common/srvdef"
"hkdj-web-server/pub/common/utils"
"hkdj-web-server/pub/models/mwacc"
"hkdj-web-server/web/webg"
"strings"
"time"
"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, "客服")
}
// AccLogin 账号登录(已取消谷歌验证,密码正确即登录)
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
}