在后台APP接口开发中可能经常性的会遇到多级分销机制,邀请的下线消费返佣,于是我左百度右百度,也没有找到一套比较合适的方案,然后只能动动聪明的大脑想想了,于是乎,我脑子里突然划过了一种方案,在邀请码上做手脚。
我们来看看三级的例子:
AAAAA AAAAA-BBBBB AAAAA-BBBBB-CCCCC
在C邀请了D的情况下自动将A直接切断了:
BBBBB-CCCCC-DDDDD
大兄弟们,有没有看出什么名堂来我们是不是可以直接找出我们的上线来了,这样又有人要说了要是有10级这样岂不是邀请码特别长别人填怎么办法?字符串压缩了解下。
AAA-BBB-CCC-DDD-EEE-FFF-GGG-HHH-III-JJJ-KKK
下面我们进入正题
1.查询我的所有下线信息
//TODO这行SQL是查询我的所有下线信息
SELECT * FROM APP_USER_INFO WHERE
invite_code LIKE 'XXXXXX%' AND invite_code != 'XXXXXX'
2.邀请码生成工具类
public class InviteCode {
/**
* 生成数字加字母N位随机数
* @param n 长度
* @return
*/
private static String getItemID( int n )
{
String val = "";
Random random = new Random();
for ( int i = 0; i < n; i++ )
{
String str = random.nextInt( 2 ) % 2 == 0 ? "num" : "char";
if ( "char".equalsIgnoreCase( str ) )
{ // 产生字母
int nextInt = random.nextInt( 2 ) % 2 == 0 ? 65 : 97;
// System.out.println(nextInt + "!!!!"); 1,0,1,1,1,0,0
val += (char) ( nextInt + random.nextInt( 26 ) );
}
else if ( "num".equalsIgnoreCase( str ) )
{ // 产生数字
val += String.valueOf( random.nextInt( 10 ) );
}
}
return val;
}
/**
* 生成邀请码
* @param lengths 邀请码长度
* @param inviteCode 上线邀请码
* @param level 分销等级
* @return
*/
public static String getInviteCodeLevel(int lengths,String inviteCode,Integer level){
String[] s = inviteCode.split("-");
if (s.length == level){
s = ArrayUtils.remove(s,0);
return StringUtils.join(s,"-") +"-"+ getItemID(lengths).toUpperCase();
}else{
return inviteCode + "-" + getItemID(lengths).toUpperCase();
}
}
/**
* 无上线生成邀请码
* @param lengths 邀请码长度
* @return
*/
public static String getInviteCode(int lengths){
return getItemID(lengths).toUpperCase();
}
}
3.注册方法类
/**
* 注册
* @param phone 手机号
* @param password 密码
* @param vcode 验证码
* @param jgId 极光推送ID
* @param inviteCode 邀请码
* @return
* @throws UnsupportedEncodingException
* @throws NoSuchAlgorithmException
*/
@PostMapping("/register")
@ResponseBody
@LoginRequired
public Response Register(String phone,String password,String vcode,String jgId,String inviteCode) throws UnsupportedEncodingException, NoSuchAlgorithmException {
if (StringUtils.isBlank(phone) || StringUtils.isBlank(password) || StringUtils.isBlank(vcode) || StringUtils.isBlank(jgId)){
return Response.custom().failure("缺少必要参数!");
}
UserInfo info = findByUser("phone",phone);
if (info != null){
return Response.custom().failure("账户已存在!");
}
String code = redisTemplate.opsForValue().get("1"+phone);
if (vcode == null){
return Response.custom().failure("验证码已失效!");
}
if (!vcode.equals(code)){
return Response.custom().failure("验证码错误!");
}
//添加个人信息
info = new UserInfo();
//生成邀请码 同理邀请码的取出可以看下生成邀请码方法,字符串使用了固定格式的有规律哦!
info.setInviteCode(StringUtils.isNotBlank(inviteCode)?InviteCode.getInviteCodeLevel(getMarginInfo().getInviteCodeLength(),inviteCode
,getMarginInfo().getLevel()):InviteCode.getInviteCode(getMarginInfo().getInviteCodeLength()));
info.setJgId(jgId);
info.setPhone(phone);
info.setPassword(MD5Util.EncoderByMd5(password));
infoService.addUser(info);
info = null;
info = findByUser("phone",phone);
if (info == null){
return Response.custom().failure("注册失败!");
}
//生成Token并返回
String token = authenticationService.getToken(info);
return Response.custom().ok().addParams(token);
}
网友评论