Files
fitness-coach/FITCOACH-OPTIMIZATION-PLAN.md
wm b94eb706ff feat: Kinetic Dark 设计语言 + Lucide 图标迁移 + 首页轻量个性化
- 建立 Lucide 子集 iconfont(49 字形),全站 emoji 替换为 fc-icon 组件
- 重塑 Design Token(冷中性近黑底 + Volt 荧光绿 #B6F24E),消除硬编码颜色
- 首页登录后个性化:我的计划 / 我的收藏 / 今日推荐(纯前端复用现有 API)
- 后端 DEFAULT_EMOJI→Lucide 名,PALETTE 对齐 Kinetic Dark 语义色板
- 修复 person-standing 缺失字形;14 个官方组合 seed emoji 全部映射到现有字形
2026-07-22 21:38:56 +08:00

118 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# FITCOACH 系统优化 · 整合实施方案(待确认)
> 整合自三份调研PM《优化 PRD》(PRD-FITCOACH优化方案.md)、设计师《动能暗色提案》(FITCOACH-DESIGN-PROPOSAL.md + design-system/design-tokens.json)、架构师技术方案(本文件第 2 节,由团队负责人据代码实测补齐)。
> 已确认方向(用户 2026-07-22 拍板):① 先出方案文档、确认后再开发;② 首页个性化两档都要(先轻量后完整);③ UI 重塑设计语言。
> P0 红线:禁止 emoji 当功能图标(统一 Lucide SVG iconfont、禁止紫粉渐变、禁止硬编码颜色一律走 Token
---
## 1. 现状诊断(代码实测结论)
| 问题 | 证据 | 影响 |
|------|------|------|
| 首页零个性化 | `pages/index/index.js` `loadData()` 只拉全局 stats/featured/collections无 openid 维度;"今天,练点什么?"写死 | 登录与不登录完全一致,无归属感 |
| emoji 图标系统性违规 | 首页 `🔍✨💪🏋️📋🗂️👤`、底部导航 `🏠📚📋👤`、profile `❤️🗂️⭐📋💪`、各空态、占位 `🏋️`;后端 `users.service.ts` 默认 avatar=`🏃``plans.service.ts` 默认 emoji=`📋` | 触发 P0-1 红线,全站廉价感 |
| 加载/错误态缺失 | 首页 `loading` 是死代码wxml 未引用)首屏空白;`request.js` 失败只 toast网络失败与无数据无区分、无重试 | 弱网下体验差、无兜底 |
| 响应速度 | `request.js` 无 timeoutwx.request 默认不强制超时);首页 `Promise.all` 无缓存;底部导航 `reLaunch` 重置栈→切 tab 重拉 | 弱网挂起、切 tab 白屏 |
| 硬编码颜色散落 | 13 个 wxss 裸写 `#0E1110`(8+处)、`#E5544B`/`rgba(229,84,75,…)``app.wxss` Token 命名偏金、缺语义色/字号阶梯/字距 | 改主题要改 N 处 |
| 设计令牌基础尚在 | `app.wxss` 已定义 `--bg/--surface/--gold/--text/--line/--radius` | 重塑改一处 + 组件局部即可,不动业务 |
**关键利好**:个性化所需接口其实已就绪——`planSvc.listMine()``GET /api/plans`(按 openid 隔离,已验证 `plans.controller.ts:35`)、`favSvc.listExercises()``GET /api/favorites/exercises`(已验证 `favorites.controller.ts:26`)、`auth` 登录态。轻量档**零后端改动**即可上线。
---
## 2. 架构技术方案(补齐)
### 2.1 轻量档P0纯前端零后端改动
- **首页 `index.js`** `onLoad`:若已登录(`wx.getStorageSync('access_token')` 存在且有效),并行拉:
- `planSvc.listMine()` → 我的计划列表
- `favSvc.listExercises()` → 我的收藏动作
- 今日推荐(前端推导):取 `GET /api/plans/official` 分级 + 用户收藏/浏览,按"未练过/匹配目标"排序取 top3复用推荐页现有推导逻辑无需新接口
- 用户资料:`auth.getProfile()` 或本地 `userInfo`
- **渲染**`isLogin` 为真 → 在 Hero 后插入"为你准备"区(时段问候 + 我的计划卡 + 收藏横滑 + 今日推荐);否则保留原通用内容 + 轻引导登录。
- **缓存**:用 `wx.setStorageSync` 缓存 listMine/favoriteskey 带 openid切 tab(`onShow`) 优先读缓存、后台静默刷新,避免 `reLaunch` 重拉白屏。
- 工作量:前端 2-3 人日。
### 2.2 完整档P1新增后端数据
沿用现有 `common/store.ts` 的 JsonStore 单例模式(已验证:`getStore(name)` 进程内单例、整体落盘 `data-store/<name>.json`)。
**新集合 `checkins`**data-store/checkins.json
```
{ id, openid, date(YYYY-MM-DD, openid+date 唯一), planId?, exerciseIds[], durationMin?, completed(bool), createdAt }
```
**users 扩展字段**`fitnessGoal`(减脂/增肌/塑形/保持健康)、`level`(beginner/intermediate/advanced)、`trainFreq`(每周次数)、`onboarded``avatar`(改 Lucide 图标名/URL去掉 emoji)。
**打卡触发点**plan-detail「完成训练」按钮 / 首页「今日打卡」按钮 → `POST /api/checkins`
**派生计算**(无需单独存储,由 checkins 实时算):
- `streak`:按 date 倒序,从今天/昨天起连续有 checkin 的天数
- `summary(range=7|30)`:训练次数、总时长、动作分布、完成率
- 历史曲线:近 14 日每日 checkin 数/时长 → 前端 SVG 面积图
**新增 API**(均 `@UseGuards(AuthGuard)` + `CurrentUser` 取 openid沿用 plans/favorites 模式):
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/api/checkins` | 创建/更新当日打卡 |
| GET | `/api/checkins/streak` | `{ streak, lastCheckinDate }` |
| GET | `/api/checkins/summary?range=7\|30` | `{ count, totalDuration, byExercise[], byDay[] }` |
| PATCH | `/api/users/me` | 扩展画像字段 |
- 工作量:后端 3-4 人日 + 前端 4-5 人日。需新建 `checkins.module/controller/service/(entity+dto)` + `users.service` 扩展。
### 2.3 UI Token 化改造P0
-`design-system/design-tokens.json` 为唯一真源,整体替换 `app.wxss``page` 变量:冷中性底(`#0B0F0E/#141A18/#1C2421`) + 珊瑚橙 accent(`#FF6A3D`) + 语义色(success/warn/danger/info) + 字号阶梯(22-72rpx) + 间距尺度(4px 网格) + 圆角(16/24/32) + 阴影(Hairline First) + 动效(150/200/300ms)。
- 13 个页面/组件 wxss把裸写 `#0E1110`/`#E5544B`/大阴影改为引用新 Token。
- 图标落地:编译 Lucide 子集(约 30-40 个图标)为 `miniprogram/assets/fonts/fc-icon.ttf``app.wxss` `@font-face` 声明 `fc-icon`;提供 emoji→Lucide name→codepoint 映射表,全站 `<text class="fc-icon">` 替换 emoji 文本节点。
- 风险主包体积iconfont ttf <50KB 可控个别 wxml emoji 字符作图标需逐个替换微信支持本地 ttf 自定义字体
### 2.4 综合 UX 技术支撑P0/P1
- **请求治理**`request.js` `timeout: 8000` + 失败类型区分(网络/业务/无数据) + 重试一次 + 可选缓存层弱网不再挂起
- **骨架屏**首页/列表页加 skeleton 占位token 色块替代当前首屏空白接上原 index.wxml 死代码 `loading` 或换 skeleton
- **错误重试**request 失败提供"重试"按钮error 替代纯 toast
- **tab 保活**bottom-nav `reLaunch` 重置栈 `switchTab` + 首页数据缓存 + `onShow` 静默刷新 tab 不白屏
- **常驻搜索**首页 search-pill 换成 SVG 图标 navbar 常驻)。
### 2.5 技术约束与风险
- JsonStore 单进程单例整体落盘——打卡高频写 flush 阻塞demo 量级 OK生产前置足够
- 主包 2MB 限制iconfont ttf <50KB 可控不打包 CJK 字体用系统字体已确认)。
- 图标库**锁定 LucideMIT**与设计师提案一致 ✅;尺寸 16/20/24rpx编译为 iconfont 子集
---
## 3. 实施路线图(优先级)
| 优先级 | | 档位 | 后端 | 前端 | 依赖 |
|--------|----|------|------|------|------|
| **P0** | emojiLucide SVG 图标替换全站 18+ + 后端默认 avatar/emoji | UI | | | |
| **P0** | Design Token 重塑Kinetic Darkapp.wxss + 13 wxss | UI | | | |
| **P0** | 首页轻量个性化问候+我的计划+收藏+今日推荐 | 个性化· | | 2-3人日 | 现有 API |
| **P0** | 骨架屏 + 错误重试 + 请求 timeout | UX | | 2-3人日 | |
| **P1** | 完整个性化后端checkins store + 3 接口 + users 扩展 | 个性化· | 3-4人日 | | 轻量档先上 |
| **P1** | 首页完整档区块进度环+连续天数+历史曲线 | 个性化· | | 4-5人日 | 后端接口 |
| **P1** | 导航重构 + 常驻搜索 + tab 保活 + 缓存 | UX | | | 请求治理 |
| **P2** | 下拉刷新 / 长按手势 / 进入动画 | UX | | | |
**MVP 切割**P0 四项先上验证假设零风险零后端)→ P1 完整档跟进需打卡数据沉淀)→ P2 打磨
**上线顺序**UI 重塑 + 轻量个性化 + 骨架屏 同批都在前端互不阻塞完整档独立一批需后端发布)。
---
## 4. 已锁定决策2026-07-22 用户确认)
1. **强调色 accent = Volt 荧光绿 `#B6F24E`**用户选非设计师默认珊瑚橙)。设计 Token `accent` 系列全部替换为该绿`accent:#B6F24E` / `accent-hover:#C7F56E` / `accent-active:#9EDB3A` / `accent-on:#0E1A05`(深绿字对比>7:1) / `accent-soft:rgba(182,242,78,.12)` / `accent_ring:rgba(182,242,78,.38)` / `glow:0 8rpx 24rpx rgba(182,242,78,.28)`。每屏≤2处。
2. **UGC emoji 选择器 → 现在就迁 Lucide 运动子集图标选择器**dumbbell/run/bike/heart/flame/target/yoga/medal/trophy 等),不保留 emoji 入口。plan-edit/profile 的计划图标与用户头像图标均走 Lucide。
---
## 5. Out-of-Scope本期不做
社交/社区、商城电商、课程直播跟练、饮食营养、硬件联动、i18n、SQL 迁移、生成式 AI 文案、付费会员。
---
## 附:交付物索引
- `PRD-FITCOACH优化方案.md` — PM 优化 PRD现状/竞品/三块方案/RICE/验收标准)
- `FITCOACH-DESIGN-PROPOSAL.md` — 设计师动能暗色提案(审计/Token/图标/视觉草案)
- `design-system/design-tokens.json` — 机读 Design Token 草案(唯一真源)
- `home-personalization-mockup.svg` — 完整档首页个性化区视觉线框
- 本文件 — 整合实施方案 + 架构补齐 + 路线图 + 待定项