初始化代码
This commit is contained in:
570
uniapp/uni-app/shop/pages/luck.vue
Normal file
570
uniapp/uni-app/shop/pages/luck.vue
Normal file
@@ -0,0 +1,570 @@
|
||||
<template>
|
||||
<view class="shop-luck" v-if="isLoad">
|
||||
|
||||
<block v-if="detail.atv_id">
|
||||
<uni-nav-bar :fixed="true" :shadow="false" :statusBar="true" color="#fff"
|
||||
:backgroundColor="color == '#ffffff' ?``:primaryColor" leftIcon="icon-left"
|
||||
:title="color == '#ffffff' ?``:`积分抽奖`">
|
||||
</uni-nav-bar>
|
||||
<image mode="aspectFill" lazy-load class="luck-bg abs" :src="detail.cover"> </image>
|
||||
<view class="my-integral flex-center abs">
|
||||
<view class="flex-y-baseline">
|
||||
<view class="integral-num f-big-title icon-font-color mr-sm">{{detail.user_integral}}</view>
|
||||
<view class="f-title c-base">积分</view>
|
||||
</view>
|
||||
</view>
|
||||
<view @tap="$refs.show_rule_item.open()" class="rule-btn-info flex-center abs">
|
||||
<view class="rule-btn flex-center radius">
|
||||
<i class="iconfont icon-wenhao mr-sm"></i>
|
||||
规则说明
|
||||
</view>
|
||||
</view>
|
||||
<view @tap.stop="getList('record',1)" class="record-btn flex-center f-caption c-base abs">抽奖记录</view>
|
||||
<view class="luck-dialog-info flex-center abs">
|
||||
<view class="dialog-info" :style="'-webkit-transform:rotate(' + deg + 'deg) translateZ(0);transform:rotate(' + deg
|
||||
+ 'deg) translateZ(0)'">
|
||||
<image class="dialog-img" src="https://lbqny.migugu.com/admin/farm/luck-dialog.png"> </image>
|
||||
<view class="item-luck flex-center flex-column abs" :class="[`luck-${index}`]"
|
||||
v-for="(item,index) in detail.data" :key="index">
|
||||
<view class="flex-center f-icontext text-bold c-warning mb-sm">{{item.title}}</view>
|
||||
<image mode="aspectFill"
|
||||
:class="[{'thank-you-img':!item.is_luck},{'icon-img radius-10':item.is_luck}]"
|
||||
:src="item.icon || thank_you_img">
|
||||
</image>
|
||||
</view>
|
||||
</view>
|
||||
<image @tap="toLuck" class="pointer-img abs" src="https://lbqny.migugu.com/admin/farm/luck-pointer.png">
|
||||
</image>
|
||||
<view class="use-integral flex-center f-icontext c-base abs">{{`${detail.integral}积分`}}</view>
|
||||
</view>
|
||||
|
||||
<image class="num-img abs" src="https://lbqny.migugu.com/admin/farm/luck-num.png">
|
||||
</image>
|
||||
<view class="have-change abs flex-center f-caption c-base">还有<view class="num">{{detail.user_num}}次</view>
|
||||
抽奖机会
|
||||
</view>
|
||||
<view class="user-list abs">
|
||||
<image class="user-list-img abs" src="https://lbqny.migugu.com/admin/farm/luck-user-list.png">
|
||||
</image>
|
||||
<view class="title flex-center f-sm-title text-bold">中奖信息</view>
|
||||
<scroll-view scroll-y @scrolltolower="scrolltolower($event,'user')" :scroll-with-animation="true"
|
||||
lower-threshold="100" class="luck-user">
|
||||
<view class="mt-sm mb-sm" :style="{color:primaryColor}" v-for="(item,index) in list.user.data"
|
||||
:key="index">
|
||||
恭喜<span
|
||||
class="text ml-sm mr-sm">{{item.nickName.length > 5 ? `${item.nickName.substring(0,5)}...` : item.nickName}}</span>抽中了<span
|
||||
class="text ml-sm">
|
||||
{{item.type == 1? `1张卡券`:`${item.integral}积分`}}
|
||||
</span>
|
||||
</view>
|
||||
<view class="flex-center f-paragraph c-caption mt-sm" v-if="list.user.data.length ==0 ">
|
||||
暂无中奖信息,快来参加抽奖吧</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
<image class="squirrel-img abs" src="https://lbqny.migugu.com/admin/farm/squirrel.png">
|
||||
</image>
|
||||
</block>
|
||||
<block v-else>
|
||||
<uni-nav-bar :fixed="true" :shadow="false" :statusBar="true" color="#fff" :backgroundColor="primaryColor"
|
||||
leftIcon="icon-left" title="积分抽奖">
|
||||
</uni-nav-bar>
|
||||
<abnor></abnor>
|
||||
</block>
|
||||
<uni-popup ref="show_rule_item">
|
||||
<view class="popup-rule">
|
||||
<view class="rule-info pd-lg fill-base radius-24">
|
||||
<view class="flex-center f-title c-title text-bold">规则说明</view>
|
||||
<view class="rule-text mt-lg f-paragraph">
|
||||
<text decode="emsp" style="word-break:break-all;">{{detail.text}}</text>
|
||||
</view>
|
||||
</view>
|
||||
<i @tap="$refs.show_rule_item.close()" class="flex-center mt-lg iconfont icon-close c-base"></i>
|
||||
</view>
|
||||
</uni-popup>
|
||||
|
||||
<uni-popup ref="show_record_item" type="center" :custom="true">
|
||||
<view class="popup-record rel">
|
||||
<image class="record-img abs" src="https://lbqny.migugu.com/admin/farm/luck-record.png"></image>
|
||||
<view class="record-title flex-center f-lg-title text-bold c-base abs">我的抽奖纪录</view>
|
||||
<view class="record-content fill-base abs">
|
||||
<scroll-view scroll-y @scrolltolower="scrolltolower($event,'record')" :scroll-with-animation="true"
|
||||
lower-threshold="100" class="luck-record">
|
||||
<view class="flex-center pt-md pb-md b-1px-b" v-for="(item,index) in list.record.data"
|
||||
:key="index">
|
||||
<image mode="aspectFill" class="icon-img" :class="[{'radius-4':item.is_luck}]"
|
||||
:src="item.icon || thank_you_img"></image>
|
||||
<view class="flex-1 flex-between ml-sm">
|
||||
<view :style="{color:item.is_luck?primaryColor: '#777'}">
|
||||
{{!item.is_luck ? item.title : item.type == 1? `1张卡券`:`${item.integral}积分`}}
|
||||
</view>
|
||||
<view class="f-caption c-caption">{{item.create_time}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex-center f-paragraph c-caption mt-sm" v-if="list.record.data.length ==0 ">
|
||||
暂无抽奖记录,快来参加抽奖吧</view>
|
||||
</scroll-view>
|
||||
<view @tap.stop="$refs.show_record_item.close()"
|
||||
class="confirm-btn flex-center f-sm-title text-bold c-base radius"
|
||||
:style="{background:primaryColor}">确定</view>
|
||||
<view class="space-lg"></view>
|
||||
</view>
|
||||
</view>
|
||||
</uni-popup>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
mapState,
|
||||
} from "vuex"
|
||||
export default {
|
||||
components: {},
|
||||
data() {
|
||||
return {
|
||||
isLoad: false,
|
||||
options: {},
|
||||
color: '#ffffff',
|
||||
detail: {},
|
||||
param: {
|
||||
record: {
|
||||
page: 1
|
||||
},
|
||||
user: {
|
||||
page: 1
|
||||
}
|
||||
},
|
||||
list: {
|
||||
record: {
|
||||
data: []
|
||||
},
|
||||
user: {
|
||||
data: []
|
||||
}
|
||||
},
|
||||
loading: true,
|
||||
// 抽奖信息
|
||||
thank_you_img: 'https://lbqny.migugu.com/admin/farm/thank-you.png',
|
||||
luckInd: 0,
|
||||
areaNumber: 9, //划分区域
|
||||
speed: 16, //速度
|
||||
deg: 0,
|
||||
singleAngle: '', // 每片扇形的角度
|
||||
isStart: false
|
||||
}
|
||||
},
|
||||
computed: mapState({
|
||||
primaryColor: state => state.config.configInfo.primaryColor,
|
||||
subColor: state => state.config.configInfo.subColor,
|
||||
userInfo: state => state.user.userInfo,
|
||||
}),
|
||||
onLoad(options) {
|
||||
this.$util.showLoading()
|
||||
this.options = options
|
||||
this.initIndex()
|
||||
},
|
||||
onPageScroll(e) {
|
||||
let color = e.scrollTop < 20 ? '#ffffff' : '#000000'
|
||||
if (this.color == color) return
|
||||
this.color = color
|
||||
},
|
||||
methods: {
|
||||
async initIndex(refresh = false) {
|
||||
let {
|
||||
areaNumber
|
||||
} = this
|
||||
this.singleAngle = 360 / areaNumber
|
||||
await this.getDetail(refresh)
|
||||
this.isLoad = true
|
||||
},
|
||||
initRefresh() {
|
||||
this.initIndex(true)
|
||||
},
|
||||
async getDetail(refresh) {
|
||||
let data = await this.$api.shop.luckInfo()
|
||||
data.integral = parseInt(data.integral)
|
||||
this.detail = data
|
||||
if (refresh) {
|
||||
this.$util.hideAll()
|
||||
return
|
||||
}
|
||||
this.getList('user', 1)
|
||||
this.$util.hideAll()
|
||||
},
|
||||
async getList(type, page) {
|
||||
let {
|
||||
atv_id
|
||||
} = this.detail
|
||||
if (page) this.param[type].page = 1
|
||||
let param = this.param[type]
|
||||
param.id = atv_id
|
||||
let oldList = this.list[type]
|
||||
let methodModel = type == 'record' ? 'userLuckRecord' : 'luckRecord'
|
||||
let newList = await this.$api.shop[methodModel](param);
|
||||
if (this.param[type].page == 1) {
|
||||
this.list[type] = newList
|
||||
} else {
|
||||
newList.data = oldList.data.concat(newList.data)
|
||||
this.list[type] = newList
|
||||
}
|
||||
this.loading = false
|
||||
this.$util.hideAll()
|
||||
if (type == 'record') {
|
||||
this.$refs.show_record_item.open()
|
||||
}
|
||||
},
|
||||
scrolltolower(e, type) {
|
||||
if (this.list[type].current_page >= this.list[type].last_page || this.loading) return
|
||||
this.param[type].page = this.param[type].page + 1
|
||||
this.loading = true
|
||||
this.getList(type)
|
||||
},
|
||||
// 用户点击开始抽奖
|
||||
async toLuck() {
|
||||
let {
|
||||
atv_id,
|
||||
} = this.detail
|
||||
let {
|
||||
id
|
||||
} = await this.$api.shop.luckDraw({
|
||||
id: atv_id
|
||||
})
|
||||
let index = this.detail.data.findIndex(item => {
|
||||
return item.id == id
|
||||
})
|
||||
this.luckInd = index
|
||||
this.toBegin()
|
||||
await this.initRefresh()
|
||||
},
|
||||
// 开始抽奖
|
||||
toBegin() {
|
||||
let {
|
||||
deg,
|
||||
singleAngle,
|
||||
speed,
|
||||
isStart,
|
||||
luckInd
|
||||
} = this
|
||||
if (isStart) return
|
||||
this.isStart = true
|
||||
let endAddAngle = 360 - (luckInd * singleAngle + singleAngle / 2); //中奖角度
|
||||
let rangeAngle = (Math.floor(Math.random() * 4) + 4) * 360; // 随机旋转几圈再停止
|
||||
let cAngle;
|
||||
deg = 0;
|
||||
this.timer = setInterval(() => {
|
||||
if (deg < rangeAngle) {
|
||||
deg += speed;
|
||||
} else {
|
||||
cAngle = (endAddAngle + rangeAngle - deg) / speed;
|
||||
cAngle = cAngle > speed ? speed : cAngle < 1 ? 1 : cAngle;
|
||||
deg += cAngle;
|
||||
|
||||
if (deg >= endAddAngle + rangeAngle) {
|
||||
deg = endAddAngle + rangeAngle;
|
||||
this.isStart = false;
|
||||
clearInterval(this.timer);
|
||||
this.toSuccess()
|
||||
}
|
||||
}
|
||||
this.deg = deg
|
||||
}, 1000 / 60)
|
||||
},
|
||||
// 抽奖完成后操作
|
||||
toSuccess() {
|
||||
let {
|
||||
luckInd
|
||||
} = this
|
||||
let {
|
||||
title = '',
|
||||
is_luck = 0,
|
||||
type = 1,
|
||||
coupon_title = '',
|
||||
integral = 0
|
||||
} = this.detail.data[luckInd]
|
||||
let msg = !is_luck ? title : type == 1 ? `恭喜您获得1张卡券(${coupon_title})` : `恭喜您获得${integral}积分`
|
||||
this.$util.showToast({
|
||||
title: msg
|
||||
})
|
||||
this.getList('user', 1)
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
<style lang="scss">
|
||||
.shop-luck {
|
||||
.luck-bg {
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 1912rpx;
|
||||
}
|
||||
|
||||
.my-integral {
|
||||
top: 145rpx;
|
||||
width: 100%;
|
||||
height: 100rpx;
|
||||
|
||||
.integral-num {
|
||||
font-weight: bold;
|
||||
color: #FFFFFF;
|
||||
letter-spacing: 2rpx;
|
||||
background: -webkit-linear-gradient(90deg, #FFFBCD, #F4F56F);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.rule-btn-info {
|
||||
top: 351rpx;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 59rpx;
|
||||
|
||||
.rule-btn {
|
||||
width: 204rpx;
|
||||
height: 59rpx;
|
||||
color: #0879CE;
|
||||
background: rgba(255, 255, 255, 0.6);
|
||||
|
||||
.iconfont {
|
||||
color: rgba(8, 121, 206, 0.6);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.record-btn {
|
||||
top: 450rpx;
|
||||
right: 0;
|
||||
width: 150rpx;
|
||||
height: 53rpx;
|
||||
background: rgba(0, 107, 191, 0.48);
|
||||
border-radius: 100rpx 0 0 100rpx;
|
||||
}
|
||||
|
||||
.luck-dialog-info {
|
||||
top: 451rpx;
|
||||
left: 102rpx;
|
||||
width: 545rpx;
|
||||
|
||||
.dialog-info {
|
||||
|
||||
.dialog-img {
|
||||
width: 545rpx;
|
||||
height: 541rpx;
|
||||
transform: rotate(-23deg);
|
||||
}
|
||||
|
||||
.item-luck {
|
||||
width: 150rpx;
|
||||
height: 120rpx;
|
||||
|
||||
.thank-you-img {
|
||||
width: 46rpx;
|
||||
height: 46rpx;
|
||||
margin-top: 3rpx;
|
||||
}
|
||||
|
||||
.icon-img {
|
||||
width: 56rpx;
|
||||
height: 52rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.luck-0 {
|
||||
top: 60rpx;
|
||||
left: 250rpx;
|
||||
transform: rotate(20deg);
|
||||
}
|
||||
|
||||
.luck-1 {
|
||||
top: 129rpx;
|
||||
left: 335rpx;
|
||||
transform: rotate(61deg);
|
||||
}
|
||||
|
||||
.luck-2 {
|
||||
top: 238rpx;
|
||||
left: 352rpx;
|
||||
transform: rotate(101deg);
|
||||
}
|
||||
|
||||
.luck-3 {
|
||||
top: 331rpx;
|
||||
left: 298rpx;
|
||||
transform: rotate(141deg);
|
||||
}
|
||||
|
||||
.luck-4 {
|
||||
top: 368rpx;
|
||||
left: 196rpx;
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
.luck-5 {
|
||||
top: 330rpx;
|
||||
left: 96rpx;
|
||||
transform: rotate(220deg);
|
||||
}
|
||||
|
||||
.luck-6 {
|
||||
top: 238rpx;
|
||||
left: 42rpx;
|
||||
transform: rotate(260deg);
|
||||
}
|
||||
|
||||
.luck-7 {
|
||||
top: 130rpx;
|
||||
left: 58rpx;
|
||||
transform: rotate(300deg);
|
||||
}
|
||||
|
||||
.luck-8 {
|
||||
top: 60rpx;
|
||||
left: 141rpx;
|
||||
transform: rotate(340deg);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.pointer-img {
|
||||
top: 174rpx;
|
||||
left: 183rpx;
|
||||
width: 179rpx;
|
||||
height: 210rpx;
|
||||
}
|
||||
|
||||
.use-integral {
|
||||
top: 305rpx;
|
||||
left: 205rpx;
|
||||
width: 135rpx;
|
||||
transform: scale(0.7);
|
||||
}
|
||||
}
|
||||
|
||||
.num-img {
|
||||
top: 903rpx;
|
||||
left: 124rpx;
|
||||
width: 502rpx;
|
||||
height: 236rpx;
|
||||
}
|
||||
|
||||
.have-change {
|
||||
top: 1060rpx;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 50rpx;
|
||||
|
||||
.num {
|
||||
color: #FFEA8F;
|
||||
}
|
||||
}
|
||||
|
||||
.user-list {
|
||||
top: 1187rpx;
|
||||
left: 45rpx;
|
||||
width: 660rpx;
|
||||
height: 616rpx;
|
||||
z-index: 2;
|
||||
|
||||
.user-list-img {
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 660rpx;
|
||||
height: 616rpx;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
.title {
|
||||
height: 68rpx;
|
||||
color: #AB5D10;
|
||||
}
|
||||
|
||||
.luck-user {
|
||||
width: 560rpx;
|
||||
height: 480rpx;
|
||||
padding: 20rpx 50rpx;
|
||||
|
||||
.text {
|
||||
color: #FF8A00;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.squirrel-img {
|
||||
top: 1730rpx;
|
||||
right: 30rpx;
|
||||
width: 141rpx;
|
||||
height: 141rpx;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.popup-rule {
|
||||
width: 596rpx;
|
||||
margin: 0 auto;
|
||||
|
||||
.rule-info {
|
||||
margin-top: 10vh;
|
||||
|
||||
.rule-text {
|
||||
color: #4A4A4A;
|
||||
line-height: 1.4;
|
||||
min-height: 100rpx;
|
||||
max-height: 60vh;
|
||||
overflow: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.icon-close {
|
||||
font-size: 70rpx;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.popup-record {
|
||||
width: 715rpx;
|
||||
height: 800rpx;
|
||||
|
||||
.record-img {
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 715rpx;
|
||||
height: 163rpx;
|
||||
}
|
||||
|
||||
.record-title {
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100rpx;
|
||||
}
|
||||
|
||||
.record-content {
|
||||
top: 99rpx;
|
||||
left: 55rpx;
|
||||
width: 608rpx;
|
||||
border-radius: 0 0 24rpx 24rpx;
|
||||
|
||||
.luck-record {
|
||||
min-height: 100rpx;
|
||||
max-height: 50vh;
|
||||
width: 546rpx;
|
||||
padding: 30rpx;
|
||||
|
||||
.icon-img {
|
||||
width: 61rpx;
|
||||
height: 61rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.confirm-btn {
|
||||
width: 415rpx;
|
||||
height: 80rpx;
|
||||
margin: 0 auto;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user