|
|
@@ -74,38 +74,6 @@
|
|
|
</view>
|
|
|
</view>
|
|
|
|
|
|
- <!-- ⓪.c 五维能量状态带 — 健康指数 + 五行状态行(线性序 身→智→富→行→心,设计稿 §3) -->
|
|
|
- <view class="dim-band" :class="{ 'dim-band--locked': sandboxLocked }">
|
|
|
- <view class="dim-band-head">
|
|
|
- <text class="dim-band-kicker">浠艾福能量沙盘</text>
|
|
|
- <text class="dim-band-index">
|
|
|
- <text class="dim-band-index-num">{{ dimBandHealthIndex }}</text>
|
|
|
- <text class="dim-band-index-label">健康指数</text>
|
|
|
- </text>
|
|
|
- </view>
|
|
|
- <view v-if="!sandboxLocked && dimBandRows.length > 0" class="dim-band-rows">
|
|
|
- <view
|
|
|
- v-for="row in dimBandRows"
|
|
|
- :key="row._key"
|
|
|
- class="dim-row"
|
|
|
- :class="'dim-row--' + row.code">
|
|
|
- <image class="dim-row-icon" :src="row.icon" mode="aspectFit" />
|
|
|
- <view class="dim-row-main">
|
|
|
- <view class="dim-row-line">
|
|
|
- <text class="dim-row-name">{{ row.name }}</text>
|
|
|
- <text v-if="row.value !== null" class="dim-row-value">{{ row.value }}</text>
|
|
|
- </view>
|
|
|
- <text class="dim-row-detail">{{ row.detail }}</text>
|
|
|
- </view>
|
|
|
- <text class="dim-row-chip" :class="'chip-' + row.statusCss">{{ row.statusText }}</text>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- <view v-else class="dim-band-empty" @click="goSelfTest">
|
|
|
- <text class="dim-band-empty-title">{{ sandboxLocked ? '尚未完成健康自检' : '正在获取能量数据…' }}</text>
|
|
|
- <text class="dim-band-empty-sub">{{ sandboxLocked ? '完成 4 步问卷,解锁全家能量报告' : '请稍候刷新' }}</text>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
-
|
|
|
<!-- ① 了解区 — 自测大卡(首屏,引导"从了解开始") -->
|
|
|
<view class="self-test-card" @click="goSelfTest">
|
|
|
<view class="self-test-head">
|
|
|
@@ -197,12 +165,15 @@
|
|
|
|
|
|
<!-- ④ 内容区 — 家庭动态 -->
|
|
|
|
|
|
- <view v-if="hasPendingTasks" class="section">
|
|
|
+ <view class="section">
|
|
|
<view class="section-header">
|
|
|
- <text class="section-title">📝 我的任务</text>
|
|
|
- <text class="section-more" @click="navTo('/pages/tasks/tasks')">全部 ›</text>
|
|
|
+ <text class="section-title">📝 我的任务({{ pendingTasks.length }})</text>
|
|
|
+ <view class="section-header-extra">
|
|
|
+ <text class="task-family-count" @click="navTo('/pages/tasks/tasks')">家庭任务({{ familyTodoCount }})</text>
|
|
|
+ <text class="section-more" @click="navTo('/pages/tasks/tasks')">全部 ›</text>
|
|
|
+ </view>
|
|
|
</view>
|
|
|
- <view class="task-quick-list">
|
|
|
+ <view v-if="hasPendingTasks" class="task-quick-list">
|
|
|
<view
|
|
|
v-for="task in pendingTasks"
|
|
|
:key="task.id"
|
|
|
@@ -800,38 +771,6 @@ title: '添加家庭成员',
|
|
|
}
|
|
|
return n
|
|
|
},
|
|
|
- // ===== ⓪.c 五维能量状态带(设计稿 §3,线性序 身→智→富→行→心)=====
|
|
|
- dimBandHealthIndex: function() {
|
|
|
- if (this.sandboxLocked) return '--'
|
|
|
- var v = this.totalHealthIndex || 0
|
|
|
- return v > 0 ? String(v) : '--'
|
|
|
- },
|
|
|
- dimBandRows: function() {
|
|
|
- if (this.sandboxLocked) return []
|
|
|
- // 线性顺序(与沙盘星图环形序不同,B1 明确 身→智→富→行→心)
|
|
|
- var order = ['body', 'wisdom', 'wealth', 'action', 'mind']
|
|
|
- var scores = this.familySandboxScores || {}
|
|
|
- var members = this.familySandboxMembers || []
|
|
|
- var self = this
|
|
|
- var rows = []
|
|
|
- for (var i = 0; i < order.length; i++) {
|
|
|
- var code = order[i]
|
|
|
- var meta = self._dimMeta(code)
|
|
|
- var val = scores[code]
|
|
|
- var hasVal = (typeof val === 'number' && val > 0)
|
|
|
- rows.push({
|
|
|
- _key: 'db-' + code,
|
|
|
- code: code,
|
|
|
- name: meta.name,
|
|
|
- icon: meta.icon,
|
|
|
- value: hasVal ? val : null,
|
|
|
- detail: self._dimDetail(code, val, members),
|
|
|
- statusCss: hasVal ? self._dimStatusCss(val) : 'muted',
|
|
|
- statusText: hasVal ? self._dimStatusText(val) : '未记录'
|
|
|
- })
|
|
|
- }
|
|
|
- return rows
|
|
|
- },
|
|
|
// ===== 首页动态提醒列表(含具体值)=====
|
|
|
// 顺序:今日能量/积分/CF 变更(带数值)→ 家庭动态(通知/公告/任务完成)
|
|
|
feedItems: function() {
|
|
|
@@ -1857,46 +1796,6 @@ title: '添加家庭成员',
|
|
|
goNotifications: function() {
|
|
|
uni.navigateTo({ url: '/pages/teacher/messages' })
|
|
|
},
|
|
|
- // ===== ⓪.c 五维能量状态带辅助方法 =====
|
|
|
- // 维度元信息(图标为静态 SVG 资源;小程序不支持模板内联 svg)
|
|
|
- _dimMeta: function(code) {
|
|
|
- var map = {
|
|
|
- body: { name: '身', icon: '/static/icons/dim-body.svg' },
|
|
|
- wisdom: { name: '智', icon: '/static/icons/dim-wisdom.svg' },
|
|
|
- wealth: { name: '富', icon: '/static/icons/dim-wealth.svg' },
|
|
|
- action: { name: '行', icon: '/static/icons/dim-action.svg' },
|
|
|
- mind: { name: '心', icon: '/static/icons/dim-mind.svg' }
|
|
|
- }
|
|
|
- return map[code] || { name: '', icon: '' }
|
|
|
- },
|
|
|
- // 详情文案:优先取该维度贡献最高的成员昵称,落到一句可读状态
|
|
|
- _dimDetail: function(code, val, members) {
|
|
|
- var list = members || []
|
|
|
- var pick = null
|
|
|
- for (var i = 0; i < list.length; i++) {
|
|
|
- var m = list[i] || {}
|
|
|
- var v = m[code + 'Score']
|
|
|
- if (typeof v === 'number' && v > 0) {
|
|
|
- if (!pick || v > pick.v) pick = { v: v, name: m.nickname || m.name || '成员' }
|
|
|
- }
|
|
|
- }
|
|
|
- if (!pick) return '暂无数据'
|
|
|
- var level = this._dimStatusText(val)
|
|
|
- return pick.name + ' · ' + level
|
|
|
- },
|
|
|
- // 状态标签:平稳 / 略偏 / 需关注(阈值与沙盘读数口径一致)
|
|
|
- _dimStatusText: function(val) {
|
|
|
- if (typeof val !== 'number' || val <= 0) return '未记录'
|
|
|
- if (val >= 80) return '平稳'
|
|
|
- if (val >= 60) return '略偏'
|
|
|
- return '需关注'
|
|
|
- },
|
|
|
- _dimStatusCss: function(val) {
|
|
|
- if (typeof val !== 'number' || val <= 0) return 'muted'
|
|
|
- if (val >= 80) return 'ok'
|
|
|
- if (val >= 60) return 'warn'
|
|
|
- return 'danger'
|
|
|
- },
|
|
|
// ===== Next Best Action 引导条点击 =====
|
|
|
onGuideTap: function(action) {
|
|
|
if (!action) return
|
|
|
@@ -2690,6 +2589,22 @@ $c-warm-tint: #FFF3E7;
|
|
|
font-size: calc(24rpx * var(--font-scale, 1));
|
|
|
color: $brand-primary;
|
|
|
}
|
|
|
+/* 区块标题右侧计数徽标(家庭任务数) */
|
|
|
+.section-header-extra {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+ align-items: center;
|
|
|
+}
|
|
|
+.task-family-count {
|
|
|
+ margin-right: 16rpx;
|
|
|
+ padding: 4rpx 16rpx;
|
|
|
+ border-radius: $radius-full;
|
|
|
+ background: rgba($brand-primary, 0.08);
|
|
|
+ color: $brand-primary;
|
|
|
+ font-size: calc(22rpx * var(--font-scale, 1));
|
|
|
+ font-weight: 600;
|
|
|
+ line-height: 1.5;
|
|
|
+}
|
|
|
.empty-state {
|
|
|
display: flex;
|
|
|
justify-content: center;
|
|
|
@@ -3090,102 +3005,6 @@ $c-warm-tint: #FFF3E7;
|
|
|
font-weight: 600;
|
|
|
}
|
|
|
|
|
|
-/* ===== ⓪.c 五维能量状态带(设计稿 §3,线性序 身→智→富→行→心) ===== */
|
|
|
-.dim-band {
|
|
|
- margin: 0 $uni-space-lg 16rpx;
|
|
|
- background: $app-surface;
|
|
|
- border-radius: $radius-lg;
|
|
|
- padding: 24rpx 28rpx;
|
|
|
- border: 1rpx solid rgba($brand-primary, 0.1);
|
|
|
- box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.03);
|
|
|
-}
|
|
|
-.dim-band--locked { opacity: 0.9; }
|
|
|
-.dim-band-head {
|
|
|
- display: flex;
|
|
|
- flex-direction: row;
|
|
|
- align-items: center;
|
|
|
- justify-content: space-between;
|
|
|
- margin-bottom: 20rpx;
|
|
|
-}
|
|
|
-.dim-band-kicker {
|
|
|
- font-size: calc(26rpx * var(--font-scale, 1));
|
|
|
- font-weight: 600;
|
|
|
- color: $brand-primary-deep;
|
|
|
-}
|
|
|
-.dim-band-index { display: flex; flex-direction: row; align-items: baseline; }
|
|
|
-.dim-band-index-num {
|
|
|
- font-size: calc(48rpx * var(--font-scale, 1));
|
|
|
- font-weight: bold;
|
|
|
- color: $c-brand-ink;
|
|
|
- margin-right: 8rpx;
|
|
|
-}
|
|
|
-.dim-band-index-label {
|
|
|
- font-size: calc(22rpx * var(--font-scale, 1));
|
|
|
- color: $ink-subtle;
|
|
|
-}
|
|
|
-.dim-band-rows { display: flex; flex-direction: column; }
|
|
|
-.dim-row {
|
|
|
- display: flex;
|
|
|
- flex-direction: row;
|
|
|
- align-items: center;
|
|
|
- min-height: 88rpx;
|
|
|
- padding: 12rpx 0;
|
|
|
-}
|
|
|
-.dim-row-icon {
|
|
|
- width: 44rpx;
|
|
|
- height: 44rpx;
|
|
|
- margin-right: 16rpx;
|
|
|
- flex-shrink: 0;
|
|
|
-}
|
|
|
-.dim-row-main { flex: 1; min-width: 0; }
|
|
|
-.dim-row-line { display: flex; flex-direction: row; align-items: baseline; }
|
|
|
-.dim-row-name {
|
|
|
- font-size: calc(28rpx * var(--font-scale, 1));
|
|
|
- font-weight: 600;
|
|
|
- color: $ink-main;
|
|
|
- margin-right: 12rpx;
|
|
|
-}
|
|
|
-.dim-row-value {
|
|
|
- font-size: calc(28rpx * var(--font-scale, 1));
|
|
|
- font-weight: bold;
|
|
|
- color: $c-brand-ink;
|
|
|
-}
|
|
|
-.dim-row-detail {
|
|
|
- display: block;
|
|
|
- font-size: calc(22rpx * var(--font-scale, 1));
|
|
|
- color: $ink-subtle;
|
|
|
- margin-top: 4rpx;
|
|
|
-}
|
|
|
-.dim-row-chip {
|
|
|
- flex-shrink: 0;
|
|
|
- min-width: 88rpx;
|
|
|
- text-align: center;
|
|
|
- padding: 8rpx 16rpx;
|
|
|
- border-radius: $radius-full;
|
|
|
- font-size: calc(22rpx * var(--font-scale, 1));
|
|
|
- font-weight: 600;
|
|
|
-}
|
|
|
-.chip-ok { background: $status-ok-tint; color: $status-ok-bg; }
|
|
|
-.chip-warn { background: $status-warn-tint; color: $status-warn-bg; }
|
|
|
-.chip-danger { background: $status-danger-tint; color: $status-danger-bg; }
|
|
|
-.chip-muted { background: $status-neutral-tint; color: $status-neutral-bg; }
|
|
|
-.dim-band-empty {
|
|
|
- padding: 32rpx 0;
|
|
|
- text-align: center;
|
|
|
-}
|
|
|
-.dim-band-empty-title {
|
|
|
- display: block;
|
|
|
- font-size: calc(28rpx * var(--font-scale, 1));
|
|
|
- font-weight: 600;
|
|
|
- color: $ink-main;
|
|
|
-}
|
|
|
-.dim-band-empty-sub {
|
|
|
- display: block;
|
|
|
- font-size: calc(22rpx * var(--font-scale, 1));
|
|
|
- color: $ink-subtle;
|
|
|
- margin-top: 8rpx;
|
|
|
-}
|
|
|
-
|
|
|
/* ===== 按钮八态(设计稿 §4:默认/悬停/焦点/按下/加载中/出错/成功白字;禁用=暖灰底+深字) ===== */
|
|
|
.btn {
|
|
|
min-height: 88rpx;
|
|
|
@@ -3208,9 +3027,9 @@ $c-warm-tint: #FFF3E7;
|
|
|
.btn--disabled { background: $btn-disabled-bg; color: $btn-disabled-ink; opacity: 1; }
|
|
|
/* 触控目标 ≥44px(88rpx 基准),禁用态不降透明度 */
|
|
|
.btn--disabled, .btn--disabled:active { opacity: 1; }
|
|
|
-/* 降低动效偏好:按钮/状态带/问候条过渡全局降级 */
|
|
|
+/* 降低动效偏好:按钮/问候条过渡全局降级 */
|
|
|
@media (prefers-reduced-motion: reduce) {
|
|
|
- .btn, .dim-row, .greet-bar { transition-duration: 0.01ms !important; }
|
|
|
+ .btn, .greet-bar { transition-duration: 0.01ms !important; }
|
|
|
}
|
|
|
|
|
|
/* ===== ① 了解区 — 自测大卡(引导"从了解开始") ===== */
|