|
@@ -1,48 +1,5 @@
|
|
|
<template>
|
|
<template>
|
|
|
<view>
|
|
<view>
|
|
|
- <!-- 冷启动 splash overlay — 覆盖首页直到数据加载完毕(tab 切回时不显示) -->
|
|
|
|
|
- <view class="splash-overlay" :class="{'fade-out': splashOverlayFading}" v-if="splashOverlay || splashOverlayFading">
|
|
|
|
|
- <view class="splash-overlay-bg">
|
|
|
|
|
- <view class="bg-circle bg-circle-1"></view>
|
|
|
|
|
- <view class="bg-circle bg-circle-2"></view>
|
|
|
|
|
- <view class="bg-circle bg-circle-3"></view>
|
|
|
|
|
- </view>
|
|
|
|
|
- <view class="splash-overlay-body">
|
|
|
|
|
- <view class="splash-logo-wrap">
|
|
|
|
|
- <image class="splash-logo-img" src="/static/logo.png" mode="aspectFit" />
|
|
|
|
|
- </view>
|
|
|
|
|
- <text class="splash-brand-name">浠艾福</text>
|
|
|
|
|
- <text class="splash-brand-en">Care Family</text>
|
|
|
|
|
- <view class="splash-dims-row">
|
|
|
|
|
- <view class="splash-dim-item">
|
|
|
|
|
- <view class="splash-dim-circle" style="background:rgba(255,140,66,0.3);"><text class="splash-dim-icon">🌏</text></view>
|
|
|
|
|
- <text class="splash-dim-label">身</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- <view class="splash-dim-item">
|
|
|
|
|
- <view class="splash-dim-circle" style="background:rgba(255,107,157,0.3);"><text class="splash-dim-icon">🔥</text></view>
|
|
|
|
|
- <text class="splash-dim-label">心</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- <view class="splash-dim-item">
|
|
|
|
|
- <view class="splash-dim-circle" style="background:rgba(99,102,241,0.3);"><text class="splash-dim-icon">⚡</text></view>
|
|
|
|
|
- <text class="splash-dim-label">智</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- <view class="splash-dim-item">
|
|
|
|
|
- <view class="splash-dim-circle" style="background:rgba(16,185,129,0.3);"><text class="splash-dim-icon">🌿</text></view>
|
|
|
|
|
- <text class="splash-dim-label">行</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- <view class="splash-dim-item">
|
|
|
|
|
- <view class="splash-dim-circle" style="background:rgba(245,158,11,0.3);"><text class="splash-dim-icon">💧</text></view>
|
|
|
|
|
- <text class="splash-dim-label">富</text>
|
|
|
|
|
- </view>
|
|
|
|
|
- </view>
|
|
|
|
|
- <text class="splash-tagline">给全家的一站式幸福提案</text>
|
|
|
|
|
- <view class="splash-overlay-loading">
|
|
|
|
|
- <view class="splash-overlay-dot"></view>
|
|
|
|
|
- <view class="splash-overlay-dot"></view>
|
|
|
|
|
- <view class="splash-overlay-dot"></view>
|
|
|
|
|
- </view>
|
|
|
|
|
- </view>
|
|
|
|
|
- </view>
|
|
|
|
|
|
|
|
|
|
<!-- Tabbar 切换过渡页 -->
|
|
<!-- Tabbar 切换过渡页 -->
|
|
|
<tab-transition v-if="showTabTransition" dimCode="action" ref="tabTransition" @close="showTabTransition = false" />
|
|
<tab-transition v-if="showTabTransition" dimCode="action" ref="tabTransition" @close="showTabTransition = false" />
|
|
@@ -407,18 +364,11 @@ export default {
|
|
|
if (_token) {
|
|
if (_token) {
|
|
|
_currentRole = uni.getStorageSync('currentRole') || uni.getStorageSync('role') || ''
|
|
_currentRole = uni.getStorageSync('currentRole') || uni.getStorageSync('role') || ''
|
|
|
}
|
|
}
|
|
|
- // 冷启动标记(由 App.vue onLaunch 设置,仅在冷启动时存在)
|
|
|
|
|
- var _isFirstLaunch = (uni.getStorageSync('_showSplashOverlay') === '1')
|
|
|
|
|
return {
|
|
return {
|
|
|
currentRole: _currentRole,
|
|
currentRole: _currentRole,
|
|
|
- // TabTransition 始终默认 true,确保首次渲染即出现;冷启动时被 splash overlay 覆盖不可见
|
|
|
|
|
|
|
+ // TabTransition 始终默认 true,确保首次渲染即出现
|
|
|
showTabTransition: true,
|
|
showTabTransition: true,
|
|
|
|
|
|
|
|
- // splash loading overlay(冷启动时展示,数据加载完关闭)
|
|
|
|
|
- splashOverlay: _isFirstLaunch,
|
|
|
|
|
- splashOverlayFading: false,
|
|
|
|
|
- _splashReady: false,
|
|
|
|
|
-
|
|
|
|
|
typeList: [
|
|
typeList: [
|
|
|
{ label: '全部', value: '' },
|
|
{ label: '全部', value: '' },
|
|
|
{ label: '活动', value: 'activity' },
|
|
{ label: '活动', value: 'activity' },
|
|
@@ -542,59 +492,14 @@ export default {
|
|
|
this._doInit(options)
|
|
this._doInit(options)
|
|
|
},
|
|
},
|
|
|
onShow() {
|
|
onShow() {
|
|
|
- // splash overlay 已在 data() 中根据 storage 标记初始化,此处只需配置关闭条件
|
|
|
|
|
- if (this.splashOverlay) {
|
|
|
|
|
- uni.removeStorageSync('_showSplashOverlay')
|
|
|
|
|
- this._splashLoadCount = 0
|
|
|
|
|
- this._splashMinPassed = false
|
|
|
|
|
-
|
|
|
|
|
- var self = this
|
|
|
|
|
- // 最低展示 800ms
|
|
|
|
|
- setTimeout(function() {
|
|
|
|
|
- self._splashMinPassed = true
|
|
|
|
|
- self._tryHideSplash()
|
|
|
|
|
- }, 800)
|
|
|
|
|
- // 最多展示 5s
|
|
|
|
|
- setTimeout(function() {
|
|
|
|
|
- if (self.splashOverlay) self._hideSplashOverlay()
|
|
|
|
|
- }, 5000)
|
|
|
|
|
- } else {
|
|
|
|
|
- // tab 切回:TabTransition 已在 data() 中为 true,确保首次渲染即出现
|
|
|
|
|
- // 但组件缓存后再次切回时可能已被 _watchPageReady 置为 false,需要重置
|
|
|
|
|
- this.showTabTransition = true
|
|
|
|
|
- this._watchPageReady()
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // tab 切回:重置 TabTransition 确保过渡动画正常显示
|
|
|
|
|
+ this.showTabTransition = true
|
|
|
|
|
+ this._watchPageReady()
|
|
|
|
|
|
|
|
// 始终执行初始化,确保登录态变更后及时切换视图
|
|
// 始终执行初始化,确保登录态变更后及时切换视图
|
|
|
this._doInit()
|
|
this._doInit()
|
|
|
},
|
|
},
|
|
|
methods: {
|
|
methods: {
|
|
|
- _checkSplashReady() {
|
|
|
|
|
- this._splashLoadCount++
|
|
|
|
|
- this._tryHideSplash()
|
|
|
|
|
- },
|
|
|
|
|
- _tryHideSplash() {
|
|
|
|
|
- if (this.splashOverlayFading) return
|
|
|
|
|
- if (!this._splashMinPassed) return
|
|
|
|
|
- if (this.isLoggedIn()) {
|
|
|
|
|
- // 登录用户:等待子组件的 ready 信号
|
|
|
|
|
- if (this._splashReady) this._hideSplashOverlay()
|
|
|
|
|
- } else {
|
|
|
|
|
- // 游客:等待 3 个 API 全部返回
|
|
|
|
|
- if (this._splashLoadCount >= 3) this._hideSplashOverlay()
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
- _hideSplashOverlay() {
|
|
|
|
|
- if (this.splashOverlayFading) return
|
|
|
|
|
- this.splashOverlayFading = true
|
|
|
|
|
- // splash 关闭时同时隐藏 TabTransition(防止 splash 结束后闪现过渡页)
|
|
|
|
|
- this.showTabTransition = false
|
|
|
|
|
- var self = this
|
|
|
|
|
- setTimeout(function() {
|
|
|
|
|
- self.splashOverlay = false
|
|
|
|
|
- self.splashOverlayFading = false
|
|
|
|
|
- }, 400)
|
|
|
|
|
- },
|
|
|
|
|
|
|
|
|
|
// ===== 登录态数据加载 =====
|
|
// ===== 登录态数据加载 =====
|
|
|
loadLoggedInData: function() {
|
|
loadLoggedInData: function() {
|
|
@@ -650,8 +555,6 @@ export default {
|
|
|
getFamilyEnergySandbox().then(function(res) {
|
|
getFamilyEnergySandbox().then(function(res) {
|
|
|
if (res && res.data) {
|
|
if (res && res.data) {
|
|
|
self.sandboxData = res.data
|
|
self.sandboxData = res.data
|
|
|
- self._splashReady = true
|
|
|
|
|
- self._tryHideSplash()
|
|
|
|
|
}
|
|
}
|
|
|
}).catch(function() {})
|
|
}).catch(function() {})
|
|
|
},
|
|
},
|
|
@@ -976,10 +879,7 @@ export default {
|
|
|
var rawData = res.data && (Array.isArray(res.data) ? res.data : (res.data.data || res.data.records || []))
|
|
var rawData = res.data && (Array.isArray(res.data) ? res.data : (res.data.data || res.data.records || []))
|
|
|
self.products = Array.isArray(rawData) ? rawData : []
|
|
self.products = Array.isArray(rawData) ? rawData : []
|
|
|
}
|
|
}
|
|
|
- self._checkSplashReady()
|
|
|
|
|
}).catch(function() {
|
|
}).catch(function() {
|
|
|
- self.loading = false
|
|
|
|
|
- self._checkSplashReady()
|
|
|
|
|
})
|
|
})
|
|
|
},
|
|
},
|
|
|
loadDimensionActivities: function() {
|
|
loadDimensionActivities: function() {
|