diff --git a/AIStudyApp/AIStudyApp/Features/Analysis/AnalysisHomeView.swift b/AIStudyApp/AIStudyApp/Features/Analysis/AnalysisHomeView.swift index 6435957..e2dfdf7 100644 --- a/AIStudyApp/AIStudyApp/Features/Analysis/AnalysisHomeView.swift +++ b/AIStudyApp/AIStudyApp/Features/Analysis/AnalysisHomeView.swift @@ -75,6 +75,26 @@ struct AnalysisHomeView: View { } }.padding(.horizontal, 20).padding(.bottom, 120) } + // AI 综合分析(从 trends + recommendations 生成摘要) + if let summary = viewModel.summary, !viewModel.trends.isEmpty || !viewModel.recommendations.isEmpty { + VStack(alignment: .leading, spacing: 12) { + HStack(spacing: 8) { Image(systemName: "brain.head.profile").font(.system(size: 14)).foregroundColor(Color.zxPurple); Text("AI 综合分析").font(.system(size: 14, weight: .bold)).foregroundColor(Color.zxF0) } + Text(aiAnalysisText).font(.system(size: 13)).foregroundColor(Color.zxF05).lineSpacing(4) + if !viewModel.recommendations.isEmpty { + VStack(spacing: 6) { + ForEach(viewModel.recommendations.prefix(2)) { r in + HStack(spacing: 8) { + Image(systemName: "lightbulb.fill").font(.system(size: 11)).foregroundColor(Color.zxAccent) + Text(r.title ?? "").font(.system(size: 12)).foregroundColor(Color.zxF0) + Spacer() + }.padding(10).background(Color.zxFill003).clipShape(RoundedRectangle(cornerRadius: 10)) + } + } + } + }.padding(16).background(Color.zxFill004).overlay(RoundedRectangle(cornerRadius: 20).stroke(Color.zxBorder006, lineWidth: 1)).clipShape(RoundedRectangle(cornerRadius: 20)) + } + }.padding(.horizontal, 20).padding(.bottom, 120) + } .scrollIndicators(.hidden) .zxPullToRefresh { await viewModel.refresh() } } @@ -82,6 +102,18 @@ struct AnalysisHomeView: View { .task { await viewModel.loadAll() } .navigationDestination(for: Route.self) { $0.destination } } + + private var aiAnalysisText: String { + let s = viewModel.summary + let streak = viewModel.streak + var parts: [String] = [] + if let min = s?.totalMinutes, min > 0 { parts.append("本周学习了 \(min) 分钟") } + if let d = streak?.currentStreak, d > 0 { parts.append("连续 \(d) 天坚持学习") } + if let r = s?.totalCardsReviewed, r > 0 { parts.append("复习了 \(r) 张卡片") } + if let avg = s?.dailyAverage, avg > 0 { parts.append("掌握度 \(avg)%") } + if parts.isEmpty { return "开始学习后,我会根据你的表现给出分析建议。" } + return parts.joined(separator: ",") + "。继续保持!" + } } struct ZXStatBadge: View { let icon: String; let label: String; let value: String; let trend: String; let color: Color