vhall-mini-sdk 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/lib/components/chat/chat-edit/chat-edit.js +7 -4
  2. package/lib/components/chat/chat-list/chat-list.js +1 -1
  3. package/lib/components/live-landscape/live-landscape.js +11 -7
  4. package/lib/components/live-landscape/live-landscape.wxml +2 -2
  5. package/lib/components/live-portrait/live-portrait.js +11 -7
  6. package/lib/components/live-portrait/live-portrait.wxml +3 -3
  7. package/lib/components/live-portrait/live-portrait.wxss +1 -1
  8. package/lib/components/lottery/lottery.wxml +2 -2
  9. package/lib/components/player/components/online-hot/index.js +2 -2
  10. package/lib/components/player/extensions/observers.js +5 -5
  11. package/lib/components/player/player.js +5 -0
  12. package/lib/components/player/player.wxml +3 -3
  13. package/lib/components/product/product-list/product-list.wxml +3 -11
  14. package/lib/components/signin/signin-dialog.js +1 -0
  15. package/lib/sdk/main/index.js +2 -1
  16. package/lib/sdk/player/index.js +1 -1
  17. package/lib/sdk/plugins/InviteCardServer.js +1 -1
  18. package/lib/sdk/plugins/MallRewardServer.js +1 -1
  19. package/lib/sdk/plugins/ProductServer.js +1 -1
  20. package/lib/shared/RequestUtil.js +1 -1
  21. package/lib/shared/logger.js +1 -1
  22. package/package.json +2 -4
  23. package/postinstall.js +21 -51
  24. package/dist/components/chat/chat-edit/chat-edit.js +0 -127
  25. package/dist/components/chat/chat-edit/chat-edit.json +0 -4
  26. package/dist/components/chat/chat-edit/chat-edit.wxml +0 -7
  27. package/dist/components/chat/chat-edit/chat-edit.wxss +0 -1
  28. package/dist/components/chat/chat-item/chat-item.js +0 -253
  29. package/dist/components/chat/chat-item/chat-item.json +0 -3
  30. package/dist/components/chat/chat-item/chat-item.wxml +0 -96
  31. package/dist/components/chat/chat-item/chat-item.wxss +0 -1
  32. package/dist/components/chat/chat-list/chat-list.js +0 -216
  33. package/dist/components/chat/chat-list/chat-list.json +0 -6
  34. package/dist/components/chat/chat-list/chat-list.wxml +0 -9
  35. package/dist/components/chat/chat-list/chat-list.wxss +0 -1
  36. package/dist/components/chat/chat.js +0 -98
  37. package/dist/components/chat/chat.json +0 -7
  38. package/dist/components/chat/chat.wxml +0 -7
  39. package/dist/components/chat/chat.wxss +0 -1
  40. package/dist/components/gift/gift-display/gift-display.js +0 -118
  41. package/dist/components/gift/gift-display/gift-display.json +0 -3
  42. package/dist/components/gift/gift-display/gift-display.wxml +0 -16
  43. package/dist/components/gift/gift-display/gift-display.wxss +0 -1
  44. package/dist/components/gift/gift-sender/gift-sender.js +0 -63
  45. package/dist/components/gift/gift-sender/gift-sender.json +0 -6
  46. package/dist/components/gift/gift-sender/gift-sender.wxml +0 -19
  47. package/dist/components/gift/gift-sender/gift-sender.wxss +0 -1
  48. package/dist/components/introduction/introduction.js +0 -43
  49. package/dist/components/introduction/introduction.json +0 -3
  50. package/dist/components/introduction/introduction.wxml +0 -8
  51. package/dist/components/introduction/introduction.wxss +0 -1
  52. package/dist/components/invite-rank/img/bronze.png +0 -0
  53. package/dist/components/invite-rank/img/gold.png +0 -0
  54. package/dist/components/invite-rank/img/silver.png +0 -0
  55. package/dist/components/invite-rank/index.js +0 -135
  56. package/dist/components/invite-rank/index.json +0 -8
  57. package/dist/components/invite-rank/index.wxml +0 -42
  58. package/dist/components/invite-rank/index.wxss +0 -1
  59. package/dist/components/invite-rank/invite-rank-item.js +0 -12
  60. package/dist/components/invite-rank/invite-rank-item.json +0 -4
  61. package/dist/components/invite-rank/invite-rank-item.wxml +0 -21
  62. package/dist/components/invite-rank/invite-rank-item.wxss +0 -1
  63. package/dist/components/invite-rank/my-invite-detail.js +0 -82
  64. package/dist/components/invite-rank/my-invite-detail.json +0 -7
  65. package/dist/components/invite-rank/my-invite-detail.wxml +0 -27
  66. package/dist/components/invite-rank/my-invite-detail.wxss +0 -1
  67. package/dist/components/invite-rank/util.wxs +0 -21
  68. package/dist/components/live-landscape/live-landscape.js +0 -216
  69. package/dist/components/live-landscape/live-landscape.json +0 -39
  70. package/dist/components/live-landscape/live-landscape.wxml +0 -73
  71. package/dist/components/live-landscape/live-landscape.wxss +0 -1
  72. package/dist/components/live-portrait/live-portrait.js +0 -274
  73. package/dist/components/live-portrait/live-portrait.json +0 -38
  74. package/dist/components/live-portrait/live-portrait.wxml +0 -106
  75. package/dist/components/live-portrait/live-portrait.wxss +0 -1
  76. package/dist/components/lottery/lottery-accept/index.js +0 -249
  77. package/dist/components/lottery/lottery-accept/index.json +0 -4
  78. package/dist/components/lottery/lottery-accept/index.wxml +0 -49
  79. package/dist/components/lottery/lottery-accept/index.wxss +0 -1
  80. package/dist/components/lottery/lottery-history/index.js +0 -36
  81. package/dist/components/lottery/lottery-history/index.json +0 -3
  82. package/dist/components/lottery/lottery-history/index.wxml +0 -28
  83. package/dist/components/lottery/lottery-history/index.wxss +0 -1
  84. package/dist/components/lottery/lottery-shake/lottery-shake.js +0 -328
  85. package/dist/components/lottery/lottery-shake/lottery-shake.json +0 -1
  86. package/dist/components/lottery/lottery-shake/lottery-shake.wxml +0 -52
  87. package/dist/components/lottery/lottery-shake/lottery-shake.wxss +0 -1
  88. package/dist/components/lottery/lottery-slot/lottery-slot.js +0 -230
  89. package/dist/components/lottery/lottery-slot/lottery-slot.json +0 -1
  90. package/dist/components/lottery/lottery-slot/lottery-slot.wxml +0 -62
  91. package/dist/components/lottery/lottery-slot/lottery-slot.wxss +0 -1
  92. package/dist/components/lottery/lottery-wheel/lottery-wheel.js +0 -153
  93. package/dist/components/lottery/lottery-wheel/lottery-wheel.json +0 -4
  94. package/dist/components/lottery/lottery-wheel/lottery-wheel.wxml +0 -91
  95. package/dist/components/lottery/lottery-wheel/lottery-wheel.wxss +0 -1
  96. package/dist/components/lottery/lottery-winners/index.js +0 -101
  97. package/dist/components/lottery/lottery-winners/index.json +0 -4
  98. package/dist/components/lottery/lottery-winners/index.wxml +0 -39
  99. package/dist/components/lottery/lottery-winners/index.wxss +0 -1
  100. package/dist/components/lottery/lottery.js +0 -388
  101. package/dist/components/lottery/lottery.json +0 -11
  102. package/dist/components/lottery/lottery.wxml +0 -78
  103. package/dist/components/lottery/lottery.wxss +0 -1
  104. package/dist/components/lottery/wheel.json +0 -49
  105. package/dist/components/mall-reward/common/reward-card.wxss +0 -0
  106. package/dist/components/mall-reward/duration-icon/index.js +0 -101
  107. package/dist/components/mall-reward/duration-icon/index.json +0 -3
  108. package/dist/components/mall-reward/duration-icon/index.wxml +0 -7
  109. package/dist/components/mall-reward/duration-icon/index.wxss +0 -1
  110. package/dist/components/mall-reward/f-count-down/index.js +0 -61
  111. package/dist/components/mall-reward/f-count-down/index.json +0 -3
  112. package/dist/components/mall-reward/f-count-down/index.wxml +0 -9
  113. package/dist/components/mall-reward/f-count-down/index.wxss +0 -1
  114. package/dist/components/mall-reward/f-empty/index.js +0 -11
  115. package/dist/components/mall-reward/f-empty/index.json +0 -3
  116. package/dist/components/mall-reward/f-empty/index.wxml +0 -8
  117. package/dist/components/mall-reward/f-empty/index.wxss +0 -1
  118. package/dist/components/mall-reward/f-history/index.js +0 -84
  119. package/dist/components/mall-reward/f-history/index.json +0 -4
  120. package/dist/components/mall-reward/f-history/index.wxml +0 -38
  121. package/dist/components/mall-reward/f-history/index.wxss +0 -1
  122. package/dist/components/mall-reward/f-open/index.js +0 -36
  123. package/dist/components/mall-reward/f-open/index.json +0 -3
  124. package/dist/components/mall-reward/f-open/index.wxml +0 -10
  125. package/dist/components/mall-reward/f-open/index.wxss +0 -1
  126. package/dist/components/mall-reward/f-receive/index.js +0 -36
  127. package/dist/components/mall-reward/f-receive/index.json +0 -3
  128. package/dist/components/mall-reward/f-receive/index.wxml +0 -9
  129. package/dist/components/mall-reward/f-receive/index.wxss +0 -1
  130. package/dist/components/mall-reward/index.js +0 -374
  131. package/dist/components/mall-reward/index.json +0 -8
  132. package/dist/components/mall-reward/index.wxml +0 -4
  133. package/dist/components/mall-reward/index.wxss +0 -0
  134. package/dist/components/mall-reward/main-popup/index.js +0 -46
  135. package/dist/components/mall-reward/main-popup/index.json +0 -12
  136. package/dist/components/mall-reward/main-popup/index.wxml +0 -16
  137. package/dist/components/mall-reward/main-popup/index.wxss +0 -1
  138. package/dist/components/player/assets/image/arrow-left.png +0 -0
  139. package/dist/components/player/assets/image/arrow-right.png +0 -0
  140. package/dist/components/player/assets/image/enterFullScreen.png +0 -0
  141. package/dist/components/player/assets/image/exitFullScreen.png +0 -0
  142. package/dist/components/player/assets/image/fullscreen_1.png +0 -0
  143. package/dist/components/player/assets/image/fullscreen_2.png +0 -0
  144. package/dist/components/player/assets/image/pause.png +0 -0
  145. package/dist/components/player/assets/image/pause_1.png +0 -0
  146. package/dist/components/player/assets/image/play.png +0 -0
  147. package/dist/components/player/assets/image/play_1.png +0 -0
  148. package/dist/components/player/assets/image/refresh.png +0 -0
  149. package/dist/components/player/assets/image/refresh_1.png +0 -0
  150. package/dist/components/player/assets/image/subtitle_close.png +0 -0
  151. package/dist/components/player/assets/image/subtitle_default.png +0 -0
  152. package/dist/components/player/assets/image/volume-off.png +0 -0
  153. package/dist/components/player/assets/image/volume-on.png +0 -0
  154. package/dist/components/player/common/config.js +0 -7
  155. package/dist/components/player/common/veComponent.js +0 -4
  156. package/dist/components/player/components/barrage/barrage-canvas.js +0 -488
  157. package/dist/components/player/components/barrage/barrage-dom.js +0 -471
  158. package/dist/components/player/components/barrage/index.js +0 -62
  159. package/dist/components/player/components/barrage/index.json +0 -4
  160. package/dist/components/player/components/barrage/index.wxml +0 -39
  161. package/dist/components/player/components/barrage/index.wxss +0 -1
  162. package/dist/components/player/components/barrage/utils.js +0 -71
  163. package/dist/components/player/components/controls/controls.js +0 -93
  164. package/dist/components/player/components/controls/controls.json +0 -6
  165. package/dist/components/player/components/controls/controls.wxml +0 -60
  166. package/dist/components/player/components/controls/controls.wxss +0 -1
  167. package/dist/components/player/components/danmaku/danmaku.js +0 -23
  168. package/dist/components/player/components/danmaku/danmaku.json +0 -4
  169. package/dist/components/player/components/danmaku/danmaku.wxml +0 -1
  170. package/dist/components/player/components/danmaku/danmaku.wxss +0 -0
  171. package/dist/components/player/components/error/error.js +0 -15
  172. package/dist/components/player/components/error/error.json +0 -3
  173. package/dist/components/player/components/error/error.wxml +0 -6
  174. package/dist/components/player/components/error/error.wxss +0 -1
  175. package/dist/components/player/components/loading/loading.js +0 -9
  176. package/dist/components/player/components/loading/loading.json +0 -3
  177. package/dist/components/player/components/loading/loading.wxml +0 -4
  178. package/dist/components/player/components/loading/loading.wxss +0 -1
  179. package/dist/components/player/components/main/extensions/data.js +0 -8
  180. package/dist/components/player/components/main/extensions/export.js +0 -83
  181. package/dist/components/player/components/main/extensions/methods.js +0 -110
  182. package/dist/components/player/components/main/extensions/observers.js +0 -41
  183. package/dist/components/player/components/main/extensions/props.js +0 -177
  184. package/dist/components/player/components/main/index.js +0 -44
  185. package/dist/components/player/components/main/index.json +0 -4
  186. package/dist/components/player/components/main/index.wxml +0 -7
  187. package/dist/components/player/components/main/index.wxss +0 -1
  188. package/dist/components/player/components/marquee/marquee.js +0 -304
  189. package/dist/components/player/components/marquee/marquee.json +0 -4
  190. package/dist/components/player/components/marquee/marquee.wxml +0 -14
  191. package/dist/components/player/components/marquee/marquee.wxss +0 -1
  192. package/dist/components/player/components/online-hot/assets/line-hot.png +0 -0
  193. package/dist/components/player/components/online-hot/assets/line-user.png +0 -0
  194. package/dist/components/player/components/online-hot/index.js +0 -66
  195. package/dist/components/player/components/online-hot/index.json +0 -3
  196. package/dist/components/player/components/online-hot/index.wxml +0 -15
  197. package/dist/components/player/components/online-hot/index.wxss +0 -1
  198. package/dist/components/player/components/poster/poster.js +0 -12
  199. package/dist/components/player/components/poster/poster.json +0 -3
  200. package/dist/components/player/components/poster/poster.wxml +0 -5
  201. package/dist/components/player/components/poster/poster.wxss +0 -1
  202. package/dist/components/player/components/watermark/watermark.js +0 -52
  203. package/dist/components/player/components/watermark/watermark.json +0 -4
  204. package/dist/components/player/components/watermark/watermark.wxml +0 -8
  205. package/dist/components/player/components/watermark/watermark.wxss +0 -1
  206. package/dist/components/player/extensions/data.js +0 -63
  207. package/dist/components/player/extensions/export.js +0 -325
  208. package/dist/components/player/extensions/methods.js +0 -406
  209. package/dist/components/player/extensions/observers.js +0 -114
  210. package/dist/components/player/extensions/props.js +0 -162
  211. package/dist/components/player/player.js +0 -83
  212. package/dist/components/player/player.json +0 -33
  213. package/dist/components/player/player.wxml +0 -48
  214. package/dist/components/player/player.wxss +0 -1
  215. package/dist/components/praise/praise.js +0 -150
  216. package/dist/components/praise/praise.json +0 -5
  217. package/dist/components/praise/praise.wxml +0 -17
  218. package/dist/components/praise/praise.wxss +0 -1
  219. package/dist/components/product/product-card/product-card.js +0 -109
  220. package/dist/components/product/product-card/product-card.json +0 -3
  221. package/dist/components/product/product-card/product-card.wxml +0 -47
  222. package/dist/components/product/product-card/product-card.wxss +0 -1
  223. package/dist/components/product/product-detail/product-detail.js +0 -127
  224. package/dist/components/product/product-detail/product-detail.json +0 -3
  225. package/dist/components/product/product-detail/product-detail.wxml +0 -57
  226. package/dist/components/product/product-detail/product-detail.wxss +0 -1
  227. package/dist/components/product/product-item/product-item.js +0 -56
  228. package/dist/components/product/product-item/product-item.json +0 -3
  229. package/dist/components/product/product-item/product-item.wxml +0 -35
  230. package/dist/components/product/product-item/product-item.wxss +0 -1
  231. package/dist/components/product/product-list/product-list.js +0 -67
  232. package/dist/components/product/product-list/product-list.json +0 -6
  233. package/dist/components/product/product-list/product-list.wxml +0 -16
  234. package/dist/components/product/product-list/product-list.wxss +0 -1
  235. package/dist/components/product/product-order/product-order.js +0 -394
  236. package/dist/components/product/product-order/product-order.json +0 -3
  237. package/dist/components/product/product-order/product-order.wxml +0 -75
  238. package/dist/components/product/product-order/product-order.wxss +0 -1
  239. package/dist/components/signin/signin-dialog.js +0 -305
  240. package/dist/components/signin/signin-dialog.json +0 -7
  241. package/dist/components/signin/signin-dialog.wxml +0 -19
  242. package/dist/components/signin/signin-dialog.wxss +0 -1
  243. package/dist/components/top-notify/index.js +0 -14
  244. package/dist/components/top-notify/index.json +0 -3
  245. package/dist/components/top-notify/index.wxml +0 -2
  246. package/dist/components/top-notify/index.wxss +0 -1
  247. package/dist/pubComponents/countdown/countdown.js +0 -97
  248. package/dist/pubComponents/countdown/countdown.json +0 -5
  249. package/dist/pubComponents/countdown/countdown.wxml +0 -19
  250. package/dist/pubComponents/countdown/countdown.wxss +0 -1
  251. package/dist/pubComponents/error-page/index.js +0 -146
  252. package/dist/pubComponents/error-page/index.json +0 -5
  253. package/dist/pubComponents/error-page/index.wxml +0 -37
  254. package/dist/pubComponents/error-page/index.wxss +0 -1
  255. package/dist/pubComponents/popup/popup.js +0 -161
  256. package/dist/pubComponents/popup/popup.json +0 -5
  257. package/dist/pubComponents/popup/popup.wxml +0 -17
  258. package/dist/pubComponents/popup/popup.wxss +0 -1
  259. package/dist/pubComponents/tabs/index.js +0 -95
  260. package/dist/pubComponents/tabs/index.json +0 -4
  261. package/dist/pubComponents/tabs/index.wxml +0 -22
  262. package/dist/pubComponents/tabs/index.wxss +0 -1
  263. package/dist/sdk/config/index.js +0 -1
  264. package/dist/sdk/main/index.js +0 -1
  265. package/dist/sdk/player/index.js +0 -1
  266. package/dist/sdk/plugins/ChatServer.js +0 -1
  267. package/dist/sdk/plugins/CustomMenuServer.js +0 -1
  268. package/dist/sdk/plugins/InteractServer.js +0 -1
  269. package/dist/sdk/plugins/InviteCardServer.js +0 -1
  270. package/dist/sdk/plugins/LotteryServer.js +0 -1
  271. package/dist/sdk/plugins/MallRewardServer.js +0 -1
  272. package/dist/sdk/plugins/ProductServer.js +0 -1
  273. package/dist/shared/RequestUtil.js +0 -1
  274. package/dist/shared/SerializableMap.js +0 -1
  275. package/dist/shared/base.server.js +0 -1
  276. package/dist/shared/cacheUtil.js +0 -1
  277. package/dist/shared/dateUtil.js +0 -1
  278. package/dist/shared/logger.js +0 -1
  279. package/dist/shared/mpUtils.js +0 -1
  280. package/dist/shared/utils.js +0 -1
@@ -1,230 +0,0 @@
1
- Component({
2
- properties: {
3
- type: {
4
- type: String,
5
- value: '2',
6
- },
7
- // 抽奖 ID:用于区分不同抽奖的缓存 key
8
- lotteryId: {
9
- type: String,
10
- value: '',
11
- },
12
- remark: {
13
- type: String,
14
- value: '抽奖进行中...',
15
- },
16
- autoplay: {
17
- type: Boolean,
18
- value: false,
19
- },
20
- loop: {
21
- type: Boolean,
22
- value: false,
23
- },
24
- // 外部控制:true 开始转,false 停止
25
- running: {
26
- type: Boolean,
27
- value: false,
28
- observer(val) {
29
- if (val) {
30
- this.spin();
31
- } else {
32
- this.stop();
33
- }
34
- },
35
- },
36
- },
37
-
38
- data: {
39
- spinning: false,
40
- stopping: false,
41
- // 单个滚轴的奖品列表(基础 6 项,每列仅 1 个"谢谢参与",其余为礼品图标+恭喜中奖)
42
- basePrizes: [
43
- { emoji: '😊', label: '谢谢参与' },
44
- { emoji: '🎁', label: '恭喜中奖' },
45
- { emoji: '🎁', label: '恭喜中奖' },
46
- { emoji: '🎁', label: '恭喜中奖' },
47
- { emoji: '🎁', label: '恭喜中奖' },
48
- { emoji: '🎁', label: '恭喜中奖' },
49
- ],
50
- // 滚轴实际渲染列表:基础列表重复多份,保证连续滚动不露底
51
- reelList: [],
52
- // 每个滚轴当前位移(rpx),由 JS 连续驱动
53
- // 初始让 item0 落在中间某一份上居中(55 - 一份周期804 = -749),使上下各露出相邻方块
54
- offset1: -749,
55
- offset2: -749,
56
- offset3: -749,
57
- // 停止状态:每个轴是否已停
58
- stopped1: true,
59
- stopped2: true,
60
- stopped3: true,
61
- },
62
-
63
- lifetimes: {
64
- attached() {
65
- // 基础 6 项重复 12 份 = 72 项(9936rpx),覆盖停止落定时的最大位移(约 6624rpx)+窗口高(240),不露底
66
- const repeated = [];
67
- for (let i = 0; i < 12; i++) {
68
- this.data.basePrizes.forEach((p) => repeated.push(p));
69
- }
70
- this.setData({ reelList: repeated });
71
- if (this.data.running) {
72
- this.spin();
73
- } else if (this._hasSpinCache()) {
74
- // 刷新前抽奖仍在进行(有缓存),进入页面后自动恢复滚动动画
75
- this.spin();
76
- }
77
- },
78
- detached() {
79
- this._clearTimers();
80
- },
81
- },
82
-
83
- methods: {
84
- _clearTimers() {
85
- if (this._spinTimer) {
86
- clearInterval(this._spinTimer);
87
- this._spinTimer = null;
88
- }
89
- [1, 2, 3].forEach((i) => {
90
- if (this['_stopTimer' + i]) {
91
- clearTimeout(this['_stopTimer' + i]);
92
- this['_stopTimer' + i] = null;
93
- }
94
- });
95
- },
96
-
97
- // 缓存 key:lottery_<lotteryId>_cache,标记"该抽奖仍在滚动/进行中"
98
- _cacheKey() {
99
- return `lottery_${this.data.lotteryId}_cache`;
100
- },
101
- _hasSpinCache() {
102
- return !!wx.getStorageSync(this._cacheKey());
103
- },
104
- _setSpinCache() {
105
- wx.setStorageSync(this._cacheKey(), true);
106
- },
107
- _clearSpinCache() {
108
- wx.removeStorageSync(this._cacheKey());
109
- },
110
-
111
- // 单格高度与循环周期(与 less 中 .slot-item 高度一致)
112
- _itemH() {
113
- // 每项垂直占用(含 .slot-reel 的 gap 4rpx):130 + 4 = 134,用于循环/步进计算
114
- return 134;
115
- },
116
- _itemBoxH() {
117
- // 单项真实高度(与 less 中 .slot-item height 一致,不含 gap)
118
- return 130;
119
- },
120
- _cycle() {
121
- return this.data.basePrizes.length * this._itemH(); // 6 * 168 = 1008
122
- },
123
-
124
- // 开始连续滚动:位移持续递减,显示值对周期取模(内容已重复,取模无缝)
125
- spin() {
126
- // 进行中或减速停止阶段,忽略重复点击,避免动画重复执行 / 重复上报抽奖
127
- if (this.data.spinning || this.data.stopping) return;
128
- this._clearTimers();
129
- this.setData({
130
- spinning: true,
131
- stopping: false,
132
- stopped1: false,
133
- stopped2: false,
134
- stopped3: false,
135
- offset1: -749,
136
- offset2: -749,
137
- offset3: -749,
138
- });
139
- // 记录缓存:抽奖进行中,刷新后可据此恢复动画
140
- this._setSpinCache();
141
- const cycle = this._cycle();
142
- // 三个滚轴各自独立的位置与速度(速度刻意不同,更有老虎机层次感)
143
- // _pos 初始与 offset=-749 同余,使滚动首帧与 idle 视觉连续、避免点击瞬间跳变
144
- this._pos = [-749, -749, -749];
145
- this._step = [18, 13, 23]; // 每帧位移(rpx):左中右速度各异(调慢,原 [30,22,38])
146
- this._spinTimer = setInterval(() => {
147
- const next = {};
148
- for (let i = 0; i < 3; i++) {
149
- this._pos[i] -= this._step[i];
150
- // 对周期取模并归一到 (-cycle, 0],配合重复内容实现无缝循环
151
- const shown = ((this._pos[i] % cycle) + cycle) % cycle;
152
- next['offset' + (i + 1)] = shown === 0 ? 0 : -shown;
153
- }
154
- this.setData(next);
155
- }, 30);
156
-
157
- this.triggerEvent('draw');
158
- },
159
-
160
- // 把某轴平滑停止到目标项 T(0~5),加减速过渡;返回最终位移
161
- _landReel(num, currentOffset, targetT, extraCycles) {
162
- const itemBoxH = this._itemBoxH(); // 单项真实高度 130
163
- const step = this._itemH(); // 含间距步进 138
164
- const cycle = this._cycle();
165
- const windowCenter = 120; // .slot-reel-wrap 高度 240 / 2
166
- // 使目标项 T 的中心对齐窗口中心(120):滚动量 = T*step - (窗口中心 - 半高)
167
- const sT = targetT * step - (windowCenter - itemBoxH / 2);
168
- const curAbs = -currentOffset; // 当前已滚动量
169
- const targetMod = ((sT % cycle) + cycle) % cycle; // 目标模周期
170
- // 在当前滚动量基础上再推进 extraCycles 整圈后对齐到目标项
171
- const delta = (((targetMod - (curAbs % cycle)) % cycle) + cycle) % cycle;
172
- // + cycle:额外推进一整份,使目标项落在中间某一份(而非头部份),
173
- // 保证停止后上下都露出相邻方块,与初始/idle 状态一致
174
- const finalAbs = curAbs + extraCycles * cycle + delta + cycle;
175
- const finalOffset = -finalAbs;
176
- this.setData({ ['offset' + num]: finalOffset, ['stopped' + num]: true });
177
- return finalOffset;
178
- },
179
-
180
- // 停止滚动;won=true 表示中奖(三轴都停在"恭喜中奖"),否则三轴都停在"谢谢参与"
181
- stop(won) {
182
- if (!this.data.spinning || this.data.stopping) return false;
183
- this._clearTimers();
184
- // 抽奖已结束(服务端已返回结果),清除进行中缓存
185
- this._clearSpinCache();
186
- this.setData({ stopping: true });
187
-
188
- // 根据中奖结果决定三轴落定目标:
189
- // - 未中奖(won 非 true):三个"谢谢参与" → 基础列表 index 0
190
- // - 中奖(won === true):三个"恭喜中奖" → 基础列表 index 1~5(取同一个,保证整齐一致)
191
- let r1, r2, r3;
192
- if (won === true) {
193
- const winIdx = 1 + Math.floor(Math.random() * 5); // 1~5 均为"恭喜中奖"
194
- r1 = r2 = r3 = winIdx;
195
- } else {
196
- r1 = r2 = r3 = 0; // index 0 为"谢谢参与"
197
- }
198
-
199
- // 依次停止(左→右),制造老虎机逐列停下的效果
200
- // 注:过渡时长由 less 中 .slot-reel.stopped 控制
201
- this._stopTimer1 = setTimeout(() => {
202
- this._landReel(1, this.data.offset1, r1, 5);
203
- }, 0);
204
- this._stopTimer2 = setTimeout(() => {
205
- this._landReel(2, this.data.offset2, r2, 5);
206
- }, 500);
207
- this._stopTimer3 = setTimeout(() => {
208
- this._landReel(3, this.data.offset3, r3, 5);
209
- setTimeout(() => {
210
- this.setData({ spinning: false, stopping: false });
211
- this.triggerEvent('stopped', { resultIndex: [r1, r2, r3], won: won === true });
212
- }, 1400); // 等最后一条轴过渡完
213
- }, 1000);
214
-
215
- return true;
216
- },
217
-
218
- play() {
219
- this.spin();
220
- },
221
-
222
- pause() {
223
- this.stop();
224
- },
225
-
226
- onDrawTap() {
227
- this.spin();
228
- },
229
- },
230
- });
@@ -1 +0,0 @@
1
- {"component": true, "usingComponents": {}}
@@ -1,62 +0,0 @@
1
- <view class="slot-machine">
2
- <!-- 顶部横幅:抽奖进行中,文字跑马灯,常显 -->
3
- <view class="slot-banner">
4
- <view class="slot-banner-inner">
5
- <text class="slot-banner-text">{{remark}}</text>
6
- </view>
7
- </view>
8
-
9
- <!-- 机器主体 -->
10
- <view class="slot-body">
11
- <!-- 顶部装饰灯条 -->
12
- <view class="slot-top-lights">
13
- <view wx:for="{{12}}" wx:key="index" class="slot-light-bulb {{index % 2 === 0 ? 'on' : ''}}"></view>
14
- </view>
15
-
16
- <!-- 滚轴区域 -->
17
- <view class="slot-reels-container">
18
- <!-- 滚轴窗口 -->
19
- <view class="slot-reels-window">
20
- <!-- 滚轴1 -->
21
- <view class="slot-reel-wrap">
22
- <view class="slot-reel {{stopped1 ? 'stopped' : ''}}" style="transform: translateY({{offset1}}rpx);">
23
- <view wx:for="{{reelList}}" wx:key="index" class="slot-item">
24
- <text class="slot-emoji">{{item.emoji}}</text>
25
- <text class="slot-label">{{item.label}}</text>
26
- </view>
27
- </view>
28
- </view>
29
- <!-- 滚轴2 -->
30
- <view class="slot-reel-wrap">
31
- <view class="slot-reel {{stopped2 ? 'stopped' : ''}}" style="transform: translateY({{offset2}}rpx);">
32
- <view wx:for="{{reelList}}" wx:key="index" class="slot-item">
33
- <text class="slot-emoji">{{item.emoji}}</text>
34
- <text class="slot-label">{{item.label}}</text>
35
- </view>
36
- </view>
37
- </view>
38
- <!-- 滚轴3 -->
39
- <view class="slot-reel-wrap">
40
- <view class="slot-reel {{stopped3 ? 'stopped' : ''}}" style="transform: translateY({{offset3}}rpx);">
41
- <view wx:for="{{reelList}}" wx:key="index" class="slot-item">
42
- <text class="slot-emoji">{{item.emoji}}</text>
43
- <text class="slot-label">{{item.label}}</text>
44
- </view>
45
- </view>
46
- </view>
47
- </view>
48
- </view>
49
-
50
- <!-- 底部操作区 -->
51
- <view class="slot-bottom-area">
52
- <!-- 装饰小圆点 -->
53
- <view class="slot-dots">
54
- <view class="slot-dot" wx:for="{{7}}" wx:key="i"></view>
55
- </view>
56
- <!-- 抽奖按钮 -->
57
- <view class="slot-draw-btn" bindtap="onDrawTap">
58
- <text class="slot-btn-text">点我抽奖</text>
59
- </view>
60
- </view>
61
- </view>
62
- </view>
@@ -1 +0,0 @@
1
- .slot-machine{align-items:center;display:flex;flex-direction:column;width:500rpx}.slot-banner{margin-bottom:-20rpx;overflow:hidden;position:relative;width:100%;z-index:5}.slot-banner-inner{align-items:center;background:linear-gradient(90deg,#ff6b6b,#ee5a5a 50%,#ff6b6b);border:4rpx solid rgba(255,220,180,.8);border-bottom:none;border-radius:40rpx 40rpx 0 0;box-shadow:inset 0 2rpx 8rpx hsla(0,0%,100%,.3),0 -4rpx 12rpx rgba(200,50,30,.3);display:flex;overflow:hidden;padding:12rpx 30rpx;white-space:nowrap}.slot-banner-text{animation:slot-marquee 3s linear infinite;color:#fff;display:inline-block;font-size:28rpx;font-weight:700;letter-spacing:4rpx;line-height:1.2;padding-left:100%;text-shadow:0 2rpx 4rpx rgba(150,30,10,.5);white-space:nowrap}@keyframes slot-marquee{0%{transform:translateX(0)}to{transform:translateX(-100%)}}.slot-body{background:linear-gradient(180deg,#ff8c42,#ff6b35 25%,#e85d24 60%,#d14d18);border:4rpx solid rgba(255,200,140,.7);border-radius:16rpx;box-shadow:0 12rpx 40rpx rgba(200,70,20,.45),inset 0 2rpx 8rpx rgba(255,220,160,.25);padding:24rpx 20rpx 32rpx;position:relative;width:100%;z-index:3}.slot-top-lights{display:flex;gap:12rpx;justify-content:center;margin-bottom:20rpx;padding:0 10rpx}.slot-light-bulb{background:#c42;border-radius:50%;box-shadow:inset 0 -2rpx 4rpx rgba(0,0,0,.4);height:16rpx;width:16rpx}.slot-light-bulb.on{animation:slot-blink .6s ease-in-out infinite alternate;background:radial-gradient(circle at 35% 35%,#fff 0,#ffd93d 50%,#fa0 100%);box-shadow:0 0 10rpx 4rpx rgba(255,217,61,.7),inset 0 -2rpx 4rpx rgba(0,0,0,.15)}@keyframes slot-blink{0%{opacity:.6}to{opacity:1}}.slot-reels-container{align-items:stretch;display:flex;gap:0}.slot-reels-window{align-items:stretch;background:linear-gradient(180deg,#d9531e,#b8430f);border:12rpx solid #ffd93d;border-radius:16rpx;box-shadow:inset 0 0 0 5rpx rgba(120,45,10,.75),inset 0 5rpx 12rpx rgba(255,224,160,.45),inset 0 -10rpx 20rpx rgba(80,25,0,.5),0 0 0 4rpx rgba(255,217,61,.25),0 10rpx 32rpx rgba(120,40,10,.55);display:flex;flex:1;justify-content:space-evenly;overflow:hidden}.slot-reel-wrap{flex-shrink:0;height:240rpx;overflow:hidden;position:relative;width:140rpx}.slot-reel{display:flex;flex-direction:column;gap:4rpx;transition:none}.slot-reel.stopped{transition:transform .8s cubic-bezier(.17,.67,.12,.99)}.slot-item{align-items:center;background:linear-gradient(180deg,#fffdf8,#fff2dc);border:2rpx solid rgba(230,130,60,.4);border-radius:12rpx;box-shadow:inset 0 2rpx 4rpx hsla(0,0%,100%,.7),0 1rpx 3rpx rgba(180,100,40,.12);box-sizing:border-box;display:flex;flex-direction:column;flex-shrink:0;gap:4rpx;height:130rpx;justify-content:center;margin:0;width:140rpx}.slot-emoji{font-size:44rpx;line-height:1}.slot-label{color:#8b6914;font-size:20rpx;font-weight:500;line-height:1.2;white-space:nowrap}.slot-divider{background:linear-gradient(180deg,transparent,rgba(210,130,50,.4) 20%,rgba(210,130,50,.6) 50%,rgba(210,130,50,.4) 80%,transparent);flex-shrink:0;width:3rpx}.slot-bottom-area{align-items:center;flex-direction:column;margin-top:24rpx}.slot-bottom-area,.slot-dots{display:flex;gap:16rpx}.slot-dot{background:rgba(255,200,120,.6);border-radius:50%;box-shadow:inset 0 -1rpx 2rpx rgba(180,80,20,.3);height:12rpx;width:12rpx}.slot-draw-btn{animation:slot-btn-pulse 1.5s ease-in-out infinite;background:linear-gradient(180deg,#ffe066,#ffb830 40%,#f5a000);border:3rpx solid #e89400;border-radius:48rpx;box-shadow:0 6rpx 20rpx rgba(200,100,0,.4),inset 0 2rpx 4rpx rgba(255,255,220,.6),inset 0 -2rpx 4rpx rgba(180,80,0,.2);padding:18rpx 72rpx}@keyframes slot-btn-pulse{0%,to{box-shadow:0 6rpx 20rpx rgba(200,100,0,.4),inset 0 2rpx 4rpx rgba(255,255,220,.6),inset 0 -2rpx 4rpx rgba(180,80,0,.2);transform:scale(1)}50%{box-shadow:0 10rpx 30rpx rgba(200,100,0,.55),inset 0 2rpx 4rpx rgba(255,255,220,.7),inset 0 -2rpx 4rpx rgba(180,80,0,.2);transform:scale(1.04)}}.slot-btn-text{color:#8b4513;font-size:32rpx;font-weight:700;letter-spacing:6rpx;text-shadow:0 1rpx 2rpx rgba(255,250,230,.8)}
@@ -1,153 +0,0 @@
1
- Component({
2
- properties: {
3
- type: {
4
- type: String,
5
- value: 1,
6
- },
7
- // 抽奖 ID:用于区分不同抽奖的缓存 key
8
- lotteryId: {
9
- type: String,
10
- value: '',
11
- },
12
- width: {
13
- type: String,
14
- value: '100%',
15
- },
16
- height: {
17
- type: String,
18
- value: '100%',
19
- },
20
- remark: {
21
- type: String,
22
- value: '抽奖进行中...',
23
- },
24
- // 兼容原 lottie 版的属性透传,避免未知属性告警
25
- autoplay: {
26
- type: Boolean,
27
- value: false,
28
- },
29
- loop: {
30
- type: Boolean,
31
- value: false,
32
- },
33
- // 外部"消息"控制:true 开始无限转,false 平滑停止
34
- running: {
35
- type: Boolean,
36
- value: false,
37
- observer(val) {
38
- if (val) {
39
- this.playSegment();
40
- } else {
41
- this.stop();
42
- }
43
- },
44
- },
45
- },
46
-
47
- data: {
48
- spinning: false, // 是否处于无限旋转状态
49
- stopping: false, // 是否处于减速停止过渡
50
- angle: 0, // 当前旋转角度(deg),由 JS 驱动
51
- },
52
-
53
- lifetimes: {
54
- attached() {
55
- if (this.data.running) {
56
- // running 初始为 true 时直接开始
57
- this.playSegment();
58
- } else if (this._hasSpinCache()) {
59
- // 刷新前抽奖仍在进行(有缓存),进入页面后自动恢复旋转动画
60
- this.playSegment();
61
- }
62
- },
63
- detached() {
64
- // 注意:不在此清除缓存,保证刷新后仍能恢复动画
65
- this._clearTimer();
66
- },
67
- },
68
-
69
- methods: {
70
- _clearTimer() {
71
- if (this._timer) {
72
- clearInterval(this._timer);
73
- this._timer = null;
74
- }
75
- if (this._stopTimer) {
76
- clearTimeout(this._stopTimer);
77
- this._stopTimer = null;
78
- }
79
- },
80
-
81
- // 缓存 key:lottery_<lotteryId>_cache,标记"该抽奖仍在旋转/进行中"
82
- _cacheKey() {
83
- return `lottery_${this.data.lotteryId}_cache`;
84
- },
85
- _hasSpinCache() {
86
- return !!wx.getStorageSync(this._cacheKey());
87
- },
88
- _setSpinCache() {
89
- wx.setStorageSync(this._cacheKey(), true);
90
- },
91
- _clearSpinCache() {
92
- wx.removeStorageSync(this._cacheKey());
93
- },
94
-
95
- // 点击中心按钮:开始无限循环旋转,并通知父组件"用户发起抽奖"
96
- playSegment() {
97
- // 进行中或减速过渡阶段,忽略重复点击,避免动画重复执行 / 重复上报抽奖
98
- if (this.data.spinning || this.data.stopping) return;
99
- this._clearTimer();
100
- this.setData({ spinning: true, stopping: false });
101
- // 记录缓存:抽奖进行中,刷新后可据此恢复动画
102
- this._setSpinCache();
103
- // 每帧递增角度,约 360deg/s,纯 CSS 旋转由 transform 驱动
104
- this._timer = setInterval(() => {
105
- this.data.angle += 6;
106
- this.setData({ angle: this.data.angle });
107
- }, 16);
108
- // 透传给父组件,便于其触发服务端抽奖
109
- this.triggerEvent('draw');
110
- },
111
-
112
- // 兼容旧接口:开始旋转
113
- play() {
114
- this.playSegment();
115
- },
116
-
117
- // 平滑停止。resultIndex 可选:停到该扇区中心(指针在正上方)
118
- // 返回 true 表示确实触发了减速停止;false 表示当前并未在转(无需等待)
119
- stop(resultIndex) {
120
- if (!this.data.spinning && !this.data.stopping) return false;
121
- this._clearTimer();
122
- // 抽奖已结束(服务端已返回结果),清除进行中缓存
123
- this._clearSpinCache();
124
- const current = this.data.angle;
125
- let finalAngle = current + 360 * 5; // 默认再转 5 圈后停在当前相对位置
126
- if (typeof resultIndex === 'number') {
127
- // 扇区 i 中心角度(顺时针、自正上方起) = i*45 + 22.5
128
- const center = (resultIndex % 8) * 45 + 22.5;
129
- // 旋转后使该扇区中心对齐到正上方(0deg):R ≡ -center (mod 360)
130
- const land = (360 - center) % 360;
131
- const base = current - (current % 360);
132
- finalAngle = base + 360 * 5 + land;
133
- // 保证比当前角度更大(始终向前转)
134
- if (finalAngle < current + 360) finalAngle += 360;
135
- }
136
- // 先切到 stopping(带 transition),再写入最终角度触发平滑减速
137
- this.setData({ spinning: false, stopping: true }, () => {
138
- this.setData({ angle: finalAngle });
139
- });
140
- // 减速过渡结束后复位 stopping 状态,并通知父组件"已停止"
141
- this._stopTimer = setTimeout(() => {
142
- this.setData({ stopping: false });
143
- this.triggerEvent('stopped', { angle: finalAngle, resultIndex });
144
- }, 4000);
145
- return true;
146
- },
147
-
148
- // 兼容旧接口:暂停(不带落点)
149
- pause() {
150
- this.stop();
151
- },
152
- },
153
- });
@@ -1,4 +0,0 @@
1
- {
2
- "component": true,
3
- "usingComponents": {}
4
- }
@@ -1,91 +0,0 @@
1
- <view class="lottery-wheel-container lottery-wheel-{{type}}">
2
- <view class="lottery-wheel-wrapper">
3
- <!-- 底座 -->
4
- <view class="lottery-base"></view>
5
-
6
- <!-- 转盘主体(angle 由 JS 驱动,stopping 触发减速过渡) -->
7
- <view class="lottery-wheel-disc {{stopping ? 'stopping' : ''}}" style="transform: rotate({{angle}}deg);">
8
- <!-- 8 个扇区(含文字+emoji) -->
9
- <view class="lottery-segment lottery-segment-even" style="--i:0; --rot:0deg;">
10
- <view class="lottery-segment-content">
11
- <text class="lottery-segment-text">恭喜中奖</text>
12
- <text class="lottery-segment-emoji">🎁</text>
13
- </view>
14
- </view>
15
- <view class="lottery-segment lottery-segment-odd" style="--i:1; --rot:45deg;">
16
- <view class="lottery-segment-content">
17
- <text class="lottery-segment-text">谢谢参与</text>
18
- <text class="lottery-segment-emoji">😊</text>
19
- </view>
20
- </view>
21
- <view class="lottery-segment lottery-segment-even" style="--i:2; --rot:90deg;">
22
- <view class="lottery-segment-content">
23
- <text class="lottery-segment-text">恭喜中奖</text>
24
- <text class="lottery-segment-emoji">🎁</text>
25
- </view>
26
- </view>
27
- <view class="lottery-segment lottery-segment-odd" style="--i:3; --rot:135deg;">
28
- <view class="lottery-segment-content">
29
- <text class="lottery-segment-text">谢谢参与</text>
30
- <text class="lottery-segment-emoji">😊</text>
31
- </view>
32
- </view>
33
- <view class="lottery-segment lottery-segment-even" style="--i:4; --rot:180deg;">
34
- <view class="lottery-segment-content">
35
- <text class="lottery-segment-text">恭喜中奖</text>
36
- <text class="lottery-segment-emoji">🎁</text>
37
- </view>
38
- </view>
39
- <view class="lottery-segment lottery-segment-odd" style="--i:5; --rot:225deg;">
40
- <view class="lottery-segment-content">
41
- <text class="lottery-segment-text">谢谢参与</text>
42
- <text class="lottery-segment-emoji">😊</text>
43
- </view>
44
- </view>
45
- <view class="lottery-segment lottery-segment-even" style="--i:6; --rot:270deg;">
46
- <view class="lottery-segment-content">
47
- <text class="lottery-segment-text">恭喜中奖</text>
48
- <text class="lottery-segment-emoji">🎁</text>
49
- </view>
50
- </view>
51
- <view class="lottery-segment lottery-segment-odd" style="--i:7; --rot:315deg;">
52
- <view class="lottery-segment-content">
53
- <text class="lottery-segment-text">谢谢参与</text>
54
- <text class="lottery-segment-emoji">😊</text>
55
- </view>
56
- </view>
57
- </view>
58
-
59
- <!-- 外圈灯泡装饰(兄弟节点,避免被盘面圆形裁剪;与盘面同步旋转) -->
60
- <view class="lottery-lights {{stopping ? 'stopping' : ''}}" style="transform: rotate({{angle}}deg);">
61
- <view class="lottery-light"></view>
62
- <view class="lottery-light"></view>
63
- <view class="lottery-light"></view>
64
- <view class="lottery-light"></view>
65
- <view class="lottery-light"></view>
66
- <view class="lottery-light"></view>
67
- <view class="lottery-light"></view>
68
- <view class="lottery-light"></view>
69
- <view class="lottery-light"></view>
70
- <view class="lottery-light"></view>
71
- <view class="lottery-light"></view>
72
- <view class="lottery-light"></view>
73
- </view>
74
-
75
- <!-- 顶部抽奖指针(向上,底部贴着中心按钮) -->
76
- <view class="lottery-pointer">
77
- <view class="lottery-pointer-inner"></view>
78
- </view>
79
-
80
- <!-- 中心按钮:点我抽奖(不随盘面旋转,独立无限缩放) -->
81
- <view class="lottery-center-btn" bindtap="playSegment">
82
- <text class="lottery-center-btn-text">点我</text>
83
- <text class="lottery-center-btn-text">抽奖</text>
84
- </view>
85
-
86
- <!-- 状态文案:常显 -->
87
- <view class="lotterying">
88
- <view class="lotterying-text">{{remark}}</view>
89
- </view>
90
- </view>
91
- </view>
@@ -1 +0,0 @@
1
- .lottery-wheel-container{align-items:center;display:flex;flex-direction:column;justify-content:center}.lottery-wheel-wrapper{height:720rpx;position:relative;width:750rpx}.lottery-base{background:linear-gradient(180deg,#e63e30,#c41a0d);border-radius:20rpx 20rpx 60rpx 60rpx;bottom:0;box-shadow:0 10rpx 30rpx rgba(198,26,13,.5),inset 0 4rpx 0 hsla(0,0%,100%,.2);height:120rpx;width:360rpx;z-index:16}.lottery-base,.lottery-base:after{left:50%;position:absolute;transform:translateX(-50%)}.lottery-base:after{background:rgba(0,0,0,.15);border-radius:20rpx;content:"";height:40rpx;top:20rpx;width:320rpx}.lottery-wheel-disc{background:transparent;border-radius:50%;box-shadow:0 8rpx 30rpx rgba(0,0,0,.25);height:440rpx;left:50%;margin-left:-220rpx;margin-top:-200rpx;overflow:hidden;position:absolute;top:50%;width:440rpx;z-index:10}.lottery-wheel-disc:after{border:8rpx solid rgba(230,62,48,.7);border-radius:50%;z-index:6}.lottery-wheel-disc:after,.lottery-wheel-disc:before{content:"";inset:0;pointer-events:none;position:absolute}.lottery-wheel-disc:before{background:repeating-conic-gradient(from 22.5deg,transparent 0deg 44deg,rgba(200,60,40,.45) 44deg 45deg);border-radius:50%;z-index:5}.lottery-wheel-disc.stopping{transition:transform 4s cubic-bezier(.17,.67,.12,.99)}.lottery-segment{height:100%;left:0;position:absolute;top:0;transform:rotate(calc(var(--rot)));transform-origin:center center;width:100%}.lottery-segment .lottery-segment-content{align-items:center;display:flex;flex-direction:column;justify-content:center;left:50%;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%) translateY(-145rpx);width:150rpx}.lottery-segment .lottery-segment-text{font-size:24rpx;font-weight:700;white-space:nowrap}.lottery-segment .lottery-segment-emoji{font-size:36rpx;line-height:1.2}.lottery-segment-even{background:conic-gradient(from -22.5deg,#ff8c42 0deg 45deg,transparent 45deg 1turn)}.lottery-segment-even .lottery-segment-text{color:#fff;text-shadow:0 2rpx 4rpx rgba(0,0,0,.25)}.lottery-segment-odd{background:conic-gradient(from -22.5deg,#fff1d6 0deg 45deg,transparent 45deg 1turn)}.lottery-segment-odd .lottery-segment-text{color:#c41a0d}.lottery-lights{border-radius:50%;height:440rpx;left:50%;margin-left:-220rpx;margin-top:-200rpx;pointer-events:none;position:absolute;top:50%;width:440rpx;z-index:15}.lottery-lights.stopping{transition:transform 4s cubic-bezier(.17,.67,.12,.99)}.lottery-lights .lottery-light{animation:lottery-light-blink .8s ease-in-out infinite alternate;background:radial-gradient(circle at 35% 35%,#fff 0,#ffd93d 50%,#fa0 100%);border-radius:50%;box-shadow:0 0 12rpx 4rpx rgba(255,217,61,.8);height:20rpx;left:50%;margin-left:-10rpx;margin-top:-10rpx;position:absolute;top:50%;transform-origin:center;width:20rpx}.lottery-lights .lottery-light:first-child{transform:rotate(0deg) translateX(235rpx)}.lottery-lights .lottery-light:nth-child(2){transform:rotate(30deg) translateX(235rpx)}.lottery-lights .lottery-light:nth-child(3){transform:rotate(60deg) translateX(235rpx)}.lottery-lights .lottery-light:nth-child(4){transform:rotate(90deg) translateX(235rpx)}.lottery-lights .lottery-light:nth-child(5){transform:rotate(120deg) translateX(235rpx)}.lottery-lights .lottery-light:nth-child(6){transform:rotate(150deg) translateX(235rpx)}.lottery-lights .lottery-light:nth-child(7){transform:rotate(180deg) translateX(235rpx)}.lottery-lights .lottery-light:nth-child(8){transform:rotate(210deg) translateX(235rpx)}.lottery-lights .lottery-light:nth-child(9){transform:rotate(240deg) translateX(235rpx)}.lottery-lights .lottery-light:nth-child(10){transform:rotate(270deg) translateX(235rpx)}.lottery-lights .lottery-light:nth-child(11){transform:rotate(300deg) translateX(235rpx)}.lottery-lights .lottery-light:nth-child(12){transform:rotate(330deg) translateX(235rpx)}.lottery-lights .lottery-light:nth-child(2n){animation-delay:.4s}@keyframes lottery-light-blink{0%{box-shadow:0 0 12rpx 4rpx rgba(255,217,61,.9);opacity:1}to{box-shadow:0 0 6rpx 2rpx rgba(255,217,61,.4);opacity:.5}}.lottery-center-btn{align-items:center;animation:lottery-btn-zoom .8s ease-in-out infinite alternate;background:linear-gradient(145deg,#ff6b5b,#e63e30);border:3rpx solid #ffd93d;border-radius:50%;box-shadow:0 4rpx 16rpx rgba(198,26,13,.5),inset 0 2rpx 4rpx hsla(0,0%,100%,.3);color:#fff;display:flex;flex-direction:column;height:100rpx;justify-content:center;left:50%;margin-left:-50rpx;margin-top:-30rpx;position:absolute;top:50%;width:100rpx;z-index:20}.lottery-center-btn:active{opacity:.85}.lottery-center-btn .lottery-center-btn-text{font-size:20rpx;font-weight:700;line-height:1.2;text-shadow:0 2rpx 4rpx rgba(0,0,0,.2)}.lottery-pointer{background:#ffd93d;-webkit-filter:drop-shadow(0 3rpx 6rpx rgba(0,0,0,.25));filter:drop-shadow(0 3rpx 6rpx rgba(0,0,0,.25));height:40rpx;left:50%;top:290rpx;transform:translateX(-50%);width:44rpx;z-index:18}.lottery-pointer,.lottery-pointer-inner{-webkit-clip-path:polygon(50% 0,0 100%,100% 100%);clip-path:polygon(50% 0,0 100%,100% 100%);position:absolute}.lottery-pointer-inner{background:linear-gradient(90deg,#ff7a6a,#ff7a6a 50%,#d62f23 0,#d62f23);bottom:0;left:4rpx;right:4rpx;top:4rpx}@keyframes lottery-btn-zoom{0%{transform:scale(1)}to{transform:scale(1.12)}}.lotterying{bottom:60rpx;color:#fff;font-size:28rpx;left:50%;margin-left:-150rpx;overflow:hidden;position:absolute;width:300rpx;z-index:999}.lotterying .lotterying-text{animation:marquee 3s linear infinite;display:inline-block;padding-left:100%;white-space:nowrap}@keyframes marquee{0%{transform:translateX(0)}to{transform:translateX(-100%)}}
@@ -1,101 +0,0 @@
1
- Component({
2
- properties: {
3
- visible: {
4
- type: Boolean,
5
- value: false,
6
- },
7
- lotteryId: {
8
- type: String,
9
- value: '',
10
- },
11
- sdkInstance: {
12
- type: Object,
13
- value: null,
14
- },
15
- },
16
-
17
- data: {
18
- winnersList: [],
19
- total: 0,
20
- pos: 0,
21
- limit: 20,
22
- loading: false,
23
- hasMore: true,
24
- },
25
-
26
- observers: {
27
- visible: function (visible) {
28
- if (visible) {
29
- this.initWinnersList();
30
- } else {
31
- this.setData({
32
- winnersList: [],
33
- pos: 0,
34
- hasMore: true,
35
- });
36
- }
37
- },
38
- },
39
-
40
- methods: {
41
- async initWinnersList() {
42
- this.setData({
43
- winnersList: [],
44
- pos: 0,
45
- hasMore: true,
46
- loading: true,
47
- });
48
- await this.loadWinnersList();
49
- },
50
-
51
- async loadWinnersList() {
52
- if (!this.properties.lotteryId || !this.properties.sdkInstance) return;
53
-
54
- const { lotteryId, sdkInstance } = this.properties;
55
- const { pos, limit } = this.data;
56
-
57
- try {
58
- const lotteryServer = sdkInstance.get('lotteryServer');
59
- if (!lotteryServer) return;
60
- const res = await lotteryServer.getWinnerList({
61
- lottery_id: lotteryId,
62
- pos,
63
- limit,
64
- });
65
-
66
- if (res && res.code === 200 && res.data) {
67
- const newList = res.data.list || [];
68
- const total = res.data.total || 0;
69
-
70
- this.setData({
71
- winnersList: pos === 0 ? newList : [...this.data.winnersList, ...newList],
72
- total,
73
- hasMore: pos + newList.length < total,
74
- loading: false,
75
- });
76
- } else {
77
- this.setData({ loading: false });
78
- }
79
- } catch (err) {
80
- console.error('获取中奖名单失败:', err);
81
- this.setData({ loading: false });
82
- }
83
- },
84
-
85
- onScrollToLower() {
86
- if (this.data.loading || !this.data.hasMore) return;
87
-
88
- this.setData({
89
- pos: this.data.pos + this.data.limit,
90
- loading: true,
91
- });
92
-
93
- this.loadWinnersList();
94
- },
95
-
96
- close() {
97
- this.setData({ visible: false });
98
- this.triggerEvent('close');
99
- },
100
- },
101
- });
@@ -1,4 +0,0 @@
1
- {
2
- "component": true,
3
- "usingComponents": {}
4
- }