Files
rollingDraw/IFLOW.md
yuantao 466b8408ab 优化: 重构项目结构并修复字段配置保存问题
- 删除旧的独立子项目(admin、display),统一使用单应用架构
- 将 AdminLayout.vue 重命名为 Admin.vue
- 在管理后台添加大屏预览快捷按钮
- 修复字段配置修改后刷新页面丢失的问题
- 新增 updateFields 方法确保字段配置持久化到 IndexedDB
- 更新 IFLOW.md 和 README.md 文档
- 清理未使用的文件和测试数据
2026-01-16 14:07:51 +08:00

215 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Rolling Draw - 抽奖系统
## 项目概述
Rolling Draw 是一个基于 Vue 3 的现代化抽奖系统,提供完整的管理后台和大屏展示功能。系统支持自定义字段、批量导入、多轮次抽奖、中奖记录导出等功能,适用于各类活动抽奖场景。
**作者:** 上海潘哆呐科技有限公司
**技术栈:** Vue 3 + Vite + Vue Router + Pinia + Element Plus + IndexedDB
## 项目结构
```
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 配置
└── .gitignore # Git 忽略文件
```
## 技术栈
### 核心框架
- **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** - 用于跨标签页通信
## 主要功能
### 1. 参与者管理
- ✅ 单个添加参与者
- ✅ 批量导入CSV 格式)
- ✅ 导出参与者名单
- ✅ 自定义字段配置
- ✅ 删除参与者
- ✅ 清空名单
### 2. 奖品管理
- ✅ 添加奖品
- ✅ 设置库存数量
- ✅ 实时库存管理
- ✅ 删除奖品
### 3. 轮次管理
- ✅ 创建抽奖轮次
- ✅ 关联奖品
- ✅ 设置抽取人数
- ✅ 轮次状态跟踪
### 4. 抽奖控制
- ✅ 开始/停止抽奖
- ✅ Fisher-Yates 洗牌算法
- ✅ 防重复中奖
- ✅ 库存自动扣减
- ✅ 重置抽奖数据
### 5. 中奖记录
- ✅ 实时记录中奖信息
- ✅ 导出中奖名单
- ✅ 按轮次筛选
### 6. 大屏展示
- ✅ 滚动动画效果
- ✅ 结果展示模式
- ✅ 自定义背景图片
- ✅ 快捷键控制
- ✅ 多列布局支持
### 7. 数据同步
- ✅ IndexedDB 本地存储
- ✅ 跨标签页实时同步
- ✅ 数据持久化
## 路由配置
| 路径 | 组件 | 说明 |
|------|------|------|
| `/` | 重定向到 `/admin/participants` | 默认路由 |
| `/admin/participants` | Participants.vue | 参与者管理 |
| `/admin/prizes` | Prizes.vue | 奖品管理 |
| `/admin/rounds` | Rounds.vue | 轮次管理 |
| `/admin/winners` | Winners.vue | 中奖记录 |
| `/display` | Display.vue | 大屏展示 |
## 数据存储
### IndexedDB 数据结构
- **lottery_fields** - 字段配置
- **lottery_participants** - 参与者列表
- **lottery_prizes** - 奖品列表
- **lottery_rounds** - 轮次列表
- **lottery_winners** - 中奖记录
- **lottery_isRolling** - 抽奖状态
- **lottery_currentRound** - 当前轮次
- **lottery_displayMode** - 显示模式
- **lottery_backgroundImage** - 背景图片
- **lottery_columnsPerRow** - 每行列数
## 快捷键
### 大屏展示端
- **← →** - 切换轮次
- **Space** - 开始/停止抽奖
## 开发指南
### 安装依赖
```bash
npm install
```
### 启动开发服务器
```bash
npm run dev
```
### 构建生产版本
```bash
npm run build
```
### 预览生产构建
```bash
npm run preview
```
## 项目特性
### 响应式设计
- 支持桌面端和大屏展示
- 自适应布局
- 流畅的动画效果
### 数据安全
- 本地存储,无需服务器
- 数据持久化
- 防止重复中奖
### 扩展性
- 自定义字段配置
- 可配置的轮次和奖品
- 灵活的展示布局
## 注意事项
1. **数据备份**:建议定期导出参与者名单和中奖记录进行备份
2. **浏览器兼容性**:需要支持 IndexedDB 的现代浏览器
3. **图片限制**:背景图片最大支持 10MB
4. **CSV 格式**:导入文件第一行为字段名,后续行为数据
## 技术亮点
- **Vue 3 Composition API** - 更好的代码组织和复用
- **Pinia 状态管理** - 轻量级、类型友好的状态管理
- **IndexedDB** - 大容量本地数据存储
- **Fisher-Yates 洗牌算法** - 公平的随机抽取
- **跨标签页同步** - 实时数据更新
- **CSS 变量** - 主题定制和样式管理
## 开发规范
### 代码风格
- 使用 Vue 3 Composition API
- 使用 `<script setup>` 语法糖
- 遵循 ESLint 规则
- 组件命名使用 PascalCase
### 命名规范
- 文件名PascalCase (组件) / kebab-case (工具)
- 变量名camelCase
- 常量名UPPER_SNAKE_CASE
- 函数名camelCase
### 目录结构
- 组件放在 `src/views/` 目录
- 工具函数放在 `utils/` 目录
- 样式文件放在 `src/styles/` 目录
## 许可证
版权所有 © 上海潘哆呐科技有限公司
## 联系方式
- **邮箱**: work@pandorastudio.cn
- **公司**: 上海潘哆呐科技有限公司