# iOS 差距分析

---

## 第一轮分析

# AIStudyApp 现状与缺口分析 - 第一篇：现有资源盘点

> 生成日期：2026-05-11
> 后端地址：http://81.70.187.179:3001

---

## 一、项目文件结构

```
AIStudyApp/
├── AIStudyAppApp.swift                  # 应用入口，含 5 步 Onboarding 流程
├── ContentView.swift                    # 主 Tab 框架（5 个 Tab + 自定义底部栏）
│
├── Core/
│   ├── DesignSystem/DesignTokens.swift  # 颜色/渐变/间距/字体全局设计令牌
│   ├── Models/APIModels.swift           # 20+ DTO 数据模型
│   ├── Network/
│   │   ├── APIClient.swift              # 通用 HTTP 客户端（actor, async/await）
│   │   ├── APIConfig.swift              # baseURL 配置
│   │   └── APIError.swift               # 错误枚举（网络/服务端/解码/认证）
│   └── Services/APIService.swift        # 8 个服务类，15 个公开方法
│
├── Features/
│   ├── AI/
│   │   ├── AIHomeView.swift             # AI 首页 + ZXQuickAction + ZXAIInteractionRow 组件
│   │   └── DailyThinkingPage.swift      # 每日思考题 + RecallTestPage / WeakPointsPage /
│   │                                     #   AIFeedbackPageView / AIChatPage 子页面
│   ├── Analysis/
│   │   └── AnalysisHomeView.swift       # 学习分析页 + ZXChartView 折线图 + ZXWeakRow 薄弱点
│   ├── Library/
│   │   ├── LibraryHomeView.swift        # 知识库列表首页
│   │   └── LibrarySubpages.swift        # CreateLibraryPage / LibraryDetailPage /
│   │                                     #   AddKnowledgePage / KnowledgeDetailPage /
│   │                                     #   ImportPage / EditKnowledgePage
│   ├── Profile/
│   │   └── ProfileView.swift            # 个人中心页
│   └── Study/
│       └── StudyHomeView.swift          # 学习工作台 + 今日任务 + 周活跃柱状图
│
└── Info.plist                           # 手动管理（ATS例外 / Bundle元数据等）
```

---

## 二、5 个 Tab 页面清单

| Tab | 标签 | SF Symbol | View |
|-----|------|-----------|------|
| 1   | AI | `brain.head.profile` | AIHomeView |
| 2   | 知识库 | `books.vertical.fill` | LibraryHomeView |
| 3   | 学习 | `bolt.fill` | StudyHomeView |
| 4   | 分析 | `chart.bar.fill` | AnalysisHomeView |
| 5   | 我的 | `person.fill` | ProfileView |

---

## 三、所有页面/子页面总览（共 21 个）

### AI 模块（1 主 + 4 子）

| 页面 | 数据来源 | 核心功能 |
|------|---------|---------|
| AIHomeView | 🔴硬编码 | API 状态检测、思考题卡片、快捷操作、互动记录、提问输入栏 |
| DailyThinkingPage | 🔴硬编码 | AI 思考题展示 + 回答提交 |
| RecallTestPage | 🔴硬编码 | 回忆测试输入 |
| WeakPointsPage | 🔴硬编码 | 薄弱知识点静态列表 |
| AIFeedbackPageView | 🔴硬编码 | AI 反馈评分 + 操作入口 |
| AIChatPage | 🔴硬编码 | AI 对话气泡界面 |

### 知识库模块（1 主 + 6 子）

| 页面 | 数据来源 | 核心功能 |
|------|---------|---------|
| LibraryHomeView | 🔴硬编码 | 知识库列表 + 搜索框 + 创建入口 |
| CreateLibraryPage | 🔴静态 | 创建表单（名称+描述） |
| LibraryDetailPage | 🔴硬编码 | 知识点静态列表 |
| AddKnowledgePage | 🔴静态 | 添加知识点表单 |
| KnowledgeDetailPage | 🔴硬编码 | 知识点详情+标签+复习/费曼入口 |
| ImportPage | 🔴静态 | 导入方式选择（拍照/文件/链接/相册） |
| EditKnowledgePage | 🔴静态 | 编辑知识点表单 |

### 学习模块（1 主）

| 页面 | 数据来源 | 核心功能 |
|------|---------|---------|
| StudyHomeView | 🔴硬编码 | 今日进度环、任务列表（5个任务）、本周活跃柱状图 |

### 分析模块（1 主）

| 页面 | 数据来源 | 核心功能 |
|------|---------|---------|
| AnalysisHomeView | 🔴硬编码 | 4项统计徽章、掌握度7日折线图、薄弱知识点列表 |

### 个人中心（1 主）

| 页面 | 数据来源 | 核心功能 |
|------|---------|---------|
| ProfileView | 🔴硬编码 | 个人卡片、菜单列表、成就徽章 |

### 启动流程（5 步 Onboarding）

| 步骤 | 页面 | 功能 |
|------|------|------|
| Step 0 | SplashPage | 品牌开屏，2 秒自动跳转 |
| Step 1 | WelcomePage | 3 大功能介绍 |
| Step 2 | LoginPage | 手机号/邮箱 + 密码表单 + 微信/Apple 登录入口 |
| Step 3 | OnboardingPage | 4 步功能轮播 |
| Step 4 | GoalSetupPage | 学习目标/方法/每日时长选择 |

---

## 四、APIService 已封装方法（15 个）

| 服务类 | 方法 | 接口 |
|--------|------|------|
| WaitlistService | `join(...)` | POST /waitlist |
| | `stats()` | GET /waitlist/stats |
| AuthService | `appleLogin(...)` | POST /auth/apple |
| | `logout()` | POST /auth/logout |
| UserService | `myProfile()` | GET /users/me |
| | `updateProfile(...)` | PATCH /users/me |
| KnowledgeBaseService | `list()` | GET /knowledge-bases |
| | `create(...)` | POST /knowledge-bases |
| | `detail(id:)` | GET /knowledge-bases/:id |
| KnowledgeItemService | `list(baseId:)` | GET /knowledge-items |
| | `detail(id:)` | GET /knowledge-items/:id |
| | `create(...)` | POST /knowledge-items |
| AIAnalysisService | `analyze(...)` | POST /ai-analysis |
| ActivityService | `summary()` | GET /activity/summary |
| ReviewService | `due()` | GET /reviews/due |
| FocusItemService | `list()` | GET /focus-items |
| FeedbackService | `submit(...)` | POST /feedback |

---

## 五、后端接口 vs App 覆盖对照表

| 后端模块 | 接口数 | App 覆盖 | 状态 |
|----------|--------|---------|------|
| System | 3 | 0 | ❌ 无 |
| Auth | 3 | 2（Service 有，View 未接） | 🔶 |
| Users | 3 | 2（Service 有，View 未接） | 🔶 |
| KnowledgeBase | 5 | 3（Service 有，View 未接） | 🔶 |
| KnowledgeItems | 4 | 3（Service 有，View 未接） | 🔶 |
| DocumentImport | 2 | 0 | ❌ 无 |
| LearningSession | 3 | 0 | ❌ 无 |
| ActiveRecall | 2 | 0 | ❌ 无 |
| AIAnalysis | 3 | 1（Service 有，View 未接） | 🔶 |
| FocusItems | 4 | 1（Service 有，View 未接） | 🔶 |
| Review | 2 | 1（Service 有，View 未接） | 🔶 |
| LearningActivity | 2 | 1（Service 有，View 未接） | 🔶 |
| Notifications | 2 | 0 | ❌ 无 |
| Feedback | 4 | 1（Service 有，View 未接） | 🔶 |
| Waitlist | 3 | 2（Service 有，View 未接） | 🔶 |

> 覆盖率：Service 层 15/48 = 31%，View 层实际接入 0/48 = 0%

---

## 第二轮分析

# AIStudyApp 现状与缺口分析 - 第二篇：缺失功能与实施路线

> 接第一篇《现有资源盘点》
> 生成日期：2026-05-11

---

## 一、优先级总览

```
P0（核心闭环，本周必须）    4 项
P1（数据接入，下周）        5 项
P2（新页面/功能，后续）     5 项
P3（体验增强，优化期）      5 项
```

---

## 二、P0 —— 核心学习闭环（4 项）

### P0-1：真实 Apple 登录流程

**现状：** LoginPage 是静态表单，没有调 API，Token 没有持久化。

**需要做：**

| 子任务 | 涉及文件 |
|--------|---------|
| 集成 `AuthenticationServices`，添加 `ASAuthorizationAppleIDButton` | LoginPage（内嵌在 AIStudyAppApp.swift） |
| 拿到 `identityToken` 后调用 `AuthService.appleLogin(...)` | LoginPage |
| 登录成功后用 `@AppStorage` 或 Keychain 存储 Token | APIClient |
| `@main` 启动时检查已有 Token，跳过 Onboarding | AIStudyAppApp.swift |
| 处理登录失败/网络错误的 UI 提示 | LoginPage |
| 接入 `POST /auth/refresh` Token 自动刷新 | APIClient |

涉及接口：`POST /auth/apple`、`POST /auth/refresh`、`POST /auth/logout`

---

### P0-2：知识库 + 知识点接入真实 API

**现状：** LibraryHomeView 硬编码 4 个知识库，子页面表单没有提交。

**需要做：**

| 子任务 | 涉及文件 |
|--------|---------|
| `LibraryHomeView` 的 `.task {}` 中调 `KnowledgeBaseService.list()` | LibraryHomeView.swift |
| 替换硬编码卡片为 `ForEach(bases)` 真实数据 | LibraryHomeView.swift |
| `CreateLibraryPage` 表单提交调 `KnowledgeBaseService.create(...)` | LibrarySubpages.swift |
| `LibraryDetailPage` 加载真实知识点列表 `KnowledgeItemService.list(baseId:)` | LibrarySubpages.swift |
| `AddKnowledgePage` 表单提交调 `KnowledgeItemService.create(...)` | LibrarySubpages.swift |
| `EditKnowledgePage` 提交调 `PATCH /knowledge-items/:id`（APIService 需新增 update 方法） | LibrarySubpages.swift + APIService.swift |
| 增加 loading / empty / error 三种状态处理 | 各 Library 页面 |

涉及接口：`GET/POST /knowledge-bases`、`GET/POST/PATCH /knowledge-items`

---

### P0-3：学习会话追踪

**现状：** StudyHomeView 的"今日任务"是静态列表，没有学习计时，没有调任何接口。

**需要做：**

| 子任务 | 涉及文件 / 新建文件 |
|--------|-------------------|
| 新建 `LearningSessionView.swift`：含计时器（`Timer.publish`）+ 暂停/结束按钮 | **新文件** Features/Study/LearningSessionView.swift |
| 点击 StudyHomeView 任务 → push 到 LearningSessionView | StudyHomeView.swift |
| 入场调 `POST /learning-sessions`（传入 knowledgeBaseId） | LearningSessionView.swift |
| 结束/暂停时调 `POST /learning-sessions/:id/end` | LearningSessionView.swift |
| APIService 新增 `LearningSessionService` | APIService.swift |
| APIModels 新增 `LearningSessionCreateRequest` / `LearningSessionResponse` | APIModels.swift |

涉及接口：`POST /learning-sessions`、`POST /learning-sessions/:id/end`、`GET /learning-sessions`

---

### P0-4：间隔复习卡片

**现状：** 没有复习页面。后端 `GET /reviews/due` + `POST /reviews/:id/submit` 已就绪。

**需要做：**

| 子任务 | 新建文件 |
|--------|---------|
| 新建 `ReviewCardView.swift`：正面问题 → 点击翻转 → 显示答案 → 评分按钮 | **新文件** Features/Study/ReviewCardView.swift |
| 评分按钮：Again(1) / Hard(2) / Good(3) / Easy(4)，调 `POST /reviews/:id/submit` | ReviewCardView.swift |
| 复习入口放在 StudyHomeView "今日任务"区域顶部 | StudyHomeView.swift |
| 复习入口放在 AIHomeView 快捷操作中 | AIHomeView.swift |
| 到期卡片数为 0 时显示空状态"🎉 都复习完啦" | ReviewCardView.swift |

涉及接口：`GET /reviews/due`、`POST /reviews/:id/submit`

---

## 三、P1 —— 数据接入（5 项）

### P1-1：薄弱点 / AI 分析接真实数据

**现状：** AnalysisHomeView / WeakPointsPage 硬编码 3 条数据。

**需要做：**

| 子任务 | 涉及文件 |
|--------|---------|
| AnalysisHomeView `.task {}` 中调 `FocusItemService.list()` | AnalysisHomeView.swift |
| 替换硬编码 ZXWeakRow 为 `ForEach(focusItems)` | AnalysisHomeView.swift |
| RecallTestPage 提交回答时调 `AIAnalysisService.analyze(...)` | DailyThinkingPage.swift |
| AIFeedbackPageView 展示真实分析结果 | DailyThinkingPage.swift |
| APIModels 增补 FocusItem 字段对齐后端 | APIModels.swift |

涉及接口：`GET /focus-items`、`POST /ai-analysis`、`GET /ai-analysis/:id`

---

### P1-2：StudyHomeView 数据真实化

**现状：** 进度环、任务列表、周活跃柱状图全是硬编码。

**需要做：**

| 子任务 | 涉及文件 |
|--------|---------|
| 调 `ActivityService.summary()` 获取真实统计数据 | StudyHomeView.swift |
| 进度环用真实 `totalMinutes` / `streakDays` | StudyHomeView.swift |
| 周活跃图调 `GET /activity/heatmap`（APIService 需新增 heatmap 方法） | StudyHomeView.swift + APIService.swift |
| 今日任务从 `GET /reviews/due` + `GET /focus-items` 拼接 | StudyHomeView.swift |

涉及接口：`GET /activity/summary`、`GET /activity/heatmap`

---

### P1-3：ProfileView 接入用户资料

**现状：** ProfileView 全部静态假数据（昵称"学习者"、假统计）。

**需要做：**

| 子任务 | 涉及文件 |
|--------|---------|
| `.task {}` 调 `UserService.myProfile()` | ProfileView.swift |
| 替换头像（emoji → 真实 avatar URL / 默认头像） | ProfileView.swift |
| 替换昵称、邮箱、统计数字 | ProfileView.swift |
| 菜单项"学习目标设置"跳设置表单页 → `PATCH /users/me/preferences` | ProfileView.swift + 新 SettingsView |

涉及接口：`GET /users/me`、`PATCH /users/me`、`PATCH /users/me/preferences`

---

### P1-4：通知中心页面

**现状：** 完全没有通知页面。

**需要做：**

| 子任务 | 新建/涉及文件 |
|--------|-------------|
| 新建 `NotificationListView.swift` | **新文件** Features/Profile/NotificationListView.swift |
| `.task {}` 调 `GET /notifications` | NotificationListView.swift |
| 列表项点击标记已读 `POST /notifications/:id/read` | NotificationListView.swift |
| ProfileView 右上角铃铛 badge 显示未读数 | ProfileView.swift |
| APIService 新增 `NotificationService` | APIService.swift |

涉及接口：`GET /notifications`、`POST /notifications/:id/read`

---

### P1-5：反馈提交

**现状：** 没有反馈提交入口。

**需要做：**

| 子任务 | 涉及文件 |
|--------|---------|
| ProfileView 菜单加"帮助与反馈" → 跳反馈表单 | ProfileView.swift + 新 FeedbackView |
| 调 `FeedbackService.submit(...)` | 新 FeedbackView |
| 提交后显示"感谢反馈"提示 | 新 FeedbackView |

涉及接口：`POST /feedback`

---

## 四、P2 —— 新页面/功能（5 项）

### P2-1：文件导入真实接入

**现状：** ImportPage 只有 4 个静态按钮。

**需要做：** 接入 `PHPickerViewController`（相册选图）、`UIDocumentPickerViewController`（文件选择）、AVCaptureSession（拍照），上传后调 `POST /imports`，轮询 `GET /imports/:id/status`。APIService 新增 `DocumentImportService`。

---

### P2-2：全局搜索

**现状：** LibraryHomeView 有搜索框但无效。

**需要做：** 新建 `SearchView.swift`，调 `GET /knowledge-items?keyword=xxx`，支持搜索知识点/知识库/标签，展示搜索结果列表。

---

### P2-3：设置页面完善

**现状：** ProfileView 5 个菜单项全是假的。

**需要做：** 每个菜单项对应一个设置表单页：学习目标、复习提醒时间、学习报告邮件、学习方法偏好（费曼/回忆/间隔/综合）、数据同步状态。

---

### P2-4：主动回忆（Active Recall）流程

**现状：** RecallTestPage 只提交假的 AI 分析，没有调 `GET /active-recalls`。

**需要做：** 新建 ActiveRecallView，展示问题卡片 → 输入回答 → 调 `POST /active-recalls/:id/submit`。

---

### P2-5：Token 自动刷新与登录态管理

**现状：** Token 没有持久化，没有 refresh 逻辑。

**需要做：** Keychain 存储 accessToken + refreshToken；APIClient 拦截 401 → 自动调 `POST /auth/refresh` → 重试原请求；refresh 也失败 → 清 Token → 跳登录页。

---

## 五、P3 —— 体验增强（5 项）

| # | 项目 | 说明 |
|---|------|------|
| P3-1 | 下拉刷新 | 所有列表页 `.refreshable {}` + 页码分页 |
| P3-2 | 加载/空/错误三态 | 每个数据加载页加 ProgressView / 空状态插图+文案 / 错误重试按钮 |
| P3-3 | 离线缓存 | 用 UserDefaults 或本地 JSON 缓存最近数据，断网可展示 |
| P3-4 | 深色模式 | 当前强制 `.dark`，需支持跟随系统 |
| P3-5 | 无障碍 | VoiceOver labels、Dynamic Type 适配、高对比度 |

---

## 六、实施建议顺序

```
第 1 周 ─ P0-1 登录 → P0-2 知识库CRUD → P0-3 学习会话
第 2 周 ─ P0-4 复习卡片 → P1-1 薄弱点/AI分析 → P1-2 StudyHomeView 真实化
第 3 周 ─ P1-3 ProfileView → P1-4 通知中心 → P1-5 反馈
第 4 周 ─ P2-1 文件导入 → P2-2 搜索 → P2-3 设置页
第 5 周 ─ P2-4 主动回忆 → P2-5 Token刷新
第 6 周 ─ P3 体验增强
```

---

## 七、后端接口未封装清单（需新增 Service 方法）

| 模块 | 后端口 | 未封装接口 |
|------|--------|----------|
| KnowledgeBase | PATCH/DELETE | update / delete |
| KnowledgeItems | PATCH/DELETE | update / delete |
| LearningSession | POST/GET | start / end / list |
| ActiveRecall | GET/POST | list / submit |
| AIAnalysis | GET | result / job status |
| Activity | GET | heatmap |
| Notifications | GET/POST | list / markRead |
| DocumentImport | POST/GET | create / status |
| Review | POST | submit |
| FocusItems | POST/PATCH | create / update / complete |

> 需新增约 15 个 Service 方法 + 对应 Request/Response DTO
