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") 配置以增强写入安全性
- 调整部分代码结构与调用方式以适配新版框架行为
```
113 lines
2.9 KiB
Go
113 lines
2.9 KiB
Go
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
|
||
|
||
}
|