Files
wx_pbzc/pages/index/index.wxml
T

226 lines
7.9 KiB
Plaintext
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.
<view class="container page-enter" style="{{themeStyle}}">
<!-- 顶部问候:头像 + "昵称,准备好了吗?" -->
<view class="greeting-row">
<!-- 圆形头像:无头像时回退人形图标占位 -->
<view class="greeting-avatar {{avatarUrl ? 'has-avatar' : ''}}">
<image
class="greeting-avatar-img"
src="{{avatarUrl || icons.peopleFill}}"
mode="{{avatarUrl ? 'aspectFill' : 'aspectFit'}}"
></image>
</view>
<view class="greeting-main">
<text class="greeting-title">{{nickName || '运动达人'}}{{todayDone ? '太棒了!' : '准备好了吗?'}}</text>
<text class="greeting-sub">{{todayDone ? '继续保持这个势头' : '今天的平板支撑等着你'}}</text>
</view>
</view>
<!-- 连续打卡卡片:火焰连胜 + 分段进度 -->
<ui-card variant="gradient in" index="0" class="{{justCompleted ? 'just-completed' : ''}}">
<view class="header-card">
<!-- 上区:连胜视觉重心 + 计划徽章 -->
<view class="streak-row">
<view class="streak-section">
<view class="streak-icon-wrap">
<view class="streak-halo"></view>
<image class="streak-icon" src="{{icons.hotWhite}}" mode="aspectFit"></image>
</view>
<view class="streak-text">
<text class="streak-num">{{streakCount}}</text>
<text class="streak-label">连续打卡</text>
</view>
</view>
<view class="plan-badge">
<image class="plan-badge-icon" src="{{icons.formWhite}}" mode="aspectFit"></image>
<text class="plan-badge-text">{{planName}}</text>
</view>
</view>
<!-- 下区:分段格子(<=10天)或里程碑连续条(>10天) -->
<view class="segment-progress">
<view class="segment-track" wx:if="{{useSegments}}">
<view
wx:for="{{planDays}}"
wx:key="*this"
class="segment-cell {{index < planDay - 1 ? 'done' : ''}} {{index === planDay - 1 ? 'current' : ''}}"
></view>
</view>
<view class="milestone-track" wx:else>
<view class="milestone-bar">
<view class="milestone-fill" style="width: {{planProgress}}%;"></view>
<view class="milestone-node" style="left: 0%;"></view>
<view class="milestone-node" style="left: 25%;"></view>
<view class="milestone-node" style="left: 50%;"></view>
<view class="milestone-node" style="left: 75%;"></view>
<view class="milestone-node" style="left: 100%;"></view>
</view>
</view>
<text class="progress-label">第 {{planDay}} / {{planTotal}} 天</text>
</view>
</view>
</ui-card>
<!-- 今日目标卡片 -->
<ui-card variant="in" index="1">
<view class="target-section">
<view class="target-header">
<image class="section-icon" src="{{icons.targetFill}}" mode="aspectFit"></image>
<text class="section-title">今日目标</text>
</view>
<view class="target-display">
<view class="target-ring">
<text class="target-time" style="font-size: {{targetTimeFontSize}}rpx;">{{todayTargetText}}</text>
</view>
</view>
<view class="today-status">
<block wx:if="{{todayDone}}">
<view class="done-badge">
<image class="done-icon" src="{{icons.successFill}}" mode="aspectFit"></image>
<text class="done-text">今日已完成 {{todayDuration}} 秒</text>
</view>
</block>
<block wx:else>
<image class="pending-icon" src="{{icons.time}}" mode="aspectFit"></image>
<text class="pending-text">还未开始训练</text>
</block>
</view>
</view>
</ui-card>
<!-- 操作按钮区 -->
<view class="action-buttons">
<ui-btn
variant="primary"
size="xl"
block
text="{{todayDone ? '再次训练' : '开始训练'}}"
icon-src="{{icons.playWhite}}"
bindtap="onStartTrain"
custom-style="border-radius:16rpx;"
></ui-btn>
<view class="action-row">
<ui-btn
class="action-cell"
variant="ghost"
size="xl"
block
text="自由训练"
icon-src="{{icons.timeFill}}"
bindtap="onFreeTrain"
custom-style="border-radius:16rpx;"
></ui-btn>
<ui-btn
class="action-cell"
variant="ghost"
size="xl"
block
text="循环训练"
icon-src="{{icons.repeatFill}}"
bindtap="onCircuitTrain"
custom-style="border-radius:16rpx;"
></ui-btn>
</view>
</view>
<!-- 时间选择弹窗 -->
<ui-modal
visible="{{showPicker}}"
position="bottom"
bind:close="onClosePicker"
>
<text class="picker-title">选择训练时长</text>
<view class="preset-grid">
<view
class="preset-item {{customDuration === item ? 'selected' : ''}}"
wx:for="{{presets}}"
wx:key="*this"
data-value="{{item}}"
bindtap="onSelectPreset"
>
<text class="preset-num">{{item}}</text>
<text class="preset-unit">秒</text>
</view>
</view>
<view class="custom-input-row">
<text class="custom-label">自定义:</text>
<input
class="custom-input"
type="number"
placeholder="输入秒数"
value="{{customInput}}"
focus="{{pickerInputFocus}}"
bindinput="onCustomInput"
bindfocus="onPickerInputFocus"
/>
<text class="custom-label">秒</text>
</view>
<ui-btn
variant="primary"
size="lg"
block
text="开始自由训练"
bindtap="onConfirmFree"
custom-style="border-radius:16rpx;"
></ui-btn>
<text class="picker-cancel" bindtap="onClosePicker">取消</text>
</ui-modal>
<!-- 循环训练配置弹窗:每组时长 / 组数 / 休息 / 每周次数,保存后持久化 -->
<ui-modal
visible="{{showCircuitPicker}}"
position="bottom"
bind:close="onCloseCircuitPicker"
>
<text class="picker-title">循环训练设置</text>
<text class="picker-sub">自定义每组时长、组数与组间休息</text>
<view class="circuit-row">
<text class="circuit-row-label">每组时长</text>
<view class="stepper">
<view class="stepper-btn" data-field="hold" data-delta="-10" bindtap="onCircuitStep"></view>
<text class="stepper-val">{{cHold}}秒</text>
<view class="stepper-btn" data-field="hold" data-delta="10" bindtap="onCircuitStep">+</view>
</view>
</view>
<view class="circuit-row">
<text class="circuit-row-label">组数</text>
<view class="stepper">
<view class="stepper-btn" data-field="sets" data-delta="-1" bindtap="onCircuitStep"></view>
<text class="stepper-val">{{cSets}}组</text>
<view class="stepper-btn" data-field="sets" data-delta="1" bindtap="onCircuitStep">+</view>
</view>
</view>
<view class="circuit-row">
<text class="circuit-row-label">组间休息</text>
<view class="stepper">
<view class="stepper-btn" data-field="rest" data-delta="-10" bindtap="onCircuitStep"></view>
<text class="stepper-val">{{cRest}}秒</text>
<view class="stepper-btn" data-field="rest" data-delta="10" bindtap="onCircuitStep">+</view>
</view>
</view>
<view class="circuit-row">
<text class="circuit-row-label">每周目标</text>
<view class="stepper">
<view class="stepper-btn" data-field="sessions" data-delta="-1" bindtap="onCircuitStep"></view>
<text class="stepper-val">{{cSessions}}次/周</text>
<view class="stepper-btn" data-field="sessions" data-delta="1" bindtap="onCircuitStep">+</view>
</view>
</view>
<ui-btn
variant="primary"
size="lg"
block
text="保存并开始"
bindtap="onConfirmCircuit"
custom-style="border-radius:16rpx;"
></ui-btn>
<text class="picker-cancel" bindtap="onCloseCircuitPicker">取消</text>
</ui-modal>
</view>