Files
xdd-uniapp-new/v4/views/luck/luck.vue
T

383 lines
8.9 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="luck-view">
<image class="bg-luck" :src="webUrl+'/20220210153759193846.png'" mode="scaleToFill"></image>
<image class="btn-log" :src="webUrl+'/20220210142514268256.png'" mode="scaleToFill" @click="goLogs"></image>
<image class="dialog" :src="webUrl+'/20220210142530967881.png'" mode="scaleToFill" v-if="newRecords.length>0">
</image>
<view class="dialog" v-if="newRecords.length>0">
<swiper :indicator-dots="false" :autoplay="true" :interval="5000" :duration="1000" circular>
<swiper-item v-for="item in newRecords" :key="item">
<view class="acea-row row-middle">
<image class="avatar" :src="item.avatar" mode="scaleToFill"></image>
<text>恭喜{{ item.username }}获得{{ item.prizeName }}</text>
</view>
</swiper-item>
</swiper>
</view>
<!-- 大转盘抽奖 -->
<view class="wheel-box" v-show="!isDialog">
</view>
<image class="btn-tip" :src="webUrl+'/20220210142525648150.png'" mode="scaleToFill" v-if="lotteryInfo"></image>
<view class="btn-tip acea-row row-center-wrapper" v-if="lotteryInfo">
<view>剩余
<text>{{ lotteryInfo.lotteryUserInfo.dayLimit }}</text>
次抽奖机会
</view>
<!-- <view>剩余<text>{{parseInt(lotteryInfo.lotteryUserInfo.lotteryPoints/lotteryInfo.singleCost)}}</text>次抽奖机会</view> -->
</view>
<view class="tip-box" v-html="lotteryInfo.description" v-if="lotteryInfo">
<!-- <view>1.每天有1次幸运大转盘的抽奖机会</view>
<view>2.每次抽奖需要消耗{{lotteryInfo.singleCost}}幸运币</view>
<view>3.抽中商品后可去个人中心页面查看订单详情</view> -->
</view>
<image class="btn-role" :src="webUrl+'/20220210142520109834.png'" mode="scaleToFill"></image>
<cover-view class="result-mark" v-if="isDialog">
<cover-view class="result-dialog flex flex-col ai-center">
<cover-image class="icon-close" :src="webUrl+'/20220610111928963051.png'" mode="scaleToFill"
@click="changeDialog(false)"/>
<cover-view class="title">恭喜您中奖啦</cover-view>
<cover-image class="cover" :src="result.imgs[0].src" mode="scaleToFill"/>
<cover-view class="name">获得的是{{ result.fonts[0].text }}</cover-view>
<button class="btn-fetch" type="default" @click="goReceive">去领取</button>
<button class="btn-close" type="default" @click="changeDialog(false)">关闭</button>
</cover-view>
</cover-view>
</view>
</template>
<script>
import {draw, getLotteryInfo, getLotteryRecordsNew} from "@/api/luck.js";
export default {
data() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
blocks: [],
buttons: [],
prizes: [],
defaultConfig: {
stopRange: 0.5
},
lotteryId: null,
newRecords: [],
lotteryInfo: null,
isDialog: false,
result: {},
lotteryRecordId: null, //抽奖记录ID
hitIndex: 0,
isWait: false
}
},
onLoad() {
this.getLuck();
this.blocks = [{
imgs: [{
src: this.webUrl + '/20220210142536583482.png',
width: '100%',
height: '100%'
}]
}]
this.buttons = [{
radius: '50%',
imgs: [{
src: this.webUrl + '/20220210142504244580.png',
width: '177rpx',
top: '-65%'
}]
}]
},
methods: {
changeDialog(state){
this.isDialog=state
},
// 初始化
getLuck() {
getLotteryInfo().then(({
data
}) => {
this.lotteryId = data.id;
this.lotteryInfo = data;
// 处理奖品数据
let len = this.lotteryInfo.prizeList.length;
let temp;
for (let i = 0; i < len; i++) {
temp = {
imgs: [{
src: this.lotteryInfo.prizeList[i].image,
width: "80rpx",
height: "80rpx",
top: "85%"
}],
fonts: [{
text: this.lotteryInfo.prizeList[i].name,
top: '50%',
fontSize: '28rpx'
}]
}
this.$set(this.prizes, i, temp)
}
getLotteryRecordsNew(this.lotteryId).then(({
data
}) => this.newRecords = data);
})
},
// 跳转奖品记录
goLogs() {
this.$yrouter.push('/v4/views/luck/logs?id=' + this.lotteryId);
},
// 点击抽奖按钮触发回调
startCallBack() {
let that = this;
if (this.isWait) return;
this.isWait = true;
if (this.lotteryId == null) {
uni.showToast({
title: "无抽奖活动",
icon: 'none'
})
return;
}
draw(this.lotteryId).then(res => {
if (res.success) {
that.lotteryRecordId = res.data.id;
let surplus = that.lotteryInfo.lotteryUserInfo.dayLimit - 1;
if (surplus > -1) {
that.$set(that.lotteryInfo.lotteryUserInfo, "dayLimit", surplus)
}
for (let i = 0, len = that.lotteryInfo.prizeList.length; i < len; i++) {
if (res.data.prizeId == that.lotteryInfo.prizeList[i].id) {
that.hitIndex = i;
break;
}
}
// 先开始旋转
that.$refs.myLucky.play()
that.isHit = res.data.isHit;
// 使用定时器来模拟请求接口
setTimeout(() => {
// 调用stop停止旋转并传递中奖索引
if (res.data.prizeId == null) that.hitIndex = -1;
that.$refs.myLucky.stop(that.hitIndex)
}, 3000)
} else {
that.isWait = false;
uni.showToast({
title: res.msg,
icon: "none",
duration: 3000
});
}
}).catch(err => {
that.isWait = false;
uni.showToast({
title: err.msg,
icon: "none",
duration: 3000
});
})
},
// 抽奖结束触发回调
endCallBack(prize) {
// 奖品详情
console.log(prize)
this.result = prize;
this.isWait = false;
if (this.lotteryInfo.prizeList[this.hitIndex].name == "谢谢参与") {
uni.showToast({
title: "别灰心,好运一定会来",
icon: "none",
duration: 3000
});
return
}
this.isDialog = true;
},
goReceive() {
this.isDialog = false;
uni.navigateTo({
url: "receive?id=" + this.lotteryRecordId
})
}
}
}
</script>
<style scoped lang="scss">
image {
vertical-align: middle;
}
.luck-view {
position: relative;
}
.bg-luck {
width: 750rpx;
height: 1523rpx;
}
.btn-log {
width: 109rpx;
height: 49rpx;
position: absolute;
top: 18rpx;
right: 0;
}
.dialog {
width: 521rpx;
height: 111rpx;
position: absolute;
top: 240rpx;
left: 114.5rpx;
font-size: 24rpx;
color: #fff;
.acea-row {
margin-top: 27rpx;
margin-left: 22rpx;
}
.avatar {
width: 36rpx;
height: 36rpx;
margin-right: 20rpx;
background: #FFBEBE;
border-radius: 50%;
}
}
.wheel-box {
position: absolute;
top: 352rpx;
left: 65rpx;
}
.btn-tip {
width: 372rpx;
height: 61rpx;
position: absolute;
top: 1014rpx;
left: 189rpx;
font-size: 24rpx;
color: #fff;
text {
font-size: 40rpx;
}
}
.tip-box {
width: 670rpx;
height: 290rpx;
position: absolute;
bottom: 90rpx;
left: 40rpx;
box-sizing: border-box;
padding: 46rpx 30rpx 30rpx;
border: 4rpx solid #E69F42;
border-radius: 32rpx;
background: #fff;
font-size: 30rpx;
line-height: 1.5;
overflow-y: auto;
}
.btn-role {
width: 156rpx;
height: 60rpx;
position: absolute;
bottom: 363rpx;
left: 92rpx;
}
.result-mark {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: rgba(51, 51, 51, 0.39);
overflow: hidden;
}
.result-dialog {
position: absolute;
top: 300rpx;
left: 50%;
transform: translate(-50%, 0);
width: 458rpx;
height: 560rpx;
border-radius: 20rpx;
background: #FFF5DB;
.icon-close {
position: absolute;
top: 20rpx;
right: 26rpx;
width: 26rpx;
height: 26rpx;
}
.title {
margin-top: 40rpx;
font-size: 34rpx;
font-weight: bold;
line-height: 50rpx;
color: #FF0000;
}
.cover {
width: 240rpx;
height: 240rpx;
vertical-align: middle;
margin: 15rpx 0;
border-radius: 15rpx;
}
.name {
font-size: 24rpx;
line-height: 34rpx;
color: #333333;
}
button::after {
border: none;
}
.btn-fetch {
width: 176rpx;
height: 60rpx;
line-height: 60rpx;
margin-top: 28rpx;
border-radius: 30rpx;
background: #FD685D;
color: #fff;
font-size: 28rpx;
}
.btn-close {
height: 34rpx;
line-height: 34rpx;
margin-top: 12rpx;
font-size: 24rpx;
color: #D6BA70;
}
}
</style>