|
|
@@ -46,6 +46,9 @@
|
|
|
|
|
|
<!-- 登录态 — 直接内嵌,保持底签可见 -->
|
|
|
<view v-if="currentRole" class="logged-in-container">
|
|
|
+ <!-- ⓪ 新手成长礼包进度条(新用户引导,全部领取后自动隐藏) -->
|
|
|
+ <OnboardingProgressBar ref="onboardingProgress" />
|
|
|
+
|
|
|
<!-- ① 了解区 — 自测大卡(首屏,引导"从了解开始") -->
|
|
|
<view class="self-test-card" @click="goSelfTest">
|
|
|
<view class="self-test-head">
|
|
|
@@ -232,6 +235,12 @@
|
|
|
<!-- 底部占位 -->
|
|
|
|
|
|
<view class="bottom-spacer" style="height: 40rpx;"></view>
|
|
|
+
|
|
|
+ <!-- 首次登录引导浮层(3 步产品介绍,看过一次后不再弹) -->
|
|
|
+ <OnboardingGuide
|
|
|
+ :role="currentRole"
|
|
|
+ :show="showOnboardingGuide"
|
|
|
+ @close="closeOnboardingGuide" />
|
|
|
</view>
|
|
|
|
|
|
<!-- 未登录态 — 发现页/引流内容,直接内嵌,不跳转 -->
|
|
|
@@ -414,6 +423,8 @@ import ArticleBookshelf from '../../components/ArticleBookshelf.vue'
|
|
|
import FamilyChallengeCard from '../../components/FamilyChallengeCard.vue'
|
|
|
import DailyTaskCard from '../../components/daily-task-card.vue'
|
|
|
import ReportUploadCard from '../../components/report-upload-card.vue'
|
|
|
+import OnboardingProgressBar from '../../components/OnboardingProgressBar.vue'
|
|
|
+import OnboardingGuide from '../../components/OnboardingGuide.vue'
|
|
|
import { acceptParentInvite, getActivityList, getFeaturedArticles, getEnergySandbox, getEnergyOverview, getFamilyMemberList, getChallengeList, switchToFamilyMember, getMyMembership, updateChallengeProgress, respondChallenge, getTodayTasks, completeTask as completeTaskApi, getTodayParentTasks, completeParentTask as completeParentTaskApi, getTaskHistory, getNotices, getNotificationList, getSurveyStatus, getSelfCheckStatus, getReferralCode, extractReferralCode } from '../../utils/api.js'
|
|
|
import nav from '../../utils/nav.js'
|
|
|
import config from '@/config.js'
|
|
|
@@ -429,6 +440,8 @@ export default {
|
|
|
FamilyChallengeCard,
|
|
|
DailyTaskCard,
|
|
|
ReportUploadCard,
|
|
|
+ OnboardingProgressBar,
|
|
|
+ OnboardingGuide,
|
|
|
|
|
|
},
|
|
|
data() {
|
|
|
@@ -451,6 +464,7 @@ export default {
|
|
|
pendingSurveys: [],
|
|
|
selfCheckScore: null,
|
|
|
selfCheckLoading: false,
|
|
|
+ showOnboardingGuide: false,
|
|
|
|
|
|
dimensionActivities: [],
|
|
|
indexArticles: [],
|
|
|
@@ -591,7 +605,18 @@ membershipDays: 0,
|
|
|
color: 'orange'
|
|
|
}
|
|
|
}
|
|
|
- // 2) 待填调研 — 定期调研是用户的实际行动邀请
|
|
|
+ // 2) 家庭成员为空 — 新用户关键动作,引导添加孩子/家人
|
|
|
+ if (this.membersChecked && this.familyMembersVisible && this.familyMembersVisible.length <= 1) {
|
|
|
+ return {
|
|
|
+ type: 'add-member',
|
|
|
+ icon: '👨👩👧',
|
|
|
+ title: '添加家庭成员',
|
|
|
+ sub: '邀请孩子和家人,开启全家成长管理',
|
|
|
+ btn: '去添加',
|
|
|
+ color: 'blue'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 3) 待填调研 — 定期调研是用户的实际行动邀请
|
|
|
if (this.pendingSurveys && this.pendingSurveys.length > 0) {
|
|
|
return {
|
|
|
type: 'survey',
|
|
|
@@ -602,7 +627,7 @@ membershipDays: 0,
|
|
|
color: 'blue'
|
|
|
}
|
|
|
}
|
|
|
- // 3) 待办任务 — 用户已完成自检后的执行路径
|
|
|
+ // 4) 待办任务 — 用户已完成自检后的执行路径
|
|
|
if (this.pendingTasks && this.pendingTasks.length > 0) {
|
|
|
return {
|
|
|
type: 'task',
|
|
|
@@ -613,7 +638,7 @@ membershipDays: 0,
|
|
|
color: 'green'
|
|
|
}
|
|
|
}
|
|
|
- // 4) 未读通知 — 私域触达优先
|
|
|
+ // 5) 未读通知 — 私域触达优先
|
|
|
var unreadCount = 0
|
|
|
if (this.notices && this.notices.length) {
|
|
|
for (var i = 0; i < this.notices.length; i++) {
|
|
|
@@ -630,7 +655,7 @@ membershipDays: 0,
|
|
|
color: 'purple'
|
|
|
}
|
|
|
}
|
|
|
- // 5) 默认引导 — 已完成所有任务,指向增值内容
|
|
|
+ // 6) 默认引导 — 已完成所有任务,指向增值内容
|
|
|
return {
|
|
|
type: 'default',
|
|
|
icon: '✨',
|
|
|
@@ -1106,6 +1131,9 @@ membershipDays: 0,
|
|
|
})
|
|
|
}
|
|
|
break
|
|
|
+ case 'add-member':
|
|
|
+ this.navTo('/pages/profile-extra/family-members')
|
|
|
+ break
|
|
|
case 'task':
|
|
|
this.navTo('/pages/tasks/tasks')
|
|
|
break
|
|
|
@@ -1154,6 +1182,7 @@ membershipDays: 0,
|
|
|
this.checkMemberStatus()
|
|
|
}
|
|
|
this._watchPageReady()
|
|
|
+ this._maybeShowOnboardingGuide()
|
|
|
},
|
|
|
_refreshOnShow() {
|
|
|
// 切 Tab 返回:刷新家庭成员 + 沙盘 + 会员状态(loadFamilyData 内含任务/挑战刷新)
|
|
|
@@ -1175,6 +1204,20 @@ membershipDays: 0,
|
|
|
if (newVal) that._tryHideSplash()
|
|
|
})
|
|
|
},
|
|
|
+ // 首次登录引导浮层:仅当从未看过(无 _onboardingDone 标记)时展示一次
|
|
|
+ _maybeShowOnboardingGuide() {
|
|
|
+ if (this.showOnboardingGuide) return
|
|
|
+ if (uni.getStorageSync('_onboardingDone')) return
|
|
|
+ // 延迟到 splash 蒙板关闭后再弹,避免层级冲突
|
|
|
+ var self = this
|
|
|
+ setTimeout(function() {
|
|
|
+ if (!self.isLoggedIn()) return
|
|
|
+ self.showOnboardingGuide = true
|
|
|
+ }, 600)
|
|
|
+ },
|
|
|
+ closeOnboardingGuide() {
|
|
|
+ this.showOnboardingGuide = false
|
|
|
+ },
|
|
|
isLoggedIn() {
|
|
|
return !!uni.getStorageSync('token')
|
|
|
},
|