微信小程序活动抽奖简单实现,包教包会

news2025/1/8 14:14:31

问题:

针对用户使用活动抽奖,获得抽奖得到商品的成就以及满足感,那么我们应该怎么去实现小程序去转盘抽奖活动呢

例如:项目需要抽奖实现相应的奖品奖励


实现方法

实现的效果如下:

 实现的主要代码:

Page({

  data: {
    dotList: [],
    dotColor1: 'pink', //圆点颜色1  
    dotColor2: 'linear-gradient(180deg, #1BFCE2 0%, #DBF5FF 100%)', //圆点颜色2  
    remian_num: 5, //剩余抽奖的次数
    prize_list: [],
    lock: false, //防止重复点击
    prizeListIndex: [0, 1, 2, 4, 7, 6, 5, 3], //抽奖顺序的索引
    prizeListIndex1: [0, 1, 2, 7, 3, 6, 5, 4], //奖品索引
    over: false, //是否加载完奖品数据
    start_btn: true, //是否有抽奖机会
    innerAudioContext: "", //按钮音
  },

  // 范围随机数
  randomRange(lower, upper) {
    return Math.floor(Math.random() * (upper - lower)) + lower;
  },
  onLoad: function (options) {
    this.init()
  },
  init() {
    //圆点设置  
    var leftCircle = 7.5;
    var topCircle = 8;
    var dotList = [];
    for (var i = 0; i < 28; i++) {
      if (i == 0) {
        topCircle = 8;
        leftCircle = 64;
      } else if (i < 8) {
        topCircle = 8;
        leftCircle = leftCircle + 72;
      } else if (i == 8) {
        topCircle = 54
        leftCircle = 626;
      } else if (i < 14) {
        topCircle = topCircle + 86;
        leftCircle = 626;
      } else if (i == 14) {
        topCircle = 538;
        leftCircle = 570;
      } else if (i < 22) {
        topCircle = 538;
        leftCircle = leftCircle - 72;
      } else if (i == 22) {
        topCircle = 484;
        leftCircle = 10;
      } else if (i < 28) {
        topCircle = topCircle - 86;
        leftCircle = 10;
      } else {
        return
      }
      dotList.push({
        topCircle: topCircle,
        leftCircle: leftCircle
      });
    }
    this.setData({
      dotList: dotList
    })

    // 圆点闪烁  
    setInterval(() => {
      if (this.data.dotColor1 == 'pink') {
        this.setData({
          dotColor1: 'linear-gradient(180deg, #1BFCE2 0%, #DBF5FF 100%)',
          dotColor2: 'pink',
        })
      } else {
        this.setData({
          dotColor1: 'pink',
          dotColor2: 'linear-gradient(180deg, #1BFCE2 0%, #DBF5FF 100%)',
        })
      }
    }, 500)
  },

  onShow: function () {
    this.getData();
  },
  getData() {
    var list = [{
      id: "001",
      icon: '/img/wuliu_icon5.png',
      name: '奖品一',
    },
    {
      id: "002",
      icon: '/img/wuliu_icon5.png',
      name: '谢谢惠顾',
    },
    {
      id: "003",
      icon: '/img/wuliu_icon5.png',
      name: '奖品二',
    },
    {
      id: "004",
      icon: '/img/wuliu_icon5.png',
      name: '奖品三',
    },
    {
      id: "005",
      icon: '/img/wuliu_icon5.png',
      name: '奖品四',
    },
    {
      id: "006",
      icon: '/img/wuliu_icon5.png',
      name: '谢谢惠顾',
    },
    {
      id: "007",
      icon: '/img/wuliu_icon5.png',
      name: '奖品五',
    },
    {
      id: "008",
      icon: '/img/wuliu_icon5.png',
      name: '奖品六',
    },
    ];
    let prize_list = list;
    let pIndex = this.data.prizeListIndex1;
    for (let i in prize_list) {
      prize_list[i].active = false;
      prize_list[i].index = pIndex[i];
    }
    this.setData({
      prize_list,
      over: true
    })
  },

  // 抽奖动画
  Timer: null,
  LotteryEnd: false, //抽奖结束
  nowRunIndex: 0, //ative样式的索引,
  luckChose(luckIndex) {
    return new Promise((resolve, reject) => {
      let that = this
      let maxTime = this.randomRange(2500,4000);
      let time_speed = 0.01; //速率
      if (this.nowRunIndex == 0) { //初始化从索引0开始显示抽奖激活的边框
        this.setData({
          'prize_list.[0].active': true
        })
      }
      function lotteryRun(time) {
        that.Timer = setTimeout(() => {
          let list = that.data.prize_list;
          ++that.nowRunIndex;
          that.nowRunIndex >= that.data.prizeListIndex.length ? that.nowRunIndex = 0 : '';
          let Pindex = that.data.prizeListIndex[that.nowRunIndex];
          console.log(Pindex)
          list.map((item, index) => {
            item.active = Pindex == index;
          })
          that.setData({
            prize_list: list
          })
          if (that.LotteryEnd && luckIndex == that.nowRunIndex) {
            clearTimeout(that.Timer);
            that.LotteryEnd = false;
            that.setData({
              lock: false
            })
            resolve(list.filter(v => {
              return v.active
            }))
          } else {
            time_speed += 0.5;
            lotteryRun(time + (time_speed));
          }
        }, time);
      }

      lotteryRun(80);
      setTimeout(() => {
        this.LotteryEnd = true;
      }, maxTime);
    })
  },
  audioPlay() {
    const innerAudioContext = wx.createInnerAudioContext()
    innerAudioContext.autoplay = false // 是否自动开始播放,默认为 false
    innerAudioContext.loop = true // 是否循环播放,默认为 false
    wx.setInnerAudioOption({ // ios在静音状态下能够正常播放音效
      obeyMuteSwitch: false, // 是否遵循系统静音开关,默认为 true。当此参数为 false 时,即使用户打开了静音开关,也能继续发出声音。
      success: function (e) { },
      fail: function (e) { }
    })
    innerAudioContext.src = "/pages/jsCase/img/btnaudio.mp3"
    innerAudioContext.play();
    this.setData({
      innerAudioContext,
    })
  },

  lottery() {
    if (!this.data.over) return
    // 防止重复点击
    if (this.data.lock) return
    this.setData({
      lock: true
    })
    let {
      prize_list
    } = this.data;
    if (this.data.remian_num.length <= 0 || this.data.prize_list.length === 0) return;
    this.audioPlay()
    let id = "005",
      currIndex = "";
    for (let i in prize_list) {
      if (id == prize_list[i].id) {
        currIndex = prize_list[i].index
      }
    }
    this.luckChose(currIndex).then(res => {
      this.data.innerAudioContext.stop()
      wx.showToast({
        title: '你抽中了' + res[0].name,
        icon: 'none'
      })
    })
  },
})

活动转盘抽奖,实现起来比较简单,但是细节也是挺多的,比如抽奖声音的播放以及停止

活动的转盘特效以及活动抽奖中了之后需要展示的效果以及处理等。

总结

为了方便大家,节约大家的时间,下面我将源码推送给你们,包教包会哈,拿来直接可以使用,不懂的可以私聊我

资源下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/749775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ANSYS Workbench项目分析与案例实操详解

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言准备工作创建项目导…

盘点5款Cesium三维GIS渲染引擎

目前&#xff0c;以Cesium为核心的各类产品繁多&#xff0c;本文将挑选一些以Cesium为核心的软件案例&#xff0c;为大家进行介绍。 1. CesiumJS CesiumJS相信凡是GIS行业相关人员都特别熟悉了&#xff0c;CesiumJS是一款开源的JavaScript库&#xff0c;用于创建高性能的地球…

以太网(Ethernet)入门了解

以太网&#xff08;Ethernet&#xff09;是一种常见的局域网&#xff08;LAN&#xff09;通信协议&#xff0c;它是由Xerox公司于1970年代中期开发的。以太网是一种基于广播技术的开放式网络协议&#xff0c;它允许设备在共享通信介质上进行通信。以下是关于以太网的基本概念、…

如何做到有效的项目质量管理?这三点很关键

“项目管理中&#xff0c;大家都遇到过的哪些绊脚石&#xff1f;” 近期看到了这样一个话题&#xff0c;大家纷纷吐槽了在项目中遇到的各种困难。除了常见的范围无限蔓延、进度不停延误、成本严重超支、内部沟通困难等一系列问题&#xff1b;其中提到次数较多的还有项目的质量…

QOwnNotes Mac版-QOwnNotes for Mac(事务笔记管理)

QOwnNotes for Mac是一款Mac平台上的笔记记录和待办事项软件&#xff0c;可以将你的笔记保存为纯文本文件&#xff0c;它支持 MarkDown 支持&#xff0c;并与 ownCloud 云服务紧密集成。 QOwnNotes 的亮点就是它集成了 ownCloud 云服务&#xff08;当然是可选的&#xff09;。…

JavaWeb 速通XML

目录 一、XML快速入门 1.基本介绍 : 2.入门案例 : 二、XML语法 0.文件结构 : 1.文档声明 &#xff1a; 2. 元素 : 3.属性 : 4.注释 : 5.CDATA节 : PS : XML转义符 : 三、Dom4j 1.关于XML解析技术 : 2 Dom4j介绍 : 3.Dom4j使用 : 1 获取Document对象的三种方式 2 …

ROS:Gazebo详解

目录 一、前言二、URDF与Gazebo基本集成流程2.1创建功能包2.2编写URDF文件2.3启动Gazebo并显示模型 三、URDF集成Gazebo相关设置3.1collision3.2inertial3.3颜色设置 四、URDF集成Gazebo实操4.1需求4.2流程4.3编写封装惯性矩阵算法的 xacro 文件4.4底盘 Xacro 文件4.5摄像头 Xa…

5个值得收藏字体网站,优秀字体不用再找

如何在大量的字体网站中选择安全可靠的字体呢&#xff1f;这里本文收集整理了5个好用的字体网站&#xff0c;一起来看看吧&#xff01; 1、即时设计 对于设计师来说&#xff0c;一个好的字体网站要具备两个基本要素:美观和免费。如果你对字体有同样的要求&#xff0c;那么即时…

给测试开发工程师的5条建议——你一定要知道

目录 前言 质量心态 获取其他测试领域的知识 探索性测试 数据测试 可视化测试 可访问性测试 安全测试 混沌测试 获得正确的帮助 自动化不仅仅是执行测试脚本 分享也是学习的一种途径 最后 前言 近些年可以看出测试开发工程师是热度比较高的测试职位&#xff0c;除…

【深度学习】多任务学习

多任务学习是一个很火的话题&#xff0c;在自动驾驶领域以及其他对存储资源要求较高的端侧任务&#xff0c;都会考虑这种方式。之前面试的时候也有被问题多任务学习。前几天看到一个写得很好的例子&#xff0c;在此记录一下&#xff0c;也好久没有写博客了。 1.参考 论文是20…

samba服务

samba服务 1. samba诞生背景2. samba简介3. samba配置文件详解3.1 配置文件中参数的作用3.1.1 security参数的四种验证方式3.1.2 passdb backend定义用户后台的类型 4. samba服务部署与配置windos共享linux挂载共享 1. samba诞生背景 1987 年&#xff0c;微软公司和英特尔公司…

fastapi初使用,构建自己的api

文章目录 1、安装2、api实现2.1、 app.get("/1")2.2、app.get("/{a}")2.3、app.get("/{a}{b}")2.4、函数和api分离 3、运行 原文链接&#xff1a;https://wangguo.site/posts/d98bb3c9.html fastapi 是一个基于 Python 的 API 构建框架&#xff…

C国演义 [第八章]

第八章 买卖股票的最佳时机题目理解步骤dp含义递推公式初始化遍历方向 代码 买卖股票的最佳时机II题目理解步骤dp含义递推公式初始化遍历方向 代码 买卖股票的最佳时机 力扣链接 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格 …

IDEA使用方式

1.翻译 1.Plugins插件&#xff1a;Chinese中文插件 文件F 编辑E 视图V 导航N 代码C 分析Z 重构R 构建B 运行U 工具T VCSS 窗口W 帮助H文件N 新建N 打开 打开最近 关闭项目 设置T 项目结构 文件属性 保存全部S 从磁盘全部重新加载 作废缓存/重启 导出/导入操作 其他设置 导出 打…

路径规划算法:基于协作搜索优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于协作搜索优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于协作搜索优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

suse linux 日语字库相关

问题 最近遇到一个日语字库的问题&#xff0c;界面上同一个label显示的日语字体大小都不一样&#xff0c; 如下图&#xff0c;圈出的部分字体大小和其他部分不一样。 分析 考虑两种情况 配置文件有问题缺少字库文件 检查配置文件 参考suse官方文档https://en.opensuse.o…

5.带你入门matlab常见分布的期望和方差(matlab程序)

代码及运行结果 %%  二项分布的期望和方差 clear all; n1100; p10.3; [m1,v1]binostat(n1,p1) %100*0.3 100*0.3*0.7 %% %% 均匀分布的期望和方差 clear all; a11; b15; [m1,v1]unifstat(a1,b1) %% 正态分布的期望和方差 clear all; n12; n23; [m1,v1]normstat(n1,n2) %%…

亚马逊真的赚钱吗?亚马逊多年卖家真实想法揭秘

亚马逊跨境电商真的能赚钱吗&#xff1f;近期收到很多的咨询。理解大家对赚钱的渴望&#xff0c;但凡事都是有利有弊的。至于亚马逊跨境电商能不能赚钱&#xff0c;赚多少&#xff1f;咨询了很多亚马逊多年卖家&#xff0c;今天就跟大家一起聊聊吧&#xff01; 亚马逊跨境电商…

解决dotnet调用https请求被中止未能创建SSL/TLS安全通道

环境:dotnet4.7.2/winserver2012 问题描述: 调用https出现请求被中止,未能创建SSL/TLS安全通道 第一试 自定义SetCertificatePolicy 函数&#xff0c;在建立http连接之前调用 SetCertificatePolicy 函数。 public static void SetCertificatePolicy() {ServicePointManage…

设计模式之建造者设计模式

写在前面 不知道&#xff0c;你在工作中有没有使用过lombok&#xff0c;如果你使用过&#xff0c;不知道你有没有使用过其中的Builder注解&#xff0c;其就会帮我们生成建造者设计模式相关的代码&#xff0c;本文就一起来看下吧&#xff01; 1&#xff1a;介绍 1.1&#xff…