优化用户模型和模块租户检查逻辑,新增NATS消息配置和MongoDB缓存控制

This commit is contained in:
2026-01-21 16:33:37 +08:00
committed by 张斌
parent f0e6bdd37c
commit b303c1bfaa
16 changed files with 1954 additions and 497 deletions

View File

@@ -66,8 +66,18 @@ func GetMonthToday(t time.Time, month int) time.Time {
}
func GetUserInfo(ctx context.Context) (user beans.User, err error) {
r := g.RequestFromCtx(ctx)
if r != nil {
// 检查context是否已取消
select {
case <-ctx.Done():
return user, ctx.Err()
default:
}
if !g.IsNil(ctx.Value("id")) || !g.IsNil(ctx.Value("userName")) || !g.IsNil(ctx.Value("tenantId")) {
user.UserId = ctx.Value("id")
user.UserName = ctx.Value("userName")
user.TenantId = ctx.Value("tenantId")
} else {
redisAddr := g.Cfg().MustGet(ctx, "redis.default.address").String()
gft := gftoken.NewGfToken(
gftoken.WithCacheKey("gfToken:"),
@@ -79,34 +89,47 @@ func GetUserInfo(ctx context.Context) (user beans.User, err error) {
Address: redisAddr,
Db: 1,
}))
// 解析 token
data, err := gft.ParseToken(g.RequestFromCtx(ctx))
if err != nil {
return user, gerror.Wrap(err, "token 解析失败")
var data *gftoken.CustomClaims
if !g.IsNil(ctx.Value("token")) {
var tokenData *gftoken.TokenData
tokenData, _, err = gft.GetTokenData(ctx, ctx.Value("token").(string))
if err != nil {
return user, gerror.Wrap(err, "token 解析失败")
}
var code int
if data, code = gft.IsNotExpired(tokenData.JwtToken); code != gftoken.JwtTokenOK {
return user, gerror.New("token jwt 解析失败")
}
} else if g.RequestFromCtx(ctx) != nil {
// 解析 token
data, err = gft.ParseToken(g.RequestFromCtx(ctx))
if err != nil {
return user, gerror.Wrap(err, "token 解析失败")
}
}
// 检查 data 是否为 nil
if data == nil {
return user, gerror.New("token 数据为空")
}
// 检查 data.Data 是否为 nil
if data.Data == nil {
g.Log().Errorf(ctx, "data.Data 为空")
return user, gerror.New("用户信息为空")
}
dataMap := gconv.Map(data.Data)
user.UserId = dataMap["id"]
user.UserName = dataMap["userName"]
user.TenantId = dataMap["tenantId"]
} else {
user.TenantId = ctx.Value("tenantId")
user.UserName = ctx.Value("userName")
}
if user.TenantId == nil {
if g.IsNil(user.UserId) && g.IsNil(user.UserName) && g.IsNil(user.TenantId) {
return user, gerror.New("租户信息为空")
}
return
}
func SetValue(ctx context.Context, result any, key string, value any) {
// 检查context是否已取消
select {
@@ -207,6 +230,13 @@ func FormatUnixTime(timestamp int64) string {
// ParseDurationWithDefault 解析持续时间,失败时使用默认值 - 通用时间处理工具
func ParseDurationWithDefault(ctx context.Context, durationStr, defaultStr, fieldName string) (time.Duration, string) {
// 检查context是否已取消
select {
case <-ctx.Done():
return 0, ""
default:
}
durationParsed, err := time.ParseDuration(durationStr)
if err != nil {
// 这里不能直接使用g.Log()因为这是utils包没有直接的日志访问
@@ -303,7 +333,7 @@ func Struct(params any, pointer any) error {
if err != nil {
return err
}
err = json.Unmarshal(b, &pointer)
err = json.Unmarshal(b, pointer)
if err != nil {
return err
}