refactor: 重构后端架构为 go-zero 框架,优化项目结构
主要变更: - 采用 go-zero 框架替代 Gin,提升开发效率 - 重构项目结构,API 文件模块化组织 - 将 model 移至 api/internal/model 目录 - 移除 common 包,改为标准 pkg 目录结构 - 实现统一的仓储模式,支持配置驱动数据库切换 - 简化测试策略,专注 API 集成测试 - 更新 CLAUDE.md 文档,提供详细的开发指导 技术栈更新: - 框架: Gin → go-zero v1.6.0+ - 代码生成: 引入 goctl 工具 - 架构模式: 四层架构 → go-zero 三层架构 (Handler→Logic→Model) - 项目布局: 遵循 Go 社区标准和 go-zero 最佳实践
This commit is contained in:
77
backend/internal/utils/random.go
Normal file
77
backend/internal/utils/random.go
Normal file
@ -0,0 +1,77 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"encoding/base64"
|
||||
"math/big"
|
||||
"time"
|
||||
)
|
||||
|
||||
const (
|
||||
// 字符集
|
||||
alphanumeric = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||
letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
numbers = "0123456789"
|
||||
)
|
||||
|
||||
// GenerateRandomString 生成指定长度的随机字符串
|
||||
func GenerateRandomString(length int) string {
|
||||
return generateRandomFromCharset(length, alphanumeric)
|
||||
}
|
||||
|
||||
// GenerateRandomLetters 生成指定长度的随机字母字符串
|
||||
func GenerateRandomLetters(length int) string {
|
||||
return generateRandomFromCharset(length, letters)
|
||||
}
|
||||
|
||||
// GenerateRandomNumbers 生成指定长度的随机数字字符串
|
||||
func GenerateRandomNumbers(length int) string {
|
||||
return generateRandomFromCharset(length, numbers)
|
||||
}
|
||||
|
||||
// generateRandomFromCharset 从指定字符集生成随机字符串
|
||||
func generateRandomFromCharset(length int, charset string) string {
|
||||
result := make([]byte, length)
|
||||
charsetLen := big.NewInt(int64(len(charset)))
|
||||
|
||||
for i := 0; i < length; i++ {
|
||||
randomIndex, err := rand.Int(rand.Reader, charsetLen)
|
||||
if err != nil {
|
||||
// 如果加密随机数生成失败,回退到时间种子
|
||||
return generateRandomFallback(length, charset)
|
||||
}
|
||||
result[i] = charset[randomIndex.Int64()]
|
||||
}
|
||||
|
||||
return string(result)
|
||||
}
|
||||
|
||||
// generateRandomFallback 回退的随机生成方法
|
||||
func generateRandomFallback(length int, charset string) string {
|
||||
// 使用时间作为种子的简单随机生成
|
||||
seed := time.Now().UnixNano()
|
||||
result := make([]byte, length)
|
||||
|
||||
for i := 0; i < length; i++ {
|
||||
seed = seed*1103515245 + 12345
|
||||
result[i] = charset[(seed/65536)%int64(len(charset))]
|
||||
}
|
||||
|
||||
return string(result)
|
||||
}
|
||||
|
||||
// GenerateSecureToken 生成安全令牌
|
||||
func GenerateSecureToken(length int) (string, error) {
|
||||
bytes := make([]byte, length)
|
||||
if _, err := rand.Read(bytes); err != nil {
|
||||
return "", err
|
||||
}
|
||||
return base64.URLEncoding.EncodeToString(bytes), nil
|
||||
}
|
||||
|
||||
// GenerateID 生成唯一ID
|
||||
func GenerateID() string {
|
||||
timestamp := time.Now().UnixNano()
|
||||
random := GenerateRandomString(8)
|
||||
return base64.URLEncoding.EncodeToString([]byte(string(timestamp) + random))[:16]
|
||||
}
|
||||
Reference in New Issue
Block a user