Files
bl/common/data/share/user.go
xinian 47bc680889
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
refactor: 将端口和在线ID类型从uint16改为uint32
2026-03-02 18:34:20 +08:00

110 lines
3.3 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package share
import (
"context"
"time"
"blazing/cool"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/util/gconv"
"github.com/gogf/gf/v2/util/grand"
)
// newSessionStore 创建会话缓存实例
func newSessionStore() *cacheStore[uint32] {
return &cacheStore[uint32]{
manager: cool.CacheManager,
prefix: "blazing:session:",
}
}
// newUserOnlineStore 创建用户在线状态缓存实例
func newUserOnlineStore() *cacheStore[uint32] {
return &cacheStore[uint32]{
manager: cool.CacheManager,
prefix: "blazing:useronline:",
}
}
// newEmailCodeStore 创建邮件注册码缓存实例
func newEmailCodeStore() *cacheStore[int] {
return &cacheStore[int]{
manager: cool.CacheManager,
prefix: "blazing:email:code:",
}
}
// sessionManager 会话管理器
type sessionManager struct {
sessionStore *cacheStore[uint32] // 会话缓存
userOnlineStore *cacheStore[uint32] // 用户在线状态缓存
emailCodeStore *cacheStore[int] // 邮件注册码缓存
}
// newSessionManager 创建会话管理器
func newSessionManager() *sessionManager {
return &sessionManager{
sessionStore: newSessionStore(),
userOnlineStore: newUserOnlineStore(),
emailCodeStore: newEmailCodeStore(),
}
}
// SetUserOnline 设置用户在线状态
func (m *sessionManager) SetUserOnline(userID uint32, serverID uint32) error {
return m.userOnlineStore.Set(gctx.New(), gconv.String(userID), serverID, 0)
}
// GetUserOnline 获取用户在线状态
func (m *sessionManager) GetUserOnline(userID uint32) (uint32, error) {
return m.userOnlineStore.Get(context.Background(), gconv.String(userID))
}
// DeleteUserOnline 删除用户在线状态
func (m *sessionManager) DeleteUserOnline(userID uint32) error {
return m.userOnlineStore.Del(gctx.New(), gconv.String(userID))
}
// UserOnlineExists 检查用户在线状态是否存在
func (m *sessionManager) UserOnlineExists(userID uint32) (bool, error) {
return m.userOnlineStore.Contains(context.Background(), gconv.String(userID))
}
// generate6DigitCode 生成6位数字注册码100000-999999
func (m *sessionManager) generate6DigitCode() int {
// 初始化随机数生成器(确保每次调用生成不同序列)
return grand.Intn(900000) + 100000
}
// SaveEmailCode 生成并保存邮件注册码(返回生成的验证码,支持设置过期时间)
func (m *sessionManager) SaveEmailCode(email string, expire time.Duration) (int, error) {
code := m.generate6DigitCode()
return code, m.emailCodeStore.Set(gctx.New(), email, code, expire)
}
// GetEmailCode 获取指定邮箱的注册码
func (m *sessionManager) GetEmailCode(email string) (int, error) {
return m.emailCodeStore.Get(context.Background(), email)
}
// DeleteEmailCode 删除指定邮箱的注册码(验证成功后调用)
func (m *sessionManager) DeleteEmailCode(email string) error {
return m.emailCodeStore.Del(gctx.New(), email)
}
// EmailCodeExists 检查指定邮箱是否存在有效的注册码
func (m *sessionManager) EmailCodeExists(email string) (bool, error) {
return m.emailCodeStore.Contains(context.Background(), email)
}
// VerifyEmailCode 验证用户输入的注册码是否正确
func (m *sessionManager) VerifyEmailCode(email string, inputCode int) (bool, error) {
storedCode, err := m.GetEmailCode(email)
if err != nil {
return false, err
}
return storedCode == inputCode, nil
}