我用 Vue3 + Fastify + Prisma 做了个 3D 抽奖舞台:Lucky Sphere 开奖 + 朋友圈红包(含免费部署踩坑)

1 阅读4分钟

我用 Vue3 + Fastify + Prisma 做了个 3D 抽奖舞台:Lucky Sphere 开奖 + 朋友圈红包(含免费部署踩坑)

先放链接(演示 & 源码)

说明:演示站使用免费部署,可能冷启动;数据不承诺长期保存。需要稳定版可自行部署或联系我。

2 分钟快速体验(推荐从朋友圈玩法开始)

  1. 打开演示站首页(默认托管模式):lucky-sphere-lottery-aiw.pages.dev/
  2. 创建一个“朋友圈红包”房间,会得到:
    • 参与链接(房间链接)
    • 6 位口令
  3. 用无痕窗口打开参与链接,输入口令 + 昵称,点“进入房间”体验开奖与榜单

我自己的管理员入口:/?admin=1(恢复全功能入口,仅自己用;避免对外暴露管理端/年会抽奖入口)。

背景:我想解决什么问题?

春节/年会场景里,“线上抽奖”通常有两个痛点:

  • 结果页太干:开奖没有仪式感
  • 传播链路不顺:链接怎么发、怎么隔离、怎么防止乱刷

所以我把项目做成两条线:

  • 年会抽奖(管理端控制):活动/奖项/名单/抽奖/结果可见性
  • 朋友圈红包(C 端):6 位口令入房,人人抽一次,有榜单

技术选型(尽量快、尽量稳)

  • 前端:Vue 3 + Vite + TypeScript
  • 3D:Three.js(Lucky Sphere + 开奖卡 + 彩纸)
  • 后端:Fastify + TypeScript
  • DB:Prisma + SQLite(先跑通体验,后续可换 Postgres)
  • 单仓:pnpm workspace(前后端同仓,部署/迭代更顺)

3D Lucky Sphere 舞台:怎么做“像抽奖”?

我把体验拆成三段,让用户“看着就想点”:

1)抽奖前:球面铺满卡片

人数少时,如果球很空会显得很“demo”。我做了“装饰卡”补位:

  • 真实参与者:显示昵称
  • 装饰卡:不显示昵称(只参与视觉,不参与抽奖)

2)抽奖中:旋转加速 + 名字 ticker

  • 球体旋转加速(氛围)
  • 名字 ticker 快速滚动(氛围)
  • 最终开奖结果以后端为准(避免“纯前端抽奖”争议)

3)开奖瞬间:中奖卡居中弹出 + 彩纸爆炸

  • 中奖卡片居中弹出(带“恭喜中奖”)
  • 彩纸从卡片背后爆炸,并自然下落(而不是“圆点闪烁”)

实现要点(复盘版先讲思路,不贴长代码):

  • 卡片贴图:CanvasTexture 动态生成金红主题卡面(昵称、福字印章)
  • 对焦赢家:四元数插值(slerp)让球回正并聚焦到中奖卡
  • 彩纸粒子:速度/重力/阻尼/寿命,做出“爆炸后飘落”的感觉

权限与隔离:让“托管模式”可用

我现在优先做“朋友圈托管版”(别人不部署,直接用我的线上部署):

  • 房间隔离:每个房间 roomId + 6 位口令
  • 进入/领取/榜单:都需要口令校验
  • 同设备限领一次:避免重复领取
  • 轻量防刷:对创建/进入/领取/榜单做 IP 级限流(演示级,防脚本/误触)

托管模式入口策略

为了降低暴露面,我做了“托管模式”:

  • 默认入口只露“朋友圈红包”
  • 管理员入口我自己用:/?admin=1(恢复全功能入口)

你可以直接试:

免费部署踩坑(真实踩过)

Render(后端)

  • 免费实例可能休眠,第一次请求会慢(冷启动 10~60 秒都可能)
  • NODE_ENV=production 时注意 devDependencies(Prisma CLI)问题

Cloudflare Pages(前端)

  • 构建环境通常已经有 pnpm,不要在 build command 里重复全局安装(可能触发 pnpx 冲突)
  • 前端必须配置 VITE_API_BASE 指向后端域名,否则线上请求同域 /api 会 405/404

现在能用到什么程度?

  • 朋友圈玩法:创建房间 -> 发链接和口令 -> 朋友进入领取 -> 看榜单
  • 年会抽奖:管理端建活动、导入名单、进 3D 舞台抽奖、结果页可控

常见问题(我先替你踩坑)

1)为什么第一次打开很慢?

演示站使用免费部署,后端可能休眠,第一次访问会触发冷启动;再刷新/稍等通常就好。

2)数据会一直保存吗?

不承诺。SQLite + 免费平台更适合演示/短期活动;想长期运营建议换 Postgres,并做备份/监控。

3)别人能猜到管理端入口吗?

托管模式下我把对外入口简化为朋友圈玩法;管理端只留给自己:/?admin=1

最后:如果你想快速用起来

  • 托管版(直接用我部署跑):39 起
  • 远程部署/排障支持(部署到你账号):69 起

联系邮箱:64809547@qq.com