user_gen.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package utils
  2. import (
  3. "crypto/rand"
  4. "math/big"
  5. "regexp"
  6. "strings"
  7. "github.com/mozillazg/go-pinyin"
  8. )
  9. // GenerateUsername 根据姓名生成拼音用户名
  10. // 规则:取每个汉字的首字母小写,如果是英文则直接转小写
  11. // 例如:刘强 -> lq (这里用户要求是 liuq,需要全拼还是首字母?)
  12. // 用户需求:刘强 -> liuq。看起来是第一个字全拼 + 后面的字首字母?或者全拼?
  13. // 再次确认用户需求:"比如姓名叫刘强,用户名叫liuq" -> liu (刘) q (强)。
  14. // 所以规则应该是:姓的全拼 + 名的首字母。
  15. func GenerateUsernameBase(name string) string {
  16. a := pinyin.NewArgs()
  17. // 包含声调
  18. // a.Style = pinyin.Tone
  19. // 不包含声调,只取拼音
  20. a.Style = pinyin.Normal
  21. // 简单的处理逻辑:
  22. // 如果是纯英文,直接转小写并去空格
  23. if isEnglishName(name) {
  24. return strings.ToLower(strings.ReplaceAll(name, " ", ""))
  25. }
  26. rows := pinyin.Pinyin(name, a)
  27. if len(rows) == 0 {
  28. // 无法转换,返回随机字符串或原名处理
  29. return "user" + GenerateRandomString(4)
  30. }
  31. var sb strings.Builder
  32. // 姓:取全拼 (rows[0])
  33. if len(rows) > 0 && len(rows[0]) > 0 {
  34. sb.WriteString(rows[0][0])
  35. }
  36. // 名:取首字母 (rows[1:]...)
  37. for i := 1; i < len(rows); i++ {
  38. if len(rows[i]) > 0 {
  39. // 取拼音的第一个字母
  40. str := rows[i][0]
  41. if len(str) > 0 {
  42. sb.WriteString(string(str[0]))
  43. }
  44. }
  45. }
  46. return sb.String()
  47. }
  48. func isEnglishName(name string) bool {
  49. match, _ := regexp.MatchString(`^[a-zA-Z\s]+$`, name)
  50. return match
  51. }
  52. // GenerateRandomPassword 生成随机强密码
  53. // 长度至少10位,包含大小写字母、数字、特殊字符
  54. func GenerateRandomPassword() string {
  55. const (
  56. upperLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  57. lowerLetters = "abcdefghijklmnopqrstuvwxyz"
  58. digits = "0123456789"
  59. specialChars = "!@#$%^&*()_+-=[]{}|;:,.<>?"
  60. )
  61. length := 12
  62. ret := make([]byte, length)
  63. // 保证每种类型至少有一个
  64. ret[0] = upperLetters[randInt(len(upperLetters))]
  65. ret[1] = lowerLetters[randInt(len(lowerLetters))]
  66. ret[2] = digits[randInt(len(digits))]
  67. ret[3] = specialChars[randInt(len(specialChars))]
  68. allChars := upperLetters + lowerLetters + digits + specialChars
  69. for i := 4; i < length; i++ {
  70. ret[i] = allChars[randInt(len(allChars))]
  71. }
  72. // Shuffle
  73. // ... (shuffle implementation optional but good)
  74. return string(ret)
  75. }
  76. func randInt(max int) int {
  77. n, _ := rand.Int(rand.Reader, big.NewInt(int64(max)))
  78. return int(n.Int64())
  79. }
  80. func GenerateRandomString(n int) string {
  81. const letters = "abcdefghijklmnopqrstuvwxyz0123456789"
  82. ret := make([]byte, n)
  83. for i := 0; i < n; i++ {
  84. num, _ := rand.Int(rand.Reader, big.NewInt(int64(len(letters))))
  85. ret[i] = letters[num.Int64()]
  86. }
  87. return string(ret)
  88. }