美文网首页程序员
史上最简单的多级分销机制后台和API设计

史上最简单的多级分销机制后台和API设计

作者: 一梦付浮生 | 来源:发表于2018-11-19 11:52 被阅读340次
    在后台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);
        }
    

    相关文章

      网友评论

        本文标题:史上最简单的多级分销机制后台和API设计

        本文链接:https://www.haomeiwen.com/subject/tipofqtx.html