- 文档从扁平结构迁移至分类目录 (api-server/ios-projects/web-projects/长期规划) - 更新总待完成清单 (B1-B6 全部完成, I1-I7 全部完成) - 新增后端实现状态、已实现功能汇总等已完成文档 - 新增 iOS 功能需求清单、架构设计、差距分析等文档 - 清理旧版未维护文档 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
16 KiB
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