if (this.frequency > 0) {
this.targetName = ''
let list = [...this.prizeList]
// 模拟请求
let stoTimer = setTimeout(() => {
clearTimeout(stoTimer)
stoTimer = null
// 判断是否由前端控制概率
// 前端控制概率的情况下,需要拿到最接近随机权重且大于随机权重的值
// 后端控制概率的情况下,通常会直接返回 prizeId
if (this.onFrontend) {
if (!this.weightTotal) {
// console.warn('###当前已开启前端控制中奖概率,但是奖品数据列表中的 weight 参数似乎配置不正确###')
return
}
// console.warn('###当前处于前端控制中奖概率,安全起见,强烈建议由后端控制###')
// console.log('当前权重总和为 =>', this.weightTotal)
// 注意这里使用了 Math.ceil,如果某个权重的值为 0,则始终无法中奖
let weight = Math.ceil(Math.random() * this.weightTotal)
// console.log('本次权重随机数 =>', weight)
// 生成大于等于随机权重的数组
let tempMaxArrs = []
list.forEach((item) => {
if (item.weight >= weight) {
tempMaxArrs.push(item.weight)
}
})
// 如果大于随机权重的数组有值,先对这个数组排序然后取值
// 反之新建一个临时的包含所有权重的已排序数组,然后取值
if (tempMaxArrs.length) {
tempMaxArrs.sort((a, b) => a - b)
this.prizeIndex = this.weightArr.indexOf(tempMaxArrs[0])
} else {
let tempWeightArr = [...this.weightArr]
tempWeightArr.sort((a, b) => a - b)
this.prizeIndex = this.weightArr.indexOf(tempWeightArr[tempWeightArr.length - 1])
}
} else {
// console.warn('###当前处于模拟的随机中奖概率,实际场景中,中奖概率应由后端控制###')
// 这里随机产生的 prizeId 是模拟后端返回的 prizeId
let prizeId = Math.floor(Math.random() * list.length + 1)
list.forEach((item, index) => {
if (item.prizeId === prizeId) {
// 中奖下标
this.prizeIndex = index
}
})
}
// console.log(this.prizeIndex)
// console.log('本次抽中奖品 =>', this.prizeList[this.prizeIndex].name)
if (this.onStock) {
console.log('本次奖品库存 =>', this.prizeList[this.prizeIndex].stock)
}
// 提交抽奖结果
uni.request({
url: 'http://192.168.100.74/checkIn/addTurntableRecord',
method:'POST',
data: {
userid: this.userId,
size: this.prizeList[this.prizeIndex].size,
turntableInfo: this.prizeList[this.prizeIndex].name
},
success: (res) => {
if(res.data.code!=1) {
uni.showToast({
title:res.data.errinsg,
duration: 2000,
mask: true,
icon: 'none'
})
}
}
})
}, 200);
this.frequency--;
console.log(this.frequency)
} else {
if (this.look==0) {
uni.showToast({
title: "您的抽奖次数为0,欢迎下次再来",
duration: 2000,
mask: true,
icon: 'none'
})
}
}
},
// 本次抽奖结束
handleDrawEnd() {
// 旋转结束后,可以执行拿到结果后的逻辑
let prizeName = this.prizeList[this.prizeIndex].name
// if (this.onStock) {
// let prizeStock = this.prizeList[this.prizeIndex].stock
// this.targetName = prizeName === '谢谢参与' ? prizeName : prizeStock ? `恭喜您,获得 ${prizeName}` : '很抱歉,您来晚了,当前奖品已无库存'
// }
this.targetName = prizeName === '谢谢参与' ? prizeName : `恭喜您,获得 ${prizeName}`;
if (this.frequency==0&&this.look>0) {
uni.showModal({
title: "看视频,获抽奖机会",
content: `${this.targetName },您的次数已用完,是否前往观看视频,获取抽奖机会,今日还有${this.look}次机会`,
success: function(res) {
if (res.confirm) {
console.log('用户点击确定');
this.look--;
// Window.android.onWatchVideos();
} else if (res.cancel) {
console.log('用户点击取消');
}
},
})
}else {
uni.showToast({
title: `${this.targetName},您还有${this.frequency}次机会`,
icon: 'none'
})
}
}```
4 个回复
雨夜敬清秋
把 draw-start 和 draw-end 这 2 个回调函数里你写的代码贴一下
1***@qq.com (作者)
雨夜敬清秋
frequency 和 look 都代表啥,看你代码,都是代表抽奖次数啊,只要示例项目正常,你添加任何业务上的需求,都不会影响到转盘的,还是仔细检查下自己代码逻辑吧
2020-12-09 10:29
1***@qq.com (作者)
frequency 是抽奖次数 look是看视频的次数 抽奖次数用完 就弹出是否去看视频 看视频可以获得抽奖次数
1***@qq.com (作者)
先不考虑其它逻辑 就是当次数为0的时候 他会弹出第一次 但是 当我再点击的时候 就会没反应 不应该继续弹出提示框 提醒没有次数了吗
雨夜敬清秋
已发版,请使用最新版本,示例项目也一并更新,感谢反馈!
2020-12-09 11:16
1***@qq.com (作者)
回复 雨夜敬清秋: 客气
2020-12-09 12:02