一个功能丰富的年会/活动抽奖系统,支持大屏展示、多奖项管理。
- 单文件部署:构建后生成单个 HTML 文件,可直接用浏览器打开,无需服务器
- 大屏展示:精美的欢迎页、奖项页、抽奖页,支持全屏展示
- 滚动动画:抽奖时姓名滚动带有加速/减速效果,停止后有撒花庆祝特效
- 多奖项管理:支持自定义奖项名称、数量、奖品描述
- 数据持久化:所有数据保存在浏览器本地,刷新不丢失
- 下载
dist/index.html文件 - 用浏览器打开即可使用
- 访问
index.html#/admin进入后台管理
# 安装依赖
npm install
# 启动开发服务器
npm run dev
# 构建生产版本
npm run build| 路径 | 说明 |
|---|---|
#/ |
大屏展示页(用于投影/大屏幕) |
#/admin |
后台管理页 |
默认密码:admin(可在系统设置中修改)
功能标签页:
- 抽奖控制:切换大屏场景、选择奖项、开始/停止抽奖
- 参与者:导入 CSV、查看/编辑参与者列表
- 奖项管理:添加/编辑/删除奖项
- 中奖记录:查看历史中奖名单、导出记录
- 系统设置:自定义标题、Logo、密码等
基础格式(两列):
姓名,部门
张三,技术部
李四,市场部
王五,人事部支持键盘快捷键:
空格键:开始/停止抽奖回车键:锁定当前结果(切换到下一轮)
通过 URL 参数 ?controlled=1 解锁(注意参数要放在 # 之前):
index.html?controlled=1#/admin
或本地开发时:
http://localhost:5173/?controlled=1#/admin
解锁后可使用:
- 必中奖项:指定某人必中特定奖项
- 禁止中奖:将某人加入黑名单
- 权重设置:调整中奖概率(1-10)
姓名,部门,必中奖项(奖项名称),禁止中奖(是/否),权重(1-10)
张三,技术部,一等奖,,
李四,市场部,,是,
王五,人事部,,,5- React 19 + TypeScript
- Tailwind CSS v4
- Zustand(状态管理)
- Framer Motion(动画)
- Wouter(路由,支持 hash 模式)
- Vite + vite-plugin-singlefile(单文件构建)
所有数据存储在浏览器本地:
| 存储类型 | 内容 | 说明 |
|---|---|---|
| localStorage | 参与者、奖项、中奖记录、设置 | 持久保存 |
| sessionStorage | 登录状态 | 关闭浏览器后失效 |
注意事项:
- 后台和大屏需在同一浏览器中打开才能同步
- 清除浏览器数据会丢失所有记录
- 密码为明文存储,仅作为简单防误触保护
src/
├── components/
│ └── RollingBoard.tsx # 大屏展示组件
├── pages/
│ └── AdminPage.tsx # 后台管理页
├── store/
│ └── useStore.ts # Zustand 状态管理
├── lib/
│ ├── types.ts # TypeScript 类型定义
│ └── lottery-logic.ts # 抽奖算法
└── App.tsx # 路由入口
MIT
本项目仅用于展示 AI 编程效果,开发者不对使用本项目产生的任何后果承担责任。使用者需自行承担使用风险。