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

9.3 KiB
Raw Permalink Blame History

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)。

新集合 checkinsdata-store/checkins.json

{ id, openid, date(YYYY-MM-DD, openid+date 唯一), planId?, exerciseIds[], durationMin?, completed(bool), createdAt }

users 扩展字段fitnessGoal(减脂/增肌/塑形/保持健康)、level(beginner/intermediate/advanced)、trainFreq(每周次数)、onboardedavatar(改 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.wxsspage 变量:冷中性底(#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.ttfapp.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.jstimeout: 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 emoji→Lucide 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 — 完整档首页个性化区视觉线框
  • 本文件 — 整合实施方案 + 架构补齐 + 路线图 + 待定项