78 lines
3.9 KiB
Markdown
78 lines
3.9 KiB
Markdown
|
|
# CompletionView Skeleton & Reveal 版 — 审查报告(不应用)
|
|||
|
|
|
|||
|
|
**审查日期**:2025-01-29
|
|||
|
|
**范围**:Skeleton & Reveal Edition(纯白卡片 + 呼吸骨架屏 + 蓝色弥散光 + 粒子庆祝)
|
|||
|
|
**结论**:仅审查、不修改仓库;需求落实正确,ParticleModifier 已按前次审查完成修复,**有一处可选视觉层级调整**。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. 需求落实情况
|
|||
|
|
|
|||
|
|
| 项目 | 要求 | 定稿实现 | 结论 |
|
|||
|
|
|------|------|----------|------|
|
|||
|
|
| **纯白卡片** | 彻底去「脏」,回归纯白 | `background(Color.white)` | ✅ |
|
|||
|
|
| **拒绝空状态** | 未激活时用骨架屏替代留白 | IdleSkeletonView:RoundedRectangle 骨架 + 呼吸透明度 | ✅ |
|
|||
|
|
| **呼吸骨架** | 暗示「数据等你揭开」 | `isBreathing ? 0.3 : 0.6` 配合 `repeatForever(autoreverses: true)` | ✅ |
|
|||
|
|
| **蓝色弥散光** | 激活后四周泛蓝光 | `shadow(color: isSystemOn ? brandBlue.opacity(0.25) : ..., radius: 40)` | ✅ |
|
|||
|
|
| **彩带爆炸** | 激活瞬间粒子庆祝 | ConfettiExplosion(Circle + Capsule) | ✅ |
|
|||
|
|
| **布局平衡** | 激活后数字填补按钮消失空间 | ActiveDashboard 使用 Spacer 居中,无按钮占位 | ✅ |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. ParticleModifier 修复确认
|
|||
|
|
|
|||
|
|
Magic Card 版审查中的两处问题均已修正:
|
|||
|
|
|
|||
|
|
| 项目 | Magic Card 版问题 | Skeleton & Reveal 实现 | 结论 |
|
|||
|
|
|------|--------------------|------------------------|------|
|
|||
|
|
| **弧度转换** | `cos(angle)` 使用角度制 | `angleRad = angleDegrees * .pi / 180`,使用 `cos(angleRad)` | ✅ |
|
|||
|
|
| **随机值稳定** | `angle`/`distance` 为计算属性,每次重算 | `init` 中生成并存入 `let angleRad`、`let distance` | ✅ |
|
|||
|
|
| **粒子颜色** | `randomElement()!` 每次重绘变化 | `confettiColors[i % confettiColors.count]` 按 index 固定 | ✅ |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. 逻辑继承
|
|||
|
|
|
|||
|
|
| 项目 | 结论 |
|
|||
|
|
|------|------|
|
|||
|
|
| **持久化 Key** | ✅ `has_revealed_course_\(courseId)` |
|
|||
|
|
| **游客短路** | ✅ 0.5s 延迟,`performActivation(0, 0)`,不调网络 |
|
|||
|
|
| **登录用户** | ✅ 0.8s 延迟 → fetchUserProfile → performActivation |
|
|||
|
|
| **checkSystemStatus** | ✅ 已激活时恢复最终值 |
|
|||
|
|
| **数字滚动** | ✅ `withAnimation(.linear(1.5))` + RollingNumberText |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. 可选:粒子与文字层级
|
|||
|
|
|
|||
|
|
**当前实现**:`ConfettiExplosion` 使用 `.zIndex(2)`,卡片内容 VStack 使用默认 zIndex,因此粒子叠在文字之上。
|
|||
|
|
|
|||
|
|
**注释意图**:「粒子炸在文字后面,但在卡片背景前面」——若希望粒子在文字后面,需要降低粒子的 zIndex,或提高卡片内容的 zIndex。
|
|||
|
|
|
|||
|
|
**建议**:若需粒子在文字后面,可为卡片 VStack 添加 `.zIndex(1)`,并为 `ConfettiExplosion` 使用 `.zIndex(0)` 或不设置。若希望粒子在前面以增强庆祝感,可保持现状。属视觉偏好,非必须修改。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 5. 其他实现细节
|
|||
|
|
|
|||
|
|
| 项目 | 说明 |
|
|||
|
|
|------|------|
|
|||
|
|
| **骨架 blur(radius: 3)** | 增加模糊感,在多数设备上可接受;低端机若有卡顿再考虑去掉 |
|
|||
|
|
| **呼吸动画** | `onAppear` 中 `withAnimation(.easeInOut(duration: 1.0).repeatForever(autoreverses: true))` 驱动 `isBreathing`,逻辑正确 |
|
|||
|
|
| **ScaleButtonStyle** | 未使用,无重复定义风险 |
|
|||
|
|
| **接口** | 三参数不变,可直接替换 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 6. 总结
|
|||
|
|
|
|||
|
|
| 维度 | 结论 |
|
|||
|
|
|------|------|
|
|||
|
|
| **需求落实** | ✅ 纯白、骨架屏、弥散光、粒子、布局均符合 |
|
|||
|
|
| **ParticleModifier** | ✅ 弧度、随机稳定、颜色已修正 |
|
|||
|
|
| **逻辑继承** | ✅ Key、游客、登录用户、数字滚动正确 |
|
|||
|
|
| **粒子层级** | ⚪ 可选:按需求调整 zIndex 以实现「粒子在文字后面」 |
|
|||
|
|
| **接口兼容** | ✅ 可直接替换 |
|
|||
|
|
|
|||
|
|
**审查结论**:Skeleton & Reveal 版满足设计要求,ParticleModifier 已正确修复,可直接使用;如需粒子在文字后方,可按上节建议调整 zIndex。**本次未对仓库做任何修改。**
|