【Java项目-企悦抽】01-AI赋能产品需求文档+项目背景
声明:本文档AI辅助实现
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🎯 你正在阅读「Java项目-企悦抽」系列文章 🎯
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🔥 弹简特 个人主页
❄️ 个人专栏直通车:
✨ 靠热爱去书写自己,靠勇敢去书写生活!
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌟 博主简介:

文展目录:
一、前言
哈喽各位小伙伴!上一阶段我们已经完整学完轻聊 Java 实战项目,本次系列课程难度全面升级,整套技术栈与业务开发模块均对标企业真实开发规范,带大家实战开发企业级 Java 项目 —— 企业抽。
二、基础信息
| 文档属性 | 内容 |
|---|---|
| 产品名称 | 企悦抽(QiYueChou) |
| 文档类型 | 产品需求文档(PRD) |
| 文档版本 | V1.0 |
| 编写日期 | 2025-07-03 |
| 关联系统 | lottery-system(Spring Boot 3.2.6) |
| 文档状态 | 已定稿 |
1、修订记录
| 版本 | 日期 | 修订人 | 修订说明 |
|---|---|---|---|
| V1.0 | 2025-07-03 | 弹简特 | 首版发布,基于 lottery-system 项目现状整理 |
2、文档说明
2.1 文档目的
本文档描述「企悦抽」抽奖平台的产品需求,明确为什么做、为谁做、做什么以及做到什么程度,作为后续 PRS(产品需求规格说明书)、接口设计、开发与测试的统一输入。
2.2 读者对象
| 角色 | 关注重点 |
|---|---|
| 产品经理 | 需求完整性、业务规则 |
| 研发工程师 | 功能边界、业务优先级 |
| 测试工程师 | 验收标准、异常场景 |
| 项目经理 | 范围、里程碑、风险 |
2.3 术语说明
| 术语 | 说明 |
|---|---|
| 活动 | 一次完整的抽奖任务,包含名称、描述、参与人员、关联奖品 |
| 奖品库 | 系统中预先维护的奖品主数据 |
| 圈选 | 管理员为某次活动选择参与人员或关联奖品 |
| 抽奖大屏 | 面向现场展示的 draw.html 页面 |
| 异步抽奖 | 前端提交结果后,后端通过 RabbitMQ 异步落库与通知 |
三、项目背景
1、 业务痛点
在企业年会、部门团建、班级活动、客户答谢会等场景中,抽奖仍是高频刚需,但大量组织仍依赖手工抽奖或简易工具,存在以下问题:
| 痛点 | 具体表现 | 影响 |
|---|---|---|
| 效率低 | 人工写纸条、现场点名、Excel 随机 | 占用活动时间,体验差 |
| 结果难留痕 | 口头公布、截图散落、无统一记录 | 事后无法审计、易引发争议 |
| 公平性难证明 | 过程不可复现、缺少状态约束 | 参与者信任度低 |
| 通知滞后 | 中奖后靠人工逐一通知 | 领奖效率低、易遗漏 |
| 管理分散 | 人员、奖品、活动信息各自维护 | 重复劳动、数据不一致 |
| 权限混乱 | 非管理员也能误操作抽奖 | 现场秩序与数据安全风险 |
2、建设动因
为解决企业/班级活动中手工抽奖效率低、结果难留痕的问题,需要建设一套安全、可靠、可审计的在线抽奖平台——企悦抽。
平台目标不是替代所有营销系统,而是聚焦「活动配置 → 现场抽奖 → 结果公示 → 中奖通知」这一完整闭环,让组织在较短时间内完成一场规范、透明、可追溯的抽奖活动。
2.3 市场与场景价值
- 企业内部:年会抽奖、优秀员工评选、季度福利发放
- 教育培训:班级评比、课堂互动奖励
- 社群运营:粉丝福利、线上活动开奖
- 小型商户:门店促销、会员回馈
上述场景共同需求是:配置简单、现场可控、结果可查、通知及时。
2.4 产品建设原则
- 先可靠,再炫酷:核心链路(抽奖落库、状态一致)优先于动效
- 管理员主导:现场抽奖仅管理员可操作,普通用户以查看为主
- 异步解耦:抽奖提交与持久化分离,保障大屏交互流畅
- 数据可留痕:中奖记录持久化,支持活动维度/奖品维度查询
- 安全合规:敏感信息加密存储,接口鉴权,关键操作留日志
三、产品定位与目标
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 | 通知 | 中奖短信 | P2 | V1.0 预留,未实现 |
3、非功能需求
3.1 性能
| 编号 | 要求 |
|---|---|
| NFR-P01 | 抽奖提交接口响应时间 ≤ 500ms(不含 MQ 消费) |
| NFR-P02 | 活动详情优先读 Redis 缓存 |
| NFR-P03 | 单次活动建议参与人数 ≤ 500,奖品总数 ≤ 50 |
3.2 安全
| 编号 | 要求 |
|---|---|
| NFR-S01 | 密码 SHA256 存储,不可逆 |
| NFR-S02 | 手机号 AES 对称加密落库 |
| NFR-S03 | JWT 有效期 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-V01 | Web 前端页面借助 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个人)
- 一个人只能中一次奖,不能重复中
- 多轮抽奖流程:
- 先展示当前奖品信息(图片、份数)
- 点“开始抽奖” → 屏幕上的名字开始闪动
- 点“点我确定” → 名字停住,确定中奖名单
- 展示中奖名单 → 点“已抽完,下一步”,如果还有奖品没抽就继续下一轮,否则展示全部中奖结果
- 也能点“查看上一奖项”返回看之前的
- 如果抽奖过程中刷新页面:已经抽完的奖项不会重置,刷新后再点“开始抽奖”,会直接展示之前抽出的名单
- 活动结束后:
- 展示所有奖项的全部中奖名单
- 有个“分享结果”按钮,点一下复制链接;别人打开那个链接只能看到活动名称和中奖结果,其他按钮都隐藏,但“分享结果”按钮还在
6、中奖通知
抽奖完成后,自动给中奖者发邮件,内容类似:
“Hi,张三。恭喜你在618大促抽奖中获得一等奖:手机。中奖时间为:14:30。请尽快领取您的奖品。”
7、权限控制
管理端所有页面(包括抽奖页)都要求管理员登录才能访问。没登录就强制跳转到登录页。
文档结束,下一篇文档,我们继续借助AI辅助完成产品需求规格说明书
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)