feat(base): 添加邮箱注册码功能及用户注册接口

- 在 `sessionManager` 中新增邮件注册码缓存管理实例和相关方法
- 实现生成、保存、验证、删除邮件注册码的逻辑
- 新增 `/reg` 和 `/email` 接口用于用户注册和发送验证码
- 引入 `golang-lru` 依赖以支持限流缓存功能
- 调整包导入顺序,优化代码结构
```
This commit is contained in:
2025-11-04 11:44:07 +08:00
parent 689e7c51e2
commit 699db8406b
34 changed files with 4450 additions and 4 deletions

View File

@@ -1,10 +1,12 @@
package share
import (
"blazing/cool"
"context"
"math/rand"
"time"
"blazing/cool"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/util/gconv"
)
@@ -25,10 +27,19 @@ func newUserOnlineStore() *cacheStore[uint16] {
}
}
// newEmailCodeStore 创建邮件注册码缓存实例
func newEmailCodeStore() *cacheStore[int] {
return &cacheStore[int]{
manager: cool.CacheManager,
prefix: "blazing:email:code:",
}
}
// sessionManager 会话管理器
type sessionManager struct {
sessionStore *cacheStore[uint32] // 会话缓存
userOnlineStore *cacheStore[uint16] // 用户在线状态缓存
emailCodeStore *cacheStore[int] // 邮件注册码缓存
}
// newSessionManager 创建会话管理器
@@ -36,6 +47,7 @@ func newSessionManager() *sessionManager {
return &sessionManager{
sessionStore: newSessionStore(),
userOnlineStore: newUserOnlineStore(),
emailCodeStore: newEmailCodeStore(),
}
}
@@ -78,3 +90,40 @@ func (m *sessionManager) DeleteUserOnline(userID uint32) error {
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 {
// 初始化随机数生成器(确保每次调用生成不同序列)
r := rand.New(rand.NewSource(time.Now().UnixNano()))
return r.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
}