|
@@ -82,42 +82,6 @@
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
|
|
|
|
|
- <!-- 健康报告摘要(登录后可见) -->
|
|
|
|
|
- <view class="section" v-if="sectionVisible('health_report') && isLoggedIn">
|
|
|
|
|
- <view class="section-header">
|
|
|
|
|
- <text class="section-title">健康报告</text>
|
|
|
|
|
- <text class="section-more" @click="goToHealthReport">查看详情 ›</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- <view class="report-card" v-if="latestReport">
|
|
|
|
|
- <view class="report-type-tag">{{ reportTypeLabel }}</view>
|
|
|
|
|
- <view class="report-score-row">
|
|
|
|
|
- <view class="score-circle">
|
|
|
|
|
- <text class="score-value">{{ latestReport.overallScore || '--' }}</text>
|
|
|
|
|
- <text class="score-label">综合评分</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- <view class="report-meta">
|
|
|
|
|
- <view class="meta-item" v-if="latestReport.gutHealthScore">
|
|
|
|
|
- <text class="meta-label">肠道健康</text>
|
|
|
|
|
- <text class="meta-value">{{ latestReport.gutHealthScore }}</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- <view class="meta-item" v-if="latestReport.nutritionScore">
|
|
|
|
|
- <text class="meta-label">营养状况</text>
|
|
|
|
|
- <text class="meta-value">{{ latestReport.nutritionScore }}</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- <view class="meta-item" v-if="latestReport.gutAge">
|
|
|
|
|
- <text class="meta-label">肠道年龄</text>
|
|
|
|
|
- <text class="meta-value">{{ latestReport.gutAge }}</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- </view>
|
|
|
|
|
- </view>
|
|
|
|
|
- <text class="report-date">报告日期:{{ formatDate(latestReport.reportDate) }}</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- <view class="report-empty" v-else>
|
|
|
|
|
- <text class="empty-tip">暂无健康报告</text>
|
|
|
|
|
- <text class="empty-sub">规划师录入后将自动显示</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- </view>
|
|
|
|
|
-
|
|
|
|
|
<!-- ===== 精准营养(上传报告+产品+文章) ===== -->
|
|
<!-- ===== 精准营养(上传报告+产品+文章) ===== -->
|
|
|
<view class="section nutrition-section" v-if="isLoggedIn">
|
|
<view class="section nutrition-section" v-if="isLoggedIn">
|
|
|
<view class="section-header">
|
|
<view class="section-header">
|
|
@@ -199,34 +163,6 @@ import HealthCheckinCard from '../../components/HealthCheckinCard.vue'
|
|
|
import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
|
|
import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
|
|
|
|
|
|
|
|
import { getVisibleSections, getEnergyOverview, getChildren, getTodayTasksByCategory, getActivityList, getProductsByDomain, getFamilyEnergySandbox, getVisibleFamilyMembers, getDimensionOverview, getFeaturedArticles } from '../../utils/api.js'
|
|
import { getVisibleSections, getEnergyOverview, getChildren, getTodayTasksByCategory, getActivityList, getProductsByDomain, getFamilyEnergySandbox, getVisibleFamilyMembers, getDimensionOverview, getFeaturedArticles } from '../../utils/api.js'
|
|
|
-import config from '../../config.js'
|
|
|
|
|
-
|
|
|
|
|
-var BASE_URL = config.api('')
|
|
|
|
|
-
|
|
|
|
|
-const healthRequest = function(url, data) {
|
|
|
|
|
- var token = uni.getStorageSync('token')
|
|
|
|
|
- return new Promise(function(resolve, reject) {
|
|
|
|
|
- uni.request({
|
|
|
|
|
- url: BASE_URL + url,
|
|
|
|
|
- method: 'POST',
|
|
|
|
|
- data: data,
|
|
|
|
|
- header: {
|
|
|
|
|
- 'Content-Type': 'application/json',
|
|
|
|
|
- 'Authorization': token ? 'Bearer ' + token : ''
|
|
|
|
|
- },
|
|
|
|
|
- success: function(res) {
|
|
|
|
|
- if (res.data.code === 200) {
|
|
|
|
|
- resolve(res.data)
|
|
|
|
|
- } else {
|
|
|
|
|
- reject(res.data)
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
- fail: function(err) {
|
|
|
|
|
- reject(err)
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
- })
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
export default {
|
|
export default {
|
|
|
components: { TabTransition, PageBanner, LoginGuideCard, FamilyEnergyBar, DimensionTasks, DimensionActivities, DimensionProducts, DimensionProductList, DimensionArticles, FamilyRelationGraph, RadarChart, HealthDimensionsSection, HealthCheckinCard, AIFloatingAvatar },
|
|
components: { TabTransition, PageBanner, LoginGuideCard, FamilyEnergyBar, DimensionTasks, DimensionActivities, DimensionProducts, DimensionProductList, DimensionArticles, FamilyRelationGraph, RadarChart, HealthDimensionsSection, HealthCheckinCard, AIFloatingAvatar },
|
|
@@ -243,7 +179,7 @@ export default {
|
|
|
sandboxData: null,
|
|
sandboxData: null,
|
|
|
dualDimension: null,
|
|
dualDimension: null,
|
|
|
visibleSections: [],
|
|
visibleSections: [],
|
|
|
- latestReport: null,
|
|
|
|
|
|
|
+
|
|
|
dimensionTasks: [],
|
|
dimensionTasks: [],
|
|
|
dimensionActivities: [],
|
|
dimensionActivities: [],
|
|
|
dimensionProducts: [],
|
|
dimensionProducts: [],
|
|
@@ -261,10 +197,6 @@ export default {
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
computed: {
|
|
computed: {
|
|
|
- reportTypeLabel: function() {
|
|
|
|
|
- if (!this.latestReport) return ''
|
|
|
|
|
- return this.latestReport.reportType === 'gut_flora' ? '肠道检测报告' : '体检报告'
|
|
|
|
|
- },
|
|
|
|
|
energyMapForGraph: function() {
|
|
energyMapForGraph: function() {
|
|
|
var map = {}
|
|
var map = {}
|
|
|
if (this.sandboxData && this.sandboxData.members) {
|
|
if (this.sandboxData && this.sandboxData.members) {
|
|
@@ -380,7 +312,6 @@ export default {
|
|
|
},
|
|
},
|
|
|
loadDashboardData: function() {
|
|
loadDashboardData: function() {
|
|
|
if (!this.activeChildId) return
|
|
if (!this.activeChildId) return
|
|
|
- this.loadHealthReport()
|
|
|
|
|
this.loadEnergyData()
|
|
this.loadEnergyData()
|
|
|
this.loadDimensionTasks()
|
|
this.loadDimensionTasks()
|
|
|
this.loadDimensionActivities()
|
|
this.loadDimensionActivities()
|
|
@@ -416,16 +347,6 @@ export default {
|
|
|
console.log('获取沙盘数据失败', e)
|
|
console.log('获取沙盘数据失败', e)
|
|
|
})
|
|
})
|
|
|
},
|
|
},
|
|
|
- loadHealthReport: function() {
|
|
|
|
|
- var self = this
|
|
|
|
|
- healthRequest('/api/health/report/latest', { childId: this.activeChildId }).then(function(res) {
|
|
|
|
|
- if (res.data) {
|
|
|
|
|
- self.latestReport = res.data
|
|
|
|
|
- }
|
|
|
|
|
- }).catch(function(e) {
|
|
|
|
|
- console.log('获取健康报告失败', e)
|
|
|
|
|
- })
|
|
|
|
|
- },
|
|
|
|
|
loadEnergyData: function() {
|
|
loadEnergyData: function() {
|
|
|
var self = this
|
|
var self = this
|
|
|
getEnergyOverview(this.activeChildId).then(function(res) {
|
|
getEnergyOverview(this.activeChildId).then(function(res) {
|
|
@@ -571,14 +492,6 @@ export default {
|
|
|
}
|
|
}
|
|
|
if (item.page) uni.navigateTo({ url: item.page })
|
|
if (item.page) uni.navigateTo({ url: item.page })
|
|
|
},
|
|
},
|
|
|
- goToHealthReport: function() {
|
|
|
|
|
- var id = this.activeChildId || uni.getStorageSync('currentChildId')
|
|
|
|
|
- if (!id) {
|
|
|
|
|
- uni.showToast({ title: '请先选择成员', icon: 'none' })
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
- uni.navigateTo({ url: '/pages/body-detail/health-report?childId=' + id })
|
|
|
|
|
- },
|
|
|
|
|
goDimensionDetail: function(dimKey) {
|
|
goDimensionDetail: function(dimKey) {
|
|
|
uni.navigateTo({ url: '/pages/body/dimension-detail?dimension=' + dimKey + '&childId=' + this.activeChildId })
|
|
uni.navigateTo({ url: '/pages/body/dimension-detail?dimension=' + dimKey + '&childId=' + this.activeChildId })
|
|
|
},
|
|
},
|
|
@@ -602,18 +515,6 @@ export default {
|
|
|
var id = this.activeChildId || uni.getStorageSync('currentChildId') || ''
|
|
var id = this.activeChildId || uni.getStorageSync('currentChildId') || ''
|
|
|
uni.navigateTo({ url: '/pages/health/report-upload?childId=' + id + '&from=body' })
|
|
uni.navigateTo({ url: '/pages/health/report-upload?childId=' + id + '&from=body' })
|
|
|
},
|
|
},
|
|
|
- formatDate: function(dateStr) {
|
|
|
|
|
- if (!dateStr) return '--'
|
|
|
|
|
- try {
|
|
|
|
|
- var d = new Date(dateStr)
|
|
|
|
|
- var y = d.getFullYear()
|
|
|
|
|
- var m = ('' + (d.getMonth() + 1)).padStart(2, '0')
|
|
|
|
|
- var day = ('' + d.getDate()).padStart(2, '0')
|
|
|
|
|
- return y + '-' + m + '-' + day
|
|
|
|
|
- } catch (e) {
|
|
|
|
|
- return dateStr
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
_watchPageReady() {
|
|
_watchPageReady() {
|
|
|
var self = this
|
|
var self = this
|
|
|
var unwatch = this.$watch(function() {
|
|
var unwatch = this.$watch(function() {
|
|
@@ -706,95 +607,6 @@ export default {
|
|
|
border-radius: 20rpx;
|
|
border-radius: 20rpx;
|
|
|
margin-left: 12rpx;
|
|
margin-left: 12rpx;
|
|
|
}
|
|
}
|
|
|
-.section-more {
|
|
|
|
|
- font-size: 24rpx;
|
|
|
|
|
- color: #5B9BD5;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-/* ===== 健康报告 ===== */
|
|
|
|
|
-.report-card {
|
|
|
|
|
- background: #fff;
|
|
|
|
|
- border-radius: 20rpx;
|
|
|
|
|
- padding: 24rpx;
|
|
|
|
|
- box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.06);
|
|
|
|
|
-}
|
|
|
|
|
-.report-type-tag {
|
|
|
|
|
- display: inline-block;
|
|
|
|
|
- background: #E8F5E9;
|
|
|
|
|
- color: #2E7D32;
|
|
|
|
|
- font-size: 22rpx;
|
|
|
|
|
- padding: 4rpx 16rpx;
|
|
|
|
|
- border-radius: 20rpx;
|
|
|
|
|
- margin-bottom: 16rpx;
|
|
|
|
|
-}
|
|
|
|
|
-.report-score-row {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- flex-direction: row;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
-}
|
|
|
|
|
-.score-circle {
|
|
|
|
|
- width: 140rpx;
|
|
|
|
|
- height: 140rpx;
|
|
|
|
|
- border-radius: 70rpx;
|
|
|
|
|
- background: linear-gradient(135deg, #E3F2FD, #BBDEFB);
|
|
|
|
|
- display: flex;
|
|
|
|
|
- flex-direction: column;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
- justify-content: center;
|
|
|
|
|
- margin-right: 24rpx;
|
|
|
|
|
-}
|
|
|
|
|
-.score-value {
|
|
|
|
|
- font-size: 48rpx;
|
|
|
|
|
- font-weight: bold;
|
|
|
|
|
- color: #1565C0;
|
|
|
|
|
-}
|
|
|
|
|
-.score-label {
|
|
|
|
|
- font-size: 20rpx;
|
|
|
|
|
- color: #64B5F6;
|
|
|
|
|
-}
|
|
|
|
|
-.report-meta {
|
|
|
|
|
- flex: 1;
|
|
|
|
|
-}
|
|
|
|
|
-.meta-item {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- flex-direction: row;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
- margin-bottom: 12rpx;
|
|
|
|
|
-}
|
|
|
|
|
-.meta-label {
|
|
|
|
|
- font-size: 24rpx;
|
|
|
|
|
- color: #666;
|
|
|
|
|
- width: 140rpx;
|
|
|
|
|
-}
|
|
|
|
|
-.meta-value {
|
|
|
|
|
- font-size: 26rpx;
|
|
|
|
|
- color: #333;
|
|
|
|
|
- font-weight: 500;
|
|
|
|
|
-}
|
|
|
|
|
-.report-date {
|
|
|
|
|
- font-size: 22rpx;
|
|
|
|
|
- color: #bbb;
|
|
|
|
|
- margin-top: 16rpx;
|
|
|
|
|
-}
|
|
|
|
|
-.report-empty {
|
|
|
|
|
- background: #fff;
|
|
|
|
|
- border-radius: 20rpx;
|
|
|
|
|
- padding: 40rpx;
|
|
|
|
|
- text-align: center;
|
|
|
|
|
- box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.06);
|
|
|
|
|
-}
|
|
|
|
|
-.empty-tip {
|
|
|
|
|
- font-size: 28rpx;
|
|
|
|
|
- color: #999;
|
|
|
|
|
- display: block;
|
|
|
|
|
-}
|
|
|
|
|
-.empty-sub {
|
|
|
|
|
- font-size: 24rpx;
|
|
|
|
|
- color: #ccc;
|
|
|
|
|
- display: block;
|
|
|
|
|
- margin-top: 8rpx;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
/* ===== 快捷操作 ===== */
|
|
/* ===== 快捷操作 ===== */
|
|
|
.quick-actions {
|
|
.quick-actions {
|
|
|
display: flex;
|
|
display: flex;
|