127 lines
2.9 KiB
Go
127 lines
2.9 KiB
Go
// 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
|
||
}
|