WangDL 5e19bd740e feat(ios): 鉴权系统完善 + 前后端打通 + 模型对齐 + ViewModel 创建
- 新增 AuthManager (ObservableObject) 集中管理鉴权状态:
  - session 恢复 → token 验证 → 自动刷新
  - 登出自动重定向到登录页
  - NotificationCenter 监听 401 实现全局踢回
- APIClient 新增 401 自动 refresh + 单次重试
- App.swift 重构鉴权门控:
  - 去掉 hasCompletedOnboarding 绕过鉴权漏洞
  - 拆分为 SplashScreen / PreLoginFlow / PostLoginOnboardingFlow / ContentView
  - LoginPage 移除"跳过"按钮
- KeychainHelper 实现 token 安全存储
- APIModels 对齐后端 Prisma schema (UserProfile/KnowledgeBase/ReviewCard 等)
- APIService 简化 AuthService,token 管理迁移至 AuthManager
- 新增 8 个 ViewModel 接入 API:
  ProfileViewModel, LibraryViewModel, StudyViewModel,
  ActiveRecallViewModel, AIAnalysisViewModel, ReviewViewModel, ActivityViewModel
- 新增 EditProfilePage 编辑资料页
- 新增 NotificationListView 通知列表页
- AIHomeView 修复"检测中"卡住 (改用公开 GET / 健康检查)
- SettingsView 登出调用 AuthManager.signOut() 实现重定向
- 修复 NotificationItem 命名冲突、Combine import 缺失等编译错误

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 19:06:23 +08:00

81 lines
2.4 KiB
Swift

import Combine
import Foundation
@MainActor
class LibraryViewModel: ObservableObject {
@Published var knowledgeBases: [KnowledgeBase] = []
@Published var isLoading = false
@Published var errorMessage: String?
func loadKnowledgeBases() async {
isLoading = true
errorMessage = nil
do {
knowledgeBases = try await KnowledgeBaseService.shared.list()
} catch {
errorMessage = "加载知识库失败"
}
isLoading = false
}
func createKnowledgeBase(title: String, description: String?) async -> KnowledgeBase? {
do {
let kb = try await KnowledgeBaseService.shared.create(title: title, description: description)
knowledgeBases.insert(kb, at: 0)
return kb
} catch {
errorMessage = "创建知识库失败"
return nil
}
}
func deleteKnowledgeBase(id: String) async {
do {
_ = try await KnowledgeBaseService.shared.delete(id: id)
knowledgeBases.removeAll { $0.id == id }
} catch {
errorMessage = "删除知识库失败"
}
}
}
@MainActor
class LibraryDetailViewModel: ObservableObject {
@Published var items: [KnowledgeItem] = []
@Published var knowledgeBase: KnowledgeBase?
@Published var isLoading = false
@Published var errorMessage: String?
func loadItems(knowledgeBaseId: String) async {
isLoading = true
errorMessage = nil
do {
items = try await KnowledgeItemService.shared.list(knowledgeBaseId: knowledgeBaseId)
} catch {
errorMessage = "加载知识点失败"
}
isLoading = false
}
func loadKnowledgeBase(id: String) async {
do {
knowledgeBase = try await KnowledgeBaseService.shared.detail(id: id)
} catch {
errorMessage = "加载知识库详情失败"
}
}
func addItem(knowledgeBaseId: String, title: String, content: String?) async -> KnowledgeItem? {
do {
let item = try await KnowledgeItemService.shared.create(
knowledgeBaseId: knowledgeBaseId, title: title, content: content
)
items.append(item)
return item
} catch {
errorMessage = "添加知识点失败"
return nil
}
}
}