PRD:月度消费报告导出 PDF
一、背景与目标
为什么做
- 现状问题:用户月底查看月度消费报告后,只能通过截图保存/分享,截图排版差(长图被裁切、分多张)、信息不全(分类占比、收支结构、环比数据往往不在首屏),接收方(家人)无法看到完整收支结构。
- 机会:导出为标准 PDF 后,用户可一次性保存完整报告并直接转发给家人,提升报告分享率与记账工具的”被看见”价值,间接拉动记账留存。
要达成什么
- 北极星指标:月度报告导出成功率 = 导出成功次数 / 导出触发次数(口径:同一用户同一次点击”导出”计 1 次触发,生成并成功保存/转发文件计 1 次成功;按自然周统计,用户不去重,按次数)。
- 护栏指标 1:导出流程平均耗时 = 从点击导出到文件可用的总时长(口径:P50/P90,单位秒,按自然周统计全部导出事件)。
- 护栏指标 2:导出功能崩溃率 = 导出流程中触发前端异常的次数 / 导出触发次数(口径:按自然周统计,含小程序白屏、Canvas 渲染失败、内存溢出)。
- 护栏指标 3:报告页跳出率 = 进入月度报告页后未停留满 3 秒即离开的会话数 / 进入报告页的会话数(口径:按自然周统计,用于监控导出入口是否干扰原有浏览体验)。
【待补充:当前截图分享的占比基线、报告页 UV、目标提升幅度由谁确认——需与数据/增长负责人确认】
二、用户与场景
- 目标用户:使用随手记账微信小程序的大学生用户,有月度复盘习惯,消费来源包含生活费、兼职、奖助学金等,需要向家人(父母)说明钱花在哪。
- 核心场景一句话:大学生在月底打开月度消费报告,希望把完整收支结构导出成一份排版整齐的 PDF,保存到本地或直接发给父母查看。
【待补充:用户是否有”发给朋友/社团/自己做年度汇总”等次要分享场景,是否纳入本期——需与产品负责人确认】
三、用户故事与功能需求
| 编号 | 用户故事 | 优先级(P0/P1/P2) | 验收标准 |
|---|---|---|---|
| F1 | 作为大学生用户,我想要在月度报告页看到”导出 PDF”入口,以便一眼知道报告可以导出而不是只能截图 | P0 | 给定用户已进入某月消费报告页,当页面加载完成,则页面可见”导出 PDF”按钮,且按钮在首屏或滚动一屏内可见 |
| F2 | 作为大学生用户,我想要点击导出后生成包含完整收支结构的 PDF,以便家人能看到全部信息 | P0 | 给定用户点击”导出 PDF”,当生成完成,则产出的文件包含:月度总收入、月度总支出、结余、各消费分类金额与占比、与上月环比,且各项数值与报告页展示一致 |
| F3 | 作为大学生用户,我想要导出过程有明确的进度与结果反馈,以便知道是否成功、失败后知道怎么办 | P0 | 给定用户点击”导出 PDF”,当生成进行中,则展示加载态;当成功,则提示成功并给出保存/转发动作;当失败,则展示失败原因与”重试”按钮 |
| F4 | 作为大学生用户,我想要把导出的 PDF 保存到手机或直接转发,以便分享给家人 | P0 | 给定 PDF 已生成,当用户点击”转发”,则调起微信转发能力并可将文件发送给好友;当用户点击”保存”,则文件可保存到本机 |
| F5 | 作为大学生用户,我想要在当月没有任何记账数据时不被误导,以便知道为什么导不出来 | P1 | 给定该月无任何记账记录,当用户点击”导出 PDF”,则提示”本月暂无记账数据,先去记一笔吧”并引导至记账页,不生成空报告 |
| F6 | 作为大学生用户,我想要导出时可以选择是否包含分类明细,以便分享给家人时控制信息粒度 | P2 | 给定用户点击”导出 PDF”,当存在明细开关,则用户可勾选是否包含逐笔明细;关闭时 PDF 仅含汇总与分类结构 |
| F7 | 作为大学生用户,我想要重复导出时结果一致,以便不会因为重试产生重复文件 | P1 | 给定用户已成功导出本月报告,当再次点击导出,则覆盖/更新同一份文件而非生成多份不同版本,且文件名规则一致(如 随手记账-2025年6月.pdf) |
【待补充:PDF 中是否需要用户昵称/头像、是否需要水印或品牌 logo、分类明细是否属于家人可见范围——需与产品负责人确认】
四、流程与交互
主流程(分步)
- 用户在首页/账单页进入「月度消费报告」页。
- 报告页渲染完成后,展示「导出 PDF」入口(F1)。
- 用户点击导出 → 前端进入加载态(F3)。
- 前端基于当前报告数据,在本地生成 PDF(小程序环境,无后端图片服务,采用前端绘制方案:Canvas 绘制 → 导出图片 → 合成 PDF / 或纯前端 PDF 库生成。【待补充:具体技术方案选型由前端负责人确认】)。
- 生成成功后,展示预览或直接给出「保存到手机」「转发给好友」两个动作(F4)。
- 用户完成保存/转发,流程结束,记录埋点。
关键页面说明
- 月度报告页:保留原有浏览体验,导出入口为新增次要动作,不遮挡核心数据。
- 导出中态:全屏或半屏 loading,含进度提示与取消能力(若技术可行)。
- 导出结果态:成功(预览缩略图 + 保存 / 转发按钮)、失败(原因文案 + 重试)。
异常路径
- 空态:该月无数据 → 提示并引导记账(F5)。
- 失败:生成的 PDF 为空/渲染异常/内存不足/保存失败 → 提示具体原因,提供”重试”,并记录埋点。
- 权限/环境不足:用户拒绝保存权限、微信版本不支持文件转发能力 → 降级为”生成图片长图”或提示升级微信。【待补充:是否接受降级为长图方案——需与产品负责人确认】
- 弱网:导出本身为前端生成,弱网影响主要在转发/上传环节 → 提示网络异常并允许重试。
【待补充:超长明细(如单月几百笔)时是否分页、每页条数上限——需与设计/前端确认】
五、非功能需求
- 性能:P90 端到端导出耗时目标 ≤ 【待补充:目标秒数,需与前端确认可行值】;生成过程不阻塞页面主线程滚动(若阻塞,需给明确 loading)。
- 兼容:覆盖主流微信版本与机型;低端机内存受限时需有降级或失败兜底。具体支持的微信基础库版本下限【待补充:由前端负责人确认】。
- 合规:PDF 内含用户消费数据,属个人隐私信息,不得在未经用户操作的情况下自动外发;分享行为须由用户主动点击触发;遵守《个人信息保护法》相关要求。【待补充:是否需要隐私协议提示——需与法务/合规确认】。
- 数据埋点(事件名 + 参数 + 触发时机):
export_pdf_clicked:参数{ report_month, entry_from, has_data },触发时机:用户点击”导出 PDF”按钮瞬间。export_pdf_succeeded:参数{ report_month, duration_ms, file_size_kb },触发时机:PDF 生成成功且可保存/转发时。export_pdf_failed:参数{ report_month, fail_reason, duration_ms },触发时机:导出流程任一环节失败时(fail_reason 枚举:render_error / memory_limit / save_denied / unsupported_env / network)。export_pdf_shared:参数{ report_month, share_channel },触发时机:用户成功调起转发并发送后。export_pdf_saved:参数{ report_month },触发时机:用户成功保存文件到本机后。export_pdf_retried:参数{ report_month, retry_count },触发时机:用户在失败态点击”重试”时。
六、风险与开放问题
| 风险/问题 | 影响 | 当前判断 | 需要谁拍板 |
|---|---|---|---|
| 无后端图片服务,PDF 需纯前端生成 | 生成质量、耗时、机型兼容性不保证 | 倾向前端 Canvas + PDF 库方案,需先做可行性验证 | 前端负责人 |
| 低端机内存不足导致生成失败 | 导出成功率下降,影响北极星指标 | 需设定降级方案(长图/降分辨率) | 产品负责人 + 前端负责人 |
| 长明细列表分页与性能 | 单月几百笔时耗时与排版质量下降 | 建议设每页条数上限,超出则分页 | 产品负责人 + 设计 |
| 保存/转发能力受微信版本限制 | 部分用户无法完成分享,流程断裂 | 需确认微信基础库能力下限与降级策略 | 前端负责人 |
| 消费数据隐私与合规 | 存在合规风险 | PDF 含个人消费数据,需用户主动触发且不自动外发 | 法务/合规 |
| 导出入口是否影响原有报告页浏览体验 | 跳出率护栏指标可能恶化 | 入口应保持次要动作,不遮挡核心数据 | 产品负责人 + 设计 |
信息缺口清单
- 【待补充:截图分享占比基线、报告页 UV、北极星指标目标提升幅度——找数据/增长负责人确认】
- 【待补充:PDF 内容是否含用户昵称/头像、水印/品牌 logo、分类明细可见范围——找产品负责人确认】
- 【待补充:是否需要年度报告导出等扩展场景、次要分享场景是否纳入本期——找产品负责人确认】
- 【待补充:前端 PDF 生成技术选型、性能目标秒数、微信基础库版本下限——找前端负责人确认】
- 【待补充:低端机降级方案(长图/降分辨率)、长明细分页规则与每页条数——找产品 + 设计 + 前端确认】
- 【待补充:导出与分享是否需要隐私协议提示——找法务/合规确认】