Skip to content

bigsinger/lottery

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 

Repository files navigation

🎯 幸运抽奖 - 可配置转盘抽奖程序

一个基于 HTML/CSS/JS 的转盘抽奖网页程序,支持个性化配置、本地存储、多模式切换、多设备同步。

✨ 特性

  • 🎨 可视化转盘 - Canvas 绘制,流畅旋转动画,文字在上图标在下
  • ⚙️ 高度可配置 - 自定义选项、权重、颜色、图标
  • 💾 智能存储 - 本地存储 + 多设备同步(可选 PHP 后端)
  • 🔄 多模式 - URL 参数切换不同抽奖场景
  • 📱 响应式 - 支持桌面端和移动端(已优化手机端渲染)
  • 🚀 零依赖 - 纯静态文件,可选 PHP 后端
  • 🎯 双场景支持 - 抽奖品、抽人两种应用场景
  • 🌐 多设备同步 - PHP 后端支持配置跨设备同步
  • 中奖可视化 - 绿色徽章显示抽中次数

🎯 应用场景

场景一:抽奖品

适用于各类活动、促销、年会等场景,设置奖品列表进行抽奖。

示例配置

  • 一等奖:iPhone 15
  • 二等奖:京东礼品卡
  • 三等奖:精美笔记本
  • 谢谢参与

场景二:抽人

适用于公司、班级、团队等场景,设置人员名单进行随机抽取。

典型应用

  • 公司年会抽奖员工
  • 班级随机点名回答问题
  • 团队随机分配任务
  • 会议随机选择发言人

使用方法

  1. 点击「导入」按钮,批量粘贴人员名单(每行一个姓名)
  2. 设置权重控制被抽中的概率
  3. 设置最大中奖次数,避免重复抽中同一人
  4. 点击「重置」按钮可开始新一轮抽取

📦 快速开始

本地预览

  1. 下载 src 目录
  2. 双击打开 index.html
  3. 即可开始使用

🚀 部署指南

方式一:GitHub Pages(推荐,免费)

步骤

  1. Fork 本仓库到你的 GitHub 账号
  2. 进入仓库设置:SettingsPages
  3. Source 选择 Deploy from a branch
  4. Branch 选择 main,目录选择 /src
  5. 点击 Save
  6. 等待部署完成,访问 https://你的用户名.github.io/lottery/

优点:免费、自动 HTTPS、无需服务器

方式二:Vercel(推荐,免费)

步骤

  1. 访问 Vercel 并登录
  2. 点击 New Project
  3. 导入你的 GitHub 仓库
  4. Framework Preset 选择 Other
  5. Root Directory 设置为 src
  6. 点击 Deploy
  7. 等待部署完成,获得访问链接

优点:免费、自动 HTTPS、全球 CDN、自定义域名

方式三:Netlify(免费)

步骤

  1. 访问 Netlify 并登录
  2. 点击 Add new siteDeploy manually
  3. src 目录拖拽上传
  4. 等待部署完成,获得访问链接

或者连接 GitHub

  1. 点击 Add new siteImport an existing project
  2. 选择你的 GitHub 仓库
  3. Publish directory 设置为 src
  4. 点击 Deploy site

优点:免费、自动 HTTPS、持续部署

方式四:传统虚拟主机(支持多设备同步)

步骤

  1. 购买支持 PHP 的虚拟主机或使用已有主机
  2. 通过 FTP 或主机控制面板上传文件
  3. src 目录下所有文件上传到网站根目录或子目录
  4. 确保 user/ 目录有写入权限(chmod 755)
  5. 访问你的域名即可使用

优点:完全控制、可绑定自有域名、支持多设备配置同步

多设备同步使用方法

https://your-domain.com/lottery/index.html?user=张三
https://your-domain.com/lottery/index.html?user=张三&mode=team1
https://your-domain.com/lottery/index.html?user=张三&mode=class1

参数说明

  • user 参数:指定 JSON 配置文件名(如 user/张三.json
  • mode 参数:指定在该 JSON 文件中使用哪个 mode 配置
  • 一个 user 的 JSON 文件可以包含多个 mode 配置

数据结构

{
  "user": "张三",
  "modes": {
    "default": { "title": "...", "prizes": [...], "updatedAt": "..." },
    "team1": { "title": "...", "prizes": [...], "updatedAt": "..." },
    "class1": { "title": "...", "prizes": [...], "updatedAt": "..." }
  },
  "updatedAt": "..."
}

使用场景

  • 同一用户在不同设备上使用相同链接,配置自动同步
  • 一个用户可以创建多个独立的抽奖模式(如团队抽奖、班级抽奖、活动抽奖)
  • 如果指定的 mode 不存在,保存时会自动创建
  • user 参数时,使用本地存储(仅当前设备可用)

方式五:本地服务器

Python 方式

cd src
python -m http.server 8080
# 访问 http://localhost:8080

Node.js 方式

npx serve src
# 访问 http://localhost:3000

优点:本地测试、无需联网


部署对比

方式 费用 HTTPS 自定义域名 多设备同步 技术难度
GitHub Pages 免费
Vercel 免费
Netlify 免费
虚拟主机(PHP) 付费 ⚠️ ⭐⭐
本地服务器 免费

注意:GitHub Pages / Vercel / Netlify 不支持 PHP,无法使用多设备同步功能。如需多设备同步,请使用传统虚拟主机部署。


多模式使用

通过 URL 参数切换不同抽奖模式:

https://your-domain.com/lottery/index.html?mode=team1
https://your-domain.com/lottery/index.html?mode=team2
https://your-domain.com/lottery/index.html?mode=class1
https://your-domain.com/lottery/index.html?mode=company

每个模式拥有独立的配置存储。

🎮 功能说明

基本操作

  • 点击「开始抽奖」按钮进行抽奖
  • 转盘旋转后显示中奖结果
  • 结果自动保存历史记录

配置设置

点击右上角「⚙」按钮打开设置面板:

  • 标题修改 - 自定义抽奖标题
  • 选项管理 - 添加/编辑/删除/清空/导入
  • 权重设置 - 0-100 百分比概率控制
  • 最大中奖次数 - 控制每个选项最多被抽中多少次
  • 图标选择 - 12种预制图标
  • 颜色选择 - 8种预制颜色
  • 重置功能 - 重置中奖次数,开始新一轮

编辑优化

  • 点击编辑按钮后自动滚动到编辑区域
  • 编辑完成后使用设置面板底部的「保存」按钮统一保存
  • 编辑区域的单独保存/取消按钮已移除

选项属性

属性 说明
名称 选项显示名称(奖品名或人名)
图标 预制图标(可选)
颜色 扇形背景颜色
权重 0-100 百分比概率,0=永不中奖,100=必中
最大中奖次数 该选项最多可被抽中多少次

权重系统

权重采用百分比制(0-100):

  • 权重 0:该选项永远不会被抽中
  • 权重 100:该选项必定被抽中(100%概率)
  • 权重 10-50:正常参与随机抽取

中奖次数限制

  • 每个选项可设置最大中奖次数(默认为1)
  • 达到最大中奖次数后,该选项不再参与抽奖
  • 点击「重置」按钮可清零所有中奖次数,开始新一轮

批量导入

点击「导入」按钮,可批量粘贴选项名称:

  • 每行一个名称
  • 名称不超过10字
  • 最多支持批量导入多个选项
  • 适用于抽人场景快速导入人员名单

中奖可视化

  • 已抽中的选项显示绿色背景徽章
  • 徽章显示抽中次数(次数为0时不显示)
  • 用户指示器与模式指示器风格统一

📁 目录结构

lottery/
├── doc/                    # 文档目录
│   ├── 需求文档.md
│   ├── 设计文档.md
│   └── 使用说明.md
├── src/                    # 源码目录(部署此目录)
│   ├── index.html          # 主页面
│   ├── css/
│   │   ├── style.css       # 主样式
│   │   ├── turntable.css   # 转盘样式
│   │   └── modal.css       # 弹窗样式
│   ├── js/
│   │   ├── utils.js        # 工具函数
│   │   ├── storage.js      # 存储管理(支持本地/服务端)
│   │   ├── config.js       # 配置管理
│   │   ├── turntable.js    # 转盘引擎
│   │   └── app.js          # 主程序
│   ├── api/                # PHP API(多设备同步)
│   │   ├── save.php        # 保存配置
│   │   ├── load.php        # 加载配置
│   │   └── .htaccess       # API 保护
│   ├── images/             # 图片资源
│   └── user/               # 用户配置目录
│       ├── example.json    # 配置示例文件
│       └── .htaccess       # 禁止直接访问
└── README.md               # 项目说明

🔧 技术栈

  • HTML5 - Canvas 绘制转盘
  • CSS3 - 动画和响应式布局
  • JavaScript - 原生 ES6+(异步支持)
  • localStorage - 本地存储
  • PHP - 多设备同步后端(可选)

🌐 兼容性

  • Chrome 60+
  • Firefox 55+
  • Safari 11+
  • Edge 79+
  • 移动端浏览器(已优化手机端渲染)

📝 数据结构

配置数据(本地存储)

{
  "mode": "default",
  "title": "幸运抽奖",
  "prizes": [
    {
      "id": "abc123",
      "text": "一等奖",
      "icon": "🏆",
      "color": "#e74c3c",
      "weight": 10,
      "maxWins": 1,
      "winCount": 0
    }
  ],
  "updatedAt": "2026-04-09T00:00:00.000Z"
}

配置数据(服务端存储 - 多设备同步)

一个 user 的 JSON 文件包含多个 mode 配置:

{
  "user": "张三",
  "modes": {
    "default": {
      "title": "幸运抽奖",
      "prizes": [...],
      "updatedAt": "..."
    },
    "team1": {
      "title": "团队抽奖",
      "prizes": [...],
      "updatedAt": "..."
    }
  },
  "updatedAt": "2026-04-09T00:00:00.000Z"
}

本地存储 Key

  • lottery_config_{mode} - 配置数据(本地存储)
  • lottery_history_{mode} - 抽奖历史(本地存储)
  • user/{username}.json - 配置文件(服务端存储)

🎨 转盘渲染特性

  • 文字在上图标在下:文字显示区域更大,避免省略号
  • 动态字体大小:根据屏幕尺寸自动调整
  • 文字最大长度:小屏4字、中屏5字、大屏7-10字
  • 高分辨率支持:Canvas DPI 缩放,避免模糊
  • 手机端优化:特殊尺寸计算,确保正确渲染

📖 参考资料

📝 更新日志

v1.2.0 (2026-04-09)

多 mode 配置支持

  • 改进服务端存储结构,一个 user 的 JSON 文件可以包含多个 mode 配置
  • user 参数指定 JSON 配置文件名(如 user/张三.json
  • mode 参数指定在该 JSON 中使用哪个 mode 配置
  • 如果指定的 mode 不存在,保存时会自动创建
  • 支持同一用户创建多个独立的抽奖模式(如团队抽奖、班级抽奖、活动抽奖)

数据结构变化

  • 旧结构:每个 mode 独立存储
  • 新结构:一个 user 包含多个 modes
{
  "user": "张三",
  "modes": {
    "default": { "title": "...", "prizes": [...] },
    "team1": { "title": "...", "prizes": [...] }
  }
}

v1.1.0 (2026-04-09)

功能完善

  • 权重系统改为百分比(0-100)
  • 每个选项增加最大中奖次数字段
  • 重置按钮仅重置中奖次数
  • 添加清空和导入按钮
  • 文字在上、图标在下的渲染方式
  • 移动端渲染优化

v1.0.0 (2026-04-08)

初始版本:

  • Canvas 转盘抽奖
  • 本地存储配置
  • 服务端多设备同步
  • 响应式设计

📜 License

MIT License


版本: v1.2.0
更新日期: 2026-04-09
作者: 柳飘飘

About

抽奖lottery 使用agent自助开发完成 支持配置

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors