Files
2025-11-05 00:22:09 +08:00

167 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 取名小程序产品规格说明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。