如何实现h5的抽奖功能

示例:

使用的是一个插件可以在多种环境下运行的插件:九宫格 LuckyGrid | 基于 Js / TS / Vue / React / 微信小程序 / uni-app / Taro 的【大转盘 & 九宫格 & 老虎机】抽奖插件

安装插件

# npm 安装
npm install @lucky-canvas/vue@latest# 或者 yarn 安装
yarn add @lucky-canvas/vue@latest

按需引入(就当前文件使用)

import { LuckyWheel, LuckyGrid } from 'vue-luck-draw'

 仅供参考,基础样式修改可以查看官网文档修改在 Vue 中使用 | 基于 Js / TS / Vue / React / 微信小程序 / uni-app / Taro 的【大转盘 & 九宫格 & 老虎机】抽奖插件

<script>import { LuckyWheel, LuckyGrid } from "vue-luck-draw";//引入
import turntable from "../../../api/turntable";//api
import Card from "./common/card.vue";//封装的卡券列表
import tipPop from "../common/tipPop.vue";//封装的弹窗
export default {components: {tipPop,Head,LuckyWheel,LuckyGrid,Card,},data() {return {dataList: [{ telephone: "157xxxx5554", offerName: "商品xxx" },{ telephone: "177xxxx5434", offerName: "商品xxx" },],blocks: [{padding: "10px",},],prizes: [],buttons: [{x: 1,y: 1,imgs: [{src: require("../../../assets/img/turntable/djcj.png"), // 转盘中心开始图片width: "100%",top: "-2%",},],},],// shop1:'0',defaultConfig: {accelerationTime: 2000,decelerationTime: 2000,},timeNums: 3, //剩余次数activeName: "a",//卡券类型showAll: false,serviceClose: false, //权益服务弹窗关闭按钮popShow: false, // 弹窗控制safeguardShow: false,prizeLists: [],prizeName: "", //抽中的奖品};},async mounted() {await this.getPrizeLists();this.getPrizeCounts();this.getAllPrizeOrderLists();//顺序没有规律,是按九宫格顺时针执行const arr1 = [{x: 0,y: 0,background: "#E8FCFF",},{x: 1,y: 0,background: "#E8FCFF",},{x: 2,y: 0,background: "#E8FCFF",},{x: 2,y: 1,background: "#E8FCFF",},{//开始抽奖的位置x: 1,y: 1,background: "#E8FCFF",},{x: 2,y: 2,background: "#E8FCFF",},{x: 1,y: 2,background: "#E8FCFF",},{x: 0,y: 2,background: "#E8FCFF",},{x: 0,y: 1,background: "#E8FCFF",},];// 将接口请求到的奖品结果填充到固定顺序的内容 const arr = this.prizeLists.map((item, index) => {return {...arr1[index],fonts: [{text: item.offerName,top: "30%",fontColor: "#474747",fontSize: "14px",},],};});// 将中间的坐标为(1,1)的点击抽奖删除if (arr.length > 4) {arr.splice(4, 1);}this.prizes = arr;console.log(this.prizes);},computed: {},methods: {startCallback() {if (this.timeNums == 0) {return this.$dialog.alert({message: `本月剩余${this.timeNums}次,次月刷新`,theme: "round-button",}).then(() => {});}// 调用抽奖组件的play方法开始游戏this.$refs.myLucky.play();// 模拟调用接口异步抽奖setTimeout(() => {// 可以由后端返回的中奖索引控制,暂定随机数const randomNum = parseInt(Math.floor(Math.random() * 8));// 调用stop停止旋转并传递中奖索引this.$refs.myLucky.stop(randomNum);}, 3000);},// 抽奖结束会触发end回调endCallback(prize) {console.log(prize);this.prizeName = prize.fonts[0].text;this.popShow = true;this.serviceClose = true;const name = this.prizeName;if (name =='谢谢惠顾') {return}else{const datas = this.prizeLists.find((item) => item.offerName === name);console.log(this.prizeLists, this.prizeName, datas);delete datas.id;const res = turntable.createPrizeOrder({...datas,telephone: sessionStorage.getItem("mobileNumber"),});console.log(res);}},//关闭弹窗handleMessageClose() {this.popShow = false;this.serviceClose = false;this.getPrizeLists();this.getPrizeCounts();this.getAllPrizeOrderLists();this.$refs.carda.onRefresh();},//查询奖池列表数据async getPrizeLists() {const res = await turntable.getPrizeList({telephone: sessionStorage.getItem("mobileNumber"),});this.prizeLists = res.dataconsole.log(this.prizeLists,121);if (this.prizeLists.length > 4) {//将中间的坐标为(1,1)的点击抽奖赋值为空this.prizeLists.splice(4, 0, {});}},//查询当月抽奖总数async getPrizeCounts() {const res = await turntable.getPrizeCount({telephone: sessionStorage.getItem("mobileNumber"),});this.timeNums = res.data;},//查询所有抽奖订单数据async getAllPrizeOrderLists() {const res = await turntable.getAllPrizeOrderList();if (res.data.length !==0) {this.dataList = res.data.map((item) => ({telephone: item.telephone,offerName: item.offerName,}));}},//切换卡券类型changeTitle(name, title) {console.log(name, title);// 根据名字来区分类型刷新对应的卡券类型this.$nextTick(() => {this.$refs["card" + name].onRefresh();});},//号码脱敏desensitizePhoneNumber(phoneNumber) {return phoneNumber.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2");},},
};
</script>
<template><div class="app-cantent"><div class="turntable"><div class="turntable-top"><div class="turntable-num">剩余{{ timeNums }}次抽奖机会</div><div class="turntable-main"><img src="../../../assets/img/turntable/bg1.png" alt="" /><div class="prizeDraw" v-if="prizes.length > 0"><LuckyGridref="myLucky"width="7.7rem"height="7.7rem":prizes="prizes":blocks="blocks":buttons="buttons"rowscols:default-config="defaultConfig"@start="startCallback"@end="endCallback"/></div><div class="prizeMsg"><div class="fl"><van-swipe:touchable="false":show-indicators="false"vertical:autoplay="3000"class="fl-swiper"><van-swipe-itemv-for="(item, index) in dataList":key="index + 1">恭喜用户{{item.telephone.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2")}}获取{{ item.offerName }}</van-swipe-item></van-swipe></div></div></div></div><div class="turntable-bottom"><div class="tab-content"><div class="my-prize"><div class="title-img"><img src="../../../assets/img/turntable/table-title.png" alt="" /></div><div class="title-header"><div class="content-title">我的奖品</div></div></div><div><van-tabsv-model="activeName"line-width="20px"@click="changeTitle"><van-tab title="可使用" name="a"><card :activeName="activeName" ref="carda"></card></van-tab><van-tab title="已使用" name="b"><card :activeName="activeName" ref="cardb"></card></van-tab><van-tab title="已过期" name="c"><card :activeName="activeName" ref="cardc"></card></van-tab></van-tabs></div></div><tipPop class="" v-show="popShow"><div class="IDBox"><div class="ids-title">提示</div><div class="ids-top" v-if="prizeName!=='谢谢惠顾'">恭喜您抽到了{{ prizeName }}</div><div class="ids-top" v-else>{{ prizeName }},下次再来</div><div class="toCopy"><van-button round type="info" block @click="handleMessageClose()">{{prizeName=='谢谢惠顾'? '确认':"收下"}}</van-button></div></div></tipPop></div></div></div>
</template>
<style scoped lang='less'>
.app-cantent {// width: 100vw;height: 100%;.turntable {height: 100%;padding: 0 10px;background-color: #2892ff;background: url("@/assets/img/turntable/bg.png") no-repeat center/cover;.turntable-top {padding-top: 30px;// padding-bottom: 20px;.turntable-num {// width: 100%;height: 30px;margin-top: 10px;border-radius: 10px;line-height: 30px;text-align: center;background: url("@/assets/img/turntable/yy.png") no-repeat center/cover;}.turntable-main {height: 450px;display: flex;justify-content: center;align-items: center;position: relative;.prizeDraw {position: absolute;top: 23vw;left: 9vw;}.prizeMsg {width: 300px;position: absolute;top: 7vw;left: 10vw;display: flex;justify-content: center;.fl {margin-top: 0px;display: flex;align-items: center;justify-content: center;height: 30px;text-align: center;.fl-swiper {margin-left: 5px;height: 22px;line-height: 23px;font-size: 11px;}}}.time {position: absolute;top: 55%;left: 50%;margin-left: -70px;color: #fff;width: 140px !important;text-align: center;}}}.turntable-bottom {border: 2px solid #81d3f8;.tab-content {width: 100%;background-color: #fff;.my-prize {position: relative;}.title-img {position: absolute;width: 60%;top: -10%;left: 20%;z-index: 99;}.title-header {position: relative;height: 35px;}.content-title {position: absolute;width: 20%;top: 0;left: 40%;z-index: 99;text-align: center;color: #fff;font-size: 16px;font-weight: 700;}}}}.IDBox {.ids-title {text-align: center;padding: 10px 0;font-size: 18px;font-weight: 700;}.ids-top {margin-top: 5px;text-align: center;padding: 10px 0;font-size: 16px;}.toCopy {margin-top: 15px;text-align: center;font-size: 16px;}}
}
</style>

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

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

相关文章

秋招复习篇之代码规范

目录 前言 1、变量命名 2、代码空格 1&#xff09;操作符左右一定有空格&#xff0c; 2&#xff09;分隔符&#xff08;, 和;&#xff09;前一位没有空格&#xff0c;后一位保持空格&#xff0c;例如&#xff1a; 3&#xff09;大括号和函数保持同一行&#xff0c;并有一个空格…

复数值神经网络可能是深度学习的未来

一、说明 复数这种东西,在人的头脑中似乎抽象、似乎复杂,然而,对于计算机来说,一点也不抽象,不复杂,那么,将复数概念推广到神经网络会是什么结果呢?本篇介绍国外的一些同行的尝试实践,请我们注意观察他们的进展。

Frappe Charts:数据可视化的强大工具

一、产品简介&#xff1a; 一个简单、零依赖、响应式的 开源SVG 图表库。这个图表库无论是数据更新还是屏幕大小变化&#xff0c;都能快速响应并更新图表。数据生成和悬停查看都有舒服的交互动效&#xff0c;体验感很好。不仅支持配置颜色&#xff0c;外观定制也很方便。还支持…

MYSQL分库分表常见问题

什么是分库 分库&#xff1a;是将一个数据库分成多个数据库&#xff0c;但是总表数不变&#xff0c;部署到不同机器&#xff0c;这样可以分担数据库的读写压力&#xff0c;提高系统的吞吐能力。 什么是分表 分表&#xff1a;就是一个表分成多个表&#xff0c;但是总体的库不…

k8s之陈述式资源管理

1.kubectl命令 kubectl version 查看k8s的版本 kubectl api-resources 查看所有api的资源对象的名称 kubectl cluster-info 查看k8s的集群信息 kubectl get cs 查看master节点的状态 kubectl get pod 查看默认命名空间内的pod的信息 kubectl get ns 查看当前集群所有的命…

[Python进阶] 操作注册表:winreg

5.22 操作注册表&#xff1a;winreg 5.22.1 注册表概念 在Windows系统中&#xff0c;注册表本质上就是一个数据库&#xff0c;其中存放着硬件、软件、用户、操作系统以及程序相关设置信息。我们除了使用Windows系统自带的regedit程序&#xff0c;也可以通过Python编程读取并操…

【React】echarts-for-react 的使用

文章目录 echarts-for-react &#xff1a;一个简单的 Apache echarts 的 React 封装配置项手册&#xff1a;https://echarts.apache.org/zh/option.html#title 安装依赖 $ npm install --save echarts-for-react# echarts 是 echarts-for-react的对等依赖,您可以使用自己的版本…

MCEWMDRMNDBootstrap.dll文件丢失,软件游戏无法启动,怎样下载修复

不少小伙伴反馈&#xff0c;在打开某些游戏或软件的时候&#xff0c;Windows会提示“MCEWMDRMNDBootstrap.dll文件丢失&#xff0c;软件无法启动”&#xff0c;不知道应该怎样办&#xff1f; 首先&#xff0c;我们先来了解“MCEWMDRMNDBootstrap.dll文件”是什么&#xff1f; …

Qt/C++音视频开发61-多屏渲染/一个解码渲染到多个窗口/画面实时同步

一、前言 多屏渲染就是一个解码线程对应多个渲染界面&#xff0c;通过addrender这种方式添加多个绘制窗体&#xff0c;我们经常可以在展会或者卖电视机的地方可以看到很多电视播放的同一个画面&#xff0c;原理应该类似&#xff0c;一个地方负责打开解码播放&#xff0c;将画面…

geemap学习笔记037:分析地理空间数据--坐标格网和渔网

前言 坐标格网&#xff08;Coordinate Grid&#xff09;简称“坐标网”&#xff0c;是按一定纵横坐标间距&#xff0c;在地图上划分的格网&#xff0c;坐标网是任何地图上不可缺少的要素之一。下面将详细介绍一下坐标格网和渔网。 1 导入库并显示地图 import ee import geem…

请问仿写arkts摇杆功能,为什么我的代码,TouchType.Up 时候摇杆动画不能还原呢?请求大佬指点一下

仿照黑马的arkts 写个摇杆功能&#xff0c;但是为什么我的代码&#xff0c;TouchType.Up 时候摇杆动画不能还原&#xff0c; 请求大佬指点一下 import router from ohos.router import curves from ohos.curvesEntry Component struct ItemPage7 {// 小鱼坐标State fishX: nu…

java代码审计 - OutputStream.write() 期间持续发生 XSS 攻击

** java - OutputStream.write() 期间持续发生 XSS 攻击 ** 1 漏洞概述 我一直在研究有关持久 XSS 攻击的安全问题 将未经验证的数据发送到网络浏览器&#xff0c;这可能会导致浏览器执行恶意代码。 代码采用 Java 语言。 void output(OutputStream out){out.write(byteDa…

中小型企业为什么需要CRM系统?CRM系统功能解析

巴菲特曾说&#xff1a;“设计出的工具越多&#xff0c;使用工具的人就得越聪明。“”如果您是中小企业主&#xff0c;想要企业更好地发展&#xff0c;您都可以考虑使用CRM管理系统。它可以帮助中小企业有效地管理客户&#xff0c;提高业务效率&#xff0c;实现快、稳、准的发展…

Miniconda 3 | 出发,探索Python

介绍 Miniconda 是 Anaconda 的精简版本&#xff0c;是一个轻量级的 Python 包管理工具和环境管理工具。 优势和功能主要包括&#xff1a; 轻量级和快速安装&#xff1a; Miniconda 相比 Anaconda 更小巧&#xff0c;只包含最基本的工具和包管理功能。安装速度更快&#xff0c…

基于图神经网络的动态物化视图管理

本期 Paper Reading 主要介绍了发布于 2023 年 ICDE 的论文《Dynamic Materialized View Management using Graph Neural Network》&#xff0c;该文研究了动态物化视图管理问题&#xff0c;提出了一个基于 GNN 的模型。在真实的数据集上的实验结果表明&#xff0c;取得了更高的…

进行VMware日志管理

随着公司转向虚拟化其 IT 空间&#xff0c;虚拟环境日志监控正在占据日志管理的很大一部分,除了确保网络安全外&#xff0c;虚拟机日志监控还有助于管理虚拟化工具&#xff0c;这是最复杂的任务之一。 对虚拟环境日志的监控分析 当今公司中最受欢迎的虚拟平台之一是 VMware。…

爬虫学习(1)--requests模块的使用

前言 什么是爬虫 爬虫是一种自动化工具&#xff0c;用于从互联网或其他计算机网络上获取数据。它可以模拟人的行为&#xff0c;自动访问网页&#xff0c;提取感兴趣的数据&#xff0c;并将其存储到本地计算机或数据库中。爬虫通常用于搜索引擎、数据分析、信息聚合等领域&…

gin框架使用系列之三——获取表单数据

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》 一、获取get参数 get请求的参数是直接加在url后面的&#xff0c;在gin中获取get请求的参数主要用Query()和DefaultQuery()两个方法&#xff0c;示例代码如下…

「Verilog学习笔记」超前进位加法器

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 超前进位加法器的实质是&#xff1a;对于输出的每一位Si 其实都可以用Si Ai ^ Bi ^ Cin来表示 我们需要做的只是判断加法结果的最高位该取几 例如本题中 输入的两个数A和B…

7.6分割回文串(LC131-M)

算法&#xff1a; 有很多分割结果&#xff0c;按照for循环去做肯定做不来 这个时候就要想到回溯&#xff01;那就要画树&#xff01; 画树 分割的画树过程其实和组合很像。 例如对于字符串aab&#xff1a; 组合问题&#xff1a;选取一个a之后&#xff0c;在ab中再去选取第…