package util import ( "crypto/rand" "strings" ) // codeAlphabet 兑换码字母表:剔除易混字符 0/O/1/I/L,避免人工抄录歧义。 const codeAlphabet = "23456789ABCDEFGHJKMNPQRSTUVWXYZ" // codePrefix 兑换码固定前缀,便于一眼识别归属。 const codePrefix = "JIUKU" // GenerateRedeemCode 生成一个随机兑换码,展示格式 JIUKU-XXXX-XXXX(8 位随机段)。 // 使用 crypto/rand + 无歧义字母表;归一化(NormalizeCode)后入库与比对。 func GenerateRedeemCode() string { const n = 8 buf := make([]byte, n) if _, err := rand.Read(buf); err != nil { // crypto/rand 失败属系统级异常,调用方(CLI 生码)应直接失败而非产出弱码。 panic("crypto/rand failed: " + err.Error()) } out := make([]byte, n) for i, b := range buf { out[i] = codeAlphabet[int(b)%len(codeAlphabet)] } return codePrefix + "-" + string(out[:4]) + "-" + string(out[4:]) } // NormalizeCode 归一化兑换码:转大写、去掉连字符/空格,得到入库与查表用的规范形式。 func NormalizeCode(code string) string { var b strings.Builder for _, r := range strings.ToUpper(code) { if r == '-' || r == ' ' || r == '\t' || r == '\n' || r == '\r' { continue } b.WriteRune(r) } return b.String() }