You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
high-mini/subPages/lottery/lottery.vue

400 lines
9.4 KiB

<template>
<view class="almost-lottery">
<!-- head -->
<image src="../static/head.jpg" mode="widthFix" class="width100"></image>
<view class="almost-lottery__wheel">
<AlmostLottery :lottery-size="lotteryConfig.lotterySize" :action-size="lotteryConfig.actionSize"
:ring-count="2" :duration="5" :prize-list="prizeList" :prize-index="prizeIndex"
@reset-index="prizeIndex = -1" @draw-start="handleDrawStart" @draw-end="handleDrawEnd"
@finish="handleDrawFinish" v-if="prizeList.length" />
</view>
<view class="almost-lottery__rule">
<view class="_notice">
<swiper class="_swiper tc" indicator-dots="false" autoplay="true" :interval="interval" circular="true"
display-multiple-items="2" :duration="duration">
<swiper-item>
<view class="swiper-item uni-bg-red"></view>
</swiper-item>
<swiper-item>
<view class="swiper-item uni-bg-red"></view>
</swiper-item>
<swiper-item v-for="(item,index) in list" :key="index">
<view class="swiper-item uni-bg-red">恭喜{{item.phone}}获得{{item.awardName}}</view>
</swiper-item>
</swiper>
</view>
<view class="font14 fotct mart10 marb10">拥有{{ LotteryNum }}次抽奖机会</view>
<view class="rule-head">
<view class="line"></view>
<text class="title">活动规则</text>
<view class="line"></view>
</view>
<view class="rule-body">
<view class="item">
<rich-text class="text font14" :nodes="activityInfo"></rich-text>
</view>
</view>
</view>
</view>
</template>
<script>
import AlmostLottery from '../../uni_modules/almost-lottery/components/almost-lottery/almost-lottery.vue'
import {
getActivityByCoupon,
userLottery,
getUserLotteryNum,
getWinLotteryList
} from '../../Utils/Api.js';
let app = getApp();
export default {
name: 'Home',
components: {
AlmostLottery
},
data() {
return {
imageUrl: app.globalData.imgUrl,
//活动id
activityId : '',
//获取中间参数
userLotteryId:'',
//抽奖次数
LotteryNum:'',
//活动描述
activityInfo:'',
//卡券id
couponId:'',
// 开启调试模式
isDev: true,
background: ['color1', 'color2', 'color3'],
indicatorDots: false,
autoplay: true,
interval: 2000,
duration: 500,
// 以下是转盘配置相关数据
lotteryConfig: {
// 抽奖转盘的整体尺寸,单位rpx
lotterySize: 600,
// 抽奖按钮的尺寸,单位rpx
actionSize: 200
},
// 以下是转盘 UI 配置
// 转盘外环图
lotteryBg: 'https://raw.githubusercontent.com/ialmost/almost-components_uniapp/dev/Lottery/almost-lottery_sample/static/lottery-bg.png',
// 抽奖按钮图
actionBg: 'https://raw.githubusercontent.com/ialmost/almost-components_uniapp/dev/Lottery/almost-lottery_sample/static/action-bg.png',
// 以下是奖品配置数据
// 奖品数据
prizeList: [],
// 奖品是否设有库存
onStock: true,
// 中奖下标
prizeIndex: -1,
// 是否正在抽奖中,避免重复触发
prizeing: false,
// 以下为中奖概率有关数据
// 是否由前端控制概率,默认不开启,强烈建议由后端控制
onFrontend: false,
// 权重随机数的最大值
prizeWeightMax: 0,
// 权重数组
prizeWeightArr: [],
// 以下为业务需求有关示例数据
// 金币余额
goldCoin: 600,
// 当日免费抽奖次数余额
freeNum: 3,
// 每次消耗的金币数
goldNum: 20,
// 每天免费抽奖次数
freeNumDay: 3,
interval: 3000,
duration: 12000,
list: []
}
},
computed: {
isApple() {
return uni.getSystemInfoSync().platform === 'ios'
}
},
methods: {
changeIndicatorDots(e) {
this.indicatorDots = !this.indicatorDots
},
changeAutoplay(e) {
this.autoplay = !this.autoplay
},
intervalChange(e) {
this.interval = e.target.value
},
durationChange(e) {
this.duration = e.target.value
},
// 重新生成
handleInitCanvas() {
this.prizeList = []
this.getActivityByCoupon()
},
// 获取中奖奖品
userLottery() {
let params = {
activityId: this.activityId
}
userLottery(params).then(res => {
if (res.return_code == '000000') {
this.userLotteryId = res.return_data.activityAwardId;
this.remoteGetPrizeIndex();
}
});
},
//中奖次数
getUserLotteryNum(){
let params = {
activityId: this.activityId
}
getUserLotteryNum(params).then(res => {
if (res.return_code == '000000') {
this.LotteryNum = res.return_data;
}
});
},
//中奖名单
getWinLotteryList(){
let params = {
activityId: this.activityId
}
getWinLotteryList(params).then(res => {
if (res.return_code == '000000') {
this.list = res.return_data;
}
});
},
// 获取奖品列表
getActivityByCoupon() {
uni.showLoading({
title: '奖品准备中...'
})
let params = {
couponId: this.couponId
}
getActivityByCoupon(params).then(res => {
if (res.return_code == '000000') {
let prizeLists = res.return_data.activityAward;
this.activityId = res.return_data.activityInfo.id;
let prizesList = [];
prizeLists.map((r) => {
const pris = new prizeListNew();
pris.prizeId = r.id;
pris.prizeImage = this.imageUrl + r.img;
pris.prizeName = r.name;
prizesList.push(pris);
})
this.activityInfo = this.transform(res.return_data.activityInfo.content);
this.prizeList = prizesList;
this.getUserLotteryNum();
this.getWinLotteryList();
}
});
},
//换行
transform(value){
value = value.replace(/\r\n/g, '<br/>');
value = value.replace(/\n/g, '<br/>');
return value;
},
// 本次抽奖开始
handleDrawStart() {
if(this.LotteryNum <= 0){
uni.showToast({
title: '当前抽奖次数不足',
icon: 'none',
duration: 2000
})
return;
}
this.userLottery();
},
// 远程请求接口获取中奖下标
// 大哥,这里只是模拟,别告诉我你不会对接自己的接口
remoteGetPrizeIndex() {
console.warn('###当前处于模拟的请求接口,并返回了中奖信息###')
// 模拟请求接口获取中奖信息
let stoTimer = setTimeout(() => {
clearTimeout(stoTimer)
stoTimer = null
let list = [...this.prizeList]
// 这里随机产生的 prizeId 是模拟后端返回的 prizeId
let prizeId = this.userLotteryId;
// 拿到后端返回的 prizeId 后,开始循环比对得出那个中奖的数据
for (let i = 0; i < list.length; i++) {
let item = list[i]
if (item.prizeId === prizeId) {
// 中奖下标
this.prizeIndex = i
break
}
}
}, 200)
},
// 本次抽奖结束
handleDrawEnd() {
console.log('旋转结束,执行拿到结果后到逻辑')
// 旋转结束后,开始处理拿到结果后的逻辑
this.prizeing = false
let prizeName = this.prizeList[this.prizeIndex].prizeName
let tipContent = ''
// if (prizeName === '参与奖') {
// tipContent = '很遗憾,没有中奖,请再接再厉!'
// } else {
tipContent = `恭喜您,获得 "${prizeName} "!`
// }
this.getUserLotteryNum();
this.getWinLotteryList();
uni.showModal({
content: tipContent,
showCancel: false
})
},
// 抽奖转盘绘制完成
handleDrawFinish(res) {
console.log('抽奖转盘绘制完成', res)
uni.showToast({
title: res.msg,
mask: true,
icon: 'none'
})
}
},
onLoad(options) {
this.couponId = options.id
this.handleInitCanvas()
},
onUnload() {
uni.hideLoading()
}
}
export class prizeListNew {
prizeId = ''
prizeName = ''
prizeImage = ''
}
</script>
<style lang="scss" scoped>
._notice {
position: fixed;
left: 0;
top: 0;
/* #ifdef H5 */
top: 88upx;
/* #endif */
z-index: 9;
width: 100%;
background: rgba(72, 1, 1, 0.3);
font-size: 20upx;
height: 44upx;
color: #ffffff;
border-radius: 6upx;
overflow: hidden;
box-sizing: border-box;
}
._swiper {
line-height: 44upx;
}
.almost-lottery {
flex: 1;
background-color: #FF893F;
}
.almost-lottery__wheel {
margin-top: 30rpx;
text-align: center;
.almost-lottery__count {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
padding: 40rpx 0;
}
.text {
color: #FFFFFF;
font-size: 24rpx;
}
}
.almost-lottery__rule {
padding: 0 28rpx;
color: #FFF8CB;
.rule-head {
display: flex;
justify-content: space-around;
align-items: center;
margin: 40rpx 0;
.line {
flex: 1;
height: 1px;
background-color: #FFF3A5;
}
.title {
width: 280rpx;
color: #F63857;
line-height: 70rpx;
text-align: center;
margin: 0 20rpx;
border-radius: 8rpx;
background-image: linear-gradient(0deg, rgba(255, 242, 158, 1), rgba(255, 244, 168, 1));
}
}
.rule-body {
color: #FFF8CB;
font-size: 24rpx;
padding: 10rpx 0 40rpx;
.item {
display: flex;
margin-bottom: 10rpx;
}
.number {
position: relative;
top: 4rpx;
width: 28rpx;
height: 28rpx;
line-height: 28rpx;
text-align: center;
border-radius: 50%;
margin-right: 10rpx;
}
.text {
flex: 1;
margin-top: 1px;
}
.item-rule .text {
display: flex;
margin-top: 1px;
flex-direction: column;
}
}
}
</style>