raffleWheel.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. // components/raffleWheel/raffleWheel.js
  2. //创建并返回内部 audio 上下文 innerAudioContext 对象
  3. const start = wx.createInnerAudioContext();
  4. const mid = wx.createInnerAudioContext();
  5. const stop = wx.createInnerAudioContext();
  6. var http = require('../../../utils/http.js')
  7. Component({
  8. options: {
  9. multipleSlots: true // 在组件定义时的选项中启用多slot支持
  10. },
  11. /**
  12. * 组件的属性列表
  13. * 用于组件自定义设置 组件的对外属性
  14. */
  15. properties: {
  16. myProperty: { // 属性名 myProperty2: String, 简化的定义方式
  17. type: String, // 类型(必填),目前接受的类型包括:String, Number, Boolean, Object, Array, null(表示任意类型)
  18. value: '', // 属性默认 初始值(可选),如果未指定则会根据类型选择一个
  19. observer: function (newVal, oldVal, changedPath) {
  20. // 属性被改变时执行的函数(可选),也可以写成在methods段中定义的方法名字符串, 如:'_propertyChange'
  21. // 通常 newVal 就是新设置的数据, oldVal 是旧数据
  22. }
  23. },
  24. size: {
  25. type: Number, // 转盘大小,传入宽度即可
  26. value: 600
  27. },
  28. },
  29. /**
  30. * 私有数据,组件的初始数据
  31. * 可用于模版渲染
  32. */
  33. data: {
  34. awardsConfig: {
  35. option: '', //转盘的标题名称
  36. awards: []
  37. },
  38. animationData: {}, // 转盘动画
  39. zhuanflg: false, // 转盘是否可以点击切换的标志位
  40. // fastTime: 7600, // 转盘快速转动的时间
  41. fastTime: 3900, // 转盘快速转动的时间
  42. slowTime: 3900, // 转盘慢速转动的时间
  43. runDegs: 0, // 转盘旋转了多少圈
  44. timer: null, // 清除转盘的时间clearTimeout(timer)
  45. block1: 'block', // 控制显示或隐藏转盘中心的图片
  46. block2: 'none',
  47. block3: 'none',
  48. block4: 'none'
  49. },
  50. //组件生命周期函数,在组件实例进入页面节点树时执行,注意此时不能调用 setData
  51. created: function () {},
  52. // 组件生命周期函数,在组件实例进入页面节点树时执行
  53. attached: function () {
  54. this.getScoreLuckPrizes()
  55. },
  56. /**
  57. * 组件的方法列表
  58. * 更新属性和数据的方法与更新页面数据的方法类似
  59. */
  60. methods: {
  61. /*
  62. * 公有方法
  63. */
  64. //判断值是否为空
  65. isNull(str) {
  66. if (str == null || str == undefined || str == '') {
  67. return true;
  68. } else {
  69. return false;
  70. }
  71. },
  72. //初始化数据
  73. initAdards() {
  74. var that = this,
  75. awardsConfig = that.data.awardsConfig;
  76. var t = awardsConfig.awards.length; // 选项长度
  77. var e = 1 / t,
  78. i = 360 / t,
  79. r = i - 90;
  80. for (var g = 0; g < t; g++) {
  81. awardsConfig.awards[g].item2Deg = g * i + 90 - i / 2 + "deg";
  82. //当前下标 * 360/长度 + 90 - 360/长度/2
  83. awardsConfig.awards[g].afterDeg = r + "deg";
  84. awardsConfig.awards[g].opacity = '1';
  85. }
  86. that.setData({
  87. turnNum: e, // 页面的单位是turn
  88. awardsConfig: awardsConfig,
  89. })
  90. that._change(); //向父组件传出当前转盘的初始数据
  91. },
  92. //重置转盘
  93. reset() {
  94. var that = this,
  95. awardsConfig = that.data.awardsConfig;
  96. var animation = wx.createAnimation({
  97. duration: 1,
  98. timingFunction: "ease"
  99. });
  100. that.animation = animation;
  101. animation.rotate(0).step(), that.data.runDegs = 0;
  102. that.setData({
  103. animationData: animation.export(),
  104. block3: 'none',
  105. block4: 'block'
  106. })
  107. for (let x in awardsConfig.awards) {
  108. awardsConfig.awards[x].opacity = '1';
  109. }
  110. setTimeout(function () {
  111. that.setData({
  112. block1: 'block',
  113. block4: 'none',
  114. awardsConfig: awardsConfig,
  115. })
  116. }, 300)
  117. },
  118. //父组件需要切换当前转盘的选项
  119. //如果有需要切换不同转盘的选项时,可以调用这方法
  120. //data: 转盘的数据
  121. //flag: 当转盘在转动过程中如果你想停止的话,可以传个true值,默认可不传
  122. switchZhuanpan(data, flag) {
  123. this.setData({
  124. awardsConfig: data,
  125. block1: 'block',
  126. block1: 'none',
  127. block3: 'none',
  128. block4: 'none',
  129. zhuanflg: false,
  130. })
  131. this.initAdards();
  132. if (flag) {
  133. this.reset();
  134. clearTimeout(this.data.timer);
  135. start.stop();
  136. mid.stop();
  137. stop.stop();
  138. }
  139. },
  140. /*
  141. * 内部私有方法建议以下划线开头
  142. * triggerEvent 用于触发事件,过triggerEvent来给父组件传递信息的
  143. * 写法: this.triggerEvent('cancelEvent', { num: 1 }) // 可以将num通过参数的形式传递给父组件
  144. */
  145. // GO转盘开始转动
  146. _zhuan() {
  147. var that = this,
  148. awardsConfig = that.data.awardsConfig,
  149. runDegs = that.data.runDegs;
  150. //>>> 是无符号移位运算符
  151. var r = Math.random() * awardsConfig.awards.length >>> 0,
  152. runNum = 8;
  153. console.log('当前答案选项的下标=====', r);
  154. setTimeout(function () {
  155. //要转多少度deg
  156. runDegs = runDegs || 0, runDegs = runDegs + (360 - runDegs % 360) + (2160 - r * (360 / awardsConfig.awards.length));
  157. var animation = wx.createAnimation({
  158. duration: that.data.fastJuedin ? that.data.slowTime : that.data.fastTime,
  159. timingFunction: "ease"
  160. });
  161. that.animation = animation;
  162. //这动画执行的是差值
  163. //如果第一次写rotate(360) 那么第二次再写rotate(360)将不起效果
  164. animation.rotate(runDegs).step(), 0 == r && (runDegs = 0);
  165. that.setData({
  166. animationData: animation.export(),
  167. block1: 'none',
  168. block2: 'block',
  169. zhuanflg: true,
  170. })
  171. that._setatZhuan(true);
  172. }, 100);
  173. that.setData({
  174. timer: setTimeout(function () {
  175. that.setData({
  176. animationData: {},
  177. s_awards: awardsConfig.awards[r].prizeName, //最终选中的结果
  178. awardsConfig: awardsConfig,
  179. block2: 'none',
  180. block3: 'block',
  181. zhuanflg: false,
  182. })
  183. that._myAwards();
  184. }, that.data.fastJuedin ? that.data.slowTime : that.data.fastTime)
  185. })
  186. },
  187. //初始化数据时向外传的参
  188. _change() {
  189. this.triggerEvent('myData', this.data.awardsConfig); // 向父组件传出当前转盘的数组数据
  190. },
  191. //当前转盘的结果
  192. _myAwards() {
  193. this.triggerEvent('myAwards', this.data.s_awards)
  194. },
  195. //转盘开始转动或者结速转动后的要传的值
  196. _setatZhuan(e) {
  197. console.log(e)
  198. var params = {
  199. url: '/p/scoreLuck/raffle',
  200. method: 'GET',
  201. data: {
  202. addId: 0
  203. },
  204. callBack: res => {
  205. setTimeout(() => {
  206. if (res.stock) {
  207. wx.showModal({
  208. title: '运气爆棚!',
  209. showCancel: false,
  210. content: res.prizeName,
  211. success: () => {
  212. this.reset()
  213. }
  214. })
  215. } else {
  216. wx.showModal({
  217. title: '谢谢参与',
  218. showCancel: false,
  219. content: '运气留给下次吧~',
  220. success: () => {
  221. this.reset()
  222. }
  223. })
  224. }
  225. }, 2400)
  226. },
  227. errCallBack:(err)=>{
  228. console.log(err)
  229. wx.showModal({
  230. title: '错误',
  231. showCancel: false,
  232. content: '服务器开了点小差,待会儿再来吧~',
  233. success: () => {
  234. this.reset()
  235. }
  236. })
  237. }
  238. }
  239. http.request(params)
  240. },
  241. // 获取抽奖奖品列表
  242. getScoreLuckPrizes() {
  243. var params = {
  244. url: '/p/scoreLuck/getScoreLuckPrizes',
  245. method: 'GET',
  246. data: {
  247. consumeType: 1
  248. },
  249. callBack: res => {
  250. res.forEach((el, index) => {
  251. if (index % 2 === 0) {
  252. el['color'] = "#FEFAEA"
  253. } else {
  254. el['color'] = '#FFE358'
  255. }
  256. })
  257. this.setData({
  258. 'awardsConfig.awards': res
  259. })
  260. this.initAdards();
  261. }
  262. }
  263. http.request(params)
  264. },
  265. }
  266. })