feat: add student video and profile experience

This commit is contained in:
2026-07-28 15:23:42 +08:00
parent 5e993298e7
commit 7a3cf09a99
31 changed files with 19821 additions and 170 deletions

View File

@@ -1,8 +1,8 @@
method,path,status,legacy_operation_id,legacy_summary,target_operation_id,target_summary
GET,/api/ai/school-recommendations,legacy_only,AiController_list,查询院校推荐报告,,
GET,/api/ai/school-recommendations/detail,legacy_only,AiController_detail,获取院校推荐报告详情,,
GET,/api/ai/school-recommendations/export,legacy_only,AiController_exportReport,导出院校推荐报告,,
POST,/api/ai/school-recommendations/generate,legacy_only,AiController_generate,生成院校推荐报告,,
GET,/api/ai/school-recommendations,legacy_only,AiController_list,查询院校推荐报告,,AI 延后到 Semantic Kernel + 租户自带 API Key 独立阶段
GET,/api/ai/school-recommendations/detail,legacy_only,AiController_detail,获取院校推荐报告详情,,AI 延后到 Semantic Kernel + 租户自带 API Key 独立阶段
GET,/api/ai/school-recommendations/export,legacy_only,AiController_exportReport,导出院校推荐报告,,AI 延后到 Semantic Kernel + 租户自带 API Key 独立阶段
POST,/api/ai/school-recommendations/generate,legacy_only,AiController_generate,生成院校推荐报告,,AI 延后到 Semantic Kernel + 租户自带 API Key 独立阶段
GET,/api/assets/{assetId}/download,target_only,,,,获取资源下载地址
GET,/api/assets/{assetId}/preview,target_only,,,,获取资源预览地址
POST,/api/auth/login/password,target_only,,,,手机号密码登录
@@ -181,22 +181,22 @@ POST,/api/points/exchange-orders,target_only,,,,创建积分兑换订单
GET,/api/points/summary,target_only,,,,查询当前用户积分摘要
GET,/api/points/tasks,target_only,,,,查询当前可领取积分任务
POST,/api/points/tasks/claim,target_only,,,,领取积分任务奖励
GET,/api/profile/activity-tasks,legacy_only,ProfileController_tasks,查询积分活动任务,,
POST,/api/profile/activity-tasks/claim,legacy_only,ProfileController_claimTask,领取活动任务奖励,,
GET,/api/profile/activity-tasks,legacy_only,ProfileController_tasks,查询积分活动任务,,由 /api/points/tasks 替代
POST,/api/profile/activity-tasks/claim,legacy_only,ProfileController_claimTask,领取活动任务奖励,,由 /api/points/tasks/claim 替代
GET,/api/profile/badges,exact_match,ProfileController_badges,查询徽章列表,,查询徽章列表
POST,/api/profile/check-in,legacy_only,ProfileController_checkIn,每日签到,,
POST,/api/profile/check-in,exact_match,ProfileController_checkIn,每日签到,,每日签到
GET,/api/profile/exam-countdowns,exact_match,ProfileController_countdowns,查询考试倒计时,,查询考试倒计时
GET,/api/profile/exchange-items,legacy_only,ProfileController_exchangeItems,查询积分兑换商品,,
POST,/api/profile/exchange-items/redeem,legacy_only,ProfileController_redeem,兑换积分商品,,
GET,/api/profile/exchange-items,legacy_only,ProfileController_exchangeItems,查询积分兑换商品,,由 /api/points/exchange-items 替代
POST,/api/profile/exchange-items/redeem,legacy_only,ProfileController_redeem,兑换积分商品,,由 /api/points/exchange-orders 替代
GET,/api/profile/feedbacks,exact_match,ProfileController_feedbacks,查询反馈记录,,查询反馈记录
POST,/api/profile/feedbacks,exact_match,ProfileController_submitFeedback,提交意见反馈,,提交意见反馈
GET,/api/profile/me,exact_match,ProfileController_me,获取当前学生资料,,获取当前学生资料
PATCH,/api/profile/me,exact_match,ProfileController_updateMe,更新当前学生资料,,更新当前学生资料
GET,/api/profile/notifications,exact_match,ProfileController_notificationList,查询用户通知,,查询用户通知
POST,/api/profile/notifications/status,exact_match,ProfileController_notificationStatus,更新通知状态,,更新通知状态
GET,/api/profile/score-events,legacy_only,ProfileController_scoreEvents,查询积分流水,,
GET,/api/questions/videos,legacy_only,QuestionVideoController_list,查询单道题目的解析视频,,
POST,/api/questions/videos/batch,legacy_only,QuestionVideoController_batch,批量查询题目解析视频,,
GET,/api/profile/score-events,exact_match,ProfileController_scoreEvents,查询积分流水,,查询当前用户积分流水
GET,/api/questions/videos,exact_match,QuestionVideoController_list,查询单道题目的解析视频,,查询单道题目的解析视频
POST,/api/questions/videos/batch,exact_match,QuestionVideoController_batch,批量查询题目解析视频,,批量查询题目解析视频
POST,/api/referral/bind,exact_match,ReferralPublicController_bind,绑定当前用户的推荐归属,,绑定当前用户推荐归属
GET,/api/referral/conversion-report,exact_match,ReferralManagementController_conversion,查询推荐转化与佣金报告,,查询推荐转化报告
POST,/api/referral/invite-code,exact_match,ReferralPublicController_invite,生成或查询当前成员邀请码,,生成或查询当前成员邀请码
@@ -346,24 +346,24 @@ PUT,/api/tenant-content/handbook-subjects,exact_match,HandbookManagementControll
GET,/api/tenant-content/import-jobs,target_only,,,,查询内容导入任务
GET,/api/tenant-content/import-jobs/{jobId},target_only,,,,查询内容导入任务详情
GET,/api/tenant-content/imports,legacy_only,TenantContentImportsController_jobs,查询内容导入任务,,
GET,/api/tenant-content/imports/detail,legacy_only,TenantContentImportsController_detail,查询内容导入任务详情,,
GET,/api/tenant-content/imports/detail,exact_match,TenantContentImportsController_detail,查询内容导入任务详情,,查询内容导入任务详情
GET,/api/tenant-content/imports/field-mapping,exact_match,TenantContentImportsController_fieldMapping,查询导入字段映射说明,,查询导入字段映射
POST,/api/tenant-content/imports/handbook,legacy_only,TenantContentImportsController_importHandbook,执行或排队知识手册导入,,
POST,/api/tenant-content/imports/handbook,legacy_only,TenantContentImportsController_importHandbook,执行或排队知识手册导入,,由 /api/tenant-content/imports/{importType} 替代
GET,/api/tenant-content/imports/issues,exact_match,TenantContentImportsController_issues,查询内容导入问题明细,,查询内容导入问题明细
GET,/api/tenant-content/imports/post-check,exact_match,TenantContentImportsController_postCheckStatus,查询内容导入后检查状态,,查询内容导入后检查状态
POST,/api/tenant-content/imports/post-check,exact_match,TenantContentImportsController_runPostCheck,执行内容导入后完整性检查,,执行内容导入后完整性检查
POST,/api/tenant-content/imports/preview/handbook,legacy_only,TenantContentImportsController_previewHandbook,预览知识手册导入数据,,
POST,/api/tenant-content/imports/preview/questions,legacy_only,TenantContentImportsController_previewQuestions,预览题目导入数据,,
POST,/api/tenant-content/imports/preview/scoreline,legacy_only,TenantContentImportsController_previewScoreline,预览分数线导入数据,,
POST,/api/tenant-content/imports/preview/videos,legacy_only,TenantContentImportsController_previewVideos,预览视频解析导入数据,,
POST,/api/tenant-content/imports/preview/vocabulary,legacy_only,TenantContentImportsController_previewVocabulary,预览词汇导入数据,,
POST,/api/tenant-content/imports/preview/handbook,legacy_only,TenantContentImportsController_previewHandbook,预览知识手册导入数据,,由 /api/tenant-content/imports/preview/{importType} 替代
POST,/api/tenant-content/imports/preview/questions,legacy_only,TenantContentImportsController_previewQuestions,预览题目导入数据,,由 /api/tenant-content/imports/preview/{importType} 替代
POST,/api/tenant-content/imports/preview/scoreline,legacy_only,TenantContentImportsController_previewScoreline,预览分数线导入数据,,由 /api/tenant-content/imports/preview/{importType} 替代
POST,/api/tenant-content/imports/preview/videos,legacy_only,TenantContentImportsController_previewVideos,预览视频解析导入数据,,由 /api/tenant-content/imports/preview/{importType} 替代
POST,/api/tenant-content/imports/preview/vocabulary,legacy_only,TenantContentImportsController_previewVocabulary,预览词汇导入数据,,由 /api/tenant-content/imports/preview/{importType} 替代
POST,/api/tenant-content/imports/preview/{importType},target_only,,,,预览内容导入数据
POST,/api/tenant-content/imports/questions,legacy_only,TenantContentImportsController_importQuestions,执行或排队题目导入,,
POST,/api/tenant-content/imports/scoreline,legacy_only,TenantContentImportsController_importScoreline,执行或排队分数线导入,,
POST,/api/tenant-content/imports/questions,legacy_only,TenantContentImportsController_importQuestions,执行或排队题目导入,,由 /api/tenant-content/imports/{importType} 替代
POST,/api/tenant-content/imports/scoreline,legacy_only,TenantContentImportsController_importScoreline,执行或排队分数线导入,,由 /api/tenant-content/imports/{importType} 替代
GET,/api/tenant-content/imports/templates,exact_match,TenantContentImportsController_template,获取内容导入模板,,获取内容导入模板
POST,/api/tenant-content/imports/videos,legacy_only,TenantContentImportsController_importVideos,执行或排队视频解析导入,,
POST,/api/tenant-content/imports/vocabulary,legacy_only,TenantContentImportsController_importVocabulary,执行或排队词汇导入,,
POST,/api/tenant-content/imports/{importType},target_only,,,,执行同步内容导入
POST,/api/tenant-content/imports/videos,legacy_only,TenantContentImportsController_importVideos,执行或排队视频解析导入,,由 /api/tenant-content/imports/{importType} 替代
POST,/api/tenant-content/imports/vocabulary,legacy_only,TenantContentImportsController_importVocabulary,执行或排队词汇导入,,由 /api/tenant-content/imports/{importType} 替代
POST,/api/tenant-content/imports/{importType},target_only,,,,执行同步或异步内容导入
GET,/api/tenant-content/media-analytics/asset-events,legacy_only,TenantContentAssetsController_assetAnalytics,查询媒体资产访问明细,,
GET,/api/tenant-content/media-analytics/summary,legacy_only,TenantContentAssetsController_summary,查询媒体访问分析汇总,,
GET,/api/tenant-content/media-analytics/video-events,legacy_only,TenantContentAssetsController_videoAnalytics,查询媒体视频播放明细,,
@@ -409,7 +409,7 @@ PUT,/api/tenant-content/vocabulary-words,exact_match,VocabularyManagementControl
GET,/api/tenant/current-public,target_only,,,,获取公开租户配置
GET,/api/tenant/resolve,exact_match,TenantController_resolve,解析当前租户,,解析当前租户
GET,/api/tenants/current,target_only,,,,
POST,/api/videos/play,legacy_only,VideoController_play,申请视频播放地址,,
POST,/api/videos/progress,legacy_only,VideoController_progress,上报视频播放进度,,
GET,/api/videos/search,legacy_only,VideoController_search,搜索通用解析视频,,
POST,/api/videos/play,exact_match,VideoController_play,申请视频播放地址,,申请视频播放地址
POST,/api/videos/progress,exact_match,VideoController_progress,上报视频播放进度,,上报视频播放进度
GET,/api/videos/search,exact_match,VideoController_search,搜索通用解析视频,,搜索通用解析视频
GET,/health,legacy_only,HealthController_check,检查 API 与数据库健康状态,,
1 method path status legacy_operation_id legacy_summary target_operation_id target_summary
2 GET /api/ai/school-recommendations legacy_only AiController_list 查询院校推荐报告 AI 延后到 Semantic Kernel + 租户自带 API Key 独立阶段
3 GET /api/ai/school-recommendations/detail legacy_only AiController_detail 获取院校推荐报告详情 AI 延后到 Semantic Kernel + 租户自带 API Key 独立阶段
4 GET /api/ai/school-recommendations/export legacy_only AiController_exportReport 导出院校推荐报告 AI 延后到 Semantic Kernel + 租户自带 API Key 独立阶段
5 POST /api/ai/school-recommendations/generate legacy_only AiController_generate 生成院校推荐报告 AI 延后到 Semantic Kernel + 租户自带 API Key 独立阶段
6 GET /api/assets/{assetId}/download target_only 获取资源下载地址
7 GET /api/assets/{assetId}/preview target_only 获取资源预览地址
8 POST /api/auth/login/password target_only 手机号密码登录
181 GET /api/points/summary target_only 查询当前用户积分摘要
182 GET /api/points/tasks target_only 查询当前可领取积分任务
183 POST /api/points/tasks/claim target_only 领取积分任务奖励
184 GET /api/profile/activity-tasks legacy_only ProfileController_tasks 查询积分活动任务 由 /api/points/tasks 替代
185 POST /api/profile/activity-tasks/claim legacy_only ProfileController_claimTask 领取活动任务奖励 由 /api/points/tasks/claim 替代
186 GET /api/profile/badges exact_match ProfileController_badges 查询徽章列表 查询徽章列表
187 POST /api/profile/check-in legacy_only exact_match ProfileController_checkIn 每日签到 每日签到
188 GET /api/profile/exam-countdowns exact_match ProfileController_countdowns 查询考试倒计时 查询考试倒计时
189 GET /api/profile/exchange-items legacy_only ProfileController_exchangeItems 查询积分兑换商品 由 /api/points/exchange-items 替代
190 POST /api/profile/exchange-items/redeem legacy_only ProfileController_redeem 兑换积分商品 由 /api/points/exchange-orders 替代
191 GET /api/profile/feedbacks exact_match ProfileController_feedbacks 查询反馈记录 查询反馈记录
192 POST /api/profile/feedbacks exact_match ProfileController_submitFeedback 提交意见反馈 提交意见反馈
193 GET /api/profile/me exact_match ProfileController_me 获取当前学生资料 获取当前学生资料
194 PATCH /api/profile/me exact_match ProfileController_updateMe 更新当前学生资料 更新当前学生资料
195 GET /api/profile/notifications exact_match ProfileController_notificationList 查询用户通知 查询用户通知
196 POST /api/profile/notifications/status exact_match ProfileController_notificationStatus 更新通知状态 更新通知状态
197 GET /api/profile/score-events legacy_only exact_match ProfileController_scoreEvents 查询积分流水 查询当前用户积分流水
198 GET /api/questions/videos legacy_only exact_match QuestionVideoController_list 查询单道题目的解析视频 查询单道题目的解析视频
199 POST /api/questions/videos/batch legacy_only exact_match QuestionVideoController_batch 批量查询题目解析视频 批量查询题目解析视频
200 POST /api/referral/bind exact_match ReferralPublicController_bind 绑定当前用户的推荐归属 绑定当前用户推荐归属
201 GET /api/referral/conversion-report exact_match ReferralManagementController_conversion 查询推荐转化与佣金报告 查询推荐转化报告
202 POST /api/referral/invite-code exact_match ReferralPublicController_invite 生成或查询当前成员邀请码 生成或查询当前成员邀请码
346 GET /api/tenant-content/import-jobs target_only 查询内容导入任务
347 GET /api/tenant-content/import-jobs/{jobId} target_only 查询内容导入任务详情
348 GET /api/tenant-content/imports legacy_only TenantContentImportsController_jobs 查询内容导入任务
349 GET /api/tenant-content/imports/detail legacy_only exact_match TenantContentImportsController_detail 查询内容导入任务详情 查询内容导入任务详情
350 GET /api/tenant-content/imports/field-mapping exact_match TenantContentImportsController_fieldMapping 查询导入字段映射说明 查询导入字段映射
351 POST /api/tenant-content/imports/handbook legacy_only TenantContentImportsController_importHandbook 执行或排队知识手册导入 由 /api/tenant-content/imports/{importType} 替代
352 GET /api/tenant-content/imports/issues exact_match TenantContentImportsController_issues 查询内容导入问题明细 查询内容导入问题明细
353 GET /api/tenant-content/imports/post-check exact_match TenantContentImportsController_postCheckStatus 查询内容导入后检查状态 查询内容导入后检查状态
354 POST /api/tenant-content/imports/post-check exact_match TenantContentImportsController_runPostCheck 执行内容导入后完整性检查 执行内容导入后完整性检查
355 POST /api/tenant-content/imports/preview/handbook legacy_only TenantContentImportsController_previewHandbook 预览知识手册导入数据 由 /api/tenant-content/imports/preview/{importType} 替代
356 POST /api/tenant-content/imports/preview/questions legacy_only TenantContentImportsController_previewQuestions 预览题目导入数据 由 /api/tenant-content/imports/preview/{importType} 替代
357 POST /api/tenant-content/imports/preview/scoreline legacy_only TenantContentImportsController_previewScoreline 预览分数线导入数据 由 /api/tenant-content/imports/preview/{importType} 替代
358 POST /api/tenant-content/imports/preview/videos legacy_only TenantContentImportsController_previewVideos 预览视频解析导入数据 由 /api/tenant-content/imports/preview/{importType} 替代
359 POST /api/tenant-content/imports/preview/vocabulary legacy_only TenantContentImportsController_previewVocabulary 预览词汇导入数据 由 /api/tenant-content/imports/preview/{importType} 替代
360 POST /api/tenant-content/imports/preview/{importType} target_only 预览内容导入数据
361 POST /api/tenant-content/imports/questions legacy_only TenantContentImportsController_importQuestions 执行或排队题目导入 由 /api/tenant-content/imports/{importType} 替代
362 POST /api/tenant-content/imports/scoreline legacy_only TenantContentImportsController_importScoreline 执行或排队分数线导入 由 /api/tenant-content/imports/{importType} 替代
363 GET /api/tenant-content/imports/templates exact_match TenantContentImportsController_template 获取内容导入模板 获取内容导入模板
364 POST /api/tenant-content/imports/videos legacy_only TenantContentImportsController_importVideos 执行或排队视频解析导入 由 /api/tenant-content/imports/{importType} 替代
365 POST /api/tenant-content/imports/vocabulary legacy_only TenantContentImportsController_importVocabulary 执行或排队词汇导入 由 /api/tenant-content/imports/{importType} 替代
366 POST /api/tenant-content/imports/{importType} target_only 执行同步内容导入 执行同步或异步内容导入
367 GET /api/tenant-content/media-analytics/asset-events legacy_only TenantContentAssetsController_assetAnalytics 查询媒体资产访问明细
368 GET /api/tenant-content/media-analytics/summary legacy_only TenantContentAssetsController_summary 查询媒体访问分析汇总
369 GET /api/tenant-content/media-analytics/video-events legacy_only TenantContentAssetsController_videoAnalytics 查询媒体视频播放明细
409 GET /api/tenant/current-public target_only 获取公开租户配置
410 GET /api/tenant/resolve exact_match TenantController_resolve 解析当前租户 解析当前租户
411 GET /api/tenants/current target_only
412 POST /api/videos/play legacy_only exact_match VideoController_play 申请视频播放地址 申请视频播放地址
413 POST /api/videos/progress legacy_only exact_match VideoController_progress 上报视频播放进度 上报视频播放进度
414 GET /api/videos/search legacy_only exact_match VideoController_search 搜索通用解析视频 搜索通用解析视频
415 GET /health legacy_only HealthController_check 检查 API 与数据库健康状态

View File

@@ -0,0 +1,75 @@
# 第七阶段:学生端体验与内容消费闭环
第七阶段只补齐学生端和内容消费闭环,不实现 AI 推荐报告。AI 后续单独进入 Semantic Kernel 阶段,租户自己的模型 API Key 通过 `TenantExternalProvider` + `TenantSecret` 配置,业务 DTO、Controller 和普通 Service 不直接接触密钥或 `Microsoft.SemanticKernel` namespace。
## 已实现范围
### 视频消费
新增学生端视频接口:
- `GET /api/videos/search`
- `POST /api/videos/play`
- `POST /api/videos/progress`
- `GET /api/questions/videos`
- `POST /api/questions/videos/batch`
设计边界:
- 播放接口只返回当前租户可访问的视频播放信息。
- API 不暴露 OSS bucket、真实 object key 或 provider 细节。
- 公共题关联视频和租户私题关联视频都必须先通过当前租户可见性校验。
- 播放行为写入 `ContentAssetAccessEvent`
- 播放进度写入 `VideoPlaybackProgress`,同一租户、用户、视频、题目维度幂等更新。
### Profile 与积分
新增学生侧体验接口:
- `POST /api/profile/check-in`
- `GET /api/profile/score-events`
设计边界:
- 签到复用积分任务与积分流水,不另起一套奖励体系。
- 同一用户、同一租户、同一天只能成功签到一次。
- 积分任务领取和积分兑换会同步产生 `UserScoreEvent`,学生端统一从 `score-events` 查询积分变化。
-`/api/profile/activity-tasks``/api/profile/exchange-items` 不恢复为主接口;对应能力由 `/api/points/tasks``/api/points/exchange-items``/api/points/exchange-orders` 替代。
### 内容导入异步化
保留统一导入入口:
- `POST /api/tenant-content/imports/preview/{importType}`
- `POST /api/tenant-content/imports/{importType}`
- `GET /api/tenant-content/imports/detail`
设计边界:
- `questions``vocabulary``handbook``scoreline``videos` 这些旧专用导入语义统一映射为 `importType`
- 小批量可以同步执行。
- 请求显式 `async=true` 或大批量导入时创建 `content_import` 后台任务。
- Worker 通过 `ITenantExecutionScope` 初始化租户 scope 后执行导入,不在请求线程内跑重任务。
- 导入结果写回 import job可通过 detail 接口查询。
## AI 延后约定
本阶段不新增 `/api/ai/**`,不引入 `Microsoft.SemanticKernel` NuGet 包也不实现真实模型调用、prompt、RAG、导出或推荐算法。
后续 AI 阶段默认方向:
- AI Provider 使用 `TenantExternalProvider(capability=ai)`
- 租户 API Key 存入 `TenantSecret`,通过 `SecretRef` 关联。
- Semantic Kernel SDK 只允许出现在 Infrastructure AI provider 实现中。
- Application 层只暴露 `IAiRecommendationProvider``IAiKernelFactory` 等业务抽象。
- Controller 和业务 Service 不直接读取 API Key不直接引用 SK namespace。
## 验收重点
- 租户 A 不能播放租户 B 视频。
- 公共题关联视频和租户私题关联视频都按当前租户权限返回。
- 播放进度重复上报幂等更新。
- 每日签到同一天只能成功一次。
- 签到、积分任务和兑换产生可查询的积分流水。
- 异步导入创建 `content_import` jobWorker 成功写入结果。
- 本阶段不得新增 `Microsoft.SemanticKernel` 引用。