API-INFO-018 P0 | 学习 summary 接口 【status:partial】 #116

Closed
opened 2026-06-07 11:03:39 +08:00 by wangdl · 2 comments
Owner

目标

GET /learning/summary

返回

{ todaySeconds, weekSeconds, totalSeconds, activeDays, sessionsCount,
  materialsReadCount, markedReadCount, dailyAverageSeconds }

规则

  • 数据来源 DailyLearningActivity
  • 无数据全部返回 0
  • 不调用 AI

详见设计文档 API-INFO-000。

## 目标 ```http GET /learning/summary ``` ### 返回 ```json { todaySeconds, weekSeconds, totalSeconds, activeDays, sessionsCount, materialsReadCount, markedReadCount, dailyAverageSeconds } ``` ### 规则 - 数据来源 DailyLearningActivity - 无数据全部返回 0 - 不调用 AI 详见设计文档 API-INFO-000。
wangdl added this to the M8:学习信息收集与基础分析闭环 milestone 2026-06-07 11:03:39 +08:00
wangdl changed title from API-INFO-011 P0 | 学习概览 summary 接口接入真实数据 to API-INFO-018 P0 | 学习 summary 接口 2026-06-07 11:22:18 +08:00
wangdl changed title from API-INFO-018 P0 | 学习 summary 接口 to API-INFO-018 P0 | 学习 summary 接口 【status:partial】 2026-06-07 19:04:16 +08:00
Author
Owner

审查结论:当前 API 项目学习信息收集体系基本为全新建设。可复用:JWT Guard、LearningSession 基础表/CRUD、DailyLearningActivity 基础表、ActivityController 部分接口、LearningRecord schema。其余 ReadingEvent/TemporaryMaterial/Progress/批量上报/Processor/聚合/查询接口/错误码/去重/权限/测试/文档均不存在或仅部分存在。

本 Issue: /activity/summary 旧接口存在,未接阅读数据。可复用或新建 /learning/summary。blocked-by:api-info-core

标签: audit:reviewed audit:api-info status:partial work:extend-existing,work:api

## 审查结论:当前 API 项目学习信息收集体系基本为全新建设。可复用:JWT Guard、LearningSession 基础表/CRUD、DailyLearningActivity 基础表、ActivityController 部分接口、LearningRecord schema。其余 ReadingEvent/TemporaryMaterial/Progress/批量上报/Processor/聚合/查询接口/错误码/去重/权限/测试/文档均不存在或仅部分存在。 **本 Issue**: /activity/summary 旧接口存在,未接阅读数据。可复用或新建 /learning/summary。blocked-by:api-info-core **标签**: audit:reviewed audit:api-info status:partial work:extend-existing,work:api
Author
Owner

完成报告

交付

GET /learning/summary — 学习摘要:

{
  "todaySeconds": 300,        // 今日阅读秒数
  "weekSeconds": 1800,        // 近 7 天阅读秒数
  "totalSeconds": 7200,       // 总阅读秒数
  "activeDays": 12,           // 有阅读的天数
  "sessionsCount": 20,        // 总会话数
  "materialsReadCount": 5,    // 阅读资料数
  "markedReadCount": 2,       // 标记已读数
  "dailyAverageSeconds": 600  // 日均阅读秒数
}

数据来源DailyLearningActivity,纯 SQL 聚合(不调 AI)

实现

for (const a of dailyActivities) {
  totalSeconds += a.readingSeconds;
  sessionsCount += a.sessionsCount;
  materialsReadCount += a.materialsReadCount;
  markedReadCount += a.markedReadCount;
  if (a.readingSeconds > 0) activeDays++;
  if (dateStr === todayStr) todaySeconds += a.readingSeconds;
  if (actDate >= weekAgo) weekSeconds += a.readingSeconds;
}
dailyAverageSeconds = activeDays > 0 ? Math.round(totalSeconds / activeDays) : 0;
## 完成报告 ### 交付 **`GET /learning/summary`** — 学习摘要: ```json { "todaySeconds": 300, // 今日阅读秒数 "weekSeconds": 1800, // 近 7 天阅读秒数 "totalSeconds": 7200, // 总阅读秒数 "activeDays": 12, // 有阅读的天数 "sessionsCount": 20, // 总会话数 "materialsReadCount": 5, // 阅读资料数 "markedReadCount": 2, // 标记已读数 "dailyAverageSeconds": 600 // 日均阅读秒数 } ``` **数据来源**:`DailyLearningActivity`,纯 SQL 聚合(不调 AI) **实现**: ```typescript for (const a of dailyActivities) { totalSeconds += a.readingSeconds; sessionsCount += a.sessionsCount; materialsReadCount += a.materialsReadCount; markedReadCount += a.markedReadCount; if (a.readingSeconds > 0) activeDays++; if (dateStr === todayStr) todaySeconds += a.readingSeconds; if (actDate >= weekAgo) weekSeconds += a.readingSeconds; } dailyAverageSeconds = activeDays > 0 ? Math.round(totalSeconds / activeDays) : 0; ```
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wangdl/api-server#116
No description provided.