docs: define initial product requirements

This commit is contained in:
2026-09-18 14:15:49 +08:00
commit e28140a0b3
9 changed files with 1346 additions and 0 deletions

391
docs/PRD.md Normal file
View File

@@ -0,0 +1,391 @@
# 个人品牌小程序试点版 PRD
## 1. 文档信息
- **版本**v0.1
- **产品阶段**:单品牌试点版
- **目标用户**:朋友作为首个品牌经营者;其客户作为小程序访客
- **产品形态**:微信小程序 + Web 内容管理后台
- **当前目标**:让品牌经营者能在微信中展示自己、接收预约/咨询,并自行维护内容
> 需求基线补充:首轮访谈后的订单、微信身份、配送、标签与状态规则见 [07-requirements-interview-decisions.md](./07-requirements-interview-decisions.md)。与本文早期表述冲突时,以该决策文档为准。
## 2. 背景与问题
个体户和手艺人通常依赖朋友圈、聊天记录和零散图片介绍业务。客户难以快速了解其身份、服务、作品和合作方式,经营者也缺少一个可持续维护的品牌入口。
本项目先为一个真实经营者交付可用的小程序,验证“品牌展示 + 预约承接 + 内容自维护”的完整闭环。第一版不做支付、不做多商户平台、不做自动发布流程。
## 3. 产品目标
### 3.1 目标
1. 客户在 1 分钟内了解品牌、服务和代表作品。
2. 客户无需注册即可提交咨询或预约。
3. 经营者可以在后台独立更新品牌、服务和作品内容。
4. 经营者可以查看并处理预约,审核客户反馈。
5. 形成一个可复用的首个品牌案例,为后续自己的品牌和其他客户项目提供基础。
### 3.2 非目标
- 当前不提供支付、退款、发票、分账或财务对账。
- 当前不提供多商户注册、套餐、计费和租户自助开通。
- 当前不提供多员工、多门店、复杂排班和库存管理。
- 当前不提供自动注册、自动审核、自动发布微信小程序。
- 当前不将小程序做成内容社区或平台流量市场。
## 4. 用户与角色
### 4.1 访客/客户
无需登录即可浏览公开内容和提交预约。提交预约时填写必要联系信息。
### 4.2 品牌管理员
朋友本人。可登录后台管理品牌资料、服务、作品、预约和反馈。
### 4.3 平台维护者
开发者本人。负责系统维护、问题排查、内容协助和版本发布。第一版可与品牌管理员共用后台,但权限模型应保留角色字段。
## 5. 核心用户流程
### 5.1 客户浏览并预约
```text
打开小程序 -> 首页了解品牌 -> 查看服务/作品 -> 点击预约
-> 填写称呼、联系方式、服务、期望日期和备注
-> 提交成功 -> 品牌方在后台处理
```
### 5.2 管理员更新内容
```text
登录后台 -> 编辑品牌资料/服务/作品 -> 保存
-> 预览 -> 内容在小程序端展示
```
### 5.3 管理员处理预约
```text
后台查看待处理预约 -> 查看详情 -> 联系客户
-> 更新为已联系/已完成/已取消 -> 添加内部备注
```
### 5.4 反馈发布
```text
客户提交反馈 -> 后台审核 -> 通过后显示在小程序
```
## 6. 功能需求
优先级定义P0 为第一版必须交付P1 为第一版可选增强P2 为后续规划。
### 6.1 小程序首页P0
展示品牌头像、名称、一句话介绍、代表服务、代表作品和主要行动按钮。
**要求**
- 公开访问,无需登录。
- 内容来自后台配置,不得写死在前端。
- 服务和作品无内容时,模块自动隐藏或显示空状态,不出现破损布局。
- 至少提供“查看服务”和“联系/预约”两个主要入口。
### 6.2 小程序品牌介绍P0
- 品牌名称、头像/Logo、封面图
- 个人简介
- 从业经历
- 擅长领域
- 服务理念
- 联系方式、所在地区、地址(可选)
**要求**
- 支持富文本或结构化文本编辑。
- 联系电话、微信号等敏感信息由管理员控制是否展示。
- 地址展示与地图能力解耦,第一版可先展示文字地址。
### 6.3 小程序服务项目P0
每项服务包含:名称、封面图、描述、价格文本、预计时长、预约状态、排序。
**价格规则**
- 第一版只展示价格文本例如“¥xxx”“面议”“起价 xxx”。
- 价格不参与支付、不计算订单金额。
- 数据模型保留可扩展的数值价格字段,但第一版不展示支付按钮。
**要求**
- 仅展示已启用服务。
- 支持服务详情页。
- 服务可配置“可预约/仅咨询”。
### 6.4 小程序作品集P0
每项作品包含:图片、标题、描述、分类、排序、是否展示。
- 支持多图浏览。
- 支持作品详情页。
- 图片加载失败时显示占位状态。
- 作品数量较多时支持分类筛选或分页加载P1
### 6.5 小程序:预约/咨询表单P0
字段:
- 称呼必填2-30 字
- 手机号或微信号:至少填写一项
- 服务项目:可选,来自已启用服务
- 期望日期:可选,不能选择过去日期
- 备注可选0-500 字
- 用户同意联系/信息使用提示:必选确认
**提交规则**
- 提交前校验字段格式。
- 防止重复提交,提交按钮在请求期间禁用。
- 成功后生成预约编号,并显示提交成功页。
- 失败时保留用户已填内容并给出可理解的错误提示。
- 第一版不承诺具体预约时间,不做自动排班和冲突检测。
### 6.6 小程序反馈P0
- 查看已审核反馈。
- 提交称呼、内容和可选联系方式。
- 内容长度 10-500 字。
- 新反馈默认待审核,不直接公开。
- 后台审核通过后才展示。
### 6.7 小程序管理员入口P1
- 后端返回当前微信身份是否为管理员。
- 仅管理员显示入口。
- 入口可跳转管理后台网页或后续管理页面。
- 隐藏入口不能替代后端鉴权,所有管理 API 必须重新校验权限。
第一版可暂时使用后台独立登录,不要求小程序内完成管理操作。
### 6.8 后台登录与权限P0
- 管理员登录、退出登录。
- 密码不得明文存储,应使用安全哈希。
- 登录态有过期时间,支持主动退出。
- 每个管理 API 校验登录态和角色。
- 角色字段至少保留 `admin``operator` 两种值;第一版可只启用 `admin`
### 6.9 后台品牌资料管理P0
- 编辑品牌名称、头像、封面、简介、经历、擅长领域、服务理念、联系方式和地址。
- 控制首页模块是否显示。
- 保存草稿和发布内容可先合并为“保存即生效”。
- 保存成功后显示明确反馈。
- 提供预览入口。
### 6.10 后台服务管理P0
- 新增、编辑、删除服务。
- 启用/停用服务。
- 修改排序。
- 配置服务描述、价格文本、时长和预约方式。
- 删除前二次确认;已产生预约的服务建议采用停用而非物理删除。
### 6.11 后台作品管理P0
- 上传图片、编辑标题/描述/分类。
- 调整排序。
- 隐藏/显示作品。
- 删除前确认。
- 限制文件类型、大小和图片数量,并展示上传进度/失败原因。
### 6.12 后台预约管理P0
- 列表展示预约编号、客户称呼、联系方式、服务、期望日期、状态、提交时间。
- 支持按状态和日期筛选。
- 查看详情。
- 状态:待处理、已联系、已完成、已取消。
- 添加内部备注。
- 联系方式仅授权管理员可见。
- 第一版不发送自动通知,管理员通过现有联系方式联系客户。
### 6.13 后台反馈管理P0
- 查看待审核、已通过、已隐藏反馈。
- 通过、隐藏、删除。
- 查看提交时间和关联预约(如有)。
- 审核操作记录操作人和时间。
### 6.14 后台预览P0
- 从后台进入小程序预览页。
- 预览内容与当前保存数据一致。
- 第一版不做复杂草稿版本和多人协作。
## 7. 页面清单
### 小程序
1. 首页
2. 品牌介绍页
3. 服务列表页
4. 服务详情页
5. 作品集列表页
6. 作品详情页
7. 预约/咨询表单页
8. 提交成功页
9. 反馈列表页
10. 反馈提交页
### 管理后台
1. 登录页
2. 首页/概览页
3. 品牌资料页
4. 服务列表/编辑页
5. 作品列表/编辑页
6. 预约列表/详情页
7. 反馈列表/审核页
8. 预览入口
## 8. 数据模型
### BrandProfile
`id`, `name`, `avatar_url`, `cover_url`, `intro`, `experience`, `expertise`, `philosophy`, `contact_phone`, `contact_wechat`, `address`, `is_published`, `created_at`, `updated_at`
### Service
`id`, `name`, `description`, `cover_url`, `price_text`, `price_amount`(预留,第一版不用于支付), `duration_minutes`, `booking_enabled`, `is_enabled`, `sort_order`, `created_at`, `updated_at`
### PortfolioItem
`id`, `title`, `description`, `category`, `image_urls`, `is_visible`, `sort_order`, `created_at`, `updated_at`
### Booking
`id`, `booking_no`, `customer_name`, `phone`, `wechat_id`, `service_id`, `requested_date`, `note`, `status`, `admin_note`, `created_at`, `updated_at`
### Feedback
`id`, `booking_id`(可选), `customer_name`, `content`, `contact`, `status`, `reviewed_by`, `reviewed_at`, `created_at`, `updated_at`
### AdminUser
`id`, `username`, `password_hash`, `display_name`, `role`, `wechat_openid`(预留), `is_enabled`, `last_login_at`, `created_at`, `updated_at`
### 远期支付相关预留
第一版不创建可用支付流程,但应避免把预约和支付强绑定。远期可新增:
- `Order`:业务订单,与 `Booking` 一对一或一对多关联
- `Payment`:支付单、微信交易号、金额、状态、支付时间
- `Refund`:退款记录
- `price_amount` 使用整数分,避免浮点金额
- 订单状态与预约状态分离
第一版的 `Booking` 不应包含 `paid``payment_status` 等容易造成误解的字段。若必须预留,使用独立扩展表或明确标记为未启用字段。
## 9. 权限与安全要求
- 公开内容接口只返回已发布、已启用、已审核数据。
- 管理接口必须验证登录态和角色。
- 联系方式、预约备注等个人信息不得出现在公开接口和日志中。
- 所有输入进行长度、格式和内容校验。
- 图片上传限制 MIME 类型、文件大小和存储路径。
- 删除采用软删除或保留审计记录,避免误删预约数据。
- 生产环境必须使用 HTTPS。
- 管理操作记录操作人、动作和时间。
- 小程序端隐藏管理员入口仅为体验优化,不是安全边界。
## 10. 非功能要求
- 移动端首屏在正常网络下可用,图片按需加载并压缩。
- 后台适配桌面浏览器,窄屏下不出现不可操作的横向溢出。
- 关键操作有加载、成功、失败和空状态。
- 表单提交具备幂等或重复提交保护。
- 数据库每日备份,至少保留最近 7 天备份(部署条件允许时)。
- 关键错误写入可检索日志,但不得记录明文密码和完整联系方式。
## 11. 验收标准
### 内容闭环
- 管理员登录后可以修改品牌介绍,重新打开小程序可看到更新。
- 管理员可以新增、停用和排序服务。
- 管理员可以上传、隐藏和排序作品。
- 未启用服务和未展示作品不会出现在小程序公开页面。
### 预约闭环
- 客户无需注册即可提交有效预约。
- 缺少称呼和联系方式时不能提交。
- 重复点击不会生成重复预约。
- 管理员可以查看预约详情并更新状态。
- 预约联系方式不出现在公开页面。
### 反馈闭环
- 客户提交的反馈默认不可见。
- 管理员审核通过后才展示。
- 管理员可以隐藏已展示反馈。
### 权限闭环
- 未登录用户无法访问管理页面和管理 API。
- 普通用户即使直接调用管理接口也无法修改数据。
- 管理员退出后旧登录态失效或在有效期内被拒绝。
### 远期支付兼容性
- 第一版没有支付按钮、支付接口和支付状态。
- 服务价格仅作为展示文本,不产生支付金额。
- 预约状态不承担订单和支付状态职责。
- 后续新增支付不会要求重写品牌、服务和预约基础数据。
## 12. 开发阶段与交付顺序
### 阶段一:需求和内容准备
- 确认朋友的品牌资料、服务、作品和预约流程。
- 确认视觉基调和首页结构。
- 收集真实图片和联系方式。
### 阶段二:基础系统
- 数据库和 API。
- 管理员登录。
- 品牌、服务、作品管理。
- 小程序公开展示。
### 阶段三:业务闭环
- 预约表单和预约后台。
- 反馈提交、审核和展示。
- 权限校验、错误处理和日志。
### 阶段四:真实试用
- 用朋友的真实内容上线测试环境。
- 至少完成 3 次内容更新和 3 次预约流程演练。
- 修复影响真实使用的问题。
- 冻结第一版范围,记录后续需求,不在上线前无限扩张。
## 13. 后续评估指标
第一版上线后两周观察:
- 朋友是否能独立完成内容更新。
- 客户是否能在不解释的情况下找到服务和联系方式。
- 是否产生真实咨询或预约。
- 预约处理是否比原有聊天记录更清晰。
- 哪些后台操作被频繁使用或频繁出错。
- 哪些需求是其他品牌也可能复用的。
只有在真实使用出现稳定需求后,再评估支付、微信通知、多品牌和自动发布能力。
## 14. 版本边界结论
本版本的交付结果是一个可用的单品牌展示和预约系统,而不是完整 SaaS也不是电商系统。支付作为远期能力被保留在产品边界和数据设计中但当前不实现、不测试、不展示入口。任何新增需求都必须说明它是否直接帮助“展示品牌、承接预约、维护内容”这三个目标否则进入后续需求池。