123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365 |
- <template>
- <transition name="msgbox-fade">
- <div class="popup-wrap mod-lottery">
- <div class="popup-modal"></div>
- <div class="popup-box">
- <div class="popup-hd">
- <div class="popup-hd-title"><em>{{$t('lottery.title')}}</em></div>
- <span class="popup-close" @click="$emit('visible:lottery')"></span>
- </div>
- <div class="popup-bd">
- <div class="lottery-wrap">
- <p class="left-time">{{$t('lottery.text1')}}:{{leftTimes}}</p>
- <div class="lottery-wheel" v-if="rewardList.length">
- <div class="wheel" :style="{transform: `rotate(${rotateDeg}deg)`}">
- <div class="rotate-box" v-for="(item, key) in rewardList" :key="key">
- <div class="wheel-item">
- <span class="amount">{{item}}</span>
- <i class="gold-eos-icon"></i>
- </div>
- </div>
- </div>
- <div class="lottery-btn" :class="{'lottery-btn-small': isRotating}" v-if="ttl == 0" @click="runLottery">
- {{isRotating ? $t('lottery.text2') : $t('lottery.text3')}}
- </div>
- <div class="lottery-btn disabled" v-else-if="ttl == -1">{{$t('lottery.text3')}}</div>
- <div class="lottery-btn disabled time-count-down" v-else>{{timeStr}}</div>
- </div>
- <transition name="msgbox-fade">
- <div class="lottery-result" v-if="luckResult">
- <div class="num">{{$t('lottery.text5')}}:{{luckResult.luckdraw_num}}</div>
- <div class="lottery-fair">
- <span class="title">{{$t('lottery.text5')}}</span>
- <a target="_blank" :href="`https://eospark.com/block/${luckResult.next_block_num}`" class="fair-num">{{luckResult.next_block_num}}</a>
- <a target="_blank" :href="`https://eospark.com/block/${luckResult.next_block_num}`" class="hash" v-html="luckHash"></a>
- </div>
- <div class="lottery-fair">
- <span class="title">{{$t('lottery.text3')}}</span>
- <a target="_blank" :href="`https://eospark.com/tx/${luckResult.trx_id}`" class="fair-num">{{luckResult.draw_block_num}}</a>
- <a target="_blank" :href="`https://eospark.com/tx/${luckResult.trx_id}`" class="hash">...{{luckResult.trx_id.substring(luckResult.trx_id.length - 30,luckResult.trx_id.length)}}</a>
- </div>
- </div>
- </transition>
- <p class="lottery-tips">{{$t('lottery.text4')}}</p>
- </div>
- </div>
- </div>
- </div>
- </transition>
- </template>
- <script>
- import API from '@/api'
- import { mapState } from 'vuex'
- import { showError } from '@/util/util'
- export default {
- name: 'lottery',
- data () {
- return {
- rewardList: [],
- rotateDeg: 60,
- isRotating: false,
- leftTimes: 0, // 抽奖剩余次数
- ttl: 0, // 剩余秒数
- luckResult: null, // 抽奖结果
- timeStr: ''
- }
- },
- computed: {
- identity () {
- return { authorization: [`${this.account.name}@${this.account.authority}`] }
- },
- luckHash () {
- if (this.luckResult) {
- let hash = this.luckResult.next_block_id
- let luckNum = this.luckResult.luckdraw_num.toString()
- let subHash = hash.substring(hash.length - 30, hash.length)
- let hashArr = subHash.split('')
- let luckLen = luckNum.length
- let k = 0
- for (let i = hashArr.length - 1; i >= 0; i--) {
- let char = hashArr[i]
- if (luckNum.indexOf(char) > -1 && k < luckLen) {
- let newChar = `<span class="yellow">${char}</span>`
- hashArr.splice(i, 1, newChar)
- k++
- }
- }
- return '...' + hashArr.join('')
- } else {
- return ''
- }
- },
- ...mapState({
- eos: state => state.eos,
- account: state => state.account
- })
- },
- methods: {
- async runLottery () {
- this.$showLoading()
- var doAction = (param) => {
- API.eos.sendLuckTrx(param)
- .then(({ data }) => {
- this.$hideLoading()
- if (data.code === 0) {
- // 计算角度
- let rewardAmount = data.data.luckdraw_amount_int / 10000
- let ind = this.rewardList.indexOf(rewardAmount.toString())
- this.rotateDeg = 1800 + ind * 60
- this.isRotating = true
- // 结束抽奖
- setTimeout(() => {
- this.isRotating = false
- this.luckResult = data.data
- this.$store.commit('updateBalance', data.data.luckdraw_amount_int)
- this.leftTimes--
- this.ttl = 3600
- this.timer = setInterval(() => {
- this.updateTime()
- }, 1000)
- }, 3500)
- }
- }).catch(() => {
- this.$hideLoading()
- })
- }
- var memo
- if (this.$isLogin()) {
- memo = 'luckdraw'
- } else {
- memo = 'luckdraw|' + await this.$getRandom()
- }
- window.EOS.contract('eosgetadmin1').then(contract => {
- contract.luckdraw(this.account.name, memo, this.identity)
- .then(trx => {
- doAction({
- transaction_id: trx.transaction_id,
- block_num: trx.processed.block_num ? trx.processed.block_num : ''
- })
- })
- .catch(msg => {
- this.$hideLoading()
- if (msg.type === 'signature_rejected') {
- return
- }
- let json = JSON.parse(msg)
- let details = json.error.details
- showError(details[0].message)
- })
- })
- },
- updateTime () {
- if (this.ttl > 0) {
- let ttl = this.ttl
- let M = Math.floor(ttl % 3600 / 60)
- M = M < 10 ? '0' + M : M
- let S = Math.floor(ttl % 3600 % 60)
- S = S < 10 ? '0' + S : S
- this.timeStr = `${M}:${S}`
- this.ttl -= 1
- if (this.ttl === 0) {
- clearInterval(this.timer)
- }
- }
- },
- getLuckInfo () {
- API.eos.getLuckInfo({
- player: this.account.name
- }).then(({ data }) => {
- this.leftTimes = data.data.times
- this.ttl = data.data.limit // -1不能抽,0可以抽, 大于0是倒计时秒数
- let rewardData = data.data.reward_conf
- rewardData.forEach(e => {
- this.rewardList.push(e.formatAmount.toFixed(4))
- })
- if (this.ttl > 0) {
- this.timer = setInterval(() => {
- this.updateTime()
- }, 1000)
- }
- })
- },
- beforeDestroy () {
- if (this.timer) {
- clearInterval(this.timer)
- }
- }
- },
- async created () {
- await this.$store.dispatch('doScatterLogin')
- this.getLuckInfo()
- }
- }
- </script>
- <style lang="scss">
- .popup-wrap {
- &.mod-lottery{
- .popup-box{
- width: px2rem(730);
- }
- }
- }
- .lottery-wrap{
- color: #ffffff;
- .left-time{
- font-size: px2rem(16);
- text-align: center;
- }
- }
- .lottery-result{
- .num{
- width: px2rem(230);
- height: px2rem(70);
- font-size: px2rem(18);
- line-height: px2rem(70);
- margin: 0 auto;
- background-color: #394d80;
- font-weight: bold;
- margin: px2rem(20) auto px2rem(30);
- }
- }
- .lottery-fair{
- text-align: center;
- font-size: px2rem(14);
- margin-bottom: px2rem(8);
- font-weight: bold;
- .fair-num{
- display: inline-block;
- margin: 0 px2rem(6);
- width: px2rem(80);
- text-align: left;
- text-decoration: none;
- color: #ffffff;
- }
- .hash{
- display: inline-block;
- width: px2rem(320);
- text-align: left;
- text-decoration: none;
- color: #ffffff;
- .yellow{
- color: #ffeb00;
- font-weight: bold;
- }
- }
- .title{
- display: inline-block;
- width: px2rem(60);
- text-align: left;
- }
- }
- .lottery-tips{
- font-size: px2rem(14);
- line-height: 1.4;
- font-weight: bold;
- margin: px2rem(30) 0 px2rem(20);
- }
- .lottery-wheel{
- width: px2rem(504);
- height: px2rem(504);
- margin: px2rem(12) auto;
- position: relative;
- .rotate-box{
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- &:nth-child(2) {
- .wheel-item{
- transform: rotate(60deg);
- }
- }
- &:nth-child(3) {
- .wheel-item{
- transform: rotate(120deg);
- }
- }
- &:nth-child(4) {
- .wheel-item{
- transform: rotate(180deg);
- }
- }
- &:nth-child(5) {
- .wheel-item{
- transform: rotate(240deg);
- }
- }
- &:nth-child(6) {
- .wheel-item{
- transform: rotate(300deg);
- }
- }
- }
- .wheel{
- position: absolute;
- background: url('./img/wheel.png') no-repeat;
- width: px2rem(504);
- height: px2rem(504);
- background-size: 100%;
- transition: transform 3s ease;
- }
- .lottery-btn{
- position: absolute;
- top: 50%;
- left: 50%;
- width: px2rem(135);
- height: px2rem(154);
- box-sizing: border-box;
- padding-top: px2rem(70);
- margin-top: -px2rem(77);
- margin-left: -px2rem(135 / 2);
- background: url('./img/lottery-btn.png') no-repeat;
- background-size: 100%;
- text-align: center;
- color: #ffffff;
- font-size: px2rem(36);
- cursor: pointer;
- transition: all .3s ease-in-out;
- &:hover{
- background: url('./img/lottery-btn-hover.png') no-repeat;
- background-size: 100%;
- }
- &.disabled{
- background: url('./img/lottery-btn-disabled.png') no-repeat;
- background-size: 100%;
- cursor: default;
- }
- &.time-count-down{
- font-size: px2rem(28);
- padding-top: px2rem(74);
- }
- }
- .lottery-btn-small{
- font-size: px2rem(24);
- }
- .wheel-item{
- text-align: center;
- width: px2rem(100);
- margin: 0 auto;
- text-align: center;
- padding-top: px2rem(86);
- transform-origin: 50% px2rem(504/2);
- .amount{
- display: block;
- font-weight: bold;
- font-size: px2rem(24);
- color: #df951f;
- }
- }
- }
- .gold-eos-icon{
- background: url('./img/gold-eos-icon.png') no-repeat;
- background-size: 100%;
- display: block;
- width: px2rem(22);
- margin: px2rem(6) auto;
- height: px2rem(32);
- }
- </style>
|