# Rolling Draw 抽奖系统
![Vue 3](https://img.shields.io/badge/Vue-3.4.0-4FC08D?style=flat&logo=vue.js&logoColor=white) ![Vite](https://img.shields.io/badge/Vite-5.0.0-646CFF?style=flat&logo=vite&logoColor=white) ![Element Plus](https://img.shields.io/badge/Element%20Plus-2.5.0-409EFF?style=flat&logo=element&logoColor=white) ![License](https://img.shields.io/badge/License-Proprietary-ff69b4) 一个功能强大、界面美观的现代化抽奖系统 [在线演示](#) · [功能特性](#功能特性) · [快速开始](#快速开始) · [使用文档](#使用文档)
--- ## 📖 项目简介 Rolling Draw 是一个基于 Vue 3 + Vite 开发的现代化抽奖系统,提供完整的管理后台和大屏展示功能。系统支持自定义字段、批量导入、多轮次抽奖、中奖记录导出等功能,适用于年会抽奖、活动抽奖等各类场景。 ### ✨ 核心特点 - 🎨 **现代化界面** - 基于 Element Plus 的精美 UI 设计 - 📱 **响应式设计** - 完美适配桌面端和大屏展示 - 💾 **本地存储** - 基于 IndexedDB 的数据持久化 - 🔄 **实时同步** - 支持跨标签页数据同步 - 🎯 **公平抽奖** - 采用 Fisher-Yates 洗牌算法 - 📊 **数据管理** - 支持导入导出,方便数据管理 - ⌨️ **快捷操作** - 大屏端支持快捷键控制 --- ## 🚀 功能特性 ### 参与者管理 - ✅ 单个添加参与者 - ✅ 批量导入(支持 CSV 格式) - ✅ 导出参与者名单 - ✅ 自定义字段配置 - ✅ 删除参与者 - ✅ 清空名单 ### 奖品管理 - ✅ 添加奖品 - ✅ 设置库存数量 - ✅ 实时库存管理 - ✅ 删除奖品 ### 轮次管理 - ✅ 创建抽奖轮次 - ✅ 关联奖品 - ✅ 设置抽取人数 - ✅ 轮次状态跟踪 ### 抽奖控制 - ✅ 开始/停止抽奖 - ✅ Fisher-Yates 洗牌算法 - ✅ 防重复中奖 - ✅ 库存自动扣减 - ✅ 重置抽奖数据 ### 中奖记录 - ✅ 实时记录中奖信息 - ✅ 导出中奖名单 - ✅ 按轮次筛选 ### 大屏展示 - ✅ 滚动动画效果 - ✅ 结果展示模式 - ✅ 自定义背景图片 - ✅ 快捷键控制(← → 切换轮次,Space 开始/停止) - ✅ 多列布局支持(可配置每行列数) --- ## 🛠️ 技术栈 ### 核心框架 - **Vue 3** (v3.4.0) - 渐进式 JavaScript 框架 - **Vite** (v5.0.0) - 下一代前端构建工具 - **Vue Router** (v4.2.5) - 官方路由管理器 - **Pinia** (v2.1.7) - Vue 状态管理库 ### UI 组件库 - **Element Plus** (v2.5.0) - Vue 3 组件库 - **@element-plus/icons-vue** (v2.3.1) - Element Plus 图标库 ### 数据持久化 - **IndexedDB** - 浏览器本地数据库 - **localStorage** - 跨标签页通信 --- ## 📦 安装 ### 环境要求 - Node.js >= 16.0.0 - npm >= 8.0.0 ### 安装依赖 ```bash # 克隆项目 git clone https://git.pandorastudio.cn/product/rollingDraw.git # 进入项目目录 cd rollingDraw # 安装依赖 npm install ``` --- ## 🎬 快速开始 ### 开发模式 ```bash npm run dev ``` 访问 [http://localhost:5173](http://localhost:5173) 查看应用 ### 构建生产版本 ```bash npm run build ``` 构建产物将生成在 `dist` 目录 ### 预览生产构建 ```bash npm run preview ``` --- ## 📂 项目结构 ``` rollingDraw/ ├── src/ │ ├── views/ │ │ ├── Admin.vue # 管理后台布局 │ │ ├── Display.vue # 大屏展示页面 │ │ └── admin/ │ │ ├── Participants.vue # 参与者管理 │ │ ├── Prizes.vue # 奖品管理 │ │ ├── Rounds.vue # 轮次管理 │ │ └── Winners.vue # 中奖记录 │ ├── router/ │ │ └── index.js # 路由配置 │ ├── store/ │ │ └── index.js # Pinia 状态管理 │ ├── styles/ │ │ ├── element-plus.css # Element Plus 样式覆盖 │ │ ├── global.css # 全局样式 │ │ └── variables.css # CSS 变量定义 │ ├── App.vue # 主应用组件 │ └── main.js # 应用入口 ├── utils/ │ └── indexedDB.js # IndexedDB 工具封装 ├── index.html # HTML 模板 ├── package.json # 项目配置 ├── vite.config.js # Vite 配置 └── README.md # 项目文档 ``` --- ## 📖 使用文档 ### 路由说明 | 路径 | 组件 | 说明 | |------|------|------| | `/` | 重定向 | 默认重定向到参与者管理 | | `/admin/participants` | Participants | 参与者管理页面 | | `/admin/prizes` | Prizes | 奖品管理页面 | | `/admin/rounds` | Rounds | 轮次管理页面 | | `/admin/winners` | Winners | 中奖记录页面 | | `/display` | Display | 大屏展示页面 | ### 快捷键 #### 大屏展示端 - **← →** - 切换轮次 - **Space** - 开始/停止抽奖 ### CSV 导入格式 ``` 姓名,部门,工号 张三,技术部,1001 李四,市场部,1002 王五,财务部,1003 ``` **注意:** - 第一行为字段名 - 后续行为数据 - 支持中文字段名 - 使用逗号分隔 ### 数据存储 系统使用 IndexedDB 存储所有数据,包括: - **lottery_fields** - 字段配置 - **lottery_participants** - 参与者列表 - **lottery_prizes** - 奖品列表 - **lottery_rounds** - 轮次列表 - **lottery_winners** - 中奖记录 - **lottery_isRolling** - 抽奖状态 - **lottery_currentRound** - 当前轮次 - **lottery_displayMode** - 显示模式 - **lottery_backgroundImage** - 背景图片 - **lottery_columnsPerRow** - 每行列数 --- ## 🔧 开发指南 ### 代码规范 - 使用 Vue 3 Composition API - 使用 `