Files
bl/modules/blazing/service/login.go
昔念 a95e6b8491 ```
feat(common): 升级 gf 框架版本至 v2.8.0 并优化模型时间字段

- 将 `github.com/gogf/gf/contrib/drivers/pgsql/v2` 和 redis 依赖从 v2.6.3 升级到 v2.8.0
- 使用 `*gtime.Time` 替代标准库 `time.Time` 以支持更灵活的时间处理
- 移除 Model 结构体中 CreateTime、UpdateTime 等字段的默认初始化逻辑
- 注释掉已弃用的 GDBM 函数,推荐使用 DBM
- 在 DBM 中添加 OnConflict("id") 配置以增强写入安全性
- 调整部分代码结构与调用方式以适配新版框架行为
```
2025-11-17 12:59:46 +08:00

113 lines
2.9 KiB
Go
Raw 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 service
import (
"blazing/cool"
"blazing/modules/blazing/model"
"encoding/binary"
"encoding/hex"
"math/rand"
"strings"
"github.com/google/uuid"
)
type LoginService struct {
*cool.Service
}
func NewLoginServiceService() *LoginService {
return &LoginService{
&cool.Service{
Model: model.NewServerList(),
},
}
}
// 生成session
// GetSessionId 生成并返回会话ID、UUID字符串及可能的错误
// 会话ID由accountID(4字节) + UUID(16字节) + 随机数(4字节)组成,最终编码为十六进制字符串
func (s *LoginService) GetSessionId(accountID uint) (string, string, error) {
// 生成UUID v7带错误处理UUID生成失败时返回错误
uuidV7, err := uuid.NewV7()
if err != nil {
return "", "", err
}
// 移除UUID中的连字符便于后续处理
uuidStr := strings.ReplaceAll(uuidV7.String(), "-", "")
// 解码UUID字符串为字节数组32位十六进制字符串对应16字节
uuidBytes, err := hex.DecodeString(uuidStr)
if err != nil {
// 理论上UUID生成的字符串不会出现解码错误此处为防御性处理
return "", "", err
}
// 生成4字节安全随机数使用crypto/rand提高随机性适合会话ID场景
randomBytes := make([]byte, 4)
if _, err := rand.Read(randomBytes); err != nil {
return "", "", err
}
// 将accountID转换为4字节大端序字节数组
accountBytes := make([]byte, 4)
binary.BigEndian.PutUint32(accountBytes, uint32(accountID))
// 预分配缓冲区总长度4+16+4=24字节减少内存分配
sessionBytes := make([]byte, 0, 24)
sessionBytes = append(sessionBytes, accountBytes...)
sessionBytes = append(sessionBytes, uuidBytes...)
sessionBytes = append(sessionBytes, randomBytes...)
// 编码为十六进制字符串作为最终会话ID
sessionID := hex.EncodeToString(sessionBytes)
return sessionID, uuidStr, nil
}
func (s *LoginService) SetServerID(OnlineID uint16, Port uint16) error {
m := cool.DBM(s.Model).Where("online_id", OnlineID)
// record, err := m.One()
// if err != nil {
// return err
// }
// if record == nil {
// //说明是新的服务器
// _, err := m.InsertAndGetId(&model.ServerList{OnlineID: OnlineID, Port: Port})
// return err
// }
var tttt model.ServerList
m.Scan(&tttt)
tttt.Port = Port
tttt.OnlineID = OnlineID
m.Save(tttt)
return nil
}
func (s *LoginService) GetServerID(OnlineID uint16) (uint16, error) {
var tttt model.ServerList
err := cool.DBM(s.Model).Where("online_id", OnlineID).Scan(&tttt)
if err != nil {
return 0, err
}
// record, err := m.One()
// if err != nil {
// return 0, err
// }
// if record == nil {
// //说明是新的服务器
// return 0, fmt.Errorf("未找到服务器")
// }
// var tttt model.ServerList
// record.Struct(&tttt)
return tttt.Port, nil
}