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

8.2 KiB
Raw Permalink Blame History

取名小程序产品规格说明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
    • 请求:
      {
        "surname": "李",
        "gender": "male",
        "birthDate": "2025-11-04",
        "birthTime": "",
        "nameLength": "double"
      }
      
    • 服务端将上述信息组合成提示词,例如:"以“李”为姓男孩出生于2025年11月4日生成双名提供5个寓意美好的中文名字"
    • 响应:
      {
        "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。