- 建立 Lucide 子集 iconfont(49 字形),全站 emoji 替换为 fc-icon 组件 - 重塑 Design Token(冷中性近黑底 + Volt 荧光绿 #B6F24E),消除硬编码颜色 - 首页登录后个性化:我的计划 / 我的收藏 / 今日推荐(纯前端复用现有 API) - 后端 DEFAULT_EMOJI→Lucide 名,PALETTE 对齐 Kinetic Dark 语义色板 - 修复 person-standing 缺失字形;14 个官方组合 seed emoji 全部映射到现有字形
147 lines
5.4 KiB
Plaintext
147 lines
5.4 KiB
Plaintext
<view class="home" style="padding-top: {{statusBarHeight}}px;">
|
||
<!-- Hero -->
|
||
<view class="hero">
|
||
<view class="hero__eyebrow">FITCOACH · 智能健身教练</view>
|
||
<view class="hero__title">今天,练点什么?</view>
|
||
<view class="hero__sub">精准匹配你的目标肌群,让每一次训练都更高效</view>
|
||
|
||
<view class="search-pill" bindtap="onSearch">
|
||
<fc-icon name="search" size="28" color="var(--text-2)" />
|
||
<text class="search-pill__ph">搜索动作 / 器械 / 部位</text>
|
||
</view>
|
||
|
||
<view class="cta" bindtap="goRecommend">
|
||
<fc-icon name="sparkles" size="24" />
|
||
<text class="cta__txt">智能推荐</text>
|
||
<text class="cta__arrow">›</text>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 为你准备(登录后个性化) -->
|
||
<view class="section personal" wx:if="{{isLogin}}">
|
||
<view class="personal__head">
|
||
<view class="personal__titlewrap">
|
||
<view class="eyebrow">FOR YOU</view>
|
||
<view class="personal__hi">{{greeting}}准备好训练了吗?</view>
|
||
</view>
|
||
<fc-icon name="sparkles" size="22" color="var(--accent)" />
|
||
</view>
|
||
|
||
<view class="personal__block" wx:if="{{myPlans.length}}">
|
||
<view class="personal__sub">我的计划</view>
|
||
<view class="plan-row">
|
||
<view class="plan-chip" wx:for="{{myPlans}}" wx:key="id" data-id="{{item.id}}" bindtap="onExercise">
|
||
<fc-icon name="clipboard-list" size="20" color="var(--accent)" />
|
||
<view class="plan-chip__body">
|
||
<text class="plan-chip__name">{{item.name}}</text>
|
||
<text class="plan-chip__meta">{{item.count}} 个动作</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
|
||
<view class="personal__block" wx:if="{{todayRecommend.length}}">
|
||
<view class="personal__sub">今日推荐</view>
|
||
<view class="rec-row">
|
||
<view class="rec-item" wx:for="{{todayRecommend}}" wx:key="id" data-id="{{item.id}}" catch:tap="onExercise">
|
||
<view class="rec-item__body">
|
||
<text class="rec-item__name">{{item.name}}</text>
|
||
<text class="rec-item__reason">{{item.reason}}</text>
|
||
</view>
|
||
<fc-icon name="chevron-right" size="18" color="var(--text-3)" />
|
||
</view>
|
||
</view>
|
||
</view>
|
||
|
||
<view class="personal__block" wx:if="{{myFavorites.length}}">
|
||
<view class="personal__sub">我的收藏</view>
|
||
<scroll-view scroll-x class="hscroll fav-scroll">
|
||
<view class="fav-card" wx:for="{{myFavorites}}" wx:key="id" data-id="{{item.id}}" catch:tap="onExercise">
|
||
<image class="fav-card__img" src="{{item.image}}" mode="aspectFill" lazy-load />
|
||
<text class="fav-card__name">{{item.displayName || item.name}}</text>
|
||
</view>
|
||
</scroll-view>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 快捷入口 2x3 -->
|
||
<view class="section quick">
|
||
<view class="quick__grid">
|
||
<view
|
||
wx:for="{{quickEntries}}"
|
||
wx:key="key"
|
||
class="quick__tile"
|
||
data-url="{{item.url}}"
|
||
bindtap="onQuick">
|
||
<fc-icon name="{{item.icon}}" size="28" color="var(--text)" />
|
||
<text class="quick__label">{{item.label}}</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 精选动作 横向滑动 -->
|
||
<view class="section">
|
||
<section-header eyebrow="FEATURED" title="精选动作" subtitle="编辑精选 · 高效入门" action="全部" bind:action="goRecommend" />
|
||
<scroll-view wx:if="{{featured.length}}" scroll-x class="hscroll">
|
||
<view class="hscroll__item" wx:for="{{featured}}" wx:key="id">
|
||
<exercise-card exercise="{{item}}" compact catch:tap="onExercise" />
|
||
</view>
|
||
</scroll-view>
|
||
<view wx:else class="empty">暂无数据</view>
|
||
</view>
|
||
|
||
<!-- 训练组合 横向 -->
|
||
<view class="section" wx:if="{{collections.length}}">
|
||
<section-header eyebrow="PROGRAMS" title="训练组合" subtitle="一键开启主题训练" />
|
||
<scroll-view scroll-x class="chip-scroll">
|
||
<view
|
||
wx:for="{{collections}}"
|
||
wx:key="slug"
|
||
class="prog"
|
||
style="background: {{item.color}}22; border-color: {{item.color}}55;"
|
||
data-slug="{{item.slug}}"
|
||
bindtap="onCollection">
|
||
<fc-icon name="{{item.icon}}" size="36" color="{{item.color}}" />
|
||
<text class="prog__name" style="color: {{item.color}};">{{item.name}}</text>
|
||
</view>
|
||
</scroll-view>
|
||
</view>
|
||
|
||
<!-- 按部位浏览 -->
|
||
<view class="section">
|
||
<section-header eyebrow="BY BODY PART" title="按部位浏览" subtitle="选择你的目标区域" />
|
||
<view class="bp-grid">
|
||
<view
|
||
wx:for="{{bodyParts}}"
|
||
wx:key="value"
|
||
class="bp"
|
||
data-value="{{item.value}}"
|
||
data-label="{{item.label}}"
|
||
bindtap="onScanBodyPart">
|
||
<text class="bp__label">{{item.label}}</text>
|
||
<text class="bp__count">{{item.count}} 个动作</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 热门器械 -->
|
||
<view class="section" wx:if="{{equipment.length}}">
|
||
<section-header eyebrow="EQUIPMENT" title="热门器械" subtitle="按器械筛选动作" />
|
||
<scroll-view scroll-x class="chip-scroll">
|
||
<view
|
||
wx:for="{{equipment}}"
|
||
wx:key="value"
|
||
class="eq"
|
||
data-value="{{item.value}}"
|
||
data-label="{{item.label}}"
|
||
bindtap="onScanEquipment">
|
||
<text class="eq__name">{{item.label}}</text>
|
||
<text class="eq__count">{{item.count}}</text>
|
||
</view>
|
||
</scroll-view>
|
||
</view>
|
||
|
||
<view style="height: 160rpx;"></view>
|
||
<bottom-nav active="home" />
|
||
</view>
|