diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md
index a42afa99..d349e2ab 100644
--- a/docs/BACKLOG.md
+++ b/docs/BACKLOG.md
@@ -98,7 +98,7 @@
### 零散待办
- **总结卡「保存图片」按钮**(设计基准 summary-modal 图内有):需 html2canvas 类依赖做 DOM 转图,2026-07-05 P0-2 实现时按"不加依赖"红线砍掉;引依赖或后端出图方案定型后补。
-- **员工端「学」板块**(我的地图橙色块):当前进「建设中」整页,承接 B8 五段旅程的岗前课程/每日小训模块。
+- **员工端「学」板块**(我的地图橙色块):已在 `mobile-uni/src/pages/user/learning/index.vue` 落成第一版,从今日任务、岗位 SOP 检索和训练前预习卡读取现有真实接口;后续再接课程/考试/视频学习数据。
## Future Enhancements
diff --git a/docs/DEMO_ACCEPTANCE.md b/docs/DEMO_ACCEPTANCE.md
index 7acd220a..1e695a8e 100644
--- a/docs/DEMO_ACCEPTANCE.md
+++ b/docs/DEMO_ACCEPTANCE.md
@@ -1,6 +1,6 @@
# 一期 MVP 演示与验收清单
-本文件是 MVP 现场演示入口:先跑预检,再按演示流逐条点击。当前证明一期 MVP 路径可讲、可点、可截图;用户侧三端已在 `mobile-uni/` 按真实页面栈重建,portless 入口为 `https://wygj-mobile-uni.localhost/h5/`,已接手机号登录、问师傅、员工训练、案例素材、候选人面试/资料和主管复盘/派专项;员工端训练完成后写入 `aihr_practice_session`,用于训练历史、主管待复盘列表和能力画像;候选人端面试复用 AI 面试 API,补充资料上传写 `sys_oss` 和 `aihr_candidate_material`,HR 可在管理端审核通过/驳回;SOP 检索已可查本地 MySQL seed 片段,并支持 txt/md/PDF/Word/Excel/PPT 上传解析为本地 fragment,配置 vector 模型后会写入 embedding 并尽力同步 Qdrant,管理端 AI 面试和案例沉淀按真实模型/ASR 优先验收。
+本文件是 MVP 现场演示入口:先跑预检,再按演示流逐条点击。当前证明一期 MVP 路径可讲、可点、可截图;用户侧三端已在 `mobile-uni/` 按真实页面栈重建,portless 入口为 `https://wygj-mobile-uni.localhost/h5/`,已接手机号登录、问师傅、员工训练、员工学习、案例素材、候选人面试/资料和主管复盘/派专项;员工端训练完成后写入 `aihr_practice_session`,用于训练历史、主管待复盘列表和能力画像;候选人端面试复用 AI 面试 API,补充资料上传写 `sys_oss` 和 `aihr_candidate_material`,HR 可在管理端审核通过/驳回;SOP 检索已可查本地 MySQL seed 片段,并支持 txt/md/PDF/Word/Excel/PPT 上传解析为本地 fragment,配置 vector 模型后会写入 embedding 并尽力同步 Qdrant,管理端 AI 面试和案例沉淀按真实模型/ASR 优先验收。
## 演示前预检
@@ -15,7 +15,7 @@
| 顺序 | 页面 | 点击路径 | 必须看到 |
|---|---|---|---|
| 1 | 首页 `/index` | 打开首页 | 只展示“首页 / AI面试 / 三角色对练 / 案例沉淀 / SOP知识库 / 资料处理 / 系统设置-模型配置” |
-| 2 | uni-app 三端 `https://wygj-mobile-uni.localhost/h5/#/pages/user/today/index`、`/pages/candidate/index/index`、`/pages/supervisor/index/index` | 打开后先手机号登录;已配置 `AIHR_SMS_LOGIN_TEMPLATE_ID` 时可真实收短信,新手机号会自动注册;员工端今日页进入问师傅、练习、案例素材和个人页;练习页完成开始练习、提交回应、结束评分、每日三题提交;问师傅页可检索、反馈、生成总结卡;案例素材页可上传语音并回读入库记录;候选人端点“开始面试/面试练习”和“补充资料”;主管端查看团队画像、待复盘、标记已复盘并从画像派专项 | 员工端显示评分、“训练完成,主管端待复盘已更新”、训练历史和能力画像;底部 tab 整页切换(员工端为 今日/练/问/我);未实现入口进「建设中」整页(返回按钮),无死按钮;主管端待复盘列表增加,复盘详情可看评分、话术、导师改写,并可标记已复盘;从团队画像派专项后最近专项立即回读;候选人端可拉题/答题/评分,资料上传后显示审核状态;HR 审核后候选人端显示 `已通过/已驳回` |
+| 2 | uni-app 三端 `https://wygj-mobile-uni.localhost/h5/#/pages/user/today/index`、`/pages/candidate/index/index`、`/pages/supervisor/index/index` | 打开后先手机号登录;已配置 `AIHR_SMS_LOGIN_TEMPLATE_ID` 时可真实收短信,新手机号会自动注册;员工端今日页进入问师傅、练习、学习页、案例素材和个人页;学习页读取今日任务、岗位 SOP 和训练前预习卡;练习页完成开始练习、提交回应、结束评分、每日三题提交;问师傅页可检索、反馈、生成总结卡;案例素材页可上传语音并回读入库记录;候选人端点“开始面试/面试练习”和“补充资料”;主管端查看团队画像、待复盘、标记已复盘并从画像派专项 | 员工端显示评分、“训练完成,主管端待复盘已更新”、训练历史和能力画像;学习页不再落到「建设中」,内容来自现有任务、知识库和预习卡接口;底部 tab 整页切换(员工端为 今日/练/问/我);未实现入口进「建设中」整页(返回按钮),无死按钮;主管端待复盘列表增加,复盘详情可看评分、话术、导师改写,并可标记已复盘;从团队画像派专项后最近专项立即回读;候选人端可拉题/答题/评分,资料上传后显示审核状态;HR 审核后候选人端显示 `已通过/已驳回` |
| 3 | AI面试 `/recruit/interview` | 生成题目 → 填满参考回答或输入真实回答 → 完成评分 | 配置 chat 模型时真实生成题目和评分;未配置时用本地 Rubric 估分,不返回固定候选人分数;应看到新增面试记录 |
| 4 | 三角色对练 `/train/practice` | 开始对练 → 填入参考回复或输入真实回复 → 继续一轮 → 结束并评分 | 已完成闭环、导师改写、新增对练记录;数据库已启用 chat 模型时,客户回复与评分为真实 LLM 生成(回复不再是固定台词,分数随话术变化),未配置时使用本地剧本兜底 |
| 5 | 案例沉淀 `/knowledge/cases` | 上传真实语音 → ASR 转写 → AI 整理 → 送审 → 入库 → 查看样片 | 已完成闭环,案例列表新增真实转写生成的记录;视频仍用样片兜底 |
diff --git a/mobile-uni/src/pages.json b/mobile-uni/src/pages.json
index b4745569..c2b8de67 100644
--- a/mobile-uni/src/pages.json
+++ b/mobile-uni/src/pages.json
@@ -31,6 +31,12 @@
"navigationBarTitleText": "案例素材"
}
},
+ {
+ "path": "pages/user/learning/index",
+ "style": {
+ "navigationBarTitleText": "学"
+ }
+ },
{
"path": "pages/auth/login/index",
"style": {
diff --git a/mobile-uni/src/pages/user/learning/index.vue b/mobile-uni/src/pages/user/learning/index.vue
new file mode 100644
index 00000000..3377d32a
--- /dev/null
+++ b/mobile-uni/src/pages/user/learning/index.vue
@@ -0,0 +1,513 @@
+
+
+
+ 学
+ 按你的岗位读取今日任务、SOP 依据和训练前预习卡。
+
+
+ {{ message }}
+
+
+
+ 需要登录
+ 登录后才能按手机号读取今日任务和岗位学习内容。
+
+
+
+
+
+
+ {{ pendingCount }}
+ 待学习
+
+
+ {{ completedCount }}
+ 已完成
+
+
+ {{ referenceCount }}
+ 知识引用
+
+
+
+
+
+ 今日学习
+
+
+
+
+
+
+ {{ item.source === 'daily' ? '每日三题' : '专项训练' }}
+
+ {{ item.question || item.scenarioName }}
+ {{ assignmentDesc(item) }}
+
+
+
+
+ 暂无今日学习任务
+
+
+
+
+ 岗位 SOP
+
+
+
+
+
+ {{ knowledgeResult.answer }}
+
+
+ {{ index + 1 }}. {{ cleanOrderedText(point) }}
+
+
+
+
+ {{ snippet.docTitle || '知识片段' }}
+ {{ snippetExcerpt(snippet.content) }}
+
+
+ 知识库暂未命中可引用内容
+
+
+
+
+
+ 训练前预习卡
+
+
+
+
+ 要点
+ {{ item }}
+
+
+ 红线
+ {{ item }}
+
+
+ 可说话术
+ {{ item }}
+
+
+ 暂无可用预习卡
+
+
+
+
+ 学习后动作
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mobile-uni/src/pages/user/today/index.vue b/mobile-uni/src/pages/user/today/index.vue
index 42ff5c8c..042adf5f 100644
--- a/mobile-uni/src/pages/user/today/index.vue
+++ b/mobile-uni/src/pages/user/today/index.vue
@@ -243,6 +243,10 @@ const openTool = (title: string) => {
uni.switchTab({ url: '/pages/user/practice/index' });
return;
}
+ if (title.includes('学') || title.includes('案例学习')) {
+ uni.navigateTo({ url: '/pages/user/learning/index' });
+ return;
+ }
if (title.includes('案例') || title.includes('素材') || title.includes('提交')) {
uni.navigateTo({ url: '/pages/user/cases/index' });
return;
diff --git a/scripts/demo-check.sh b/scripts/demo-check.sh
index 6bcb244c..c17b5b7a 100755
--- a/scripts/demo-check.sh
+++ b/scripts/demo-check.sh
@@ -129,6 +129,7 @@ contains frontend/src/router/index.ts "/system/model"
contains mobile-uni/package.json "aihr-mobile-uni"
contains mobile-uni/src/pages.json "pages/user/today/index"
+contains mobile-uni/src/pages.json "pages/user/learning/index"
contains mobile-uni/src/pages.json "pages/supervisor/index/index"
contains mobile-uni/src/pages.json "pages/candidate/index/index"
contains mobile-uni/src/pages/auth/login/index.vue "/resource/sms/code"
@@ -144,6 +145,10 @@ contains mobile-uni/src/services/knowledge.ts "/api/knowledge/summary-card"
contains mobile-uni/src/services/case.ts "/api/knowledge/case/upload"
contains mobile-uni/src/services/candidate.ts "/api/recruit/interview/start"
contains mobile-uni/src/services/candidate.ts "/api/aihr/mobile/candidate/materials"
+contains mobile-uni/src/pages/user/learning/index.vue "岗位 SOP"
+contains mobile-uni/src/pages/user/learning/index.vue "getPracticeAssignments"
+contains mobile-uni/src/pages/user/learning/index.vue "searchKnowledge"
+contains mobile-uni/src/pages/user/learning/index.vue "getPracticePrepCard"
contains frontend/src/views/recruit/interview.vue "建议复试"
contains frontend/src/views/train/practice.vue "导师改写"
contains frontend/src/views/knowledge/cases.vue "真实语音"