年末降至,各種年會都需用到抽獎,最近恰好寫了一個抽獎程序,總結一下,也爲了方便往後溫故,也可給諸位一個開箱即用的抽獎demo參考前端
先睹爲快,傳送門git
傳送門github
關鍵節點有相應註釋,請仔細閱讀,歡迎指正不足json
//生成從minNum到maxNum的隨機數 randomNum(minNum, maxNum){ return parseInt(Math.random()* (maxNum - minNum + 1) + minNum); }, //獎頭像動起來 doMove(start, end) { console.log('start, end', start, end ); this.setIntervalFun = setInterval(() => { for(let i = start; i < end; i ++ ) { this.$set(this.currentPrizeUsers, i, this.keepNoRepeat(this.currentPrizeUsers, this.moveUsers)); } }, 80) }, //保證數字不重複 keepNoRepeat(currentPrizeUsers, userNoPrize) { let user = userNoPrize[this.randomNum(0, userNoPrize.length)]; //因爲分多小次抽獎,抽獎完成後獎池人數才變化,因此可能存在取值越界 if(!user) { return this.keepNoRepeat(currentPrizeUsers, userNoPrize); } if(currentPrizeUsers.filter(item => item.userid == user.userid).length > 0) { return this.keepNoRepeat(currentPrizeUsers, userNoPrize); }else { return user; } }, //停/繼續/完成點擊 handlePrizeClick: throttle(function() { //單次抽獎的最後一小次暫停 if(this.movePrizeNum == this.currentPrizeInfo.count) { this.choujiangId.pause(); this.zhongjiangId.play(); clearInterval(this.setIntervalFun); this.movePrizeStatus = 2; this.movePrizeNum += 1; this.doPrize(this.currentPrizeUsers.filter(item => item.userid).map(item => item.userid).join(',')); return; } if(this.movePrizeStatus == 2) {//顯示狀態-完成抽獎 this.choujiangId.pause(); this.zhongjiangId.pause(); this.dialogTableVisible = false; this.movePrizeStatus = 0; }else if(this.movePrizeStatus == 3) {//再次啓動 this.choujiangId.play(); this.zhongjiangId.pause(); this.movePrizeStatus = 1; this.doMove(this.movePrizeNum * this.currentPrizeInfo.everytime, this.currentPrizeInfo.everytime * (this.movePrizeNum + 1) ); this.movePrizeNum += 1; }else if(this.movePrizeStatus == 1) {//暫停 this.choujiangId.pause(); this.zhongjiangId.play(); clearInterval(this.setIntervalFun); this.movePrizeStatus = 3; this.doPrize(this.currentPrizeUsers.filter(item => item.userid).map(item => item.userid).join(',')); } }, 1000), //洗牌 randomUser() { let randomUser = setInterval(() => { this.moveUsers = this.moveUsers.sort((a, b) => Math.random() > .5 ? -1 : 1); }, 100) setTimeout(() => { clearInterval(randomUser); }, 2000); }