refactor: reorganize modules and add Linux build tooling
This commit is contained in:
172
module/base/passport/internal/models/cache.go
Normal file
172
module/base/passport/internal/models/cache.go
Normal file
@@ -0,0 +1,172 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user