fix: invitation

master
howell 4 years ago
parent 1615481db2
commit 32a43a5b65

@ -22,7 +22,7 @@ type getCodeListPem struct {
Uid uint `json:"uid"`
}
// 平台boss获取二维码
// GetQrcodeTop 平台boss获取二维码
func GetQrcodeTop(c *gin.Context) {
var p getQrcodePem
err := tools.ParseParams(&p, c)
@ -50,7 +50,7 @@ func GetQrcodeTop(c *gin.Context) {
}
var userTopCode = user.TopCode{}
//这边创建一个码
newCode := baseCode.GetRandomString(baseCode.BossCodeLen)
newCode := baseCode.Encode(uint64(p.Uid))
userTopCode.Code = newCode
userTopCode.UserId = p.Uid
userTopCode.CreatedTime = formatime.NewSecondNow()
@ -73,7 +73,7 @@ type TopCodeReturn struct {
Num uint `json:"num"`
}
//获取二维码的生成历史
// GetCodeList 获取二维码的生成历史
func GetCodeList(c *gin.Context) {
var p getCodeListPem
//err := tools.ParseParams(&p, c)

@ -20,10 +20,9 @@ type weChatRegister struct {
}
type mobileRegister struct {
Mobile string `json:"mobile" validate:"required,len=11"`
InvitationNo string `json:"invitationNo" validate:"required,max=8,min=6"`
SMS string `json:"sms"`
SuperiorUserId uint `json:"superiorUserId"`
Mobile string `json:"mobile" validate:"required,len=11"`
InvitationNo string `json:"invitationNo" validate:"required,max=8,min=6"`
SMS string `json:"sms"`
}
type weChatInvitation struct {
@ -148,7 +147,7 @@ func WeChatInvitation(c *gin.Context) {
}
// 从微信端注册时用户邀请码默认为id时6的用户邀请码为NXR0L3
p.InvitationNo = "NXR0L3"
//p.InvitationNo = "NXR0L3"
// 正确, 入库
var u = service.NewUserWithRedis()
@ -164,15 +163,9 @@ func WeChatInvitation(c *gin.Context) {
registerUser := service.NewRegisterUser()
//inviter, roleID, partner, err := registerUser.RegisterRole(p.InvitationNo, userInfo.Mobile)
//if err != nil {
// back.Fail(c, err.Error())
// return
//}
tmp := userInfo
var login user.Login
if err = registerUser.UserAdd(c, &login, &userInfo, userInfo.Mobile, p.InvitationNo); err != nil {
if err = registerUser.UserAdd(c, &login, &userInfo, userInfo.Mobile); err != nil {
back.Fail(c, "add error:"+err.Error())
return
}
@ -236,7 +229,7 @@ func WeChatInvitationWxapp(c *gin.Context) {
tmp := userInfo
var login user.Login
if err = registerUser.UserAdd(c, &login, &userInfo, userInfo.Mobile, p.InvitationNo); err != nil {
if err = registerUser.UserAdd(c, &login, &userInfo, userInfo.Mobile); err != nil {
back.Fail(c, "add error:"+err.Error())
return
}
@ -288,7 +281,7 @@ func MobileRegister(c *gin.Context) {
var info user.Information
// 开始添加用户
if err := registerUser.UserAdd(c, &login, &info, p.Mobile, p.InvitationNo); err != nil {
if err := registerUser.UserAdd(c, &login, &info, p.Mobile); err != nil {
back.Fail(c, "add error:"+err.Error())
return
}
@ -342,7 +335,7 @@ func MobileRegisterWxapp(c *gin.Context) {
DB.Table(info.TableName()).Where("invitation_no=?", p.InvitationNo).First(&uuid)
// 开始添加用户
if err := registerUser.UserAdd(c, &login, &info, p.Mobile, p.InvitationNo); err != nil {
if err := registerUser.UserAdd(c, &login, &info, p.Mobile); err != nil {
back.Fail(c, "add error:"+err.Error())
return
}
@ -441,7 +434,7 @@ func MobileRegisterH5(c *gin.Context) {
var info user.Information
// 开始添加用户
if err = registerUser.UserAdd(c, &login, &info, p.Mobile, p.InvitationNo); err != nil {
if err = registerUser.UserAdd(c, &login, &info, p.Mobile); err != nil {
back.Fail(c, "add error:"+err.Error())
return
}

@ -6,7 +6,6 @@ import (
"log"
"recook/internal/dbc"
"recook/internal/model/user"
"recook/internal/service/baseCode"
"recook/internal/service/comFunc"
"strconv"
"strings"
@ -177,17 +176,3 @@ func (uc *UserCode) IntroNumCache() error {
_, err = dbc.Rds.SAdd(AllIntroCodeSetForCal, uc.Code).Result()
return err
}
// 系统分发的 升级码(后台操作)
func (uc *UserCode) SystemUpgradeCode(managerId int) error {
mId := strconv.Itoa(managerId)
uCode := baseCode.New(int(time.Now().Unix()), 16-len(mId)) + mId
err := dbc.DB.Create(&user.IntroHistory{
IntroCode: uc.Code,
UserId: SystemerIntroUserId,
UpgradeCode: uCode,
UpCodeUsed: UpgradeCodeUnuse,
}).Error
return err
}

@ -4,7 +4,6 @@ import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/golangkit/formatime"
"log"
"recook/internal/back"
"recook/internal/cache"
"recook/internal/dbc"
@ -23,7 +22,7 @@ func NewRegisterUser() *registerUser {
return &registerUser{}
}
func (r *registerUser) UserAdd(c *gin.Context, login *user.Login, info *user.Information, mobile, invitationNo string) error {
func (r *registerUser) UserAdd(c *gin.Context, login *user.Login, info *user.Information, mobile string) error {
DB := dbc.DB
tx := DB.Begin()
{
@ -44,8 +43,7 @@ func (r *registerUser) UserAdd(c *gin.Context, login *user.Login, info *user.Inf
Audit: r.Audit,
Phone: mobile,
AssessBegin: formatime.NewSecondNow(), // 第一次的起始时间是注册时间
//AssessEnd: formatime.NewDateFrom(comFunc.NextAssessTime(time.Now())), // 获取下次考核时间
Identifier: time.Now().Format("060102") + baseCode.GetRandomStringForSix(),
Identifier: time.Now().Format("060102") + baseCode.Encode(uint64(lastId)),
}
if err := tx.Create(&info).Error; err != nil {
@ -55,8 +53,8 @@ func (r *registerUser) UserAdd(c *gin.Context, login *user.Login, info *user.Inf
}
// 生成邀请码和推荐码
info.InvitationNo = baseCode.GetRandomString(baseCode.InviteCodeLen)
info.IntroCode = baseCode.GetRandomString(baseCode.IntroCodeLen)
info.InvitationNo = baseCode.Encode(uint64(lastId))
info.IntroCode = ""
if err := tx.Save(&info).Error; err != nil {
tx.Rollback()
err = fmt.Errorf("创建用户错误102:" + err.Error())
@ -96,53 +94,8 @@ func (r *registerUser) UserAdd(c *gin.Context, login *user.Login, info *user.Inf
CreatTime: formatime.NewSecondNow(),
}
tx.Create(userNotice)
// 新的继续沿用他的这层关系表
// 向层级表插入
//var SuperiorUserInfo user.Information
//if partner != 0 {
// // 如果合伙人有值,那就表示他是推荐升级的用户
// dbc.DB.Find(&SuperiorUserInfo, partner)
//} else {
// SuperiorUserInfo = *inviter
//}
//if err := insertNode(tx, &SuperiorUserInfo, info.ID); err != nil {
// tx.Rollback()
// err = fmt.Errorf("创建用户错误105:" + err.Error())
// return err
//}
//如果code是7位 要去记录码的注册记录
if len(invitationNo) == 7 {
//去插入记录
var topCode user.TopCode
err := dbc.DB.First(&topCode, "code=?", invitationNo).Error
if err == nil && topCode.ID > 0 {
topCodenum := user.TopCodenum{
Code: invitationNo,
CreatedTime: formatime.NewSecondNow(),
UserId: info.ID,
PId: topCode.UserId,
}
if err := tx.Create(&topCodenum).Error; err != nil {
tx.Rollback()
err = fmt.Errorf("创建平台记录失败:" + err.Error())
return err
}
}
}
}
tx.Commit()
// 放入待统计的队列中
go func(code string, userId uint) {
uc := cache.NewUserCode(code, userId) //返回一个结构体code是上级推荐码userid是下级id
if err := uc.ProducerCode(); err != nil { //带着这个结构体去访问这个结构体的方法
log.Println("Panic 放入队列错误", err.Error())
}
}(invitationNo, info.ID)
return nil
}

@ -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…
Cancel
Save