vue实现大转盘抽奖

news2024/11/25 14:37:13

本案例为在小程序中实现的转盘抽奖,其他手机端项目思路类似。

注意: 转盘上的东西是由后台web项目里的配置页进行配置的,可以配置每个位置的奖品,中奖概率等。此文章只讲了抽奖转盘的实现,配置可根据真实需求进行开发即可,这里不作叙述。真实上线的时候,只需要将其中的转盘奖品信息,中奖位置索引,中奖次数,活动说明,中奖记录改成后台接口调用即可,此处仅在代码里模拟数据。

效果图如下:

抽奖转盘效果图
代码如下:

<template>
	<view class="content">
		<view class="lotteryPage">
			<image src="../static/drawLottery/drawLotteryTitle.png" mode="aspectFit" class="titlePng"></image>
			<view class="activeExplainDiv">
				<view class="activeExplain">
					活动说明
				</view>
			</view>
			<view class="lotteryBody">
				<view class="roteDiv" :style="{transform:rotate_deg,transition:rotate_transition}">
					<image src="../static/drawLottery/zhuanPan.png" mode="aspectFit" class="zhuanPan"></image>
					<view :class="'zhuanPanCon zhuanPanCon'+index" v-for="(item,index) in prizeArr">
						<view class="prizeTextSty">{{item.text}}</view>
						<image
							:src="item.type ===  0?'../static/drawLottery/thanksPng.png':item.type ===  1?'../static/drawLottery/couponPng.png':'../static/drawLottery/integrationPng.png'"
							mode="aspectFit" class="prizeImgSty"></image>
					</view>
				</view>
				<image src="../static/drawLottery/zhuanBorder.png" mode="aspectFit" class="zhuanBorder"></image>
				<image src="../static/drawLottery/clickBtn.png" mode="aspectFit" class="clickBtn" @click="drawLottery"></image>
			</view>
			<view class="bottomBlock">
				<view class="bottomLine">
					<view class="shengYuTimes">剩余{{LuckyClick}}次抽奖次数</view>
				</view>
				<view class="bottomLine">
					<view class="recordSty">中奖记录</view>
				</view>
			</view>

		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				LuckyClick: 3,
				angle: 60, //总共6个扇形区域,每个区域约60度
				isAllowClick: true, //是否能够点击
				rotate_deg: 0, //指针旋转的角度
				rotate_transition: "transform 3s ease-in-out", //初始化选中的过度属性控制
				prizeArr: [{
						id: 1,
						sort: 1,
						text: '谢谢参与',
						type: 0

					},
					{
						id: 2,
						sort: 2,
						text: '600积分x6',
						type: 2

					},
					{
						id: 3,
						sort: 3,
						text: '500元券x3',
						type: 1

					},
					{
						id: 4,
						sort: 4,
						text: '谢谢参与',
						type: 0

					},
					{
						id: 5,
						sort: 5,
						text: '20000积分x10',
						type: 2

					},
					{
						id: 6,
						sort: 6,
						text: '3000元券x2',
						type: 1

					}
				]
			}
		},
		methods: {
			drawLottery() {
				if (this.LuckyClick == 0) {
					uni.showToast({
						title: '机会已经用完了',
						duration: 2000,
						icon: 'none'
					});
					return;
				}
				this.rotating();
			},
			rotating() {
				if (!this.isAllowClick) return;
				this.isAllowClick = false;
				this.rotate_transition = "transform 3s ease-in-out";
				this.LuckyClick--;
				let rand_circle = 5; //默认多旋转5圈
				let winningIndex = 4 //模拟中奖位置,此处到时调用后台接口取值
				let deg = rand_circle * 360 + winningIndex * this.angle; //将要旋转的度数
				this.rotate_deg = "rotate(" + deg + "deg)";
				let that = this
				setTimeout(() => {
					uni.showModal({
						title: '中奖结果',
						content: '500优惠券x3',
						showCancel: false,
						success: function(res) {
							if (res.confirm) {
								console.log('用户点击确定');
								that.isAllowClick = true;
								that.rotate_deg = "rotate(" + 0 + "deg)"; //定时器关闭的时候重置角度
								that.rotate_transition = "";
							}
						}
					});
				}, 4000)

			}
		}
	}
</script>

<style scoped>
	.content {
		padding: 0;
		overflow: hidden;
		background-image: url(base64);	// 这里需要自行在网上将背景图转为base64,替换掉url里的base64,因为小程序不支持,其他情况下可直接使用.
		background-repeat: no-repeat;
		background-attachment: fixed;
		background-size: cover;
	}

	.lotteryPage {
		height: 100%;
		overflow: hidden;
		display: flex;
		flex-direction: column;
		align-items: center;
	}

	.titlePng {
		margin-top: 60px;
		height: 66px;
	}

	.activeExplainDiv {
		margin: 20px 0;
		width: 100%;
		display: flex;
		justify-content: flex-end;
	}

	.activeExplain {
		padding: 8px 0;
		width: 80px;
		text-align: center;
		border-bottom-left-radius: 18px;
		border-top-left-radius: 18px;
		background-color: rgba(188, 56, 23, 0.29);
		color: #faf0d8;
		font-size: 12px;
	}

	.lotteryBody {
		width: 320px;
		height: 320px;
		position: relative;
	}

	.roteDiv {
		width: 100%;
		height: 100%;
	}

	.zhuanPan {
		width: 100%;
		height: 100%;
	}

	.zhuanPanCon {
		position: absolute;
	}

	.zhuanPanCon0 {
		top: 14%;
		left: 50%;
		transform: translateX(-50%);
		text-align: center;
	}

	.zhuanPanCon1 {
		top: 28%;
		right: 18%;
		transform: rotate(60deg);
		text-align: center;
	}

	.zhuanPanCon2 {
		bottom: 28%;
		right: 18%;
		transform: rotate(120deg);
		text-align: center;
	}

	.zhuanPanCon3 {
		bottom: 14%;
		right: 51%;
		transform: rotate(180deg) translateX(-50%);
		text-align: center;
	}

	.zhuanPanCon4 {
		bottom: 28%;
		left: 16%;
		transform: rotate(240deg);
		text-align: center;
	}

	.zhuanPanCon5 {
		top: 30%;
		left: 18%;
		transform: rotate(300deg);
		text-align: center;
	}

	.prizeTextSty {
		color: #c73d18;
		font-size: 12px;
	}

	.prizeImgSty {
		width: 40px;
		height: 40px;
	}

	.zhuanBorder {
		width: 100%;
		height: 100%;
		position: absolute;
		top: 0;
		left: 0;
	}

	.clickBtn {
		width: 60px;
		height: 80px;
		position: absolute;
		top: 46%;
		left: 50%;
		transform: translate(-50%, -50%);
	}

	.bottomBlock {
		margin-top: 10px;
		flex: 1;
		display: flex;
		flex-direction: column;
		align-items: center;
	}

	.bottomLine {
		flex: 1;
		display: flex;
		align-items: center;
	}

	.shengYuTimes {
		padding: 8px 40px;
		background-color: #bc3817;
		color: #faf0d8;
		font-size: 12px;
		border-radius: 16px;
	}

	.recordSty {
		text-decoration: underline;
		font-size: 14px;
		color: #ca411f;
	}
</style>

上面所用到的图片资源文件截图(并非真实图片文件大小,真实需要可自行让UI设计制作即可):

图片资源文件截图

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

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

相关文章

web前端之CSS操作

文章目录 一、CSS操作1.1 html元素的style属性1.2 元素节点的style属性1.3 cssText属性 二、事件2.1 事件处理程序2.1.1 html事件2.1.2 DOM0事件&#xff08;适合单个事件&#xff09;2.1.3 DOM2事件&#xff08;适合多个事件&#xff09; 2.2 事件之鼠标事件2.3 事件之Event事…

网络编程的使用

文章目录 基础代码URL类进行传输编码解码 协议TCPUDPhttp PORT端口协议的实现TCPUDP 模拟服务器 基础代码 最后一个是&#xff1a;只要再timeout时间内连接上就是true URL类 导了一个common-iojar包&#xff0c;那个IOUtils就是那个里面的工具类 进行传输编码解码 协议 TC…

VSCode Remote-SSH (Windows)

1. VSCode 安装 VSCode 2. 安装扩展 Remote SSH Getting started Follow the step-by-step tutorial or if you have a simple SSH host setup, connect to it as follows: Press F1 and run the Remote-SSH: Open SSH Host… command.Enter your user and host/IP in the …

安防监控视频汇聚平台EasyCVR分发的FLV视频流在VLC中无法播放是什么原因?

众所周知&#xff0c;TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入&#xff0c;包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。在视频流的处理与分发上&#xff0c;视频监控…

在SAP中使用苹果手机进行条码扫描

适用于iOS的Liquid UI支持使用内置摄像头或第三方设备&#xff08;如Linea Pro&#xff09;进行条形码扫描。它使您能够通过单击在任何 SAP 输入字段中填充数据。它支持&#xff1a;一维和二维条码扫描。此外&#xff0c;编辑扫描的数据或在扫描后对操作进行编程&#xff0c;以…

JWT的初步说明

JWT 概念 JWT 主要用于用户登录鉴权&#xff0c;JWT (全称&#xff1a;Json Web Token)是一个开放标准(RFC 7519)&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于作为 JSON 对象在各方之间安全地传输信息。该信息可以被验证和信任&#xff0c;因为它是数字签名…

【深度学习注意力机制系列】—— SENet注意力机制(附pytorch实现)

深度学习中的注意力机制&#xff08;Attention Mechanism&#xff09;是一种模仿人类视觉和认知系统的方法&#xff0c;它允许神经网络在处理输入数据时集中注意力于相关的部分。通过引入注意力机制&#xff0c;神经网络能够自动地学习并选择性地关注输入中的重要信息&#xff…

巡课技巧,工作再忙也要学会!提高效率杠杠的

在当今不断演变的教育环境中&#xff0c;教学质量的提升和教师专业发展变得尤为重要。为了更好地监督和评估教师的教学表现&#xff0c;以及促进学生在课堂中的积极参与&#xff0c;在线巡课系统应运而生。 通过实时观察、远程巡课、数据分析等功能&#xff0c;该系统不仅为教育…

LVS负载均衡部署-NAT

文章目录 LVS-NAT模式配置原理实验环境DR添加网卡准备两台Real Server134&#xff1a;145&#xff1a;测试&#xff1a; 修改RS网关配置DR&#xff1a;开启路由转发下载软件配置查看配置 测试 LVS-NAT模式配置 原理 当客户端访问DR时即访问的外网接口然后由DR将流量在本地转发…

Do not access Object.prototype method ‘hasOwnProperty‘ from target object

调用 hasOwnProperty 报错&#xff1a;不要使用对象原型上的方法&#xff0c;因为原型的方法可能会被重写 if (this.formData.selectFields.hasOwnProperty(selectField)) {delete this.formData.selectFields[selectField];} else {this.formData.selectFields[selectField] …

HIVE学习

1.什么是HIVE 1.HIVE是什么? Hive是由Facebook开源&#xff0c;基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能。 大白话: HIVE就是一个类似于Navicat的可视化客户端, 2.HIVE本质 Hive是一个Hadoop客户端&a…

Java、Android 之 TCP / IP

TCP、IP是一系列协议组成的网络分层模型 客户端向服务端发送请求可能会走N条链路&#xff0c;这个过程叫路由 TCP传输 一般在1--1024端口 必须连接以后才能传输数据 UDP协议通常只是发送数据 TCP连接 TCP需要建立连接才能通信&#xff0c;建立连接需要端口&#xff0c;Sock…

怎么用PS的魔术棒抠图?PS魔术棒抠图的操作方法

使用PS的魔术棒抠图教程&#xff1a; 1、首先&#xff0c;在ps界面上方点击“文件”选项&#xff0c;再在其弹出的选项栏中选择“打开”选项。然后&#xff0c;打开你所需要的图片。 2、然后&#xff0c;单击左侧的“魔术棒”工具。 3、然后&#xff0c;用鼠标点击图片的背景&…

建议收藏!独立站新手容易踩的5个坑,你中了吗?

接过很多独立站商户咨询&#xff0c;发现大家很容易踩几个坑&#xff0c;也是大家问的比较多的。 今天把印象最深的5个坑分享给大家&#xff0c;希望大家可以少踩坑&#xff0c;并且结合建议对以下几个方面进行优化&#xff0c;至少能保证你的独立站做到及格线上线&#xff01…

C++ 多态性——虚函数

虚函数是动态绑定的基础。虚函数必须是非静态的成员函数。虚函数经过派生之后&#xff0c;在类族中就可以实现运行过程的多态。 根据类型兼容规则&#xff0c;可以使用派生类的对象代替基类的对象。如果基类类型的指针指向派生类对象&#xff0c;就可以通过这个指针来访问该对…

mysql查询语句之实践篇

基础查询语句 完整语法格式如下&#xff1a; select 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定 -- 创建表 create table stu(id int,name varchar(20),chinese double,english double,math double ); --…

ATFX汇市:美联储年内或仍将加息依次,美指向下空间不大

环球汇市行情摘要—— 昨日&#xff0c;美元指数上涨0.08%&#xff0c;收盘在102.08点&#xff0c; 欧元贬值0.07%&#xff0c;收盘价1.1003点&#xff1b; 日元贬值0.51%&#xff0c;收盘价142.47点&#xff1b; 英镑升值0.28%&#xff0c;收盘价1.2784点&#xff1b; 瑞…

NPM包的安装、更新、卸载

目录 1、下载安装全局包 2、解决全局安装包时的EACCES权限错误 2.1 重新安装NPM 2.2 手动更改npm的默认目录 3、更新从注册表下载的包 3.1 更新本地包 3.2 更新全局安装的软件包 3.3 确定哪些全局包需要更新 3.4 更新单个全局包 3.5 更新所有全局安装的软件包 4、在项…

Zabbix监控系统详解及配置

前言 作为一个运维&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去了解上线发布的结果&#xff0c;和网站的健康状态。利用一个优秀的监控软件&#xff0c;我们可以&#xff1a; 通过一个友好的界面进行浏览整个网站所有的服务…

实战项目ssm权限系统 2-自定义springsecurity组件实现认证授权

一 springsecurity 作用 1.1 springsecurity Spring security是spring家族的一个安全性框架&#xff0c;主要是用来进行用户认证(Authentication)和用户授权(Authorization)的框架。 用户认证&#xff1a;验证用户登录是否合法 用户授权&#xff1a;登录成功后用户具有哪些…