GoForum🌐 V2EX

年会抽奖被迫营业,写了个转盘轮子,最后失控了

Fechin · 2026-01-22 09:47 · 0 次点赞 · 9 条回复

人事小姐姐是我的饭搭子,跟我说年会要搞抽奖,问我有没有好用的在线转盘。

我随手发了几个链接给她,结果她一个个试完来吐槽:

  • Wheel of Names:不能同时转多个轮子,她想一边抽人一边抽奖品
  • 某国产转盘:广告太多,界面丑,领导看了要皱眉
  • 随机数生成器:太干了,没有仪式感

总之就是不体面,我说行吧,周末我给你写一个。

结果这一写,失控了。

刚开始想的很简单,就一个 Canvas 画个轮子,Math.random 选个结果。但写着写着开始较真:

  1. Math.random 不够随机。查了下发现如果要”公平抽奖”,应该用 crypto.getRandomValues(),这是密码学安全的随机数生成器。既然都做了,那就做对。
  2. 她要同时抽人+抽奖品。那就支持多轮盘吧,最多 6 个同时转。转完自动记录中奖历史。
  3. 中奖了的不能重复中。加了淘汰模式,中一个自动移除。
  4. 另外还加了绿幕模式,一键全屏纯绿底。
  5. 做了短链,方便分享或者保存自己定制好的转盘,用 Cloudflare Worker 写了个 API ,转盘配置存起来生成短链,发个链接别人就能用。

做完发现功能有点多了:

  • 多转盘同时旋转
  • 权重设置(买 5 张票的人权重设 5 )
  • 淘汰模式
  • 倒计时模式( 3 、2 、1 开始!)
  • OBS 绿幕
  • 导入导出 JSON
  • 8 种语言
  • 本地自动保存

UI 也花了点心思,年会现场投屏效果挺好。暗色模式是青绿色系,亮色是橙粉系,看着挺舒 服的。

技术栈是 Next.js + React + TailwindCSS ,整了个 monorepo 用 Turborepo 管理,状态用 Nuqs 存 URL 参数方便分享。分享功能单独拆了个 Cloudflare Worker ,响应挺快的。

地址:gospinwheel.com


对了,快过年了,除了年会抽奖,其实过年聚会也能用:

  • 真心话大冒险:一个轮子选人,一个轮子选”真心话/大冒险”,再来一个轮子选具体问题或任务
  • 谁洗碗:吃完年夜饭,全家人名字往里一扔,转
  • 今晚吃啥:火锅/烧烤/日料/随便,选择困难症救星
  • 该谁发红包了:下一个谁发?转盘决定,公平公正
  • 喝酒游戏:转到谁谁喝,配合淘汰模式,喝过的自动移除,雨露均沾

反正我过年准备拿这个整活了,投屏到电视上效果应该不错。

有什么建议欢迎提,毕竟本来只是帮人事做个小工具…

9 条回复
Tumblr · 2026-01-22 09:57
#1

hmm 。。。看了一下,我的英文名字在上面,随手转了一下,然后抽到了我自己。。。

zhw2590582 · 2026-01-22 09:57
#2

你们的这种场景,Math.random 完成完全没问题

corcre · 2026-01-22 10:02
#3

还有一个功能是点击开始然后老板在上面 bb 半天再次点击才开始停下来 如果还能设置奖项然后记录每次抽奖的奖项并且限定奖项的数量的话应该就是我老东家想要的了(但是我已经领大礼包了🐶

needpp · 2026-01-22 10:07
#4

很好,刚好有个域名 下班了鞭策 ai vibe 一个

pol · 2026-01-22 10:07
#5

失控你,我以为在年会上出 bug 炸了,白高兴你 https://i.imgur.com/OVQjxIr.png

myarsenal · 2026-01-22 10:07
#6

中奖后生成的图片应该能显示奖品是什么。所以你应该增加选项在抽奖前输入本次奖品。

bobox · 2026-01-22 10:07
#7

交给 ai ,几分钟就写好了

iddddg · 2026-01-22 10:12
#8

域名江苏跳反诈了

cheng812 · 2026-01-22 10:12
#9

十几年前给某前十市电视台写过一个类似的抽奖玩意,可以提前设置中奖人,那时候流行楼盘开盘时电视直播抽奖😩

添加回复
你还需要 登录 后发表回复

登录后可发帖和回复

登录 注册
主题信息
作者: Fechin
发布: 2026-01-22
点赞: 0
回复: 0