Files
rollingDraw/IFLOW.md

7.1 KiB
Raw Permalink Blame History

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. 显示设置

  • 每行显示人数设置
  • 字体颜色设置(轮次名称、人名、奖品名称)
  • 字体大小设置(轮次名称、奖品名称、人名)
  • 显示字段选择
  • 字段标签显示/隐藏

8. 数据同步

  • 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 - 每行列数
  • lottery_displayFontColor - 大屏端字体颜色
  • lottery_prizeNameFontColor - 奖品名称字体颜色
  • lottery_roundNameFontSize - 轮次名称字体大小
  • lottery_prizeNameFontSize - 奖品名称字体大小
  • lottery_participantFontSize - 人名字体大小
  • lottery_displayFields - 大屏端显示的字段列表
  • lottery_showFieldLabels - 是否显示字段标签

快捷键

大屏展示端

  • ← → - 切换轮次
  • Space - 开始/停止抽奖

开发指南

安装依赖

npm install

启动开发服务器

npm run dev

构建生产版本

npm run build

预览生产构建

npm run preview

项目特性

响应式设计

  • 支持桌面端和大屏展示
  • 自适应布局
  • 流畅的动画效果

数据安全

  • 本地存储,无需服务器
  • 数据持久化
  • 防止重复中奖

扩展性

  • 自定义字段配置
  • 可配置的轮次和奖品
  • 灵活的展示布局

性能优化

  • 分页显示支持大数据量
  • 虚拟滚动优化
  • 延迟加载

注意事项

  1. 数据备份:建议定期导出参与者名单和中奖记录进行备份
  2. 浏览器兼容性:需要支持 IndexedDB 的现代浏览器
  3. 图片限制:背景图片最大支持 10MB
  4. CSV 格式:导入文件第一行为字段名,后续行为数据
  5. 性能建议:单次导入建议不超过 1000 人,大量数据请分批导入

技术亮点

  • 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/ 目录

组件设计原则

  • 单一职责:每个组件只负责一个功能
  • 可复用:提取公共逻辑为可复用组件
  • 可测试:组件逻辑易于测试
  • 性能优先:避免不必要的重渲染

许可证

版权所有 © 上海潘哆呐科技有限公司

联系方式