first commit
This commit is contained in:
126
utils/generator_util.go
Normal file
126
utils/generator_util.go
Normal file
@@ -0,0 +1,126 @@
|
||||
// Package utils generator_util.go
|
||||
package utils
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// GenerateUserCode 生成指定前缀 + 指定长度随机数字的编码
|
||||
// prefix: 字符串前缀,如 "S", "U" 等
|
||||
// length: 数字部分长度,默认为 9 位
|
||||
// 返回带前缀的 usercode,例如 S123456789
|
||||
func GenerateUserCode(prefix string, length int) string {
|
||||
// 设置随机种子
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
|
||||
// 计算数字范围
|
||||
mini := 1
|
||||
maxi := 9
|
||||
for i := 1; i < length; i++ {
|
||||
mini *= 10
|
||||
maxi = maxi*10 + 9
|
||||
}
|
||||
|
||||
// 生成随机数
|
||||
randomNum := rand.Intn(maxi-mini+1) + mini
|
||||
return fmt.Sprintf("%s%d", prefix, randomNum)
|
||||
}
|
||||
|
||||
// GenerateEmail 生成随机电子邮箱地址
|
||||
// domain: 邮箱域名,默认为 "example.com"
|
||||
// usernameLength: 用户名部分长度,默认为 8 位
|
||||
// 返回随机邮箱地址,如 "a1b2c3d4@example.com"
|
||||
func GenerateEmail(domain string, usernameLength int) (string, error) {
|
||||
// 设置随机种子
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
|
||||
// 如果域名为空,使用默认域名
|
||||
if domain == "" {
|
||||
domain = "example.com"
|
||||
}
|
||||
|
||||
// 如果用户名长度小于1,使用默认长度
|
||||
if usernameLength < 1 {
|
||||
usernameLength = 8
|
||||
}
|
||||
|
||||
// 定义字符集(小写字母和数字)
|
||||
charset := "abcdefghijklmnopqrstuvwxyz0123456789"
|
||||
|
||||
// 最多重试 5 次
|
||||
for i := 0; i < 5; i++ {
|
||||
// 生成指定长度的用户名
|
||||
username := make([]byte, usernameLength)
|
||||
for j := range username {
|
||||
username[j] = charset[rand.Intn(len(charset))]
|
||||
}
|
||||
|
||||
email := fmt.Sprintf("%s@%s", string(username), domain)
|
||||
|
||||
// 检查邮箱有效性
|
||||
if isValidEmail(email) {
|
||||
return email, nil
|
||||
}
|
||||
}
|
||||
|
||||
return "", fmt.Errorf("无法生成有效邮箱地址,请调整参数")
|
||||
}
|
||||
|
||||
// isValidEmail 简单验证邮箱地址有效性
|
||||
func isValidEmail(email string) bool {
|
||||
parts := strings.Split(email, "@")
|
||||
if len(parts) != 2 {
|
||||
return false
|
||||
}
|
||||
|
||||
username := parts[0]
|
||||
domain := parts[1]
|
||||
|
||||
// 检查用户名和域名是否非空
|
||||
if username == "" || domain == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
// 检查域名是否包含点
|
||||
if !strings.Contains(domain, ".") {
|
||||
return false
|
||||
}
|
||||
|
||||
// 检查域名的点是否在正确位置
|
||||
domainParts := strings.Split(domain, ".")
|
||||
for _, part := range domainParts {
|
||||
if part == "" {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// GenerateUsername 生成全英文随机用户名
|
||||
// length: 用户名长度,默认为 8
|
||||
// 返回全小写英文用户名,例如 "abcdefgh"
|
||||
// 如果长度参数无效会返回错误
|
||||
func GenerateUsername(length int) (string, error) {
|
||||
// 设置随机种子
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
|
||||
// 验证长度参数
|
||||
if length < 4 || length > 20 {
|
||||
return "", fmt.Errorf("用户名长度需在4-20个字符之间")
|
||||
}
|
||||
|
||||
// 定义字符集(仅小写字母)
|
||||
charset := "abcdefghijklmnopqrstuvwxyz"
|
||||
|
||||
// 生成指定长度的用户名
|
||||
username := make([]byte, length)
|
||||
for i := range username {
|
||||
username[i] = charset[rand.Intn(len(charset))]
|
||||
}
|
||||
|
||||
return string(username), nil
|
||||
}
|
||||
Reference in New Issue
Block a user