parent
1615481db2
commit
32a43a5b65
@ -1,138 +1,66 @@
|
||||
package baseCode
|
||||
|
||||
import (
|
||||
"container/list"
|
||||
"errors"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"recook/internal/dbc"
|
||||
"recook/internal/model/user"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 用来生成 邀请码和 升级码
|
||||
var baseStr = "9AB8CD7EF6GH5JK4LM3NP2QRT1WXY"
|
||||
var baseLen = len(baseStr)
|
||||
var base = []byte(baseStr)
|
||||
var baseMap map[byte]int
|
||||
|
||||
const IntroCodeLen = 8
|
||||
const InviteCodeLen = 6
|
||||
const BossCodeLen = 7
|
||||
const (
|
||||
BASE = "E8S2DZX9WYLTN6BQF7CP5IK3MJUAR4HV"
|
||||
DECIMAL = 32
|
||||
PAD = "A"
|
||||
LEN = 8
|
||||
)
|
||||
|
||||
func init() {
|
||||
baseMap = make(map[byte]int)
|
||||
for i, v := range base {
|
||||
baseMap[v] = i
|
||||
}
|
||||
}
|
||||
// id转code
|
||||
|
||||
func New(n, len int) string {
|
||||
quotient := n
|
||||
mod := 0
|
||||
l := list.New()
|
||||
for quotient != 0 {
|
||||
mod = quotient % baseLen
|
||||
quotient = quotient / baseLen
|
||||
l.PushFront(base[mod])
|
||||
func Encode(uid uint64) string {
|
||||
id := uid
|
||||
mod := uint64(0)
|
||||
res := ""
|
||||
for id != 0 {
|
||||
mod = id % DECIMAL
|
||||
id = id / DECIMAL
|
||||
res += string(BASE[mod])
|
||||
}
|
||||
listLen := l.Len()
|
||||
|
||||
if listLen >= len {
|
||||
res := make([]byte, 0, listLen)
|
||||
for i := l.Front(); i != nil; i = i.Next() {
|
||||
res = append(res, i.Value.(byte))
|
||||
resLen := len(res)
|
||||
if resLen < LEN {
|
||||
res += PAD
|
||||
for i := 0; i < LEN-resLen-1; i++ {
|
||||
res += string(BASE[(int(uid)+i)%DECIMAL])
|
||||
}
|
||||
return string(res)
|
||||
} else {
|
||||
res := make([]byte, 0, len)
|
||||
for i := 0; i < len; i++ {
|
||||
if i < len-listLen {
|
||||
res = append(res, base[0])
|
||||
} else {
|
||||
res = append(res, l.Front().Value.(byte))
|
||||
l.Remove(l.Front())
|
||||
}
|
||||
|
||||
}
|
||||
return string(res)
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func ToInt(str string) (int, error) {
|
||||
str = strings.ToUpper(str)
|
||||
if baseMap == nil {
|
||||
return 0, errors.New("no init base map")
|
||||
func Decode(code string) uint64 {
|
||||
res := uint64(0)
|
||||
lenCode := len(code)
|
||||
baseArr := []byte(BASE) // 字符串进制转换为byte数组
|
||||
baseRev := make(map[byte]int) // 进制数据键值转换为map
|
||||
for k, v := range baseArr {
|
||||
baseRev[v] = k
|
||||
}
|
||||
if len(str) == 0 {
|
||||
return 0, errors.New("parameter is nil or empty")
|
||||
// 查找补位字符的位置
|
||||
isPad := strings.Index(code, PAD)
|
||||
if isPad != -1 {
|
||||
lenCode = isPad
|
||||
}
|
||||
var res = 0
|
||||
var r = 0
|
||||
for i := len(str) - 1; i >= 0; i-- {
|
||||
v, ok := baseMap[str[i]]
|
||||
r := 0
|
||||
for i := 0; i < lenCode; i++ {
|
||||
// 补充字符直接跳过
|
||||
if string(code[i]) == PAD {
|
||||
continue
|
||||
}
|
||||
index, ok := baseRev[code[i]]
|
||||
if !ok {
|
||||
return 0, errors.New("character is not base")
|
||||
return 0
|
||||
}
|
||||
var b = 1
|
||||
b := uint64(1)
|
||||
for j := 0; j < r; j++ {
|
||||
b *= baseLen
|
||||
b *= DECIMAL
|
||||
}
|
||||
res += b * v
|
||||
res += uint64(index) * b
|
||||
r++
|
||||
}
|
||||
fmt.Println(res)
|
||||
return res, nil
|
||||
}
|
||||
|
||||
//生成6位随机数字
|
||||
func GetRandomStringForSix() string {
|
||||
str := "0123456789"
|
||||
bytes := []byte(str)
|
||||
result := []byte{}
|
||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||
for i := 0; i < 6; i++ {
|
||||
result = append(result, bytes[r.Intn(len(bytes))])
|
||||
}
|
||||
return string(result)
|
||||
|
||||
}
|
||||
|
||||
func GetRandomString(l int) string {
|
||||
str := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
bytes := []byte(str)
|
||||
result := []byte{}
|
||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||
for i := 0; i < l; i++ {
|
||||
result = append(result, bytes[r.Intn(len(bytes))])
|
||||
}
|
||||
var userInfo user.Information
|
||||
var userTopCode user.TopCode
|
||||
|
||||
//判断位数
|
||||
if l == 6 {
|
||||
dbc.DB.First(&userInfo, "invitation_no=?", string(result))
|
||||
if userInfo.ID > 0 {
|
||||
return GetRandomString(l)
|
||||
} else {
|
||||
return string(result)
|
||||
}
|
||||
} else if l == 8 {
|
||||
dbc.DB.First(&userInfo, "intro_code=?", string(result))
|
||||
if userInfo.ID > 0 {
|
||||
return GetRandomString(l)
|
||||
} else {
|
||||
return string(result)
|
||||
}
|
||||
} else if l == 7 {
|
||||
dbc.DB.First(&userTopCode, "code=?", string(result))
|
||||
if userInfo.ID > 0 {
|
||||
return GetRandomString(l)
|
||||
} else {
|
||||
return string(result)
|
||||
}
|
||||
}
|
||||
return ""
|
||||
|
||||
return res
|
||||
}
|
||||
|
Loading…
Reference in new issue