简介:APP产品需求说明书.docx 是一份面向移动电商APP全流程的产品需求文档,目标读者覆盖产品总监、产品设计、技术总监、项目经理、开发与测试人员。内容以手机客户端为核心,完整梳理了由手机端、PC端、服务器端组成的产品架构,并围绕首页、交易大厅、专场、业务中心等前台模块,逐项说明页面功能、事件流与业务规则,覆盖图片轮播、新闻公告、竞价公告、会员登录、业务提醒,以及买方/卖方在业务中心的验货、发货、评价等操作流程,同时明确标注了手机端不支持支付和订单异议处理,需在PC端完成的边界。文档结构完整,从简介、产品功能业务需求到界面展示说明均有章节对应,可直接作为需求评审、原型设计、开发排期和测试用例编写的输入。资源为一个docx文件,压缩包大小约2.08MB,便于团队共享与存档。已有476人学习/下载,适合正在规划或迭代APP产品、需要规范需求说明书的项目团队参考。
1. 为什么 APP 产品需求说明书要交付成 docx,而不是一张原型图
“点完‘预约’按钮之后,是直接跳到支付页,还是先弹出确认框?”这句话在 App 开发会上反复出现。原型图能展示页面布局,却回答不了交互时序、异常分支和字段规则。于是团队需要一个文本形态的 APP 产品需求说明书.docx 来承接这些问题。这个 docx 不只是给产品经理存档,它是开发取接口字段、测试写用例、设计抽组件的单一事实来源。它适合业务逻辑复杂、角色权限非对称、有支付和状态流转的 App 项目。下面的内容会从需求结构、模板生成和验收标准三个层面,把一份可直接投递的 docx 写透。
2. 写 APP 产品需求说明书之前:先定范围、用户和核心路径
2.1 用一句话定位圈定功能边界
许多 APP 产品需求说明书失控,都是因为跳过定位直接开始罗列功能。理想的第一句话要能回答“谁在什么场景下,靠什么功能解决什么痛点”。例如“让没有专职运营的健身工作室,用 10 分钟搞定一周排班和学员通知”,这句话一出来,你就知道第一期不需要社区动态,不需要社交关系链,甚至不需要复杂的推荐算法。
把这句话写成可衡量的记录,比写“本产品致力于提升效率”有用得多。例如“当管理员导入 500 名学员时,页面在 3 秒内显示名单且不卡死”就是一个可以从设计阶段验证到测试阶段的描述。功能的 Must 范围应该和这句话强相关,其他所有需求都要回到这句话问一句“它是否真的在支撑核心让利点”。如果回答不了,就放进 Won't 列表。
用一张范围表在评审时达成共识,避免开发排期后需求还在膨胀:
| 功能模块 | 与核心定位的关系 | 是否进入第一期 |
|---|---|---|
| 教练排班 | 核心,解决排班效率 | 是 |
| 学员通知 | 核心,解决触达效率 | 是 |
| 课程评价 | 增强学员信任,但非必需 | 延期 |
| 热门推荐 | 探索功能,与核心定位弱相关 | 不做 |
范围表最好放在需求说明书的第 1.1 节下面,让评审人先看边界再看细节。后加的优先需求必须经过产品、开发、测试三方确认,而不是产品经理单方面调整优先级。
2.2 用用例表和角色权限表对齐点击逻辑
App 需求往往涉及多个端,除了用户端 App,还有管理后台和客服工作台。很多说明书只写“用户”一个角色,导致游客、普通用户、店长在同一个功能上的行为完全无法区分。可以把用户故事写成统一的句式:作为某个角色,在某个条件下,希望通过某个操作达到某个结果。这个句式之外,必须补一句“如果不允许操作,会怎样”。
权限要具体到页面、按钮、接口三层。比如运营人员能看到课程管理入口,但只有店长能点击“下架课程”;游客能浏览课程列表,点击“预约”时去登录页,但服务端也要在返回数据里校验登录状态,不能只在客户端藏起按钮。权限对不上,就会出现“安卓能删除订单,iOS 却报错”的怪问题。
权限表可以单独成附录,字段如下:
| 角色 | 页面权限 | 按钮权限 | 接口权限 | 校验时机 |
|---|---|---|---|---|
| 游客 | 首页、课程列表 | 只可浏览,不可预约 | 查询类接口 | 每次请求时校验 |
| 普通用户 | 已登录页面 | 可预约、取消预约 | 创建订单、取消订单 | 进入页面和关键动作时校验 |
| 店长 | 管理后台全部 | 可上架、下架课程 | 修改课程状态 | 每次请求时校验 |
这张表进入评审后,后端要逐个接口核对,客户端要逐个页面核对。需求说明书里出现“如果有权限限制”这种模糊描述,开发一定会在联调时才问“到底怎么判”。
2.3 用状态表描述核心业务流程
用户故事列表替代不了流程,特别是订单、预约这类状态驱动的场景。常见做法是给核心实体画一张状态表,而不是直接画 Uml 图,因为文字状态表在评审会上更省时间,每个人都能直接看迁移路径。以“预约单”为例,状态至少包括:待支付、已支付、已核销、已完成、已取消、退款中、已退款。
状态机可以用一段 Python 代码来自检,这段代码看起来像后端设计,实际上评审时可以用它解释迁移规则:
transitions = { "待支付": {"支付": "已支付", "取消": "已取消"}, "已支付": {"核销": "已核销", "退款": "退款中"}, "已核销": {"复核": "已完成"}, "退款中": {"确认退款": "已退款"}, "已取消": {}, "已完成": {}, "已退款": {}, } def can_transit(src, action): if src not in transitions: return False return action in transitions[src] print(can_transit("待支付", "支付")) # True print(can_transit("已支付", "取消")) # False逻辑说明:dict 的 key 是动作,value 是目标状态,动作名要尽量和接口回调事件保持一致,例如支付回调事件叫payment.success,状态表里就不要写成“支付完成”。参数说明:所有终态字典为空,表示没有后续动作;开发实现时先调用can_transit,可以避免重复回调导致状态被覆盖。这张表最终要能反推数据库枚举字段,它出现在哪里,后端 constants 里就应该有对应枚举。
3. 用 python-docx 生成模板:从骨架到可评审文档
3.1 安装依赖并生成文档元信息
为什么要用脚本生成需求说明书模板?因为多项目复用时,手工设置标题层级、表格样式、元信息非常容易漏。而且脚本可以被接进需求管理平台的 CI,做到每次导出版本都能自动记录更新时间。依赖已经很成熟,安装只需要一条命令:
pip install python-docxpython-docx 不依赖 Office,在 Linux 构建机上也能运行。生成一个最简文档骨架:
from docx import Document from docx.shared import Pt, RGBColor doc = Document() doc.add_heading("APP 产品需求说明书", level=0) meta = [ ("版本", "v0.1"), ("状态", "评审中"), ("负责人", "产品组"), ("最后更新", "2025-06-01"), ] for key, value in meta: p = doc.add_paragraph() run = p.add_run(f"{key}:{value}") run.font.color.rgb = RGBColor(0x40, 0x40, 0x40) run.font.size = Pt(10) doc.save("APP产品需求说明书.docx")逻辑说明:文档创建后第一页放元信息,评审人不用打开文件属性就知道这份文档是否过期。参数说明:状态建议固定为“草稿 / 评审中 / 已确认 / 已废弃”四态,只有“已确认”版本能进入开发排期。“负责人”建议写角色名而不是个人姓名,避免人员变动后文档失联。
3.2 用脚本批量生成标题和页面样式
手工敲标题不仅慢,还容易把二级标题误设成一级。可以定义一个章节列表,用循环统一写入,同时统一中文字体和字号:
from docx import Document from docx.shared import Pt doc = Document() structure = [ ("chapter", "一、产品概述"), ("section", "1.1 产品定位"), ("section", "1.2 目标用户"), ("chapter", "二、功能需求"), ("section", "2.1 登录"), ("section", "2.2 预约"), ("chapter", "三、非功能需求"), ] for level, text in structure: if level == "chapter": h = doc.add_heading(text, level=1) else: h = doc.add_heading(text, level=2) for run in h.runs: run.font.name = "微软雅黑" run.font.size = Pt(16 if level == "chapter" else 13) doc.save("template.docx")逻辑说明:用add_heading生成标题会自动挂到 Word 的 Heading 样式,后续可以生成目录。参数说明:这里的编号已经写死,例如“1.1”“1.2”,适合文档结构稳定后输出;如果要支持自动多级编号,需要修改 Word OpenXML 的 numbering 部分,对大多数评审场景来说,写死编号更可控。
3.3 把功能需求写进表格并保持可追踪
需求正文最好用表格而不是长段落。每一行都是一条可追踪的需求记录,测试也能直接对着写用例。下面代码生成一张功能需求表:
from docx import Document from docx.shared import Cm, Pt doc = Document() headers = ["需求ID", "模块", "用户故事", "优先级", "验收标准"] rows = [ ["F-001", "登录", "作为游客,我希望用手机号验证码登录,以便预约课程", "Must", "验证码输入错误时提示“验证码不正确”,60 秒后自动失效"], ["F-002", "预约", "作为用户,我希望选择教练和时段,以便生成预约单", "Must", "同一教练同一时段被预约后,其他人收到“该时段已满”"], ] table = doc.add_table(rows=1, cols=len(headers)) table.style = "Table Grid" for i, h in enumerate(headers): table.rows[0].cells[i].text = h for row in rows: cells = table.add_row().cells for i, v in enumerate(row): cells[i].text = v for para in cells[i].paragraphs: for run in para.runs: run.font.size = Pt(9) widths = [Cm(1.5), Cm(1.5), Cm(4.5), Cm(1.5), Cm(5.5)] for col, width in zip(table.columns, widths): for cell in col.cells: cell.width = width doc.save("需求功能表.docx")逻辑说明:表头固定 5 列,验收标准写成“当…时,显示…”的句式,避免“界面友好”“体验良好”这种无法验证的描述。参数说明:Table Grid是黑白打印最稳妥的表格样式;列宽逐个单元格设置,是为了兼容 LibreOffice 打开 docx 时的排版一致性。需求 ID 建议用模块缩写加序号,比如订单模块用ORD-001,多人协作时不冲突。
提示:新建的 docx 必须保存后再次打开检查一次表格列宽,部分低版本 WPS 会忽略列宽设置,导致导出 PDF 时内容被截断。
4. 把非功能需求和异常态写进说明书
4.1 页面状态:加载中、空数据、失败、无权限
很多 APP 产品需求说明书的缺陷是只描述 happy path,比如“用户打开我的预约,看到课程列表”。但真实环境有弱网、空列表、token 失效、服务端 500。每个页面都应该定义状态优先级:先加载缓存,再请求网络,失败后展示可重试页面。客户端可以沉淀一套通用状态组件,需求说明书里直接引用组件名称,比逐页画四张图更清晰。
页面状态表要覆盖以下四种情况:
| 状态类型 | 触发条件 | 示例文案 | 默认操作 |
|---|---|---|---|
| loading | 首次加载或下拉刷新 | 无 | 展示骨架图,请求超过 3 秒可提示弱网 |
| empty | 接口成功,列表为空 | 暂无预约 | 提供“去预约”按钮 |
| error | 网络超时或 HTTP 5xx | 加载失败,请重试 | 点击重试重新请求 |
| forbidden | token 缺失或无效 | 请先登录 | 跳转登录页,登录后回跳原页面 |
页面状态必须和第 2.3 节的业务状态机一起看。例如预约失败不能把订单置为 error 状态,而是保持“待支付”不变,只在页面上提示。要不然客户端和服务端的状态会对不上,用户看到的现象就是“App 显示失败,后台订单已经生成”。
4.2 接口、埋点、推送的数据边界
需求说明书可以不写完整接口文档,但要在每个功能点后面附数据字段草案。特别是埋点事件,如果不在 PRD 阶段定好,后面统计数据时会出现“iOS 上报 eventA,安卓上报 eventB,后台两张表”的局面。埋点 JSON 可以这样约定:
{ "page": "appointment_list", "event": "click_reserve", "payload": { "course_id": "string", "coach_id": "string", "source": "home_recommend" } }参数说明:page表示页面名;event用动词_对象风格,避免大小写混用;payload只放业务字段,设备型号、网络状态这种字段交给客户端 SDK 自动采集。推送要写明触发点在哪里,例如“开课前 2 小时提醒”,触发点应该是服务端定时任务,而不是用户打开 App 时才计算,否则离线用户永远收不到提醒。这种边界写进需求说明书,开发和测试都不会再为“什么时候该推送”争论。
注意:埋点和接口字段一旦在文档评审时确认,后续改动要进版本变更记录,不能在评审群里发一句“新加一个参数”就完事。
4.3 风险表:多端不一致、时区、幂等性
App 两端由不同人开发,最容易出现的坑往往不是复杂算法,而是细节约定不明确。风险表要在评审前写清楚,每条带一个应对动作:
| 风险 | 场景 | 对策 |
|---|---|---|
| 多端权限不一致 | iOS 可以删除订单,安卓不行 | 在权限附表对应单元格写清两端行为一致 |
| 时间格式不一致 | 客户端传“2025-06-01 10:00”,服务端按 UTC 解析 | 统一传 ISO8601 并带时区,例如2025-06-01T10:00:00+08:00 |
| 重复提交 | 用户双击“创建订单”产生两笔订单 | 客户端禁用按钮,服务端校验幂等键idempotent_key |
| 空字符串 | 用户昵称为空导致列表布局错乱 | 规定null与""都展示默认头像和“未设置昵称” |
风险表放进需求说明书的风险章节,每一条都指定负责人。幂等键是支付类 App 的必选项,不能只靠前端防抖,后端必须在创建订单时校验同一个idempotent_key只能成功一次。
5. 从 PRD 到开发评审:现场核对需求和验收标准
5.1 一份可执行的需求评审议程
不要一上来就放原型图过每张页面,那会让评审变成“你们看看视觉对不对”。建议在评审前让开发先通读 docx 10 分钟,然后按照下面的议程走:
- 产品经理朗读核心路径 2 分钟,确保所有人理解业务背景
- 后端逐行过状态表和权限表,检查是否允许非法迁移
- 客户端和测试共同核对页面状态表,看四态是否全部覆盖
- 产品经理逐条朗读 Must 功能的验收标准
- 所有待确认问题记录到“待确认问题表”,写清负责人和解决日期
待确认问题不直接改正文,而是追加在 docx 末尾,保证原始内容可追溯:
| 问题编号 | 问题描述 | 提出人 | 负责人 | 解决状态 |
|---|---|---|---|---|
| Q-01 | 退款到账周期是 T+1 还是 T+2? | 后端 | 产品 | 待确认 |
| Q-02 | 取消预约是否自动退款? | 测试 | 业务 | 待确认 |
5.2 用“给定-当-则”重写验收标准
评审现场最有效的动作,是把所有“描述性验收”改成 Given-When-Then。比如“用户点击预约后如果失败,要有提示”改写为:
| 需求ID | Given | When | Then |
|---|---|---|---|
| F-001 | 用户未登录,正在课程详情页 | 点击预约按钮 | 跳转登录页,登录成功后回到原课程详情页 |
| F-002 | 用户已登录,但教练当前时段已满 | 点击预约按钮 | 页面提示“该时段已满”,按钮置灰 |
改写过程中,如果发现“Given”条件在需求说明书里找不到来源,那就是漏了前置状态。能写成 When-Then 的需求,测试可以直接转成用例;写不出来的需求,大概率还没想清楚。
5.3 版本变更记录怎么写在 docx 里
docx 最大的优势是适合版本管理。在文档第二阶段加一张“变更记录”表,每次改动追加一行,而不是覆盖原描述。变更记录表和正文表格不同,它更像项目的审计日志。每次评审完更新版本号和状态,让开发知道当前看到的哪一版是准的。
一个常用的快速校验命令,可以在发版前检查需求文档是否包含足够表格:
python -c "from docx import Document; d=Document('APP产品需求说明书.docx'); print('tables:', len(d.tables)); print('headings:', len([p for p in d.paragraphs if p.style.name.startswith('Heading')]))"逻辑说明:这条命令直接读取 docx 文件,统计表格数量和标题数量。表格数少于 10 个可能说明需求拆解不够;标题数超过 40 个可能说明需求碎片化,需要合并。参数说明:startswith('Heading')只统计通过样式设置的标题,手工加粗的段落不会被算进去,这恰好能暴露文档是否误用直接字体加粗代替标题样式。
6. 让 APP 产品需求说明书自己会说话:用主场景脚本做回归验证
6.1 把核心路径写成一条可执行脚本
把文档合上,在一张白纸上写下这条路径:游客进入首页 → 注册登录 → 选择课程 → 创建预约 → 支付 → 查看预约单 → 取消或退款。每一步都要能在需求说明书里找到对应的章节、状态迁移和验收标准。找不到的直接标成缺口,找得到的打勾。这个动作看似原始,但它能在评审会之前拦截至少一半的“文档没写完”问题。
6.2 用轻量命令检查 docx 结构
验证整份说明书时,可以写一个临时脚本同时检查表格数量、标题数量和是否包含状态表:
python - <<'PY' from docx import Document doc = Document("APP产品需求说明书.docx") print("tables:", len(doc.tables)) print("headings:", len([p for p in doc.paragraphs if p.style.name.startswith("Heading")])) for t in doc.tables: first_row = [c.text for c in t.rows[0].cells] if "状态" in first_row and "动作" in first_row: print("状态表: 已找到") PY逻辑说明:脚本遍历所有表格,检查表头是否包含“状态”和“动作”。如果没找到,说明第 2.3 节的状态机没有落进 docx,后续开发大概率靠口头沟通。参数说明:表头名称要和你实际用的列名一致,比如写的是“当前状态 / 动作 / 目标状态”,脚本里的关键词也要对应调整。
6.3 导出 PDF 做逐页评审
docx 用于编辑,PDF 用于评审。把版本状态改成“已确认”后导出 PDF,并在最后一页附加“评审疑问收集表”,每个人都只往表格里写“页码 + 疑问 + 需求ID”,不要直接改正文。收集表收集满后,产品经理逐条关闭,每关闭一条就在变更记录里加一行。这个过程下来,评审意见和结论都留在文档里,自然形成可追溯的 APP 产品需求说明书。
本文还有配套的精品资源,点击获取