java-mall-app/activity/luckydraw/detail.vue
2024-11-01 16:35:40 +08:00

816 lines
17 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>
<block v-if="(isPage)">
<view class="m-draw-box" v-if="outdated">
<view class="m-title">
<view class="m-title-main">{{DrawInfo.activity_title}}</view>
<view class="m-title-sub">{{__('幸运大抽奖')}}</view>
<view class="m-title-time">{{DrawInfo.activity_starttime}} ~ {{DrawInfo.activity_endtime}}</view>
</view>
<view class="m-table">
<view v-for="(item, i) in PrizeList" :key="i" :class="['m-table-td', (i+1)==index?'select-table':'']">
<image :src="item.awards_image"></image>
<view class="price-text">{{item.awards_name}}</view>
</view>
<view class="m-table-btn" @tap="LuckDraw">
<image src="https://static.lancerdt.com/xcxfile/appicon/activity/click.png"></image>
</view>
</view>
<view class="m-tip">{{__('您还有')}}<label>{{RemainingCount}}{{__('次')}}</label>{{__('抽奖机会,快来试试手气')}}</view>
<view class="m-model-outline">
<view class="m-model yellow">{{__('中奖名单')}}</view>
</view>
<block v-if="DrawInfo.winner_rows.items.length >0">
<swiper autoplay="true" interval="4000" duration="2000" class="m-luckylist" vertical="false" circular="true">
<swiper-item v-for="(t_item, i) in rows" :key="i">
<block v-for="(item, j) in DrawInfo.winner_rows.items" :key="j">
<view v-if="j>=(i*3) && j<=((i+1)*3)" class="m-luckylist-item">
• {{item.user_nickname}}{{__('抽中')}}
<label>{{item.awards_name}}</label>
</view>
</block>
</swiper-item>
</swiper>
</block>
<view class="m-winner-nothing" v-else>{{__('暂无中奖名单数据')}}</view>
<view class="m-model-outline">
<view class="m-model blue">{{__('活动规则')}}</view>
</view>
<view class="m-rule">
<wxParse :content="DrawInfo.activity_rule.activity_intro + ''" />
</view>
</view>
<view class="activity-outdated" v-else>
<view class="m-nullcontent">
<view class="m-nullpage-middle">
<label class="iconfont icon-meiyougengduo"></label>
<view class="m-null-tip">
<text>{{__('亲~您来晚了哦')}}</text>
<text>{{__('该抽奖活动已经失效啦')}}~</text>
</view>
</view>
</view>
</view>
</block>
<view class="u-tap-btn">
<navigator url="/member/member/prize?category=1" class="u-go-home">
<view class="iconfont icon-iconcanjiahuodong01"></view>
</navigator>
<view class="red-dot"></view>
<navigator url="/pages/index/index" open-type="switchTab" class="u-go-home">
<view class="iconfont icon-shouyeshouye" style="font-size:50rpx;"></view>
</navigator>
</view>
<view class="mskprize" v-if="clickmsk" @tap="cancelprize">
<view class="m-result-box bounceIn animated" catchtap="nothing" v-if="PrizeResult.index >= 0">
<view class="m-result-cancel" @tap="cancelprize">✕</view>
<block v-if="PrizeResult.awards_enable">
<view class="m-success-text">{{__('恭喜你获得了')}}</view>
</block>
<block v-if="!PrizeResult.awards_enable">
<view class="m-success-text">{{__('未中奖')}}</view>
</block>
<image :src="PrizeList[PrizeResult.index].awards_image" class="m-success-img" />
<view class="m-success-name">{{PrizeResult.prize}}</view>
<view class="m-success-name" v-if="false">{{PrizeResult.PrizeSendingMessage}}</view>
<view class="m-success-bottom">
<navigator url="/member/member/prize?category=1" class="succes-checkprice">{{__('查看奖品')}}</navigator>
<view class="succes-continue" @tap="cancelprize">{{__('继续抽奖')}}</view>
</view>
</view>
<view class="m-result-box wobble animated" catchtap="nothing" v-else>
<view class="m-result-cancel" @tap="cancelprize">✕</view>
<view class="m-failimg-bg">
<image src="https://static.lancerdt.com/xcxfile/appicon/nothing.png" class="m-fail-img" />
</view>
<view class="m-fail-name">{{DrawInfo.LosingDesc}}</view>
<view class="m-fail-button" @tap="cancelprize">{{__('继续抽奖')}}</view>
</view>
</view>
<view class="mskshare" v-if="clickshare" @tap="cancelshare">
<!-- <image src="../../assets/share.png" class="share-oncemore" mode="widthFix"></image> -->
<view class="share-text">
<view>{{__('你今天已经没有抽奖机会了')}}</view>
</view>
</view>
</view>
</template>
<script>
import $ from "../../helpers/util";
import dayCountdown from "../../components/day-countdown.vue";
import wxParse from '@/components/u-parse/u-parse.vue'
import {
mapState,
mapMutations
} from 'vuex'
export default {
data: function() {
return {
options: {},
index: -1,
count: 13,
timer: 0,
speed: 20,
times: 0,
cycle: 50,
prize: -1,
click: false,
clickmsk: false,
clickshare: false,
drawdesc: [],
PrizeList: [],
DrawInfo: {},
RemainingCount: 0,
PrizeResult: {},
rows: [],
Coupons: [],
isCancelSuccess: true,
isCancel: true,
CouponAmount: 0,
IsNewUser: 0,
isPage: false,
outdated: false,
activity_id: false
}
},
components: {
dayCountdown,
wxParse
},
computed: mapState(['Config', 'StateCode', 'notice', 'plantformInfo', 'shopInfo', 'userInfo', 'hasLogin']),
onLoad: function(options) {
let that = this;
uni.setNavigationBarTitle({
title: this.__('幸运大抽奖')
});
that.setData({
activity_id: options.activity_id || 0,
options: options
});
$.isNull(this.userInfo) ? this.getUserInfo(function() {
that.setData({
user_is_new: this.userInfo.user_is_new,
CouponAmount: this.userInfo.CouponAmount
}), that.initData()
},
options.uid) : that.initData()
},
onShareAppMessage: function() {
var e = this;
return this.setData({
clickshare: false,
click: false
}), {
title: e.__("我已经中奖啦,你也赶紧来抽奖吧~"),
desc: e.__("幸运大抽奖,快来参与吧~"),
path: "/activity/luckydraw/detail?uid=" + this.userInfo.user_id,
success: function(t) {
e.sharefriend()
}
}
},
methods: {
...mapMutations(['login', 'logout', 'getPlantformInfo', 'forceUserInfo', 'getUserInfo']),
sharefriend: function() {
var e = {
Category: 1,
activity_id: this.activity_id
},
t = this;
$.request($.makeUrl(activityapi.ShareLuckyDraw, e), function(e) {
e.Code == 0 && e.Info != null && (t.setData({
RemainingCount: t.RemainingCount
}), t.initData())
})
},
initData: function() {
// 2砸金蛋1大转盘
var params = {
activity_type: 1,
activity_type_id: this.StateCode.ACTIVITY_TYPE_LOTTERY,
activity_id: this.activity_id
},
that = this;
// 等级规则
$.request({
url: this.Config.URL.user.listsLottery,
data: params,
success: function(data, status, msg, code) {
that.setData({
isPage: true
});
if (status == 200) {
that.setData({
DrawInfo: data,
RemainingCount: data.remaining_count,
outdated: data.outdated,
PrizeList: data.items,
activity_id: data.activity_id
});
if (that.DrawInfo.winner_rows.items.length > 0) {
var n = that.DrawInfo.winner_rows.items.length % 5 > 0 ? parseInt(that.DrawInfo.winner_rows.items.length / 5 + 1) : that.DrawInfo.winner_rows.items.length / 5,
r = [];
for (var i = 0; i < n; i++) {
r.push(i);
}
that.setData({
rows: r
})
}
$.isNull(data.activity_rule.activity_intro);
} else {
that.setData({
outdated: false
})
}
}
});
},
getPosition: function() {
var params = {
activity_id: this.activity_id
};
var that = this;
// 等级规则
$.request({
url: this.Config.URL.user.doLottery,
data: params,
success: function(data, status, msg, code) {
if (status == 200) {
if (typeof data !== 'string') {
(that.setData({
prize: data.index,
PrizeResult: data
}), that.roll());
} else {
that.setData({
prize: -1,
times: 0,
click: false
});
that.roll()
}
} else {
that.setData({
prize: -1,
times: 0,
click: false
});
that.roll()
}
}
});
},
LuckDraw: function() {
this.click || (this.setData({
speed: 100,
click: true
}), this.RemainingCount > 0 ? this.getPosition() : this.RemainingCount == 0 && this.setData({
clickshare: true
}))
},
luckRoll: function() {
var e = this.index,
t = this.count;
e += 1, e > t - 1 && (e = 0), this.setData({
index: e
})
},
roll: function() {
this.setData({
times: this.times + 1
}), this.luckRoll();
if (this.times > this.cycle + 10 && this.prize == this.index) {
if (this.prize == this.index) {
clearTimeout(this.timer), this.setData({
prize: -1,
times: 0,
click: false
}), this.initData();
var e = this;
setTimeout(function() {
e.setData({
clickmsk: true
})
},
800)
}
} else {
//未中奖的提示【异常】
if (this.prize == -1) {
clearTimeout(this.timer), this.setData({
prize: -1,
times: 0,
click: false
}), this.initData();
var e = this;
setTimeout(function() {
e.setData({
clickmsk: true
})
},
800)
} else {
if (this.times < this.cycle) {
this.setData({
speed: this.speed - 10
});
} else if (this.times == this.cycle) {
var t = this.prize + 1;
this.setData({
prize: t
})
} else {
this.times > this.cycle + 10 && (this.prize == 0 && this.index == 7 || this.prize == this.index + 1) ? this.setData({
speed: this.speed + 110
}) : this.setData({
speed: this.speed + 20
});
}
this.speed < 40 && this.setData({
speed: this.speed + 40
});
var e = this;
this.timer = setTimeout(function() {
e.roll()
},
e.speed)
}
}
return false
},
cancelprize: function() {
this.setData({
clickmsk: false
})
},
cancelshare: function() {
this.setData({
clickshare: false
}), this.setData({
prize: -1,
times: 0,
click: false
})
},
nothing: function() {},
doReceive: function() {
this.cancel(), this.userReceiveCoupon()
},
cancel: function() {
this.setData({
isCancel: false
})
},
cancelsuccess: function() {
this.setData({
isCancelSuccess: true
})
},
innertouch: function() {},
userReceiveCoupon: function() {
var params = {
activity_id: this.activity_id,
activity_type: 1,
activity_type_id: this.StateCode.ACTIVITY_TYPE_LOTTERY
};
var that = this;
$.request({
url: this.Config.URL.user.listsLotteryHistory,
data: params,
success: function(data, status, msg, code) {
if (status == 200) {
that.setData({
isCancelSuccess: false,
Coupons: data.items
});
} else {
$.alert(msg);
}
}
});
}
}
};
</script>
<style lang="scss">
@import "../../styles/_variables";
page {
background-color: #292438;
font-family: -apple-system-font, Helvetica Neue, Helvetica, sans-serif;
}
.activity-outdated {
position: absolute;
width: 100%;
height: 100%;
background: #f8f8f8;
}
.m-draw-box {
height: 1940rpx;
background: url(https://static.lancerdt.com/xcxfile/appicon/luckdraw_bg.png) center no-repeat;
background-size: cover;
padding: 42rpx;
text-align: center;
color: white;
}
.m-title {
margin-top: 40rpx;
}
.m-title-main {
font-size: 80rpx;
font-weight: bold;
line-height: 90rpx;
height: 90rpx;
overflow: hidden;
}
.m-title-sub {
font-size: 60rpx;
font-weight: bold;
line-height: 70rpx;
}
.m-title-time {
font-size: 22rpx;
line-height: 40rpx;
}
/**抽奖盒子**/
.m-table {
position: relative;
width: 666rpx;
height: 666rpx;
margin-top: 30rpx;
}
.m-table-td {
width: 144rpx;
height: 144rpx;
position: absolute;
border-radius: 8rpx;
background: white;
left: 0;
top: 0;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
}
.price-text {
color: gray;
font-size: 24rpx;
overflow: hidden;
height: 28rpx;
line-height: 28rpx;
}
.m-table-td image {
width: 60%;
height: 60%;
box-sizing: border-box;
margin: 10rpx;
}
.m-table-td:nth-child(2) {
margin-left: 174rpx;
}
.m-table-td:nth-child(3) {
margin-left: 348rpx;
}
.m-table-td:nth-child(4) {
margin-left: 522rpx;
}
.m-table-td:nth-child(5) {
margin-top: 174rpx;
left: 522rpx;
}
.m-table-td:nth-child(6) {
margin-top: 348rpx;
left: 522rpx;
}
.m-table-td:nth-child(7) {
margin-top: 522rpx;
left: 522rpx;
bottom: 0;
}
.m-table-td:nth-child(8) {
margin-top: 522rpx;
left: 348rpx;
bottom: 0;
}
.m-table-td:nth-child(9) {
margin-top: 522rpx;
left: 174rpx;
bottom: 0;
}
.m-table-td:nth-child(10) {
margin-top: 522rpx;
bottom: 0;
}
.m-table-td:nth-child(11) {
margin-top: 348rpx;
}
.m-table-td:nth-child(12) {
margin-top: 174rpx;
}
.m-table-btn image {
width: 318rpx;
height: 318rpx;
border-radius: 20rpx;
position: absolute;
left: 174rpx;
top: 174rpx;
background: #FFDC44;
padding: 50rpx;
box-sizing: border-box;
border: 10rpx;
border-style: solid;
border-top-color: #FFF068;
border-bottom-color: #FFC61F;
border-left-color: #FFC61F;
border-right-color: #FFDC44;
}
.select-table {
background-color: #FFAC33;
}
/**抽奖盒子**/
.m-tip {
font-size: 24rpx;
line-height: 90rpx;
}
.m-tip label {
color: #FFDC44;
}
.m-model-outline {
width: 320rpx;
height: 65rpx;
margin: 0 auto;
border-bottom: 1px dotted white;
margin-top: 70rpx;
border-radius: 33rpx;
}
.m-model {
height: 60rpx;
line-height: 60rpx;
border-radius: 30rpx;
font-size: 32rpx;
font-weight: bold;
}
.yellow {
background: #FFAC33;
}
.m-luckylist {
font-size: 26rpx;
text-align: left;
margin-top: 40rpx;
max-height: 240rpx;
overflow: hidden;
}
.m-luckylist-item {
line-height: 80rpx;
border-top: 1rpx dotted white;
box-sizing: border-box;
height: 80rpx;
}
.m-luckylist-item label {
color: #FFDC44;
}
.m-winner-nothing {
text-align: left;
font-size: 26rpx;
padding: 30rpx 0;
}
.blue {
background: #43C4E9;
}
.m-rule {
font-size: 26rpx;
line-height: 40rpx;
text-align: left;
margin-top: 30rpx;
}
.mskprize {
position: fixed;
height: 100%;
width: 100%;
background-color: rgba(0, 0, 0, 0.70);
z-index: 5;
top: 0;
left: 0;
display: flex;
justify-content: center;
align-items: center;
color: white;
text-align: center;
}
.mskshare {
position: fixed;
height: 100%;
width: 100%;
background-color: rgba(0, 0, 0, 0.70);
z-index: 5;
top: 0;
left: 0;
}
.share-oncemore {
width: 700rpx;
margin: 0 auto;
}
.share-text {
margin: 0 auto;
font-size: 40rpx;
line-height: 80rpx;
color: white;
text-align: center;
margin-top: 45%
}
.m-result-box {
width: 500rpx;
height: 600rpx;
background: #DB384B;
position: relative;
border-radius: 20rpx;
}
.m-result-cancel {
position: absolute;
right: 25rpx;
top: 15rpx;
font-size: 36rpx;
}
.m-success-text {
line-height: 80rpx;
margin-top: 50rpx;
font-size: 30rpx;
}
.m-success-img {
width: 250rpx;
height: 250rpx;
background: white;
margin: 0 auto;
}
.m-success-name {
color: #FFAC33;
font-size: 26rpx;
line-height: 50rpx;
}
.m-success-bottom {
position: absolute;
bottom: 40rpx;
line-height: 65rpx;
font-size: 28rpx;
display: flex;
justify-content: center;
width: 100%;
}
.succes-continue {
height: 65rpx;
width: 200rpx;
background: #FFCA3A;
display: inline-block;
border-radius: 5rpx;
}
.succes-checkprice {
height: 65rpx;
width: 200rpx;
background: white;
color: black;
display: inline-block;
border-radius: 5rpx;
margin-right: 30rpx;
}
.m-failimg-bg {
width: 350rpx;
height: 350rpx;
border-radius: 175rpx;
background-color: rgba(255, 255, 255, 0.10);
margin: 40rpx auto 20rpx;
padding: 50rpx;
box-sizing: border-box;
}
.m-fail-img {
width: 100%;
height: 100%;
border-radius: 150rpx;
background-color: rgba(255, 255, 255, 0.20);
}
.m-fail-name {
font-size: 26rpx;
line-height: 50rpx;
}
.m-fail-button {
width: 300rpx;
height: 65rpx;
line-height: 65rpx;
position: absolute;
bottom: 40rpx;
background: #FFCA3A;
border-radius: 5rpx;
font-size: 28rpx;
left: 100rpx;
}
.red-dot {
width: 20rpx;
height: 20rpx;
border-radius: 10rpx;
background: $default-skin-bg;
position: fixed;
bottom: 220rpx;
right: 20rpx;
z-index: 5;
}
.u-tap-btn {
position: fixed;
right: 20rpx;
bottom: 40rpx;
}
.u-go-home {
border-radius: 100%;
width: 80rpx;
height: 80rpx;
border: 1px solid #eee;
font-size: 20rpx;
text-align: center;
background-color: #fff;
box-shadow: 0px 4rpx 8rpx rgba(0, 0, 0, 0.35);
z-index: 2;
opacity: 0.8;
line-height: 80rpx;
margin-bottom: 20rpx;
}
.u-go-home .iconfont {
font-size: 36rpx;
}
</style>