|
@@ -1,13 +1,18 @@
|
|
|
<template>
|
|
<template>
|
|
|
<view class="page" :style="{ '--font-scale': fontScale }">
|
|
<view class="page" :style="{ '--font-scale': fontScale }">
|
|
|
|
|
|
|
|
- <view class="member-bar" v-if="memberList.length > 1">
|
|
|
|
|
- <view class="member-tab" :class="{'active': currentMemberId === (item.id || item.userId)}"
|
|
|
|
|
- v-for="(item, mi) in memberList" :key="mi"
|
|
|
|
|
- @tap="switchMember(item)">
|
|
|
|
|
- <text class="member-name">{{ item.nickname || item.roleLabel || '全部' }}</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- </view>
|
|
|
|
|
|
|
+ <!-- 成员切换条(统一组件 MemberSelector:同一用户只出现一次,主键为 canonical memberId) -->
|
|
|
|
|
+ <MemberSelector
|
|
|
|
|
+ variant="minimal"
|
|
|
|
|
+ v-if="memberList.length > 0"
|
|
|
|
|
+ :members="memberList"
|
|
|
|
|
+ :selected-member-id="currentMemberId"
|
|
|
|
|
+ :show-overview="true"
|
|
|
|
|
+ overview-label="全部"
|
|
|
|
|
+ :overview-active="!currentMemberId || currentMemberId < 0"
|
|
|
|
|
+ :show-self="false"
|
|
|
|
|
+ @overview="selectAllMembers"
|
|
|
|
|
+ @select="onMemberSelect" />
|
|
|
|
|
|
|
|
<view class="search-bar">
|
|
<view class="search-bar">
|
|
|
<view class="search-input-wrap">
|
|
<view class="search-input-wrap">
|
|
@@ -134,13 +139,15 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
<script>
|
|
|
|
|
+import MemberSelector from '@/components/MemberSelector.vue'
|
|
|
|
|
+import { memberIdOf } from '@/utils/memberNormalize.js'
|
|
|
import { getHealthFoods, editHealthReport, queryFoodKnowledge, getCautionFamilyMembers, getFoodCautionTrend } from '../../utils/api.js'
|
|
import { getHealthFoods, editHealthReport, queryFoodKnowledge, getCautionFamilyMembers, getFoodCautionTrend } from '../../utils/api.js'
|
|
|
import MiniTrend from '../growth/mini-trend.vue'
|
|
import MiniTrend from '../growth/mini-trend.vue'
|
|
|
import fontScaleMixin from '@/mixins/font-scale.js'
|
|
import fontScaleMixin from '@/mixins/font-scale.js'
|
|
|
|
|
|
|
|
export default {
|
|
export default {
|
|
|
mixins: [fontScaleMixin],
|
|
mixins: [fontScaleMixin],
|
|
|
- components: { MiniTrend },
|
|
|
|
|
|
|
+ components: { MiniTrend, MemberSelector },
|
|
|
data() {
|
|
data() {
|
|
|
return {
|
|
return {
|
|
|
reportId: null,
|
|
reportId: null,
|
|
@@ -204,16 +211,21 @@ export default {
|
|
|
},
|
|
},
|
|
|
methods: {
|
|
methods: {
|
|
|
goBack: function() { uni.navigateBack() },
|
|
goBack: function() { uni.navigateBack() },
|
|
|
- switchMember: function(item) {
|
|
|
|
|
- this.currentMemberId = item.id || item.userId
|
|
|
|
|
|
|
+ // 统一组件选中回调:member 已由 memberNormalize 规范化,携带 canonical memberId
|
|
|
|
|
+ onMemberSelect: function(member) {
|
|
|
|
|
+ this.currentMemberId = memberIdOf(member)
|
|
|
|
|
+ this.loadData()
|
|
|
|
|
+ },
|
|
|
|
|
+ // 「全部」聚合项:不传 memberId,后端按全家庭返回
|
|
|
|
|
+ selectAllMembers: function() {
|
|
|
|
|
+ this.currentMemberId = -1
|
|
|
this.loadData()
|
|
this.loadData()
|
|
|
},
|
|
},
|
|
|
async loadMemberList() {
|
|
async loadMemberList() {
|
|
|
try {
|
|
try {
|
|
|
var res = await getCautionFamilyMembers()
|
|
var res = await getCautionFamilyMembers()
|
|
|
if (res && res.code === 200 && res.data && res.data.length > 0) {
|
|
if (res && res.code === 200 && res.data && res.data.length > 0) {
|
|
|
- var allItem = { id: -1, userId: -1, nickname: '全部', roleLabel: '全部' }
|
|
|
|
|
- this.memberList = [allItem].concat(res.data)
|
|
|
|
|
|
|
+ this.memberList = res.data
|
|
|
if (!this.currentMemberId) this.currentMemberId = -1
|
|
if (!this.currentMemberId) this.currentMemberId = -1
|
|
|
}
|
|
}
|
|
|
} catch(e) {}
|
|
} catch(e) {}
|
|
@@ -384,29 +396,6 @@ methods: {
|
|
|
<style scoped lang="scss">
|
|
<style scoped lang="scss">
|
|
|
.page { min-height: 100vh; background: $uni-primary-pale; }
|
|
.page { min-height: 100vh; background: $uni-primary-pale; }
|
|
|
|
|
|
|
|
-/* 成员切换栏 */
|
|
|
|
|
-.member-bar {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- overflow-x: auto;
|
|
|
|
|
- padding: 16rpx 30rpx 8rpx;
|
|
|
|
|
- background: $app-surface;
|
|
|
|
|
- border-bottom: 1rpx solid $facade-fill;
|
|
|
|
|
- gap: 16rpx;
|
|
|
|
|
- -webkit-overflow-scrolling: touch;
|
|
|
|
|
-}
|
|
|
|
|
-.member-tab {
|
|
|
|
|
- flex-shrink: 0;
|
|
|
|
|
- padding: 8rpx 20rpx;
|
|
|
|
|
- border-radius: 20rpx;
|
|
|
|
|
- background: $facade-fill-2;
|
|
|
|
|
- color: $facade-text-body;
|
|
|
|
|
- font-size: calc(26rpx * var(--font-scale, 1));
|
|
|
|
|
- font-weight: 500;
|
|
|
|
|
-}
|
|
|
|
|
-.member-tab.active {
|
|
|
|
|
- background: linear-gradient(135deg, $dim-body, $dim-body-light);
|
|
|
|
|
- color: $app-surface;
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
/* 搜索框 */
|
|
/* 搜索框 */
|
|
|
.search-bar { padding: 16rpx 30rpx 8rpx; background: $app-surface; }
|
|
.search-bar { padding: 16rpx 30rpx 8rpx; background: $app-surface; }
|