Files

167 lines
8.2 KiB
Markdown
Raw Permalink Normal View History

2025-11-05 00:22:09 +08:00
# 取名小程序产品规格说明NamingAssistant
## 1. 文档信息
- **版本**v0.1(初版)
- **创建日期**2025-11-04
- **适用范围**`MiniProgram/NamingAssistant` 首个迭代(姓名生成与收藏)
- **维护人**:前端负责人、后端接口负责人、测试负责人共用
## 2. 背景与目标
- 提供面向抖音生态的姓名生成服务,支持根据用户输入的姓氏、性别、出生日期与名字长度快速获取候选姓名。
- 通过广告激励实现变现,确保用户在观看广告后获得生成结果。
- 支撑用户在本地收藏心仪姓名,限制每日请求频率防止滥用。
## 3. 名词与角色
- **用户**:使用抖音小程序的终端访客。
- **AI 命名服务**:后端聚合接口,根据提示词返回 5 个姓名及释义。
- **校验服务**:后端接口,校验姓氏是否合法。
- **激励广告**:抖音小程序提供的激励视频广告组件。
## 4. 产品范围
- **In Scope**
- 主页表单输入、校验与广告流程。
- 结果页展示 5 个姓名与释义,支持收藏。
- 收藏页展示本地收藏记录、删除、查看详情。
- 本地记录每日调用次数,超过 10 次给出提示,次数可在后台配置。
- **Out of Scope**
- 账户登录、云端收藏同步。
- 历史生成记录、多端同步。
- 自定义广告策略与多渠道投放。
## 5. 用户流程KISS
1. 用户打开主页填写表单:姓 → 性别 → 出生日期/时间 → 名字字数。
2. 姓输入失焦触发校验接口;非法返回后提示并清空输入。
3. 用户点击“生成姓名”,系统执行整体验证;失败则提示错误并阻止提交。
4. 校验通过后展示激励广告;广告播放完成触发生成逻辑。
5. 调用生成接口并显示“计算中”加载状态;成功后缓存结果并跳转结果页。
6. 结果页展示 5 条姓名及含义,用户可选择任意一个收藏,收藏立即写入本地,数量可在后台配置。
7. 用户可从结果页或主导航进入收藏页查看或删除收藏项。
## 6. 页面结构与职责SOLID
- **主页(`pages/home/index`**
- 负责表单输入组件渲染与状态管理。
- 调用校验服务、触发广告播放与生成流程。
- 控制每日次数提示、跳转结果页。
- **结果页(`pages/result/index`**
- 展示当前生成结果,处理收藏交互。
- 支持返回主页重新生成。
- **收藏页(`pages/favorites/index`**
- 读取本地收藏列表并渲染。
- 提供单项删除与查看释义。
> 页面逻辑使用独立 `store`(如 `store/namingStore.ts`管理当前表单、生成结果、调用次数、收藏集合避免重复状态DRY
## 7. 数据模型YAGNI仅覆盖本迭代必要字段
| 实体 | 字段 | 类型 | 说明 |
| --- | --- | --- | --- |
| `NamingForm` | `surname` | string | 1-2 个汉字,必填 |
| | `gender` | `'male' \| 'female'` | 单选,必填 |
| | `birthDate` | `string` | `YYYY-MM-DD`,默认当天,必填 |
| | `birthTime` | `string \| null` | `HH:mm`,默认空,选填 |
| | `nameLength` | `'single' \| 'double'` | 单名 or 双名,默认 `double` |
| `NamingResult` | `name` | string | 生成姓名 |
| | `meaning` | string | 含义说明 |
| | `score` | number? | 预留;本迭代不返回(保持可选,默认不展示) |
| `FavoriteItem` | `id` | string | `name + timestamp` 生成的唯一键 |
| | `name` | string | 收藏姓名 |
| | `meaning` | string | 对应释义 |
| | `createdAt` | string | ISO 时间戳 |
## 8. 业务规则
- 姓氏校验:输入长度 1-2失焦时调用 `/validate-surname`,返回 `isValid=false` 时清空并 Toast“请输入合法姓氏”。
- 表单必填项:姓氏、性别、出生日期、名字字数;出生时间选填(为空不纳入提示词)。
- 提交前整体验证:若任一必填缺失或校验失败,阻止广告播放并给出错误提示。
- 激励广告完成事件 `onClose` 返回 `isEnded=true` 才允许调用生成接口;否则提示“观看完整广告后才能生成姓名”。
- 每日次数:基于本地缓存键 `naming:quota:YYYYMMDD` 记录已用次数;达到 10 次时 Toast“今日生成次数已用尽请明日再试”。
- 收藏:每个姓名可多次生成;收藏时如同名存在则更新 `createdAt`,避免重复条目。
- 删除收藏:从本地存储移除对应 `id` 并刷新列表。
## 9. 接口契约(接口分离,依赖抽象而非具体实现)
- **POST `/api/naming/validate-surname`**
- 请求:`{ "surname": "李" }`
- 响应:`{ "isValid": true, "message": "" }`
- 错误码:`40001` 非法字符、`50000` 系统异常。
- **POST `/api/naming/generate`**
- 请求:
```json
{
"surname": "李",
"gender": "male",
"birthDate": "2025-11-04",
"birthTime": "",
"nameLength": "double"
}
```
- 服务端将上述信息组合成提示词,例如:`"以“李”为姓男孩出生于2025年11月4日生成双名提供5个寓意美好的中文名字"`
- 响应:
```json
{
"results": [
{ "name": "李承泽", "meaning": "承载福泽,寓意富足" },
{ "name": "李昱辰", "meaning": "昱意为光辉,辰代表时光" },
{ "name": "李颢宇", "meaning": "广阔天空,胸怀大志" },
{ "name": "李景曜", "meaning": "景象辉煌,曜为光耀" },
{ "name": "李辰逸", "meaning": "自在悠然,辰意指时光" }
]
}
```
- 异常:
- `42900` 请求超限(由后端或网关返回,与前端本地控制互补)。
- `50000` 系统异常。
## 10. 本地存储策略
- `tt.setStorageSync('naming:quota:YYYYMMDD', number)`:记录当日已使用次数。
- `tt.setStorageSync('naming:favorites', FavoriteItem[])`:存储收藏列表。
- 加载收藏页时若数据缺失则返回空数组,避免抛错。
## 11. 激励广告模块
- 封装 `utils/adService.ts` 暴露 `showRewardedVideoAd(): Promise<void>`
- 广告位 ID 通过配置注入,方便后续替换;模块负责加载、展示、清理事件监听。
- 页面调用时捕获异常并提示“广告加载失败,请稍后重试”。
## 12. 错误与提示文案DRY集中在 `constants/messages.ts`
- `INVALID_SURNAME``请输入合法姓氏`
- `FORM_INCOMPLETE``请完整填写必填项`
- `WATCH_AD_TO_CONTINUE``观看完整广告后才能生成姓名`
- `QUOTA_EXCEEDED``今日生成次数已用尽,请明日再试`
- `GENERATION_FAILED``生成失败,请稍后再试`
## 13. 验收标准(测试覆盖)
- **表单校验**
- 输入非法姓氏提示并清空。
- 必填项缺失无法触发广告。
- **广告流程**
- 未完整观看广告不可调用生成接口。
- 广告失败异常提示正常。
- **生成结果**
- 成功返回后跳转结果页,展示 5 条记录及释义。
- “计算中” loading 在接口完成后消失。
- **收藏功能**
- 收藏后收藏页可见,删除后立即消失。
- 重复收藏刷新时间戳不新增条目。
- **请求限额**
- 连续触发 10 次后出现限额提示,第 11 次被阻止。
## 14. 非功能需求
- Loading 状态 300ms 内出现,避免空白。
- API 网络失败时 2s 内给出提示。
- 本地存储读写失败需兜底为内存态并告警(日志)。
## 15. 依赖与配置
- 抖音小程序基础库 ≥ 3.0;需启用激励视频广告能力。
- 后端提供校验与生成接口;约定响应时间 ≤ 3s。
- 配置文件 `config/index.ts`:广告位 ID、接口基础地址、最大生成次数。
## 16. 待确认事项
- 广告必须观看时长是否有具体数值要求(默认以 `isEnded` 判断)。
- AI 接口返回释义字段是否稳定,若缺失由兜底。
- 是否需要埋点统计广告完成率与收藏次数暂未纳入YAGNI
## 17. 里程碑
- **M1**:完成项目脚手架、页面路由与表单控件。
- **M2**:接入校验与生成接口,贯通广告流程。
- **M3**:实现收藏、本地限额逻辑并完成联调、测试用例。
> 设计遵循 KISS简洁流程、DRY统一状态与文案、YAGNI仅落地当前需求页面与服务模块职责清晰满足 SOLID。