精华内容
参与话题
问答
  • 五种红包雨效果

    2018-11-23 09:59:23
    五种红包雨,第一种比较适合大众效果,最后一种是流星效果,中间的三种效果不是很好。
  • 前言 活动形式:参与活动人员通过红包雨活动抢积分,通过积分可进行相应的奖品兑换  活动当天,我负责完成的功能包括:发红包,红包雨,排行榜 我的考虑 实现逻辑 一、发红包 ...

    前言

    活动形式:参与活动人员通过红包雨活动抢积分,通过积分可进行相应的奖品兑换
      活动当天,我负责完成的功能包括:发红包,红包雨,排行榜

    我的考虑

    在这里插入图片描述

    实现逻辑

    一、发红包(拆分)

    我们采取的是可控情况的不等额金额分配,这种情况下参数共需4个:总金额,红包个数,最大值,最小值,具体拆分形式
    多种多样,这里举个栗子(可限定最大值,最小值):

    // 每一份随机金额范围(除最后一份),最小值为1,最大值为当前剩余平均金额的3倍
    // 当前剩余平均金额=剩余总金额/剩余红包
    public ArrayList<Integer> divide(int totalMoney, int count) {
        //创建保存各个红包金额的集合
        ArrayList<Integer> list = new ArrayList <>();
        //定义循环次数,总个数‐1次
        int time = count‐1;
        //创建随机数对象
        Random random = new Random();
        //循环分配
        for (int i = 0; i < time; i++) {
            /*
             *每次重新计算,生成随机金额
             *随机范围:totalMoney/count*3,totalMoney不断的减少,
             *count也不断的减少,所以这是一个可变化的范围.
             */
            int money = random.nextInt(totalMoney / count * 3) + 1;
            //金额添加到集合
            list.add(money);
            //总金额扣除已分配金额
            total Money‐=money;
            //红包个数‐1
            count‐‐;
        }
        //剩余的金额,为最后一个红包
        list.add(totalMoney);
        return list;
    }
    

    二、抢红包(含关键逻辑的代码)

    (一)逻辑
    抢红包的关键点:抢、存
    抢:

    1. 什么时候抢
      • 有红包活动
      • 当前时间晚于红包开抢时间
    2. 抢什么
      • 积分
      • 语录

    部分代码

     private static AtomicInteger count = new AtomicInteger(0);
    
      //根据次数判断是否要调用抢红包方法
      int number = count.incrementAndGet();
      model.setNumber(number);
    
      //红包雨每请求2-5次(随机),调用一次抢红包方法
      // 起始值(生成随机数的参数)
      int start = 2;
      // 间隔值(生成随机数的参数)
      int interval = 4;
      if (number % (new Random().nextInt(interval) + start) == 0) {
      	  // 抢红包方法
          IntegralResult result = grabRedPacket(model);
          return IntegralResult.build(result.getCode(), result.getMessage(), result.getData());
      } else {
          redPacketEntity.setIntegral(0);
          // 随机的语录,返给前端
          redPacketEntity.setReason(quotationList.get(new Random().nextInt(quotationList.size())));
      }
    
    1. 怎么抢
      • 无奖品兑换
      • 有奖品兑换(只控制达到最高礼品所需积分的人数)
        • 没抢过红包 或 用户红包活动总额< 最高积分的70%,正常抢
        • 最高积分的70% < 用户红包活动总额 < 最高积分的90%,抢到积分的概率降低
        • 用户红包活动总额 > 最高积分的90%,抢到语录
    // 判断用户是否抢到过红包
    Boolean userIntegralFlag = redisTemplate.opsForHash().hasKey(activityId + ":" + "userIntegral", userId);
    int userIntegral = 0;
    if (userIntegralFlag) {
        // 用户抢到的红包总额
        userIntegral = (int) redisTemplate.opsForHash().get(activityId + ":" + "userIntegral", userId);
    }
    // 如果该用户 没抢到过红包 或者 用户红包活动总额< 最高积分的70%,正常抢
    /* *
     * 对用户红包雨活动能够抢到的积分做限制,
     *      达到firstLimit  = >  抢到积分的概率降低
     *      达到secondLimit  = >  只能抢到语录
     */
    double firstLimit = 0.7;
    double secondLimit = 0.9;
    if (!userIntegralFlag || userIntegral <= Math.floor(highestUserIntegral * firstLimit)) {
        // 将抢红包记录暂存redis
        saveRedPacketModel(userId, model.getUserName(), redPacketRainEntity, redPacketEntity, redPacketRainKey, userIntegral);
        log.info("用户积分低于最高兑换积分的70%,已抢红包");
    } else if (userIntegral > Math.floor(highestUserIntegral * firstLimit) && userIntegral < Math.floor(highestUserIntegral * secondLimit)) {
        //红包雨每请求2-5次(随机),调用一次抢红包方法
        // 起始值(生成随机数的参数)
        int start = 2;
        // 间隔值(生成随机数的参数)
        int interval = 4;
        if (model.getNumber() % (new Random().nextInt(interval) + start) == 0) {
            saveRedPacketModel(userId, model.getUserName(), redPacketRainEntity, redPacketEntity, redPacketRainKey, userIntegral);
        } else {
            redPacketRainEntity.setIntegral(0);
            // 随机的语录,返给前端
            if (CollectionUtils.isEmpty(quotationList)) {
                quotationList = redisTemplate.opsForList().range("quotation", 0, -1);
                if (CollectionUtils.isEmpty(quotationList)) {
                    queryRelation();
                }
            }
            redPacketRainEntity.setReason(quotationList.get(new Random().nextInt((quotationList).size())));
        }
        log.info("用户积分介于最高兑换积分的70%-90%,已抢红包");
    } else if (userIntegral >= Math.floor(highestUserIntegral * secondLimit)) {
        redPacketRainEntity.setIntegral(0);
        // 随机的语录,返给前端
        if (CollectionUtils.isEmpty(quotationList)) {
            quotationList = redisTemplate.opsForList().range("quotation", 0, -1);
            if (CollectionUtils.isEmpty(quotationList)) {
                queryRelation();
            }
        }
        redPacketRainEntity.setReason(quotationList.get(new Random().nextInt((quotationList).size())));
        log.info("用户积分高于最高兑换积分的90%,已抢红包");
    }
    
    1. 抢到的数据如何处理
      • 暂存redis
        private void saveRedPacketModel(String userId, String userName, ExhibitionPacketRecordEntity
                redPacketRainEntity, ExhibitionSendPacketEntity redPacketEntity, String redPacketRainKey, int userIntegral) {
            /**
             * 加锁(redis分布式锁)
             */
            RLock rlock = redissonClient.getLock("redisson:lock:redPacketId" + redPacketEntity.getId());
            //设置锁超时时间,防止异常造成死锁
            rlock.lock(2, TimeUnit.SECONDS);
            List<Integer> list = redisTemplate.opsForList().range(redPacketRainKey, 0, -1);
            if (CollectionUtils.isEmpty(list)) {
                log.warn("{} redis记录为空", redPacketRainKey);
                //解锁
                rlock.unlock();
                return;
            }
    
            try {
                redPacketRainEntity
                        .setUserId(userId)
                        .setUserName(userName)
                        .setIntegral(list.get(0))
                        .setReason("红包雨")
                        .setRedPacketId(redPacketEntity.getId())
                        .setActivityId(redPacketEntity.getActivityId());
    
                String alreadyGrabKey = redPacketEntity.getActivityId() + ":" + redPacketEntity.getId() + ":" + "1";
                redisTemplate.opsForList().leftPush(alreadyGrabKey, redPacketRainEntity);
                redisTemplate.opsForList().leftPop(redPacketRainKey);
                redisTemplate.opsForHash().put(redPacketEntity.getActivityId() + ":" + "userIntegral", userId, userIntegral + list.get(0));
            } finally {
                //解锁
                rlock.unlock();
            }
    

    (二)需要注意的地方
    1.统计所有用户访问抢红包后端的次数应该使用AtomicInteger 而不是int
    int不是线程安全的,但AtommicInteger是。
    ❤AtommicInteger的使用过程:
    在并发环境下,某个线程对共享变量先进行操作,如果没有其他线程争用共享数据那操作就成功;如果存在数据的争用冲突,那就才去补偿措施,比如不断的重试机制,直到成功为止,这种并发策略不需要把线程挂起。
    ❤代码

     private static AtomicInteger count = new AtomicInteger(0);
     // incrementAndGet()方法在一个无限循环体内,不断尝试将一个比当前值大1的新值赋给自己,如果失败则说明在执行"获取-设置"操作的时候已经被其它线程修改过了,于是便再次进入循环下一次操作,直到成功为止。
     int number = count.incrementAndGet();
    

    2.用户抢红包信息存入redis使用redis锁(redission)
    ❤redission的特点:
    1-互斥性。在任意时刻,只有一个客户端能持有锁。
    2-可靠性。要保证系统的稳定性,不能产生死锁
    3-容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。
    4-一致性。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。
    ❤代码:

     RLock rlock = redissonClient.getLock("redisson:lock");
     //设置锁超时时间,防止异常造成死锁
     rlock.lock(2, TimeUnit.SECONDS);
     
     try {
     // 要执行的逻辑
     } finally {
         //解锁
         rlock.unlock();
     }
    

    3.redis使用
    ❤红包过程用到的redis:
    在这里插入图片描述
    ❤redis中的存储情况:
    在这里插入图片描述
    在这里插入图片描述

    三、排行榜

    红包雨被抢完后,自动跳转到排行榜页面
    为了保证用户可以看到最新的红包记录结果,采用的是定时器5秒执行一次,将redis中的红包记录存入数据库
    定时器才用的是xxl-job。

    展开全文
  • js实现移动端红包雨效果

    千次阅读 2018-12-19 11:04:54
    &lt;!DOCTYPE html&gt; &lt;head&gt; &lt;meta http-equiv="Content-Type"...html5手机端抢红包雨&lt;/title&gt; &lt;style type="text/css"&
    <!DOCTYPE html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>html5手机端抢红包雨</title>
    
    <style type="text/css">
        html,body{width: 100%;
            height: 100%;}
        body {
            margin: 0;
            padding: 0;
            position: relative;
            background-position: center;
            overflow-y: hidden;
            background:url(http://demo.sc.chinaz.com/Files/DownLoad/webjs1/201702/jiaoben4852/images/bj.jpg) no-repeat top left ;
            background-size:  100%;
        }
        .couten {
            width: 100%;
            height: 100%;
            overflow: hidden;
            overflow-y: hidden;
        }
        .couten li {
            position: absolute;
            animation: all 3s linear;
            top:-100px;
            cursor: pointer;
            list-style: none;
        }
        .couten li img{
            width: 150px;
            height: 200px;
            display: block;
        }
        .mo {
            position: absolute;
            top: 0;
            width: 100%;
            height: 100%;
            background-color: rgba(0, 0, 0, .2);
            z-index: 100;
            display: none
        }
        .mo .sen {
            width: 70%;
            height: 150px;
            border-radius: 5px;
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            margin: auto;
        }
        .mo .sen img {
            width: 60%;
            height: 488px;
            position: absolute;
            top: 0px;
            left: 0;
            right: 0;
            bottom: 212px;
            margin: auto;
            vertical-align: top;
        }
        .mo .sen h3 {
            width: 50%;
            height: 30px;
            position: absolute;
            top: -35px;
            left: 0;
            right: 0;
            bottom: 0;
            margin: auto;
            text-align: center;
            color: red;
            font-size: 140%;
            font-weight: bold;
            z-index: 999;
        }
        
        .mo .sen a {
            width: 26%;
            height: 50px;
            background-color: rgb(174, 222, 244);
            box-shadow: rgba(174, 222, 244, 0.8) 0px 0px 2px, rgba(0, 0, 0, 0.0470588) 0px 0px 0px 1px inset;
            position: absolute;
            top: 100px;
            left: 0;
            right: 0;
            bottom: 0;
            margin: auto;
            color: #fff;
            border-radius: 5px;
            text-align: center;
            line-height: 50px;
            text-decoration: none;
        }
    </style>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/zepto/1.0rc1/zepto.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function() {
            var win = (parseInt($(".couten").css("width"))) - 60;
            $(".mo").css("height", $(document).height());
            $(".couten").css("height", $(document).height());
            $(".backward").css("height", $(document).height());
            $(".sen a").click(function(){
                $(".mo").hide();
            });        
            var add = function() {
                var hb = parseInt(Math.random() * (3 - 1) + 1);
                var Wh = parseInt(Math.random() * 100);
                var Left = parseInt(Math.random() * (win - 0) + 0);
                var rot = (parseInt(Math.random() * (45 - (-45)) - 45)) + "deg";
                num++;
                $(".couten").append("<li class='li" + num + "' ><img src='http://demo.sc.chinaz.com/Files/DownLoad/webjs1/201702/jiaoben4852/images/hb_" + hb + ".png'></li>");
                $(".li" + num).css({
                    "left": Left,
                });
                $(".li" + num + " a img").css({
                    "width": Wh,
                    "transform": "rotate(" + rot + ")",
                    "-webkit-transform": "rotate(" + rot + ")",
                    "-ms-transform": "rotate(" + rot + ")", /* Internet Explorer */
                    "-moz-transform": "rotate(" + rot + ")", /* Firefox */
                    "-webkit-transform": "rotate(" + rot + ")",/* Safari 和 Chrome */
                    "-o-transform": "rotate(" + rot + ")" /* Opera */
                }); 
                $(".li" + num).animate({'top':$(window).height()+10},10000,function(){
                    //删掉已经显示的红包
                    this.remove()
                });
                //点击红包的时候弹出模态层
                $(".li" + num).tap(function(){
                    $(".mo").show();
                });
                setTimeout(add,2000)
            }           
            //增加红包
            var num = 0;
            add(); 
        })
    </script>
    
    </head>
    <body>
    <ul class="couten">
    
    </ul>
    <div class="mo" style="background: rgba(0,0,0,0.4);">
        <div class="sen">
            <img src="http://demo.sc.chinaz.com/Files/DownLoad/webjs1/201702/jiaoben4852/images/gx.png">
            <h3>获得红包3元</h3>
            <a href="#">确定</a>
        </div>
    </div>     
    </body>
    </html>
    
    展开全文
  • vue.js实现红包雨

    千次阅读 2019-01-15 14:09:49
    vue.js实现红包雨 看了好多实现红包雨的案例,但好像还没有vue实现红包雨的,所以我来实现下,测试过了,兼容性很好,接下来直接po代码啦 index.vue &lt;template&gt; &lt;div class=""&...

    vue.js实现红包雨

    看了好多实现红包雨的案例,但好像还没有vue实现红包雨的,所以我来实现下,测试过了,兼容性很好,接下来直接po代码啦
    index.vue

    <template>
        <div class="">
           <div id="redzone">
           </div>
        </div>
    </template>
    
    

    js

    <script>
    import jQuery from 'jquery'
    export default {
        name:'hongbao',
        data () {
            return {
              
            }
        },
        computed:{
      
        },
    methods:{
          addBao:function(left, height, src) {
            var div = document.createElement("div");
            var img = document.createElement("img");
            div.appendChild(img);
            img.className = "roll";
            img.src = src;
            div.style.left = left + "px";
            div.style.height = height + "px";
            div.className = "redBox";
            document.getElementById("redzone").appendChild(div);
            setTimeout(function() {
                document.getElementById("redzone").removeChild(div);
                // console.log(window.innerHeight); 
            }, 3000);
            
        },
       
       
    },
    mounted(){
                let vueObject = this;
                setInterval(function(){
                    var left = Math.random() * document.body.scrollWidth;;
                    var height = Math.random() * document.body.scrollHeight;
                    var src = "./static/images/pocket.png"; 
                    vueObject.addBao(left, height, src);
                }, 500);
    }
    }
    </script>
    

    css

     @keyframes redImg {
        0% {
            top:0;
        }
        100% {
            top: 100%;
        }
    }
    .redBox {
        position: absolute;
       /* opacity: 0;*/
       z-index: 10000;
        animation: redImg 3s infinite linear;
        -webkit-animation: redImg 3s infinite linear;
        -moz-animation: redImg 3s infinite linear;
        -ms-animation: redImg 3s infinite linear;
        -o-animation: redImg 3s infinite linear;
    }
    
    .redBox {
        position: fixed;
        img{
          display: block;width: 1rem;height: 1.3rem;
        }
    }
    
    

    ps:实现原理其实很简单,css3向下飘落动画

    展开全文
  • 微信小程序实现“红包雨

    千次阅读 2018-06-22 14:24:43
    首先明确“红包雨”的需求:随机位置掉落随机红包样式同一时间掉落个数随机每个红包的掉落速度随机,但不能太快也不能太慢首先看看我做的效果吧 首先明确小程序实现红包雨和web网页实现红包雨难点上有什么不同:小...

        今天有个小师妹来问我怎样用微信小程序实现红包雨效果,如果用web很好实现,但是小程序不是那么容易,整合自己也有一年没摸过小程序了,决定试一试。


    首先明确“红包雨”的需求:

    • 随机位置掉落
    • 随机红包样式
    • 同一时间掉落个数随机
    • 每个红包的掉落速度随机,但不能太快也不能太慢

    首先看看我做的效果吧



        首先明确小程序实现红包雨和web网页实现红包雨难点上有什么不同:

    • 小程序不能直接操作dom,web网页可以操作
    • 小程序循环渲染wx:for内无法执行animation,web网页中animation执行无条件约束
    • 小程序修改样式属性需要通过数据绑定无法直接修改,web网页可以直接取dom元素进行修改

        好了那么问题来了怎样实现生成红包雨呢?小程序无法直接操作dom也就意味着不能向dom内添加元素,这里我的解决办法是先生成预设个数的红包在视窗外部(用户看不到),然后修改每个红包的样式来实现动画(当然用css keyframes帧动画也可以,我这里使用的是js修改属性)

    话不多说直接上代码吧,代码内有注释

    wxml:

    <view wx:for="{{packetList}}" wx:for-index="index" wx:for-item="items">
      <image class="red-packet" src="{{items.src}}" style="position:fixed;top:{{items.top}}px;left:{{items.left}}px;-webkit-transition:{{items.speed}}ms linear 0ms;transition:{{items.speed}}ms linear 0ms">
      </image>
    </view>

    wxss:

    .red-packet{
      width: 20px;
      height: 25px;
      z-index: 100;
      transition-property:transform,top;
      transform-origin:50% 50% 0;
      -webkit-transition-property:transform,top;
      -webkit-transform-origin:50% 50% 0;
    }

    js:

    Page({
    
      /**
       * 页面的初始数据
       */
      data: {
        windowWidth:"",//窗口宽度
        windowHeigh:"",//窗口高度
        packetList:[{}],//红包队列
        packetNum:200,//总共红包的数量
        showInter:''//  循环动画定时器
      },
    
      /**
       * 生命周期函数--监听页面加载
       */
      onLoad: function (options) {
        var that = this;
    
        // 获取手机屏幕宽高
        wx.getSystemInfo({
          success: function (res) {
            that.setData({
              windowWidth: res.windowWidth,
              windowHeigh: res.windowHeight,
              top: res.windowHeight-100   //设置红包初始位置
            })
          }
        })
    
        //建立临时红包列表
        var packetList=[];
        //建立临时红包图片数组
        var srcList = ["../images/packet-one.png", "../images/packet-two.png"];
        //生成初始化红包
        for(var i=0;i<that.data.packetNum;i++){
          // 生成随机位置(水平位置)
          var left = Math.random() * that.data.windowWidth-20;
          // 优化位置,防止红包越界现象,保证每个红包都在屏幕之内
          if(left<0){
            left+=20;
          } else if (left > that.data.windowWidth){
            left-=20;
          }
          // 建立临时单个红包
          var packet = {
            src: srcList[Math.ceil(Math.random() * 2) - 1],
            top: -30,
            left:left,
            speed:Math.random() * 2500+3000     //生成随机掉落时间,保证每个掉落时间保持在3秒到5.5秒之间
          }
          // 将单个红包装入临时红包列表
          packetList.push(packet);
          // 将生成的临时红包列表更新至页面数据,页面内进行渲染
          that.setData({
            packetList: packetList
          })
        }
        
        // 初始化动画执行当前索引
        var tempIndex=0;
        // 开始定时器,每隔1秒掉落一次红包
        that.data.showInter=setInterval(function(){
          // 生成当前掉落红包的个数,1-3个
          var showNum = Math.ceil(Math.random() * 3);
          // 防止数组越界
          if (tempIndex * showNum>=that.data.packetNum){
            // 如果所有预生成的红包已经掉落完,清除定时器
            clearInterval(that.data.showInter);
          }else{
            switch (showNum){
              case 1:
                //设置临时红包列表当前索引下的top值,此处top值为动画运动的最终top值 
                packetList[tempIndex].top = that.data.windowHeigh;
                // 当前次掉落几个红包,索引值就加几
                tempIndex+=1;
                break;
              case 2:
                packetList[tempIndex].top = that.data.windowHeigh;
                packetList[tempIndex + 1].top = that.data.windowHeigh;
                tempIndex+=2;
                break;
              case 3:
                packetList[tempIndex].top = that.data.windowHeigh;
                packetList[tempIndex + 1].top = that.data.windowHeigh;
                packetList[tempIndex + 2].top = that.data.windowHeigh;
                tempIndex += 3;
                break;
                default:
                console.log();
            }
            // 更新红包列表数据
            that.setData({
              packetList: packetList
            })
          }
        },1000)
      }
    })

    好了红包雨就这样实现了,其实还是蛮有意思的。

    展开全文
  • 红包雨的实现

    2019-11-22 23:43:40
    先看一下效果截图。 这种一般在手机APP上,还有微信上面可能会看到。实现起来也不难,只需要几张图片即可。 代码实现如下。 HTML <!DOCTYPE html> <html lang="e...
  • HTML+css+jquery 实现红包雨

    千次阅读 2018-06-27 10:25:37
    最近在研究红包雨,借鉴一些大神的写法,自己也写了一个,记录一下使用JQuery和JQuery-UIhtml样式css样式js代码
  • 红包雨动画

    2019-01-20 16:59:26
    红包雨动画实现步骤 1.首先定义红包的实体类 package com.example.administrator.mydemo.redrain; import android.content.Context; import android.graphics.Bitmap; import java.util.Random; public class ...
  • 红包雨jq效果

    2018-01-17 13:35:05
    jq实现红包雨效果jq实现红包雨效果jq实现红包雨效果jq实现红包雨效果jq实现红包雨效果jq实现红包雨效果jq实现红包雨效果jq实现红包雨效果jq实现红包雨效果jq实现红包雨效果jq实现红包雨效果jq实现红包雨效果jq实现...
  • 根据 code4app 中的一个飘雪代码 改写的 主要修改了 雪花在飘落的时候 可以支持手势点击 图片可以替换成 任意图片 比如 红包 雪花 表情等
  • 仿红包雨demo

    2017-08-21 11:40:50
    这个资源是关于仿红包雨的动画demo
  • html红包雨插件

    2018-10-22 06:44:23
    修复了半突出的bug,让美观更加好看点,而且可以运用在各类型的网站活动专区去
  • 在手机端上面利用js代码来实现红包飘下的效果,点击某个红包后就能拆开红包。 抢红包,js,手机端
  • 微信jquery红包雨代码

    2016-12-16 16:04:26
    微信jquery红包雨流畅版代码
  • 本篇文章主要介绍了Android实现红包雨动画效果,小编觉得挺不错的,现在分享给大家,也给大家个参考。一起跟随小编过来看看吧
  • JS实现红包雨 这里只是一个效果的实现,没有添加更多复杂的业务逻辑,方便直接拿来使用 页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport...
  • 红包雨ppt动画,模拟红包拆开ppt动画特效模板。
  • HTML5微信红包抽奖红包雨特效动画js效果下载。一款非常实用的红包雨抽奖jQuery插件,背景红包雨动画非常炫酷,带抽奖弹窗提示。
  • Android下红包雨的实现

    千次阅读 2019-10-21 12:05:31
    最近项目的时候,需要一个类似下红包雨的效果。经过自己的反复研究,发现使用动画是最合适的。下面贴出这种实现效果的流程 首先创建一个用来初始化红包相关的值的红包实体类 public class RedPacket { ...
  • 简单红包雨生成规则

    2019-07-04 19:04:19
    简单红包雨生成规则 php代码 <?php /** * 红包雨相关 */ $packetNum = 15; //红包个数 $totalBalance = 183;//总金额 $packetConfig = new RedPacket(); $result = $packetConfig->getPacketList($...

空空如也

1 2 3 4 5 ... 20
收藏数 3,245
精华内容 1,298
关键字:

红包雨