|
- package svc
-
- import (
- "applet/app/db"
- "applet/app/e"
- "applet/app/md"
- "applet/app/utils"
- "fmt"
- "github.com/gin-gonic/gin"
- "math/rand"
- "unicode"
- )
-
- // 检测获取邀请码
- func UserInviteCode(c *gin.Context, user *md.User) string {
- //已经有邀请码了就中断
- if user.Profile.InviteCode != "" {
- return user.Profile.InviteCode
- }
- var code string
- //读取后台配置判断是数字还是 数字+字母
- inviteData := db.SysCfgFind(c, "app_invite_length", "app_invite_type")
- l := utils.StrToInt(inviteData["app_invite_length"])
- types := utils.StrToInt(inviteData["app_invite_type"])
- ////匹配最新的用户的邀请码长度
- //newUser, _ := db.UserProfileOrderByNew(db.DBs[c.GetString("mid")])
- //if newUser.InviteCode != "" {
- // l = len(newUser.InviteCode)
- //}
- //读取code
- code = returnCode(c, l, types, 0)
- //查询用户信息
- userProfile, err := db.UserProfileFindByID(db.DBs[c.GetString("mid")], user.Info.Uid)
- if err != nil {
- e.OutErr(c, e.ERR_DB_ORM, err)
- return ""
- }
- //写入code
- userProfile.InviteCode = code
- fmt.Println(userProfile)
- db.UserProfileUpdate(db.DBs[c.GetString("mid")], user.Info.Uid, userProfile)
- return code
- }
- func returnCode(c *gin.Context, l, types, num int) string {
- if num > 5 {
- return ""
- }
- //循环3次判断是否存在该邀请码
- var code string
- var (
- codes []string
- )
- for i := 0; i < 3; i++ {
- oneCode := GetRandomString(l, types)
- codes = append(codes, oneCode)
- }
-
- //判断是不是存在邀请码了
- tmp, _ := db.UserProfileFindByInviteCodes(db.DBs[c.GetString("mid")], codes...)
- //判断自定义是不是存在邀请码了
- customTmp, _ := db.UserProfileFindByCustomInviteCodes(db.DBs[c.GetString("mid")], codes...)
- //循环生成的邀请码 判断tmp里有没有这个邀请码 如果邀请码没有就赋值 再判断是否存在 存在就清空
- for _, v := range codes {
- if code != "" { //如果存在并且数据库没有就跳过
- continue
- }
- code = v
- for _, v1 := range *tmp {
- //如果存在就清空
- if v1.InviteCode == v {
- code = ""
- }
- }
- for _, v1 := range *customTmp {
- //如果存在就清空
- if v1.CustomInviteCode == v {
- code = ""
- }
- }
- }
- //如果都没有就继续加一位继续查
- if code == "" {
- return returnCode(c, l+1, types, num+1)
- }
- return code
- }
-
- // 随机生成指定位数的大写字母和数字的组合
- func GetRandomString(l, isLetter int) string {
- str := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- if isLetter != 1 {
- str = "0123456789"
- }
- strs := []rune(str)
- result := make([]rune, l)
- for i := range result {
- result[i] = strs[rand.Intn(len(strs))]
- }
- fmt.Println(result)
- if IsLetter(string(result)) && isLetter == 1 {
- return GetRandomString(l, isLetter)
- }
- return string(result)
- }
- func IsLetter(s string) bool {
- for _, r := range s {
- if !unicode.IsLetter(r) {
- return false
- }
- }
- return true
- }
|