Files

173 lines
5.0 KiB
Go
Raw Permalink Normal View History

package models
import (
"context"
"time"
"bsm/full/module/base/passport/internal/impl"
)
var (
// 默认缓存TTL
DefaultTTL = 30 * time.Minute
// 用户信息缓存TTL
UserCacheTTL = 1 * time.Hour
// Token缓存TTL
TokenCacheTTL = 24 * time.Hour
)
// GetAccountByCache 通过缓存获取账户信息
func GetAccountByCache(ctx context.Context, field, value string) (*PassportAccount, error) {
var account *PassportAccount
key := impl.RedisService.BuildKey("account", field, value)
// 尝试从缓存获取
err := impl.RedisService.Get(key, &account)
if err == nil && account != nil {
return account, nil
}
// 缓存未命中,从数据库获取
account, err = GetPassportAccountByField(field, value)
if err != nil {
return nil, err
}
// 存入缓存
err = impl.RedisService.Set(key, account, UserCacheTTL)
return account, err
}
// GetUserDataByCache 通过缓存获取用户扩展数据
func GetUserDataByCache(ctx context.Context, passportID uint) (*PassportData, error) {
var data *PassportData
key := impl.RedisService.BuildKey("userdata", passportID)
// 尝试从缓存获取
err := impl.RedisService.Get(key, &data)
if err == nil && data != nil {
return data, nil
}
// 缓存未命中,从数据库获取
err = impl.DBService.Where("passport_id = ?", passportID).First(&data).Error
if err != nil {
return nil, err
}
// 存入缓存
err = impl.RedisService.Set(key, data, UserCacheTTL)
return data, err
}
// GetUserTagsByCache 通过缓存获取用户标签
func GetUserTagsByCache(ctx context.Context, passportID uint) ([]*PassportTags, error) {
var tags []*PassportTags
key := impl.RedisService.BuildKey("usertags", passportID)
// 尝试从缓存获取
err := impl.RedisService.Get(key, &tags)
if err == nil && tags != nil {
return tags, nil
}
// 缓存未命中,从数据库获取
err = impl.DBService.Where("passport_id = ?", passportID).Find(&tags).Error
if err != nil {
return nil, err
}
// 存入缓存
err = impl.RedisService.Set(key, tags, DefaultTTL)
return tags, err
}
// InvalidateUserCache 清除用户相关缓存
func InvalidateUserCache(ctx context.Context, passportID uint, identity string) error {
keys := []string{
impl.RedisService.BuildKey("account", "id", passportID),
impl.RedisService.BuildKey("account", "identity", identity),
impl.RedisService.BuildKey("userdata", passportID),
impl.RedisService.BuildKey("usertags", passportID),
}
for _, key := range keys {
impl.RedisService.Client.Del(impl.RedisService.Ctx, key)
}
return nil
}
// SetTokenCache 设置Token缓存
func SetTokenCache(ctx context.Context, identity, token string) error {
key := impl.RedisService.BuildKey("token", identity)
return impl.RedisService.Set(key, token, TokenCacheTTL)
}
// GetTokenCache 获取Token缓存
func GetTokenCache(ctx context.Context, identity string) (string, error) {
var token string
key := impl.RedisService.BuildKey("token", identity)
err := impl.RedisService.Get(key, &token)
return token, err
}
// InvalidateTokenCache 清除Token缓存
func InvalidateTokenCache(ctx context.Context, identity string) error {
key := impl.RedisService.BuildKey("token", identity)
return impl.RedisService.Client.Del(impl.RedisService.Ctx, key).Err()
}
// SetVerificationCodeCache 设置验证码缓存
func SetVerificationCodeCache(ctx context.Context, phone, code string, ttl time.Duration) error {
key := impl.RedisService.BuildKey("verifycode", phone)
return impl.RedisService.Set(key, code, ttl)
}
// GetVerificationCodeCache 获取验证码缓存
func GetVerificationCodeCache(ctx context.Context, phone string) (string, error) {
var code string
key := impl.RedisService.BuildKey("verifycode", phone)
err := impl.RedisService.Get(key, &code)
return code, err
}
// InvalidateVerificationCodeCache 清除验证码缓存
func InvalidateVerificationCodeCache(ctx context.Context, phone string) error {
key := impl.RedisService.BuildKey("verifycode", phone)
return impl.RedisService.Client.Del(impl.RedisService.Ctx, key).Err()
}
// IncrementLoginAttempts 增加登录尝试次数
func IncrementLoginAttempts(ctx context.Context, account string) (int64, error) {
key := impl.RedisService.BuildKey("loginattempts", account)
result := impl.RedisService.Client.Incr(impl.RedisService.Ctx, key)
if result.Err() != nil {
return 0, result.Err()
}
// 设置过期时间15分钟
impl.RedisService.Client.Expire(impl.RedisService.Ctx, key, 15*time.Minute)
return result.Val(), nil
}
// GetLoginAttempts 获取登录尝试次数
func GetLoginAttempts(ctx context.Context, account string) (int64, error) {
key := impl.RedisService.BuildKey("loginattempts", account)
result := impl.RedisService.Client.Get(impl.RedisService.Ctx, key)
if result.Err() != nil {
return 0, nil // 如果key不存在返回0
}
return result.Int64()
}
// ClearLoginAttempts 清除登录尝试次数
func ClearLoginAttempts(ctx context.Context, account string) error {
key := impl.RedisService.BuildKey("loginattempts", account)
return impl.RedisService.Client.Del(impl.RedisService.Ctx, key).Err()
}