$ cd ../blog
$ cat ~/blog/AI 应用开发/llm-workflow-06-coach-entry-points.mdx

LLM 学习工作流(六):AI 教练入口暴露

2026年4月21日·8 min read
<AI 应用开发 />
AILLMVue产品设计可发现性工程实践

这一步在做什么

这一步把前面已经存在的:

  • /coach 路由
  • AICoach 页面 shell
  • aiCoach store

真正暴露到用户面前。

也就是说,它解决的不是"AI 教练页存不存在",而是:

用户能不能发现这个功能。

最终主要涉及:

  • src/views/Home.vue
  • src/App.vue
  • tests/ai-home-entry.test.js

为什么这一步重要

很多项目做 AI 功能时,会先把页面和接口做完,但入口没有设计好。

结果就是:

  • 功能 technically 存在
  • 用户却根本不会用到

所以 Task 6 的目标很直接:

  1. 首页要有 AI 教练入口
  2. 全局导航要有 AI 教练入口
  3. 未登录用户也要知道怎么进去

一开始做了什么

第一版提交是:

  • adfd0cbc feat: expose ai coach entry in home and navigation

最初新增了两部分能力:

1. 首页入口

src/views/Home.vue 里加了:

  • "AI 学习教练"入口卡片
  • "今日 AI 计划摘要"区域

这让首页开始承担一个新的角色:

  • 不只是普通词典入口
  • 也是 AI 工作流入口页

2. 全局导航入口

src/App.vue 里加了 /coach

  • 桌面导航
  • 移动端导航

这一步很基础,但很必要,因为:

  • 首页入口负责引导第一次使用
  • 导航入口负责持续回访

第一轮实现为什么不够

review 指出了两个核心问题。

问题 1:测试太弱

最初测试只断言:

assert.match(home, /to="\/coach"/)
assert.match(app, /to="\/coach"/)

这只能证明:

  • 某个地方出现了 /coach

但并不能证明:

  • 首页是不是区分了登录和未登录用户
  • 导航是不是桌面端和移动端都接了
  • 首页是不是有"今日 AI 计划摘要"

这类测试会带来一个风险:

  • 代码表面看有入口
  • 实际入口行为已经退化了
  • 测试仍然会通过

问题 2:首页摘要把 dailyPlan 当成了普通字符串

这一步是更有代表性的工程问题。

当前 AI 计划并不是一个简单字符串,而是逐渐在向结构化对象收敛。

例如后面计划会包含:

  • sessionTitle
  • goals
  • tasks
  • recommendedWords

如果首页摘要直接假设:

  • dailyPlan 就是一段文字

那当真实结构化数据接进来时,首页就会显示错误内容,或者干脆显示 [object Object] 这种异常结果。

这说明:

入口页也必须尊重真实数据契约。

修正后做了什么

修正后的提交是:

  • 1a55e94d fix: tighten ai coach entry coverage

1. 首页摘要逻辑变得更稳

src/views/Home.vue 里,摘要逻辑不再把 dailyPlan 当成普通字符串,而是按优先级取可展示字段:

  • sessionTitle
  • focus
  • summary
  • goals[0]

如果这些都没有,再回退到中性占位文案。

这一步很值得学习,因为它体现了一个很重要的设计原则:

展示层要适配真实数据契约,而不是自己偷懒发明一个假契约。

2. 测试开始覆盖更真实的入口行为

修正后的 tests/ai-home-entry.test.js 会检查:

  • 首页已登录 /coach 入口
  • 首页匿名 /auth?redirect=/coach 入口
  • "今日 AI 计划摘要"区域存在
  • App.vue 桌面导航有 coach
  • App.vue 移动导航也有 coach

虽然它仍是源码级断言,不是运行级断言,但已经比"只看有没有 /coach"强很多。

这一步真正学到什么

1. 功能存在不等于功能可达

页面、路由、API 都做完了,如果入口没暴露,用户还是用不到。

所以在产品层面,Task 6 实际上是在做:

discoverability

也就是"可发现性"。

2. 首页入口和全局导航是两种不同职责

首页入口负责:

  • 首次引导
  • 明确表达新能力

全局导航负责:

  • 高频回访
  • 形成稳定使用路径

两者不能互相替代。

3. 未登录路径要明确

如果一个功能需要登录,入口设计就不能只考虑:

  • 登录用户点进去怎么样

还要考虑:

  • 未登录用户点进去会发生什么

这一步的做法是:

  • 首页直接给匿名用户 /auth?redirect=/coach

这样用户路径更清晰。

4. 入口页也要遵守数据契约

首页摘要虽然只是"展示一点点状态",但仍然需要尊重:

  • AI 计划的真实结构

这意味着"入口页"不是可以随便硬编码的地方。

这一步最终做成了什么

首页层

首页现在有:

  • 一个 AI 教练入口卡片
  • 一个今日 AI 计划摘要区
  • 登录用户和未登录用户不同入口路径

全局导航层

App.vue 现在有:

  • 桌面端 /coach
  • 移动端 /coach

测试层

测试现在开始真正覆盖:

  • 首页入口
  • 匿名重定向路径
  • 双导航入口
  • 摘要区存在性

你可以自己复现什么

跑这一步的测试

node --test tests/ai-home-entry.test.js -v

跑全部测试

node --test tests/*.test.js

跑构建

npm run build

看这一步的提交演进

git log --oneline -3

你会看到:

  • adfd0cbc 初始入口接入
  • 1a55e94d 修摘要契约和入口测试覆盖

这一步你应该学会什么

  • 为什么功能入口设计和功能实现本身一样重要
  • 为什么首页入口和导航入口要同时存在
  • 为什么匿名用户路径必须单独设计
  • 为什么展示层不能偷懒破坏数据契约
  • 为什么入口测试不能只看"有没有这个链接"

下一步会做什么

下一步是 Task 7

  • 把 AI 计划接入学习页
  • AICoach 真正开始影响学习流
  • 开始把"AI 计划"从页面壳子推进成真实用户流程的一部分

也就是说,接下来你会从:

用户能看到 AI 教练

进入到:

用户的学习流程真的开始被 AI 计划驱动