108 lines
5.0 KiB
Markdown
108 lines
5.0 KiB
Markdown
|
|
# CompletionView iOS 原生风格版 — 定稿审查报告(不应用)
|
|||
|
|
|
|||
|
|
**审查日期**:2025-01-29
|
|||
|
|
**范围**:Final iOS Native Style(systemGroupedBackground + 白卡片 + System Blue + Widget 布局)
|
|||
|
|
**结论**:仅审查、不修改仓库;需求落实正确,**有一处必须修复**(ScaleButtonStyle 重复定义)。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. 需求落实情况
|
|||
|
|
|
|||
|
|
### 视觉风格
|
|||
|
|
|
|||
|
|
| 项目 | 要求 | 定稿实现 | 结论 |
|
|||
|
|
|------|------|----------|------|
|
|||
|
|
| **背景** | systemGroupedBackground 浅灰 | `Color(UIColor.systemGroupedBackground)` | ✅ |
|
|||
|
|
| **卡片** | 纯白圆角 + 柔和投影 | `cardBg = .white`,`.cornerRadius(16)`,`shadow(radius:15, y:6)` | ✅ |
|
|||
|
|
| **配色** | System Blue(品牌蓝) | `brandBlue = Color.blue` | ✅ |
|
|||
|
|
| **布局** | Widget 小组件式 | 卡片头(学习统计 + chart 图标)+ 主视觉(小节数)+ 次视觉(专注时长) | ✅ |
|
|||
|
|
| **主/次视觉** | 超大小节数 + 底部专注时长 | 80pt 数字 + 底部一行「专注时长 X min」 | ✅ |
|
|||
|
|
|
|||
|
|
### 交互与动效
|
|||
|
|
|
|||
|
|
| 项目 | 要求 | 定稿实现 | 结论 |
|
|||
|
|
|------|------|----------|------|
|
|||
|
|
| **按钮文案** | 上传数据 → Loading → 已同步 | 三态:`Text("上传数据")` / `ProgressView` / `HStack(checkmark + "已同步")` | ✅ |
|
|||
|
|
| **按钮颜色** | 严禁变绿,始终蓝底 | `background(brandBlue)` | ✅ |
|
|||
|
|
| **屏幕动效** | 数据加载完成,内容淡入 | `withAnimation(.easeOut(0.3)) { isSystemOn = true }` | ✅ |
|
|||
|
|
| **数字动效** | 从 0 匀速滚动到目标,1.5s | `withAnimation(.linear(1.5)) { displayLessons/Minutes }` + `RollingNumberText` | ✅ |
|
|||
|
|
|
|||
|
|
### 业务逻辑
|
|||
|
|
|
|||
|
|
| 项目 | 要求 | 定稿实现 | 结论 |
|
|||
|
|
|------|------|----------|------|
|
|||
|
|
| **数据源** | UserManager.shared | `@ObservedObject userManager = UserManager.shared` | ✅ |
|
|||
|
|
| **持久化** | UserDefaults 防重复动效 | `storageKey: "has_revealed_course_\(courseId)"` | ✅ |
|
|||
|
|
| **导航** | `navStore.switchToGrowthTab()` | 一致 | ✅ |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. 逻辑继承(FRC 要求)
|
|||
|
|
|
|||
|
|
| 项目 | 结论 |
|
|||
|
|
|------|------|
|
|||
|
|
| **持久化 Key** | ✅ `has_revealed_course_\(courseId)` |
|
|||
|
|
| **游客短路** | ✅ 0.5s 延迟,`performActivation(0, 0)`,不调网络 |
|
|||
|
|
| **登录用户** | ✅ 0.8s 延迟 → fetchUserProfile → performActivation |
|
|||
|
|
| **checkSystemStatus** | ✅ 已激活时恢复最终值,无动画 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. ⚠️ 必须修复:ScaleButtonStyle 重复定义
|
|||
|
|
|
|||
|
|
**问题**:定稿代码在文件末尾定义了 `struct ScaleButtonStyle: ButtonStyle`,而项目中已在 `NotebookListView.swift`(约第 287 行)定义同名 struct。同一 target 内存在两个 `ScaleButtonStyle` 会导致 **invalid redeclaration** 编译错误。
|
|||
|
|
|
|||
|
|
**修复**:删除 CompletionView.swift 中 `ScaleButtonStyle` 的完整定义(`struct ScaleButtonStyle: ButtonStyle { ... }`),直接使用项目已有的实现。`ScaleButtonStyle` 在同一模块内可访问,无需额外导入。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. RollingNumberText
|
|||
|
|
|
|||
|
|
- `RollingNumberText` 仅在 CompletionView 相关代码中使用,当前实现 `Animatable` 正确,与定稿逻辑一致。
|
|||
|
|
- 保留在 CompletionView.swift 内不会产生符号冲突。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 5. 模块化与 HIG 符合度
|
|||
|
|
|
|||
|
|
- 将 `SummaryCardView`、`ActiveDashboardView`、`IdlePlaceholderView`、`UploadButton` 拆分为 computed property,结构清晰。
|
|||
|
|
- 使用 `Color(UIColor.systemGroupedBackground)`、`Color(UIColor.secondarySystemGroupedBackground)` 等系统颜色,符合 iOS HIG。
|
|||
|
|
- `ScaleButtonStyle` 的按压缩放效果与 NotebookListView 中的实现一致,视觉体验统一。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 6. 接口与影响范围
|
|||
|
|
|
|||
|
|
| 项目 | 结论 |
|
|||
|
|
|------|------|
|
|||
|
|
| **初始化参数** | 三参数不变 |
|
|||
|
|
| **替换方式** | 整文件替换 `CompletionView.swift` |
|
|||
|
|
| **其他页面** | 无影响 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 7. 总结
|
|||
|
|
|
|||
|
|
| 维度 | 结论 |
|
|||
|
|
|------|------|
|
|||
|
|
| **需求落实** | ✅ 视觉、交互、动效、业务逻辑均符合要求 |
|
|||
|
|
| **逻辑继承** | ✅ Key、游客、登录用户逻辑正确 |
|
|||
|
|
| **ScaleButtonStyle** | ❌ **必须删除定稿中的定义**,改用项目已有实现 |
|
|||
|
|
| **接口兼容** | ✅ 可直接替换 |
|
|||
|
|
|
|||
|
|
**审查结论**:定稿在逻辑和需求上正确,应用前需**删除 CompletionView.swift 中的 `struct ScaleButtonStyle` 定义**,否则无法通过编译。**本次未对仓库做任何修改。**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 8. 修正版审查确认(2025-01-29 续)
|
|||
|
|
|
|||
|
|
**修正内容**:已移除 `ScaleButtonStyle` 结构体定义,仅保留 `.buttonStyle(ScaleButtonStyle())` 调用,复用 `NotebookListView.swift` 中已有实现。
|
|||
|
|
|
|||
|
|
| 项目 | 修正前 | 修正后 | 结论 |
|
|||
|
|
|------|--------|--------|------|
|
|||
|
|
| **ScaleButtonStyle** | 文件末尾重复定义 | 已删除,使用项目已有 | ✅ 修复完成 |
|
|||
|
|
| **调用处** | `.buttonStyle(ScaleButtonStyle())` | 不变,解析为 NotebookListView 中定义 | ✅ 正确 |
|
|||
|
|
| **注释** | — | 添加「使用项目已有」「此处不重复声明」 | ✅ 便于后续维护 |
|
|||
|
|
|
|||
|
|
**结论**:修正版可**直接替换** `CompletionView.swift`,无编译冲突。**本次未对仓库做任何修改。**
|