微信小程序实现大转盘抽奖功能

举报
星汉网络 发表于 2021/05/11 09:01:51 2021/05/11
【摘要】 微信小程序实现大转盘抽奖

功能需求背景

小程序中,需要一个转盘抽奖的功能。后台随机生成奖品信息,完成抽奖过程。第一次如果抽奖不中,可以分享给好友,重新获得一次抽奖机会。

业务归属

NHT周年庆典活动小程序抽奖 - 2021年5月10日

实现效果

轮盘抽奖页面

具体代码实现方法

页面部分

<view class="luckdraw-desc" hidden="{{isDoLucky}}">
  <image class="luckdraw-img" src="https://wx-homelight.obs.cn-north-4.myhuaweicloud.com/nht20/lucky-desc.png"></image>
</view>

<view id="luckdraw_box" hidden="{{isDoLucky}}">
  <view id="luckdraw_back">
    <image style='transform:rotate({{ change_angle}}deg)' mode="scaleToFill"
      src="https://wx-homelight.obs.cn-north-4.myhuaweicloud.com/nht20/lucky-bg.png"></image>
  </view>
  <view id="luckdraw_pointer" bindtap='luckDrawStart'>
    <image mode="scaleToFill" src="https://wx-homelight.obs.cn-north-4.myhuaweicloud.com/nht20/lucky-btn.png"></image>
  </view>
</view>

<!-- 分享按钮的展示,在大转盘未抽中的情况下出现 -->
<view class="xui-share-panel" hidden="{{isShare}}">
  <view class="share-desc">
    <view class="share-title">抱歉没有中奖</view>
    <view>分享给好友,可以再获得一次抽奖机会。</view>
  </view>
  <view>
    <button class="xui-share-friend" open-type="share"></button>
  </view>
</view>

样式部分

#luckdraw_box {
  width: 531rpx;
  height: 531rpx;
  margin: 0 auto;
  position: relative;
  color: #FFFFFF;
}

#luckdraw_back {
  width: 100%;
  height: 100%;
}

#luckdraw_back image {
  display: block;
  width: 100%;
  height: 100%;
  transform-origin: center center;
}

#luckdraw_pointer {
  width: 174rpx;
  height: 228rpx;
  position: absolute;
  left: 178.5rpx;
  z-index: 999;
  top: 132.5rpx;
}

#luckdraw_pointer image {
  display: block;
  width: 100%;
  height: 100%;
}

page {
  background: #060606;
  background-image: url(https://wx-homelight.obs.cn-north-4.myhuaweicloud.com/nht20/lucky-page.jpg);
  background-size: 100%;
  background-repeat: no-repeat;
}

.xui-share-panel {
  position: fixed;
  bottom: 0;
  width: 100%;
  border-radius: 50%;
  height: 900rpx;
  z-index: 999;
}

.xui-share-friend {
  background-image: url(https://wx-homelight.obs.cn-north-4.myhuaweicloud.com/nht20/btn-share.png);
  background-size: 100%;
  background-repeat: no-repeat;
  height: 300rpx;
  width: 100%;
  background-color: transparent;
}

.xui-share-img {
  width: 100rpx;
  height: 60rpx;
}

.luckdraw-desc{
  text-align: center;
  padding-bottom: 40rpx;
  color: #FFFFFF;
  margin-top: 180rpx;
  font-size: 36rpx;
  padding-left: 80rpx;
  padding-right: 80rpx;
}

.share-title{
  color: #FFFFFF;
  font-size: 40rpx;
  padding-bottom: 20rpx;
}

.share-desc{
  text-align: center;
  color: #FFFFFF;
  font-size: 32rpx;
  padding-bottom: 80rpx;
}

.luckdraw-img{
  width: 100%;
  height: 120rpx;
}

JS代码部分

// 上下文对象
var that;
//获取应用实例
const app = getApp();
const {
  core,
  login
} = app;
const {
  ajax
} = core;

Page({

  /**
   * 页面的初始数据
   */
  data: {
    is_play: false, // 是否在运动中,避免重复启动bug
    available_num: 0, // 可用抽奖的次数,可自定义设置或者接口返回
    start_angle: 0, // 转动开始时初始角度=0位置指向正上方,按顺时针设置,可自定义设置
    base_circle_num: 9, // 基本圈数,就是在转到(最后一圈)结束圈之前必须转够几圈 ,可自定义设置
    low_circle_num: 5, // 在第几圈开始进入减速圈(必须小于等于基本圈数),可自定义设置
    add_angle: 10, // 追加角度,此值越大转动越快,请保证360/add_angle=一个整数,比如1/2/3/4/5/6/8/9/10/12等
    use_speed: 1, // 当前速度,与正常转速值相等
    nor_speed: 1, // 正常转速,在减速圈之前的转速,可自定义设置
    low_speed: 10, // 减速转速,在减速圈的转速,可自定义设置
    end_speed: 100, // 最后转速,在结束圈的转速,可自定义设置
    random_angle: 0, // 中奖角度,也是随机数,也是结束圈停止的角度,这个值采用系统随机或者接口返回
    change_angle: 0, // 变化角度计数,0开始,一圈360度,基本是6圈,那么到结束这个值=6*360+random_angle;同样change_angle/360整除表示走过一整圈
    result_val: "未中奖", // 存放奖项容器,可自定义设置
    // 奖项区间 ,360度/奖项个数 ,一圈度数0-360,可自定义设置
    Jack_pots: [],
    //是否展示抽奖大转盘
    isDoLucky: false,
    //是否展示下面的分享按钮
    isShare : true,
  },

  //当前进入页面人员的ID值
  _myopenid: '',

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    that = this;

    // 检查登录状态(获取自己的openid)
    login.checkLogin((openid) => {
      this._myopenid = openid;
    });
  },

  /**
   * 启动抽奖,首先向后台服务端请求,得到奖品数据
   */
  luckDrawStart: function () {
    ajax.spost({
      url: 'wx/award-random-angle',
      data: {
        openId: this._myopenid
      },
      success(ret) {
        if(ret.gameOver){
          core.modal('奖品已送完');
        }else{
          that.setData({
            Jack_pots: ret.awardList,
            random_angle: ret.luckyAngle
          });
  
          //开始执行抽奖的动作
          this.doDrawStart();
        }
      }
    })
  },
  //抽奖开始
  doDrawStart:function(){
    // 阻止运动中重复点击
    if (!that.data.is_play) {
      // 设置标识在运动中
      that.setData({
        is_play: true
      });

      //重置转盘数据
      this.luckDrawReset();

      // 运动函数
      setTimeout(that.luckDrawChange, that.data.use_speed);
    };
  },

  /**
   * 转盘运动
   */
  luckDrawChange: function () {
    // 继续运动
    if (that.data.change_angle >= that.data.base_circle_num * 360 + that.data.random_angle) { // 已经到达结束位置
      // 提示中奖,
      that.getLuckDrawResult();
      // 运动结束设置可用抽奖的次数和激活状态设置可用
      that.luckDrawEndset();
    } else { // 运动
      if (that.data.change_angle < that.data.low_circle_num * 360) { // 正常转速
        // console.log("正常转速")
        that.data.use_speed = that.data.nor_speed
      } else if (that.data.change_angle >= that.data.low_circle_num * 360 && that.data.change_angle <= that.data.base_circle_num * 360) { // 减速圈
        // console.log("减速圈")
        that.data.use_speed = that.data.low_speed
      } else if (that.data.change_angle > that.data.base_circle_num * 360) { // 结束圈
        // console.log("结束圈")
        that.data.use_speed = that.data.end_speed
      }
      // 累加变化计数
      that.setData({
        change_angle: that.data.change_angle + that.data.add_angle >= that.data.base_circle_num * 360 + that.data.random_angle ? that.data.base_circle_num * 360 + that.data.random_angle : that.data.change_angle + that.data.add_angle
      });
      setTimeout(that.luckDrawChange, that.data.use_speed);
    }

  },

  /**
   * 重置参数
   */
  luckDrawReset: function () {
    // 转动开始时首次点亮的位置,可自定义设置
    that.setData({
      start_angle: 0
    });
    // 当前速度,与正常转速值相等
    that.setData({
      use_speed: that.data.nor_speed
    });
    // 变化计数,0开始,必须实例有12个奖项,基本是6圈,那么到结束这个值=6*12+random_number;同样change_num/12整除表示走过一整圈
    that.setData({
      change_angle: 0
    });
  },

  /**
   * 获取抽奖结果
   */
  getLuckDrawResult: function () {
    for (var j = 0; j < that.data.Jack_pots.length; j++) {
      if (that.data.random_angle >= that.data.Jack_pots[j].startAngle && that.data.random_angle <= that.data.Jack_pots[j].endAngle) {
        that.setData({
          result_val: that.data.Jack_pots[j].name
        });

        //没有中奖的话,提示分享给好友,可以再获得一次抽奖机会
        if ('抱歉没有中奖' == this.data.result_val) {
          that.setData({
            isShare: false,
            isDoLucky : true
          });
        }
        //跳转到中奖页面
        else {
          wx.reLaunch({
            url: '/pages/lucky-success/lucky-success?openId=' + this._myopenid,
          })
        }

        break;
      };
    };
  },

  /**
   * 更新状态(运动结束设置可用抽奖的次数和激活状态设置可用)
   */
  luckDrawEndset: function () {
    // 是否在运动中,避免重复启动bug
    that.setData({
      is_play: false
    })
    // 可用抽奖的次数,可自定义设置
    that.setData({
      available_num: that.data.available_num - 1
    });
  },

  //分享链接给好友,一个好友,每天可以帮忙点亮一次
  onShareAppMessage() {
    let path = core.view.path('index', {
      openid: {
        content: login.getOpenId()
      },
    });

    //点击分享之后,则隐藏分享按钮,展示大转盘抽奖
    that.setData({
      isShare: true,
      isDoLucky : false
    });

    return {
      title: '国际大使学院抽奖活动',
      path: path,
      imageUrl: 'https://wx-homelight.obs.cn-north-4.myhuaweicloud.com/nht20/face.jpg'
    };
  },
})
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。