声明:本文档AI辅助实现

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🎯 你正在阅读「Java项目-企悦抽」系列文章 🎯
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

🔥 弹简特 个人主页

❄️ 个人专栏直通车:


靠热爱去书写自己,靠勇敢去书写生活!
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨


🌟 博主简介:


在这里插入图片描述



一、前言

哈喽各位小伙伴!上一阶段我们已经完整学完轻聊 Java 实战项目,本次系列课程难度全面升级,整套技术栈与业务开发模块均对标企业真实开发规范,带大家实战开发企业级 Java 项目 —— 企业抽。

二、基础信息

文档属性内容
产品名称企悦抽(QiYueChou)
文档类型产品需求文档(PRD)
文档版本V1.0
编写日期2025-07-03
关联系统lottery-system(Spring Boot 3.2.6)
文档状态已定稿

1、修订记录

版本日期修订人修订说明
V1.02025-07-03弹简特首版发布,基于 lottery-system 项目现状整理

2、文档说明

2.1 文档目的

本文档描述「企悦抽」抽奖平台的产品需求,明确为什么做为谁做做什么以及做到什么程度,作为后续 PRS(产品需求规格说明书)、接口设计、开发与测试的统一输入。

2.2 读者对象

角色关注重点
产品经理需求完整性、业务规则
研发工程师功能边界、业务优先级
测试工程师验收标准、异常场景
项目经理范围、里程碑、风险

2.3 术语说明

术语说明
活动一次完整的抽奖任务,包含名称、描述、参与人员、关联奖品
奖品库系统中预先维护的奖品主数据
圈选管理员为某次活动选择参与人员或关联奖品
抽奖大屏面向现场展示的 draw.html 页面
异步抽奖前端提交结果后,后端通过 RabbitMQ 异步落库与通知

三、项目背景

1、 业务痛点

在企业年会、部门团建、班级活动、客户答谢会等场景中,抽奖仍是高频刚需,但大量组织仍依赖手工抽奖简易工具,存在以下问题:

痛点具体表现影响
效率低人工写纸条、现场点名、Excel 随机占用活动时间,体验差
结果难留痕口头公布、截图散落、无统一记录事后无法审计、易引发争议
公平性难证明过程不可复现、缺少状态约束参与者信任度低
通知滞后中奖后靠人工逐一通知领奖效率低、易遗漏
管理分散人员、奖品、活动信息各自维护重复劳动、数据不一致
权限混乱非管理员也能误操作抽奖现场秩序与数据安全风险

2、建设动因

为解决企业/班级活动中手工抽奖效率低、结果难留痕的问题,需要建设一套安全、可靠、可审计的在线抽奖平台——企悦抽

平台目标不是替代所有营销系统,而是聚焦「活动配置 → 现场抽奖 → 结果公示 → 中奖通知」这一完整闭环,让组织在较短时间内完成一场规范、透明、可追溯的抽奖活动。

2.3 市场与场景价值

  • 企业内部:年会抽奖、优秀员工评选、季度福利发放
  • 教育培训:班级评比、课堂互动奖励
  • 社群运营:粉丝福利、线上活动开奖
  • 小型商户:门店促销、会员回馈

上述场景共同需求是:配置简单、现场可控、结果可查、通知及时

2.4 产品建设原则

  1. 先可靠,再炫酷:核心链路(抽奖落库、状态一致)优先于动效
  2. 管理员主导:现场抽奖仅管理员可操作,普通用户以查看为主
  3. 异步解耦:抽奖提交与持久化分离,保障大屏交互流畅
  4. 数据可留痕:中奖记录持久化,支持活动维度/奖品维度查询
  5. 安全合规:敏感信息加密存储,接口鉴权,关键操作留日志

三、产品定位与目标

1、产品定位

企悦抽是一款面向组织活动场景的 B 端抽奖管理平台,提供活动全生命周期管理能力,支持 Web 管理后台与现场抽奖大屏,适用于中小规模(建议单次活动参与人数 ≤ 500 人)线下/线上结合活动。

2、产品愿景

让每一场活动抽奖更快、更公平、更可追溯

3、本期目标(V1.0)

目标编号目标描述验收标准
G1管理员可独立完成活动配置无研发介入完成「人员→奖品→活动→抽奖」
G2现场抽奖流程顺畅支持多轮、多等级奖品依次抽取
G3中奖结果可查询、可分享活动结束后可查看全量名单并复制分享链接
G4中奖者收到邮件通知抽奖完成后自动发送邮件(短信中奖通知为扩展能力)
G5系统具备基本安全能力登录鉴权、手机号加密、密码哈希存储

四、目标用户与角色

1、用户画像

管理员(ADMIN)

  • 活动组织者、HR、行政、班主任、运营人员
  • 负责注册/登录后台、维护人员与奖品、创建活动、现场操作抽奖

普通用户(NORMAL)

  • 活动参与者
  • 无后台管理权限;活动进行中不可操作抽奖;活动结束后可查看中奖名单

2、角色权限矩阵

能力管理员普通用户未登录用户
后台登录
维护奖品/活动/人员
现场抽奖操作
查看进行中活动大屏❌(提示等待)❌(提示等待)
查看已结束活动中奖名单
接收中奖通知✅(若中奖)✅(若中奖)

五、产品范围

1、本期包含(In Scope)

  • 管理员注册与登录(密码登录 + 短信验证码登录)
  • 普通用户创建与列表查询
  • 奖品创建、图片上传、分页列表、全量列表
  • 活动创建(圈选奖品/人员/等级/数量)、分页列表
  • 活动详情查询(含奖品、人员及状态)
  • 抽奖大屏(展示奖品 → 人名滚动 → 确认中奖 → 下一轮)
  • 抽奖结果异步持久化(MQ)
  • 中奖记录查询(活动维度 / 奖品维度)
  • 邮件中奖通知
  • 短信验证码发送(Spug 短信通道)
  • JWT 登录鉴权

2、本期不包含(Out of Scope)

  • C 端用户自助报名
  • 多租户 / SaaS 计费
  • 移动端独立 App
  • 中奖短信通知(代码预留扩展,V1.0 未实现)
  • 复杂抽奖算法(权重、分组、多轮排除规则引擎)
  • 数据大屏 BI 分析
  • 第三方 OAuth 登录

六、功能需求概览

1、功能结构

企悦抽
├── 用户与认证
│   ├── 管理员注册
│   ├── 密码登录
│   ├── 短信验证码登录
│   └── 发送验证码
├── 人员管理
│   ├── 创建普通用户
│   └── 用户列表
├── 奖品管理
│   ├── 创建奖品(含图片)
│   ├── 奖品分页列表
│   └── 奖品全量列表
├── 活动管理
│   ├── 创建活动
│   ├── 活动分页列表
│   └── 活动详情
├── 抽奖与结果
│   ├── 提交抽奖结果(异步)
│   ├── 查询中奖记录
│   └── 抽奖大屏
└── 通知
    ├── 验证码短信(Spug)
    └── 中奖邮件(QQ SMTP)

2、 功能需求清单

需求ID模块需求名称优先级简述
FR-001认证管理员注册P0姓名、邮箱、手机号、密码、身份 ADMIN
FR-002认证密码登录P0手机号/邮箱 + 密码,可强制 ADMIN 身份
FR-003认证短信验证码登录P0手机号 + 4 位验证码
FR-004认证发送验证码P0校验手机号,Redis 缓存 60 秒
FR-005认证登录拦截P0除白名单外接口需 JWT
FR-006人员创建普通用户P0管理员在后台创建 NORMAL 用户
FR-007人员用户列表P1可按身份筛选
FR-008奖品创建奖品P0名称、描述、价格、图片
FR-009奖品奖品分页列表P1支持翻页
FR-010奖品奖品全量列表P1供创建活动时选择
FR-011活动创建活动P0圈选奖品(等级/数量)与人员
FR-012活动活动分页列表P0展示状态,跳转抽奖页
FR-013活动活动详情P0奖品按等级排序,含 valid 状态
FR-014抽奖提交抽奖P0发 MQ,立即返回
FR-015抽奖查询中奖记录P0活动/奖品维度,免登录可查
FR-016抽奖抽奖大屏P0三阶段交互 + 刷新恢复
FR-017通知中奖邮件P1异步线程池发送
FR-018通知中奖短信P2V1.0 预留,未实现

3、非功能需求

3.1 性能

编号要求
NFR-P01抽奖提交接口响应时间 ≤ 500ms(不含 MQ 消费)
NFR-P02活动详情优先读 Redis 缓存
NFR-P03单次活动建议参与人数 ≤ 500,奖品总数 ≤ 50

3.2 安全

编号要求
NFR-S01密码 SHA256 存储,不可逆
NFR-S02手机号 AES 对称加密落库
NFR-S03JWT 有效期 1 小时,Header 传递 user_token
NFR-S04管理端页面与受保护接口强制登录

3.3 可靠性

编号要求
NFR-R01抽奖消费失败支持 MQ 重试(最多 5 次)
NFR-R02消费异常回滚状态与中奖记录
NFR-R03死信队列兜底异常消息

3.4 可用性

编号要求
NFR-U01管理后台 iframe 式导航,操作流程 ≤ 3 步完成常见任务
NFR-U02抽奖页未登录跳转 blogin.html
NFR-U03活动结束支持「分享结果」链接

3.5 兼容性

编号要求
NFR-C01支持 Chrome/Edge 等现代浏览器
NFR-C02后端 JDK 17,MySQL 8.x,Redis,RabbitMQ

3.6 界面与视觉体验

编号要求
NFR-V01Web 前端页面借助 AI 辅助 完成布局、样式与动效设计,以美观、现代化视觉呈现为主要目标
NFR-V02管理后台采用 iframe 框架 + 统一视觉风格;抽奖大屏强调全屏展示、动效反馈,适配现场投屏
NFR-V03前端 UI 与后端业务解耦:视觉层由 AI 辅助迭代,接口契约与业务逻辑仍按 PRS/接口文档独立开发与验收
NFR-V04不要求提供独立 UI 设计稿;验收以页面可用性、信息层级清晰、无明显布局错位为准

七、业务规则与约束

1、用户规则

  • 管理员注册必须设置密码(6~12 位字母数字)
  • 普通用户注册/创建时不设置密码
  • 邮箱、手机号全局唯一
  • 后台登录页强制 mandatoryIdentity=ADMIN

2、活动规则

  • 创建活动时:参与人数 ≥ 奖品总数量
  • 活动初始状态:RUNNING(进行中)
  • 每个奖品在一个活动中只能关联一次
  • 每个用户在一个活动中只能关联一次

3、抽奖规则

  • 仅管理员可在活动进行中操作抽奖
  • 每轮中奖人数 = 当前奖品配置数量
  • 前端从「未中奖且仍有效」的参与者中随机抽取
  • 同一用户在同一活动中通过前端剔除机制避免重复中奖
  • 后端校验:中奖人数必须等于奖品数量
  • 已抽完的奖品不可再次抽取(状态 COMPLETED
  • 全部奖品抽完后活动状态变为 COMPLETED

4、奖品等级

支持三个等级(枚举):

枚举值含义
FIRST_PRIZE一等奖
SECOND_PRIZE二等奖
THIRD_PRIZE三等奖

5、通知规则

  • 验证码:4 位数字,Redis 键 VERIFICATION_CODE_{手机号},TTL 60 秒
  • 验证码短信:通过 Spug 短信推送服务 发送
  • 中奖邮件:MQ 消费成功后异步发送
  • 中奖短信:V1.0 未实现,仅日志占位

八、用户旅程

1、管理员典型旅程

注册/登录 → 创建普通用户 → 创建奖品 → 创建活动(圈选人员/奖品)
→ 活动列表进入抽奖页 → 按等级依次抽奖 → 分享结果链接
→ 参与者收到邮件通知

2、普通用户典型旅程

(由管理员创建账号)→ 活动进行中:等待
→ 活动结束:打开分享链接或活动列表 → 查看中奖名单

3、抽奖大屏状态机

展示奖品信息 → [开始抽奖] → 人名滚动 → [点我确定]
→ 展示本轮中奖名单 → [已抽完,下一步] → 下一奖品 / 全量名单

特殊:刷新页面后,已抽完奖品直接展示中奖名单,不可重复抽取。


九、成功指标

指标目标值说明
活动配置完成率≥ 95%首次使用管理员无协助完成配置
抽奖提交成功率≥ 99%不含外部 MQ/邮件故障
中奖记录查询成功率≥ 99.9%含缓存穿透到 DB
邮件发送成功率≥ 90%依赖 SMTP 可用性
现场操作投诉率≤ 1%重复抽奖/名单错误类

十、风险与假设

1、假设

  • 活动组织方具备基本 IT 能力,可部署 MySQL/Redis/RabbitMQ
  • 现场网络可访问部署服务器
  • Spug 短信通道、QQ 邮箱 SMTP 可用
  • 单次活动规模在中等以内

2、风险

风险影响缓解措施
MQ 消费失败中奖未落库重试 + 死信 + 回滚
Redis 不可用缓存失效降级读 MySQL
邮件发送失败用户未收到通知日志告警,人工补发
前端随机抽取公平性争议PRS 明确算法边界,后续可改后端抽奖

3、版本规划

版本范围说明
V1.0本文档全部 In Scope当前 lottery-system 已实现能力
V1.1中奖短信通知对接 Spug 通知模板
V1.2后端抽奖引擎随机算法下沉服务端
V2.0多租户 / 权限细分企业级扩展

十一、补充:都有哪些功能?挨个说

1、管理员登录注册

  • 注册要填:姓名、邮箱、手机号、密码
  • 登录支持两种方式:
    • 手机号 + 密码
    • 手机号 + 短信验证码(能获取验证码)
  • 登录的时候会校验是不是管理员身份

2、人员管理

  • 管理员可以创建普通用户(填姓名、邮箱、手机号)
  • 能看到人员列表,展示:用户ID、姓名、身份(普通用户还是管理员)

3、奖品管理

  • 创建奖品:填名称、描述、价格,还能上传奖品图
  • 奖品列表支持分页,展示:ID、图片、名称、描述、价格(元)

4、活动管理

  • 创建活动时要填:
    • 活动名称、描述
    • 选奖品:勾选哪些奖品,分别设成一、二、三等奖,还要填每个奖品的数量
    • 选人员:勾选哪些人能参与这个活动
  • 活动列表(分页)展示:
    • 活动名称、描述、状态
    • 状态是“进行中” → 显示“去抽奖”按钮
    • 状态是“已完成” → 显示“查看中奖名单”按钮

5、抽奖页面(核心)

  • 只有进行中的活动,管理员才能抽奖
  • 每轮中奖人数 = 当前奖品的数量(比如一等奖3份,就抽3个人)
  • 一个人只能中一次奖,不能重复中
  • 多轮抽奖流程:
    1. 先展示当前奖品信息(图片、份数)
    2. 点“开始抽奖” → 屏幕上的名字开始闪动
    3. 点“点我确定” → 名字停住,确定中奖名单
    4. 展示中奖名单 → 点“已抽完,下一步”,如果还有奖品没抽就继续下一轮,否则展示全部中奖结果
    5. 也能点“查看上一奖项”返回看之前的
  • 如果抽奖过程中刷新页面:已经抽完的奖项不会重置,刷新后再点“开始抽奖”,会直接展示之前抽出的名单
  • 活动结束后:
    • 展示所有奖项的全部中奖名单
    • 有个“分享结果”按钮,点一下复制链接;别人打开那个链接只能看到活动名称和中奖结果,其他按钮都隐藏,但“分享结果”按钮还在

6、中奖通知

抽奖完成后,自动给中奖者发邮件,内容类似:

“Hi,张三。恭喜你在618大促抽奖中获得一等奖:手机。中奖时间为:14:30。请尽快领取您的奖品。”

7、权限控制

管理端所有页面(包括抽奖页)都要求管理员登录才能访问。没登录就强制跳转到登录页。


文档结束,下一篇文档,我们继续借助AI辅助完成产品需求规格说明书

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐