转盘抽奖

转盘抽奖

http://hfc.suoluomei.com/hpl/index.php?s=/Weixin/active/newYearRedPacket

效果图
转盘抽奖

 // 奖品列表
      var prizeList
      var prizeId

      function sortBy(property) {
        return function(a, b) {
          return a[property] < b[property]
            ? -1
            : a[property] > b[property]
            ? 1
            : 0
        }
      }
      // 抽奖判断
      $.post(
        '__MODULE__/active/getNewYearRedPacketInit',
        function(res) {
          if (res.errcode === 0) {
            var data = res.data
            // 已参加过活动,取消点击事件
            if (data.joined == 1) {
              $.alert({
                title: '您已经抽过奖了',
                text: '点确认前往禾粉圈查看',
                onOK: function() {
                  window.location.href = '__MODULE__/GoodsBook/card_package'
                }
              })
              $('.begin').click(function() {
                $.alert({
                  title: '您已经抽过奖了',
                  text: '点确认前往禾粉圈查看',
                  onOK: function() {
                    window.location.href = '__MODULE__/GoodsBook/card_package'
                  }
                })
              })
              return
            } else {
              prizeList = data.rows && data.rows.sort(sortBy('sort'))
              console.log('​prizeList', prizeList)
              // 扇区份数,与奖品数组
              prizing(prizeList.length, prizeList)
            }
          } else {
            $.alert({
              title: '网络错误',
              text: ''
            })
          }
        },
        'json'
      )

      function prizing(part, prizeList) {
        // 开始抽奖
        $('.begin').one('click', function() {
          console.log('开始抽奖')
          $.post(
            '__MODULE__/Active/actionNewYearRedPacketPrize',
            function(resp) {
              if (resp.errcode !== 0) {
                $.alert('网络异常', '')
                return
              }
              var prizeId = resp.data.id
              console.log('​prizing -> prizeList', prizeList)
              var winPrize = prizeList.filter(function(item, index) {
                return item.id == prizeId
              })

              // 设置初始旋转角度
              var defaultRotate = 1440
              // 所在扇区
              var sectorId = winPrize[0].sort
              // 360/(计算奖品个数*2) ==> 得到偏转角
              // var getRotate = 360 / (part * 2)
              // 设置中奖奖品所在位置的角度
              console.log('​prizing -> prizeId', sectorId)
              var setRotate = (360 / (part * 2)) * (sectorId * 2 - 1)
              console.log('​prizing -> part', part)
              console.log('​prizing -> setRotate', setRotate)
    
            // 别写这些难维护的代码
              // switch (prizeId) {
              //   case 0:
              //     setRotate = getRotate
              //     break
              //   case 1:
              //     setRotate = getRotate * 3
              //     break
              //   case 2:
              //     setRotate = getRotate * 5
              //     break
              //   case 3:
              //     setRotate = getRotate * 7
              //     break
              //   case 4:
              //     setRotate = getRotate * 9
              //     break
              //   case 5:
              //     setRotate = getRotate * 11
              //     break
              //   case 6:
              //     setRotate = getRotate * 13
              //     break
              //   case 7:
              //     setRotate = getRotate * 15
              //     break
              // }
              var allRotate = defaultRotate + setRotate
              $('.turnImg ').velocity(
                {
                  rotateZ: allRotate + 'deg'
                },
                {
                  duration: 3000,
                  complete: function(ele) {
                    setTimeout(function() {
                      $('.js-win').fadeIn()
                      unbindPrizing()
                    }, 1000)
                  }
                }
              )

              var winPrizeInfo = winPrize[0]
              // 显示中奖信息
              var prizeType = parseInt(winPrizeInfo.score) == 0 ? '元' : '积分'
              console.log('​prizing -> prizeType', prizeType, winPrizeInfo)
              var prizeText =
                parseInt(winPrizeInfo.score) == 0
                  ? winPrizeInfo.money
                  : winPrizeInfo.score

              $('.js-prize-type').text(prizeType)
              $('.js-prize-des').text(prizeText)
            },
            'json'
          )
        })
      }

      function unbindPrizing() {
        $('.begin').off('click')
        $('.begin').on('click', function() {
          $.confirm({
            title: '您已经抽过奖了',
            text: '点击确定查看',
            onOK: function() {
              // TODO 跳转
              window.location.href = '__MODULE__/GoodsBook/card_package'
            },
            onCancel: function() {
              // TODO
            }
          })
          $('.js-win').fadeIn()
        })
      }

      $('.popup .close').click(function() {
        $(this)
          .parent()
          .parent()
          .fadeOut()
      })

      $('.js-check-prize').click(function() {
        // TODO 跳转到中奖记录?
        window.location.href = '__MODULE__/GoodsBook/card_package'
      })

奖品数组 data, 以指针为起点分成 data.length 份扇形,
`sort` 用于排序,对应以指针为起点的第n个扇形,
前端只需要更换图片,后台传递数据控制扇形数和`sort`指向对应扇区的奖品
{data:{rows: [{id: "83", name: "新年大转盘红包", score: "200", money: "0.00", sort: "5"},], joined: 0}, errcode: 0,msg: "操作成功", status: 1}