00eab3b865
feat(media): 动图迁移至七牛云CDN(qn.585998.xyz/华南); normalize.ts按videos/images分流; bump MEDIA_CACHE_BUST
2026-08-03 20:11:52 +08:00
16621d9c07
feat(category): 主分类(按器械/按部位)改为多选; filter-bar 内联默认展示几个分类其余收进"全部类型"面板
2026-08-02 22:40:09 +08:00
5744a9a166
fix(gif-player): 循环回到首帧重置缓冲区修复冻结 + 模块级双缓存避免重复下载; bump MEDIA_CACHE_BUST 以拉取压缩后动图(1.8G->856M)
2026-08-02 21:44:58 +08:00
2117225cbb
fix: 分类页顶部穿透 + 筛选条收起为「几个选中 + 全部类型」
...
- navbar 背景由半透明渐变(rgba 0.55~0.92)改为实色不透明渐变(#0B0F0E→#0E1412),杜绝 sticky 滚动时内容透视
- filter-bar 内联取消横滑铺全部:收起态只展示最多 3 个选中 chip + 末尾『全部类型』按钮,点击才展开面板陈列全部(选中置顶)
- 单选点已选 chip 打开面板切换;多选点已选 chip 直接移除;超出 3 个显示 +N
2026-07-26 13:10:42 +08:00
b6e2093c82
feat: 分类浏览体验优化
...
- 后端 CategoryItem 新增 sample 字段,每个器械/部位分类附首条动作代表图(720 JPG 海报),前端网格无需点进详情即可预览
- 首页『按器械浏览』『按部位浏览』网格 tile 改为图文卡片,展示分类代表图
- filter-bar 内联改为一行可横滑的分类 chips + 末尾『全部类型』入口;点开面板展开全部,选中项自动置顶
2026-07-26 12:45:28 +08:00
8d584129ec
fix: gif-player 加 cache-bust 击穿微信 GET 缓存
...
- config.js 新增 MEDIA_CACHE_BUST 常量,换媒体后改此值即可强制客户端重下
- gif-player _load 给 src 追加 cb 参数,避免覆盖 720 动图后仍显示微信缓存的旧 180 图
2026-07-24 16:31:12 +08:00
393157e56b
feat: 器械分类网格化 + 分类页标题防乱码 + 按器械/部位多维度筛选
...
- 首页『热门器械』由横滑 chips 改为与『按部位浏览』一致的网格
- 分类页 navbar 标题改由本地分类枚举回写,避免外部传入标题乱码
- 分类页新增二级维度多选筛选:器械维度交叉按部位,其余维度交叉按器械
- 后端 exercises.service 支持 equipment/bodyPart 逗号分隔多值 OR 过滤(向后兼容)
2026-07-24 10:28:40 +08:00
ec0eb98411
fix(category): 实现触底分页加载更多,修复往下翻无内容
...
- 根因:category.js 的 loadExercises 永远只取第 1 页(page=1, pageSize=20),
且用 exercises = res.items 整体替换、从不追加,也没有 onReachBottom/触底加载。
动作数远超 20(全部 1324、胸 163)时,往下翻只能看到前 20 条,其余永远加载不出来。
- 修复:
* loadExercises 首次加载重置 page=1 并按 items.length<total 计算 hasMore
* 新增 onReachBottom + loadMore:触底时 page+1、concat 追加、刷新 hasMore
* wxml 在网格下方加 loadmore 状态条(加载中 spinner/已经到底啦/上拉加载更多)
* wxss 加 .spinner 旋转动画(用 --accent/--line,均在 app.wxss 已定义)
- 后端分页已验证:page=2 返回偏移后的不同数据,total 字段准确
2026-07-23 20:13:53 +08:00
b687c50e3d
fix(category): 分类横列吸顶固定 + 默认高亮「全部」+ 加载态常驻
...
1) 滚动时顶部分类横列不被隐藏
- filterbar 改 position:sticky,top 用 calc(statusBarHeight px + 88rpx) 精确贴在 navbar 下方,
不同机型状态栏高度差异下不串位;加背景色(var(--bg-grad))避免滚动时内容透出
2) 修复「加载有问题」的感知问题
- 进入分类页(如首页分类 tab)时 activeValue 为空且 values 无空值项,导致所有 chip 都不高亮;
现头部插入「全部」项(value:'')并默认选中,进入即明确当前为全部动作
- filterbar 原 wx:if values.length 在加载期间整块消失;现加载/空态常驻占位(显示『加载分类中…』/『暂无分类』)
2026-07-23 19:54:22 +08:00
ff3a120b55
feat(plan): 新增「加入计划」选择器页 + 增强官方计划浏览,修复返回不刷新
...
1) 新增 pages/plan-select(加入我的计划选择器,替换详情页 actionSheet)
- 默认展示我全部计划(浏览,不再强制搜索),支持 最近创建/动作最多 排序 + 名称搜索
- 点选即把动作加入该计划并返回;无计划时引导新建
- 入口接在 detail 页「加入计划」(无 planId 时 navigate 至此)
2) 增强 pages/collection(官方训练计划)
- 默认展示全部分级,新增 等级筛选 chips + 名称搜索(均用现有字段,不改后端)
- 筛选/搜索纯前端,viewGroups 驱动渲染
3) 修复 plan-detail 从「添加动作」返回后列表不刷新(上轮已单独提交 7ff55a6)
4) app.json 注册 plan-select 页面
2026-07-23 14:15:41 +08:00
7ff55a6257
fix(plan-detail): onShow 重载,修复从「添加动作」页返回后列表不刷新
...
- 根因:plan-detail 仅在 onLoad 加载数据;从 search(selectMode) 选完动作返回时
onLoad 不再触发,导致新增的动作不显示,用户感知为『选择动作后返回页面没更新』。
- 修复:load() 从 onLoad 移至 onShow,首次进入与返回均会刷新;onLoad 仅做参数初始化。
2026-07-23 13:31:48 +08:00
8cf962f662
fix(plan-card): 根视图补 bindtap="onTap",修复点击计划卡片无法进入详情
...
- 根因:此前重写 my-plans 时改为由 plan-card 自身的 target/onTap 负责跳转,
但 plan-card/index.wxml 根视图漏绑 bindtap="onTap",onTap 方法虽写好却从未触发,
导致『我的训练计划』页点击卡片无任何反应、进不去计划详情。
- 修复:plan-card 根 <view class="pc"> 加 bindtap="onTap" 与 hover-class="pc--hover"。
- 体验:新增 .pc--hover 按压反馈(轻微缩放 + Volt 绿描边 var(--gold-line)),token 均在 app.wxss 已定义。
2026-07-23 07:52:16 +08:00
956ad3c3bc
fix(my-plans): 修复计划列表页因 plan-card 漏声明 fc-icon 导致编译失败进不去
...
- 根因:c4639d0 给 plan-card 换上 <fc-icon> 但 plan-card.json 的 usingComponents 留空,
微信要求组件自行声明所引用的自定义组件,导致任何使用 plan-card 的页面编译报错、无法进入。
- 修复:plan-card/index.json 补上 fc-icon 声明(与 exercise-card/avatar/bottom-nav 一致)。
- 整体优化 my-plans:
* 新增 status 四态(loading/list/empty/error),请求失败显示具体错误 + 『重新加载』按钮,杜绝静默进不去
* 加载态用 refresh-cw 旋转图标替代纯文字
* 遗留金色主按钮(新建计划/空态按钮/官方计划链接)统一到 Kinetic Dark 的 Volt 绿强调色,去除旧主题不一致
2026-07-23 00:20:01 +08:00
54a5ae858d
fix(plan-detail): 增加加载/错误/重试/未找到四态,杜绝静默空白
...
- 此前详情页请求失败时仅 setData(loading:false),plan 仍为 null,
整页只显示一行小字,用户感知为「空白」且无法定位原因。
- 现明确区分 loading / error(带重试按钮) / not-found 三种空态;
request 失败时按 statusCode 给具体提示(401 登录失效 / 404 未找到 / 其他网络错误)。
- onLoad 对 getApp().globalData 取值加防御;缺失 id 直接报错不发起请求。
2026-07-22 23:58:48 +08:00
c4639d0703
fix(plan-card): 计划卡片图标改用 fc-icon 渲染
...
- plan-card 仍用 {{plan.emoji}} 文本渲染,导致创建计划后显示 person-standing 等字面量
- 改为 require iconName 计算 icon,wxml 使用 <fc-icon> 渲染
- 同步清理 badge/emoji 的字体样式
2026-07-22 23:39:49 +08:00
60ba0625b5
fix(input): 修复计划名称输入框文字被遮挡问题
...
- plan-edit 的 input 增加显式 height/line-height/box-sizing,避免中文被底部截断
- feedback 的联系方式 input 同步增加高度与行高,防止同类裁剪
2026-07-22 23:36:52 +08:00
d74aae02b0
fix: 分类筛选切换无效 —— chip 自定义事件名 tap 与微信原生触摸事件冲突,改 select
...
- chip 组件 triggerEvent 原为 'tap'(微信原生触摸事件名),嵌在 scroll-view scroll-x 内时手势可能被当滚动消费,导致 onValue 收不到 e.detail.value -> 不筛选 -> 仍显示全部动作
- 改为非原生事件名 'select',category.wxml 绑定同步改 bind:select
- 选中态配色从旧金色(gold-soft/gold-2/gold-line)换成 Volt 绿(accent-soft/accent/accent-ring)+加粗,当前分类一眼可见
- 前端筛选逻辑与后端筛选均经沙箱+真机 API 验证正确(bodyPart=chest/back 返回不同数据)
2026-07-22 23:34:04 +08:00
a0894837bd
ux: 动作收藏按钮从顶部浮窗移到底部,与加入计划并排 + 图标美化
...
- detail 顶部 favbtn 浮窗(需避让胶囊、丑)移除,改为底部 addbar 内与 CTA 并排的方形按钮
- fc-icon 新增 filled 属性:收藏态实心心形(Lucide 描边图标默认 fill=none,filled=true 时 fill=stroke 变实心)
- 收藏按钮美化:圆角 24rpx 方形 + 发丝边框,未收藏描边(text-2)、已收藏实心(accent)+ accent-soft 底色 + accent-ring 边框 + 点按 scale 反馈
- detail.js 清理 favRight/favTop 胶囊避让逻辑(不再需要)
2026-07-22 23:25:17 +08:00
4dba91a16e
fix: 首页我的计划点击跳转错页 + feat: 新增留言反馈功能
...
fix:
- 首页'我的计划'卡片误绑 onExercise(跳动作详情),改为 onPlanTap 正确跳训练计划详情页
- 修复后点击计划可正常打开 plan-detail
feat(留言反馈):
- 后端新增 feedback 模块:POST /api/feedback(AuthGuard,content 必填/contact 选填),JsonStore 持久化
- 前端新增 pages/feedback 页面(留言内容 textarea + 联系方式选填 + 提交),profile 菜单新增'意见反馈'入口
- icon-svg 新增 message-circle 图标(反馈页用)
2026-07-22 23:21:18 +08:00
c98758e61b
fix: fc-icon 改用 SVG 矢量图 + image 渲染,彻底解决微信 text 自定义字体不显示导致图标变字符
...
- 微信小程序 <text> 对 @font-face 自定义字体支持不可靠(开发者工具/真机均可能不渲染),图标回退成字符
- 改用 <image> 渲染 Lucide SVG 矢量图(data:image/svg+xml),彻底绕开字体加载限制,矢量/可上色
- 新增 utils/icon-svg.js(49 图标内层 SVG,stroke/fill 用 __C__ 占位),fc-icon 按 color 动态拼色
- 内置设计 token→色值映射,调用方传 var(--xxx) 自动解析为具体色值
- 移除 app.wxss 中已无用的 @font-face(字体方案废弃)
2026-07-22 23:09:56 +08:00
6b24be67ad
fix: 图标字体改用 base64 内联,修复微信小程序 @font-face 本地路径不生效导致图标显示成字符
...
- 微信小程序 @font-face 不支持引用项目内本地 .ttf 路径,字体加载失败会回退系统字体把私有区码点渲染成字符/豆腐块
- 将 fc-icon.ttf (7KB) 转 base64 内联进 app.wxss 的 @font-face,离线可用、零网络依赖
2026-07-22 22:57:52 +08:00
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
ca0af6f7d2
fix: gif-player 修复_abort误杀异步回调导致彻底不播放 + 加载中提示
2026-07-22 17:01:53 +08:00
f0f5c915d4
fix: gif-player 真实播放(observer+画布重试) + 帧延迟单位修正(1/100s→ms)
2026-07-22 16:38:07 +08:00
47c4801f34
fix: 动作详情GIF动图播放 + 收藏按钮避让胶囊
2026-07-22 16:02:04 +08:00
98126c62ec
feat: 自托管超分媒体 + 详情页优先清晰JPG
...
- 后端 main.ts: 新增 /media 静态服务(指向容器内 /app/media,由卷挂载)
配合 MEDIA_BASE_URL 指向本服务 /media,彻底脱离 jsDelivr 依赖
- 详情页 hero 优先用超分 JPG(720px),GIF/JPG 互为降级兜底
2026-07-22 15:33:29 +08:00
06bd96a473
fix: 修复动作卡片点击双触发导致跳 404
...
- 8 个页面 exercise-card 由 bind:tap 改为 catch:tap,拦截原生 tap 冒泡
避免一次点击被『自定义事件 + 原生冒泡』触发两次,
第二次 e.detail 无 id → navigateTo detail?id=undefined → 404
- 所有 onExercise 顶部加 id 守卫,无 id 直接 return
- exercise-card 点击前校验 exercise.id,缺失不触发
- detail onLoad 的 id 为空时直接显示空态,不再发起错误请求
2026-07-22 15:30:28 +08:00
70ff806042
feat: 小程序连接服务器IP + 同步未提交开发
...
- miniprogram/config.js: BASE_URL 指向 http://192.227.237.8:3001
- 动作标题中文化(nameZh),搜索匹配 name/nameZh/nameEn
- 新增计划/收藏/我的 等页面与组件
- 后端 Docker 化(Dockerfile/.dockerignore)与翻译脚本
- .gitignore 补充 .DS_Store
2026-07-22 14:05:30 +08:00
b3b58e66fb
feat: init fitness-coach (backend + miniprogram)
...
- backend: NestJS service with exercise/plan data
- miniprogram: WeChat mini program client
- exclude node_modules, dist, runtime data-store, local env
2026-07-22 00:35:40 +08:00